diff --git a/.circleci/config.yml b/.circleci/config.yml index e449efc6620..c0d44a6e09d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -613,7 +613,4 @@ workflows: - barretenberg-docs - e2e-join - cli-wallet - <<: *defaults - - # Production releases. - - deploy-and-release: *defaults_deploy + <<: *defaults \ No newline at end of file diff --git a/.github/earthly-ci-config.yml b/.github/earthly-ci-config.yml index f128d7bad53..de4de8b1287 100644 --- a/.github/earthly-ci-config.yml +++ b/.github/earthly-ci-config.yml @@ -1,5 +1,5 @@ global: cache_size_pct: 50 - buildkit_max_parallelism: 5 + buildkit_max_parallelism: 10 container_frontend: docker-shell buildkit_additional_args: ["-e", "BUILDKIT_STEP_LOG_MAX_SIZE=-1"] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 896275461f6..f6bc196fdad 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -118,7 +118,8 @@ jobs: build: needs: [build-images, changes] - if: (needs.changes.outputs.non-docs == 'true' && needs.changes.outputs.non-misc-ci == 'true' && needs.changes.outputs.non-barretenberg-cpp == 'true') || github.ref_name == 'master' + # NOTE: we don't skip this job here instead using if's below so that dependencies are not broken + # we still want build to be at the bottom of the dependency chain runs-on: ${{ github.event.pull_request.user.login || github.actor }}-x86 outputs: e2e_list: ${{ steps.e2e_list.outputs.list }} @@ -132,6 +133,7 @@ jobs: # prepare images locally, tagged by commit hash - name: "Build E2E Image" timeout-minutes: 40 + if: (needs.changes.outputs.non-docs == 'true' && needs.changes.outputs.non-misc-ci == 'true' && needs.changes.outputs.non-barretenberg-cpp == 'true') || github.ref_name == 'master' run: | earthly-ci ./yarn-project+export-e2e-test-images # We base our e2e list used in e2e-x86 off the targets in ./yarn-project/end-to-end @@ -160,7 +162,7 @@ jobs: # all the non-bench end-to-end integration tests for aztec e2e: needs: [build, changes] - if: needs.changes.outputs.non-barretenberg-cpp == 'true' || github.ref_name == 'master' || contains(github.event.pull_request.labels.*.name, 'e2e') + if: (needs.changes.outputs.non-docs == 'true' && needs.changes.outputs.non-misc-ci == 'true' && needs.changes.outputs.non-barretenberg-cpp == 'true') || github.ref_name == 'master' || contains(github.event.pull_request.labels.*.name, 'e2e') runs-on: ubuntu-20.04 strategy: fail-fast: false @@ -190,7 +192,7 @@ jobs: # all the benchmarking end-to-end integration tests for aztec (not required to merge) bench-e2e: needs: [build, changes] - if: needs.changes.outputs.non-barretenberg-cpp == 'true' || github.ref_name == 'master' || contains(github.event.pull_request.labels.*.name, 'bench') + if: (needs.changes.outputs.non-docs == 'true' && needs.changes.outputs.non-misc-ci == 'true' && needs.changes.outputs.non-barretenberg-cpp == 'true') || github.ref_name == 'master' || contains(github.event.pull_request.labels.*.name, 'bench') runs-on: ubuntu-20.04 strategy: fail-fast: false @@ -221,7 +223,7 @@ jobs: acir-bench: runs-on: ubuntu-20.04 - needs: [build-images, changes] + needs: [build, changes] # Note: not fully accurate, but to work with bench-summary needs to be the same as bench-e2e if: needs.changes.outputs.non-barretenberg-cpp == 'true' steps: @@ -258,7 +260,6 @@ jobs: ref: "${{ github.event.pull_request.head.sha }}" - uses: ./.github/ci-setup-action with: - dockerhub_password: "${{ secrets.DOCKERHUB_PASSWORD }}" concurrency_key: build-x86 - name: "Build and upload bench aggregate file" working-directory: ./yarn-project/scripts @@ -286,7 +287,7 @@ jobs: AZTEC_BOT_GITHUB_TOKEN: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} bb-gcc: - needs: [build-images, changes] + needs: [build, changes] runs-on: ${{ github.event.pull_request.user.login || github.actor }}-x86 if: needs.changes.outputs.barretenberg-cpp == 'true' steps: @@ -306,7 +307,7 @@ jobs: # barretenberg (prover) native, AVM (public VM) and Merkle tree (world state) tests # only ran on x86 for resource reasons (memory intensive) bb-native-tests: - needs: [build-images, changes] + needs: [build, changes] runs-on: ${{ github.event.pull_request.user.login || github.actor }}-x86 if: needs.changes.outputs.barretenberg-cpp == 'true' steps: @@ -324,7 +325,7 @@ jobs: run: earthly-ci --exec-stats --no-output +test --hardware_concurrency=64 bb-js-test: - needs: [build-images, changes] + needs: [build, changes] runs-on: ${{ github.event.pull_request.user.login || github.actor }}-x86 if: needs.changes.outputs.barretenberg == 'true' steps: @@ -339,7 +340,7 @@ jobs: run: earthly-ci --no-output ./+test noir-build-acir-tests: - needs: [build-images, changes] + needs: [build, changes] runs-on: ${{ github.event.pull_request.user.login || github.actor }}-x86 if: needs.changes.outputs.barretenberg == 'true' || needs.changes.outputs.noir == 'true' steps: @@ -413,7 +414,7 @@ jobs: run: earthly-ci --no-output ./+barretenberg-acir-tests-bb.js noir-format: - needs: [build-images, changes] + needs: [build, changes] runs-on: ${{ github.event.pull_request.user.login || github.actor }}-x86 if: needs.changes.outputs.noir == 'true' || needs.changes.outputs.noir-projects == 'true' steps: @@ -433,7 +434,7 @@ jobs: earthly-ci --no-output ./+format noir-test: - needs: [build-images, changes] + needs: [build, changes] runs-on: ${{ github.event.pull_request.user.login || github.actor }}-x86 if: needs.changes.outputs.noir == 'true' steps: @@ -446,7 +447,7 @@ jobs: run: earthly-ci --no-output ./noir+test noir-examples: - needs: [build-images, changes] + needs: [build, changes] runs-on: ${{ github.event.pull_request.user.login || github.actor }}-x86 if: needs.changes.outputs.barretenberg == 'true' || needs.changes.outputs.noir == 'true' steps: @@ -459,7 +460,7 @@ jobs: run: earthly-ci --no-output ./noir+examples noir-packages-test: - needs: [build-images, changes] + needs: [build, changes] runs-on: ${{ github.event.pull_request.user.login || github.actor }}-x86 if: needs.changes.outputs.barretenberg == 'true' || needs.changes.outputs.noir == 'true' steps: @@ -473,7 +474,7 @@ jobs: run: earthly-ci --no-output ./noir+packages-test noir-projects: - needs: [build-images, changes, build] + needs: [build, changes, build] runs-on: ${{ github.event.pull_request.user.login || github.actor }}-x86 if: needs.changes.outputs.barretenberg == 'true' || needs.changes.outputs.noir == 'true' || needs.changes.outputs.noir-projects == 'true' || needs.changes.outputs.txe == 'true' steps: @@ -488,7 +489,7 @@ jobs: earthly-ci --no-output ./noir-projects/+test avm-format: - needs: [build-images, changes] + needs: [build, changes] runs-on: ${{ github.event.pull_request.user.login || github.actor }}-x86 if: needs.changes.outputs.avm-transpiler == 'true' || needs.changes.outputs.noir == 'true' steps: @@ -542,7 +543,7 @@ jobs: run: earthly-ci --no-output ./yarn-project/+prover-client-test l1-contracts-test: - needs: [build-images, changes] + needs: [build, changes] runs-on: ${{ github.event.pull_request.user.login || github.actor }}-x86 if: needs.changes.outputs.l1-contracts == 'true' steps: @@ -555,7 +556,7 @@ jobs: run: earthly-ci --no-output ./l1-contracts+test docs-preview: - needs: [build-images, changes] + needs: [build, changes] runs-on: ${{ github.event.pull_request.user.login || github.actor }}-x86 if: needs.changes.outputs.non-barretenberg-cpp == 'true' steps: @@ -576,7 +577,7 @@ jobs: bb-bench: runs-on: ubuntu-20.04 - needs: [build-images, changes] + needs: [build, changes] if: needs.changes.outputs.barretenberg-cpp == 'true' steps: - uses: actions/checkout@v4 @@ -661,7 +662,7 @@ jobs: run: earthly-ci -P --no-output +test --box=${{ matrix.box }} --browser=${{ matrix.browser }} --mode=cache protocol-circuits-gates-report: - needs: [build-images, changes] + needs: [build, changes] if: needs.changes.outputs.non-docs == 'true' && needs.changes.outputs.non-misc-ci == 'true' runs-on: ${{ github.event.pull_request.user.login || github.actor }}-x86 permissions: @@ -697,7 +698,7 @@ jobs: message: ${{ steps.gates_diff.outputs.markdown }} public-functions-size-report: - needs: [build-images, changes] + needs: [build, changes] if: needs.changes.outputs.non-docs == 'true' && needs.changes.outputs.non-misc-ci == 'true' runs-on: ${{ github.event.pull_request.user.login || github.actor }}-x86 permissions: @@ -719,7 +720,7 @@ jobs: - name: Compare public functions bytecode size reports id: public_functions_sizes_diff - uses: noir-lang/noir-gates-diff@ef8aaf48fb833f3b6e3f91665bb23afb7e68c6e3 + uses: noir-lang/noir-gates-diff@d88f7523b013b9edd3f31c5cfddaef87a3fe1b48 with: report: public_functions_report.json header: | diff --git a/.github/workflows/spartan-test.yml b/.github/workflows/nightly-kind-test.yml similarity index 51% rename from .github/workflows/spartan-test.yml rename to .github/workflows/nightly-kind-test.yml index 901dbebdb5a..8c2a1a4daad 100644 --- a/.github/workflows/spartan-test.yml +++ b/.github/workflows/nightly-kind-test.yml @@ -1,4 +1,4 @@ -name: Run spartan network tests +name: KIND network tests on: workflow_dispatch: schedule: @@ -9,10 +9,18 @@ concurrency: cancel-in-progress: true env: - DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }} - GIT_COMMIT: ${{ github.sha }} + DOCKERHUB_PASSWORD: "${{ secrets.DOCKERHUB_PASSWORD }}" + RUN_ID: ${{ github.run_id }} + RUN_ATTEMPT: ${{ github.run_attempt }} + USERNAME: ${{ github.event.pull_request.user.login || github.actor }} + GITHUB_TOKEN: ${{ github.token }} + GH_SELF_HOSTED_RUNNER_TOKEN: ${{ secrets.GH_SELF_HOSTED_RUNNER_TOKEN }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + BUILD_INSTANCE_SSH_KEY: ${{ secrets.BUILD_INSTANCE_SSH_KEY }} + GIT_COMMIT: ${{ github.event.pull_request.head.sha || github.sha }} + # kludge until we move away from runners + WAIT_FOR_RUNNERS: false jobs: setup: @@ -22,79 +30,8 @@ jobs: runner_type: builder-x86 secrets: inherit - changes: - runs-on: ubuntu-20.04 - # Required permissions. - permissions: - pull-requests: read - # Set job outputs to values from filter step - outputs: - avm-transpiler: ${{ steps.filter.outputs.avm-transpiler }} - build-images: ${{ steps.filter.outputs.build-images }} - barretenberg: ${{ steps.filter.outputs.barretenberg }} - barretenberg-cpp: ${{ steps.filter.outputs.barretenberg-cpp }} - noir: ${{ steps.filter.outputs.noir }} - noir-projects: ${{ steps.filter.outputs.noir-projects }} - l1-contracts: ${{ steps.filter.outputs.l1-contracts }} - non-docs: ${{ steps.filter.outputs.non-docs }} - non-misc-ci: ${{ steps.filter.outputs.non-misc-ci }} - non-barretenberg-cpp: ${{ steps.filter.outputs.non-barretenberg-cpp }} - steps: - - uses: actions/checkout@v4 - with: { ref: "${{ env.GIT_COMMIT }}" } - - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 - id: filter - with: - filters: | - barretenberg: - - 'barretenberg/**' - barretenberg-cpp: - - 'barretenberg/cpp/**' - build-images: - - 'build-images/**' - noir: - - 'noir/**' - avm-transpiler: - - 'avm-transpiler/**' - l1-contracts: - - 'l1-contracts/**' - noir-projects: - - 'noir-projects/**' - non-barretenberg-cpp: - - '!(barretenberg/cpp/**)' - # don't consider AVM stuff 'core bb' - - barretenberg/cpp/pil/** - - barretenberg/cpp/src/barretenberg/vm/** - - barretenberg/cpp/src/barretenberg/**/generated/* - - barretenberg/cpp/src/barretenberg/client_ivc.{hpp,cpp} - non-docs: - - '!(docs/**)' - non-misc-ci: - - '!(.github/**)' - # Always rebuild when this file changes - - .github/workflows/ci.yml - - build-images: - needs: [setup, changes] - # Note we don't but the 'if' here as that would also apply to dependent jobs, instead we just copy it into each step - runs-on: ${{ github.event.pull_request.user.login || github.actor }}-x86 - steps: - - uses: actions/checkout@v4 - if: ${{ needs.changes.outputs.build-images == 'true' }} - with: { ref: "${{ env.GIT_COMMIT }}" } - - uses: ./.github/ci-setup-action - if: ${{ needs.changes.outputs.build-images == 'true' }} - with: - concurrency_key: build-images-x86 - - name: "Push Build Images If Changed" - if: ${{ needs.changes.outputs.build-images == 'true' }} - timeout-minutes: 40 - run: | - earthly-ci --push ./build-images/+build - build: - needs: [build-images, changes] - if: ${{ needs.changes.outputs.non-docs == 'true' && needs.changes.outputs.non-misc-ci == 'true' && needs.changes.outputs.non-barretenberg-cpp == 'true' }} + needs: setup runs-on: ${{ github.event.pull_request.user.login || github.actor }}-x86 outputs: e2e_list: ${{ steps.e2e_list.outputs.list }} @@ -112,8 +49,7 @@ jobs: earthly-ci ./yarn-project+export-e2e-test-images test: - needs: [build, changes] - if: ${{ needs.changes.outputs.non-barretenberg-cpp == 'true' }} + needs: build runs-on: ubuntu-20.04 strategy: matrix: diff --git a/.github/workflows/publish-aztec-packages.yml b/.github/workflows/publish-aztec-packages.yml new file mode 100644 index 00000000000..6c654f4dd7c --- /dev/null +++ b/.github/workflows/publish-aztec-packages.yml @@ -0,0 +1,238 @@ +name: Publish Aztec Packages + +on: + workflow_dispatch: + inputs: + tag: + type: string + description: "The tag to release" + required: true + publish: + type: boolean + description: "Whether to publish the release" + required: true + +permissions: + # Necessary to upload new release artifacts + contents: write + issues: write + +env: + # Add any global environment variables here + DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }} + GIT_COMMIT: ${{ github.sha }} + DEPLOY_TAG: ${{ github.event.inputs.tag }} + +jobs: + check-version: + runs-on: ubuntu-latest + steps: + - name: Check if tag is valid + id: check_tag + run: | + TAG=${{ github.event.inputs.tag }} + if [[ "$TAG" == aztec-packages-v* ]]; then + echo "Tag is valid. Proceeding with setup." + else + echo "Invalid tag format. Expected aztec-packages-v*" + exit 1 + fi + + setup-x86: + needs: check-version + uses: ./.github/workflows/setup-runner.yml + with: + username: ${{ github.actor }} + runner_type: builder-x86 + secrets: inherit + + setup-arm: + needs: check-version + uses: ./.github/workflows/setup-runner.yml + with: + username: ${{ github.actor }} + runner_type: builder-arm + secrets: inherit + + build-aztec-x86: + needs: setup-x86 + runs-on: ${{ github.actor }}-x86 + steps: + - uses: actions/checkout@v4 + with: + ref: "${{ env.GIT_COMMIT }}" + - uses: ./.github/ci-setup-action + with: + concurrency_key: build-aztec-${{ github.actor }} + dockerhub_password: "${{ env.DOCKERHUB_PASSWORD }}" + - name: Build & Push Aztec x86_64 + timeout-minutes: 40 + run: | + earthly-ci \ + --no-output \ + --push \ + ./yarn-project+export-aztec-arch \ + --DIST_TAG=${{ env.GIT_COMMIT }} \ + --ARCH=x86_64 + + build-aztec-arm: + needs: setup-arm + runs-on: ${{ github.actor }}-arm + steps: + - uses: actions/checkout@v4 + with: + ref: "${{ env.GIT_COMMIT }}" + - uses: ./.github/ci-setup-action + with: + concurrency_key: build-aztec-${{ github.actor }} + dockerhub_password: "${{ env.DOCKERHUB_PASSWORD }}" + - name: Build & Push Aztec arm64 + timeout-minutes: 60 + run: | + earthly-ci \ + --no-output \ + --push \ + ./yarn-project+export-aztec-arch \ + --DIST_TAG=${{ env.GIT_COMMIT }} \ + --ARCH=arm64 + + build-nargo-x86: + needs: [setup-x86, build-aztec-x86] + runs-on: ${{ github.actor }}-x86 + steps: + - uses: actions/checkout@v4 + with: + ref: "${{ env.GIT_COMMIT }}" + - uses: ./.github/ci-setup-action + with: + concurrency_key: build-aztec-nargo-${{ github.actor }} + dockerhub_password: "${{ env.DOCKERHUB_PASSWORD }}" + + - name: Build & push aztec nargo image + run: | + earthly-ci --no-output --push ./aztec-nargo+export-aztec-nargo --DIST_TAG=${{ env.GIT_COMMIT }} --ARCH=x86_64 + + build-nargo-arm: + needs: [setup-arm, build-aztec-arm] + runs-on: ${{ github.actor }}-arm + steps: + - uses: actions/checkout@v4 + with: + ref: "${{ env.GIT_COMMIT }}" + - uses: ./.github/ci-setup-action + with: + concurrency_key: build-aztec-nargo-${{ github.actor }} + dockerhub_password: "${{ env.DOCKERHUB_PASSWORD }}" + + - name: Build & push aztec nargo image + run: | + earthly-ci --no-output --push ./aztec-nargo+export-aztec-nargo --DIST_TAG=${{ env.GIT_COMMIT }} --ARCH=arm64 + + build-cli-wallet-x86: + needs: [setup-x86, build-aztec-x86] + runs-on: ${{ github.actor }}-x86 + steps: + - uses: actions/checkout@v4 + with: + ref: "${{ env.GIT_COMMIT }}" + - uses: ./.github/ci-setup-action + with: + concurrency_key: build-aztec-cli-wallet-${{ github.actor }} + dockerhub_password: "${{ env.DOCKERHUB_PASSWORD }}" + + - name: Build & push aztec cli wallet image + run: | + earthly-ci --no-output --push ./yarn-project+export-cli-wallet --DIST_TAG=${{ env.GIT_COMMIT }} --ARCH=x86_64 + + build-cli-wallet-arm: + needs: [setup-arm, build-aztec-arm] + runs-on: ${{ github.actor }}-arm + steps: + - uses: actions/checkout@v4 + with: + ref: "${{ env.GIT_COMMIT }}" + - uses: ./.github/ci-setup-action + with: + concurrency_key: build-aztec-cli-wallet-${{ github.actor }} + dockerhub_password: "${{ env.DOCKERHUB_PASSWORD }}" + + - name: Build & push aztec cli wallet image + run: | + earthly-ci --no-output --push ./yarn-project+export-cli-wallet --DIST_TAG=${{ env.GIT_COMMIT }} --ARCH=arm64 + + publish-manifests: + needs: + [ + build-aztec-x86, + build-aztec-arm, + build-nargo-x86, + build-nargo-arm, + build-cli-wallet-x86, + build-cli-wallet-arm, + ] + runs-on: ${{ github.actor }}-x86 + steps: + - uses: actions/checkout@v4 + with: + ref: "${{ env.GIT_COMMIT }}" + - uses: ./.github/ci-setup-action + with: + dockerhub_password: "${{ env.DOCKERHUB_PASSWORD }}" + - name: Publish aztec manifests + run: | + VERSION=${${{ env.DEPLOY_TAG }}#aztec-packages-v} + + docker pull aztecprotocol/aztec:${{ env.GIT_COMMIT }}-x86_64 + docker pull aztecprotocol/aztec:${{ env.GIT_COMMIT }}-arm64 + docker pull aztecprotocol/aztec-nargo:${{ env.GIT_COMMIT }}-x86_64 + docker pull aztecprotocol/aztec-nargo:${{ env.GIT_COMMIT }}-arm64 + docker pull aztecprotocol/cli-wallet:${{ env.GIT_COMMIT }}-x86_64 + docker pull aztecprotocol/cli-wallet:${{ env.GIT_COMMIT }}-arm64 + + docker manifest create aztecprotocol/aztec:$VERSION \ + aztecprotocol/aztec:${{ env.GIT_COMMIT }}-x86_64 \ + aztecprotocol/aztec:${{ env.GIT_COMMIT }}-arm64 + docker manifest create aztecprotocol/aztec:latest \ + aztecprotocol/aztec:${{ env.GIT_COMMIT }}-x86_64 \ + aztecprotocol/aztec:${{ env.GIT_COMMIT }}-arm64 + docker manifest push aztecprotocol/aztec:$VERSION + docker manifest push aztecprotocol/aztec:latest + + docker manifest create aztecprotocol/aztec-nargo:$VERSION \ + aztecprotocol/aztec-nargo:${{ env.GIT_COMMIT }}-x86_64 \ + aztecprotocol/aztec-nargo:${{ env.GIT_COMMIT }}-arm64 + docker manifest create aztecprotocol/aztec-nargo:latest \ + aztecprotocol/aztec-nargo:${{ env.GIT_COMMIT }}-x86_64 \ + aztecprotocol/aztec-nargo:${{ env.GIT_COMMIT }}-arm64 + docker manifest push aztecprotocol/aztec-nargo:$VERSION + docker manifest push aztecprotocol/aztec-nargo:latest + + docker manifest create aztecprotocol/cli-wallet:$VERSION \ + aztecprotocol/cli-wallet:${{ env.GIT_COMMIT }}-x86_64 \ + aztecprotocol/cli-wallet:${{ env.GIT_COMMIT }}-arm64 + docker manifest create aztecprotocol/cli-wallet:latest \ + aztecprotocol/cli-wallet:${{ env.GIT_COMMIT }}-x86_64 \ + aztecprotocol/cli-wallet:${{ env.GIT_COMMIT }}-arm64 + docker manifest push aztecprotocol/cli-wallet:$VERSION + docker manifest push aztecprotocol/cli-wallet:latest + + publish-npm: + needs: publish-manifests + runs-on: ubuntu-latest + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + steps: + - name: Checkout sources + uses: actions/checkout@v4 + with: + ref: ${{ env.GIT_COMMIT }} + + - name: Publish NPM packages + run: | + VERSION=${${{ env.DEPLOY_TAG }}#aztec-packages-v} + earthly-ci \ + --no-output \ + --secret NPM_TOKEN=${{ env.NPM_TOKEN }} \ + ./yarn-project+publish-npm \ + --DIST_TAG=latest \ + --VERSION=$VERSION diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index a294ba2f653..f8507df6900 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -22,6 +22,15 @@ jobs: token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} command: manifest + - name: Dispatch to publish Aztec packages workflow + uses: benc-uk/workflow-dispatch@v1 + if: ${{ steps.release.outputs.tag_name }} + with: + workflow: publish-aztec-packages.yml + ref: master + token: ${{ secrets.AZTEC_BOT_GITHUB_TOKEN }} + inputs: '{ "tag": "${{ steps.release.outputs.tag_name }}", "publish": true }' + - name: Dispatch to publish BB workflow uses: benc-uk/workflow-dispatch@v1 if: ${{ steps.release.outputs.tag_name }} diff --git a/.github/workflows/rerun.yml b/.github/workflows/rerun.yml index 9623ad4272a..421364ec969 100644 --- a/.github/workflows/rerun.yml +++ b/.github/workflows/rerun.yml @@ -1,5 +1,5 @@ # adapted from https://github.com/orgs/community/discussions/67654 -# altered to not rerun if we are not the newest commit in the run's branch +# altered to not rerun if we are not the newest commit in the run's branch (exception for master/main) on: workflow_dispatch: inputs: @@ -34,18 +34,12 @@ jobs: BRANCH_NAME=$(echo "$RUN_INFO" | jq -r '.headBranch') EVENT_TYPE=$(echo "$RUN_INFO" | jq -r '.event') - # Only proceed if the event is a pull_request - if [[ "$EVENT_TYPE" != "pull_request" ]]; then - echo "Event type is $EVENT_TYPE. Skipping rerun." - exit 0 - fi - # Get the latest commit SHA on the branch LATEST_COMMIT_SHA=$(gh api repos/${{ github.repository }}/commits/$BRANCH_NAME --jq .sha) # Compare the SHAs - if [[ "$COMMIT_SHA" != "$LATEST_COMMIT_SHA" ]]; then - echo "Commit $COMMIT_SHA is not the latest commit on branch $BRANCH_NAME (latest is $LATEST_COMMIT_SHA). Skipping rerun." + if [[ "$COMMIT_SHA" != "$LATEST_COMMIT_SHA" ]] && [[ "$BRANCH_NAME" != "master" && "$BRANCH_NAME" != "main" ]] ; then + echo "Commit $COMMIT_SHA is not the latest commit on branch $BRANCH_NAME (latest is $LATEST_COMMIT_SHA) and the branch is not master/main. Skipping rerun." else echo "Commit $COMMIT_SHA is the latest on branch $BRANCH_NAME. Proceeding with rerun." gh run rerun ${{ inputs.run_id }} --failed diff --git a/.github/workflows/vm_full_tests.yml b/.github/workflows/vm_full_tests.yml index 323a947a9c1..2cb160434c7 100644 --- a/.github/workflows/vm_full_tests.yml +++ b/.github/workflows/vm_full_tests.yml @@ -55,7 +55,7 @@ jobs: concurrency_key: avm-full-tests-x86 - name: "AVM Full Tests" working-directory: ./barretenberg/cpp/ - timeout-minutes: 60 + timeout-minutes: 75 run: | - sudo shutdown -P 60 # hack until core part of the scripts + sudo shutdown -P 75 # hack until core part of the scripts earthly-ci --no-output +vm-full-test --hardware_concurrency=64 # limit our parallelism to half our cores diff --git a/.noir-sync-commit b/.noir-sync-commit index e74b40ee491..8780207b075 100644 --- a/.noir-sync-commit +++ b/.noir-sync-commit @@ -1 +1 @@ -6440e183085160d77563b4e735ccaaf199e21693 +2a0d211b92d002fa75855d4ba27267f8892dd52c diff --git a/.vscode/settings.json b/.vscode/settings.json index 3790d618e42..2e0e5227291 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -107,7 +107,7 @@ "*.macros": "cpp", "*.tpp": "cpp" }, - "solidity.compileUsingRemoteVersion": "v0.8.18", + "solidity.compileUsingRemoteVersion": "v0.8.27", "solidity.formatter": "forge", "search.exclude": { "**/.yarn": true, @@ -171,5 +171,5 @@ }, "files.trimTrailingWhitespace": true, "cmake.sourceDirectory": "${workspaceFolder}/barretenberg/cpp", - "typescript.tsserver.maxTsServerMemory": 4096, + "typescript.tsserver.maxTsServerMemory": 4096 } diff --git a/avm-transpiler/.rebuild_patterns b/avm-transpiler/.rebuild_patterns new file mode 100644 index 00000000000..e73892d9e89 --- /dev/null +++ b/avm-transpiler/.rebuild_patterns @@ -0,0 +1 @@ +^avm-transpiler/.*$ \ No newline at end of file diff --git a/avm-transpiler/Earthfile b/avm-transpiler/Earthfile index ce6d6597cf7..95199fbe3d2 100644 --- a/avm-transpiler/Earthfile +++ b/avm-transpiler/Earthfile @@ -4,8 +4,6 @@ source: # we rely on noir source, which this image has FROM ../noir+nargo - # move noir contents to /usr/src/noir - RUN mv /usr/src /noir && mkdir /usr/src && mv /noir /usr/src # work in avm-transpiler WORKDIR /usr/src/avm-transpiler diff --git a/avm-transpiler/scripts/bootstrap_native.sh b/avm-transpiler/scripts/bootstrap_native.sh index 3e0e2ed853a..5b61375fff9 100755 --- a/avm-transpiler/scripts/bootstrap_native.sh +++ b/avm-transpiler/scripts/bootstrap_native.sh @@ -9,7 +9,7 @@ export GIT_DIRTY=false if [ -f ".gitrepo" ]; then export GIT_COMMIT=$(awk '/commit =/ {print $3}' .gitrepo) else - export GIT_COMMIT=$(git rev-parse --verify HEAD) + export GIT_COMMIT=${COMMIT_HASH:-$(git rev-parse --verify HEAD)} fi # Build native. diff --git a/avm-transpiler/src/transpile_contract.rs b/avm-transpiler/src/transpile_contract.rs index 542baef9cc7..10b9367a4ab 100644 --- a/avm-transpiler/src/transpile_contract.rs +++ b/avm-transpiler/src/transpile_contract.rs @@ -91,7 +91,6 @@ impl From for TranspiledContractArtifact { let mut functions: Vec = Vec::new(); for function in contract.functions { - // TODO(4269): once functions are tagged for transpilation to AVM, check tag if function.custom_attributes.contains(&"public".to_string()) { info!("Transpiling AVM function {} on contract {}", function.name, contract.name); // Extract Brillig Opcodes from acir diff --git a/aztec-up/bin/docker-compose.sandbox.yml b/aztec-up/bin/docker-compose.sandbox.yml index 7d5cc6ebe6c..034be4bd65b 100644 --- a/aztec-up/bin/docker-compose.sandbox.yml +++ b/aztec-up/bin/docker-compose.sandbox.yml @@ -22,7 +22,7 @@ services: environment: DEBUG: # Loaded from the user shell if explicitly set HOST_WORKDIR: "${PWD}" # Loaded from the user shell to show log files absolute path in host - ETHEREUM_HOST: ${ETHEREUM_HOST:-http://ethereum:${ANVIL_PORT:-8545}} + ETHEREUM_HOST: ${ETHEREUM_HOST:-http://ethereum}:${ANVIL_PORT:-8545} L1_CHAIN_ID: 31337 ARCHIVER_POLLING_INTERVAL_MS: 50 P2P_BLOCK_CHECK_INTERVAL_MS: 50 diff --git a/barretenberg/.gitrepo b/barretenberg/.gitrepo index 894f1f0964f..d8fbcbdd3c3 100644 --- a/barretenberg/.gitrepo +++ b/barretenberg/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/AztecProtocol/barretenberg branch = master - commit = 210c03edc60bcabfc8a5363d215770121424ae3f - parent = 9d248a24091cfbf1c4d09b49227136883e6118f0 + commit = 152a263039d8456464384a3d93ce816e5a201b9a + parent = 151bb79add3dfff059ccadee7c0bc25cc9059440 method = merge cmdver = 0.4.6 diff --git a/barretenberg/Earthfile b/barretenberg/Earthfile index a77cede937a..a21497733e0 100644 --- a/barretenberg/Earthfile +++ b/barretenberg/Earthfile @@ -104,6 +104,8 @@ barretenberg-acir-tests-bb.js: RUN cd ../ts && yarn ENV VERBOSE=1 ENV TEST_SRC /usr/src/acir_artifacts + # We have diminishing returns after 32 cores, and unnecessarily use resources + ENV HARDWARE_CONCURRENCY=32 # TODO(https://github.com/noir-lang/noir/issues/5106) # TODO(https://github.com/AztecProtocol/aztec-packages/issues/6672)c diff --git a/barretenberg/acir_tests/flows/honk_sol.sh b/barretenberg/acir_tests/flows/honk_sol.sh index 130380d76c3..da915de7ea3 100755 --- a/barretenberg/acir_tests/flows/honk_sol.sh +++ b/barretenberg/acir_tests/flows/honk_sol.sh @@ -9,7 +9,7 @@ export PROOF="$(pwd)/proof" export PROOF_AS_FIELDS="$(pwd)/proof_fields.json" # Create a proof, write the solidity contract, write the proof as fields in order to extract the public inputs -$BIN prove_keccak_ultra_honk -o proof $FLAGS $BFLAG +$BIN prove_ultra_keccak_honk -o proof $FLAGS $BFLAG $BIN write_vk_ultra_keccak_honk -o vk $FLAGS $BFLAG $BIN proof_as_fields_honk -k vk -c $CRS_PATH -p $PROOF $BIN contract_ultra_honk -k vk -c $CRS_PATH -o Verifier.sol diff --git a/barretenberg/cpp/CMakeLists.txt b/barretenberg/cpp/CMakeLists.txt index 81b75435a15..db289b54800 100644 --- a/barretenberg/cpp/CMakeLists.txt +++ b/barretenberg/cpp/CMakeLists.txt @@ -61,6 +61,15 @@ else() SET(TRACY_LIBS) endif() +if(TRACY_PROFILE_MEMORY) + add_compile_options(-DTRACY_MEMORY) +endif() + +if(TRACY_PROFILE_TIME) + add_compile_options(-DTRACY_TIME) +endif() + + if(ENABLE_ASAN) add_compile_options(-fsanitize=address) add_link_options(-fsanitize=address) diff --git a/barretenberg/cpp/CMakePresets.json b/barretenberg/cpp/CMakePresets.json index 643e4590ae2..c525451b8c0 100644 --- a/barretenberg/cpp/CMakePresets.json +++ b/barretenberg/cpp/CMakePresets.json @@ -111,13 +111,31 @@ } }, { - "name": "tracy", + "name": "tracy-memory", "displayName": "Release build with tracy, optimized for memory tracking", "description": "Release build with tracy, optimized for memory tracking", "inherits": "clang16", - "binaryDir": "build-tracy", + "binaryDir": "build-tracy-memory", "cacheVariables": { - "ENABLE_TRACY": "ON" + "ENABLE_TRACY": "ON", + "TRACY_PROFILE_MEMORY": "ON" + } + }, + { + "name": "tracy-time", + "displayName": "Build for tracy time profiling", + "description": "Build for tracy time profiling", + "binaryDir": "build-tracy-time", + "inherits": "clang16", + "environment": { + "CMAKE_BUILD_TYPE": "RelWithDebInfo", + "CFLAGS": "-g -fno-omit-frame-pointer", + "CXXFLAGS": "-g -fno-omit-frame-pointer", + "LDFLAGS": "-g -fno-omit-frame-pointer -rdynamic" + }, + "cacheVariables": { + "ENABLE_TRACY": "ON", + "TRACY_PROFILE_TIME": "ON" } }, { @@ -472,9 +490,14 @@ "configurePreset": "clang16-dbg" }, { - "name": "tracy", + "name": "tracy-memory", + "inherits": "default", + "configurePreset": "tracy-memory" + }, + { + "name": "tracy-time", "inherits": "default", - "configurePreset": "tracy" + "configurePreset": "tracy-time" }, { "name": "clang16-pic", diff --git a/barretenberg/cpp/Earthfile b/barretenberg/cpp/Earthfile index 574be394941..787c618611f 100644 --- a/barretenberg/cpp/Earthfile +++ b/barretenberg/cpp/Earthfile @@ -1,272 +1,309 @@ VERSION 0.8 +# Note, this is only used on the main build path, caching test artifacts is less useful +# As those only run if there are changes anyway +CACHE_BUILD_BIN: + FUNCTION + ARG command + ARG build_artifacts + ARG prefix + DO ../../build-system/s3-cache-scripts/+WITH_CACHE \ + --prefix="barretenberg-$prefix" \ + --command="$command && rm -rf build/{deps,lib,src}" \ + --rebuild_patterns=".rebuild_patterns" \ + --build_artifacts="build/bin" + wasmtime: - FROM ubuntu:noble - RUN apt update && apt install -y curl xz-utils - RUN curl https://wasmtime.dev/install.sh -sSf | bash - SAVE ARTIFACT /root/.wasmtime/bin/wasmtime + FROM ubuntu:noble + RUN apt update && apt install -y curl xz-utils + RUN curl https://wasmtime.dev/install.sh -sSf | bash + SAVE ARTIFACT /root/.wasmtime/bin/wasmtime source: - FROM ../../build-images+from-registry - WORKDIR /usr/src/barretenberg - # cpp source - COPY --dir src/barretenberg src/CMakeLists.txt src - # cmake source - COPY --dir cmake CMakeLists.txt CMakePresets.json . - # for debugging rebuilds - RUN echo CONTENT HASH $(find . -type f -exec sha256sum {} ';' | sort | sha256sum | awk '{print $1}') | tee .content-hash + FROM ../../build-images+from-registry + WORKDIR /usr/src/barretenberg/cpp + # cpp source + COPY --dir src/barretenberg src/CMakeLists.txt src + # cmake source + COPY --dir cmake CMakeLists.txt CMakePresets.json .rebuild_patterns . preset-darwin-arm64: - FROM +source - LET OSX_SDK="MacOSX14.0.sdk" - LET OSX_SDK_URL="https://github.com/joseluisq/macosx-sdks/releases/download/14.0/${OSX_SDK}.tar.xz" - RUN curl -sSL "$OSX_SDK_URL" | tar -xJ -C /opt/osxcross/SDK && rm -rf /opt/osxcross/SDK/$OSX_SDK/System - RUN cmake --preset darwin-arm64 -Bbuild && cmake --build build --target bb && rm -rf build/{deps,lib,src} - SAVE ARTIFACT build/bin AS LOCAL build-darwin-arm64/bin + FROM +source + LET OSX_SDK="MacOSX14.0.sdk" + LET OSX_SDK_URL="https://github.com/joseluisq/macosx-sdks/releases/download/14.0/${OSX_SDK}.tar.xz" + RUN curl -sSL "$OSX_SDK_URL" | tar -xJ -C /opt/osxcross/SDK && rm -rf /opt/osxcross/SDK/$OSX_SDK/System + DO +CACHE_BUILD_BIN --prefix=preset-darwin-arm64 \ + --command="cmake --preset darwin-arm64 -Bbuild && cmake --build build --target bb" + SAVE ARTIFACT build/bin AS LOCAL build-darwin-arm64/bin preset-release: - FROM +source - RUN cmake --preset clang16 -Bbuild && cmake --build build --target bb && rm -rf build/{deps,lib,src} - SAVE ARTIFACT build/bin + FROM +source + DO +CACHE_BUILD_BIN --prefix=preset-release \ + --command="cmake --preset clang16 -Bbuild && cmake --build build --target bb" + SAVE ARTIFACT build/bin + +# This is hacked onto a dependency on the bottom of our build for lack of a better place to test the .rebuild_patterns flow +test-cache-write: + FROM ../../build-images+from-registry + WORKDIR /usr/src/barretenberg/cpp + DO +CACHE_BUILD_BIN --prefix=test-cache \ + --command="mkdir -p build/bin && echo hi > build/bin/cache" + SAVE ARTIFACT build/bin + +# As above +test-cache-read: + FROM ../../build-images+from-registry + WORKDIR /usr/src/barretenberg/cpp + # fails if cache does not exist + DO +CACHE_BUILD_BIN --prefix=test-cache \ + --command="exit 1" + SAVE ARTIFACT build/bin preset-release-world-state: FROM +source - RUN cmake --preset clang16-pic -Bbuild && cmake --build build --target world_state_napi && cp ./build/lib/world_state_napi.node ./build/bin && rm -rf build/{deps,lib,src} + DO +CACHE_BUILD_BIN --prefix=preset-release-world-state \ + --command="cmake --preset clang16-pic -Bbuild && cmake --build build --target world_state_napi && mv ./build/lib/world_state_napi.node ./build/bin" SAVE ARTIFACT build/bin preset-release-assert: - FROM +source - RUN cmake --preset clang16-assert -Bbuild && cmake --build build --target bb crypto_merkle_tree_tests && rm -rf build/{deps,lib,src} - SAVE ARTIFACT build/bin + FROM +source + DO +CACHE_BUILD_BIN --prefix=preset-release-assert \ + --command="cmake --preset clang16-assert -Bbuild && cmake --build build --target bb crypto_merkle_tree_tests" + SAVE ARTIFACT build/bin preset-debug: - FROM +source - RUN cmake --preset clang16-dbg -Bbuild && cmake --build build --target bb && rm -rf build/{deps,lib,src} - SAVE ARTIFACT build/bin + FROM +source + DO +CACHE_BUILD_BIN --prefix=preset-debug \ + --command="cmake --preset clang16-dbg -Bbuild && cmake --build build --target bb" + SAVE ARTIFACT build/bin preset-msan-check: - FROM aztecprotocol/bb-ubuntu-lunar - RUN git clone --depth 1 -b release/16.x https://github.com/llvm/llvm-project - RUN cd llvm-project - RUN mkdir llvm-project/build - - ENV CXX=clang++-16 - ENV CC=clang-16 - RUN cmake -G Ninja -S llvm-project/runtimes -B llvm-project/build \ - -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \ - -DLLVM_USE_SANITIZER=MemoryWithOrigins \ - -DCMAKE_INSTALL_PREFIX=/opt - - RUN ninja -C llvm-project/build cxx cxxabi - RUN ninja -C llvm-project/build install-cxx install-cxxabi - - ENV MSAN_CFLAGS="-std=c++20 -fsanitize=memory -fsanitize-memory-track-origins -nostdinc++ -I/opt/include -I/opt/include/c++/v1" - ENV MSAN_LFLAGS="-fsanitize=memory -fsanitize-memory-track-origins -stdlib=libc++ -L/opt/lib -lc++abi -Wl,-rpath,/opt/lib" - - WORKDIR /usr/src/barretenberg - # cpp source - COPY --dir src/barretenberg src/CMakeLists.txt src - # cmake source - COPY --dir cmake CMakeLists.txt CMakePresets.json . - - # We never fail this as test-listing targets can timeout. Just pragmatically go on to see if the binary exists. - RUN cmake --preset msan -Bbuild && cmake --build build --target client_ivc_tests || true - # install SRS needed for proving - COPY --dir ./srs_db/+build/. srs_db - RUN echo "Warning: If ./bin/client_ivc_tests is not found, there may be build failures above." - RUN cd build && ./bin/client_ivc_tests --gtest_also_run_disabled_tests + FROM aztecprotocol/bb-ubuntu-lunar + RUN git clone --depth 1 -b release/16.x https://github.com/llvm/llvm-project + RUN cd llvm-project + RUN mkdir llvm-project/build + + ENV CXX=clang++-16 + ENV CC=clang-16 + RUN cmake -G Ninja -S llvm-project/runtimes -B llvm-project/build \ + -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \ + -DLLVM_USE_SANITIZER=MemoryWithOrigins \ + -DCMAKE_INSTALL_PREFIX=/opt + + RUN ninja -C llvm-project/build cxx cxxabi + RUN ninja -C llvm-project/build install-cxx install-cxxabi + + ENV MSAN_CFLAGS="-std=c++20 -fsanitize=memory -fsanitize-memory-track-origins -nostdinc++ -I/opt/include -I/opt/include/c++/v1" + ENV MSAN_LFLAGS="-fsanitize=memory -fsanitize-memory-track-origins -stdlib=libc++ -L/opt/lib -lc++abi -Wl,-rpath,/opt/lib" + + WORKDIR /usr/src/barretenberg + # cpp source + COPY --dir src/barretenberg src/CMakeLists.txt src + # cmake source + COPY --dir cmake CMakeLists.txt CMakePresets.json . + + # We never fail this as test-listing targets can timeout. Just pragmatically go on to see if the binary exists. + RUN cmake --preset msan -Bbuild && cmake --build build --target client_ivc_tests || true + # install SRS needed for proving + COPY --dir ./srs_db/+build/. srs_db + RUN echo "Warning: If ./bin/client_ivc_tests is not found, there may be build failures above." + RUN cd build && ./bin/client_ivc_tests --gtest_also_run_disabled_tests preset-wasm: - ARG TARGETARCH - FROM +source - IF [ $TARGETARCH = arm64 ] - # Just use threads for now - FROM +preset-wasm-threads - SAVE ARTIFACT build/bin - ELSE - RUN cmake --preset wasm -Bbuild && cmake --build build --target barretenberg.wasm && rm -rf build/{deps,lib,src} - RUN /opt/wasi-sdk/bin/llvm-strip ./build/bin/barretenberg.wasm - SAVE ARTIFACT build/bin - SAVE IMAGE --cache-hint - END + ARG TARGETARCH + FROM +source + IF [ $TARGETARCH = arm64 ] + # Just use threads for now + FROM +preset-wasm-threads + SAVE ARTIFACT build/bin + ELSE + DO +CACHE_BUILD_BIN --prefix=preset-wasm \ + --command="cmake --preset wasm -Bbuild && cmake --build build --target barretenberg.wasm && /opt/wasi-sdk/bin/llvm-strip ./build/bin/barretenberg.wasm" + SAVE ARTIFACT build/bin + SAVE IMAGE --cache-hint + END preset-sol: - FROM +source - RUN cmake --preset clang16 && cmake --build --preset clang16 --target solidity_key_gen solidity_proof_gen && rm -rf build/{deps,lib,src} - SAVE ARTIFACT build/bin + FROM +source + DO +CACHE_BUILD_BIN --prefix=preset-sol \ + --command="cmake --preset clang16 && cmake --build --preset clang16 --target solidity_key_gen solidity_proof_gen" + SAVE ARTIFACT build/bin preset-wasm-threads: - FROM +source - RUN cmake --preset wasm-threads -Bbuild && cmake --build build --target barretenberg.wasm && rm -rf build/{deps,lib,src} - # TODO(https://github.com/AztecProtocol/barretenberg/issues/941) We currently do not strip barretenberg threaded wasm, for stack traces. - # RUN /opt/wasi-sdk/bin/llvm-strip ./build/bin/barretenberg.wasm - SAVE ARTIFACT build/bin + FROM +source + DO +CACHE_BUILD_BIN --prefix=preset-wasm-threads-v1 \ + --command="cmake --preset wasm-threads -Bbuild && cmake --build build --target barretenberg.wasm" + SAVE ARTIFACT build/bin preset-gcc: - FROM +source - RUN cmake --preset gcc -Bbuild && cmake --build build && rm -rf build/{deps,lib,src} - SAVE ARTIFACT build/bin + FROM +source + RUN cmake --preset gcc -Bbuild && cmake --build build + SAVE ARTIFACT build/bin preset-fuzzing: - FROM +source - RUN cmake --preset fuzzing -Bbuild && cmake --build build && rm -rf build/{deps,lib,src} - SAVE ARTIFACT build/bin + FROM +source + RUN cmake --preset fuzzing -Bbuild && cmake --build build + SAVE ARTIFACT build/bin preset-clang-assert: - FROM +source - RUN cmake --preset clang16-assert -Bbuild && cmake --build build --target bb && rm -rf build/{deps,lib,src} - SAVE ARTIFACT build/bin + FROM +source + DO +CACHE_BUILD_BIN --prefix=preset-clang-assert \ + --command="cmake --preset clang16-assert -Bbuild && cmake --build build --target bb" + SAVE ARTIFACT build/bin # benchmarking images -# these are either fresh builds just for benching (op-count and op-count-time) -# or build the binaries we need for benchmarking preset-op-count-bench: - FROM +source - RUN cmake --preset op-count -DCMAKE_BUILD_TYPE=RelWithAssert -Bbuild && cmake --build build --target ultra_honk_bench --target client_ivc_bench && rm -rf build/{deps,lib,src} - SAVE ARTIFACT build/bin + FROM +source + # note: we do not cache bench-only artifacts + RUN cmake --preset op-count -DCMAKE_BUILD_TYPE=RelWithAssert -Bbuild && cmake --build build --target ultra_honk_bench --target client_ivc_bench + SAVE ARTIFACT build/bin preset-op-count-time-bench: - FROM +source - RUN cmake --preset op-count-time -Bbuild && cmake --build build --target ultra_honk_bench --target client_ivc_bench && rm -rf build/{deps,lib,src} - SAVE ARTIFACT build/bin + FROM +source + # note: we do not cache bench-only artifacts + RUN cmake --preset op-count-time -Bbuild && cmake --build build --target ultra_honk_bench --target client_ivc_bench + SAVE ARTIFACT build/bin preset-release-bench: - FROM +preset-release - RUN cmake --build build --target ultra_honk_bench --target client_ivc_bench && rm -rf build/{deps,lib,src} - SAVE ARTIFACT build/bin + FROM +source + # note: we do not cache bench-only artifacts + RUN cmake --preset clang16 -Bbuild && cmake --build build --target ultra_honk_bench --target client_ivc_bench + SAVE ARTIFACT build/bin preset-wasm-bench: - FROM +preset-wasm-threads - RUN cmake --build build --target ultra_honk_bench --target client_ivc_bench && rm -rf build/{deps,lib,src} - SAVE ARTIFACT build/bin + FROM +source + # note: we do not cache bench-only artifacts + RUN cmake --preset wasm-threads -Bbuild && cmake --build build --target ultra_honk_bench --target client_ivc_bench + SAVE ARTIFACT build/bin # test images preset-release-assert-test: - FROM +preset-release-assert - # build all targets for tests - RUN cmake --build build && rm -rf build/{deps,lib,src} - SAVE ARTIFACT build/bin + FROM +source + # build all targets for tests + # note: we do not cache test-only artifacts + RUN cmake --preset clang16-assert -Bbuild && cmake --build build + SAVE ARTIFACT build/bin # Sent to the bench runner using a earthly --push +bench-binaries # then we can run earthly +bench-ultra-honk --bench_mode=cache bench-binaries: - ARG EARTHLY_GIT_HASH - ARG TARGETARCH - ARG bench_mode=build - LOCALLY - IF [ $bench_mode = cache ] - FROM aztecprotocol/bb-bench-binaries:$TARGETARCH-$EARTHLY_GIT_HASH - SAVE ARTIFACT ./* - ELSE - FROM scratch - COPY +preset-op-count-time-bench/bin/*_bench op-count-time/bin/ - COPY +preset-op-count-bench/bin/*_bench op-count/bin/ - COPY +preset-release-bench/bin/*_bench release/bin/ - COPY +preset-wasm-bench/bin/*_bench wasm/bin/ - SAVE ARTIFACT ./* - SAVE IMAGE --push aztecprotocol/bb-bench-binaries:$TARGETARCH-$EARTHLY_GIT_HASH - END + ARG EARTHLY_GIT_HASH + ARG TARGETARCH + ARG bench_mode=build + LOCALLY + IF [ $bench_mode = cache ] + FROM aztecprotocol/bb-bench-binaries:$TARGETARCH-$EARTHLY_GIT_HASH + SAVE ARTIFACT ./* + ELSE + FROM scratch + COPY +preset-op-count-time-bench/bin/*_bench op-count-time/bin/ + COPY +preset-op-count-bench/bin/*_bench op-count/bin/ + COPY +preset-release-bench/bin/*_bench release/bin/ + COPY +preset-wasm-bench/bin/*_bench wasm/bin/ + SAVE ARTIFACT ./* + SAVE IMAGE --push aztecprotocol/bb-bench-binaries:$TARGETARCH-$EARTHLY_GIT_HASH + END # Runs on the bench image, sent from the builder runner bench-ultra-honk: - BUILD +wasmtime # prefetch - FROM ubuntu:noble - COPY --dir +bench-binaries/* . - # install SRS needed for proving - COPY --dir ./srs_db/+build/. srs_db - RUN cd release && ./bin/ultra_honk_bench --benchmark_out=../ultra_honk_release.json --benchmark_filter="construct_proof_ultrahonk_power_of_2/20$" - COPY +wasmtime/wasmtime /usr/bin/wasmtime - RUN cd wasm && wasmtime run --env HARDWARE_CONCURRENCY=16 -Wthreads=y -Sthreads=y --dir=".." ./bin/ultra_honk_bench --benchmark_out=../ultra_honk_wasm.json --benchmark_filter="construct_proof_ultrahonk_power_of_2/20$" - SAVE ARTIFACT ultra_honk*.json + BUILD +wasmtime # prefetch + FROM ubuntu:noble + COPY --dir +bench-binaries/* . + # install SRS needed for proving + COPY --dir ./srs_db/+build/. srs_db + RUN cd release && ./bin/ultra_honk_bench --benchmark_out=../ultra_honk_release.json --benchmark_filter="construct_proof_ultrahonk_power_of_2/20$" + COPY +wasmtime/wasmtime /usr/bin/wasmtime + RUN cd wasm && wasmtime run --env HARDWARE_CONCURRENCY=16 -Wthreads=y -Sthreads=y --dir=".." ./bin/ultra_honk_bench --benchmark_out=../ultra_honk_wasm.json --benchmark_filter="construct_proof_ultrahonk_power_of_2/20$" + SAVE ARTIFACT ultra_honk*.json bench-client-ivc: - BUILD +wasmtime # prefetch - FROM ubuntu:noble - COPY --dir +bench-binaries/* . - # install SRS needed for proving - COPY --dir ./srs_db/+build/. srs_db - RUN cd release && ./bin/client_ivc_bench --benchmark_out=../client_ivc_release.json --benchmark_filter="ClientIVCBench/Full/6$" - RUN cd op-count && ./bin/client_ivc_bench --benchmark_out=../client_ivc_op_count.json --benchmark_filter="ClientIVCBench/Full/6$" - RUN cd op-count-time && ./bin/client_ivc_bench --benchmark_out=../client_ivc_op_count_time.json --benchmark_filter="ClientIVCBench/Full/6$" - COPY +wasmtime/wasmtime /usr/bin/wasmtime - RUN cd wasm && wasmtime run --env HARDWARE_CONCURRENCY=16 -Wthreads=y -Sthreads=y --dir=".." ./bin/client_ivc_bench --benchmark_out=../client_ivc_wasm.json --benchmark_filter="ClientIVCBench/Full/6$" - SAVE ARTIFACT client_ivc*.json + BUILD +wasmtime # prefetch + FROM ubuntu:noble + COPY --dir +bench-binaries/* . + # install SRS needed for proving + COPY --dir ./srs_db/+build/. srs_db + RUN cd release && ./bin/client_ivc_bench --benchmark_out=../client_ivc_release.json --benchmark_filter="ClientIVCBench/Full/6$" + RUN cd op-count && ./bin/client_ivc_bench --benchmark_out=../client_ivc_op_count.json --benchmark_filter="ClientIVCBench/Full/6$" + RUN cd op-count-time && ./bin/client_ivc_bench --benchmark_out=../client_ivc_op_count_time.json --benchmark_filter="ClientIVCBench/Full/6$" + COPY +wasmtime/wasmtime /usr/bin/wasmtime + RUN cd wasm && wasmtime run --env HARDWARE_CONCURRENCY=16 -Wthreads=y -Sthreads=y --dir=".." ./bin/client_ivc_bench --benchmark_out=../client_ivc_wasm.json --benchmark_filter="ClientIVCBench/Full/6$" + SAVE ARTIFACT client_ivc*.json bench: - FROM aztecprotocol/bb-ubuntu-lunar - # for sequential running - WAIT - COPY +bench-ultra-honk/* . - END - WAIT - COPY +bench-client-ivc/* . - END - COPY ./scripts/ci/combine_benchmarks.py ./scripts/ci/combine_benchmarks.py - RUN ./scripts/ci/combine_benchmarks.py \ - native client_ivc_release.json \ - native ultra_honk_release.json \ - wasm client_ivc_wasm.json \ - wasm ultra_honk_wasm.json \ - "" client_ivc_op_count.json \ - "" client_ivc_op_count_time.json \ - > bench.json - SAVE ARTIFACT bench.json + FROM aztecprotocol/bb-ubuntu-lunar + # for sequential running + WAIT + COPY +bench-ultra-honk/* . + END + WAIT + COPY +bench-client-ivc/* . + END + COPY ./scripts/ci/combine_benchmarks.py ./scripts/ci/combine_benchmarks.py + RUN ./scripts/ci/combine_benchmarks.py \ + native client_ivc_release.json \ + native ultra_honk_release.json \ + wasm client_ivc_wasm.json \ + wasm ultra_honk_wasm.json \ + "" client_ivc_op_count.json \ + "" client_ivc_op_count_time.json \ + > bench.json + SAVE ARTIFACT bench.json # Sent to the bench runner using a earthly --push +test-binaries # then we can run earthly +test --test_mode=cache test-binaries: - ARG EARTHLY_GIT_HASH - ARG TARGETARCH - ARG test_mode=build - LOCALLY - IF [ $test_mode = cache ] - FROM aztecprotocol/bb-test-binaries:$TARGETARCH-$EARTHLY_GIT_HASH - SAVE ARTIFACT build - ELSE - FROM scratch - COPY +preset-release-assert-test/bin/*_tests build/bin/ - SAVE ARTIFACT build - SAVE IMAGE --push aztecprotocol/bb-test-binaries:$TARGETARCH-$EARTHLY_GIT_HASH - END + ARG EARTHLY_GIT_HASH + ARG TARGETARCH + ARG test_mode=build + LOCALLY + IF [ $test_mode = cache ] + FROM aztecprotocol/bb-test-binaries:$TARGETARCH-$EARTHLY_GIT_HASH + SAVE ARTIFACT build + ELSE + FROM scratch + COPY +preset-release-assert-test/bin/*_tests build/bin/ + SAVE ARTIFACT build + SAVE IMAGE --push aztecprotocol/bb-test-binaries:$TARGETARCH-$EARTHLY_GIT_HASH + END test-clang-format: - FROM +source - COPY .clang-format . - COPY format.sh . - RUN ./format.sh check + FROM +source + COPY .clang-format . + COPY format.sh . + RUN ./format.sh check test: - ARG hardware_concurrency="" - # prefetch - BUILD +preset-release-assert-test - BUILD +test-clang-format - BUILD ./srs_db/+build # prefetch - FROM +preset-release-assert-test - COPY --dir ./srs_db/+build/. srs_db - # limit hardware concurrency, if provided - IF [ "$HARDWARE_CONCURRENCY" != "" ] - ENV HARDWARE_CONCURRENCY=$hardware_concurrency - END - RUN cd build && GTEST_COLOR=1 ctest -j$(nproc) --output-on-failure + ARG hardware_concurrency="" + # prefetch + BUILD +preset-release-assert-test + BUILD +test-clang-format + BUILD ./srs_db/+build # prefetch + FROM +preset-release-assert-test + COPY --dir ./srs_db/+build/. srs_db + # limit hardware concurrency, if provided + IF [ "$HARDWARE_CONCURRENCY" != "" ] + ENV HARDWARE_CONCURRENCY=$hardware_concurrency + END + RUN cd build && GTEST_COLOR=1 ctest -j$(nproc) --output-on-failure vm-full-test: - ARG hardware_concurrency="" - # prefetch - BUILD +test-binaries - BUILD +preset-release-assert-test - BUILD ./srs_db/+build # prefetch - FROM +source - COPY --dir +test-binaries/build build - FROM +preset-release-assert-test - COPY --dir ./srs_db/+build/. srs_db - # limit hardware concurrency, if provided - IF [ "$HARDWARE_CONCURRENCY" != "" ] - ENV HARDWARE_CONCURRENCY=$hardware_concurrency - END - RUN cd build && GTEST_COLOR=1 AVM_ENABLE_FULL_PROVING=1 ctest -j4 --test-dir src/barretenberg/vm --output-on-failure + ARG hardware_concurrency="" + # prefetch + BUILD +test-binaries + BUILD +preset-release-assert-test + BUILD ./srs_db/+build # prefetch + FROM +source + COPY --dir +test-binaries/build build + FROM +preset-release-assert-test + COPY --dir ./srs_db/+build/. srs_db + # limit hardware concurrency, if provided + IF [ "$HARDWARE_CONCURRENCY" != "" ] + ENV HARDWARE_CONCURRENCY=$hardware_concurrency + END + RUN cd build && GTEST_COLOR=1 AVM_ENABLE_FULL_PROVING=1 ctest -j4 --test-dir src/barretenberg/vm --output-on-failure build: - BUILD +preset-wasm - BUILD +preset-wasm-threads - BUILD +preset-release - BUILD +preset-release-world-state + BUILD +preset-wasm + BUILD +preset-wasm-threads + BUILD +preset-release + BUILD +preset-release-world-state diff --git a/barretenberg/cpp/scripts/analyze_client_ivc_bench.py b/barretenberg/cpp/scripts/analyze_client_ivc_bench.py old mode 100644 new mode 100755 diff --git a/barretenberg/cpp/scripts/benchmark_tracy_build_mainframe_run_local.sh b/barretenberg/cpp/scripts/benchmark_tracy_build_mainframe_run_local.sh new file mode 100755 index 00000000000..b7004a0df26 --- /dev/null +++ b/barretenberg/cpp/scripts/benchmark_tracy_build_mainframe_run_local.sh @@ -0,0 +1,49 @@ + +# NOTE: intended to be ran from one's external computer, connecting to Aztec mainframe +# IF ON YOUR LOCAL COMPUTER USE NORMAL INTERACTIVE TRACY WORKFLOW +# the benchmark runs with headless capture and then we copy the trace file and run tracy profiler +# This is thus only really useful internally at Aztec, sorry external folks. It can be easily tweaked +# however for any SSH setup, especially an ubuntu one. +# on local machine run: +# export USER=... +# export PRESET=...tracy for memory or tracy-gates for circuit gates... +# ssh $USER-box "cat ~/aztec-packages/barretenberg/cpp/scripts/benchmark_tracy.sh" | bash /dev/stdin $USER +set -eux +USER=${1:-$USER} +BOX=$USER-box +BENCHMARK=${2:-protogalaxy_bench} +COMMAND=${3:-./bin/$BENCHMARK --benchmark_filter=fold_k/17} + +# Can also set PRESET=tracy-gates env variable +PRESET=${PRESET:-tracy-time} + +wait # TODO(AD) hack - not sure why needed +! [ -d ~/tracy ] && git clone https://github.com/wolfpld/tracy ~/tracy +cd ~/tracy +git checkout 075395620a504c0cdcaf9bab3d196db16a043de7 # release 0.11.0 +cmake -B profiler/build -S profiler -DCMAKE_BUILD_TYPE=Release +cmake --build profiler/build --parallel +cd - + +ssh $BOX " + set -eux ; + cd ~/aztec-packages/barretenberg/cpp/ ; + cmake --preset $PRESET && cmake --build --preset $PRESET --target $BENCHMARK ; +" & +wait +if [ ! -d build-$PRESET/bin ]; then + echo build-$PRESET/bin; + mkdir -p build-$PRESET/bin; +fi +scp $BOX:/mnt/user-data/$USER/aztec-packages/barretenberg/cpp/build-$PRESET/bin/$BENCHMARK build-$PRESET/bin/. ; +! [ -d ~/tracy ] && git clone https://github.com/wolfpld/tracy ~/tracy ; +cd ~/tracy/capture ; + git checkout 075395620a504c0cdcaf9bab3d196db16a043de7 ; +mkdir -p build && cd build && cmake .. && make -j ; + +./tracy-capture -a 127.0.0.1 -f -o ../trace-$BENCHMARK & +sleep 0.1 ; +cd ~/aztec-packages/barretenberg/cpp/build-$PRESET/ +$COMMAND ; + +~/tracy/profiler/build/tracy-profiler ~/tracy/capture/trace-$BENCHMARK diff --git a/barretenberg/cpp/scripts/benchmark_tracy.sh b/barretenberg/cpp/scripts/benchmark_tracy_build_mainframe_view_local.sh similarity index 100% rename from barretenberg/cpp/scripts/benchmark_tracy.sh rename to barretenberg/cpp/scripts/benchmark_tracy_build_mainframe_view_local.sh diff --git a/barretenberg/cpp/scripts/ci/upload_benchmarks_to_s3.sh b/barretenberg/cpp/scripts/ci/upload_benchmarks_to_s3.sh deleted file mode 100755 index 6a924ba33df..00000000000 --- a/barretenberg/cpp/scripts/ci/upload_benchmarks_to_s3.sh +++ /dev/null @@ -1,21 +0,0 @@ -# Uploads to S3 a recent barretenberg benchmark run. -#!/usr/bin/env bash -[ -n "${BUILD_SYSTEM_DEBUG:-}" ] && set -x # conditionally trace -set -eu - -retry ecr_login -extract_repo barretenberg-bench /usr/src extracted-repo - -BUCKET_NAME="aztec-ci-artifacts" -COMMIT_HASH="${COMMIT_HASH:-$(git rev-parse HEAD)}" - -if [ "${BRANCH:-}" = "master" ]; then - TARGET_FOLDER="barretenberg-bench-v1/master/$COMMIT_HASH/" -elif [ -n "${PULL_REQUEST:-}" ]; then - TARGET_FOLDER="barretenberg-bench-v1/pulls/${PULL_REQUEST##*/}" -else - echo Skipping upload since no target folder was defined - exit -fi -echo "Uploading to s3://$BUCKET_NAME/$TARGET_FOLDER" -aws s3 cp extracted-repo/src/barretenberg/cpp/build/ultra_honk_rounds_bench.json "s3://$BUCKET_NAME/$TARGET_FOLDER/ultra_honk_rounds_bench.json" diff --git a/barretenberg/cpp/scripts/compare_branch_vs_baseline_remote.sh b/barretenberg/cpp/scripts/compare_branch_vs_baseline_remote.sh index edd23d05119..7c9192fa3f7 100755 --- a/barretenberg/cpp/scripts/compare_branch_vs_baseline_remote.sh +++ b/barretenberg/cpp/scripts/compare_branch_vs_baseline_remote.sh @@ -19,6 +19,11 @@ HARDWARE_CONCURRENCY=${HARDWARE_CONCURRENCY:-16} BASELINE_BRANCH="master" BENCH_TOOLS_DIR="$BUILD_DIR/_deps/benchmark-src/tools" +if [ ! -z "$(git status --untracked-files=no --porcelain)" ]; then + echo "Git status is unclean; the script will not be able to check out $BASELINE_BRANCH." + exit 1 +fi + echo -e "\nComparing $BENCHMARK between $BASELINE_BRANCH and current branch:" # Move above script dir. diff --git a/barretenberg/cpp/scripts/compare_branch_vs_baseline_remote_wasm.sh b/barretenberg/cpp/scripts/compare_branch_vs_baseline_remote_wasm.sh index d7732ffc41a..aaee9d0f3b6 100755 --- a/barretenberg/cpp/scripts/compare_branch_vs_baseline_remote_wasm.sh +++ b/barretenberg/cpp/scripts/compare_branch_vs_baseline_remote_wasm.sh @@ -19,6 +19,12 @@ HARDWARE_CONCURRENCY=${HARDWARE_CONCURRENCY:-16} BASELINE_BRANCH="master" BENCH_TOOLS_DIR="$BUILD_DIR/_deps/benchmark-src/tools" +if [ ! -z "$(git status --untracked-files=no --porcelain)" ]; then + echo "Git status is unclean; the script will not be able to check out $BASELINE_BRANCH." + exit 1 +fi + + echo -e "\nComparing $BENCHMARK between $BASELINE_BRANCH and current branch:" # Move above script dir. diff --git a/barretenberg/cpp/scripts/compare_client_ivc_bench.sh b/barretenberg/cpp/scripts/compare_client_ivc_bench.sh index aa4179d6df0..01c6f367b0c 100755 --- a/barretenberg/cpp/scripts/compare_client_ivc_bench.sh +++ b/barretenberg/cpp/scripts/compare_client_ivc_bench.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash set -eu -./scripts/compare_branch_vs_baseline_remote_wasm.sh client_ivc_bench 'Full/6$' \ No newline at end of file +./scripts/compare_branch_vs_baseline_remote.sh client_ivc_bench 'Full/6$' \ No newline at end of file diff --git a/barretenberg/cpp/scripts/compare_client_ivc_bench_wasm.sh b/barretenberg/cpp/scripts/compare_client_ivc_bench_wasm.sh new file mode 100755 index 00000000000..aa4179d6df0 --- /dev/null +++ b/barretenberg/cpp/scripts/compare_client_ivc_bench_wasm.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -eu + +./scripts/compare_branch_vs_baseline_remote_wasm.sh client_ivc_bench 'Full/6$' \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/bb/main.cpp b/barretenberg/cpp/src/barretenberg/bb/main.cpp index cadf836cc53..ad3b4e111df 100644 --- a/barretenberg/cpp/src/barretenberg/bb/main.cpp +++ b/barretenberg/cpp/src/barretenberg/bb/main.cpp @@ -1536,7 +1536,7 @@ int main(int argc, char* argv[]) } else if (command == "prove_ultra_honk") { std::string output_path = get_option(args, "-o", "./proofs/proof"); prove_honk(bytecode_path, witness_path, output_path); - } else if (command == "prove_keccak_ultra_honk") { + } else if (command == "prove_ultra_keccak_honk") { std::string output_path = get_option(args, "-o", "./proofs/proof"); prove_honk(bytecode_path, witness_path, output_path); } else if (command == "prove_ultra_keccak_honk_output_all") { diff --git a/barretenberg/cpp/src/barretenberg/bb/readme.md b/barretenberg/cpp/src/barretenberg/bb/readme.md index 028e52ed4c1..eb1ff22b2c8 100644 --- a/barretenberg/cpp/src/barretenberg/bb/readme.md +++ b/barretenberg/cpp/src/barretenberg/bb/readme.md @@ -107,10 +107,10 @@ Barretenberg UltraHonk comes with the capability to verify proofs in Solidity, i 2. Prove the valid execution of your Noir program running: ```bash - bb prove_keccak_ultra_honk -b ./target/hello_world.json -w ./target/witness-name.gz -o ./target/proof + bb prove_ultra_keccak_honk -b ./target/hello_world.json -w ./target/witness-name.gz -o ./target/proof ``` - > **Note:** `prove_keccak_ultra_honk` is used to generate UltraHonk proofs with Keccak hashes, as it is what the Solidity verifier is designed to be compatible with given the better gas efficiency when verifying on-chain; `prove_ultra_honk` in comparison generates proofs with Poseidon hashes, more efficient in recursions but not on-chain verifications. + > **Note:** `prove_ultra_keccak_honk` is used to generate UltraHonk proofs with Keccak hashes, as it is what the Solidity verifier is designed to be compatible with given the better gas efficiency when verifying on-chain; `prove_ultra_honk` in comparison generates proofs with Poseidon hashes, more efficient in recursions but not on-chain verifications. 3. Compute the verification key for your Noir program running: diff --git a/barretenberg/cpp/src/barretenberg/benchmark/client_ivc_bench/client_ivc.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/client_ivc_bench/client_ivc.bench.cpp index e891e9e23ce..12cc8718749 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/client_ivc_bench/client_ivc.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/client_ivc_bench/client_ivc.bench.cpp @@ -1,13 +1,12 @@ +/** + * @warning These benchmarks use functions that are tested elsewhere to guard against regressions in the benchmark. + * Please do not anything that is untested. + */ #include -#include "barretenberg/client_ivc/client_ivc.hpp" -#include "barretenberg/client_ivc/mock_circuit_producer.hpp" -#include "barretenberg/common/op_count.hpp" +#include "barretenberg/client_ivc/test_bench_shared.hpp" #include "barretenberg/common/op_count_google_bench.hpp" -#include "barretenberg/goblin/mock_circuits.hpp" -#include "barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp" -#include "barretenberg/ultra_honk/ultra_verifier.hpp" using namespace benchmark; using namespace bb; @@ -16,16 +15,10 @@ namespace { /** * @brief Benchmark suite for the aztec client PG-Goblin IVC scheme - * */ class ClientIVCBench : public benchmark::Fixture { public: - using Builder = MegaCircuitBuilder; - using DeciderVerificationKey = DeciderVerificationKey_; - using Proof = ClientIVC::Proof; - using MockCircuitProducer = PrivateFunctionExecutionMockCircuitProducer; - - // Number of function circuits to accumulate(based on Zacs target numbers) + // Number of function circuits to accumulate (based on Zac's target numbers) static constexpr size_t NUM_ITERATIONS_MEDIUM_COMPLEXITY = 6; void SetUp([[maybe_unused]] const ::benchmark::State& state) override @@ -33,75 +26,26 @@ class ClientIVCBench : public benchmark::Fixture { bb::srs::init_crs_factory("../srs_db/ignition"); bb::srs::init_grumpkin_crs_factory("../srs_db/grumpkin"); } - - /** - * @brief Verify an IVC proof - * - */ - static bool verify_ivc(Proof& proof, ClientIVC& ivc) - { - auto verifier_inst = std::make_shared(ivc.verification_queue[0].honk_verification_key); - bool verified = ivc.verify(proof, { ivc.verifier_accumulator, verifier_inst }); - - // This is a benchmark, not a test, so just print success or failure to the log - if (verified) { - info("IVC successfully verified!"); - } else { - info("IVC failed to verify."); - } - return verified; - } - - /** - * @brief Perform a specified number of circuit accumulation rounds - * - * @param NUM_CIRCUITS Number of circuits to accumulate (apps + kernels) - */ - static void perform_ivc_accumulation_rounds(size_t NUM_CIRCUITS, ClientIVC& ivc, auto& precomputed_vks) - { - ASSERT(precomputed_vks.size() == NUM_CIRCUITS); // ensure presence of a precomputed VK for each circuit - - MockCircuitProducer circuit_producer; - - for (size_t circuit_idx = 0; circuit_idx < NUM_CIRCUITS; ++circuit_idx) { - Builder circuit; - { - BB_OP_COUNT_TIME_NAME("construct_circuits"); - circuit = circuit_producer.create_next_circuit(ivc); - } - - ivc.accumulate(circuit, precomputed_vks[circuit_idx]); - } - } }; /** * @brief Benchmark the prover work for the full PG-Goblin IVC protocol - * */ BENCHMARK_DEFINE_F(ClientIVCBench, Full)(benchmark::State& state) { ClientIVC ivc; ivc.trace_structure = TraceStructure::CLIENT_IVC_BENCH; - auto total_num_circuits = 2 * static_cast(state.range(0)); // 2x accounts for kernel circuits + auto mocked_vkeys = mock_verification_keys(total_num_circuits); - // Precompute the verification keys for the benchmark circuits - MockCircuitProducer circuit_producer; - auto precomputed_vkeys = circuit_producer.precompute_verification_keys(total_num_circuits, ivc.trace_structure); - - Proof proof; for (auto _ : state) { BB_REPORT_OP_COUNT_IN_BENCH(state); - perform_ivc_accumulation_rounds(total_num_circuits, ivc, precomputed_vkeys); - proof = ivc.prove(); + perform_ivc_accumulation_rounds(total_num_circuits, ivc, mocked_vkeys, /* mock_vk */ true); + ivc.prove(); } - - // For good measure, ensure the IVC verifies - verify_ivc(proof, ivc); } -#define ARGS Arg(ClientIVCBench::NUM_ITERATIONS_MEDIUM_COMPLEXITY) +#define ARGS Arg(ClientIVCBench::NUM_ITERATIONS_MEDIUM_COMPLEXITY)->Arg(2) BENCHMARK_REGISTER_F(ClientIVCBench, Full)->Unit(benchmark::kMillisecond)->ARGS; diff --git a/barretenberg/cpp/src/barretenberg/benchmark/protogalaxy_bench/protogalaxy.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/protogalaxy_bench/protogalaxy.bench.cpp index 105bbb564ce..864f8d7f383 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/protogalaxy_bench/protogalaxy.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/protogalaxy_bench/protogalaxy.bench.cpp @@ -75,7 +75,7 @@ void fold_k(State& state) noexcept } } -BENCHMARK(vector_of_evaluations)->DenseRange(15, 21)->Unit(kMillisecond); +BENCHMARK(vector_of_evaluations)->DenseRange(15, 21)->Unit(kMillisecond)->Iterations(1); BENCHMARK(compute_row_evaluations)->DenseRange(15, 21)->Unit(kMillisecond); // We stick to just k=1 for compile-time reasons. BENCHMARK(fold_k)->/* vary the circuit size */ DenseRange(14, 20)->Unit(kMillisecond); diff --git a/barretenberg/cpp/src/barretenberg/benchmark/protogalaxy_rounds_bench/protogalaxy_rounds.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/protogalaxy_rounds_bench/protogalaxy_rounds.bench.cpp index da79a67adb5..3fa5518ab1d 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/protogalaxy_rounds_bench/protogalaxy_rounds.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/protogalaxy_rounds_bench/protogalaxy_rounds.bench.cpp @@ -9,7 +9,8 @@ using namespace benchmark; namespace bb { -template +using Flavor = MegaFlavor; + void _bench_round(::benchmark::State& state, void (*F)(ProtogalaxyProver_>&)) { using Builder = typename Flavor::CircuitBuilder; @@ -48,7 +49,7 @@ void _bench_round(::benchmark::State& state, void (*F)(ProtogalaxyProver_>&)) { - _bench_round(state, F); + _bench_round(state, F); } BENCHMARK_CAPTURE(bench_round_mega, oink, [](auto& prover) { prover.run_oink_prover_on_each_incomplete_key(); }) diff --git a/barretenberg/cpp/src/barretenberg/benchmark/relations_bench/barycentric.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/relations_bench/barycentric.bench.cpp index 64db936c71a..243f4f4137c 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/relations_bench/barycentric.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/relations_bench/barycentric.bench.cpp @@ -14,14 +14,50 @@ using bb::Univariate; namespace bb::benchmark { -void extend_2_to_6(State& state) noexcept +void extend_2_to_11(State& state) noexcept { auto univariate = Univariate::get_random(); for (auto _ : state) { - DoNotOptimize(univariate.extend_to<6>()); + DoNotOptimize(univariate.extend_to<11>()); } } -BENCHMARK(extend_2_to_6); + +// 93.9s goes down to 62.7 +// Theoretical min: 1 sub, 9 additions at about 3.8ns each, 38ns +void fake_extend_2_to_11(State& state) noexcept +{ + std::array univariate; + std::generate(univariate.begin(), univariate.end(), [&]() { return FF::random_element(); }); + + const auto extend_to_11 = [](auto& arr) { + FF tmp = arr[1]; + const FF delta = tmp - arr[0]; + for (size_t idx = 2; idx < 10; idx++) { + arr[idx] = (tmp += delta); // fused ~> 62.9ns; non-fused ~>69.5ns + } + arr[10] = tmp; // save one +=; + return arr; + }; + + for (auto _ : state) { + DoNotOptimize(extend_to_11(univariate)); + } +} + +// 93.9s goes down to 62.7 +// Theoretical min: 1 sub, 9 additions at about 3.8ns each, 38ns +void self_extend_2_to_11(State& state) noexcept +{ + auto univariate = Univariate::get_random(); + + for (auto _ : state) { + univariate.self_extend_from<2>(); + } +} + +BENCHMARK(extend_2_to_11); +BENCHMARK(fake_extend_2_to_11); +BENCHMARK(self_extend_2_to_11); } // namespace bb::benchmark diff --git a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/mock_circuits.hpp b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/mock_circuits.hpp index 27e53e13886..0d2787095f3 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/mock_circuits.hpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/mock_circuits.hpp @@ -54,7 +54,9 @@ Prover get_prover(void (*test_circuit_function)(typename Prover::Flavor::Circuit Composer composer; return composer.create_prover(builder); } else { +#ifdef TRACY_MEMORY ZoneScopedN("creating prover"); +#endif return Prover(builder); } }; diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp index 857a70ddb5b..2309dfe689f 100644 --- a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp +++ b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp @@ -146,7 +146,7 @@ void ClientIVC::complete_kernel_circuit_logic(ClientCircuit& circuit) * @param circuit * @param precomputed_vk */ -void ClientIVC::accumulate(ClientCircuit& circuit, const std::shared_ptr& precomputed_vk) +void ClientIVC::accumulate(ClientCircuit& circuit, const std::shared_ptr& precomputed_vk, bool mock_vk) { is_kernel = !is_kernel; // toggle on each call (every even circuit is a kernel) @@ -173,6 +173,9 @@ void ClientIVC::accumulate(ClientCircuit& circuit, const std::shared_ptr(proving_key->proving_key); + if (mock_vk) { + honk_vk->set_metadata(proving_key->proving_key); + } // If this is the first circuit in the IVC, use oink to complete the decider proving key and generate an oink proof if (!initialized) { diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp index 03f2aa4ab5c..8ccc371efad 100644 --- a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp +++ b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp @@ -130,8 +130,17 @@ class ClientIVC { // Complete the logic of a kernel circuit (e.g. PG/merge recursive verification, databus consistency checks) void complete_kernel_circuit_logic(ClientCircuit& circuit); - // Perform prover work for accumulation (e.g. PG folding, merge proving) - void accumulate(ClientCircuit& circuit, const std::shared_ptr& precomputed_vk = nullptr); + /** + * @brief Perform prover work for accumulation (e.g. PG folding, merge proving) + * + * @param circuit The incoming statement + * @param precomputed_vk The verification key of the incoming statement OR a mocked key whose metadata needs to be + * set using the proving key produced from `circuit` in order to pass some assertions in the Oink prover. + * @param mock_vk A boolean to say whether the precomputed vk shoudl have its metadata set. + */ + void accumulate(ClientCircuit& circuit, + const std::shared_ptr& precomputed_vk = nullptr, + bool mock_vk = false); Proof prove(); diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.test.cpp b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.test.cpp index f687323c541..c7e85ed675f 100644 --- a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.test.cpp +++ b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.test.cpp @@ -1,4 +1,5 @@ #include "barretenberg/client_ivc/client_ivc.hpp" +#include "barretenberg/client_ivc/test_bench_shared.hpp" #include "barretenberg/goblin/goblin.hpp" #include "barretenberg/goblin/mock_circuits.hpp" #include "barretenberg/stdlib_circuit_builders/mega_circuit_builder.hpp" @@ -342,3 +343,47 @@ TEST_F(ClientIVCTests, StructuredPrecomputedVKs) EXPECT_TRUE(ivc.prove_and_verify()); }; + +/** + * @brief Run a test using functions shared with the ClientIVC benchmark. + * @details We do have this in addition to the above tests anyway so we can believe that the benchmark is running on + * real data EXCEPT the verification keys, whose correctness is not needed to assess the performance of the folding + * prover. Before this test was added, we spend more than 50% of the benchmarking time running an entire IVC prover + * protocol just to precompute valid verification keys. + */ +TEST(ClientIVCBenchValidation, Full6) +{ + bb::srs::init_crs_factory("../srs_db/ignition"); + bb::srs::init_grumpkin_crs_factory("../srs_db/grumpkin"); + + ClientIVC ivc; + ivc.trace_structure = TraceStructure::CLIENT_IVC_BENCH; + size_t total_num_circuits{ 12 }; + PrivateFunctionExecutionMockCircuitProducer circuit_producer; + auto precomputed_vkeys = circuit_producer.precompute_verification_keys(total_num_circuits, ivc.trace_structure); + perform_ivc_accumulation_rounds(total_num_circuits, ivc, precomputed_vkeys); + auto proof = ivc.prove(); + bool verified = verify_ivc(proof, ivc); + EXPECT_TRUE(verified); +} + +/** + * @brief Test that running the benchmark suite with movked verification keys will not error out. + */ +TEST(ClientIVCBenchValidation, Full6MockedVKs) +{ + const auto run_test = []() { + bb::srs::init_crs_factory("../srs_db/ignition"); + bb::srs::init_grumpkin_crs_factory("../srs_db/grumpkin"); + + ClientIVC ivc; + ivc.trace_structure = TraceStructure::CLIENT_IVC_BENCH; + size_t total_num_circuits{ 12 }; + PrivateFunctionExecutionMockCircuitProducer circuit_producer; + auto mocked_vkeys = mock_verification_keys(total_num_circuits); + perform_ivc_accumulation_rounds(total_num_circuits, ivc, mocked_vkeys, /* mock_vk */ true); + auto proof = ivc.prove(); + verify_ivc(proof, ivc); + }; + ASSERT_NO_FATAL_FAILURE(run_test()); +} \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/test_bench_shared.hpp b/barretenberg/cpp/src/barretenberg/client_ivc/test_bench_shared.hpp new file mode 100644 index 00000000000..d1529a2a9b2 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/client_ivc/test_bench_shared.hpp @@ -0,0 +1,71 @@ + +#include "barretenberg/client_ivc/client_ivc.hpp" +#include "barretenberg/client_ivc/mock_circuit_producer.hpp" +#include "barretenberg/common/op_count.hpp" +#include "barretenberg/goblin/mock_circuits.hpp" +#include "barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp" +#include "barretenberg/ultra_honk/ultra_verifier.hpp" + +namespace bb { + +/** + * @brief Verify an IVC proof + * + */ +bool verify_ivc(ClientIVC::Proof& proof, ClientIVC& ivc) +{ + auto verifier_inst = + std::make_shared>(ivc.verification_queue[0].honk_verification_key); + bool verified = ivc.verify(proof, { ivc.verifier_accumulator, verifier_inst }); + + // This is a benchmark, not a test, so just print success or failure to the log + if (verified) { + info("IVC successfully verified!"); + } else { + info("IVC failed to verify."); + } + return verified; +} + +/** + * @brief Perform a specified number of circuit accumulation rounds + * + * @param NUM_CIRCUITS Number of circuits to accumulate (apps + kernels) + */ +void perform_ivc_accumulation_rounds(size_t NUM_CIRCUITS, + ClientIVC& ivc, + auto& precomputed_vks, + const bool& mock_vk = false) +{ + ASSERT(precomputed_vks.size() == NUM_CIRCUITS); // ensure presence of a precomputed VK for each circuit + + PrivateFunctionExecutionMockCircuitProducer circuit_producer; + + for (size_t circuit_idx = 0; circuit_idx < NUM_CIRCUITS; ++circuit_idx) { + MegaCircuitBuilder circuit; + { + BB_OP_COUNT_TIME_NAME("construct_circuits"); + circuit = circuit_producer.create_next_circuit(ivc); + } + + ivc.accumulate(circuit, precomputed_vks[circuit_idx], mock_vk); + } +} + +std::vector> mock_verification_keys(const size_t num_circuits) +{ + + std::vector> vkeys; + + for (size_t idx = 0; idx < num_circuits; ++idx) { + auto key = std::make_shared(); + for (auto& commitment : key->get_all()) { + commitment = MegaFlavor::Commitment::random_element(); + } + vkeys.push_back(key); + } + + return vkeys; +} + +} // namespace bb \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.hpp index 0766722893e..d8fa2ab6e54 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.hpp @@ -95,6 +95,7 @@ template inline std::vector powers_of_evaluation_challenge(const template class GeminiProver_ { using Fr = typename Curve::ScalarField; + using Commitment = typename Curve::AffineElement; using Polynomial = bb::Polynomial; using Claim = ProverOpeningClaim; @@ -168,7 +169,7 @@ template class GeminiVerifier_ { // compute vector of powers of random evaluation point r const Fr r = transcript->template get_challenge("Gemini:r"); - const std::vector r_squares = gemini::powers_of_evaluation_challenge(r, num_variables); + const std::vector r_squares = gemini::powers_of_evaluation_challenge(r, CONST_PROOF_SIZE_LOG_N); // Get evaluations a_i, i = 0,...,m-1 from transcript const std::vector evaluations = get_gemini_evaluations(num_variables, transcript); @@ -197,22 +198,24 @@ template class GeminiVerifier_ { return fold_polynomial_opening_claims; } - static std::vector get_fold_commitments(const size_t log_circuit_size, auto& transcript) + static std::vector get_fold_commitments([[maybe_unused]] const size_t log_circuit_size, + auto& transcript) { std::vector fold_commitments; - fold_commitments.reserve(log_circuit_size - 1); - for (size_t i = 0; i < log_circuit_size - 1; ++i) { + fold_commitments.reserve(CONST_PROOF_SIZE_LOG_N - 1); + for (size_t i = 0; i < CONST_PROOF_SIZE_LOG_N - 1; ++i) { const Commitment commitment = transcript->template receive_from_prover("Gemini:FOLD_" + std::to_string(i + 1)); fold_commitments.emplace_back(commitment); } return fold_commitments; } - static std::vector get_gemini_evaluations(const size_t log_circuit_size, auto& transcript) + static std::vector get_gemini_evaluations([[maybe_unused]] const size_t log_circuit_size, auto& transcript) { std::vector gemini_evaluations; - gemini_evaluations.reserve(log_circuit_size); - for (size_t i = 1; i <= log_circuit_size; ++i) { + gemini_evaluations.reserve(CONST_PROOF_SIZE_LOG_N); + + for (size_t i = 1; i <= CONST_PROOF_SIZE_LOG_N; ++i) { const Fr evaluation = transcript->template receive_from_prover("Gemini:a_" + std::to_string(i)); gemini_evaluations.emplace_back(evaluation); } @@ -241,29 +244,41 @@ template class GeminiVerifier_ { * @param fold_polynomial_evals Evaluations \f$ A_{i-1}(-r^{2^{i-1}}) \f$. * @return Evaluation \f$ A_0(r) \f$. */ - static Fr compute_gemini_batched_univariate_evaluation(size_t evaluation_point_size, - Fr& batched_eval_accumulator, - std::span evaluation_point, - std::span challenge_powers, - std::span fold_polynomial_evals) + static Fr compute_gemini_batched_univariate_evaluation( + const size_t num_variables, + Fr& batched_eval_accumulator, + std::span evaluation_point, // CONST_PROOF_SIZE + std::span challenge_powers, // r_squares CONST_PROOF_SIZE_LOG_N + std::span fold_polynomial_evals) { - const size_t num_variables = evaluation_point_size; - const auto& evals = fold_polynomial_evals; // Solve the sequence of linear equations - for (size_t l = num_variables; l != 0; --l) { + for (size_t l = CONST_PROOF_SIZE_LOG_N; l != 0; --l) { // Get r²⁽ˡ⁻¹⁾ const Fr& challenge_power = challenge_powers[l - 1]; - // Get A₍ₗ₋₁₎(−r²⁽ˡ⁻¹⁾) - const Fr& eval_neg = evals[l - 1]; // Get uₗ₋₁ const Fr& u = evaluation_point[l - 1]; + const Fr& eval_neg = evals[l - 1]; + // Get A₍ₗ₋₁₎(−r²⁽ˡ⁻¹⁾) // Compute the numerator - batched_eval_accumulator = + Fr batched_eval_round_acc = ((challenge_power * batched_eval_accumulator * 2) - eval_neg * (challenge_power * (Fr(1) - u) - u)); // Divide by the denominator - batched_eval_accumulator *= (challenge_power * (Fr(1) - u) + u).invert(); + batched_eval_round_acc *= (challenge_power * (Fr(1) - u) + u).invert(); + + if constexpr (Curve::is_stdlib_type) { + auto builder = evaluation_point[0].get_context(); + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1114): insecure! + stdlib::bool_t dummy_round = stdlib::witness_t(builder, l > num_variables); + batched_eval_accumulator = + Fr::conditional_assign(dummy_round, batched_eval_accumulator, batched_eval_round_acc); + + } else { + if (l <= num_variables) { + batched_eval_accumulator = batched_eval_round_acc; + } + } } return batched_eval_accumulator; diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini_impl.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini_impl.hpp index 05a1cd99447..fde94fdcdb1 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini_impl.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini_impl.hpp @@ -73,15 +73,23 @@ std::vector::Claim> GeminiProver_::prove( auto fold_polynomials = compute_fold_polynomials( log_n, multilinear_challenge, std::move(batched_unshifted), std::move(batched_to_be_shifted)); - for (size_t l = 0; l < log_n - 1; l++) { - transcript->send_to_verifier("Gemini:FOLD_" + std::to_string(l + 1), - commitment_key->commit(fold_polynomials[l + 2])); + for (size_t l = 0; l < CONST_PROOF_SIZE_LOG_N - 1; l++) { + if (l < log_n - 1) { + transcript->send_to_verifier("Gemini:FOLD_" + std::to_string(l + 1), + commitment_key->commit(fold_polynomials[l + 2])); + } else { + transcript->send_to_verifier("Gemini:FOLD_" + std::to_string(l + 1), Commitment::one()); + } } const Fr r_challenge = transcript->template get_challenge("Gemini:r"); std::vector claims = compute_fold_polynomial_evaluations(log_n, std::move(fold_polynomials), r_challenge); - for (size_t l = 1; l <= log_n; l++) { - transcript->send_to_verifier("Gemini:a_" + std::to_string(l), claims[l].opening_pair.evaluation); + for (size_t l = 1; l <= CONST_PROOF_SIZE_LOG_N; l++) { + if (l <= log_n) { + transcript->send_to_verifier("Gemini:a_" + std::to_string(l), claims[l].opening_pair.evaluation); + } else { + transcript->send_to_verifier("Gemini:a_" + std::to_string(l), Fr::zero()); + } } return claims; diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplemini.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplemini.hpp index 98f4aa22147..1d5aae300ce 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplemini.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplemini.hpp @@ -128,9 +128,9 @@ template class ShpleminiVerifier_ { const Fr gemini_evaluation_challenge = transcript->template get_challenge("Gemini:r"); // - Get evaluations (A₀(−r), A₁(−r²), ... , Aₙ₋₁(−r²⁽ⁿ⁻¹⁾)) const std::vector gemini_evaluations = GeminiVerifier::get_gemini_evaluations(log_circuit_size, transcript); - // - Compute vector (r, r², ... , r²⁽ⁿ⁻¹⁾), where n = log_circuit_size + // - Compute vector (r, r², ... , r²⁽ⁿ⁻¹⁾), where n = log_circuit_size, I think this should be CONST_PROOF_SIZE const std::vector gemini_eval_challenge_powers = - gemini::powers_of_evaluation_challenge(gemini_evaluation_challenge, log_circuit_size); + gemini::powers_of_evaluation_challenge(gemini_evaluation_challenge, CONST_PROOF_SIZE_LOG_N); // Process Shplonk transcript data: // - Get Shplonk batching challenge @@ -143,7 +143,7 @@ template class ShpleminiVerifier_ { // Get Shplonk opening point z const Fr shplonk_evaluation_challenge = transcript->template get_challenge("Shplonk:z"); // Start computing the scalar to be multiplied by [1]₁ - Fr constant_term_accumulator{ 0 }; + Fr constant_term_accumulator = Fr(0); // Initialize the vector of scalars placing the scalar 1 correposnding to Q_commitment std::vector scalars; @@ -167,7 +167,7 @@ template class ShpleminiVerifier_ { // Place the commitments to prover polynomials in the commitments vector. Compute the evaluation of the // batched multilinear polynomial. Populate the vector of scalars for the final batch mul - Fr batched_evaluation{ 0 }; + Fr batched_evaluation = Fr(0); batch_multivariate_opening_claims(unshifted_commitments, shifted_commitments, unshifted_evaluations, @@ -334,17 +334,32 @@ template class ShpleminiVerifier_ { std::vector& scalars, Fr& constant_term_accumulator) { + // Initialize batching challenge as ν² - Fr current_batching_challenge = shplonk_batching_challenge * shplonk_batching_challenge; - for (size_t j = 0; j < log_circuit_size - 1; ++j) { + Fr current_batching_challenge = shplonk_batching_challenge.sqr(); + for (size_t j = 0; j < CONST_PROOF_SIZE_LOG_N - 1; ++j) { // Compute the scaling factor (ν²⁺ⁱ) / (z + r²⁽ⁱ⁺²⁾) for i = 0, … , d-2 Fr scaling_factor = current_batching_challenge * inverse_vanishing_evals[j + 2]; - // Place the scaling factor to the 'scalars' vector - scalars.emplace_back(-scaling_factor); + // Add Aᵢ(−r²ⁱ) for i = 1, … , n-1 to the constant term accumulator constant_term_accumulator += scaling_factor * gemini_evaluations[j + 1]; + // Update the batching challenge current_batching_challenge *= shplonk_batching_challenge; + + if constexpr (Curve::is_stdlib_type) { + auto builder = shplonk_batching_challenge.get_context(); + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1114): insecure! + stdlib::bool_t dummy_round = stdlib::witness_t(builder, j >= (log_circuit_size - 1)); + Fr zero = Fr(0); + scaling_factor = Fr::conditional_assign(dummy_round, zero, scaling_factor); + } else { + if (j >= (log_circuit_size - 1)) { + scaling_factor = 0; + } + } + // Place the scaling factor to the 'scalars' vector + scalars.emplace_back(-scaling_factor); // Move com(Aᵢ) to the 'commitments' vector commitments.emplace_back(std::move(fold_commitments[j])); } diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplemini.test.cpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplemini.test.cpp index b1aad152f59..55739360179 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplemini.test.cpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplemini.test.cpp @@ -216,7 +216,6 @@ TYPED_TEST(ShpleminiTest, CorrectnessOfGeminiClaimBatching) scalars, expected_constant_term_accumulator); - EXPECT_EQ(commitments.size(), prover_commitments.size()); // Compute the group element using the output of Shplemini method GroupElement shplemini_result = batch_mul_native(commitments, scalars); diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp index f8db79c9a2a..fa8deca2a6a 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp @@ -31,7 +31,7 @@ template class ShplonkProver_ { public: /** - * @brief Compute batched quotient polynomial Q(X) = ∑ⱼ ρʲ ⋅ ( fⱼ(X) − vⱼ) / ( X − xⱼ ) + * @brief Compute batched quotient polynomial Q(X) = ∑ⱼ νʲ ⋅ ( fⱼ(X) − vⱼ) / ( X − xⱼ ) * * @param opening_claims list of prover opening claims {fⱼ(X), (xⱼ, vⱼ)} for a witness polynomial fⱼ(X), s.t. fⱼ(xⱼ) * = vⱼ. @@ -45,7 +45,7 @@ template class ShplonkProver_ { for (const auto& claim : opening_claims) { max_poly_size = std::max(max_poly_size, claim.polynomial.size()); } - // Q(X) = ∑ⱼ ρʲ ⋅ ( fⱼ(X) − vⱼ) / ( X − xⱼ ) + // Q(X) = ∑ⱼ νʲ ⋅ ( fⱼ(X) − vⱼ) / ( X − xⱼ ) Polynomial Q(max_poly_size); Polynomial tmp(max_poly_size); @@ -71,7 +71,7 @@ template class ShplonkProver_ { * * @param opening_pairs list of opening pairs (xⱼ, vⱼ) for a witness polynomial fⱼ(X), s.t. fⱼ(xⱼ) = vⱼ. * @param witness_polynomials list of polynomials fⱼ(X). - * @param batched_quotient_Q Q(X) = ∑ⱼ ρʲ ⋅ ( fⱼ(X) − vⱼ) / ( X − xⱼ ) + * @param batched_quotient_Q Q(X) = ∑ⱼ νʲ ⋅ ( fⱼ(X) − vⱼ) / ( X − xⱼ ) * @param nu_challenge * @param z_challenge * @return Output{OpeningPair, Polynomial} @@ -92,21 +92,21 @@ template class ShplonkProver_ { } Fr::batch_invert(inverse_vanishing_evals); - // G(X) = Q(X) - Q_z(X) = Q(X) - ∑ⱼ ρʲ ⋅ ( fⱼ(X) − vⱼ) / ( r − xⱼ ), + // G(X) = Q(X) - Q_z(X) = Q(X) - ∑ⱼ νʲ ⋅ ( fⱼ(X) − vⱼ) / ( z − xⱼ ), // s.t. G(r) = 0 Polynomial G(std::move(batched_quotient_Q)); // G(X) = Q(X) - // G₀ = ∑ⱼ ρʲ ⋅ vⱼ / ( r − xⱼ ) + // G₀ = ∑ⱼ νʲ ⋅ vⱼ / ( z − xⱼ ) Fr current_nu = Fr::one(); Polynomial tmp(G.size()); size_t idx = 0; for (const auto& claim : opening_claims) { - // tmp = ρʲ ⋅ ( fⱼ(X) − vⱼ) / ( r − xⱼ ) + // tmp = νʲ ⋅ ( fⱼ(X) − vⱼ) / ( z − xⱼ ) tmp = claim.polynomial; tmp.at(0) = tmp[0] - claim.opening_pair.evaluation; - Fr scaling_factor = current_nu * inverse_vanishing_evals[idx]; // = ρʲ / ( r − xⱼ ) + Fr scaling_factor = current_nu * inverse_vanishing_evals[idx]; // = νʲ / (z − xⱼ ) - // G -= ρʲ ⋅ ( fⱼ(X) − vⱼ) / ( r − xⱼ ) + // G -= νʲ ⋅ ( fⱼ(X) − vⱼ) / ( z − xⱼ ) G.add_scaled(tmp, -scaling_factor); current_nu *= nu_challenge; @@ -174,15 +174,15 @@ template class ShplonkVerifier_ { const Fr z_challenge = transcript->template get_challenge("Shplonk:z"); - // [G] = [Q] - ∑ⱼ ρʲ / ( r − xⱼ )⋅[fⱼ] + G₀⋅[1] - // = [Q] - [∑ⱼ ρʲ ⋅ ( fⱼ(X) − vⱼ) / ( r − xⱼ )] + // [G] = [Q] - ∑ⱼ ρʲ / (z − xⱼ )⋅[fⱼ] + G₀⋅[1] + // = [Q] - [∑ⱼ ρʲ ⋅ ( fⱼ(X) − vⱼ) / (z − xⱼ )] GroupElement G_commitment; // compute simulated commitment to [G] as a linear combination of // [Q], { [fⱼ] }, [1]: // [G] = [Q] - ∑ⱼ (1/zⱼ(r))[Bⱼ] + ( ∑ⱼ (1/zⱼ(r)) Tⱼ(r) )[1] // = [Q] - ∑ⱼ (1/zⱼ(r))[Bⱼ] + G₀ [1] - // G₀ = ∑ⱼ ρʲ ⋅ vⱼ / ( r − xⱼ ) + // G₀ = ∑ⱼ ρʲ ⋅ vⱼ / (z − xⱼ ) auto G_commitment_constant = Fr(0); // TODO(#673): The recursive and non-recursive (native) logic is completely separated via the following @@ -196,8 +196,8 @@ template class ShplonkVerifier_ { std::vector commitments; std::vector scalars; - // [G] = [Q] - ∑ⱼ ρʲ / ( r − xⱼ )⋅[fⱼ] + G₀⋅[1] - // = [Q] - [∑ⱼ ρʲ ⋅ ( fⱼ(X) − vⱼ) / ( r − xⱼ )] + // [G] = [Q] - ∑ⱼ νʲ / (z − xⱼ )⋅[fⱼ] + G₀⋅[1] + // = [Q] - [∑ⱼ νʲ ⋅ ( fⱼ(X) − vⱼ) / (z − xⱼ )] commitments.emplace_back(Q_commitment); scalars.emplace_back(Fr(builder, 1)); // Fr(1) @@ -215,9 +215,9 @@ template class ShplonkVerifier_ { // (Cⱼ, xⱼ, vⱼ) const auto& [opening_pair, commitment] = claims[j]; - Fr scaling_factor = current_nu * inverse_vanishing_evals[j]; // = ρʲ / ( r − xⱼ ) + Fr scaling_factor = current_nu * inverse_vanishing_evals[j]; // = νʲ / (z − xⱼ ) - // G₀ += ρʲ / ( r − xⱼ ) ⋅ vⱼ + // G₀ += νʲ / (z − xⱼ ) ⋅ vⱼ G_commitment_constant += scaling_factor * opening_pair.evaluation; current_nu *= nu; @@ -230,12 +230,12 @@ template class ShplonkVerifier_ { commitments.emplace_back(g1_identity); scalars.emplace_back(G_commitment_constant); - // [G] += G₀⋅[1] = [G] + (∑ⱼ ρʲ ⋅ vⱼ / ( r − xⱼ ))⋅[1] + // [G] += G₀⋅[1] = [G] + (∑ⱼ νʲ ⋅ vⱼ / (z − xⱼ ))⋅[1] G_commitment = GroupElement::batch_mul(commitments, scalars); } else { - // [G] = [Q] - ∑ⱼ ρʲ / ( r − xⱼ )⋅[fⱼ] + G₀⋅[1] - // = [Q] - [∑ⱼ ρʲ ⋅ ( fⱼ(X) − vⱼ) / ( r − xⱼ )] + // [G] = [Q] - ∑ⱼ νʲ / (z − xⱼ )⋅[fⱼ] + G₀⋅[1] + // = [Q] - [∑ⱼ νʲ ⋅ ( fⱼ(X) − vⱼ) / (z − xⱼ )] G_commitment = Q_commitment; // Compute {ẑⱼ(r)}ⱼ , where ẑⱼ(r) = 1/zⱼ(r) = 1/(r - xⱼ) @@ -252,18 +252,18 @@ template class ShplonkVerifier_ { // (Cⱼ, xⱼ, vⱼ) const auto& [opening_pair, commitment] = claims[j]; - Fr scaling_factor = current_nu * inverse_vanishing_evals[j]; // = ρʲ / ( r − xⱼ ) + Fr scaling_factor = current_nu * inverse_vanishing_evals[j]; // = νʲ / (z − xⱼ ) - // G₀ += ρʲ / ( r − xⱼ ) ⋅ vⱼ + // G₀ += νʲ / (z − xⱼ ) ⋅ vⱼ G_commitment_constant += scaling_factor * opening_pair.evaluation; - // [G] -= ρʲ / ( r − xⱼ )⋅[fⱼ] + // [G] -= νʲ / (z − xⱼ )⋅[fⱼ] G_commitment -= commitment * scaling_factor; current_nu *= nu; } - // [G] += G₀⋅[1] = [G] + (∑ⱼ ρʲ ⋅ vⱼ / ( r − xⱼ ))⋅[1] + // [G] += G₀⋅[1] = [G] + (∑ⱼ νʲ ⋅ vⱼ / (z − xⱼ ))⋅[1] G_commitment += g1_identity * G_commitment_constant; } @@ -273,7 +273,7 @@ template class ShplonkVerifier_ { /** * @brief Computes \f$ \frac{1}{z - r}, \frac{1}{z+r}, \ldots, \frac{1}{z+r^{2^{d-1}}} \f$. * - * @param log_circuit_size \f$ d \f$ + * @param num_gemini_claims \f$ d + 1 \f$ where d = log_circuit_size * @param shplonk_eval_challenge \f$ z \f$ * @param gemini_eval_challenge_powers \f$ (r , r^2, \ldots, r^{2^{d-1}}) \f$ * @return \f[ \left( \frac{1}{z - r}, \frac{1}{z+r}, \ldots, \frac{1}{z+r^{2^{d-1}}} \right) \f] @@ -286,7 +286,8 @@ template class ShplonkVerifier_ { inverted_denominators.reserve(num_gemini_claims); inverted_denominators.emplace_back((shplonk_eval_challenge - gemini_eval_challenge_powers[0]).invert()); for (const auto& gemini_eval_challenge_power : gemini_eval_challenge_powers) { - inverted_denominators.emplace_back((shplonk_eval_challenge + gemini_eval_challenge_power).invert()); + Fr round_inverted_denominator = (shplonk_eval_challenge + gemini_eval_challenge_power).invert(); + inverted_denominators.emplace_back(round_inverted_denominator); } return inverted_denominators; } diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp index e1ee3b92fcd..33bfade2b35 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp @@ -526,7 +526,7 @@ template class ZeroMorphVerifier_ { scalar *= FF(-1); if constexpr (Curve::is_stdlib_type) { auto builder = x_challenge.get_context(); - FF zero = FF::from_witness(builder, 0); + FF zero = FF(0); stdlib::bool_t dummy_round = stdlib::witness_t(builder, is_dummy_round); // TODO(https://github.com/AztecProtocol/barretenberg/issues/1039): is it kosher to reassign like this? scalar = FF::conditional_assign(dummy_round, zero, scalar); diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes_recursion/shplemini.test.cpp b/barretenberg/cpp/src/barretenberg/commitment_schemes_recursion/shplemini.test.cpp index 1398cefe7e8..02e2de4e920 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes_recursion/shplemini.test.cpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes_recursion/shplemini.test.cpp @@ -19,7 +19,8 @@ template class ShpleminiRecursionTest : public CommitmentTest; using Transcript = bb::BaseTranscript>; - constexpr size_t N = 16; - constexpr size_t log_circuit_size = 4; - constexpr size_t NUM_UNSHIFTED = 2; - constexpr size_t NUM_SHIFTED = 1; - srs::init_crs_factory("../srs_db/ignition"); + auto run_shplemini = [](size_t log_circuit_size) { + size_t N = 1 << log_circuit_size; + constexpr size_t NUM_UNSHIFTED = 2; + constexpr size_t NUM_SHIFTED = 1; + std::vector u_challenge(log_circuit_size); + for (size_t idx = 0; idx < log_circuit_size; ++idx) { + u_challenge[idx] = NativeFr::random_element(&shplemini_engine); + }; + // Construct some random multilinear polynomials f_i and their evaluations v_i = f_i(u) + std::vector f_polynomials; // unshifted polynomials + std::vector v_evaluations; + for (size_t i = 0; i < NUM_UNSHIFTED; ++i) { + f_polynomials.emplace_back(Polynomial::random(N, /*shiftable*/ 1)); + v_evaluations.emplace_back(f_polynomials[i].evaluate_mle(u_challenge)); + } - std::vector u_challenge(log_circuit_size); - for (size_t idx = 0; idx < log_circuit_size; ++idx) { - u_challenge[idx] = NativeFr::random_element(&shplemini_engine); - }; - // Construct some random multilinear polynomials f_i and their evaluations v_i = f_i(u) - std::vector f_polynomials; // unshifted polynomials - std::vector v_evaluations; - for (size_t i = 0; i < NUM_UNSHIFTED; ++i) { - f_polynomials.emplace_back(Polynomial::random(N, /*shiftable*/ 1)); - v_evaluations.emplace_back(f_polynomials[i].evaluate_mle(u_challenge)); - } + // Construct some "shifted" multilinear polynomials h_i as the left-shift-by-1 of f_i + std::vector g_polynomials; // to-be-shifted polynomials + std::vector h_polynomials; // shifts of the to-be-shifted polynomials + std::vector w_evaluations; + if constexpr (NUM_SHIFTED > 0) { + for (size_t i = 0; i < NUM_SHIFTED; ++i) { + g_polynomials.emplace_back(f_polynomials[i]); + h_polynomials.emplace_back(g_polynomials[i].shifted()); + w_evaluations.emplace_back(f_polynomials[i].evaluate_mle(u_challenge, true)); + } + } - // Construct some "shifted" multilinear polynomials h_i as the left-shift-by-1 of f_i - std::vector g_polynomials; // to-be-shifted polynomials - std::vector h_polynomials; // shifts of the to-be-shifted polynomials - std::vector w_evaluations; - if constexpr (NUM_SHIFTED > 0) { + // Compute commitments [f_i] + std::vector f_commitments; + auto commitment_key = std::make_shared(16384); + for (size_t i = 0; i < NUM_UNSHIFTED; ++i) { + f_commitments.emplace_back(commitment_key->commit(f_polynomials[i])); + } + // Construct container of commitments of the "to-be-shifted" polynomials [g_i] (= [f_i]) + std::vector g_commitments; for (size_t i = 0; i < NUM_SHIFTED; ++i) { - g_polynomials.emplace_back(f_polynomials[i]); - h_polynomials.emplace_back(g_polynomials[i].shifted()); - w_evaluations.emplace_back(f_polynomials[i].evaluate_mle(u_challenge, true)); + g_commitments.emplace_back(f_commitments[i]); } - } - // Compute commitments [f_i] - std::vector f_commitments; - auto commitment_key = std::make_shared(4096); - for (size_t i = 0; i < NUM_UNSHIFTED; ++i) { - f_commitments.emplace_back(commitment_key->commit(f_polynomials[i])); - } - // Construct container of commitments of the "to-be-shifted" polynomials [g_i] (= [f_i]) - std::vector g_commitments; - for (size_t i = 0; i < NUM_SHIFTED; ++i) { - g_commitments.emplace_back(f_commitments[i]); - } + // Initialize an empty NativeTranscript + auto prover_transcript = NativeTranscript::prover_init_empty(); + auto prover_opening_claims = ShpleminiProver::prove( + N, RefVector(f_polynomials), RefVector(g_polynomials), u_challenge, commitment_key, prover_transcript); + KZG::compute_opening_proof(commitment_key, prover_opening_claims, prover_transcript); + Builder builder; + StdlibProof stdlib_proof = bb::convert_proof_to_witness(&builder, prover_transcript->proof_data); + auto stdlib_verifier_transcript = std::make_shared(stdlib_proof); + stdlib_verifier_transcript->template receive_from_prover("Init"); - // Initialize an empty NativeTranscript - auto prover_transcript = NativeTranscript::prover_init_empty(); - auto prover_opening_claims = ShpleminiProver::prove( - N, RefVector(f_polynomials), RefVector(g_polynomials), u_challenge, commitment_key, prover_transcript); + // Execute Verifier protocol without the need for vk prior the final check + const auto commitments_to_witnesses = [&builder](const auto& commitments) { + std::vector commitments_in_biggroup(commitments.size()); + std::transform(commitments.begin(), + commitments.end(), + commitments_in_biggroup.begin(), + [&builder](const auto& native_commitment) { + return Commitment::from_witness(&builder, native_commitment); + }); + return commitments_in_biggroup; + }; + const auto elements_to_witness = [&](const auto& elements) { + std::vector elements_in_circuit(elements.size()); + std::transform( + elements.begin(), elements.end(), elements_in_circuit.begin(), [&builder](const auto& native_element) { + return Fr::from_witness(&builder, native_element); + }); + return elements_in_circuit; + }; + auto stdlib_f_commitments = commitments_to_witnesses(f_commitments); + auto stdlib_g_commitments = commitments_to_witnesses(g_commitments); + auto stdlib_v_evaluations = elements_to_witness(v_evaluations); + auto stdlib_w_evaluations = elements_to_witness(w_evaluations); - Builder builder; - StdlibProof stdlib_proof = bb::convert_proof_to_witness(&builder, prover_transcript->proof_data); - auto stdlib_verifier_transcript = std::make_shared(stdlib_proof); - [[maybe_unused]] auto _ = stdlib_verifier_transcript->template receive_from_prover("Init"); + std::vector u_challenge_in_circuit; + u_challenge_in_circuit.reserve(CONST_PROOF_SIZE_LOG_N); + auto u_iter = u_challenge.begin(); - // Execute Verifier protocol without the need for vk prior the final check - const auto commitments_to_witnesses = [&builder](const auto& commitments) { - std::vector commitments_in_biggroup(commitments.size()); - std::transform(commitments.begin(), - commitments.end(), - commitments_in_biggroup.begin(), - [&builder](const auto& native_commitment) { - return Commitment::from_witness(&builder, native_commitment); - }); - return commitments_in_biggroup; - }; - const auto elements_to_witness = [&](const auto& elements) { - std::vector elements_in_circuit(elements.size()); - std::transform(elements.begin(), - elements.end(), - elements_in_circuit.begin(), - [&builder](const auto& native_element) { return Fr::from_witness(&builder, native_element); }); - return elements_in_circuit; - }; - auto stdlib_f_commitments = commitments_to_witnesses(f_commitments); - auto stdlib_g_commitments = commitments_to_witnesses(g_commitments); - auto stdlib_v_evaluations = elements_to_witness(v_evaluations); - auto stdlib_w_evaluations = elements_to_witness(w_evaluations); + std::generate_n(std::back_inserter(u_challenge_in_circuit), CONST_PROOF_SIZE_LOG_N, [&] { + // We still need to do the same + Fr zero = Fr(0); + zero.convert_constant_to_fixed_witness(&builder); + if (u_iter < u_challenge.end()) { + return Fr::from_witness(&builder, *u_iter++); + } + return zero; + }); - std::vector u_challenge_in_circuit = elements_to_witness(u_challenge); + auto opening_claim = ShpleminiVerifier::compute_batch_opening_claim(Fr::from_witness(&builder, N), + RefVector(stdlib_f_commitments), + RefVector(stdlib_g_commitments), + RefVector(stdlib_v_evaluations), + RefVector(stdlib_w_evaluations), + u_challenge_in_circuit, + Commitment::one(&builder), + stdlib_verifier_transcript); + auto pairing_points = KZG::reduce_verify_batch_opening_claim(opening_claim, stdlib_verifier_transcript); + EXPECT_TRUE(CircuitChecker::check(builder)); - [[maybe_unused]] auto opening_claim = - ShpleminiVerifier::compute_batch_opening_claim(Fr::from_witness(&builder, N), - RefVector(stdlib_f_commitments), - RefVector(stdlib_g_commitments), - RefVector(stdlib_v_evaluations), - RefVector(stdlib_w_evaluations), - u_challenge_in_circuit, - Commitment::one(&builder), - stdlib_verifier_transcript); + auto vk = std::make_shared>(); + EXPECT_EQ(vk->pairing_check(pairing_points[0].get_value(), pairing_points[1].get_value()), true); + + // Return finalised number of gates; + return builder.num_gates; + }; - EXPECT_TRUE(CircuitChecker::check(builder)); + size_t num_gates_6 = run_shplemini(6); + size_t num_gates_13 = run_shplemini(13); + EXPECT_EQ(num_gates_6, num_gates_13); } diff --git a/barretenberg/cpp/src/barretenberg/common/op_count.hpp b/barretenberg/cpp/src/barretenberg/common/op_count.hpp index 8e4711d001a..af24ecb1e10 100644 --- a/barretenberg/cpp/src/barretenberg/common/op_count.hpp +++ b/barretenberg/cpp/src/barretenberg/common/op_count.hpp @@ -2,6 +2,7 @@ #pragma once #include +#include #ifndef BB_USE_OP_COUNT // require a semicolon to appease formatters // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) @@ -11,12 +12,19 @@ // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) #define BB_OP_COUNT_CYCLES_NAME(name) (void)0 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) -#define BB_OP_COUNT_TIME_NAME(name) (void)0 -// NOLINTNEXTLINE(cppcoreguidelines-macro-usage) #define BB_OP_COUNT_CYCLES() (void)0 +#ifndef TRACY_TIME +// NOLINTNEXTLINE(cppcoreguidelines-macro-usage) +#define BB_OP_COUNT_TIME_NAME(name) (void)0 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) #define BB_OP_COUNT_TIME() (void)0 #else +// NOLINTNEXTLINE(cppcoreguidelines-macro-usage) +#define BB_OP_COUNT_TIME_NAME(name) ZoneScopedN(name) +// NOLINTNEXTLINE(cppcoreguidelines-macro-usage) +#define BB_OP_COUNT_TIME() BB_OP_COUNT_TIME_NAME(__func__) +#endif +#else /** * Provides an abstraction that counts operations based on function names. * For efficiency, we spread out counts across threads. diff --git a/barretenberg/cpp/src/barretenberg/constants.hpp b/barretenberg/cpp/src/barretenberg/constants.hpp index 13adc7c74f7..578888a752b 100644 --- a/barretenberg/cpp/src/barretenberg/constants.hpp +++ b/barretenberg/cpp/src/barretenberg/constants.hpp @@ -10,4 +10,8 @@ static constexpr uint32_t CONST_PROOF_SIZE_LOG_N = 28; // to ensure a constant PG proof size and a PG recursive verifier circuit that is independent of the size of the // circuits being folded. static constexpr uint32_t CONST_PG_LOG_N = 20; + +static constexpr uint32_t MAX_LOOKUP_TABLES_SIZE = 70000; + +static constexpr uint32_t MAX_DATABUS_SIZE = 10; } // namespace bb \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/avm_recursion_constraint.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/avm_recursion_constraint.cpp index 68dcd61424b..f6224f8b398 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/avm_recursion_constraint.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/avm_recursion_constraint.cpp @@ -8,6 +8,8 @@ #include "barretenberg/stdlib_circuit_builders/ultra_flavor.hpp" #include "barretenberg/vm/avm/recursion/avm_recursive_flavor.hpp" #include "barretenberg/vm/avm/recursion/avm_recursive_verifier.hpp" +#include "barretenberg/vm/avm/trace/common.hpp" +#include "barretenberg/vm/avm/trace/helper.hpp" #include "barretenberg/vm/aztec_constants.hpp" #include "proof_surgeon.hpp" #include @@ -168,13 +170,28 @@ AggregationObjectIndices create_avm_recursion_constraints(Builder& builder, // proof with public inputs reinserted std::vector proof_indices = // ProofSurgeon::create_indices_for_reconstructed_proof(input.proof, input.public_inputs); - std::vector proof_fields; - proof_fields.reserve(input.proof.size()); - - for (const auto& idx : input.proof) { - auto field = field_ct::from_witness_index(&builder, idx); - proof_fields.emplace_back(field); - } + auto fields_from_witnesses = [&](std::vector const& input) { + std::vector result; + result.reserve(input.size()); + for (const auto& idx : input) { + auto field = field_ct::from_witness_index(&builder, idx); + result.emplace_back(field); + } + return result; + }; + + const auto proof_fields = fields_from_witnesses(input.proof); + const auto public_inputs_flattened = fields_from_witnesses(input.public_inputs); + + auto it = public_inputs_flattened.begin(); + avm_trace::VmPublicInputs vm_public_inputs = + avm_trace::convert_public_inputs(std::vector(it, it + PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH)); + it += PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH; + std::vector calldata(it, it + AVM_PUBLIC_COLUMN_MAX_SIZE); + it += AVM_PUBLIC_COLUMN_MAX_SIZE; + std::vector return_data(it, it + AVM_PUBLIC_COLUMN_MAX_SIZE); + + auto public_inputs_vectors = avm_trace::copy_public_inputs_columns(vm_public_inputs, calldata, return_data); // Populate the key fields and proof fields with dummy values to prevent issues (e.g. points must be on curve). if (!has_valid_witness_assignments) { @@ -186,7 +203,7 @@ AggregationObjectIndices create_avm_recursion_constraints(Builder& builder, RecursiveVerifier verifier(&builder, vkey); aggregation_state_ct input_agg_obj = bb::stdlib::recursion::convert_witness_indices_to_agg_obj( builder, input_aggregation_object_indices); - aggregation_state_ct output_agg_object = verifier.verify_proof(proof_fields, input_agg_obj); + aggregation_state_ct output_agg_object = verifier.verify_proof(proof_fields, public_inputs_vectors, input_agg_obj); // TODO(https://github.com/AztecProtocol/barretenberg/issues/996): investigate whether assert_equal on public // inputs is important, like what the plonk recursion constraint does. diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/avm_recursion_constraint.test.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/avm_recursion_constraint.test.cpp index 619a9810aa4..963e9e47d29 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/avm_recursion_constraint.test.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/avm_recursion_constraint.test.cpp @@ -13,7 +13,10 @@ #include "barretenberg/vm/avm/generated/prover.hpp" #include "barretenberg/vm/avm/generated/verifier.hpp" #include "barretenberg/vm/avm/tests/helpers.test.hpp" +#include "barretenberg/vm/avm/trace/helper.hpp" #include "barretenberg/vm/avm/trace/trace.hpp" +#include "barretenberg/vm/aztec_constants.hpp" +#include "barretenberg/vm/constants.hpp" #include "proof_surgeon.hpp" #include #include @@ -39,14 +42,9 @@ class AcirAvmRecursionConstraint : public ::testing::Test { static void SetUpTestSuite() { bb::srs::init_crs_factory("../srs_db/ignition"); } - static InnerBuilder create_inner_circuit() + static InnerBuilder create_inner_circuit(const std::vector& kernel_public_inputs_vec) { - VmPublicInputs public_inputs; - std::array kernel_inputs{}; - kernel_inputs.at(DA_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = 1000000; - kernel_inputs.at(L2_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = 1000000; - std::get<0>(public_inputs) = kernel_inputs; - + auto public_inputs = convert_public_inputs(kernel_public_inputs_vec); AvmTraceBuilder trace_builder(public_inputs); InnerBuilder builder; @@ -66,7 +64,8 @@ class AcirAvmRecursionConstraint : public ::testing::Test { /** * @brief Create a circuit that recursively verifies one or more inner avm circuits */ - static OuterBuilder create_outer_circuit(std::vector& inner_avm_circuits) + static OuterBuilder create_outer_circuit(std::vector& inner_avm_circuits, + const std::vector& kernel_public_inputs_vec) { std::vector avm_recursion_constraints; @@ -80,6 +79,9 @@ class AcirAvmRecursionConstraint : public ::testing::Test { std::vector key_witnesses = verifier.key->to_field_elements(); std::vector proof_witnesses = prover.construct_proof(); + std::vector public_inputs_vec(kernel_public_inputs_vec); + public_inputs_vec.resize(AVM_PUBLIC_INPUTS_FLATTENED_SIZE); + // Helper to append some values to the witness vector and return their corresponding indices auto add_to_witness_and_track_indices = [&witness](const std::vector& input) -> std::vector { @@ -96,7 +98,7 @@ class AcirAvmRecursionConstraint : public ::testing::Test { RecursionConstraint avm_recursion_constraint{ .key = add_to_witness_and_track_indices(key_witnesses), .proof = add_to_witness_and_track_indices(proof_witnesses), - .public_inputs = {}, + .public_inputs = add_to_witness_and_track_indices(public_inputs_vec), .key_hash = 0, // not used .proof_type = AVM, }; @@ -121,9 +123,14 @@ class AcirAvmRecursionConstraint : public ::testing::Test { TEST_F(AcirAvmRecursionConstraint, TestBasicSingleAvmRecursionConstraint) { + std::vector public_inputs_vec; + public_inputs_vec.resize(PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH); + public_inputs_vec.at(L2_START_GAS_LEFT_PCPI_OFFSET) = FF(1000000); + public_inputs_vec.at(DA_START_GAS_LEFT_PCPI_OFFSET) = FF(1000000); + std::vector layer_1_circuits; - layer_1_circuits.push_back(create_inner_circuit()); - auto layer_2_circuit = create_outer_circuit(layer_1_circuits); + layer_1_circuits.push_back(create_inner_circuit(public_inputs_vec)); + auto layer_2_circuit = create_outer_circuit(layer_1_circuits, public_inputs_vec); info("circuit gates = ", layer_2_circuit.get_num_gates()); diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.cpp index 28611d07622..0f6ca3d7b39 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.cpp @@ -94,7 +94,7 @@ void create_dummy_vkey_and_proof(Builder& builder, offset++; } - // first 7 commitments + // first 8 witness commitments for (size_t i = 0; i < Flavor::NUM_WITNESS_ENTITIES; i++) { auto comm = curve::BN254::AffineElement::one() * fr::random_element(); auto frs = field_conversion::convert_to_bn254_frs(comm); @@ -105,20 +105,20 @@ void create_dummy_vkey_and_proof(Builder& builder, offset += 4; } - // now the univariates, which can just be 0s (7*CONST_PROOF_SIZE_LOG_N Frs) + // now the univariates, which can just be 0s (8*CONST_PROOF_SIZE_LOG_N Frs, where 8 is the maximum relation degree) for (size_t i = 0; i < CONST_PROOF_SIZE_LOG_N * Flavor::BATCHED_RELATION_PARTIAL_LENGTH; i++) { builder.assert_equal(builder.add_variable(fr::random_element()), proof_fields[offset].witness_index); offset++; } - // now the sumcheck evaluations, which is just 43 0s + // now the sumcheck evaluations, which is just 44 0s for (size_t i = 0; i < Flavor::NUM_ALL_ENTITIES; i++) { builder.assert_equal(builder.add_variable(fr::random_element()), proof_fields[offset].witness_index); offset++; } - // now the zeromorph commitments, which are CONST_PROOF_SIZE_LOG_N comms - for (size_t i = 0; i < CONST_PROOF_SIZE_LOG_N; i++) { + // now the gemini fold commitments which are CONST_PROOF_SIZE_LOG_N - 1 + for (size_t i = 1; i < CONST_PROOF_SIZE_LOG_N; i++) { auto comm = curve::BN254::AffineElement::one() * fr::random_element(); auto frs = field_conversion::convert_to_bn254_frs(comm); builder.assert_equal(builder.add_variable(frs[0]), proof_fields[offset].witness_index); @@ -128,7 +128,13 @@ void create_dummy_vkey_and_proof(Builder& builder, offset += 4; } - // lastly the 2 commitments + // the gemini fold evaluations which are also CONST_PROOF_SIZE_LOG_N + for (size_t i = 1; i <= CONST_PROOF_SIZE_LOG_N; i++) { + builder.assert_equal(builder.add_variable(fr::random_element()), proof_fields[offset].witness_index); + offset++; + } + + // lastly the shplonk batched quotient commitment and kzg quotient commitment for (size_t i = 0; i < 2; i++) { auto comm = curve::BN254::AffineElement::one() * fr::random_element(); auto frs = field_conversion::convert_to_bn254_frs(comm); diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_flavor.hpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_flavor.hpp index b307ec7a4c9..f2af55e8d13 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_flavor.hpp @@ -937,13 +937,11 @@ class ECCVMFlavor { std::array sumcheck_evaluations; std::vector zm_cq_comms; Commitment zm_cq_comm; - Commitment translation_hack_comm; FF translation_eval_op; FF translation_eval_px; FF translation_eval_py; FF translation_eval_z1; FF translation_eval_z2; - FF hack_eval; Commitment shplonk_q_comm; uint32_t ipa_poly_degree; std::vector ipa_l_comms; @@ -1151,8 +1149,6 @@ class ECCVMFlavor { } zm_cq_comm = NativeTranscript::template deserialize_from_buffer(proof_data, num_frs_read); - translation_hack_comm = NativeTranscript::template deserialize_from_buffer( - NativeTranscript::proof_data, num_frs_read); translation_eval_op = NativeTranscript::template deserialize_from_buffer(NativeTranscript::proof_data, num_frs_read); translation_eval_px = @@ -1163,8 +1159,6 @@ class ECCVMFlavor { NativeTranscript::template deserialize_from_buffer(NativeTranscript::proof_data, num_frs_read); translation_eval_z2 = NativeTranscript::template deserialize_from_buffer(NativeTranscript::proof_data, num_frs_read); - hack_eval = - NativeTranscript::template deserialize_from_buffer(NativeTranscript::proof_data, num_frs_read); shplonk_q_comm = NativeTranscript::template deserialize_from_buffer(proof_data, num_frs_read); @@ -1297,13 +1291,11 @@ class ECCVMFlavor { } NativeTranscript::template serialize_to_buffer(zm_cq_comm, NativeTranscript::proof_data); - NativeTranscript::template serialize_to_buffer(translation_hack_comm, NativeTranscript::proof_data); NativeTranscript::template serialize_to_buffer(translation_eval_op, NativeTranscript::proof_data); NativeTranscript::template serialize_to_buffer(translation_eval_px, NativeTranscript::proof_data); NativeTranscript::template serialize_to_buffer(translation_eval_py, NativeTranscript::proof_data); NativeTranscript::template serialize_to_buffer(translation_eval_z1, NativeTranscript::proof_data); NativeTranscript::template serialize_to_buffer(translation_eval_z2, NativeTranscript::proof_data); - NativeTranscript::template serialize_to_buffer(hack_eval, NativeTranscript::proof_data); NativeTranscript::template serialize_to_buffer(shplonk_q_comm, NativeTranscript::proof_data); diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp index 76a64e54fd6..cdef38ee63f 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp @@ -129,16 +129,6 @@ void ECCVMProver::execute_pcs_rounds() commitment_key, transcript); - // Batch open the transcript polynomials as univariates for Translator consistency check. Since IPA cannot - // currently handle polynomials for which the latter half of the coefficients are 0, we hackily - // batch the constant polynomial 1 in with the 5 transcript polynomials. - // TODO(https://github.com/AztecProtocol/barretenberg/issues/768): fix IPA to avoid the need for the hack polynomial - Polynomial hack(key->circuit_size); - for (size_t idx = 0; idx < key->circuit_size; idx++) { - hack.at(idx) = 1; - } - transcript->send_to_verifier("Translation:hack_commitment", commitment_key->commit(hack)); - // Get the challenge at which we evaluate all transcript polynomials as univariates evaluation_challenge_x = transcript->template get_challenge("Translation:evaluation_challenge_x"); @@ -156,20 +146,20 @@ void ECCVMProver::execute_pcs_rounds() transcript->send_to_verifier("Translation:z1", translation_evaluations.z1); transcript->send_to_verifier("Translation:z2", translation_evaluations.z2); - FF hack_evaluation = hack.evaluate(evaluation_challenge_x); - transcript->send_to_verifier("Translation:hack_evaluation", hack_evaluation); - // Get another challenge for batching the univariates and evaluations FF ipa_batching_challenge = transcript->template get_challenge("Translation:ipa_batching_challenge"); // Collect the polynomials and evaluations to be batched - RefArray univariate_polynomials{ key->polynomials.transcript_op, key->polynomials.transcript_Px, - key->polynomials.transcript_Py, key->polynomials.transcript_z1, - key->polynomials.transcript_z2, hack }; - std::array univariate_evaluations{ - translation_evaluations.op, translation_evaluations.Px, translation_evaluations.Py, - translation_evaluations.z1, translation_evaluations.z2, hack_evaluation - }; + RefArray univariate_polynomials{ key->polynomials.transcript_op, + key->polynomials.transcript_Px, + key->polynomials.transcript_Py, + key->polynomials.transcript_z1, + key->polynomials.transcript_z2 }; + std::array univariate_evaluations{ translation_evaluations.op, + translation_evaluations.Px, + translation_evaluations.Py, + translation_evaluations.z1, + translation_evaluations.z2 }; // Construct the batched polynomial and batched evaluation to produce the batched opening claim Polynomial batched_univariate{ key->circuit_size }; diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_transcript.test.cpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_transcript.test.cpp index 3f06d27aed1..9fb878c044c 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_transcript.test.cpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_transcript.test.cpp @@ -162,7 +162,6 @@ class ECCVMTranscriptTests : public ::testing::Test { manifest_expected.add_challenge(round, "ZM:x", "ZM:z"); round++; - manifest_expected.add_entry(round, "Translation:hack_commitment", frs_per_G); manifest_expected.add_challenge(round, "Translation:evaluation_challenge_x"); round++; @@ -171,7 +170,6 @@ class ECCVMTranscriptTests : public ::testing::Test { manifest_expected.add_entry(round, "Translation:Py", frs_per_Fr); manifest_expected.add_entry(round, "Translation:z1", frs_per_Fr); manifest_expected.add_entry(round, "Translation:z2", frs_per_Fr); - manifest_expected.add_entry(round, "Translation:hack_evaluation", frs_per_Fr); manifest_expected.add_challenge(round, "Translation:ipa_batching_challenge"); round++; diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_verifier.cpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_verifier.cpp index 26bd5ac6ce6..c7bbd7ec456 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_verifier.cpp @@ -69,35 +69,33 @@ bool ECCVMVerifier::verify_proof(const HonkProof& proof) multivariate_challenge, key->pcs_verification_key->get_g1_identity(), transcript); - // Execute transcript consistency univariate opening round - auto hack_commitment = transcript->template receive_from_prover("Translation:hack_commitment"); - FF evaluation_challenge_x = transcript->template get_challenge("Translation:evaluation_challenge_x"); + const FF evaluation_challenge_x = transcript->template get_challenge("Translation:evaluation_challenge_x"); // Construct arrays of commitments and evaluations to be batched, the evaluations being received from the prover - const size_t NUM_UNIVARIATES = 6; - std::array transcript_commitments = { - commitments.transcript_op, commitments.transcript_Px, commitments.transcript_Py, - commitments.transcript_z1, commitments.transcript_z2, hack_commitment - }; + const size_t NUM_UNIVARIATES = 5; + std::array transcript_commitments = { commitments.transcript_op, + commitments.transcript_Px, + commitments.transcript_Py, + commitments.transcript_z1, + commitments.transcript_z2 }; std::array transcript_evaluations = { transcript->template receive_from_prover("Translation:op"), transcript->template receive_from_prover("Translation:Px"), transcript->template receive_from_prover("Translation:Py"), transcript->template receive_from_prover("Translation:z1"), - transcript->template receive_from_prover("Translation:z2"), - transcript->template receive_from_prover("Translation:hack_evaluation") + transcript->template receive_from_prover("Translation:z2") }; // Get the batching challenge for commitments and evaluations - FF ipa_batching_challenge = transcript->template get_challenge("Translation:ipa_batching_challenge"); + const FF ipa_batching_challenge = transcript->template get_challenge("Translation:ipa_batching_challenge"); // Compute the batched commitment and batched evaluation for the univariate opening claim - auto batched_commitment = transcript_commitments[0]; - auto batched_transcript_eval = transcript_evaluations[0]; - auto batching_scalar = ipa_batching_challenge; - for (size_t idx = 1; idx < transcript_commitments.size(); ++idx) { + Commitment batched_commitment = transcript_commitments[0]; + FF batched_transcript_eval = transcript_evaluations[0]; + FF batching_scalar = ipa_batching_challenge; + for (size_t idx = 1; idx < NUM_UNIVARIATES; ++idx) { batched_commitment = batched_commitment + transcript_commitments[idx] * batching_scalar; batched_transcript_eval += batching_scalar * transcript_evaluations[idx]; batching_scalar *= ipa_batching_challenge; diff --git a/barretenberg/cpp/src/barretenberg/execution_trace/execution_trace.cpp b/barretenberg/cpp/src/barretenberg/execution_trace/execution_trace.cpp index 70146181fcc..82e9def06ae 100644 --- a/barretenberg/cpp/src/barretenberg/execution_trace/execution_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/execution_trace/execution_trace.cpp @@ -6,10 +6,33 @@ #include "barretenberg/stdlib_circuit_builders/ultra_keccak_flavor.hpp" namespace bb { +template void ExecutionTrace_::populate_public_inputs_block(Builder& builder) +{ +#ifdef TRACY_MEMORY + ZoneScopedN("populate_public_inputs_block"); +#endif + // Update the public inputs block + for (const auto& idx : builder.public_inputs) { + for (size_t wire_idx = 0; wire_idx < NUM_WIRES; ++wire_idx) { + if (wire_idx < 2) { // first two wires get a copy of the public inputs + builder.blocks.pub_inputs.wires[wire_idx].emplace_back(idx); + } else { // the remaining wires get zeros + builder.blocks.pub_inputs.wires[wire_idx].emplace_back(builder.zero_idx); + } + } + for (auto& selector : builder.blocks.pub_inputs.selectors) { + selector.emplace_back(0); + } + } +} + template void ExecutionTrace_::populate(Builder& builder, typename Flavor::ProvingKey& proving_key, bool is_structured) { + +#ifdef TRACY_MEMORY ZoneScopedN("trace populate"); +#endif // Share wire polynomials, selector polynomials between proving key and builder and copy cycles from raw circuit // data auto trace_data = construct_trace_data(builder, proving_key, is_structured); @@ -18,18 +41,27 @@ void ExecutionTrace_::populate(Builder& builder, typename Flavor::Provin proving_key.pub_inputs_offset = trace_data.pub_inputs_offset; } if constexpr (IsUltraPlonkOrHonk) { + +#ifdef TRACY_MEMORY ZoneScopedN("add_memory_records_to_proving_key"); +#endif add_memory_records_to_proving_key(trace_data, builder, proving_key); } if constexpr (IsGoblinFlavor) { + +#ifdef TRACY_MEMORY ZoneScopedN("add_ecc_op_wires_to_proving_key"); +#endif add_ecc_op_wires_to_proving_key(builder, proving_key); } // Compute the permutation argument polynomials (sigma/id) and add them to proving key { + +#ifdef TRACY_MEMORY ZoneScopedN("compute_permutation_argument_polynomials"); +#endif compute_permutation_argument_polynomials(builder, &proving_key, trace_data.copy_cycles); } } @@ -55,11 +87,17 @@ template typename ExecutionTrace_::TraceData ExecutionTrace_::construct_trace_data( Builder& builder, typename Flavor::ProvingKey& proving_key, bool is_structured) { + +#ifdef TRACY_MEMORY ZoneScopedN("construct_trace_data"); - TraceData trace_data{ builder, proving_key }; +#endif - // Complete the public inputs execution trace block from builder.public_inputs - populate_public_inputs_block(builder); + if constexpr (IsPlonkFlavor) { + // Complete the public inputs execution trace block from builder.public_inputs + populate_public_inputs_block(builder); + } + + TraceData trace_data{ builder, proving_key }; uint32_t offset = Flavor::has_zero_row ? 1 : 0; // Offset at which to place each block in the trace polynomials // For each block in the trace, populate wire polys, copy cycles and selector polys @@ -70,7 +108,10 @@ typename ExecutionTrace_::TraceData ExecutionTrace_::construct_t // Update wire polynomials and copy cycles // NB: The order of row/column loops is arbitrary but needs to be row/column to match old copy_cycle code { + +#ifdef TRACY_MEMORY ZoneScopedN("populating wires and copy_cycles"); +#endif for (uint32_t block_row_idx = 0; block_row_idx < block_size; ++block_row_idx) { for (uint32_t wire_idx = 0; wire_idx < NUM_WIRES; ++wire_idx) { uint32_t var_idx = block.wires[wire_idx][block_row_idx]; // an index into the variables array @@ -87,8 +128,7 @@ typename ExecutionTrace_::TraceData ExecutionTrace_::construct_t // Insert the selector values for this block into the selector polynomials at the correct offset // TODO(https://github.com/AztecProtocol/barretenberg/issues/398): implicit arithmetization/flavor consistency for (size_t selector_idx = 0; selector_idx < NUM_SELECTORS; selector_idx++) { - auto selector_poly = trace_data.selectors[selector_idx]; - auto selector = block.selectors[selector_idx]; + auto& selector = block.selectors[selector_idx]; for (size_t row_idx = 0; row_idx < block_size; ++row_idx) { size_t trace_row_idx = row_idx + offset; trace_data.selectors[selector_idx].set_if_valid_index(trace_row_idx, selector[row_idx]); @@ -111,35 +151,19 @@ typename ExecutionTrace_::TraceData ExecutionTrace_::construct_t return trace_data; } -template void ExecutionTrace_::populate_public_inputs_block(Builder& builder) -{ - ZoneScopedN("populate_public_inputs_block"); - // Update the public inputs block - for (auto& idx : builder.public_inputs) { - for (size_t wire_idx = 0; wire_idx < NUM_WIRES; ++wire_idx) { - if (wire_idx < 2) { // first two wires get a copy of the public inputs - builder.blocks.pub_inputs.wires[wire_idx].emplace_back(idx); - } else { // the remaining wires get zeros - builder.blocks.pub_inputs.wires[wire_idx].emplace_back(builder.zero_idx); - } - } - for (auto& selector : builder.blocks.pub_inputs.selectors) { - selector.emplace_back(0); - } - } -} - template void ExecutionTrace_::add_ecc_op_wires_to_proving_key(Builder& builder, typename Flavor::ProvingKey& proving_key) requires IsGoblinFlavor { - // Copy the ecc op data from the conventional wires into the op wires over the range of ecc op gates auto& ecc_op_selector = proving_key.polynomials.lagrange_ecc_op; const size_t op_wire_offset = Flavor::has_zero_row ? 1 : 0; + + // Copy the ecc op data from the conventional wires into the op wires over the range of ecc op gates + const size_t num_ecc_ops = builder.blocks.ecc_op.size(); for (auto [ecc_op_wire, wire] : zip_view(proving_key.polynomials.get_ecc_op_wires(), proving_key.polynomials.get_wires())) { - for (size_t i = 0; i < builder.blocks.ecc_op.size(); ++i) { + for (size_t i = 0; i < num_ecc_ops; ++i) { size_t idx = i + op_wire_offset; ecc_op_wire.at(idx) = wire[idx]; ecc_op_selector.at(idx) = 1; // construct selector as the indicator on the ecc op block diff --git a/barretenberg/cpp/src/barretenberg/execution_trace/execution_trace.hpp b/barretenberg/cpp/src/barretenberg/execution_trace/execution_trace.hpp index 502ab6d2689..045c41b56a7 100644 --- a/barretenberg/cpp/src/barretenberg/execution_trace/execution_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/execution_trace/execution_trace.hpp @@ -28,7 +28,10 @@ template class ExecutionTrace_ { TraceData(Builder& builder, ProvingKey& proving_key) { + +#ifdef TRACY_MEMORY ZoneScopedN("TraceData constructor"); +#endif if constexpr (IsHonkFlavor) { // Initialize and share the wire and selector polynomials for (auto [wire, other_wire] : zip_view(wires, proving_key.polynomials.get_wires())) { @@ -37,7 +40,6 @@ template class ExecutionTrace_ { for (auto [selector, other_selector] : zip_view(selectors, proving_key.polynomials.get_selectors())) { selector = other_selector.share(); } - proving_key.polynomials.set_shifted(); // Ensure shifted wires are set correctly } else { // Initialize and share the wire and selector polynomials for (size_t idx = 0; idx < NUM_WIRES; ++idx) { @@ -46,7 +48,10 @@ template class ExecutionTrace_ { proving_key.polynomial_store.put(wire_tag, wires[idx].share()); } { + +#ifdef TRACY_MEMORY ZoneScopedN("selector initialization"); +#endif for (size_t idx = 0; idx < Builder::Arithmetization::NUM_SELECTORS; ++idx) { selectors[idx] = Polynomial(proving_key.circuit_size); std::string selector_tag = builder.selector_names[idx] + "_lagrange"; @@ -55,7 +60,10 @@ template class ExecutionTrace_ { } } { + +#ifdef TRACY_MEMORY ZoneScopedN("copy cycle initialization"); +#endif copy_cycles.resize(builder.variables.size()); } } @@ -74,6 +82,14 @@ template class ExecutionTrace_ { */ static void populate(Builder& builder, ProvingKey&, bool is_structured = false); + /** + * @brief Populate the public inputs block + * @details The first two wires are a copy of the public inputs and the other wires and all selectors are zero + * + * @param circuit + */ + static void populate_public_inputs_block(Builder& builder); + private: /** * @brief Add the memory records indicating which rows correspond to RAM/ROM reads/writes @@ -104,14 +120,6 @@ template class ExecutionTrace_ { typename Flavor::ProvingKey& proving_key, bool is_structured = false); - /** - * @brief Populate the public inputs block - * @details The first two wires are a copy of the public inputs and the other wires and all selectors are zero - * - * @param builder - */ - static void populate_public_inputs_block(Builder& builder); - /** * @brief Construct and add the goblin ecc op wires to the proving key * @details The ecc op wires vanish everywhere except on the ecc op block, where they contain a copy of the ecc op diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp index e9cb9dbb63a..69433b0c865 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp @@ -129,7 +129,10 @@ template class ProvingKey_ { std::shared_ptr commitment_key = nullptr) { if (commitment_key == nullptr) { + +#ifdef TRACY_MEMORY ZoneScopedN("init commitment key"); +#endif this->commitment_key = std::make_shared(circuit_size); } else { // Don't create another commitment key if we already have one @@ -374,6 +377,9 @@ concept IsGoblinFlavor = IsAnyOf, MegaRecursiveFlavor_, MegaRecursiveFlavor_>; +template +concept HasDataBus = IsGoblinFlavor; + template concept IsRecursiveFlavor = IsAnyOf, UltraRecursiveFlavor_, diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.test.cpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.test.cpp index 7f231880626..e5ee7c6259c 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.test.cpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.test.cpp @@ -17,7 +17,7 @@ TEST(Flavor, Getters) // set size_t coset_idx = 0; for (auto& id_poly : proving_key.polynomials.get_ids()) { - typename Flavor::Polynomial new_poly(proving_key.circuit_size); + id_poly = typename Flavor::Polynomial(proving_key.circuit_size); for (size_t i = 0; i < proving_key.circuit_size; ++i) { id_poly.at(i) = coset_idx * proving_key.circuit_size + i; } diff --git a/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp b/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp index 134db00a929..4ef27dbcd9c 100644 --- a/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp +++ b/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp @@ -171,17 +171,26 @@ class GoblinProver { void prove_eccvm() { { + +#ifdef TRACY_MEMORY ZoneScopedN("Create ECCVMBuilder and ECCVMProver"); +#endif auto eccvm_builder = std::make_unique(op_queue); eccvm_prover = std::make_unique(*eccvm_builder); } { + +#ifdef TRACY_MEMORY ZoneScopedN("Construct ECCVM Proof"); +#endif goblin_proof.eccvm_proof = eccvm_prover->construct_proof(); } { + +#ifdef TRACY_MEMORY ZoneScopedN("Assign Translation Evaluations"); +#endif goblin_proof.translation_evaluations = eccvm_prover->translation_evaluations; } } @@ -198,14 +207,20 @@ class GoblinProver { eccvm_key = eccvm_prover->key; eccvm_prover = nullptr; { + +#ifdef TRACY_MEMORY ZoneScopedN("Create TranslatorBuilder and TranslatorProver"); +#endif auto translator_builder = std::make_unique(translation_batching_challenge_v, evaluation_challenge_x, op_queue); translator_prover = std::make_unique(*translator_builder, transcript); } { + +#ifdef TRACY_MEMORY ZoneScopedN("Construct Translator Proof"); +#endif goblin_proof.translator_proof = translator_prover->construct_proof(); } } @@ -219,14 +234,23 @@ class GoblinProver { */ GoblinProof prove(MergeProof merge_proof_in = {}) { + +#ifdef TRACY_MEMORY ZoneScopedN("Goblin::prove"); +#endif goblin_proof.merge_proof = merge_proof_in.empty() ? std::move(merge_proof) : std::move(merge_proof_in); { + +#ifdef TRACY_MEMORY ZoneScopedN("prove_eccvm"); +#endif prove_eccvm(); } { + +#ifdef TRACY_MEMORY ZoneScopedN("prove_translator"); +#endif prove_translator(); } return goblin_proof; diff --git a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/arithmetization.hpp b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/arithmetization.hpp index d5f637de877..b5408341edb 100644 --- a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/arithmetization.hpp @@ -67,8 +67,7 @@ template class ExecutionTr Selectors selectors; bool has_ram_rom = false; // does the block contain RAM/ROM gates bool is_pub_inputs = false; // is this the public inputs block - - uint32_t fixed_size = 0; // Fixed size for use in structured trace + uint32_t trace_offset = 0; // where this block starts in the trace bool operator==(const ExecutionTraceBlock& other) const = default; @@ -104,6 +103,8 @@ template class ExecutionTr } } #endif + private: + uint32_t fixed_size = 0; // Fixed size for use in structured trace }; } // namespace bb \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/mega_arithmetization.hpp b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/mega_arithmetization.hpp index cd4f374c2b8..9f38f2a4bba 100644 --- a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/mega_arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/mega_arithmetization.hpp @@ -38,6 +38,12 @@ template class MegaArith { aux, lookup, busread, poseidon2_external, poseidon2_internal }; } + auto get_gate_blocks() + { + return RefArray{ arithmetic, delta_range, elliptic, aux, + lookup, busread, poseidon2_external, poseidon2_internal }; + } + bool operator==(const MegaTraceBlocks& other) const = default; }; @@ -153,7 +159,11 @@ template class MegaArith { struct TraceBlocks : public MegaTraceBlocks { - E2eStructuredBlockSizes fixed_block_sizes; + TraceBlocks() + { + this->aux.has_ram_rom = true; + this->pub_inputs.is_pub_inputs = true; + } // Set fixed block sizes for use in structured trace void set_fixed_block_sizes(TraceStructure setting) @@ -178,10 +188,13 @@ template class MegaArith { } } - TraceBlocks() + void compute_offsets(bool is_structured) { - this->aux.has_ram_rom = true; - this->pub_inputs.is_pub_inputs = true; + uint32_t offset = 1; // start at 1 because the 0th row is unused for selectors for Honk + for (auto& block : this->get()) { + block.trace_offset = offset; + offset += block.get_fixed_size(is_structured); + } } void summarize() const diff --git a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/ultra_arithmetization.hpp b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/ultra_arithmetization.hpp index c5466d4eac0..be1e47fac17 100644 --- a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/ultra_arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/ultra_arithmetization.hpp @@ -30,6 +30,11 @@ template class UltraArith { aux, lookup, poseidon2_external, poseidon2_internal }; } + auto get_gate_blocks() + { + return RefArray{ arithmetic, delta_range, elliptic, aux, lookup, poseidon2_external, poseidon2_internal }; + } + bool operator==(const UltraTraceBlocks& other) const = default; }; @@ -90,6 +95,12 @@ template class UltraArith { struct TraceBlocks : public UltraTraceBlocks { + TraceBlocks() + { + this->aux.has_ram_rom = true; + this->pub_inputs.is_pub_inputs = true; + } + // Set fixed block sizes for use in structured trace void set_fixed_block_sizes(TraceStructure setting) { @@ -110,10 +121,13 @@ template class UltraArith { } } - TraceBlocks() + void compute_offsets(bool is_structured) { - this->aux.has_ram_rom = true; - this->pub_inputs.is_pub_inputs = true; + uint32_t offset = 1; // start at 1 because the 0th row is unused for selectors for Honk + for (auto& block : this->get()) { + block.trace_offset = offset; + offset += block.get_fixed_size(is_structured); + } } auto get() @@ -137,7 +151,7 @@ template class UltraArith { size_t get_total_structured_size() { - size_t total_size = 0; + size_t total_size = 1; // start at 1 because the 0th row is unused for selectors for Honk for (auto block : this->get()) { total_size += block.get_fixed_size(); } diff --git a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/composer_lib.hpp b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/composer_lib.hpp index 35c2a5ec02a..1216623ee32 100644 --- a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/composer_lib.hpp +++ b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/composer_lib.hpp @@ -11,8 +11,8 @@ namespace bb { template void construct_lookup_table_polynomials(const RefArray& table_polynomials, const typename Flavor::CircuitBuilder& circuit, - size_t dyadic_circuit_size, - size_t additional_offset = 0) + const size_t dyadic_circuit_size, + const size_t additional_offset = 0) { // Create lookup selector polynomials which interpolate each table column. // Our selector polys always need to interpolate the full subgroup size, so here we offset so as to @@ -22,8 +22,9 @@ void construct_lookup_table_polynomials(const RefArray circuit.get_tables_size() + additional_offset); - size_t offset = dyadic_circuit_size - circuit.get_tables_size() - additional_offset; + const size_t tables_size = circuit.get_tables_size(); + ASSERT(dyadic_circuit_size > tables_size + additional_offset); + size_t offset = dyadic_circuit_size - tables_size - additional_offset; for (const auto& table : circuit.lookup_tables) { const fr table_index(table.table_index); @@ -49,12 +50,12 @@ template void construct_lookup_read_counts(typename Flavor::Polynomial& read_counts, typename Flavor::Polynomial& read_tags, typename Flavor::CircuitBuilder& circuit, - size_t dyadic_circuit_size) + const size_t dyadic_circuit_size) { + const size_t tables_size = circuit.get_tables_size(); // TODO(https://github.com/AztecProtocol/barretenberg/issues/1033): construct tables and counts at top of trace - size_t offset = dyadic_circuit_size - circuit.get_tables_size(); + size_t table_offset = dyadic_circuit_size - tables_size; - size_t table_offset = offset; // offset of the present table in the table polynomials // loop over all tables used in the circuit; each table contains data about the lookups made on it for (auto& table : circuit.lookup_tables) { table.initialize_index_map(); diff --git a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/permutation_lib.hpp b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/permutation_lib.hpp index 1590a4d5763..3a87d0efdab 100644 --- a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/permutation_lib.hpp +++ b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/permutation_lib.hpp @@ -62,7 +62,10 @@ template struct PermutationMapping { */ PermutationMapping(size_t circuit_size) { + +#ifdef TRACY_MEMORY ZoneScopedN("PermutationMapping constructor"); +#endif for (uint8_t col_idx = 0; col_idx < NUM_WIRES; ++col_idx) { sigmas[col_idx].reserve(circuit_size); if constexpr (generalized) { @@ -386,12 +389,18 @@ void compute_permutation_argument_polynomials(const typename Flavor::CircuitBuil } else if constexpr (IsUltraFlavor) { // any UltraHonk flavor // Compute Honk-style sigma and ID polynomials from the corresponding mappings { + +#ifdef TRACY_MEMORY ZoneScopedN("compute_honk_style_permutation_lagrange_polynomials_from_mapping"); +#endif compute_honk_style_permutation_lagrange_polynomials_from_mapping( key->polynomials.get_sigmas(), mapping.sigmas, key); } { + +#ifdef TRACY_MEMORY ZoneScopedN("compute_honk_style_permutation_lagrange_polynomials_from_mapping"); +#endif compute_honk_style_permutation_lagrange_polynomials_from_mapping( key->polynomials.get_ids(), mapping.ids, key); } diff --git a/barretenberg/cpp/src/barretenberg/polynomials/barycentric.test.cpp b/barretenberg/cpp/src/barretenberg/polynomials/barycentric.test.cpp index a481f9fc64e..2f708175430 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/barycentric.test.cpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/barycentric.test.cpp @@ -36,6 +36,18 @@ TYPED_TEST(BarycentricDataTests, Extend) EXPECT_EQ(result, expected_result); } +TYPED_TEST(BarycentricDataTests, SelfExtend) +{ + BARYCENTIC_DATA_TESTS_TYPE_ALIASES + static constexpr size_t initial_size(2); + static constexpr size_t domain_size(10); + static constexpr size_t skip_count(0); + auto f = Univariate({ 1, 2, 0, 0, 0, 0, 0, 0, 0, 0 }); + auto expected_result = Univariate({ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); + f.template self_extend_from(); + EXPECT_EQ(f, expected_result); +} + TYPED_TEST(BarycentricDataTests, Evaluate) { BARYCENTIC_DATA_TESTS_TYPE_ALIASES diff --git a/barretenberg/cpp/src/barretenberg/polynomials/legacy_polynomial.cpp b/barretenberg/cpp/src/barretenberg/polynomials/legacy_polynomial.cpp index 717a10e44eb..0f670119311 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/legacy_polynomial.cpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/legacy_polynomial.cpp @@ -15,13 +15,6 @@ namespace bb { -// NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays) -template std::shared_ptr _allocate_aligned_memory(const size_t n_elements) -{ - // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays) - return std::static_pointer_cast(get_mem_slab(sizeof(Fr) * n_elements)); -} - template void LegacyPolynomial::allocate_backing_memory(size_t n_elements) { size_ = n_elements; diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp index 846487bd2a7..292cf11bbd7 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp @@ -18,13 +18,6 @@ namespace bb { -// NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays) -template std::shared_ptr _allocate_aligned_memory(size_t n_elements) -{ - // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays) - return std::static_pointer_cast(get_mem_slab(sizeof(Fr) * n_elements)); -} - // Note: This function is pretty gnarly, but we try to make it the only function that deals // with copying polynomials. It should be scrutinized thusly. template @@ -49,6 +42,7 @@ SharedShiftedVirtualZeroesArray _clone(const SharedShiftedVirtualZeroesArray template void Polynomial::allocate_backing_memory(size_t size, size_t virtual_size, size_t start_index) { + ASSERT(start_index + size <= virtual_size); coefficients_ = SharedShiftedVirtualZeroesArray{ start_index, /* start index, used for shifted polynomials and offset 'islands' of non-zeroes */ size + start_index, /* end index, actual memory used is (end - start) */ @@ -159,7 +153,6 @@ template bool Polynomial::operator==(Polynomial const& rhs) co template Polynomial& Polynomial::operator+=(PolynomialSpan other) { - // Compute the subset that is defined in both polynomials ASSERT(start_index() <= other.start_index); ASSERT(end_index() >= other.end_index()); size_t num_threads = calculate_num_threads(other.size()); @@ -187,58 +180,7 @@ template Fr Polynomial::evaluate(const Fr& z) const template Fr Polynomial::evaluate_mle(std::span evaluation_points, bool shift) const { - if (size() == 0) { - return Fr(0); - } - - const size_t n = evaluation_points.size(); - const size_t dim = numeric::get_msb(end_index() - 1) + 1; // Round up to next power of 2 - - // To simplify handling of edge cases, we assume that the index space is always a power of 2 - ASSERT(virtual_size() == static_cast(1 << n)); - - // We first fold over dim rounds l = 0,...,dim-1. - // in round l, n_l is the size of the buffer containing the Polynomial partially evaluated - // at u₀,..., u_l. - // In round 0, this is half the size of dim - size_t n_l = 1 << (dim - 1); - - // temporary buffer of half the size of the Polynomial - // TODO(https://github.com/AztecProtocol/barretenberg/issues/1096): Make this a Polynomial with DontZeroMemory::FLAG - auto tmp_ptr = _allocate_aligned_memory(sizeof(Fr) * n_l); - auto tmp = tmp_ptr.get(); - - size_t offset = 0; - if (shift) { - ASSERT((*this)[0] == Fr::zero()); - offset++; - } - - Fr u_l = evaluation_points[0]; - for (size_t i = 0; i < n_l; ++i) { - // curr[i] = (Fr(1) - u_l) * prev[i * 2] + u_l * prev[(i * 2) + 1]; - // Note: i * 2 + 1 + offset might equal virtual_size. This used to subtlely be handled by extra capacity padding - // (and there used to be no assert time checks, which this constant helps with). - const size_t ALLOW_ONE_PAST_READ = 1; - tmp[i] = get(i * 2 + offset) + u_l * (get(i * 2 + 1 + offset, ALLOW_ONE_PAST_READ) - get(i * 2 + offset)); - } - - // partially evaluate the dim-1 remaining points - for (size_t l = 1; l < dim; ++l) { - n_l = 1 << (dim - l - 1); - u_l = evaluation_points[l]; - for (size_t i = 0; i < n_l; ++i) { - tmp[i] = tmp[i * 2] + u_l * (tmp[(i * 2) + 1] - tmp[i * 2]); - } - } - auto result = tmp[0]; - - // We handle the "trivial" dimensions which are full of zeros. - for (size_t i = dim; i < n; i++) { - result *= (Fr(1) - evaluation_points[i]); - } - - return result; + return _evaluate_mle(evaluation_points, coefficients_, shift); } template Polynomial Polynomial::partial_evaluate_mle(std::span evaluation_points) const @@ -300,15 +242,14 @@ Fr Polynomial::compute_barycentric_evaluation(const Fr& z, const EvaluationD template Polynomial& Polynomial::operator-=(PolynomialSpan other) { - // Compute the subset that is defined in both polynomials ASSERT(start_index() <= other.start_index); ASSERT(end_index() >= other.end_index()); - size_t num_threads = calculate_num_threads(other.size()); - size_t range_per_thread = other.size() / num_threads; - size_t leftovers = other.size() - (range_per_thread * num_threads); + const size_t num_threads = calculate_num_threads(other.size()); + const size_t range_per_thread = other.size() / num_threads; + const size_t leftovers = other.size() - (range_per_thread * num_threads); parallel_for(num_threads, [&](size_t j) { - size_t offset = j * range_per_thread + other.start_index; - size_t end = (j == num_threads - 1) ? offset + range_per_thread + leftovers : offset + range_per_thread; + const size_t offset = j * range_per_thread + other.start_index; + const size_t end = (j == num_threads - 1) ? offset + range_per_thread + leftovers : offset + range_per_thread; for (size_t i = offset; i < end; ++i) { at(i) -= other[i]; } @@ -318,12 +259,12 @@ template Polynomial& Polynomial::operator-=(PolynomialSpan template Polynomial& Polynomial::operator*=(const Fr scaling_factor) { - size_t num_threads = calculate_num_threads(size()); - size_t range_per_thread = size() / num_threads; - size_t leftovers = size() - (range_per_thread * num_threads); + const size_t num_threads = calculate_num_threads(size()); + const size_t range_per_thread = size() / num_threads; + const size_t leftovers = size() - (range_per_thread * num_threads); parallel_for(num_threads, [&](size_t j) { - size_t offset = j * range_per_thread; - size_t end = (j == num_threads - 1) ? offset + range_per_thread + leftovers : offset + range_per_thread; + const size_t offset = j * range_per_thread; + const size_t end = (j == num_threads - 1) ? offset + range_per_thread + leftovers : offset + range_per_thread; for (size_t i = offset; i < end; ++i) { data()[i] *= scaling_factor; } @@ -332,6 +273,23 @@ template Polynomial& Polynomial::operator*=(const Fr scali return *this; } +// TODO(https://github.com/AztecProtocol/barretenberg/issues/1113): Optimizing based on actual sizes would involve using +// expand, but it is currently unused. +template +Polynomial Polynomial::expand(const size_t new_start_index, const size_t new_end_index) const +{ + ASSERT(new_end_index <= virtual_size()); + ASSERT(new_start_index <= start_index()); + ASSERT(new_end_index >= end_index()); + if (new_start_index == start_index() && new_end_index == end_index()) { + return *this; + } + Polynomial result = *this; + // Make new_start_index..new_end_index usable + result.coefficients_ = _clone(coefficients_, new_end_index - end_index(), start_index() - new_start_index); + return result; +} + template Polynomial Polynomial::full() const { Polynomial result = *this; @@ -339,17 +297,17 @@ template Polynomial Polynomial::full() const result.coefficients_ = _clone(coefficients_, virtual_size() - end_index(), start_index()); return result; } + template void Polynomial::add_scaled(PolynomialSpan other, Fr scaling_factor) & { - // Compute the subset that is defined in both polynomials ASSERT(start_index() <= other.start_index); ASSERT(end_index() >= other.end_index()); - size_t num_threads = calculate_num_threads(other.size()); - size_t range_per_thread = other.size() / num_threads; - size_t leftovers = other.size() - (range_per_thread * num_threads); + const size_t num_threads = calculate_num_threads(other.size()); + const size_t range_per_thread = other.size() / num_threads; + const size_t leftovers = other.size() - (range_per_thread * num_threads); parallel_for(num_threads, [&](size_t j) { - size_t offset = j * range_per_thread + other.start_index; - size_t end = (j == num_threads - 1) ? offset + range_per_thread + leftovers : offset + range_per_thread; + const size_t offset = j * range_per_thread + other.start_index; + const size_t end = (j == num_threads - 1) ? offset + range_per_thread + leftovers : offset + range_per_thread; for (size_t i = offset; i < end; ++i) { at(i) += scaling_factor * other[i]; } @@ -368,5 +326,4 @@ template Polynomial Polynomial::shifted() const template class Polynomial; template class Polynomial; - } // namespace bb \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp index 55b03b533c7..ec9c14d4084 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp @@ -3,13 +3,13 @@ #include "barretenberg/common/zip_view.hpp" #include "barretenberg/crypto/sha256/sha256.hpp" #include "barretenberg/ecc/curves/grumpkin/grumpkin.hpp" +#include "barretenberg/plonk_honk_shared/types/circuit_type.hpp" #include "barretenberg/polynomials/shared_shifted_virtual_zeroes_array.hpp" #include "evaluation_domain.hpp" #include "polynomial_arithmetic.hpp" #include #include #include - namespace bb { /* Span class with a start index offset. @@ -259,6 +259,14 @@ template class Polynomial { return p; } + /** + * @brief Expands the polynomial with new start_index and end_index + * The value of the polynomial remains the same, but defined memory region differs. + * + * @return a polynomial with a larger size() but same virtual_size() + */ + Polynomial expand(const size_t new_start_index, const size_t new_end_index) const; + /** * @brief Copys the polynomial, but with the whole address space usable. * The value of the polynomial remains the same, but defined memory region differs. @@ -355,7 +363,95 @@ template class Polynomial { SharedShiftedVirtualZeroesArray coefficients_; }; -template inline std::ostream& operator<<(std::ostream& os, Polynomial const& p) +// NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays) +template std::shared_ptr _allocate_aligned_memory(size_t n_elements) +{ + // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays) + return std::static_pointer_cast(get_mem_slab(sizeof(Fr) * n_elements)); +} + +/** + * @brief Internal implementation to support both native and stdlib circuit field types. + * @details Instantiation with circuit field type is always called with shift == false + */ +template +Fr_ _evaluate_mle(std::span evaluation_points, + const SharedShiftedVirtualZeroesArray& coefficients, + bool shift) +{ + constexpr bool is_native = IsAnyOf; + // shift ==> native + ASSERT(!shift || is_native); + + if (coefficients.size() == 0) { + return Fr_(0); + } + + const size_t n = evaluation_points.size(); + const size_t dim = numeric::get_msb(coefficients.end_ - 1) + 1; // Round up to next power of 2 + + // To simplify handling of edge cases, we assume that the index space is always a power of 2 + ASSERT(coefficients.virtual_size() == static_cast(1 << n)); + + // We first fold over dim rounds l = 0,...,dim-1. + // in round l, n_l is the size of the buffer containing the Polynomial partially evaluated + // at u₀,..., u_l. + // In round 0, this is half the size of dim + size_t n_l = 1 << (dim - 1); + + // temporary buffer of half the size of the Polynomial + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1096): Make this a Polynomial with DontZeroMemory::FLAG + auto tmp_ptr = _allocate_aligned_memory(sizeof(Fr_) * n_l); + auto tmp = tmp_ptr.get(); + + size_t offset = 0; + if constexpr (is_native) { + if (shift) { + ASSERT(coefficients.get(0) == Fr_::zero()); + offset++; + } + } + + Fr_ u_l = evaluation_points[0]; + + // Note below: i * 2 + 1 + offset might equal virtual_size. This used to subtlely be handled by extra capacity + // padding (and there used to be no assert time checks, which this constant helps with). + const size_t ALLOW_ONE_PAST_READ = 1; + for (size_t i = 0; i < n_l; ++i) { + // curr[i] = (Fr(1) - u_l) * prev[i * 2] + u_l * prev[(i * 2) + 1]; + tmp[i] = coefficients.get(i * 2 + offset) + + u_l * (coefficients.get(i * 2 + 1 + offset, ALLOW_ONE_PAST_READ) - coefficients.get(i * 2 + offset)); + } + + // partially evaluate the dim-1 remaining points + for (size_t l = 1; l < dim; ++l) { + n_l = 1 << (dim - l - 1); + u_l = evaluation_points[l]; + for (size_t i = 0; i < n_l; ++i) { + tmp[i] = tmp[i * 2] + u_l * (tmp[(i * 2) + 1] - tmp[i * 2]); + } + } + auto result = tmp[0]; + + // We handle the "trivial" dimensions which are full of zeros. + for (size_t i = dim; i < n; i++) { + result *= (Fr_(1) - evaluation_points[i]); + } + + return result; +} + +/** + * @brief Static exposed implementation to support both native and stdlib circuit field types. + */ +template +Fr_ generic_evaluate_mle(std::span evaluation_points, + const SharedShiftedVirtualZeroesArray& coefficients) +{ + return _evaluate_mle(evaluation_points, coefficients, false); +} + +template inline std::ostream& operator<<(std::ostream& os, const Polynomial& p) { if (p.size() == 0) { return os << "[]"; @@ -379,5 +475,4 @@ template auto zip_polys(Poly&& poly, Polys&&. ASSERT((poly.start_index() == polys.start_index() && poly.end_index() == polys.end_index()) && ...); return zip_view(poly.indices(), poly.coeffs(), polys.coeffs()...); } - } // namespace bb \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.test.cpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.test.cpp index c7fdc8bd454..75bba4fce0d 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.test.cpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.test.cpp @@ -163,4 +163,43 @@ TEST(Polynomial, Full) }; ASSERT_DEATH(no_full_bad(), ".*start_index.*other.start_index.*"); } + +// TODO(https://github.com/AztecProtocol/barretenberg/issues/1113): Optimizing based on actual sizes would involve using +// expand, but it is currently unused. +TEST(Polynomial, Expand) +{ + // Suppress warnings about fork(), we're OK with the edge cases. + GTEST_FLAG_SET(death_test_style, "threadsafe"); + using FF = bb::fr; + auto test_subset_good = []() { + // Expand legally within poly + auto poly = bb::Polynomial::random(4, 10, /*start index*/ 1); + poly.expand(1, 6); + poly.expand(0, 9); + poly.expand(0, 10); + }; + ASSERT_NO_FATAL_FAILURE(test_subset_good()); + + auto test_subset_bad1 = []() { + auto poly = bb::Polynomial::random(4, 10, /*start index*/ 1); + // Expand beyond virtual size + poly.expand(1, 11); + }; + ASSERT_DEATH(test_subset_bad1(), ".*new_end_index.*virtual_size.*"); + + auto test_subset_bad2 = []() { + auto poly = bb::Polynomial::random(5, 10, /*start index*/ 1); + // Expand illegally on start_index + poly.expand(2, 7); + }; + ASSERT_DEATH(test_subset_bad2(), ".*new_start_index.*start_index.*"); + + auto test_subset_bad3 = []() { + auto poly = bb::Polynomial::random(5, 10, /*start_index*/ 1); + // Expand illegally on end_index + poly.expand(1, 3); + }; + ASSERT_DEATH(test_subset_bad3(), ".*new_end_index.*end_index.*"); +} + #endif \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp b/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp index 01fe32d72c6..f86fc99ae2e 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp @@ -83,8 +83,22 @@ template Univariate extend_to() const { - const size_t EXTENDED_LENGTH = EXTENDED_DOMAIN_END - domain_start; + static constexpr size_t EXTENDED_LENGTH = EXTENDED_DOMAIN_END - domain_start; using Data = BarycentricData; static_assert(EXTENDED_LENGTH >= LENGTH); @@ -467,6 +481,18 @@ template void self_extend_from() + { + if constexpr (INITIAL_LENGTH == 2) { + const Fr delta = value_at(1) - value_at(0); + Fr next = value_at(1); + for (size_t idx = 2; idx < LENGTH; idx++) { + next += delta; + value_at(idx) = next; + } + } + } + /** * @brief Evaluate a univariate at a point u not known at compile time * and assumed not to be in the domain (else we divide by zero). diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp index 1fd8a652371..a4f0f41cbd3 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp @@ -1,13 +1,13 @@ #include "barretenberg/honk/utils/testing.hpp" #include "barretenberg/protogalaxy/protogalaxy_prover_internal.hpp" #include "barretenberg/relations/ultra_arithmetic_relation.hpp" -#include "barretenberg/stdlib_circuit_builders/ultra_flavor.hpp" +#include "barretenberg/stdlib_circuit_builders/mega_flavor.hpp" #include "barretenberg/ultra_honk/decider_keys.hpp" #include using namespace bb; -using Flavor = UltraFlavor; +using Flavor = MegaFlavor; using Polynomial = typename Flavor::Polynomial; using FF = typename Flavor::FF; @@ -34,7 +34,7 @@ TEST(Protogalaxy, CombinerOn2Keys) }; auto run_test = [&](bool is_random_input) { - // Combiner test on prover polynomisls containing random values, restricted to only the standard arithmetic + // Combiner test on prover polynomials containing random values, restricted to only the standard arithmetic // relation. if (is_random_input) { std::vector> keys_data(NUM_KEYS); @@ -58,18 +58,18 @@ TEST(Protogalaxy, CombinerOn2Keys) auto result_no_skipping = Fun::compute_combiner_no_optimistic_skipping( keys, gate_separators, univariate_relation_parameters_no_skpping, alphas); // The expected_result values are computed by running the python script combiner_example_gen.py - auto expected_result = Univariate(std::array{ 9704UL, - 13245288UL, - 75534568UL, - 224626280UL, - 498269160UL, - 934211944UL, - 1570203368UL, - 2443992168UL, - 3593327080UL, - 5055956840UL, - 6869630184UL, - 9072095848UL }); + auto expected_result = Univariate(std::array{ 11480UL, + 14117208UL, + 78456280UL, + 230777432UL, + 508829400UL, + 950360920UL, + 1593120728UL, + 2474857560UL, + 3633320152UL, + 5106257240UL, + 6931417560UL, + 9146549848UL }); EXPECT_EQ(result_no_skipping, expected_result); } else { std::vector> keys_data(NUM_KEYS); diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner_example_gen.py b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner_example_gen.py index dee82425aa6..19577972e5b 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner_example_gen.py +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner_example_gen.py @@ -1,80 +1,62 @@ # TODO(https://github.com/AztecProtocol/barretenberg/issues/760): Delete this? -import numpy as np # np.set_printoptions(formatter={'int': hex}) +import numpy as np + EXTENDED_RELATION_LENGTH = 12 class Row: - # Construct a set of 'all' polynomials with a very simple structure def __init__(self, base_poly): - # Constuct polys by adding increasing factors of 2 to an input poly - self.q_m = base_poly + 2 * 0 - self.q_c = base_poly + 2 * 1 - self.q_l = base_poly + 2 * 2 - self.q_r = base_poly + 2 * 3 - self.q_o = base_poly + 2 * 4 - self.q_4 = base_poly + 2 * 5 - self.q_arith = base_poly + 2 * 6 - self.q_delta_range = base_poly + 2 * 7 - self.q_elliptic = base_poly + 2 * 8 - self.q_aux = base_poly + 2 * 9 - self.q_lookup = base_poly + 2 * 10 - self.q_poseidon2_external_1 = base_poly + 2 * 11 - self.q_poseidon2_external_2 = base_poly + 2 * 12 - self.sigma_1 = base_poly + 2 * 13 - self.sigma_2 = base_poly + 2 * 14 - self.sigma_3 = base_poly + 2 * 15 - self.sigma_4 = base_poly + 2 * 16 - self.id_1 = base_poly + 2 * 17 - self.id_2 = base_poly + 2 * 18 - self.id_3 = base_poly + 2 * 19 - self.id_4 = base_poly + 2 * 20 - self.table_1 = base_poly + 2 * 21 - self.table_2 = base_poly + 2 * 22 - self.table_3 = base_poly + 2 * 23 - self.table_4 = base_poly + 2 * 24 - self.lagrange_first = base_poly + 2 * 25 - self.lagrange_last = base_poly + 2 * 26 - self.w_l = base_poly + 2 * 27 - self.w_r = base_poly + 2 * 28 - self.w_o = base_poly + 2 * 29 - self.w_4 = base_poly + 2 * 30 - self.sorted_accum = base_poly + 2 * 31 - self.z_perm = base_poly + 2 * 32 - self.z_lookup = base_poly + 2 * 33 - self.table_1_shift = base_poly + 2 * 34 - self.table_2_shift = base_poly + 2 * 35 - self.table_3_shift = base_poly + 2 * 36 - self.table_4_shift = base_poly + 2 * 37 - self.w_l_shift = base_poly + 2 * 38 - self.w_r_shift = base_poly + 2 * 39 - self.w_o_shift = base_poly + 2 * 40 - self.w_4_shift = base_poly + 2 * 41 - self.sorted_accum_shift = base_poly + 2 * 42 - self.z_perm_shift = base_poly + 2 * 43 - self.z_lookup_shift = base_poly + 2 * 44 + # List of all entities in the correct order + self.entity_names = [ + 'q_m', 'q_c', 'q_l', 'q_r', 'q_o', 'q_4', 'q_arith', 'q_delta_range', 'q_elliptic', 'q_aux', + 'q_lookup', 'q_busread', 'q_poseidon2_external_1', 'q_poseidon2_external_2', + 'sigma_1', 'sigma_2', 'sigma_3', 'sigma_4', + 'id_1', 'id_2', 'id_3', 'id_4', + 'table_1', 'table_2', 'table_3', 'table_4', + 'lagrange_first', 'lagrange_last', 'lagrange_ecc_op', 'databus_id', + 'w_l', 'w_r', 'w_o', 'w_4', 'z_perm', + 'lookup_inverses', 'lookup_read_counts', 'lookup_read_tags', + 'ecc_op_wire_1', 'ecc_op_wire_2', 'ecc_op_wire_3', 'ecc_op_wire_4', + 'calldata', 'calldata_read_counts', 'calldata_read_tags', 'calldata_inverses', + 'secondary_calldata', 'secondary_calldata_read_counts', 'secondary_calldata_read_tags', + 'secondary_calldata_inverses', 'return_data', 'return_data_read_counts', + 'return_data_read_tags', 'return_data_inverses', + 'table_1_shift', 'table_2_shift', 'table_3_shift', 'table_4_shift', + 'w_l_shift', 'w_r_shift', 'w_o_shift', 'w_4_shift', 'z_perm_shift' + ] + + # Initialize each entity + for i, name in enumerate(self.entity_names): + setattr(self, name, np.int64(base_poly + 2 * i)) # Convert result to avoid round ups + print(f"{name}: {getattr(self, name)}") def arith_relation(self): - return self.q_m * self.w_l * self.w_r + self.q_l * self.w_l + self.q_r * self.w_r + self.q_o * self.w_o + self.q_c + return (self.q_m * self.w_l * self.w_r + + self.q_l * self.w_l + + self.q_r * self.w_r + + self.q_o * self.w_o + + self.q_c) + def extend_one_entity(input): - result = input - delta = input[1]-input[0] + result = list(input) # Start with the input as a list + delta = input[1] - input[0] for _ in range(2, EXTENDED_RELATION_LENGTH): result.append(delta + result[-1]) return result def compute_first_example(): # Construct baseline extensions for the two rows; extentions for all polys will be computed via the Row constructor - baseline_extension_0 = np.array(extend_one_entity([0, 128])) + baseline_extension_0 = np.array(extend_one_entity([0, 200])) baseline_extension_1 = baseline_extension_0 + 1 # Construct extensions for all polys for the two rows in consideration row_0_extended = Row(baseline_extension_0) row_1_extended = Row(baseline_extension_1) - accumulator = np.array([0 for _ in range(EXTENDED_RELATION_LENGTH)]) + accumulator = np.zeros(EXTENDED_RELATION_LENGTH, dtype=np.int64) # Use np.int64 for the accumulator zeta_pow = 1 zeta = 2 for row in [row_0_extended, row_1_extended]: @@ -88,7 +70,7 @@ def arith_relation(w_l, w_r, w_o, q_m, q_l, q_r, q_o, q_c): return q_m * w_l * w_r + q_l * w_l + q_r * w_r + q_o * w_o + q_c result = 0 - # 0 1 2 3 4 5 6 7 8 9 10 11 12 + # 0 1 2 3 4 5 6 7 8 9 10 11 12 w_l = np.array([ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25]) w_r = np.array([ 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26]) w_o = np.array([ 3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51]) @@ -98,7 +80,7 @@ def arith_relation(w_l, w_r, w_o, q_m, q_l, q_r, q_o, q_c): q_o = np.array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]) q_c = np.array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) # contribution is zero, but why not? - result += arith_relation(w_l, w_r, w_o, q_m, q_l, q_r, q_o, q_c) + result += arith_relation(w_l, w_r, w_o, q_m, q_l, q_r, q_o, q_c) w_l = np.array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) w_r = np.array([ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]) diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover_impl.hpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover_impl.hpp index 0a376672a86..85266185d91 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover_impl.hpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover_impl.hpp @@ -11,7 +11,10 @@ template void ProtogalaxyProver_::run_oink_prover_on_one_incomplete_key(std::shared_ptr keys, const std::string& domain_separator) { + +#ifdef TRACY_MEMORY ZoneScopedN("ProtogalaxyProver::run_oink_prover_on_one_incomplete_key"); +#endif OinkProver oink_prover(keys, transcript, domain_separator + '_'); oink_prover.prove(); } @@ -159,7 +162,10 @@ FoldingResult ProtogalaxyProver_ FoldingResult ProtogalaxyProver_::prove() { + +#ifdef TRACY_MEMORY ZoneScopedN("ProtogalaxyProver::prove"); +#endif BB_OP_COUNT_TIME_NAME("ProtogalaxyProver::prove"); // Ensure keys are all of the same size for (size_t idx = 0; idx < DeciderProvingKeys::NUM - 1; ++idx) { diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover_internal.hpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover_internal.hpp index 4fd90abed34..0275884e84d 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover_internal.hpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover_internal.hpp @@ -24,6 +24,7 @@ template class ProtogalaxyProverInternal { using RelationUtils = bb::RelationUtils; using ProverPolynomials = typename Flavor::ProverPolynomials; using Relations = typename Flavor::Relations; + using AllValues = typename Flavor::AllValues; using RelationSeparator = typename Flavor::RelationSeparator; static constexpr size_t NUM_KEYS = DeciderProvingKeys_::NUM; using UnivariateRelationParametersNoOptimisticSkipping = @@ -54,6 +55,43 @@ template class ProtogalaxyProverInternal { static constexpr size_t NUM_SUBRELATIONS = DeciderPKs::NUM_SUBRELATIONS; + /** + * @brief A scale subrelations evaluations by challenges ('alphas') and part of the linearly dependent relation + * evaluation(s). + * + * @details Note that a linearly dependent subrelation is not computed on a specific row but rather on the entire + * execution trace. + * + * @param evals The evaluations of all subrelations on some row + * @param challenges The 'alpha' challenges used to batch the subrelations + * @param linearly_dependent_contribution An accumulator for values of the linearly-dependent (i.e., 'whole-trace') + * subrelations + * @return FF The evaluation of the linearly-independent (i.e., 'per-row') subrelations + */ + inline static FF process_subrelation_evaluations(const RelationEvaluations& evals, + const std::array& challenges, + FF& linearly_dependent_contribution) + { + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1115): Iniitalize with first subrelation value to + // avoid Montgomery allocating 0 and doing a mul. This is about 60ns per row. + FF linearly_independent_contribution{ 0 }; + size_t idx = 0; + + auto scale_by_challenge_and_accumulate = + [&](Element& element) { + using Relation = typename std::tuple_element_t; + const Element contribution = element * challenges[idx]; + if (subrelation_is_linearly_independent()) { + linearly_independent_contribution += contribution; + } else { + linearly_dependent_contribution += contribution; + } + idx++; + }; + RelationUtils::apply_to_tuple_of_arrays_elements(scale_by_challenge_and_accumulate, evals); + return linearly_independent_contribution; + } + /** * @brief Compute the values of the aggregated relation evaluations at each row in the execution trace, representing * f_i(ω) in the Protogalaxy paper, given the evaluations of all the prover polynomials and \vec{α} (the batching @@ -67,40 +105,41 @@ template class ProtogalaxyProverInternal { * linearly dependent subrelation and α_j is its corresponding batching challenge. */ static std::vector compute_row_evaluations(const ProverPolynomials& polynomials, - const RelationSeparator& alpha, + const RelationSeparator& alphas_, const RelationParameters& relation_parameters) { BB_OP_COUNT_TIME_NAME("ProtogalaxyProver_::compute_row_evaluations"); + const size_t polynomial_size = polynomials.get_polynomial_size(); - std::vector full_honk_evaluations(polynomial_size); + std::vector aggregated_relation_evaluations(polynomial_size); + + const std::array alphas = [&alphas_]() { + std::array tmp; + tmp[0] = 1; + std::copy(alphas_.begin(), alphas_.end(), tmp.begin() + 1); + return tmp; + }(); + const std::vector linearly_dependent_contribution_accumulators = parallel_for_heuristic( polynomial_size, /*accumulator default*/ FF(0), - [&](size_t row, FF& linearly_dependent_contribution_accumulator) { - auto row_evaluations = polynomials.get_row(row); - RelationEvaluations relation_evaluations; - RelationUtils::zero_elements(relation_evaluations); - - RelationUtils::template accumulate_relation_evaluations<>( - row_evaluations, relation_evaluations, relation_parameters, FF(1)); - - auto output = FF(0); - auto running_challenge = FF(1); - RelationUtils::scale_and_batch_elements(relation_evaluations, - alpha, - running_challenge, - output, - linearly_dependent_contribution_accumulator); - - full_honk_evaluations[row] = output; + [&](size_t row_idx, FF& linearly_dependent_contribution_accumulator) { + const AllValues row = polynomials.get_row(row_idx); + // Evaluate all subrelations on the given row. Separator is 1 since we are not summing across rows here. + const RelationEvaluations evals = + RelationUtils::accumulate_relation_evaluations(row, relation_parameters, FF(1)); + + // Sum against challenges alpha + aggregated_relation_evaluations[row_idx] = + process_subrelation_evaluations(evals, alphas, linearly_dependent_contribution_accumulator); }, thread_heuristics::ALWAYS_MULTITHREAD); - full_honk_evaluations[0] += sum(linearly_dependent_contribution_accumulators); - return full_honk_evaluations; - } + aggregated_relation_evaluations[0] += sum(linearly_dependent_contribution_accumulators); + return aggregated_relation_evaluations; + } /** * @brief Recursively compute the parent nodes of each level in the tree, starting from the leaves. Note that at * each level, the resulting parent nodes will be polynomials of degree (level+1) because we multiply by an @@ -200,9 +239,11 @@ template class ProtogalaxyProverInternal { const DeciderPKs& keys, const size_t row_idx) { - const auto base_univariates = keys.template row_to_univariates(row_idx); - for (auto [extended_univariate, base_univariate] : zip_view(extended_univariates.get_all(), base_univariates)) { - extended_univariate = base_univariate.template extend_to(); + auto incoming_univariates = keys.template row_to_univariates(row_idx); + for (auto [extended_univariate, incoming_univariate] : + zip_view(extended_univariates.get_all(), incoming_univariates)) { + incoming_univariate.template self_extend_from(); + extended_univariate = std::move(incoming_univariate); } } diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover_ultra.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover_ultra.cpp deleted file mode 100644 index 22882e27693..00000000000 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover_ultra.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// Note: this is split up from protogalaxy_prover_impl.hpp for compile performance reasons -#include "barretenberg/ultra_honk/decider_keys.hpp" -#include "protogalaxy_prover_impl.hpp" - -// TODO(https://github.com/AztecProtocol/barretenberg/issues/1076) Remove this instantiation. -namespace bb { -template class ProtogalaxyProver_>; -} // namespace bb \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_verifier.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_verifier.cpp index 351596b7552..342286270cb 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_verifier.cpp @@ -137,7 +137,6 @@ std::shared_ptr ProtogalaxyVerifier return next_accumulator; } -template class ProtogalaxyVerifier_>; template class ProtogalaxyVerifier_>; } // namespace bb \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_verifier.hpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_verifier.hpp index 7e1ed7c989f..c1b57127af5 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_verifier.hpp @@ -2,7 +2,6 @@ #include "barretenberg/flavor/flavor.hpp" #include "barretenberg/protogalaxy/folding_result.hpp" #include "barretenberg/stdlib_circuit_builders/mega_flavor.hpp" -#include "barretenberg/stdlib_circuit_builders/ultra_flavor.hpp" #include "barretenberg/transcript/transcript.hpp" #include "barretenberg/ultra_honk/decider_keys.hpp" diff --git a/barretenberg/cpp/src/barretenberg/relations/utils.hpp b/barretenberg/cpp/src/barretenberg/relations/utils.hpp index 0d3ae711ba1..846fc1d5f9c 100644 --- a/barretenberg/cpp/src/barretenberg/relations/utils.hpp +++ b/barretenberg/cpp/src/barretenberg/relations/utils.hpp @@ -174,15 +174,16 @@ template class RelationUtils { */ template // TODO(#224)(Cody): Input should be an array? - inline static void accumulate_relation_evaluations(const PolynomialEvaluations& evaluations, - RelationEvaluations& relation_evaluations, - const Parameters& relation_parameters, - const FF& partial_evaluation_result) + inline static RelationEvaluations accumulate_relation_evaluations(const PolynomialEvaluations& evaluations, + const Parameters& relation_parameters, + const FF& partial_evaluation_result) { + RelationEvaluations result; constexpr_for<0, NUM_RELATIONS, 1>([&]() { accumulate_single_relation( - evaluations, relation_evaluations, relation_parameters, partial_evaluation_result); + evaluations, result, relation_parameters, partial_evaluation_result); }); + return result; } template @@ -251,48 +252,6 @@ template class RelationUtils { apply_to_tuple_of_arrays(scale_by_challenges_and_accumulate, tuple); } - /** - * @brief Scales elements, representing evaluations of polynomials in subrelations, by separate challenges and then - * sum them together. This function has identical functionality with the one above with the caveat that one such - * evaluation is part of a linearly dependent subrelation and hence needs to be accumulated separately. - * - * @details Such functionality is needed when computing the evaluation of the full relation at a specific row in - * the execution trace because a linearly dependent subrelation does not act on a specific row but rather on the - * entire execution trace. - * - * @param tuple - * @param challenges - * @param current_scalar - * @param result - * @param linearly_dependent_contribution - */ - static void scale_and_batch_elements(auto& tuple, - const RelationSeparator& challenges, - FF current_scalar, - FF& result, - FF& linearly_dependent_contribution) - requires bb::IsFoldingFlavor - { - size_t idx = 0; - std::array tmp{ current_scalar }; - - std::copy(challenges.begin(), challenges.end(), tmp.begin() + 1); - - auto scale_by_challenge_and_accumulate = - [&](Element& element) { - using Relation = typename std::tuple_element_t; - const bool is_subrelation_linearly_independent = - bb::subrelation_is_linearly_independent(); - if (is_subrelation_linearly_independent) { - result += element * tmp[idx]; - } else { - linearly_dependent_contribution += element * tmp[idx]; - } - idx++; - }; - apply_to_tuple_of_arrays_elements(scale_by_challenge_and_accumulate, tuple); - } - /** * @brief Scale elements by consecutive powers of a given challenge then sum the result * @param result Batched result @@ -336,7 +295,7 @@ template class RelationUtils { * dependent contribution when we compute the evaluation of full rel_U(G)H at particular row.) */ template - static void apply_to_tuple_of_arrays_elements(Operation&& operation, std::tuple& tuple) + static void apply_to_tuple_of_arrays_elements(Operation&& operation, const std::tuple& tuple) { using Relation = typename std::tuple_element_t; const auto subrelation_length = Relation::SUBRELATION_PARTIAL_LENGTHS.size(); diff --git a/barretenberg/cpp/src/barretenberg/srs/factories/file_crs_factory.hpp b/barretenberg/cpp/src/barretenberg/srs/factories/file_crs_factory.hpp index f3eca37a48f..3da7f409894 100644 --- a/barretenberg/cpp/src/barretenberg/srs/factories/file_crs_factory.hpp +++ b/barretenberg/cpp/src/barretenberg/srs/factories/file_crs_factory.hpp @@ -44,7 +44,10 @@ template class FileProverCrs : public ProverCrs { FileProverCrs(const size_t num_points, std::string const& path) : num_points(num_points) { + +#ifdef TRACY_MEMORY ZoneScopedN("FileProverCrs constructor"); +#endif monomials_ = scalar_multiplication::point_table_alloc(num_points); srs::IO::read_transcript_g1(monomials_.get(), num_points, path); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/eccvm_verifier/eccvm_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/eccvm_verifier/eccvm_recursive_verifier.cpp index eeb04cddc99..b190110ef8f 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/eccvm_verifier/eccvm_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/eccvm_verifier/eccvm_recursive_verifier.cpp @@ -40,7 +40,7 @@ template void ECCVMRecursiveVerifier_::verify_proof(co } // Get challenge for sorted list batching and wire four memory records - auto [beta, gamma] = transcript->template get_challenges("beta", "gamma"); + const auto [beta, gamma] = transcript->template get_challenges("beta", "gamma"); auto beta_sqr = beta * beta; @@ -63,7 +63,7 @@ template void ECCVMRecursiveVerifier_::verify_proof(co // sumcheck is dependent on circuit size. const size_t log_circuit_size = numeric::get_msb(static_cast(circuit_size.get_value())); auto sumcheck = SumcheckVerifier(log_circuit_size, transcript, FF(0)); - FF alpha = transcript->template get_challenge("Sumcheck:alpha"); + const FF alpha = transcript->template get_challenge("Sumcheck:alpha"); std::vector gate_challenges(static_cast(numeric::get_msb(key->circuit_size))); for (size_t idx = 0; idx < gate_challenges.size(); idx++) { gate_challenges[idx] = transcript->template get_challenge("Sumcheck:gate_challenge_" + std::to_string(idx)); @@ -80,25 +80,24 @@ template void ECCVMRecursiveVerifier_::verify_proof(co multivariate_challenge, key->pcs_verification_key->get_g1_identity(), transcript); - auto hack_commitment = transcript->template receive_from_prover("Translation:hack_commitment"); - FF evaluation_challenge_x = transcript->template get_challenge("Translation:evaluation_challenge_x"); + const FF evaluation_challenge_x = transcript->template get_challenge("Translation:evaluation_challenge_x"); // Construct the vector of commitments (needs to be vector for the batch_mul) and array of evaluations to be batched - std::vector transcript_commitments = { commitments.transcript_op, commitments.transcript_Px, - commitments.transcript_Py, commitments.transcript_z1, - commitments.transcript_z2, hack_commitment }; + std::vector transcript_commitments = { commitments.transcript_op, + commitments.transcript_Px, + commitments.transcript_Py, + commitments.transcript_z1, + commitments.transcript_z2 }; std::vector transcript_evaluations = { transcript->template receive_from_prover("Translation:op"), transcript->template receive_from_prover("Translation:Px"), transcript->template receive_from_prover("Translation:Py"), transcript->template receive_from_prover("Translation:z1"), - transcript->template receive_from_prover("Translation:z2"), - transcript->template receive_from_prover( - "Translation:hack_evaluation") }; + transcript->template receive_from_prover("Translation:z2") }; // Get the batching challenge for commitments and evaluations - FF ipa_batching_challenge = transcript->template get_challenge("Translation:ipa_batching_challenge"); + const FF ipa_batching_challenge = transcript->template get_challenge("Translation:ipa_batching_challenge"); // Compute the batched commitment and batched evaluation for the univariate opening claim auto batched_transcript_eval = transcript_evaluations[0]; @@ -110,7 +109,7 @@ template void ECCVMRecursiveVerifier_::verify_proof(co batching_challenges.emplace_back(batching_scalar); batching_scalar *= ipa_batching_challenge; } - auto batched_commitment = Commitment::batch_mul(transcript_commitments, batching_challenges); + const Commitment batched_commitment = Commitment::batch_mul(transcript_commitments, batching_challenges); // Construct and verify the combined opening claim OpeningClaim batched_univariate_claim = { { evaluation_challenge_x, batched_transcript_eval }, diff --git a/barretenberg/cpp/src/barretenberg/stdlib/hash/sha256/sha256_plookup.cpp b/barretenberg/cpp/src/barretenberg/stdlib/hash/sha256/sha256_plookup.cpp index 6c809f12d84..3fa8f939c25 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/hash/sha256/sha256_plookup.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/hash/sha256/sha256_plookup.cpp @@ -271,11 +271,16 @@ std::array, 8> sha256_block(const std::array, /** * Initialize round variables with previous block output **/ - auto a = map_into_maj_sparse_form(h_init[0]); + /** + * We can initialize round variables a and c and put value h_init[0] and + * h_init[4] in .normal, and don't do lookup for maj_output, because majority and choose + * functions will do that in the next step + **/ + sparse_value a = sparse_value(h_init[0]); auto b = map_into_maj_sparse_form(h_init[1]); auto c = map_into_maj_sparse_form(h_init[2]); auto d = map_into_maj_sparse_form(h_init[3]); - auto e = map_into_choose_sparse_form(h_init[4]); + sparse_value e = sparse_value(h_init[4]); auto f = map_into_choose_sparse_form(h_init[5]); auto g = map_into_choose_sparse_form(h_init[6]); auto h = map_into_choose_sparse_form(h_init[7]); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/decider_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/decider_recursive_verifier.cpp index 96cc81cd859..a47470cf577 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/decider_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/decider_recursive_verifier.cpp @@ -1,5 +1,5 @@ #include "barretenberg/stdlib/honk_verifier/decider_recursive_verifier.hpp" -#include "barretenberg/commitment_schemes/zeromorph/zeromorph.hpp" +#include "barretenberg/commitment_schemes/shplonk/shplemini.hpp" #include "barretenberg/numeric/bitop/get_msb.hpp" #include "barretenberg/transcript/transcript.hpp" @@ -15,7 +15,7 @@ std::array DeciderRecursiveVerifier_:: using Sumcheck = ::bb::SumcheckVerifier; using PCS = typename Flavor::PCS; using Curve = typename Flavor::Curve; - using ZeroMorph = ::bb::ZeroMorphVerifier_; + using Shplemini = ::bb::ShpleminiVerifier_; using VerifierCommitments = typename Flavor::VerifierCommitments; using Transcript = typename Flavor::Transcript; @@ -30,17 +30,16 @@ std::array DeciderRecursiveVerifier_:: auto [multivariate_challenge, claimed_evaluations, sumcheck_verified] = sumcheck.verify(accumulator->relation_parameters, accumulator->alphas, accumulator->gate_challenges); - // Execute ZeroMorph rounds. See https://hackmd.io/dlf9xEwhTQyE3hiGbq4FsA?view for a complete description of the - // unrolled protocol. - auto opening_claim = ZeroMorph::verify(accumulator->verification_key->circuit_size, - commitments.get_unshifted(), - commitments.get_to_be_shifted(), - claimed_evaluations.get_unshifted(), - claimed_evaluations.get_shifted(), - multivariate_challenge, - Commitment::one(builder), - transcript); - auto pairing_points = PCS::reduce_verify(opening_claim, transcript); + // Execute Shplemini rounds. + auto opening_claim = Shplemini::compute_batch_opening_claim(accumulator->verification_key->circuit_size, + commitments.get_unshifted(), + commitments.get_to_be_shifted(), + claimed_evaluations.get_unshifted(), + claimed_evaluations.get_shifted(), + multivariate_challenge, + Commitment::one(builder), + transcript); + auto pairing_points = PCS::reduce_verify_batch_opening_claim(opening_claim, transcript); return pairing_points; } diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.cpp index a728f3e3f7e..bf1ac000ac9 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.cpp @@ -1,5 +1,5 @@ #include "barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.hpp" -#include "barretenberg/commitment_schemes/zeromorph/zeromorph.hpp" +#include "barretenberg/commitment_schemes/shplonk/shplemini.hpp" #include "barretenberg/numeric/bitop/get_msb.hpp" #include "barretenberg/plonk_honk_shared/library/grand_product_delta.hpp" #include "barretenberg/transcript/transcript.hpp" @@ -42,7 +42,7 @@ UltraRecursiveVerifier_::AggregationObject UltraRecursiveVerifier_; using PCS = typename Flavor::PCS; using Curve = typename Flavor::Curve; - using ZeroMorph = ::bb::ZeroMorphVerifier_; + using Shplemini = ::bb::ShpleminiVerifier_; using VerifierCommitments = typename Flavor::VerifierCommitments; using Transcript = typename Flavor::Transcript; @@ -91,16 +91,16 @@ UltraRecursiveVerifier_::AggregationObject UltraRecursiveVerifier_relation_parameters, verification_key->alphas, gate_challenges); - // Execute ZeroMorph to produce an opening claim subsequently verified by a univariate PCS - auto opening_claim = ZeroMorph::verify(key->circuit_size, - commitments.get_unshifted(), - commitments.get_to_be_shifted(), - claimed_evaluations.get_unshifted(), - claimed_evaluations.get_shifted(), - multivariate_challenge, - Commitment::one(builder), - transcript); - auto pairing_points = PCS::reduce_verify(opening_claim, transcript); + // Execute Shplemini to produce a batch opening claim subsequently verified by a univariate PCS + auto opening_claim = Shplemini::compute_batch_opening_claim(key->circuit_size, + commitments.get_unshifted(), + commitments.get_to_be_shifted(), + claimed_evaluations.get_unshifted(), + claimed_evaluations.get_shifted(), + multivariate_challenge, + Commitment::one(builder), + transcript); + auto pairing_points = PCS::reduce_verify_batch_opening_claim(opening_claim, transcript); pairing_points[0] = pairing_points[0].normalize(); pairing_points[1] = pairing_points[1].normalize(); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.test.cpp index fadb5460be2..fe7c5571093 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.test.cpp @@ -170,14 +170,10 @@ template class RecursiveVerifierTest : public testing size_t block_idx = 0; for (auto [b_10, b_11] : zip_view(blocks_10.get(), blocks_11.get())) { info("block index: ", block_idx); - size_t sel_idx = 0; EXPECT_TRUE(b_10.selectors.size() == 13); EXPECT_TRUE(b_11.selectors.size() == 13); for (auto [p_10, p_11] : zip_view(b_10.selectors, b_11.selectors)) { - - info("sel index: ", sel_idx); check_eq(p_10, p_11); - sel_idx++; } block_idx++; } @@ -215,10 +211,7 @@ template class RecursiveVerifierTest : public testing // Create a recursive verification circuit for the proof of the inner circuit OuterBuilder outer_circuit; RecursiveVerifier verifier{ &outer_circuit, verification_key }; - typename RecursiveFlavor::CommitmentLabels commitment_labels; - for (auto [label, key] : zip_view(commitment_labels.get_precomputed(), verifier.key->get_all())) { - info("label: ", label, " value: ", key.get_value()); - } + aggregation_state agg_obj = init_default_aggregation_state(outer_circuit); auto pairing_points = verifier.verify_proof(inner_proof, agg_obj); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.cpp index 49a0ba108b2..52d510d8774 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.cpp @@ -1,5 +1,6 @@ #include "bool.hpp" #include "../circuit_builders/circuit_builders.hpp" +#include "barretenberg/transcript/origin_tag.hpp" using namespace bb; @@ -50,6 +51,7 @@ bool_t::bool_t(const bool_t& other) witness_index = other.witness_index; witness_bool = other.witness_bool; witness_inverted = other.witness_inverted; + tag = other.tag; } template @@ -59,6 +61,7 @@ bool_t::bool_t(bool_t&& other) witness_index = other.witness_index; witness_bool = other.witness_bool; witness_inverted = other.witness_inverted; + tag = other.tag; } template bool_t& bool_t::operator=(const bool other) @@ -76,6 +79,7 @@ template bool_t& bool_t::operator=(const bo witness_index = other.witness_index; witness_bool = other.witness_bool; witness_inverted = other.witness_inverted; + tag = other.tag; return *this; } @@ -85,6 +89,7 @@ template bool_t& bool_t::operator=(bool_t&& witness_index = other.witness_index; witness_bool = other.witness_bool; witness_inverted = other.witness_inverted; + tag = other.tag; return *this; } @@ -177,6 +182,7 @@ template bool_t bool_t::operator&(const boo result.witness_index = IS_CONSTANT; result.witness_inverted = false; } + result.tag = OriginTag(tag, other.tag); return result; } @@ -257,6 +263,7 @@ template bool_t bool_t::operator|(const boo result.witness_inverted = false; result.witness_index = IS_CONSTANT; } + result.tag = OriginTag(tag, other.tag); return result; } @@ -316,6 +323,7 @@ template bool_t bool_t::operator^(const boo result.witness_inverted = false; result.witness_index = IS_CONSTANT; } + result.tag = OriginTag(tag, other.tag); return result; } @@ -333,6 +341,7 @@ template bool_t bool_t::operator==(const bo bool_t result(context == nullptr ? other.context : context); result.witness_bool = (witness_bool ^ witness_inverted) == (other.witness_bool ^ other.witness_inverted); result.witness_index = IS_CONSTANT; + result.set_origin_tag(OriginTag(get_origin_tag(), other.get_origin_tag())); return result; } else if ((witness_index != IS_CONSTANT) && (other.witness_index == IS_CONSTANT)) { if (other.witness_bool ^ other.witness_inverted) { @@ -376,6 +385,8 @@ template bool_t bool_t::operator==(const bo right_coefficient, bb::fr::neg_one(), constant_coefficient }); + + result.tag = OriginTag(tag, other.tag); return result; } } @@ -438,12 +449,6 @@ template bool_t bool_t::implies(const bool_ return (!(*this) || other); // P => Q is equiv. to !P || Q (not(P) or Q). } -/** - * (P => Q) && (P => R) - * <=> (!P || Q) && (!P || R) - * <=> !P || (Q && R) [by distributivity of propositional logic] - * <=> P => (Q && R) [a.k.a. distribution of implication over conjunction] - */ template void bool_t::must_imply(const bool_t& other, std::string const& msg) const { (this->implies(other)).assert_equal(true, msg); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.hpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.hpp index cbd8607f7a3..686b9a6deb1 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.hpp @@ -1,6 +1,7 @@ #pragma once #include "../circuit_builders/circuit_builders_fwd.hpp" #include "../witness/witness.hpp" +#include "barretenberg/transcript/origin_tag.hpp" namespace bb::stdlib { @@ -64,10 +65,13 @@ template class bool_t { Builder* get_context() const { return context; } + void set_origin_tag(const OriginTag& new_tag) const { tag = new_tag; } + OriginTag get_origin_tag() const { return tag; } mutable Builder* context = nullptr; mutable bool witness_bool = false; mutable bool witness_inverted = false; mutable uint32_t witness_index = IS_CONSTANT; + mutable OriginTag tag{}; }; template inline std::ostream& operator<<(std::ostream& os, bool_t const& v) diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.test.cpp index 45f4b3fe942..4744892ee42 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.test.cpp @@ -2,7 +2,9 @@ #include "barretenberg/circuit_checker/circuit_checker.hpp" #include "barretenberg/stdlib/primitives/byte_array/byte_array.cpp" #include "barretenberg/stdlib/primitives/circuit_builders/circuit_builders.hpp" +#include "barretenberg/transcript/origin_tag.hpp" #include +#include #define STDLIB_TYPE_ALIASES \ using Builder = TypeParam; \ @@ -19,6 +21,16 @@ template class BoolTest : public ::testing::Test {}; using CircuitTypes = ::testing::Types; +// Tags reused in tests +const size_t parent_id = 0; +const auto submitted_value_origin_tag = OriginTag(parent_id, /*round_id=*/0, /*is_submitted=*/true); +const auto challenge_origin_tag = OriginTag(parent_id, /*round_id=*/0, /*is_submitted=*/false); +const auto next_challenge_tag = OriginTag(parent_id, /*round_id=*/1, /*is_submitted=*/false); + +const auto first_two_merged_tag = OriginTag(submitted_value_origin_tag, challenge_origin_tag); +const auto first_and_third_merged_tag = OriginTag(submitted_value_origin_tag, next_challenge_tag); +const auto all_merged_tag = OriginTag(first_two_merged_tag, next_challenge_tag); + TYPED_TEST_SUITE(BoolTest, CircuitTypes); TYPED_TEST(BoolTest, TestBasicOperations) { @@ -30,21 +42,50 @@ TYPED_TEST(BoolTest, TestBasicOperations) bool_ct a = witness_ct(&builder, bb::fr::one()); bool_ct b = witness_ct(&builder, bb::fr::zero()); + + a.set_origin_tag(submitted_value_origin_tag); + b.set_origin_tag(challenge_origin_tag); + a = a ^ b; // a = 1 EXPECT_EQ(a.get_value(), 1); + + // Tags are merged on XOR + EXPECT_EQ(a.get_origin_tag(), first_two_merged_tag); + b = !b; // b = 1 (witness 0) EXPECT_EQ(b.get_value(), 1); + + // Tag is preserved on NOT + EXPECT_EQ(b.get_origin_tag(), challenge_origin_tag); + + a.set_origin_tag(submitted_value_origin_tag); + bool_ct d = (a == b); // EXPECT_EQ(d.get_value(), 1); + + // Tags are merged on == + EXPECT_EQ(d.get_origin_tag(), first_two_merged_tag); + d = false; // d = 0 + d.set_origin_tag(challenge_origin_tag); EXPECT_EQ(d.get_value(), 0); + bool_ct e = a | d; // e = 1 = a EXPECT_EQ(e.get_value(), 1); + + // Tags are merged on OR + EXPECT_EQ(e.get_origin_tag(), first_two_merged_tag); + bool_ct f = e ^ b; // f = 0 EXPECT_EQ(f.get_value(), 0); + + f.set_origin_tag(challenge_origin_tag); d = (!f) & a; // d = 1 EXPECT_EQ(d.get_value(), 1); + // Tags are merged on AND + EXPECT_EQ(d.get_origin_tag(), first_two_merged_tag); + bool result = CircuitChecker::check(builder); EXPECT_EQ(result, true); @@ -137,7 +178,14 @@ TYPED_TEST(BoolTest, LogicalAnd) bool_ct a = witness_ct(&builder, 1); bool_ct b = witness_ct(&builder, 1); - (!a) && (!b); + + a.set_origin_tag(submitted_value_origin_tag); + b.set_origin_tag(challenge_origin_tag); + + auto c = (!a) && (!b); + + // Tags are merged on logical AND + EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag); bool result = CircuitChecker::check(builder); EXPECT_EQ(result, true); @@ -289,8 +337,16 @@ TYPED_TEST(BoolTest, Implies) bool b_val = (bool)(i > 1 ? true : false); bool_ct a = lhs_constant ? bool_ct(a_val) : (witness_ct(&builder, a_val)); bool_ct b = rhs_constant ? bool_ct(b_val) : (witness_ct(&builder, b_val)); + if (!(lhs_constant || rhs_constant)) { + a.set_origin_tag(submitted_value_origin_tag); + b.set_origin_tag(challenge_origin_tag); + } bool_ct c = a.implies(b); EXPECT_EQ(c.get_value(), !a.get_value() || b.get_value()); + if (!(lhs_constant || rhs_constant)) { + // Tags are merged on implies + EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag); + } } } @@ -312,8 +368,17 @@ TYPED_TEST(BoolTest, ImpliesBothWays) bool b_val = (bool)(i > 1 ? true : false); bool_ct a = lhs_constant ? bool_ct(a_val) : (witness_ct(&builder, a_val)); bool_ct b = rhs_constant ? bool_ct(b_val) : (witness_ct(&builder, b_val)); + if (!(lhs_constant || rhs_constant)) { + a.set_origin_tag(submitted_value_origin_tag); + b.set_origin_tag(challenge_origin_tag); + } bool_ct c = a.implies_both_ways(b); EXPECT_EQ(c.get_value(), !(a.get_value() ^ b.get_value())); + + if (!(lhs_constant || rhs_constant)) { + // Tags are merged on implies both ways + EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag); + } } } @@ -465,8 +530,18 @@ TYPED_TEST(BoolTest, ConditionalAssign) bool_ct r_ct = rhs_constant ? bool_ct(right) : (witness_ct(&builder, right)); bool_ct cond = (witness_ct(&builder, condition)); + if (!(lhs_constant | rhs_constant)) { + cond.set_origin_tag(submitted_value_origin_tag); + l_ct.set_origin_tag(challenge_origin_tag); + r_ct.set_origin_tag(next_challenge_tag); + } auto result = bool_ct::conditional_assign(cond, l_ct, r_ct); + if (!(lhs_constant | rhs_constant)) { + // Tags are merged on conditional assign + EXPECT_EQ(result.get_origin_tag(), all_merged_tag); + } + EXPECT_EQ(result.get_value(), condition ? left : right); } info("num gates = ", builder.get_num_gates()); @@ -514,8 +589,14 @@ TYPED_TEST(BoolTest, Normalize) auto generate_constraints = [&builder](bool value, bool is_constant, bool is_inverted) { bool_ct a = is_constant ? bool_ct(&builder, value) : witness_ct(&builder, value); bool_ct b = is_inverted ? !a : a; + if (!is_constant) { + b.set_origin_tag(submitted_value_origin_tag); + } bool_ct c = b.normalize(); EXPECT_EQ(c.get_value(), value ^ is_inverted); + if (!is_constant) { + EXPECT_EQ(c.get_origin_tag(), submitted_value_origin_tag); + } }; generate_constraints(false, false, false); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.cpp index 26f08fa0862..1081be69d34 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.cpp @@ -52,6 +52,7 @@ template field_t::field_t(const bool_t& oth additive_constant = other.witness_inverted ? bb::fr::one() : bb::fr::zero(); multiplicative_constant = other.witness_inverted ? bb::fr::neg_one() : bb::fr::one(); } + tag = other.tag; } template @@ -69,6 +70,7 @@ template field_t::operator bool_t() const result.witness_bool = (additive_constant == bb::fr::one()); result.witness_inverted = false; result.witness_index = IS_CONSTANT; + result.set_origin_tag(tag); return result; } bool add_constant_check = (additive_constant == bb::fr::zero()); @@ -85,6 +87,7 @@ template field_t::operator bool_t() const result.witness_inverted = inverted_check; result.witness_index = witness_index; context->create_bool_gate(witness_index); + result.set_origin_tag(tag); return result; } @@ -130,6 +133,7 @@ template field_t field_t::operator+(const f bb::fr::neg_one(), (additive_constant + other.additive_constant) }); } + result.tag = OriginTag(tag, other.tag); return result; } @@ -240,6 +244,7 @@ template field_t field_t::operator*(const f .q_o = bb::fr::neg_one(), .q_c = q_c }); } + result.tag = OriginTag(tag, other.tag); return result; } @@ -338,6 +343,7 @@ template field_t field_t::divide_no_zero_ch .q_o = q_o, .q_c = q_c }); } + result.tag = OriginTag(tag, other.tag); return result; } /** @@ -356,7 +362,9 @@ template field_t field_t::pow(const field_t ctx->failure("field_t::pow exponent accumulator incorrect"); } constexpr uint256_t MASK_32_BITS = 0xffff'ffff; - return get_value().pow(exponent_value & MASK_32_BITS); + auto result = field_t(get_value().pow(exponent_value & MASK_32_BITS)); + result.set_origin_tag(OriginTag(get_origin_tag(), exponent.get_origin_tag())); + return result; } bool exponent_constant = exponent.is_constant(); @@ -385,6 +393,7 @@ template field_t field_t::pow(const field_t accumulator *= (mul_coefficient * bit + 1); } accumulator = accumulator.normalize(); + accumulator.tag = OriginTag(tag, exponent.tag); return accumulator; } @@ -458,6 +467,7 @@ template field_t field_t::madd(const field_ .d_scaling = -bb::fr(1), .const_scaling = q_c, }); + result.tag = OriginTag(tag, to_mul.tag, to_add.tag); return result; } @@ -495,6 +505,7 @@ template field_t field_t::add_two(const fie .d_scaling = -bb::fr(1), .const_scaling = q_c, }); + result.tag = OriginTag(tag, add_a.tag, add_b.tag); return result; } @@ -531,6 +542,7 @@ template field_t field_t::normalize() const .b_scaling = 0, .c_scaling = bb::fr::neg_one(), .const_scaling = additive_constant }); + result.tag = tag; return result; } @@ -614,7 +626,9 @@ template void field_t::assert_is_not_zero(std::strin template bool_t field_t::is_zero() const { if (witness_index == IS_CONSTANT) { - return bool_t(context, (get_value() == bb::fr::zero())); + auto result = bool_t(context, (get_value() == bb::fr::zero())); + result.set_origin_tag(get_origin_tag()); + return result; } // To check whether a field element, k, is zero, we use the fact that, if k > 0, @@ -668,6 +682,7 @@ template bool_t field_t::is_zero() const .q_r = q_r, .q_o = q_o, .q_c = q_c }); + is_zero.set_origin_tag(tag); return is_zero; } @@ -686,7 +701,9 @@ template bool_t field_t::operator==(const f { Builder* ctx = (context == nullptr) ? other.context : context; if (is_constant() && other.is_constant()) { - return (get_value() == other.get_value()); + auto result = bool_t((get_value() == other.get_value())); + result.set_origin_tag(OriginTag(get_origin_tag(), other.get_origin_tag())); + return result; } bb::fr fa = get_value(); @@ -707,6 +724,7 @@ template bool_t field_t::operator==(const f field_t::evaluate_polynomial_identity(diff, x, result, -field_t(bb::fr::one())); field_t::evaluate_polynomial_identity(diff, result, field_t(bb::fr::zero()), field_t(bb::fr::zero())); + result.set_origin_tag(OriginTag(tag, other.tag)); return result; } @@ -719,7 +737,9 @@ template field_t field_t::conditional_negate(const bool_t& predicate) const { if (predicate.is_constant()) { - return predicate.get_value() ? -(*this) : *this; + auto result = field_t(predicate.get_value() ? -(*this) : *this); + result.set_origin_tag(OriginTag(get_origin_tag(), predicate.get_origin_tag())); + return result; } field_t predicate_field(predicate); field_t multiplicand = -(predicate_field + predicate_field); @@ -733,7 +753,9 @@ field_t field_t::conditional_assign(const bool_t& pre const field_t& rhs) { if (predicate.is_constant()) { - return predicate.get_value() ? lhs : rhs; + auto result = field_t(predicate.get_value() ? lhs : rhs); + result.set_origin_tag(OriginTag(predicate.get_origin_tag(), lhs.get_origin_tag(), rhs.get_origin_tag())); + return result; } // if lhs and rhs are the same witness, just return it! if (lhs.get_witness_index() == rhs.get_witness_index() && (lhs.additive_constant == rhs.additive_constant) && @@ -1051,6 +1073,11 @@ template field_t field_t::accumulate(const accumulator[3 * i + 1].get_value() - accumulator[3 * i + 2].get_value(); accumulating_total = witness_t(ctx, new_total); } + OriginTag new_tag{}; + for (const auto& single_input : input) { + new_tag = OriginTag(new_tag, single_input.tag); + } + total.tag = new_tag; return total.normalize(); } field_t total; @@ -1091,6 +1118,9 @@ std::array, 3> field_t::slice(const uint8_t msb, const ((hi_wit * field_t(uint256_t(1) << msb_plus_one)) + lo_wit + (slice_wit * field_t(uint256_t(1) << lsb)))); std::array result = { lo_wit, slice_wit, hi_wit }; + for (size_t i = 0; i < 3; i++) { + result[i].tag = tag; + } return result; } @@ -1131,6 +1161,7 @@ std::vector> field_t::decompose_into_bits( // Extract bit vector and show that it has the same value as `this`. for (size_t i = 0; i < num_bits; ++i) { bool_t bit = get_bit(context, num_bits - 1 - i, val_u256); + bit.set_origin_tag(tag); result[num_bits - 1 - i] = bit; bb::fr scaling_factor_value = fr(2).pow(static_cast(num_bits - 1 - i)); field_t scaling_factor(context, scaling_factor_value); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.hpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.hpp index 2bbfe93989b..479c274ec57 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.hpp @@ -2,6 +2,7 @@ #include "../circuit_builders/circuit_builders_fwd.hpp" #include "../witness/witness.hpp" #include "barretenberg/common/assert.hpp" +#include "barretenberg/transcript/origin_tag.hpp" #include namespace bb::stdlib { @@ -70,6 +71,7 @@ template class field_t { , additive_constant(other.additive_constant) , multiplicative_constant(other.multiplicative_constant) , witness_index(other.witness_index) + , tag(other.tag) {} field_t(field_t&& other) noexcept @@ -77,6 +79,7 @@ template class field_t { , additive_constant(other.additive_constant) , multiplicative_constant(other.multiplicative_constant) , witness_index(other.witness_index) + , tag(other.tag) {} field_t(const bool_t& other); @@ -99,6 +102,7 @@ template class field_t { multiplicative_constant = other.multiplicative_constant; witness_index = other.witness_index; context = (other.context == nullptr ? nullptr : other.context); + tag = other.tag; return *this; } @@ -108,6 +112,7 @@ template class field_t { multiplicative_constant = other.multiplicative_constant; witness_index = other.witness_index; context = (other.context == nullptr ? nullptr : other.context); + tag = other.tag; return *this; } @@ -115,6 +120,7 @@ template class field_t { { auto result = field_t(witness_t(&context, other.get_value())); result.assert_equal(other, "field_t::copy_as_new_witness, assert_equal"); + result.tag = other.tag; return result; } @@ -187,6 +193,9 @@ template class field_t { return result; } + void set_origin_tag(const OriginTag& new_tag) const { tag = new_tag; } + OriginTag get_origin_tag() const { return tag; }; + field_t conditional_negate(const bool_t& predicate) const; void assert_equal(const field_t& rhs, std::string const& msg = "field_t::assert_equal") const; @@ -430,6 +439,8 @@ template class field_t { * TLDR: witness_index is a pseudo pointer to a circuit witness **/ mutable uint32_t witness_index = IS_CONSTANT; + + mutable OriginTag tag{}; }; template inline std::ostream& operator<<(std::ostream& os, field_t const& v) diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp index e8aec8a4745..258b5403bad 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp @@ -946,6 +946,140 @@ template class stdlib_field : public testing::Test { bool circuit_checks = composer.check_circuit(); EXPECT_TRUE(circuit_checks); } + static void test_origin_tag_consistency() + { + Builder builder = Builder(); + auto a = field_ct(witness_ct(&builder, bb::fr::random_element())); + auto b = field_ct(witness_ct(&builder, bb::fr::random_element())); + EXPECT_TRUE(a.get_origin_tag().is_empty()); + EXPECT_TRUE(b.get_origin_tag().is_empty()); + const size_t parent_id = 0; + + const auto submitted_value_origin_tag = OriginTag(parent_id, /*round_id=*/0, /*is_submitted=*/true); + const auto challenge_origin_tag = OriginTag(parent_id, /*round_id=*/0, /*is_submitted=*/false); + const auto next_challenge_tag = OriginTag(parent_id, /*round_id=*/1, /*submitted=*/false); + + const auto first_two_merged_tag = OriginTag(submitted_value_origin_tag, challenge_origin_tag); + const auto first_and_third_merged_tag = OriginTag(submitted_value_origin_tag, next_challenge_tag); + const auto all_merged_tag = OriginTag(first_two_merged_tag, next_challenge_tag); + + a.set_origin_tag(submitted_value_origin_tag); + b.set_origin_tag(challenge_origin_tag); + + EXPECT_EQ(a.get_origin_tag(), submitted_value_origin_tag); + EXPECT_EQ(b.get_origin_tag(), challenge_origin_tag); + + // Basic additon merges tags + auto c = a + b; + EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag); + + // Basic multiplication merges tags + auto d = a * b; + EXPECT_EQ(d.get_origin_tag(), first_two_merged_tag); + + // Basic subtraction merges tags + auto e = a - b; + EXPECT_EQ(e.get_origin_tag(), first_two_merged_tag); + + // Division merges tags + + auto f = a / b; + EXPECT_EQ(f.get_origin_tag(), first_two_merged_tag); + + // Exponentiation merges tags + + auto exponent = field_ct(witness_ct(&builder, 10)); + exponent.set_origin_tag(challenge_origin_tag); + auto g = a.pow(exponent); + EXPECT_EQ(g.get_origin_tag(), first_two_merged_tag); + + // Madd merges tags + auto h = field_ct(witness_ct(&builder, bb::fr::random_element())); + h.set_origin_tag(next_challenge_tag); + auto i = a.madd(b, h); + EXPECT_EQ(i.get_origin_tag(), all_merged_tag); + + // add_two merges tags + auto j = a.add_two(b, h); + EXPECT_EQ(j.get_origin_tag(), all_merged_tag); + + // Normalize preserves tag + + EXPECT_EQ(j.normalize().get_origin_tag(), j.get_origin_tag()); + + // is_zero preserves tag + + EXPECT_EQ(a.is_zero().get_origin_tag(), a.get_origin_tag()); + + // equals/not equals operator merges tags + + EXPECT_EQ((a == b).get_origin_tag(), first_two_merged_tag); + EXPECT_EQ((a != b).get_origin_tag(), first_two_merged_tag); + + // Conditionals merge tags + + auto k = bool_ct(witness_ct(&builder, 1)); + k.set_origin_tag(next_challenge_tag); + auto l = a.conditional_negate(k); + EXPECT_EQ(l.get_origin_tag(), first_and_third_merged_tag); + + auto m = field_ct::conditional_assign(k, a, b); + EXPECT_EQ(m.get_origin_tag(), all_merged_tag); + + // Accumulate merges tags + const size_t MAX_ACCUMULATED_ELEMENTS = 16; + std::vector elements; + std::vector accumulated_tags; + for (size_t index = 0; index < MAX_ACCUMULATED_ELEMENTS; index++) { + const auto current_tag = OriginTag(parent_id, index >> 1, !(index & 1)); + if (index == 0) { + accumulated_tags.push_back(current_tag); + } else { + accumulated_tags.emplace_back(accumulated_tags[index - 1], current_tag); + } + auto element = field_ct(witness_ct(&builder, bb::fr::random_element())); + element.set_origin_tag(current_tag); + elements.emplace_back(element); + } + + for (size_t index = MAX_ACCUMULATED_ELEMENTS - 1; index > 0; index--) { + EXPECT_EQ(field_ct::accumulate(elements).get_origin_tag(), accumulated_tags[index]); + elements.pop_back(); + } + + // Slice preserves tags + auto n = a.slice(1, 0); + for (const auto& element : n) { + EXPECT_EQ(element.get_origin_tag(), submitted_value_origin_tag); + } + + // Decomposition preserves tags + + auto decomposed_bits = a.decompose_into_bits(256); + for (const auto& bit : decomposed_bits) { + EXPECT_EQ(bit.get_origin_tag(), submitted_value_origin_tag); + } + + // Conversions + + auto o = field_ct(witness_ct(&builder, 1)); + o.set_origin_tag(submitted_value_origin_tag); + auto p = bool_ct(o); + EXPECT_EQ(p.get_origin_tag(), submitted_value_origin_tag); + + o.set_origin_tag(challenge_origin_tag); + o = field_ct(p); + + EXPECT_EQ(o.get_origin_tag(), submitted_value_origin_tag); + + auto q = field_ct(witness_ct(&builder, fr::random_element())); + auto poisoned_tag = challenge_origin_tag; + poisoned_tag.poison(); + q.set_origin_tag(poisoned_tag); +#ifndef NDEBUG + EXPECT_THROW(q + q, std::runtime_error); +#endif + } }; using CircuitTypes = testing::Types; @@ -1077,3 +1211,8 @@ TYPED_TEST(stdlib_field, test_ranged_less_than) { TestFixture::test_ranged_less_than(); } + +TYPED_TEST(stdlib_field, test_origin_tag_consistency) +{ + TestFixture::test_origin_tag_consistency(); +} diff --git a/barretenberg/cpp/src/barretenberg/stdlib/protogalaxy_verifier/protogalaxy_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/protogalaxy_verifier/protogalaxy_recursive_verifier.cpp index 36a27699d38..67199413f86 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/protogalaxy_verifier/protogalaxy_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/protogalaxy_verifier/protogalaxy_recursive_verifier.cpp @@ -109,16 +109,10 @@ std::shared_ptr ProtogalaxyRecursiv } // Instantiate the template with specific flavors and builders -template class ProtogalaxyRecursiveVerifier_< - RecursiveDeciderVerificationKeys_, 2>>; template class ProtogalaxyRecursiveVerifier_< RecursiveDeciderVerificationKeys_, 2>>; -template class ProtogalaxyRecursiveVerifier_< - RecursiveDeciderVerificationKeys_, 2>>; template class ProtogalaxyRecursiveVerifier_< RecursiveDeciderVerificationKeys_, 2>>; -template class ProtogalaxyRecursiveVerifier_< - RecursiveDeciderVerificationKeys_, 2>>; template class ProtogalaxyRecursiveVerifier_< RecursiveDeciderVerificationKeys_, 2>>; diff --git a/barretenberg/cpp/src/barretenberg/stdlib/protogalaxy_verifier/protogalaxy_recursive_verifier.hpp b/barretenberg/cpp/src/barretenberg/stdlib/protogalaxy_verifier/protogalaxy_recursive_verifier.hpp index 4cde2740f6d..5dcd59716c3 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/protogalaxy_verifier/protogalaxy_recursive_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/protogalaxy_verifier/protogalaxy_recursive_verifier.hpp @@ -5,7 +5,6 @@ #include "barretenberg/stdlib/protogalaxy_verifier/recursive_decider_verification_keys.hpp" #include "barretenberg/stdlib/transcript/transcript.hpp" #include "barretenberg/stdlib_circuit_builders/mega_recursive_flavor.hpp" -#include "barretenberg/stdlib_circuit_builders/ultra_recursive_flavor.hpp" #include "barretenberg/ultra_honk/decider_keys.hpp" namespace bb::stdlib::recursion::honk { diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp index 2c1f44c617e..038a69793c4 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp @@ -142,23 +142,14 @@ class MegaFlavor { static constexpr CircuitType CIRCUIT_TYPE = CircuitBuilder::CIRCUIT_TYPE; - auto get_selectors() + auto get_non_gate_selectors() { return RefArray{ q_m, q_c, q_l, q_r, q_o, q_4 }; }; + auto get_gate_selectors() { - return RefArray{ q_m, - q_c, - q_l, - q_r, - q_o, - q_4, - q_arith, - q_delta_range, - q_elliptic, - q_aux, - q_lookup, - q_busread, - q_poseidon2_external, - q_poseidon2_internal }; - }; + return RefArray{ q_arith, q_delta_range, q_elliptic, q_aux, + q_lookup, q_busread, q_poseidon2_external, q_poseidon2_internal }; + } + auto get_selectors() { return concatenate(get_non_gate_selectors(), get_gate_selectors()); } + auto get_sigma_polynomials() { return RefArray{ sigma_1, sigma_2, sigma_3, sigma_4 }; }; auto get_id_polynomials() { return RefArray{ id_1, id_2, id_3, id_4 }; }; auto get_table_polynomials() { return RefArray{ table_1, table_2, table_3, table_4 }; }; @@ -322,6 +313,8 @@ class MegaFlavor { DEFINE_COMPOUND_GET_ALL(PrecomputedEntities, WitnessEntities, ShiftedEntities) auto get_wires() { return WitnessEntities::get_wires(); }; + auto get_non_gate_selectors() { return PrecomputedEntities::get_non_gate_selectors(); } + auto get_gate_selectors() { return PrecomputedEntities::get_gate_selectors(); } auto get_selectors() { return PrecomputedEntities::get_selectors(); } auto get_sigmas() { return PrecomputedEntities::get_sigma_polynomials(); }; auto get_ids() { return PrecomputedEntities::get_id_polynomials(); }; @@ -431,8 +424,7 @@ class MegaFlavor { ProvingKey(const size_t circuit_size, const size_t num_public_inputs, std::shared_ptr commitment_key = nullptr) - : Base(circuit_size, num_public_inputs, commitment_key) - , polynomials(circuit_size){}; + : Base(circuit_size, num_public_inputs, commitment_key){}; std::vector memory_read_records; std::vector memory_write_records; @@ -541,7 +533,7 @@ class MegaFlavor { VerificationKey(const VerificationKey& vk) = default; - VerificationKey(ProvingKey& proving_key) + void set_metadata(ProvingKey& proving_key) { this->pcs_verification_key = std::make_shared(); this->circuit_size = proving_key.circuit_size; @@ -553,7 +545,11 @@ class MegaFlavor { // Databus commitment propagation data this->databus_propagation_data = proving_key.databus_propagation_data; + } + VerificationKey(ProvingKey& proving_key) + { + set_metadata(proving_key); for (auto [polynomial, commitment] : zip_view(proving_key.polynomials.get_precomputed(), this->get_all())) { commitment = proving_key.commitment_key->commit(polynomial); } @@ -876,8 +872,9 @@ class MegaFlavor { Commitment lookup_read_tags_comm; std::vector> sumcheck_univariates; std::array sumcheck_evaluations; - std::vector zm_cq_comms; - Commitment zm_cq_comm; + std::vector gemini_fold_comms; + std::vector gemini_fold_evals; + Commitment shplonk_q_comm; Commitment kzg_w_comm; Transcript_() = default; @@ -942,10 +939,14 @@ class MegaFlavor { num_frs_read)); } sumcheck_evaluations = deserialize_from_buffer>(proof_data, num_frs_read); + for (size_t i = 0; i < CONST_PROOF_SIZE_LOG_N - 1; ++i) { + gemini_fold_comms.push_back(deserialize_from_buffer(proof_data, num_frs_read)); + } for (size_t i = 0; i < CONST_PROOF_SIZE_LOG_N; ++i) { - zm_cq_comms.push_back(deserialize_from_buffer(proof_data, num_frs_read)); + gemini_fold_evals.push_back(deserialize_from_buffer(proof_data, num_frs_read)); } - zm_cq_comm = deserialize_from_buffer(proof_data, num_frs_read); + shplonk_q_comm = deserialize_from_buffer(proof_data, num_frs_read); + kzg_w_comm = deserialize_from_buffer(proof_data, num_frs_read); } @@ -987,10 +988,13 @@ class MegaFlavor { serialize_to_buffer(sumcheck_univariates[i], proof_data); } serialize_to_buffer(sumcheck_evaluations, proof_data); + for (size_t i = 0; i < CONST_PROOF_SIZE_LOG_N - 1; ++i) { + serialize_to_buffer(gemini_fold_comms[i], proof_data); + } for (size_t i = 0; i < CONST_PROOF_SIZE_LOG_N; ++i) { - serialize_to_buffer(zm_cq_comms[i], proof_data); + serialize_to_buffer(gemini_fold_evals[i], proof_data); } - serialize_to_buffer(zm_cq_comm, proof_data); + serialize_to_buffer(shplonk_q_comm, proof_data); serialize_to_buffer(kzg_w_comm, proof_data); ASSERT(proof_data.size() == old_proof_length); diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/permutation_lib.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/permutation_lib.test.cpp index 18eddd125e2..0999c063ca4 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/permutation_lib.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/permutation_lib.test.cpp @@ -75,6 +75,9 @@ TEST_F(PermutationHelperTests, ComputeHonkStyleSigmaLagrangePolynomialsFromMappi // TODO(#425) Flesh out these tests auto mapping = compute_permutation_mapping(circuit_constructor, proving_key.get(), {}); + for (auto& sigma : proving_key->polynomials.get_sigmas()) { + sigma = typename Flavor::Polynomial(proving_key->circuit_size); + } compute_honk_style_permutation_lagrange_polynomials_from_mapping( proving_key->polynomials.get_sigmas(), mapping.sigmas, proving_key.get()); } diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_flavor.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_flavor.hpp index b40174ce164..2d465928a03 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_flavor.hpp @@ -142,22 +142,14 @@ class UltraFlavor { static constexpr CircuitType CIRCUIT_TYPE = CircuitBuilder::CIRCUIT_TYPE; - auto get_selectors() + auto get_non_gate_selectors() { return RefArray{ q_m, q_c, q_l, q_r, q_o, q_4 }; } + auto get_gate_selectors() { - return RefArray{ q_m, - q_c, - q_l, - q_r, - q_o, - q_4, - q_arith, - q_delta_range, - q_elliptic, - q_aux, - q_lookup, - q_poseidon2_external, - q_poseidon2_internal }; - }; + return RefArray{ q_arith, q_delta_range, q_elliptic, q_aux, + q_lookup, q_poseidon2_external, q_poseidon2_internal }; + } + auto get_selectors() { return concatenate(get_non_gate_selectors(), get_gate_selectors()); } + auto get_sigma_polynomials() { return RefArray{ sigma_1, sigma_2, sigma_3, sigma_4 }; }; auto get_id_polynomials() { return RefArray{ id_1, id_2, id_3, id_4 }; }; auto get_table_polynomials() { return RefArray{ table_1, table_2, table_3, table_4 }; }; @@ -242,6 +234,8 @@ class UltraFlavor { DEFINE_COMPOUND_GET_ALL(PrecomputedEntities, WitnessEntities, ShiftedEntities) auto get_wires() { return WitnessEntities::get_wires(); }; + auto get_non_gate_selectors() { return PrecomputedEntities::get_non_gate_selectors(); } + auto get_gate_selectors() { return PrecomputedEntities::get_gate_selectors(); } auto get_selectors() { return PrecomputedEntities::get_selectors(); } auto get_sigmas() { return PrecomputedEntities::get_sigma_polynomials(); }; auto get_ids() { return PrecomputedEntities::get_id_polynomials(); }; @@ -299,7 +293,10 @@ class UltraFlavor { ProverPolynomials() = default; ProverPolynomials(size_t circuit_size) { + +#ifdef TRACY_MEMORY ZoneScopedN("creating empty prover polys"); +#endif for (auto& poly : get_to_be_shifted()) { poly = Polynomial{ /*memory size*/ circuit_size - 1, /*largest possible index*/ circuit_size, @@ -349,8 +346,7 @@ class UltraFlavor { ProvingKey(const size_t circuit_size, const size_t num_public_inputs, std::shared_ptr commitment_key = nullptr) - : Base(circuit_size, num_public_inputs, std::move(commitment_key)) - , polynomials(circuit_size){}; + : Base(circuit_size, num_public_inputs, std::move(commitment_key)){}; std::vector memory_read_records; std::vector memory_write_records; @@ -565,7 +561,10 @@ class UltraFlavor { PartiallyEvaluatedMultivariates() = default; PartiallyEvaluatedMultivariates(const size_t circuit_size) { + +#ifdef TRACY_MEMORY ZoneScopedN("PartiallyEvaluatedMultivariates constructor"); +#endif // Storage is only needed after the first partial evaluation, hence polynomials of // size (n / 2) for (auto& poly : this->get_all()) { @@ -721,10 +720,10 @@ class UltraFlavor { Commitment lookup_inverses_comm; std::vector> sumcheck_univariates; std::array sumcheck_evaluations; - std::vector zm_cq_comms; - Commitment zm_cq_comm; + std::vector gemini_fold_comms; + std::vector gemini_fold_evals; + Commitment shplonk_q_comm; Commitment kzg_w_comm; - Transcript() = default; // Used by verifier to initialize the transcript @@ -778,10 +777,14 @@ class UltraFlavor { num_frs_read)); } sumcheck_evaluations = deserialize_from_buffer>(proof_data, num_frs_read); + for (size_t i = 0; i < CONST_PROOF_SIZE_LOG_N - 1; ++i) { + gemini_fold_comms.push_back(deserialize_from_buffer(proof_data, num_frs_read)); + } for (size_t i = 0; i < CONST_PROOF_SIZE_LOG_N; ++i) { - zm_cq_comms.push_back(deserialize_from_buffer(proof_data, num_frs_read)); + gemini_fold_evals.push_back(deserialize_from_buffer(proof_data, num_frs_read)); } - zm_cq_comm = deserialize_from_buffer(proof_data, num_frs_read); + shplonk_q_comm = deserialize_from_buffer(proof_data, num_frs_read); + kzg_w_comm = deserialize_from_buffer(proof_data, num_frs_read); } @@ -813,10 +816,13 @@ class UltraFlavor { serialize_to_buffer(sumcheck_univariates[i], proof_data); } serialize_to_buffer(sumcheck_evaluations, proof_data); + for (size_t i = 0; i < CONST_PROOF_SIZE_LOG_N - 1; ++i) { + serialize_to_buffer(gemini_fold_comms[i], proof_data); + } for (size_t i = 0; i < CONST_PROOF_SIZE_LOG_N; ++i) { - serialize_to_buffer(zm_cq_comms[i], proof_data); + serialize_to_buffer(gemini_fold_evals[i], proof_data); } - serialize_to_buffer(zm_cq_comm, proof_data); + serialize_to_buffer(shplonk_q_comm, proof_data); serialize_to_buffer(kzg_w_comm, proof_data); // sanity check to make sure we generate the same length of proof as before. diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp index fccab56b551..5b7e8df06b2 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp @@ -209,7 +209,10 @@ template class SumcheckProver { auto round_univariate = round.compute_univariate( round_idx, full_polynomials, relation_parameters, gate_separators, alpha, zk_sumcheck_data); { + +#ifdef TRACY_MEMORY ZoneScopedN("rest of sumcheck round 1"); +#endif // Place the evaluations of the round univariate into transcript. transcript->send_to_verifier("Sumcheck:univariate_0", round_univariate); @@ -227,7 +230,10 @@ template class SumcheckProver { // We operate on partially_evaluated_polynomials in place. } for (size_t round_idx = 1; round_idx < multivariate_d; round_idx++) { + +#ifdef TRACY_MEMORY ZoneScopedN("sumcheck loop"); +#endif // Write the round univariate to the transcript round_univariate = round.compute_univariate(round_idx, partially_evaluated_polynomials, @@ -737,6 +743,7 @@ template class SumcheckVerifier { if constexpr (IsRecursiveFlavor) { typename Flavor::CircuitBuilder* builder = round_challenge.get_context(); + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1114): insecure! stdlib::bool_t dummy_round = stdlib::witness_t(builder, round_idx >= multivariate_d); bool checked = round.check_sum(round_univariate, dummy_round); // Only utilize the checked value if this is not a constant proof size padding round diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp index 4e9d11108af..30ca1b0d536 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp @@ -66,7 +66,10 @@ template class SumcheckProverRound { SumcheckProverRound(size_t initial_round_size) : round_size(initial_round_size) { + +#ifdef TRACY_MEMORY ZoneScopedN("SumcheckProverRound constructor"); +#endif // Initialize univariate accumulators to 0 Utils::zero_univariates(univariate_accumulators); } @@ -161,7 +164,10 @@ template class SumcheckProverRound { const RelationSeparator alpha, std::optional> zk_sumcheck_data = std::nullopt) // only submitted when Flavor HasZK { + +#ifdef TRACY_MEMORY ZoneScopedN("compute_univariate"); +#endif BB_OP_COUNT_TIME(); // Determine number of threads for multithreading. diff --git a/barretenberg/cpp/src/barretenberg/transcript/origin_tag.cpp b/barretenberg/cpp/src/barretenberg/transcript/origin_tag.cpp new file mode 100644 index 00000000000..6ed00361c11 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/transcript/origin_tag.cpp @@ -0,0 +1,42 @@ +#include "barretenberg/transcript/origin_tag.hpp" +#include "barretenberg/common/throw_or_abort.hpp" +#include "barretenberg/numeric/uint256/uint256.hpp" + +namespace bb { +using namespace numeric; +#ifndef NDEBUG + +/** + * @brief Detect if two elements from the same transcript are performing a suspicious interaction + * + * @details For now this detects that 2 elements from 2 different round can't mingle without a challenge in between + * + * @param tag_a + * @param tag_b + */ +void check_child_tags(const uint256_t& tag_a, const uint256_t& tag_b) +{ + const uint128_t* challenges_a = (const uint128_t*)(&tag_a.data[2]); + const uint128_t* challenges_b = (const uint128_t*)(&tag_b.data[2]); + + const uint128_t* submitted_a = (const uint128_t*)(&tag_a.data[0]); + const uint128_t* submitted_b = (const uint128_t*)(&tag_b.data[0]); + + if (*challenges_a == 0 && *challenges_b == 0 && *submitted_a != 0 && *submitted_b != 0 && + *submitted_a != *submitted_b) { + throw_or_abort("Submitted values from 2 different rounds are mixing without challenges"); + } +} + +bool OriginTag::operator==(const OriginTag& other) const +{ + return this->parent_tag == other.parent_tag && this->child_tag == other.child_tag && + this->instant_death == other.instant_death; +} +#else +bool OriginTag::operator==(const OriginTag&) const +{ + return true; +} +#endif +} // namespace bb \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/transcript/origin_tag.hpp b/barretenberg/cpp/src/barretenberg/transcript/origin_tag.hpp new file mode 100644 index 00000000000..8cd008831ae --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/transcript/origin_tag.hpp @@ -0,0 +1,149 @@ +#pragma once +/** + * @file origin_tag.hpp + * @author Rumata888 + * @brief This file contains part of the logic for the Origin Tag mechanism that tracks the use of in-circuit primitives + * through tainting (common term meaning adding information that allows to track value origins) them. It then allows us + * to detect dangerous behaviours in-circuit. The mechanism is only enabled in DEBUG builds + * + */ +#include "barretenberg/common/throw_or_abort.hpp" +#include "barretenberg/numeric/uint256/uint256.hpp" +#include +#include + +namespace bb { + +void check_child_tags(const uint256_t& tag_a, const uint256_t& tag_b); + +#ifndef NDEBUG +struct OriginTag { + static constexpr size_t CONSTANT = 0; + // Parent tag is supposed to represent the index of a unique trancript object that generated the value. It uses a + // concrete index, not bits for now, since we never expect two different indices to be used in the same computation + // apart from equality assertion + size_t parent_tag; + + // Child tag specifies which submitted values and challenges have been used to generate this element + // The lower 128 bits represent using a submitted value from a corresponding round (the shift represents the round) + // The higher 128 bits represent using a challenge value from an corresponding round (the shift represents the + // round) + numeric::uint256_t child_tag; + + // Instant death is used for poisoning values we should never use in arithmetic + bool instant_death = false; + // Default Origin Tag has everything set to zero and can't cause any issues + OriginTag() = default; + OriginTag(const OriginTag& other) = default; + OriginTag(OriginTag&& other) = default; + OriginTag& operator=(const OriginTag& other) = default; + OriginTag& operator=(OriginTag&& other) noexcept + { + + parent_tag = other.parent_tag; + child_tag = other.child_tag; + instant_death = other.instant_death; + return *this; + } + /** + * @brief Construct a new Origin Tag object + * + * @param parent_index The index of the transcript object + * @param child_index The round in which we generate/receive the value + * @param is_submitted If the value is submitted by the prover (not a challenge) + */ + OriginTag(size_t parent_index, size_t child_index, bool is_submitted = true) + : parent_tag(parent_index) + , child_tag((static_cast(1) << (child_index + (is_submitted ? 0 : 128)))) + { + ASSERT(child_index < 128); + } + + /** + * @brief Construct a new Origin Tag by merging two other Origin Tags + * + * @details The function checks for 3 things: 1) The no tag has instant death set, 2) That tags are from the same + * transcript (same parent tag) or are empty, 3) A complex check for the child tags. After that the child tags are + * merged and we create a new Origin Tag + * @param tag_a + * @param tag_b + */ + OriginTag(const OriginTag& tag_a, const OriginTag& tag_b) + { + if (tag_a.instant_death || tag_b.instant_death) { + throw_or_abort("Touched an element that should not have been touched"); + } + if (tag_a.parent_tag != tag_b.parent_tag && (tag_a.parent_tag != 0U) && (tag_b.parent_tag != 0U)) { + throw_or_abort("Tags from different transcripts were involved in the same computation"); + } + check_child_tags(tag_a.child_tag, tag_b.child_tag); + parent_tag = tag_a.parent_tag; + child_tag = tag_a.child_tag | tag_b.child_tag; + } + + /** + * @brief Construct a new Origin Tag from merging several origin tags + * + * @details Basically performs the same actions as the constructor from 2 Origin Tags, but iteratively + * + * @tparam T + * @param tag + * @param rest + */ + template OriginTag(const OriginTag& tag, const T&... rest) + { + parent_tag = tag.parent_tag; + child_tag = tag.child_tag; + if (tag.instant_death) { + throw_or_abort("Touched an element that should not have been touched"); + } + for (const auto& next_tag : { rest... }) { + if (next_tag.instant_death) { + throw_or_abort("Touched an element that should not have been touched"); + } + if (parent_tag != next_tag.parent_tag && (parent_tag != 0U) && (next_tag.parent_tag != 0U)) { + throw_or_abort("Tags from different transcripts were involved in the same computation"); + } + check_child_tags(child_tag, next_tag.child_tag); + child_tag |= next_tag.child_tag; + } + } + ~OriginTag() = default; + bool operator==(const OriginTag& other) const; + void poison() { instant_death = true; } + void unpoison() { instant_death = false; } + bool is_poisoned() const { return instant_death; } + bool is_empty() const { return !instant_death && parent_tag == 0 && child_tag == uint256_t(0); }; +}; +inline std::ostream& operator<<(std::ostream& os, OriginTag const& v) +{ + return os << "{ p_t: " << v.parent_tag << ", ch_t" << v.child_tag << ", instadeath: " << v.instant_death << " }"; +} + +#else + +struct OriginTag { + OriginTag() = default; + OriginTag(const OriginTag& other) = default; + OriginTag(OriginTag&& other) = default; + OriginTag& operator=(const OriginTag& other) = default; + OriginTag& operator=(OriginTag&& other) = default; + + OriginTag(size_t, size_t, bool is_submitted [[maybe_unused]] = true) {} + + OriginTag(const OriginTag&, const OriginTag&) {} + template OriginTag(const OriginTag&, const T&...) {} + bool operator==(const OriginTag& other) const; + void poison() {} + void unpoison() {} + bool is_poisoned() const { return false; } + bool is_empty() const { return true; }; +}; +inline std::ostream& operator<<(std::ostream& os, OriginTag const&) +{ + return os << "{ Origin Tag tracking is disabled in release builds }"; +} +#endif +} // namespace bb +template +concept usesTag = requires(T x, const bb::OriginTag& tag) { x.set_origin_tag(tag); }; \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_keys.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_keys.hpp index e6ef907c622..49b72bbd0e2 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_keys.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_keys.hpp @@ -53,19 +53,18 @@ template struct DeciderProvingKeys_ { * @tparam skip_count Construct univariates that skip some of the indices when computing results * @return The univariates whose extensions will be used to construct the combiner. */ - template auto row_to_univariates(size_t row_idx) const + template auto row_to_univariates(size_t row_idx) const { auto prover_polynomials_views = get_polynomials_views(); - std::array, prover_polynomials_views[0].size()> results; + std::array, prover_polynomials_views[0].size()> results; // Set the size corresponding to the number of rows in the execution trace - size_t pk_idx = 0; // Iterate over the prover polynomials' views corresponding to each proving key - for (auto& get_all : prover_polynomials_views) { + for (size_t dpk_idx = 0; auto& get_all : prover_polynomials_views) { // Iterate over all columns in the trace execution of an proving key and extract their value at row_idx. for (auto [result, poly_ptr] : zip_view(results, get_all)) { - result.evaluations[pk_idx] = poly_ptr[row_idx]; + result.evaluations[dpk_idx] = poly_ptr[row_idx]; } - pk_idx++; + dpk_idx++; } return results; } diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_prover.cpp index e8063431f7d..0e1bfae71a8 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_prover.cpp @@ -31,7 +31,10 @@ template void DeciderProver_::execute_relation_ch size_t polynomial_size = proving_key->proving_key.circuit_size; auto sumcheck = Sumcheck(polynomial_size, transcript); { + +#ifdef TRACY_MEMORY ZoneScopedN("sumcheck.prove"); +#endif sumcheck_output = sumcheck.prove(proving_key->proving_key.polynomials, proving_key->relation_parameters, proving_key->alphas, @@ -49,28 +52,13 @@ template void DeciderProver_::execute_pcs_rounds( { using OpeningClaim = ProverOpeningClaim; - // TODO(https://github.com/AztecProtocol/barretenberg/issues/1109): Remove this hack once the verifier runs on - // Shplemini for all Ultra flavors - OpeningClaim prover_opening_claim; - if constexpr (bb::IsAnyOf) { - - prover_opening_claim = ShpleminiProver_::prove(proving_key->proving_key.circuit_size, - proving_key->proving_key.polynomials.get_unshifted(), - proving_key->proving_key.polynomials.get_to_be_shifted(), - sumcheck_output.challenge, - commitment_key, - transcript); - } else { - - prover_opening_claim = ZeroMorphProver_::prove(proving_key->proving_key.circuit_size, - proving_key->proving_key.polynomials.get_unshifted(), - proving_key->proving_key.polynomials.get_to_be_shifted(), - sumcheck_output.claimed_evaluations.get_unshifted(), - sumcheck_output.claimed_evaluations.get_shifted(), - sumcheck_output.challenge, - commitment_key, - transcript); - } + const OpeningClaim prover_opening_claim = + ShpleminiProver_::prove(proving_key->proving_key.circuit_size, + proving_key->proving_key.polynomials.get_unshifted(), + proving_key->proving_key.polynomials.get_to_be_shifted(), + sumcheck_output.challenge, + commitment_key, + transcript); PCS::compute_opening_proof(commitment_key, prover_opening_claim, transcript); } diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.cpp index 1dcdaad737b..cac01ed0c47 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.cpp @@ -4,13 +4,14 @@ #include "barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp" namespace bb { + /** * @brief Helper method to compute quantities like total number of gates and dyadic circuit size * * @tparam Flavor * @param circuit */ -template size_t DeciderProvingKey_::compute_dyadic_size(Circuit& circuit) +template size_t DeciderProvingKey_::compute_dyadic_size(Circuit& circuit) { // for the lookup argument the circuit size must be at least as large as the sum of all tables used const size_t min_size_due_to_lookups = circuit.get_tables_size(); @@ -23,7 +24,6 @@ template size_t DeciderProvingKey_::compute_dyadic_size(C // The number of gates is the maximum required by the lookup argument or everything else, plus an optional zero row // to allow for shifts. - size_t num_zero_rows = Flavor::has_zero_row ? 1 : 0; size_t total_num_gates = num_zero_rows + std::max(min_size_due_to_lookups, min_size_of_execution_trace); // Next power of 2 (dyadic circuit size) @@ -37,17 +37,17 @@ template size_t DeciderProvingKey_::compute_dyadic_size(C * @tparam Flavor * @param circuit */ -template +template void DeciderProvingKey_::construct_databus_polynomials(Circuit& circuit) requires IsGoblinFlavor { - auto& public_calldata = proving_key.polynomials.calldata; + auto& calldata_poly = proving_key.polynomials.calldata; auto& calldata_read_counts = proving_key.polynomials.calldata_read_counts; auto& calldata_read_tags = proving_key.polynomials.calldata_read_tags; - auto& public_secondary_calldata = proving_key.polynomials.secondary_calldata; + auto& secondary_calldata_poly = proving_key.polynomials.secondary_calldata; auto& secondary_calldata_read_counts = proving_key.polynomials.secondary_calldata_read_counts; auto& secondary_calldata_read_tags = proving_key.polynomials.secondary_calldata_read_tags; - auto& public_return_data = proving_key.polynomials.return_data; + auto& return_data_poly = proving_key.polynomials.return_data; auto& return_data_read_counts = proving_key.polynomials.return_data_read_counts; auto& return_data_read_tags = proving_key.polynomials.return_data_read_tags; @@ -57,18 +57,18 @@ void DeciderProvingKey_::construct_databus_polynomials(Circuit& circuit) // Note: We do not utilize a zero row for databus columns for (size_t idx = 0; idx < calldata.size(); ++idx) { - public_calldata.at(idx) = circuit.get_variable(calldata[idx]); // calldata values + calldata_poly.at(idx) = circuit.get_variable(calldata[idx]); // calldata values calldata_read_counts.at(idx) = calldata.get_read_count(idx); // read counts calldata_read_tags.at(idx) = calldata_read_counts[idx] > 0 ? 1 : 0; // has row been read or not } for (size_t idx = 0; idx < secondary_calldata.size(); ++idx) { - public_secondary_calldata.at(idx) = circuit.get_variable(secondary_calldata[idx]); // secondary_calldata values - secondary_calldata_read_counts.at(idx) = secondary_calldata.get_read_count(idx); // read counts + secondary_calldata_poly.at(idx) = circuit.get_variable(secondary_calldata[idx]); // secondary_calldata values + secondary_calldata_read_counts.at(idx) = secondary_calldata.get_read_count(idx); // read counts secondary_calldata_read_tags.at(idx) = secondary_calldata_read_counts[idx] > 0 ? 1 : 0; // has row been read or not } for (size_t idx = 0; idx < return_data.size(); ++idx) { - public_return_data.at(idx) = circuit.get_variable(return_data[idx]); // return data values + return_data_poly.at(idx) = circuit.get_variable(return_data[idx]); // return data values return_data_read_counts.at(idx) = return_data.get_read_count(idx); // read counts return_data_read_tags.at(idx) = return_data_read_counts[idx] > 0 ? 1 : 0; // has row been read or not } diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.hpp index fa2e344b5a3..2bfd069a5a4 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.hpp @@ -20,7 +20,7 @@ namespace bb { * @details This is the equivalent of ω in the paper. */ -template class DeciderProvingKey_ { +template class DeciderProvingKey_ { using Circuit = typename Flavor::CircuitBuilder; using ProvingKey = typename Flavor::ProvingKey; using VerificationKey = typename Flavor::VerificationKey; @@ -61,6 +61,10 @@ template class DeciderProvingKey_ { dyadic_circuit_size = compute_dyadic_size(circuit); // set dyadic size directly from circuit block sizes } + // Complete the public inputs execution trace block from circuit.public_inputs + Trace::populate_public_inputs_block(circuit); + circuit.blocks.compute_offsets(is_structured); + // TODO(https://github.com/AztecProtocol/barretenberg/issues/905): This is adding ops to the op queue but NOT to // the circuit, meaning the ECCVM/Translator will use different ops than the main circuit. This will lead to // failure once https://github.com/AztecProtocol/barretenberg/issues/746 is resolved. @@ -68,30 +72,213 @@ template class DeciderProvingKey_ { circuit.op_queue->append_nonzero_ops(); } { + +#ifdef TRACY_MEMORY ZoneScopedN("constructing proving key"); +#endif proving_key = ProvingKey(dyadic_circuit_size, circuit.public_inputs.size(), commitment_key); + if (IsGoblinFlavor && !is_structured) { + // Allocate full size polynomials + proving_key.polynomials = typename Flavor::ProverPolynomials(dyadic_circuit_size); + } else { // Allocate only a correct amount of memory for each polynomial + // Allocate the wires and selectors polynomials + { +#ifdef TRACY_MEMORY + ZoneScopedN("allocating wires"); +#endif + for (auto& wire : proving_key.polynomials.get_wires()) { + wire = Polynomial::shiftable(proving_key.circuit_size); + } + } + { +#ifdef TRACY_MEMORY + ZoneScopedN("allocating gate selectors"); +#endif + // Define gate selectors over the block they are isolated to + for (auto [selector, block] : + zip_view(proving_key.polynomials.get_gate_selectors(), circuit.blocks.get_gate_blocks())) { + + // TODO(https://github.com/AztecProtocol/barretenberg/issues/914): q_arith is currently used + // in aux block. + if (&block == &circuit.blocks.arithmetic) { + size_t arith_size = circuit.blocks.aux.trace_offset - + circuit.blocks.arithmetic.trace_offset + + circuit.blocks.aux.get_fixed_size(is_structured); + selector = Polynomial( + arith_size, proving_key.circuit_size, circuit.blocks.arithmetic.trace_offset); + } else { + selector = Polynomial( + block.get_fixed_size(is_structured), proving_key.circuit_size, block.trace_offset); + } + } + } + { +#ifdef TRACY_MEMORY + ZoneScopedN("allocating non-gate selectors"); +#endif + // Set the other non-gate selector polynomials to full size + for (auto& selector : proving_key.polynomials.get_non_gate_selectors()) { + selector = Polynomial(proving_key.circuit_size); + } + } + if constexpr (IsGoblinFlavor) { +#ifdef TRACY_MEMORY + ZoneScopedN("allocating ecc op wires and selector"); +#endif + // Allocate the ecc op wires and selector + const size_t ecc_op_block_size = circuit.blocks.ecc_op.get_fixed_size(is_structured); + const size_t op_wire_offset = Flavor::has_zero_row ? 1 : 0; + for (auto& wire : proving_key.polynomials.get_ecc_op_wires()) { + wire = Polynomial(ecc_op_block_size, proving_key.circuit_size, op_wire_offset); + } + proving_key.polynomials.lagrange_ecc_op = + Polynomial(ecc_op_block_size, proving_key.circuit_size, op_wire_offset); + } + + if constexpr (HasDataBus) { + proving_key.polynomials.calldata = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + proving_key.polynomials.calldata_read_counts = + Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + proving_key.polynomials.calldata_read_tags = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + proving_key.polynomials.secondary_calldata = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + proving_key.polynomials.secondary_calldata_read_counts = + Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + proving_key.polynomials.secondary_calldata_read_tags = + Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + proving_key.polynomials.return_data = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + proving_key.polynomials.return_data_read_counts = + Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + proving_key.polynomials.return_data_read_tags = + Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1107): Restricting databus_id to + // databus_size leads to failure. + // const size_t databus_size = std::max({ calldata.size(), secondary_calldata.size(), + // return_data.size() }); + proving_key.polynomials.databus_id = Polynomial(proving_key.circuit_size, proving_key.circuit_size); + } + const size_t max_tables_size = + std::min(static_cast(MAX_LOOKUP_TABLES_SIZE), dyadic_circuit_size - 1); + size_t table_offset = dyadic_circuit_size - max_tables_size; + { +#ifdef TRACY_MEMORY + ZoneScopedN("allocating table polynomials"); +#endif + ASSERT(dyadic_circuit_size > max_tables_size); + + // Allocate the table polynomials + if constexpr (IsHonkFlavor) { + for (auto& poly : proving_key.polynomials.get_tables()) { + poly = typename Flavor::Polynomial(max_tables_size, dyadic_circuit_size, table_offset); + } + } + } + { +#ifdef TRACY_MEMORY + ZoneScopedN("allocating sigmas and ids"); +#endif + for (auto& sigma : proving_key.polynomials.get_sigmas()) { + sigma = typename Flavor::Polynomial(proving_key.circuit_size); + } + for (auto& id : proving_key.polynomials.get_ids()) { + id = typename Flavor::Polynomial(proving_key.circuit_size); + } + } + { + ZoneScopedN("allocating lookup read counts and tags"); + // Allocate the read counts and tags polynomials + proving_key.polynomials.lookup_read_counts = + typename Flavor::Polynomial(max_tables_size, dyadic_circuit_size, table_offset); + proving_key.polynomials.lookup_read_tags = + typename Flavor::Polynomial(max_tables_size, dyadic_circuit_size, table_offset); + } + { + ZoneScopedN("allocating lookup and databus inverses"); + // Allocate the lookup_inverses polynomial + const size_t lookup_offset = static_cast(circuit.blocks.lookup.trace_offset); + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1033): construct tables and counts + // at top of trace + const size_t table_offset = + dyadic_circuit_size - + std::min(dyadic_circuit_size - 1, static_cast(MAX_LOOKUP_TABLES_SIZE)); + const size_t lookup_inverses_start = std::min(lookup_offset, table_offset); + const size_t lookup_inverses_end = + std::min(dyadic_circuit_size, + std::max(lookup_offset + circuit.blocks.lookup.get_fixed_size(is_structured), + table_offset + MAX_LOOKUP_TABLES_SIZE)); + proving_key.polynomials.lookup_inverses = Polynomial( + lookup_inverses_end - lookup_inverses_start, dyadic_circuit_size, lookup_inverses_start); + if constexpr (HasDataBus) { + const size_t q_busread_end = + circuit.blocks.busread.trace_offset + circuit.blocks.busread.get_fixed_size(is_structured); + // Allocate the databus inverse polynomials + proving_key.polynomials.calldata_inverses = + Polynomial(std::max(circuit.get_calldata().size(), q_busread_end), dyadic_circuit_size); + proving_key.polynomials.secondary_calldata_inverses = Polynomial( + std::max(circuit.get_secondary_calldata().size(), q_busread_end), dyadic_circuit_size); + proving_key.polynomials.return_data_inverses = + Polynomial(std::max(circuit.get_return_data().size(), q_busread_end), dyadic_circuit_size); + } + } + { +#ifdef TRACY_MEMORY + ZoneScopedN("constructing z_perm"); +#endif + // Allocate the z_perm polynomial + proving_key.polynomials.z_perm = Polynomial::shiftable(proving_key.circuit_size); + } + + { +#ifdef TRACY_MEMORY + ZoneScopedN("allocating lagrange polynomials"); +#endif + // First and last lagrange polynomials (in the full circuit size) + proving_key.polynomials.lagrange_first = Polynomial(1, dyadic_circuit_size, 0); + proving_key.polynomials.lagrange_last = Polynomial(1, dyadic_circuit_size, dyadic_circuit_size - 1); + } + } + // We can finally set the shifted polynomials now that all of the to_be_shifted polynomials are + // defined. + proving_key.polynomials.set_shifted(); // Ensure shifted wires are set correctly } // Construct and add to proving key the wire, selector and copy constraint polynomials Trace::populate(circuit, proving_key, is_structured); + +#ifdef TRACY_MEMORY ZoneScopedN("constructing prover instance after trace populate"); +#endif // If Goblin, construct the databus polynomials if constexpr (IsGoblinFlavor) { +#ifdef TRACY_MEMORY + ZoneScopedN("constructing databus polynomials"); +#endif construct_databus_polynomials(circuit); } - // First and last lagrange polynomials (in the full circuit size) + // Set the lagrange polynomials proving_key.polynomials.lagrange_first.at(0) = 1; proving_key.polynomials.lagrange_last.at(dyadic_circuit_size - 1) = 1; - construct_lookup_table_polynomials(proving_key.polynomials.get_tables(), circuit, dyadic_circuit_size); + { +#ifdef TRACY_MEMORY + ZoneScopedN("constructing lookup table polynomials"); +#endif + construct_lookup_table_polynomials( + proving_key.polynomials.get_tables(), circuit, dyadic_circuit_size); + } - construct_lookup_read_counts(proving_key.polynomials.lookup_read_counts, - proving_key.polynomials.lookup_read_tags, - circuit, - dyadic_circuit_size); + { +#ifdef TRACY_MEMORY + ZoneScopedN("constructing lookup read counts"); +#endif + construct_lookup_read_counts(proving_key.polynomials.lookup_read_counts, + proving_key.polynomials.lookup_read_tags, + circuit, + dyadic_circuit_size); + } // Construct the public inputs array for (size_t i = 0; i < proving_key.num_public_inputs; ++i) { @@ -122,10 +309,10 @@ template class DeciderProvingKey_ { * @brief Compute dyadic size based on a structured trace with fixed block size * */ - size_t compute_structured_dyadic_size(Circuit& builder) + size_t compute_structured_dyadic_size(Circuit& circuit) { - size_t minimum_size = builder.blocks.get_total_structured_size(); - return builder.get_circuit_subgroup_size(minimum_size); + size_t minimum_size = circuit.blocks.get_total_structured_size(); + return circuit.get_circuit_subgroup_size(minimum_size); } void construct_databus_polynomials(Circuit&) diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_verifier.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_verifier.cpp index 477ac93c297..763c74c6a62 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_verifier.cpp @@ -39,8 +39,6 @@ template bool DeciderVerifier_::verify() { using PCS = typename Flavor::PCS; using Curve = typename Flavor::Curve; - using GroupElement = typename Curve::Element; - using ZeroMorph = ZeroMorphVerifier_; using Shplemini = ShpleminiVerifier_; using VerifierCommitments = typename Flavor::VerifierCommitments; @@ -58,32 +56,15 @@ template bool DeciderVerifier_::verify() return false; } - std::array pairing_points; - // TODO(https://github.com/AztecProtocol/barretenberg/issues/1109): Remove this hack once the verifier runs on - // Shplemini for all Ultra flavors - if constexpr (bb::IsAnyOf) { - const auto opening_claim = Shplemini::compute_batch_opening_claim(accumulator->verification_key->circuit_size, - commitments.get_unshifted(), - commitments.get_to_be_shifted(), - claimed_evaluations.get_unshifted(), - claimed_evaluations.get_shifted(), - multivariate_challenge, - Commitment::one(), - transcript); - pairing_points = PCS::reduce_verify_batch_opening_claim(opening_claim, transcript); - } else { - // Execute ZeroMorph rounds. See https://hackmd.io/dlf9xEwhTQyE3hiGbq4FsA?view for a complete description of the - // unrolled protocol. - const auto opening_claim = ZeroMorph::verify(accumulator->verification_key->circuit_size, - commitments.get_unshifted(), - commitments.get_to_be_shifted(), - claimed_evaluations.get_unshifted(), - claimed_evaluations.get_shifted(), - multivariate_challenge, - Commitment::one(), - transcript); - pairing_points = PCS::reduce_verify(opening_claim, transcript); - } + const auto opening_claim = Shplemini::compute_batch_opening_claim(accumulator->verification_key->circuit_size, + commitments.get_unshifted(), + commitments.get_to_be_shifted(), + claimed_evaluations.get_unshifted(), + claimed_evaluations.get_shifted(), + multivariate_challenge, + Commitment::one(), + transcript); + const auto pairing_points = PCS::reduce_verify_batch_opening_claim(opening_claim, transcript); bool verified = pcs_verification_key->pairing_check(pairing_points[0], pairing_points[1]); return sumcheck_verified.value() && verified; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp index 94754892919..461ef54a403 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp @@ -107,15 +107,21 @@ class MegaTranscriptTests : public ::testing::Test { manifest_expected.add_challenge(round, "rho"); round++; - for (size_t i = 0; i < CONST_PROOF_SIZE_LOG_N; ++i) { + for (size_t i = 1; i < CONST_PROOF_SIZE_LOG_N; ++i) { + std::string idx = std::to_string(i); + manifest_expected.add_entry(round, "Gemini:FOLD_" + idx, frs_per_G); + } + manifest_expected.add_challenge(round, "Gemini:r"); + round++; + for (size_t i = 1; i <= CONST_PROOF_SIZE_LOG_N; ++i) { std::string idx = std::to_string(i); - manifest_expected.add_entry(round, "ZM:C_q_" + idx, frs_per_G); + manifest_expected.add_entry(round, "Gemini:a_" + idx, frs_per_Fr); } - manifest_expected.add_challenge(round, "ZM:y"); + manifest_expected.add_challenge(round, "Shplonk:nu"); round++; - manifest_expected.add_entry(round, "ZM:C_q", frs_per_G); - manifest_expected.add_challenge(round, "ZM:x", "ZM:z"); + manifest_expected.add_entry(round, "Shplonk:Q", frs_per_G); + manifest_expected.add_challenge(round, "Shplonk:z"); round++; manifest_expected.add_entry(round, "KZG:W", frs_per_G); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp index 26e0f1cca5a..8498c12a2f3 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp @@ -14,29 +14,44 @@ namespace bb { template void OinkProver::prove() { { + +#ifdef TRACY_MEMORY ZoneScopedN("execute_preamble_round"); +#endif // Add circuit size public input size and public inputs to transcript-> execute_preamble_round(); } { + +#ifdef TRACY_MEMORY ZoneScopedN("execute_wire_commitments_round"); +#endif // Compute first three wire commitments execute_wire_commitments_round(); } { + +#ifdef TRACY_MEMORY ZoneScopedN("execute_sorted_list_accumulator_round"); +#endif // Compute sorted list accumulator and commitment execute_sorted_list_accumulator_round(); } { + +#ifdef TRACY_MEMORY ZoneScopedN("execute_log_derivative_inverse_round"); +#endif // Fiat-Shamir: beta & gamma execute_log_derivative_inverse_round(); } { + +#ifdef TRACY_MEMORY ZoneScopedN("execute_grand_product_computation_round"); +#endif // Compute grand product(s) and commitments. execute_grand_product_computation_round(); } @@ -98,7 +113,7 @@ template void OinkProver::execute_wire_commitment commitment_labels.get_ecc_op_wires())) { { BB_OP_COUNT_TIME_NAME("COMMIT::ecc_op_wires"); - commitment = commitment_key->commit_sparse(polynomial); + commitment = commitment_key->commit(polynomial); } transcript->send_to_verifier(domain_separator + label, commitment); } @@ -110,7 +125,7 @@ template void OinkProver::execute_wire_commitment commitment_labels.get_databus_entities())) { { BB_OP_COUNT_TIME_NAME("COMMIT::databus"); - commitment = commitment_key->commit_sparse(polynomial); + commitment = commitment_key->commit(polynomial); } transcript->send_to_verifier(domain_separator + label, commitment); } @@ -197,6 +212,7 @@ template void OinkProver::execute_log_derivative_ template void OinkProver::execute_grand_product_computation_round() { BB_OP_COUNT_TIME_NAME("OinkProver::execute_grand_product_computation_round"); + // Compute the permutation and lookup grand product polynomials proving_key->proving_key.compute_grand_product_polynomials(proving_key->relation_parameters); { diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_transcript.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_transcript.test.cpp index 29b4c87172e..147db031ead 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_transcript.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_transcript.test.cpp @@ -92,15 +92,21 @@ class UltraTranscriptTests : public ::testing::Test { manifest_expected.add_challenge(round, "rho"); round++; - for (size_t i = 0; i < CONST_PROOF_SIZE_LOG_N; ++i) { + for (size_t i = 1; i < CONST_PROOF_SIZE_LOG_N; ++i) { + std::string idx = std::to_string(i); + manifest_expected.add_entry(round, "Gemini:FOLD_" + idx, frs_per_G); + } + manifest_expected.add_challenge(round, "Gemini:r"); + round++; + for (size_t i = 1; i <= CONST_PROOF_SIZE_LOG_N; ++i) { std::string idx = std::to_string(i); - manifest_expected.add_entry(round, "ZM:C_q_" + idx, frs_per_G); + manifest_expected.add_entry(round, "Gemini:a_" + idx, frs_per_Fr); } - manifest_expected.add_challenge(round, "ZM:y"); + manifest_expected.add_challenge(round, "Shplonk:nu"); round++; - manifest_expected.add_entry(round, "ZM:C_q", frs_per_G); - manifest_expected.add_challenge(round, "ZM:x", "ZM:z"); + manifest_expected.add_entry(round, "Shplonk:Q", frs_per_G); + manifest_expected.add_challenge(round, "Shplonk:z"); round++; manifest_expected.add_entry(round, "KZG:W", frs_per_G); diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/verifier.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/verifier.cpp index 9f974702495..49bc491c708 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/generated/verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/verifier.cpp @@ -38,8 +38,7 @@ inline FF AvmVerifier::evaluate_public_input_column(const std::vector& point * @brief This function verifies an Avm Honk proof for given program settings. * */ -bool AvmVerifier::verify_proof(const HonkProof& proof, - [[maybe_unused]] const std::vector>& public_inputs) +bool AvmVerifier::verify_proof(const HonkProof& proof, const std::vector>& public_inputs) { using Flavor = AvmFlavor; using FF = Flavor::FF; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/recursion/avm_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/recursion/avm_recursive_verifier.cpp index 9148e568668..562b630e715 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/recursion/avm_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/recursion/avm_recursive_verifier.cpp @@ -1,7 +1,14 @@ #include "barretenberg/vm/avm/recursion/avm_recursive_verifier.hpp" #include "barretenberg/commitment_schemes/zeromorph/zeromorph.hpp" #include "barretenberg/plonk_honk_shared/types/aggregation_object_type.hpp" +#include "barretenberg/polynomials/polynomial.hpp" +#include "barretenberg/polynomials/shared_shifted_virtual_zeroes_array.hpp" +#include "barretenberg/stdlib/primitives/field/field.hpp" #include "barretenberg/transcript/transcript.hpp" +#include "barretenberg/vm/aztec_constants.hpp" +#include +#include +#include namespace bb { @@ -18,18 +25,51 @@ AvmRecursiveVerifier_::AvmRecursiveVerifier_(Builder* builder, const std , builder(builder) {} +// Evaluate the given public input column over the multivariate challenge points template -AvmRecursiveVerifier_::AggregationObject AvmRecursiveVerifier_::verify_proof(const HonkProof& proof, - AggregationObject agg_obj) +Flavor::FF AvmRecursiveVerifier_::evaluate_public_input_column(const std::vector& points, + const std::vector& challenges) +{ + auto coefficients = SharedShiftedVirtualZeroesArray{ + .start_ = 0, + .end_ = points.size(), + .virtual_size_ = key->circuit_size, // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays) + .backing_memory_ = std::static_pointer_cast(get_mem_slab(sizeof(FF) * points.size())), + }; + + memcpy( + static_cast(coefficients.data()), static_cast(points.data()), sizeof(FF) * points.size()); + + return generic_evaluate_mle(challenges, coefficients); +} + +template +AvmRecursiveVerifier_::AggregationObject AvmRecursiveVerifier_::verify_proof( + const HonkProof& proof, const std::vector>& public_inputs_vec_nt, AggregationObject agg_obj) { StdlibProof stdlib_proof = bb::convert_proof_to_witness(builder, proof); - return verify_proof(stdlib_proof, agg_obj); + + std::vector> public_inputs_ct; + public_inputs_ct.reserve(public_inputs_vec_nt.size()); + + for (const auto& vec : public_inputs_vec_nt) { + std::vector vec_ct; + vec_ct.reserve(vec.size()); + for (const auto& el : vec) { + vec_ct.push_back(bb::stdlib::witness_t(builder, el)); + } + public_inputs_ct.push_back(vec_ct); + } + + return verify_proof(stdlib_proof, public_inputs_ct, agg_obj); } // TODO(#991): (see https://github.com/AztecProtocol/barretenberg/issues/991) template AvmRecursiveVerifier_::AggregationObject AvmRecursiveVerifier_::verify_proof( - const StdlibProof& stdlib_proof, AggregationObject agg_obj) + const StdlibProof& stdlib_proof, + const std::vector>& public_inputs, + AggregationObject agg_obj) { using Curve = typename Flavor::Curve; using Zeromorph = ZeroMorphVerifier_; @@ -82,6 +122,32 @@ AvmRecursiveVerifier_::AggregationObject AvmRecursiveVerifier_:: vinfo("verified sumcheck: ", (sumcheck_verified.has_value() && sumcheck_verified.value())); + // Public columns evaluation checks + std::vector mle_challenge(multivariate_challenge.begin(), + multivariate_challenge.begin() + static_cast(log_circuit_size)); + + FF main_kernel_inputs_evaluation = evaluate_public_input_column(public_inputs[0], mle_challenge); + main_kernel_inputs_evaluation.assert_equal(claimed_evaluations.main_kernel_inputs, + "main_kernel_inputs_evaluation failed"); + + FF main_kernel_value_out_evaluation = evaluate_public_input_column(public_inputs[1], mle_challenge); + main_kernel_value_out_evaluation.assert_equal(claimed_evaluations.main_kernel_value_out, + "main_kernel_value_out_evaluation failed"); + + FF main_kernel_side_effect_out_evaluation = evaluate_public_input_column(public_inputs[2], mle_challenge); + main_kernel_side_effect_out_evaluation.assert_equal(claimed_evaluations.main_kernel_side_effect_out, + "main_kernel_side_effect_out_evaluation failed"); + + FF main_kernel_metadata_out_evaluation = evaluate_public_input_column(public_inputs[3], mle_challenge); + main_kernel_metadata_out_evaluation.assert_equal(claimed_evaluations.main_kernel_metadata_out, + "main_kernel_metadata_out_evaluation failed"); + + FF main_calldata_evaluation = evaluate_public_input_column(public_inputs[4], mle_challenge); + main_calldata_evaluation.assert_equal(claimed_evaluations.main_calldata, "main_calldata_evaluation failed"); + + FF main_returndata_evaluation = evaluate_public_input_column(public_inputs[5], mle_challenge); + main_returndata_evaluation.assert_equal(claimed_evaluations.main_returndata, "main_returndata_evaluation failed"); + auto opening_claim = Zeromorph::verify(circuit_size, commitments.get_unshifted(), commitments.get_to_be_shifted(), diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/recursion/avm_recursive_verifier.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/recursion/avm_recursive_verifier.hpp index 15ddd48f56d..38584040419 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/recursion/avm_recursive_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/recursion/avm_recursive_verifier.hpp @@ -24,11 +24,18 @@ template class AvmRecursiveVerifier_ { const std::shared_ptr& native_verification_key); explicit AvmRecursiveVerifier_(Builder* builder, const std::shared_ptr& vkey); - AggregationObject verify_proof(const HonkProof& proof, AggregationObject agg_obj); - AggregationObject verify_proof(const StdlibProof& stdlib_proof, AggregationObject agg_obj); + AggregationObject verify_proof(const HonkProof& proof, + const std::vector>& public_inputs_vec_nt, + AggregationObject agg_obj); + AggregationObject verify_proof(const StdlibProof& stdlib_proof, + const std::vector>& public_inputs, + AggregationObject agg_obj); std::shared_ptr key; Builder* builder; std::shared_ptr transcript; + + private: + FF evaluate_public_input_column(const std::vector& points, const std::vector& challenges); }; } // namespace bb \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/recursion/avm_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/recursion/avm_recursive_verifier.test.cpp index 946cd2e15fb..5280e49e616 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/recursion/avm_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/recursion/avm_recursive_verifier.test.cpp @@ -42,9 +42,9 @@ class AvmRecursiveTests : public ::testing::Test { static void SetUpTestSuite() { bb::srs::init_crs_factory("../srs_db/ignition"); } // Generate an extremely simple avm trace - static AvmCircuitBuilder generate_avm_circuit() + static AvmCircuitBuilder generate_avm_circuit(VmPublicInputsNT public_inputs) { - AvmTraceBuilder trace_builder(generate_base_public_inputs()); + AvmTraceBuilder trace_builder(public_inputs); AvmCircuitBuilder builder; trace_builder.op_set(0, 1, 1, AvmMemoryTag::U8); @@ -63,14 +63,14 @@ class AvmRecursiveTests : public ::testing::Test { TEST_F(AvmRecursiveTests, recursion) { - AvmCircuitBuilder circuit_builder = generate_avm_circuit(); + const auto public_inputs = generate_base_public_inputs(); + AvmCircuitBuilder circuit_builder = generate_avm_circuit(public_inputs); AvmComposer composer = AvmComposer(); InnerProver prover = composer.create_prover(circuit_builder); InnerVerifier verifier = composer.create_verifier(circuit_builder); HonkProof proof = prover.construct_proof(); - auto public_inputs = generate_base_public_inputs(); std::vector> public_inputs_vec = bb::avm_trace::copy_public_inputs_columns(public_inputs, {}, {}); @@ -85,7 +85,7 @@ TEST_F(AvmRecursiveTests, recursion) auto agg_object = stdlib::recursion::init_default_aggregation_state(outer_circuit); - auto agg_output = recursive_verifier.verify_proof(proof, agg_object); + auto agg_output = recursive_verifier.verify_proof(proof, public_inputs_vec, agg_object); bool agg_output_valid = verification_key->pcs_verification_key->pairing_check(agg_output.P0.get_value(), agg_output.P1.get_value()); diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/arithmetic.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/arithmetic.test.cpp index aae3a07fd72..f2ffca82aa6 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/arithmetic.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/arithmetic.test.cpp @@ -211,7 +211,7 @@ class AvmArithmeticTests : public ::testing::Test { srs::init_crs_factory("../srs_db/ignition"); } - VmPublicInputs public_inputs; + VmPublicInputsNT public_inputs; AvmTraceBuilder trace_builder; void gen_trace_builder(std::vector const& calldata) diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/bitwise.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/bitwise.test.cpp index 3debc937021..a6de859dddb 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/bitwise.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/bitwise.test.cpp @@ -356,7 +356,7 @@ class AvmBitwiseTests : public ::testing::Test { srs::init_crs_factory("../srs_db/ignition"); } - VmPublicInputs public_inputs; + VmPublicInputsNT public_inputs; AvmTraceBuilder trace_builder; std::vector gen_mutated_trace_not(FF const& a, FF const& c_mutated, avm_trace::AvmMemoryTag tag) diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/cast.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/cast.test.cpp index d93abc2872d..e88fdbd36f3 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/cast.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/cast.test.cpp @@ -23,7 +23,7 @@ class AvmCastTests : public ::testing::Test { srs::init_crs_factory("../srs_db/ignition"); } - VmPublicInputs public_inputs; + VmPublicInputsNT public_inputs; AvmTraceBuilder trace_builder; std::vector calldata; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/comparison.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/comparison.test.cpp index 463a281f600..758d5fcd205 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/comparison.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/comparison.test.cpp @@ -93,7 +93,7 @@ class AvmCmpTests : public ::testing::Test { srs::init_crs_factory("../srs_db/ignition"); } - VmPublicInputs public_inputs; + VmPublicInputsNT public_inputs; AvmTraceBuilder trace_builder; }; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/control_flow.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/control_flow.test.cpp index 51120ff94c8..160bccf7800 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/control_flow.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/control_flow.test.cpp @@ -46,7 +46,7 @@ class AvmControlFlowTests : public ::testing::Test { srs::init_crs_factory("../srs_db/ignition"); } - VmPublicInputs public_inputs; + VmPublicInputsNT public_inputs; AvmTraceBuilder trace_builder; }; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/execution.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/execution.test.cpp index 7a8c3cb6a36..a8d7ff9580e 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/execution.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/execution.test.cpp @@ -27,12 +27,12 @@ using bb::utils::hex_to_bytes; class AvmExecutionTests : public ::testing::Test { public: std::vector public_inputs_vec; - VmPublicInputs public_inputs; + VmPublicInputsNT public_inputs; AvmExecutionTests() : public_inputs_vec(PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH) { - Execution::set_trace_builder_constructor([](VmPublicInputs public_inputs, + Execution::set_trace_builder_constructor([](VmPublicInputsNT public_inputs, ExecutionHints execution_hints, uint32_t side_effect_counter, std::vector calldata) { @@ -52,7 +52,7 @@ class AvmExecutionTests : public ::testing::Test { srs::init_crs_factory("../srs_db/ignition"); public_inputs_vec.at(DA_START_GAS_LEFT_PCPI_OFFSET) = DEFAULT_INITIAL_DA_GAS; public_inputs_vec.at(L2_START_GAS_LEFT_PCPI_OFFSET) = DEFAULT_INITIAL_L2_GAS; - public_inputs = Execution::convert_public_inputs(public_inputs_vec); + public_inputs = convert_public_inputs(public_inputs_vec); }; /** @@ -1723,7 +1723,7 @@ TEST_F(AvmExecutionTests, kernelInputOpcodes) std::ranges::find_if(trace.begin(), trace.end(), [](Row r) { return r.main_sel_op_is_static_call == 1; }); EXPECT_EQ(is_static_call_row->main_ia, is_static_call); - validate_trace(std::move(trace), Execution::convert_public_inputs(public_inputs_vec), calldata, returndata); + validate_trace(std::move(trace), convert_public_inputs(public_inputs_vec), calldata, returndata); } // Positive test for L2GASLEFT opcode @@ -1912,13 +1912,16 @@ TEST_F(AvmExecutionTests, kernelOutputEmitOpcodes) FF expected_hash = FF(std::string("0x006db65fd59fd356f6729140571b5bcd6bb3b83492a16e1bf0a3884442fc3c8a")); EXPECT_EQ(emit_log_row->main_ia, expected_hash); EXPECT_EQ(emit_log_row->main_side_effect_counter, 2); + // Value is 40 = 32 * log_length + 40 (and log_length is 0 in this case). + EXPECT_EQ(emit_log_row->main_ib, 40); uint32_t emit_log_out_offset = START_EMIT_UNENCRYPTED_LOG_WRITE_OFFSET; auto emit_log_kernel_out_row = std::ranges::find_if(trace.begin(), trace.end(), [&](Row r) { return r.main_clk == emit_log_out_offset; }); EXPECT_EQ(emit_log_kernel_out_row->main_kernel_value_out, expected_hash); EXPECT_EQ(emit_log_kernel_out_row->main_kernel_side_effect_out, 2); - feed_output(emit_log_out_offset, 1, 2, 0); + EXPECT_EQ(emit_log_kernel_out_row->main_kernel_metadata_out, 40); + feed_output(emit_log_out_offset, expected_hash, 2, 40); // CHECK SEND L2 TO L1 MSG auto send_row = diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/gas.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/gas.test.cpp index 6e5525fce18..c88bc8683fd 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/gas.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/gas.test.cpp @@ -36,7 +36,7 @@ void test_gas(StartGas startGas, OpcodesFunc apply_opcodes, CheckFunc check_trac kernel_inputs[L2_GAS_LEFT_CONTEXT_INPUTS_OFFSET] = FF(startGas.l2_gas); kernel_inputs[DA_GAS_LEFT_CONTEXT_INPUTS_OFFSET] = FF(startGas.da_gas); - VmPublicInputs public_inputs; + VmPublicInputsNT public_inputs; std::get<0>(public_inputs) = kernel_inputs; auto trace_builder = AvmTraceBuilder(public_inputs).set_full_precomputed_tables(false).set_range_check_required(false); diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/helpers.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/helpers.test.cpp index 90951a0e163..a1c7317d47d 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/helpers.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/helpers.test.cpp @@ -36,7 +36,7 @@ void validate_trace_check_circuit(std::vector&& trace) * @param trace The execution trace */ void validate_trace(std::vector&& trace, - VmPublicInputs const& public_inputs, + VmPublicInputsNT const& public_inputs, std::vector const& calldata, std::vector const& returndata, bool with_proof, @@ -118,9 +118,9 @@ void mutate_ic_in_trace(std::vector& trace, std::function&& sele mem_row->mem_val = newValue; }; -VmPublicInputs generate_base_public_inputs() +VmPublicInputsNT generate_base_public_inputs() { - VmPublicInputs public_inputs; + VmPublicInputsNT public_inputs; std::array kernel_inputs{}; kernel_inputs.at(DA_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_DA_GAS; kernel_inputs.at(L2_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_L2_GAS; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/helpers.test.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/helpers.test.hpp index 6eba2649c7d..b881588de1d 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/helpers.test.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/helpers.test.hpp @@ -25,14 +25,14 @@ using FF = bb::AvmFlavorSettings::FF; using Row = bb::AvmFullRow; using ThreeOpParam = std::array; using ThreeOpParamRow = std::tuple; -using VmPublicInputs = bb::avm_trace::VmPublicInputs; +using VmPublicInputsNT = bb::avm_trace::VmPublicInputs; // If the test is expecting a relation to fail, then use validate_trace_check_circuit. // Otherwise, use validate_trace with a single argument. If the proving needs to be // enabled all the time in a given test, use validate_trace with setting with_proof = true. void validate_trace_check_circuit(std::vector&& trace); void validate_trace(std::vector&& trace, - VmPublicInputs const& public_inputs = {}, + VmPublicInputsNT const& public_inputs = {}, std::vector const& calldata = {}, std::vector const& returndata = {}, bool with_proof = false, @@ -46,6 +46,6 @@ void update_slice_registers(Row& row, uint256_t a); std::vector gen_three_op_params(std::vector> operands, std::vector mem_tags); -VmPublicInputs generate_base_public_inputs(); +VmPublicInputsNT generate_base_public_inputs(); } // namespace tests_avm diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/indirect_mem.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/indirect_mem.test.cpp index 63ee094e9ab..eb9ddd455c3 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/indirect_mem.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/indirect_mem.test.cpp @@ -15,7 +15,7 @@ class AvmIndirectMemTests : public ::testing::Test { srs::init_crs_factory("../srs_db/ignition"); } - VmPublicInputs public_inputs; + VmPublicInputsNT public_inputs; AvmTraceBuilder trace_builder; }; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/inter_table.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/inter_table.test.cpp index 4edde8f1296..f2e9c17967e 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/inter_table.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/inter_table.test.cpp @@ -21,7 +21,7 @@ class AvmInterTableTests : public ::testing::Test { srs::init_crs_factory("../srs_db/ignition"); } - VmPublicInputs public_inputs; + VmPublicInputsNT public_inputs; AvmTraceBuilder trace_builder; }; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/kernel.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/kernel.test.cpp index 611e08dc34c..1ef1d921c3d 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/kernel.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/kernel.test.cpp @@ -30,9 +30,9 @@ class AvmKernelNegativeTests : public AvmKernelTests { using KernelInputs = std::array; const size_t INITIAL_GAS = 10000; -VmPublicInputs get_base_public_inputs() +VmPublicInputsNT get_base_public_inputs() { - VmPublicInputs public_inputs = {}; + VmPublicInputsNT public_inputs = {}; std::array kernel_inputs; for (size_t i = 0; i < KERNEL_INPUTS_LENGTH; i++) { @@ -49,9 +49,9 @@ VmPublicInputs get_base_public_inputs() return public_inputs; } -VmPublicInputs get_public_inputs_with_output(uint32_t output_offset, FF value, FF side_effect_counter, FF metadata) +VmPublicInputsNT get_public_inputs_with_output(uint32_t output_offset, FF value, FF side_effect_counter, FF metadata) { - VmPublicInputs public_inputs = get_base_public_inputs(); + VmPublicInputsNT public_inputs = get_base_public_inputs(); std::get(public_inputs)[output_offset] = value; std::get(public_inputs)[output_offset] = side_effect_counter; @@ -66,7 +66,7 @@ using CheckFunc = std::function&)>; void test_kernel_lookup(bool indirect, OpcodesFunc apply_opcodes, CheckFunc check_trace, - VmPublicInputs public_inputs = get_base_public_inputs(), + VmPublicInputsNT public_inputs = get_base_public_inputs(), ExecutionHints execution_hints = {}) { auto trace_builder = AvmTraceBuilder(public_inputs, std::move(execution_hints)) @@ -608,7 +608,7 @@ void negative_test_incorrect_ia_kernel_lookup(OpcodesFunc apply_opcodes, FF incorrect_ia, auto expected_message) { - VmPublicInputs public_inputs = get_base_public_inputs(); + VmPublicInputsNT public_inputs = get_base_public_inputs(); auto trace_builder = AvmTraceBuilder(public_inputs).set_full_precomputed_tables(false).set_range_check_required(false); @@ -956,7 +956,7 @@ TEST_F(AvmKernelOutputPositiveTests, kernelEmitNoteHash) check_kernel_outputs(trace.at(output_offset), value, /*side_effect_counter=*/0, /*metadata=*/0); }; - VmPublicInputs public_inputs = + VmPublicInputsNT public_inputs = get_public_inputs_with_output(output_offset, value, /*side_effect_counter=*/0, /*metadata*/ 0); test_kernel_lookup(false, direct_apply_opcodes, checks, public_inputs); test_kernel_lookup(true, indirect_apply_opcodes, checks, public_inputs); @@ -1000,7 +1000,7 @@ TEST_F(AvmKernelOutputPositiveTests, kernelEmitNullifier) check_kernel_outputs(trace.at(output_offset), value, /*side_effect_counter=*/0, /*metadata=*/0); }; - VmPublicInputs public_inputs = + VmPublicInputsNT public_inputs = get_public_inputs_with_output(output_offset, value, /*side_effect_counter=*/0, /*metadata*/ 0); test_kernel_lookup(false, direct_apply_opcodes, checks, public_inputs); test_kernel_lookup(true, indirect_apply_opcodes, checks, public_inputs); @@ -1051,7 +1051,7 @@ TEST_F(AvmKernelOutputPositiveTests, kernelEmitL2ToL1Msg) check_kernel_outputs(trace.at(output_offset), value, /*side_effect_counter=*/0, /*metadata=*/recipient); }; - VmPublicInputs public_inputs = + VmPublicInputsNT public_inputs = get_public_inputs_with_output(output_offset, value, /*side_effect_counter=*/0, recipient); test_kernel_lookup(false, direct_apply_opcodes, checks, std::move(public_inputs)); test_kernel_lookup(true, indirect_apply_opcodes, checks, std::move(public_inputs)); @@ -1093,7 +1093,8 @@ TEST_F(AvmKernelOutputPositiveTests, kernelEmitUnencryptedLog) check_kernel_outputs(trace.at(output_offset), value, 0, slot); }; - VmPublicInputs public_inputs = get_public_inputs_with_output(output_offset, value, /*side_effect_counter=*/0, slot); + VmPublicInputsNT public_inputs = + get_public_inputs_with_output(output_offset, value, /*side_effect_counter=*/0, slot); test_kernel_lookup(false, direct_apply_opcodes, checks, public_inputs); test_kernel_lookup(true, indirect_apply_opcodes, checks, public_inputs); } @@ -1137,7 +1138,8 @@ TEST_F(AvmKernelOutputPositiveTests, kernelSload) check_kernel_outputs(trace.at(output_offset), value, /*side_effect_counter=*/0, slot); }; - VmPublicInputs public_inputs = get_public_inputs_with_output(output_offset, value, /*side_effect_counter=*/0, slot); + VmPublicInputsNT public_inputs = + get_public_inputs_with_output(output_offset, value, /*side_effect_counter=*/0, slot); test_kernel_lookup(false, apply_opcodes, checks, std::move(public_inputs), execution_hints); } @@ -1179,7 +1181,8 @@ TEST_F(AvmKernelOutputPositiveTests, kernelSstore) check_kernel_outputs(trace.at(output_offset), value, /*side_effect_counter=*/0, slot); }; - VmPublicInputs public_inputs = get_public_inputs_with_output(output_offset, value, /*side_effect_counter=*/0, slot); + VmPublicInputsNT public_inputs = + get_public_inputs_with_output(output_offset, value, /*side_effect_counter=*/0, slot); test_kernel_lookup(false, apply_opcodes, checks, std::move(public_inputs)); } @@ -1228,7 +1231,7 @@ TEST_F(AvmKernelOutputPositiveTests, kernelNoteHashExists) check_kernel_outputs(trace.at(output_offset), value, /*side_effect_counter=*/0, exists); }; - VmPublicInputs public_inputs = + VmPublicInputsNT public_inputs = get_public_inputs_with_output(output_offset, value, /*side_effect_counter=*/0, exists); test_kernel_lookup(false, direct_apply_opcodes, checks, public_inputs, execution_hints); test_kernel_lookup(true, indirect_apply_opcodes, checks, public_inputs, execution_hints); @@ -1268,7 +1271,7 @@ TEST_F(AvmKernelOutputPositiveTests, kernelNullifierExists) check_kernel_outputs(trace.at(output_offset), value, /*side_effect_counter=*/0, exists); }; - VmPublicInputs public_inputs = + VmPublicInputsNT public_inputs = get_public_inputs_with_output(output_offset, value, /*side_effect_counter=*/0, exists); test_kernel_lookup(false, apply_opcodes, checks, std::move(public_inputs), execution_hints); } @@ -1307,7 +1310,7 @@ TEST_F(AvmKernelOutputPositiveTests, kernelNullifierNonExists) check_kernel_outputs(trace.at(output_offset), value, /*side_effect_counter=*/0, exists); }; - VmPublicInputs public_inputs = + VmPublicInputsNT public_inputs = get_public_inputs_with_output(output_offset, value, /*side_effect_counter=*/0, exists); test_kernel_lookup(false, apply_opcodes, checks, std::move(public_inputs), execution_hints); } @@ -1348,7 +1351,7 @@ TEST_F(AvmKernelOutputPositiveTests, kernelL1ToL2MsgExists) check_kernel_outputs(trace.at(output_offset), value, /*side_effect_counter=*/0, exists); }; - VmPublicInputs public_inputs = + VmPublicInputsNT public_inputs = get_public_inputs_with_output(output_offset, value, /*side_effect_counter=*/0, exists); test_kernel_lookup(false, apply_opcodes, checks, std::move(public_inputs), execution_hints); } diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/mem_opcodes.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/mem_opcodes.test.cpp index 74f3b934559..631c09d1cd4 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/mem_opcodes.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/mem_opcodes.test.cpp @@ -23,7 +23,7 @@ class AvmMemOpcodeTests : public ::testing::Test { srs::init_crs_factory("../srs_db/ignition"); } - VmPublicInputs public_inputs; + VmPublicInputsNT public_inputs; AvmTraceBuilder trace_builder; protected: diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/memory.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/memory.test.cpp index 245077021ef..67196ff92c2 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/memory.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/memory.test.cpp @@ -16,7 +16,7 @@ class AvmMemoryTests : public ::testing::Test { srs::init_crs_factory("../srs_db/ignition"); } - VmPublicInputs public_inputs; + VmPublicInputsNT public_inputs; AvmTraceBuilder trace_builder; }; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/slice.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/slice.test.cpp index 300b1ca935b..6150290123d 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/slice.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/slice.test.cpp @@ -115,7 +115,7 @@ class AvmSliceTests : public ::testing::Test { validate_trace(std::move(trace), public_inputs, calldata); } - VmPublicInputs public_inputs; + VmPublicInputsNT public_inputs; AvmTraceBuilder trace_builder; std::vector calldata; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/common.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/common.hpp index 1f5df25e342..6f838cf9557 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/common.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/common.hpp @@ -14,10 +14,11 @@ namespace bb::avm_trace { using FF = AvmFlavorSettings::FF; // There are 4 public input columns, 1 for context inputs, and 3 for emitting side effects -using VmPublicInputs = std::tuple, // Input: Kernel context inputs - std::array, // Output: Kernel outputs data - std::array, // Output: Kernel outputs side effects - std::array>; // Output: Kernel outputs metadata +template +using VmPublicInputs = std::tuple, // Input: Kernel context inputs + std::array, // Output: Kernel outputs data + std::array, // Output: Kernel outputs side effects + std::array>; // Output: Kernel outputs metadata // Constants for indexing into the tuple above static const size_t KERNEL_INPUTS = 0; static const size_t KERNEL_OUTPUTS_VALUE = 1; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/execution.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/execution.cpp index ea713ac51be..74d5d4797b2 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/execution.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/execution.cpp @@ -146,7 +146,7 @@ void show_trace_info(const auto& trace) } // namespace // Needed for dependency injection in tests. -Execution::TraceBuilderConstructor Execution::trace_builder_constructor = [](VmPublicInputs public_inputs, +Execution::TraceBuilderConstructor Execution::trace_builder_constructor = [](VmPublicInputs public_inputs, ExecutionHints execution_hints, uint32_t side_effect_counter, std::vector calldata) { @@ -229,157 +229,6 @@ std::tuple Execution::prove(std::vector const& public_inputs_vec) -{ - VmPublicInputs public_inputs; - - // Case where we pass in empty public inputs - this will be used in tests where they are not required - if (public_inputs_vec.empty()) { - return public_inputs; - } - - // Convert the public inputs into the VmPublicInputs object, the public inputs vec must be the correct length - else - // we throw an exception - if (public_inputs_vec.size() != PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH) { - throw_or_abort("Public inputs vector is not of PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH"); - } - - std::array& kernel_inputs = std::get(public_inputs); - - // Copy items from PublicCircuitPublicInputs vector to public input columns - // PublicCircuitPublicInputs - CallContext - kernel_inputs[SENDER_SELECTOR] = public_inputs_vec[SENDER_SELECTOR]; // Sender - // NOTE: address has same position as storage address (they are the same for now...) - // kernel_inputs[ADDRESS_SELECTOR] = public_inputs_vec[ADDRESS_SELECTOR]; // Address - kernel_inputs[STORAGE_ADDRESS_SELECTOR] = public_inputs_vec[STORAGE_ADDRESS_SELECTOR]; // Storage Address - kernel_inputs[FUNCTION_SELECTOR_SELECTOR] = public_inputs_vec[FUNCTION_SELECTOR_SELECTOR]; - kernel_inputs[IS_STATIC_CALL_SELECTOR] = public_inputs_vec[IS_STATIC_CALL_SELECTOR]; - - // PublicCircuitPublicInputs - GlobalVariables - kernel_inputs[CHAIN_ID_SELECTOR] = public_inputs_vec[CHAIN_ID_OFFSET]; // Chain ID - kernel_inputs[VERSION_SELECTOR] = public_inputs_vec[VERSION_OFFSET]; // Version - kernel_inputs[BLOCK_NUMBER_SELECTOR] = public_inputs_vec[BLOCK_NUMBER_OFFSET]; // Block Number - kernel_inputs[TIMESTAMP_SELECTOR] = public_inputs_vec[TIMESTAMP_OFFSET]; // Timestamp - // PublicCircuitPublicInputs - GlobalVariables - GasFees - kernel_inputs[FEE_PER_DA_GAS_SELECTOR] = public_inputs_vec[FEE_PER_DA_GAS_OFFSET]; - kernel_inputs[FEE_PER_L2_GAS_SELECTOR] = public_inputs_vec[FEE_PER_L2_GAS_OFFSET]; - - // Transaction fee - kernel_inputs[TRANSACTION_FEE_SELECTOR] = public_inputs_vec[TRANSACTION_FEE_OFFSET]; - - kernel_inputs[DA_GAS_LEFT_CONTEXT_INPUTS_OFFSET] = public_inputs_vec[DA_START_GAS_LEFT_PCPI_OFFSET]; - kernel_inputs[L2_GAS_LEFT_CONTEXT_INPUTS_OFFSET] = public_inputs_vec[L2_START_GAS_LEFT_PCPI_OFFSET]; - - // Copy the output columns - std::array& ko_values = std::get(public_inputs); - std::array& ko_side_effect = std::get(public_inputs); - std::array& ko_metadata = std::get(public_inputs); - - // We copy each type of the kernel outputs into their respective columns, each has differeing lengths / data - // For NOTEHASHEXISTS - for (size_t i = 0; i < MAX_NOTE_HASH_READ_REQUESTS_PER_CALL; i++) { - size_t dest_offset = START_NOTE_HASH_EXISTS_WRITE_OFFSET + i; - size_t pcpi_offset = PCPI_NOTE_HASH_EXISTS_OFFSET + (i * READ_REQUEST_LENGTH); - - ko_values[dest_offset] = public_inputs_vec[pcpi_offset]; - ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 1]; - } - // For NULLIFIEREXISTS - for (size_t i = 0; i < MAX_NULLIFIER_READ_REQUESTS_PER_CALL; i++) { - size_t dest_offset = START_NULLIFIER_EXISTS_OFFSET + i; - size_t pcpi_offset = PCPI_NULLIFIER_EXISTS_OFFSET + (i * READ_REQUEST_LENGTH); - - ko_values[dest_offset] = public_inputs_vec[pcpi_offset]; - ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 1]; - ko_metadata[dest_offset] = FF(1); - } - // For NULLIFIEREXISTS - non existent - for (size_t i = 0; i < MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL; i++) { - size_t dest_offset = START_NULLIFIER_NON_EXISTS_OFFSET + i; - size_t pcpi_offset = PCPI_NULLIFIER_NON_EXISTS_OFFSET + (i * READ_REQUEST_LENGTH); - - ko_values[dest_offset] = public_inputs_vec[pcpi_offset]; - ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 1]; - ko_metadata[dest_offset] = FF(0); - } - // For L1TOL2MSGEXISTS - for (size_t i = 0; i < MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL; i++) { - size_t dest_offset = START_L1_TO_L2_MSG_EXISTS_WRITE_OFFSET + i; - size_t pcpi_offset = PCPI_L1_TO_L2_MSG_READ_REQUESTS_OFFSET + (i * READ_REQUEST_LENGTH); - - ko_values[dest_offset] = public_inputs_vec[pcpi_offset]; - ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 1]; - } - // For SSTORE - for (size_t i = 0; i < MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL; i++) { - size_t dest_offset = START_SSTORE_WRITE_OFFSET + i; - size_t pcpi_offset = PCPI_PUBLIC_DATA_UPDATE_OFFSET + (i * CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH); - - // slot, value, side effect - ko_metadata[dest_offset] = public_inputs_vec[pcpi_offset]; - ko_values[dest_offset] = public_inputs_vec[pcpi_offset + 1]; - ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 2]; - } - // For SLOAD - for (size_t i = 0; i < MAX_PUBLIC_DATA_READS_PER_CALL; i++) { - size_t dest_offset = START_SLOAD_WRITE_OFFSET + i; - size_t pcpi_offset = PCPI_PUBLIC_DATA_READ_OFFSET + (i * CONTRACT_STORAGE_READ_LENGTH); - - // slot, value, side effect - ko_metadata[dest_offset] = public_inputs_vec[pcpi_offset]; - ko_values[dest_offset] = public_inputs_vec[pcpi_offset + 1]; - ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 2]; - } - // For EMITNOTEHASH - for (size_t i = 0; i < MAX_NOTE_HASHES_PER_CALL; i++) { - size_t dest_offset = START_EMIT_NOTE_HASH_WRITE_OFFSET + i; - size_t pcpi_offset = PCPI_NEW_NOTE_HASHES_OFFSET + (i * NOTE_HASH_LENGTH); - - ko_values[dest_offset] = public_inputs_vec[pcpi_offset]; - ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 1]; - } - // For EMITNULLIFIER - for (size_t i = 0; i < MAX_NULLIFIERS_PER_CALL; i++) { - size_t dest_offset = START_EMIT_NULLIFIER_WRITE_OFFSET + i; - size_t pcpi_offset = PCPI_NEW_NULLIFIERS_OFFSET + (i * NULLIFIER_LENGTH); - - ko_values[dest_offset] = public_inputs_vec[pcpi_offset]; - ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 1]; - } - // For EMITL2TOL1MSG - for (size_t i = 0; i < MAX_L2_TO_L1_MSGS_PER_CALL; i++) { - size_t dest_offset = START_EMIT_L2_TO_L1_MSG_WRITE_OFFSET + i; - size_t pcpi_offset = PCPI_NEW_L2_TO_L1_MSGS_OFFSET + (i * L2_TO_L1_MESSAGE_LENGTH); - - // Note: unorthadox order - ko_metadata[dest_offset] = public_inputs_vec[pcpi_offset]; - ko_values[dest_offset] = public_inputs_vec[pcpi_offset + 1]; - ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 2]; - } - // For EMITUNENCRYPTEDLOG - for (size_t i = 0; i < MAX_UNENCRYPTED_LOGS_PER_CALL; i++) { - size_t dest_offset = START_EMIT_UNENCRYPTED_LOG_WRITE_OFFSET + i; - size_t pcpi_offset = - PCPI_NEW_UNENCRYPTED_LOGS_OFFSET + (i * 3); // 3 because we have metadata, this is the window size - - ko_values[dest_offset] = public_inputs_vec[pcpi_offset]; - ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 1]; - ko_metadata[dest_offset] = public_inputs_vec[pcpi_offset + 2]; - } - - return public_inputs; -} - bool Execution::verify(AvmFlavor::VerificationKey vk, HonkProof const& proof) { AvmVerifier verifier(std::make_shared(vk)); @@ -403,7 +252,7 @@ bool Execution::verify(AvmFlavor::VerificationKey vk, HonkProof const& proof) std::copy(returndata_offset, raw_proof_offset, std::back_inserter(returndata)); std::copy(raw_proof_offset, proof.end(), std::back_inserter(raw_proof)); - VmPublicInputs public_inputs = convert_public_inputs(public_inputs_vec); + VmPublicInputs public_inputs = convert_public_inputs(public_inputs_vec); std::vector> public_inputs_columns = copy_public_inputs_columns(public_inputs, calldata, returndata); return verifier.verify_proof(raw_proof, public_inputs_columns); @@ -442,7 +291,7 @@ std::vector Execution::gen_trace(std::vector const& instructio vinfo("------- GENERATING TRACE -------"); // TODO(https://github.com/AztecProtocol/aztec-packages/issues/6718): construction of the public input columns // should be done in the kernel - this is stubbed and underconstrained - VmPublicInputs public_inputs = convert_public_inputs(public_inputs_vec); + VmPublicInputs public_inputs = convert_public_inputs(public_inputs_vec); uint32_t start_side_effect_counter = !public_inputs_vec.empty() ? static_cast(public_inputs_vec[PCPI_START_SIDE_EFFECT_COUNTER_OFFSET]) : 0; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/execution.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/execution.hpp index ae6863589d0..7c7c0ddf4ec 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/execution.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/execution.hpp @@ -15,7 +15,7 @@ namespace bb::avm_trace { class Execution { public: static constexpr size_t SRS_SIZE = 1 << 22; - using TraceBuilderConstructor = std::function public_inputs, ExecutionHints execution_hints, uint32_t side_effect_counter, std::vector calldata)>; @@ -24,8 +24,6 @@ class Execution { static std::vector getDefaultPublicInputs(); - static VmPublicInputs convert_public_inputs(std::vector const& public_inputs_vec); - // TODO: Clean these overloaded functions. We probably need less and confusing overloading. static std::vector gen_trace(std::vector const& instructions, std::vector& returndata, diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/helper.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/helper.cpp index 588e750a10b..fb4f575a4d6 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/helper.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/helper.cpp @@ -1,10 +1,8 @@ #include "barretenberg/vm/avm/trace/helper.hpp" - +#include "barretenberg/vm/avm/trace/mem_trace.hpp" #include #include -#include "barretenberg/vm/avm/trace/mem_trace.hpp" - namespace bb::avm_trace { template std::string field_to_string(const FF& ff) @@ -72,37 +70,6 @@ bool is_operand_indirect(uint8_t ind_value, uint8_t operand_idx) return (ind_value & (1 << operand_idx)) != 0; } -std::vector> copy_public_inputs_columns(VmPublicInputs const& public_inputs, - std::vector const& calldata, - std::vector const& returndata) -{ - // We convert to a vector as the pil generated verifier is generic and unaware of the KERNEL_INPUTS_LENGTH - // For each of the public input vectors - std::vector public_inputs_kernel_inputs(std::get(public_inputs).begin(), - std::get(public_inputs).end()); - std::vector public_inputs_kernel_value_outputs(std::get(public_inputs).begin(), - std::get(public_inputs).end()); - std::vector public_inputs_kernel_side_effect_outputs( - std::get(public_inputs).begin(), - std::get(public_inputs).end()); - std::vector public_inputs_kernel_metadata_outputs(std::get(public_inputs).begin(), - std::get(public_inputs).end()); - - assert(public_inputs_kernel_inputs.size() == KERNEL_INPUTS_LENGTH); - assert(public_inputs_kernel_value_outputs.size() == KERNEL_OUTPUTS_LENGTH); - assert(public_inputs_kernel_side_effect_outputs.size() == KERNEL_OUTPUTS_LENGTH); - assert(public_inputs_kernel_metadata_outputs.size() == KERNEL_OUTPUTS_LENGTH); - - return { - std::move(public_inputs_kernel_inputs), - std::move(public_inputs_kernel_value_outputs), - std::move(public_inputs_kernel_side_effect_outputs), - std::move(public_inputs_kernel_metadata_outputs), - calldata, - returndata, - }; -} - std::string to_hex(bb::avm_trace::AvmMemoryTag tag) { return to_hex(static_cast(tag)); diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/helper.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/helper.hpp index 91979bd4499..3b64afe1488 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/helper.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/helper.hpp @@ -12,14 +12,194 @@ void dump_trace_as_csv(const std::vector& trace, const std::filesystem::pat bool is_operand_indirect(uint8_t ind_value, uint8_t operand_idx); +/** + * @brief Convert Public Inputs + * + * **Transitional** + * Converts public inputs from the public inputs vec (PublicCircuitPublicInputs) into it's respective public input + * columns Which are represented by the `VmPublicInputs` object. + * + * @param public_inputs_vec + * @return VmPublicInputs + */ +template VmPublicInputs convert_public_inputs(std::vector const& public_inputs_vec) +{ + VmPublicInputs public_inputs; + + // Case where we pass in empty public inputs - this will be used in tests where they are not required + if (public_inputs_vec.empty()) { + return public_inputs; + } + + // Convert the public inputs into the VmPublicInputs object, the public inputs vec must be the correct length - else + // we throw an exception + if (public_inputs_vec.size() != PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH) { + throw_or_abort("Public inputs vector is not of PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH"); + } + + std::array& kernel_inputs = std::get(public_inputs); + + // Copy items from PublicCircuitPublicInputs vector to public input columns + // PublicCircuitPublicInputs - CallContext + kernel_inputs[SENDER_SELECTOR] = public_inputs_vec[SENDER_SELECTOR]; // Sender + // NOTE: address has same position as storage address (they are the same for now...) + // kernel_inputs[ADDRESS_SELECTOR] = public_inputs_vec[ADDRESS_SELECTOR]; // Address + kernel_inputs[STORAGE_ADDRESS_SELECTOR] = public_inputs_vec[STORAGE_ADDRESS_SELECTOR]; // Storage Address + kernel_inputs[FUNCTION_SELECTOR_SELECTOR] = public_inputs_vec[FUNCTION_SELECTOR_SELECTOR]; + kernel_inputs[IS_STATIC_CALL_SELECTOR] = public_inputs_vec[IS_STATIC_CALL_SELECTOR]; + + // PublicCircuitPublicInputs - GlobalVariables + kernel_inputs[CHAIN_ID_SELECTOR] = public_inputs_vec[CHAIN_ID_OFFSET]; // Chain ID + kernel_inputs[VERSION_SELECTOR] = public_inputs_vec[VERSION_OFFSET]; // Version + kernel_inputs[BLOCK_NUMBER_SELECTOR] = public_inputs_vec[BLOCK_NUMBER_OFFSET]; // Block Number + kernel_inputs[TIMESTAMP_SELECTOR] = public_inputs_vec[TIMESTAMP_OFFSET]; // Timestamp + // PublicCircuitPublicInputs - GlobalVariables - GasFees + kernel_inputs[FEE_PER_DA_GAS_SELECTOR] = public_inputs_vec[FEE_PER_DA_GAS_OFFSET]; + kernel_inputs[FEE_PER_L2_GAS_SELECTOR] = public_inputs_vec[FEE_PER_L2_GAS_OFFSET]; + + // Transaction fee + kernel_inputs[TRANSACTION_FEE_SELECTOR] = public_inputs_vec[TRANSACTION_FEE_OFFSET]; + + kernel_inputs[DA_GAS_LEFT_CONTEXT_INPUTS_OFFSET] = public_inputs_vec[DA_START_GAS_LEFT_PCPI_OFFSET]; + kernel_inputs[L2_GAS_LEFT_CONTEXT_INPUTS_OFFSET] = public_inputs_vec[L2_START_GAS_LEFT_PCPI_OFFSET]; + + // Copy the output columns + std::array& ko_values = std::get(public_inputs); + std::array& ko_side_effect = + std::get(public_inputs); + std::array& ko_metadata = std::get(public_inputs); + + // We copy each type of the kernel outputs into their respective columns, each has differeing lengths / data + // For NOTEHASHEXISTS + for (size_t i = 0; i < MAX_NOTE_HASH_READ_REQUESTS_PER_CALL; i++) { + size_t dest_offset = START_NOTE_HASH_EXISTS_WRITE_OFFSET + i; + size_t pcpi_offset = PCPI_NOTE_HASH_EXISTS_OFFSET + (i * READ_REQUEST_LENGTH); + + ko_values[dest_offset] = public_inputs_vec[pcpi_offset]; + ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 1]; + } + // For NULLIFIEREXISTS + for (size_t i = 0; i < MAX_NULLIFIER_READ_REQUESTS_PER_CALL; i++) { + size_t dest_offset = START_NULLIFIER_EXISTS_OFFSET + i; + size_t pcpi_offset = PCPI_NULLIFIER_EXISTS_OFFSET + (i * READ_REQUEST_LENGTH); + + ko_values[dest_offset] = public_inputs_vec[pcpi_offset]; + ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 1]; + ko_metadata[dest_offset] = FF(1); + } + // For NULLIFIEREXISTS - non existent + for (size_t i = 0; i < MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL; i++) { + size_t dest_offset = START_NULLIFIER_NON_EXISTS_OFFSET + i; + size_t pcpi_offset = PCPI_NULLIFIER_NON_EXISTS_OFFSET + (i * READ_REQUEST_LENGTH); + + ko_values[dest_offset] = public_inputs_vec[pcpi_offset]; + ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 1]; + ko_metadata[dest_offset] = FF(0); + } + // For L1TOL2MSGEXISTS + for (size_t i = 0; i < MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL; i++) { + size_t dest_offset = START_L1_TO_L2_MSG_EXISTS_WRITE_OFFSET + i; + size_t pcpi_offset = PCPI_L1_TO_L2_MSG_READ_REQUESTS_OFFSET + (i * READ_REQUEST_LENGTH); + + ko_values[dest_offset] = public_inputs_vec[pcpi_offset]; + ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 1]; + } + // For SSTORE + for (size_t i = 0; i < MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL; i++) { + size_t dest_offset = START_SSTORE_WRITE_OFFSET + i; + size_t pcpi_offset = PCPI_PUBLIC_DATA_UPDATE_OFFSET + (i * CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH); + + // slot, value, side effect + ko_metadata[dest_offset] = public_inputs_vec[pcpi_offset]; + ko_values[dest_offset] = public_inputs_vec[pcpi_offset + 1]; + ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 2]; + } + // For SLOAD + for (size_t i = 0; i < MAX_PUBLIC_DATA_READS_PER_CALL; i++) { + size_t dest_offset = START_SLOAD_WRITE_OFFSET + i; + size_t pcpi_offset = PCPI_PUBLIC_DATA_READ_OFFSET + (i * CONTRACT_STORAGE_READ_LENGTH); + + // slot, value, side effect + ko_metadata[dest_offset] = public_inputs_vec[pcpi_offset]; + ko_values[dest_offset] = public_inputs_vec[pcpi_offset + 1]; + ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 2]; + } + // For EMITNOTEHASH + for (size_t i = 0; i < MAX_NOTE_HASHES_PER_CALL; i++) { + size_t dest_offset = START_EMIT_NOTE_HASH_WRITE_OFFSET + i; + size_t pcpi_offset = PCPI_NEW_NOTE_HASHES_OFFSET + (i * NOTE_HASH_LENGTH); + + ko_values[dest_offset] = public_inputs_vec[pcpi_offset]; + ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 1]; + } + // For EMITNULLIFIER + for (size_t i = 0; i < MAX_NULLIFIERS_PER_CALL; i++) { + size_t dest_offset = START_EMIT_NULLIFIER_WRITE_OFFSET + i; + size_t pcpi_offset = PCPI_NEW_NULLIFIERS_OFFSET + (i * NULLIFIER_LENGTH); + + ko_values[dest_offset] = public_inputs_vec[pcpi_offset]; + ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 1]; + } + // For EMITL2TOL1MSG + for (size_t i = 0; i < MAX_L2_TO_L1_MSGS_PER_CALL; i++) { + size_t dest_offset = START_EMIT_L2_TO_L1_MSG_WRITE_OFFSET + i; + size_t pcpi_offset = PCPI_NEW_L2_TO_L1_MSGS_OFFSET + (i * L2_TO_L1_MESSAGE_LENGTH); + + // Note: unorthadox order + ko_metadata[dest_offset] = public_inputs_vec[pcpi_offset]; + ko_values[dest_offset] = public_inputs_vec[pcpi_offset + 1]; + ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 2]; + } + // For EMITUNENCRYPTEDLOG + for (size_t i = 0; i < MAX_UNENCRYPTED_LOGS_PER_CALL; i++) { + size_t dest_offset = START_EMIT_UNENCRYPTED_LOG_WRITE_OFFSET + i; + size_t pcpi_offset = + PCPI_NEW_UNENCRYPTED_LOGS_OFFSET + (i * 3); // 3 because we have metadata, this is the window size + + ko_values[dest_offset] = public_inputs_vec[pcpi_offset]; + ko_side_effect[dest_offset] = public_inputs_vec[pcpi_offset + 1]; + ko_metadata[dest_offset] = public_inputs_vec[pcpi_offset + 2]; + } + + return public_inputs; +} + // Copy Public Input Columns // There are 5 public input columns, one for inputs, one for returndata and 3 for the kernel outputs // {value, side effect counter, metadata}. The verifier is generic, and so accepts vectors of these values // rather than the fixed length arrays that are used during circuit building. This method copies each array // into a vector to be used by the verifier. -std::vector> copy_public_inputs_columns(VmPublicInputs const& public_inputs, - std::vector const& calldata, - std::vector const& returndata); +template +std::vector> copy_public_inputs_columns(VmPublicInputs const& public_inputs, + std::vector const& calldata, + std::vector const& returndata) +{ + // We convert to a vector as the pil generated verifier is generic and unaware of the KERNEL_INPUTS_LENGTH + // For each of the public input vectors + std::vector public_inputs_kernel_inputs(std::get(public_inputs).begin(), + std::get(public_inputs).end()); + std::vector public_inputs_kernel_value_outputs(std::get(public_inputs).begin(), + std::get(public_inputs).end()); + std::vector public_inputs_kernel_side_effect_outputs( + std::get(public_inputs).begin(), + std::get(public_inputs).end()); + std::vector public_inputs_kernel_metadata_outputs(std::get(public_inputs).begin(), + std::get(public_inputs).end()); + + assert(public_inputs_kernel_inputs.size() == KERNEL_INPUTS_LENGTH); + assert(public_inputs_kernel_value_outputs.size() == KERNEL_OUTPUTS_LENGTH); + assert(public_inputs_kernel_side_effect_outputs.size() == KERNEL_OUTPUTS_LENGTH); + assert(public_inputs_kernel_metadata_outputs.size() == KERNEL_OUTPUTS_LENGTH); + + return { + std::move(public_inputs_kernel_inputs), + std::move(public_inputs_kernel_value_outputs), + std::move(public_inputs_kernel_side_effect_outputs), + std::move(public_inputs_kernel_metadata_outputs), + calldata, + returndata, + }; +} template requires(std::unsigned_integral) diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/kernel_trace.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/kernel_trace.hpp index 49979bca3cd..95f2815597b 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/kernel_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/kernel_trace.hpp @@ -57,7 +57,7 @@ class AvmKernelTraceBuilder { // optimise this to just hardcode the counter to be the same as the lookup selector value!!! std::unordered_map kernel_output_selector_counter; - AvmKernelTraceBuilder(uint32_t initial_side_effect_counter, VmPublicInputs public_inputs, ExecutionHints hints) + AvmKernelTraceBuilder(uint32_t initial_side_effect_counter, VmPublicInputs public_inputs, ExecutionHints hints) : public_inputs(std::move(public_inputs)) , initial_side_effect_counter(initial_side_effect_counter) , hints(std::move(hints)) @@ -98,7 +98,7 @@ class AvmKernelTraceBuilder { void op_emit_l2_to_l1_msg(uint32_t clk, uint32_t side_effect_counter, const FF& l2_to_l1_msg, const FF& recipient); // This is temporarily made public so we can access PIs - VmPublicInputs public_inputs; + VmPublicInputs public_inputs; private: std::vector kernel_trace; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.cpp index a1e563ed638..f4b82918975 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.cpp @@ -276,7 +276,7 @@ void AvmTraceBuilder::finalise_mem_trace_lookup_counts() * @brief Constructor of a trace builder of AVM. Only serves to set the capacity of the * underlying traces and initialize gas values. */ -AvmTraceBuilder::AvmTraceBuilder(VmPublicInputs public_inputs, +AvmTraceBuilder::AvmTraceBuilder(VmPublicInputs public_inputs, ExecutionHints execution_hints_, uint32_t side_effect_counter, std::vector calldata) diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.hpp index a9a1ee74476..29167b16a00 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.hpp @@ -52,7 +52,7 @@ struct AddressWithMode { class AvmTraceBuilder { public: - AvmTraceBuilder(VmPublicInputs public_inputs = {}, + AvmTraceBuilder(VmPublicInputs public_inputs = {}, ExecutionHints execution_hints = {}, uint32_t side_effect_counter = 0, std::vector calldata = {}); diff --git a/barretenberg/cpp/src/barretenberg/vm/aztec_constants.hpp b/barretenberg/cpp/src/barretenberg/vm/aztec_constants.hpp index 8c6c05e4dc6..684319d2f13 100644 --- a/barretenberg/cpp/src/barretenberg/vm/aztec_constants.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/aztec_constants.hpp @@ -35,7 +35,8 @@ #define PUBLIC_CONTEXT_INPUTS_LENGTH 42 #define AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS 66 #define AVM_PROOF_LENGTH_IN_FIELDS 3822 -#define AVM_PUBLIC_COLUMN_MAX_SIZE_LOG2 8 +#define AVM_PUBLIC_COLUMN_MAX_SIZE 1024 +#define AVM_PUBLIC_INPUTS_FLATTENED_SIZE 2739 #define MEM_TAG_U1 1 #define MEM_TAG_U8 2 #define MEM_TAG_U16 3 diff --git a/barretenberg/cpp/src/barretenberg/vm/constants.hpp b/barretenberg/cpp/src/barretenberg/vm/constants.hpp index aedd9cb3215..d8ee8a30dd8 100644 --- a/barretenberg/cpp/src/barretenberg/vm/constants.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/constants.hpp @@ -16,6 +16,14 @@ inline const std::size_t KERNEL_OUTPUTS_LENGTH = MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL + MAX_PUBLIC_DATA_READS_PER_CALL + MAX_NOTE_HASHES_PER_CALL + MAX_NULLIFIERS_PER_CALL + MAX_L2_TO_L1_MSGS_PER_CALL + MAX_UNENCRYPTED_LOGS_PER_CALL; +static_assert(KERNEL_INPUTS_LENGTH < AVM_PUBLIC_COLUMN_MAX_SIZE, + "The kernel inputs length cannot exceed the max size of a public column. This is a requirement for the " + "avm recursive verifier."); + +static_assert(KERNEL_OUTPUTS_LENGTH < AVM_PUBLIC_COLUMN_MAX_SIZE, + "The kernel outputs length cannot exceed the max size of a public column. This is a requirement for the " + "avm recursive verifier."); + // START INDEXES in the PUBLIC_CIRCUIT_PUBLIC_INPUTS // These line up with indexes found in // https://github.com/AztecProtocol/aztec-packages/blob/master/yarn-project/circuits.js/src/structs/public_circuit_public_inputs.ts diff --git a/barretenberg/sol/scripts/install_foundry.sh b/barretenberg/sol/scripts/install_foundry.sh index e5f878288bd..0e5a1cc86d8 100755 --- a/barretenberg/sol/scripts/install_foundry.sh +++ b/barretenberg/sol/scripts/install_foundry.sh @@ -6,7 +6,7 @@ FOUNDRY_BIN_DIR="$FOUNDRY_DIR/bin" BIN_URL="https://raw.githubusercontent.com/foundry-rs/foundry/master/foundryup/foundryup" BIN_PATH="$FOUNDRY_BIN_DIR/foundryup" FOUNDRY_MAN_DIR="$FOUNDRY_DIR/share/man/man1" -FOUNDRY_VERSION="nightly-de33b6af53005037b463318d2628b5cfcaf39916" +FOUNDRY_VERSION="nightly-25f24e677a6a32a62512ad4f561995589ac2c7dc" # Clean rm -rf $FOUNDRY_DIR diff --git a/barretenberg/sol/src/honk/Fr.sol b/barretenberg/sol/src/honk/Fr.sol index aeeebb0f2ad..58291c2b358 100644 --- a/barretenberg/sol/src/honk/Fr.sol +++ b/barretenberg/sol/src/honk/Fr.sol @@ -82,6 +82,18 @@ library FrLib { function div(Fr numerator, Fr denominator) internal view returns (Fr) { return numerator * invert(denominator); } + + function sqr(Fr value) internal pure returns (Fr) { + return value * value; + } + + function unwrap(Fr value) internal pure returns (uint256) { + return Fr.unwrap(value); + } + + function neg(Fr value) internal pure returns (Fr) { + return Fr.wrap(MODULUS - Fr.unwrap(value)); + } } // Free functions diff --git a/barretenberg/sol/src/honk/HonkTypes.sol b/barretenberg/sol/src/honk/HonkTypes.sol index 180b163271f..3f5e5f76cb1 100644 --- a/barretenberg/sol/src/honk/HonkTypes.sol +++ b/barretenberg/sol/src/honk/HonkTypes.sol @@ -136,5 +136,10 @@ library Honk { // Sumcheck Fr[BATCHED_RELATION_PARTIAL_LENGTH][CONST_PROOF_SIZE_LOG_N] sumcheckUnivariates; Fr[NUMBER_OF_ENTITIES] sumcheckEvaluations; + // Gemini + Honk.G1ProofPoint[CONST_PROOF_SIZE_LOG_N - 1] geminiFoldComms; + Fr[CONST_PROOF_SIZE_LOG_N] geminiAEvaluations; + Honk.G1ProofPoint shplonkQ; + Honk.G1ProofPoint kzgQuotient; } } diff --git a/barretenberg/sol/src/honk/Transcript.sol b/barretenberg/sol/src/honk/Transcript.sol index 70ac6234158..8576b180c99 100644 --- a/barretenberg/sol/src/honk/Transcript.sol +++ b/barretenberg/sol/src/honk/Transcript.sol @@ -19,7 +19,11 @@ struct Transcript { Fr[NUMBER_OF_ALPHAS] alphas; Fr[CONST_PROOF_SIZE_LOG_N] gateChallenges; Fr[CONST_PROOF_SIZE_LOG_N] sumCheckUChallenges; - // Fr rho; + // Gemini + Fr rho; + Fr geminiR; + Fr shplonkNu; + Fr shplonkZ; // Derived Fr publicInputsDelta; } @@ -40,7 +44,14 @@ library TranscriptLib { (t.gateChallenges, previousChallenge) = generateGateChallenges(previousChallenge); (t.sumCheckUChallenges, previousChallenge) = generateSumcheckChallenges(proof, previousChallenge); - // (t.rho, previousChallenge) = generateRhoChallenge(proof, previousChallenge); + + (t.rho, previousChallenge) = generateRhoChallenge(proof, previousChallenge); + + (t.geminiR, previousChallenge) = generateGeminiRChallenge(proof, previousChallenge); + + (t.shplonkNu, previousChallenge) = generateShplonkNuChallenge(proof, previousChallenge); + + (t.shplonkZ, previousChallenge) = generateShplonkZChallenge(proof, previousChallenge); return t; } @@ -55,7 +66,7 @@ library TranscriptLib { function generateEtaChallenge(Honk.Proof memory proof, bytes32[] calldata publicInputs, uint256 publicInputsSize) internal - view + pure returns (Fr eta, Fr etaTwo, Fr etaThree, Fr previousChallenge) { bytes32[] memory round0 = new bytes32[](3 + publicInputsSize + 12); @@ -90,7 +101,7 @@ library TranscriptLib { function generateBetaAndGammaChallenges(Fr previousChallenge, Honk.Proof memory proof) internal - view + pure returns (Fr beta, Fr gamma, Fr nextPreviousChallenge) { bytes32[13] memory round1; @@ -115,7 +126,7 @@ library TranscriptLib { // Alpha challenges non-linearise the gate contributions function generateAlphaChallenges(Fr previousChallenge, Honk.Proof memory proof) internal - view + pure returns (Fr[NUMBER_OF_ALPHAS] memory alphas, Fr nextPreviousChallenge) { // Generate the original sumcheck alpha 0 by hashing zPerm and zLookup @@ -146,7 +157,7 @@ library TranscriptLib { function generateGateChallenges(Fr previousChallenge) internal - view + pure returns (Fr[CONST_PROOF_SIZE_LOG_N] memory gateChallenges, Fr nextPreviousChallenge) { for (uint256 i = 0; i < CONST_PROOF_SIZE_LOG_N; i++) { @@ -159,7 +170,7 @@ library TranscriptLib { function generateSumcheckChallenges(Honk.Proof memory proof, Fr prevChallenge) internal - view + pure returns (Fr[CONST_PROOF_SIZE_LOG_N] memory sumcheckChallenges, Fr nextPreviousChallenge) { for (uint256 i = 0; i < CONST_PROOF_SIZE_LOG_N; i++) { @@ -177,10 +188,9 @@ library TranscriptLib { nextPreviousChallenge = prevChallenge; } - // TODO: reuse this for Shplemini function generateRhoChallenge(Honk.Proof memory proof, Fr prevChallenge) internal - view + pure returns (Fr rho, Fr nextPreviousChallenge) { Fr[NUMBER_OF_ENTITIES + 1] memory rhoChallengeElements; @@ -196,11 +206,66 @@ library TranscriptLib { (rho, unused) = splitChallenge(nextPreviousChallenge); } + function generateGeminiRChallenge(Honk.Proof memory proof, Fr prevChallenge) + internal + pure + returns (Fr geminiR, Fr nextPreviousChallenge) + { + uint256[(CONST_PROOF_SIZE_LOG_N - 1) * 4 + 1] memory gR; + gR[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 0; i < CONST_PROOF_SIZE_LOG_N - 1; i++) { + gR[1 + i * 4] = proof.geminiFoldComms[i].x_0; + gR[2 + i * 4] = proof.geminiFoldComms[i].x_1; + gR[3 + i * 4] = proof.geminiFoldComms[i].y_0; + gR[4 + i * 4] = proof.geminiFoldComms[i].y_1; + } + + nextPreviousChallenge = FrLib.fromBytes32(keccak256(abi.encodePacked(gR))); + Fr unused; + (geminiR, unused) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkNuChallenge(Honk.Proof memory proof, Fr prevChallenge) + internal + pure + returns (Fr shplonkNu, Fr nextPreviousChallenge) + { + uint256[(CONST_PROOF_SIZE_LOG_N) + 1] memory shplonkNuChallengeElements; + shplonkNuChallengeElements[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 0; i < CONST_PROOF_SIZE_LOG_N; i++) { + shplonkNuChallengeElements[i + 1] = Fr.unwrap(proof.geminiAEvaluations[i]); + } + + nextPreviousChallenge = FrLib.fromBytes32(keccak256(abi.encodePacked(shplonkNuChallengeElements))); + Fr unused; + (shplonkNu, unused) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkZChallenge(Honk.Proof memory proof, Fr prevChallenge) + internal + pure + returns (Fr shplonkZ, Fr nextPreviousChallenge) + { + uint256[5] memory shplonkZChallengeElements; + shplonkZChallengeElements[0] = Fr.unwrap(prevChallenge); + + shplonkZChallengeElements[1] = proof.shplonkQ.x_0; + shplonkZChallengeElements[2] = proof.shplonkQ.x_1; + shplonkZChallengeElements[3] = proof.shplonkQ.y_0; + shplonkZChallengeElements[4] = proof.shplonkQ.y_1; + + nextPreviousChallenge = FrLib.fromBytes32(keccak256(abi.encodePacked(shplonkZChallengeElements))); + Fr unused; + (shplonkZ, unused) = splitChallenge(nextPreviousChallenge); + } + // TODO: mod q proof points // TODO: Preprocess all of the memory locations // TODO: Adjust proof point serde away from poseidon forced field elements // TODO: move this back to probably each instance to avoid dynamic init of arrays in the Transcript Lib - function loadProof(bytes calldata proof) internal view returns (Honk.Proof memory) { + function loadProof(bytes calldata proof) internal pure returns (Honk.Proof memory) { Honk.Proof memory p; // Metadata @@ -287,12 +352,57 @@ library TranscriptLib { } boundary = boundary + (NUMBER_OF_ENTITIES * 0x20); - // p.zmPi = Honk.G1ProofPoint({ - // x_0: uint256(bytes32(proof[boundary + 0x80:boundary + 0xa0])), - // x_1: uint256(bytes32(proof[boundary + 0xa0:boundary + 0xc0])), - // y_0: uint256(bytes32(proof[boundary + 0xc0:boundary + 0xe0])), - // y_1: uint256(bytes32(proof[boundary + 0xe0:boundary + 0x100])) - // }); + + // Gemini + // Read gemini fold univariates + for (uint256 i = 0; i < CONST_PROOF_SIZE_LOG_N - 1; i++) { + uint256 xStart = boundary + (i * 0x80); + uint256 xEnd = xStart + 0x20; + + uint256 x1Start = xEnd; + uint256 x1End = x1Start + 0x20; + + uint256 yStart = x1End; + uint256 yEnd = yStart + 0x20; + + uint256 y1Start = yEnd; + uint256 y1End = y1Start + 0x20; + p.geminiFoldComms[i] = Honk.G1ProofPoint({ + x_0: uint256(bytes32(proof[xStart:xEnd])), + x_1: uint256(bytes32(proof[x1Start:x1End])), + y_0: uint256(bytes32(proof[yStart:yEnd])), + y_1: uint256(bytes32(proof[y1Start:y1End])) + }); + } + + boundary = boundary + ((CONST_PROOF_SIZE_LOG_N - 1) * 0x80); + + // Read gemini a evaluations + for (uint256 i = 0; i < CONST_PROOF_SIZE_LOG_N; i++) { + uint256 start = boundary + (i * 0x20); + uint256 end = start + 0x20; + p.geminiAEvaluations[i] = FrLib.fromBytes32(bytes32(proof[start:end])); + } + + boundary = boundary + (CONST_PROOF_SIZE_LOG_N * 0x20); + + // Shplonk + p.shplonkQ = Honk.G1ProofPoint({ + x_0: uint256(bytes32(proof[boundary:boundary + 0x20])), + x_1: uint256(bytes32(proof[boundary + 0x20:boundary + 0x40])), + y_0: uint256(bytes32(proof[boundary + 0x40:boundary + 0x60])), + y_1: uint256(bytes32(proof[boundary + 0x60:boundary + 0x80])) + }); + + boundary = boundary + 0x80; + + // KZG + p.kzgQuotient = Honk.G1ProofPoint({ + x_0: uint256(bytes32(proof[boundary:boundary + 0x20])), + x_1: uint256(bytes32(proof[boundary + 0x20:boundary + 0x40])), + y_0: uint256(bytes32(proof[boundary + 0x40:boundary + 0x60])), + y_1: uint256(bytes32(proof[boundary + 0x60:boundary + 0x80])) + }); return p; } diff --git a/barretenberg/sol/src/honk/instance/Add2Honk.sol b/barretenberg/sol/src/honk/instance/Add2Honk.sol index a6eaec5afa8..a56a3b256a0 100644 --- a/barretenberg/sol/src/honk/instance/Add2Honk.sol +++ b/barretenberg/sol/src/honk/instance/Add2Honk.sol @@ -28,9 +28,12 @@ import {RelationsLib} from "../Relations.sol"; // Errors error PublicInputsLengthWrong(); error SumcheckFailed(); +error ShpleminiFailed(); /// Smart contract verifier of honk proofs contract Add2HonkVerifier is IVerifier { + using FrLib for Fr; + function verify(bytes calldata proof, bytes32[] calldata publicInputs) public view override returns (bool) { Honk.VerificationKey memory vk = loadVerificationKey(); Honk.Proof memory p = TranscriptLib.loadProof(proof); @@ -50,10 +53,13 @@ contract Add2HonkVerifier is IVerifier { bool sumcheckVerified = verifySumcheck(p, t); if (!sumcheckVerified) revert SumcheckFailed(); - return sumcheckVerified; // Boolean condition not required - nice for vanity :) + bool shpleminiVerified = verifyShplemini(p, vk, t); + if (!shpleminiVerified) revert ShpleminiFailed(); + + return sumcheckVerified && shpleminiVerified; // Boolean condition not required - nice for vanity :) } - function loadVerificationKey() internal view returns (Honk.VerificationKey memory) { + function loadVerificationKey() internal pure returns (Honk.VerificationKey memory) { return VK.loadVerificationKey(); } @@ -112,7 +118,7 @@ contract Add2HonkVerifier is IVerifier { function checkSum(Fr[BATCHED_RELATION_PARTIAL_LENGTH] memory roundUnivariate, Fr roundTarget) internal - view + pure returns (bool checked) { Fr totalSum = roundUnivariate[0] + roundUnivariate[1]; @@ -186,54 +192,255 @@ contract Add2HonkVerifier is IVerifier { newEvaluation = currentEvaluation * univariateEval; } - // TODO: TODO: TODO: optimize - // Scalar Mul and acumulate into total - function batchMul(Honk.G1Point[LOG_N + 1] memory base, Fr[LOG_N + 1] memory scalars) + // Avoid stack too deep + struct ShpleminiIntermediates { + Fr unshiftedScalar; + Fr shiftedScalar; + // Scalar to be multiplied by [1]₁ + Fr constantTermAccumulator; + // Linear combination of multilinear (sumcheck) evaluations and powers of rho + Fr batchingChallenge; + // Accumulator for powers of rho + Fr batchedEvaluation; + } + + function verifyShplemini(Honk.Proof memory proof, Honk.VerificationKey memory vk, Transcript memory tp) internal view - returns (Honk.G1Point memory result) + returns (bool verified) { - uint256 limit = LOG_N + 1; - assembly { - let success := 0x01 - let free := mload(0x40) + ShpleminiIntermediates memory mem; // stack + + // - Compute vector (r, r², ... , r²⁽ⁿ⁻¹⁾), where n = log_circuit_size + Fr[CONST_PROOF_SIZE_LOG_N] memory powers_of_evaluation_challenge = computeSquares(tp.geminiR); + + // Arrays hold values that will be linearly combined for the gemini and shplonk batch openings + Fr[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2] memory scalars; + Honk.G1Point[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2] memory commitments; + + Fr[CONST_PROOF_SIZE_LOG_N + 1] memory inverse_vanishing_evals = + computeInvertedGeminiDenominators(tp, powers_of_evaluation_challenge); + + mem.unshiftedScalar = inverse_vanishing_evals[0] + (tp.shplonkNu * inverse_vanishing_evals[1]); + mem.shiftedScalar = + tp.geminiR.invert() * (inverse_vanishing_evals[0] - (tp.shplonkNu * inverse_vanishing_evals[1])); + + scalars[0] = Fr.wrap(1); + commitments[0] = convertProofPoint(proof.shplonkQ); + + /* Batch multivariate opening claims, shifted and unshifted + * The vector of scalars is populated as follows: + * \f[ + * \left( + * - \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{i+k-1} \times \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * - \rho^{i+k} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{k+m-1} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right) + * \right) + * \f] + * + * The following vector is concatenated to the vector of commitments: + * \f[ + * f_0, \ldots, f_{m-1}, f_{\text{shift}, 0}, \ldots, f_{\text{shift}, k-1} + * \f] + * + * Simultaneously, the evaluation of the multilinear polynomial + * \f[ + * \sum \rho^i \cdot f_i + \sum \rho^{i+k} \cdot f_{\text{shift}, i} + * \f] + * at the challenge point \f$ (u_0,\ldots, u_{n-1}) \f$ is computed. + * + * This approach minimizes the number of iterations over the commitments to multilinear polynomials + * and eliminates the need to store the powers of \f$ \rho \f$. + */ + mem.batchingChallenge = Fr.wrap(1); + mem.batchedEvaluation = Fr.wrap(0); + + for (uint256 i = 1; i <= NUMBER_UNSHIFTED; ++i) { + scalars[i] = mem.unshiftedScalar.neg() * mem.batchingChallenge; + mem.batchedEvaluation = mem.batchedEvaluation + (proof.sumcheckEvaluations[i - 1] * mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + // g commitments are accumulated at r + for (uint256 i = NUMBER_UNSHIFTED + 1; i <= NUMBER_OF_ENTITIES; ++i) { + scalars[i] = mem.shiftedScalar.neg() * mem.batchingChallenge; + mem.batchedEvaluation = mem.batchedEvaluation + (proof.sumcheckEvaluations[i - 1] * mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } - // Write the original into the accumulator - // Load into memory forecMUL, leave offset foreccAdd result - // base is an array of pointers, so we have to dereference them - mstore(add(free, 0x40), mload(mload(base))) - mstore(add(free, 0x60), mload(add(0x20, mload(base)))) - // Add scalar - mstore(add(free, 0x80), mload(scalars)) - success := and(success, staticcall(gas(), 7, add(free, 0x40), 0x60, free, 0x40)) + commitments[1] = vk.qm; + commitments[2] = vk.qc; + commitments[3] = vk.ql; + commitments[4] = vk.qr; + commitments[5] = vk.qo; + commitments[6] = vk.q4; + commitments[7] = vk.qArith; + commitments[8] = vk.qDeltaRange; + commitments[9] = vk.qElliptic; + commitments[10] = vk.qAux; + commitments[11] = vk.qLookup; + commitments[12] = vk.qPoseidon2External; + commitments[13] = vk.qPoseidon2Internal; + commitments[14] = vk.s1; + commitments[15] = vk.s2; + commitments[16] = vk.s3; + commitments[17] = vk.s4; + commitments[18] = vk.id1; + commitments[19] = vk.id2; + commitments[20] = vk.id3; + commitments[21] = vk.id4; + commitments[22] = vk.t1; + commitments[23] = vk.t2; + commitments[24] = vk.t3; + commitments[25] = vk.t4; + commitments[26] = vk.lagrangeFirst; + commitments[27] = vk.lagrangeLast; + + // Accumulate proof points + commitments[28] = convertProofPoint(proof.w1); + commitments[29] = convertProofPoint(proof.w2); + commitments[30] = convertProofPoint(proof.w3); + commitments[31] = convertProofPoint(proof.w4); + commitments[32] = convertProofPoint(proof.zPerm); + commitments[33] = convertProofPoint(proof.lookupInverses); + commitments[34] = convertProofPoint(proof.lookupReadCounts); + commitments[35] = convertProofPoint(proof.lookupReadTags); + + // to be Shifted + commitments[36] = vk.t1; + commitments[37] = vk.t2; + commitments[38] = vk.t3; + commitments[39] = vk.t4; + commitments[40] = convertProofPoint(proof.w1); + commitments[41] = convertProofPoint(proof.w2); + commitments[42] = convertProofPoint(proof.w3); + commitments[43] = convertProofPoint(proof.w4); + commitments[44] = convertProofPoint(proof.zPerm); + + /* Batch gemini claims from the prover + * place the commitments to gemini aᵢ to the vector of commitments, compute the contributions from + * aᵢ(−r²ⁱ) for i=1, … , n−1 to the constant term accumulator, add corresponding scalars + * + * 1. Moves the vector + * \f[ + * \left( \text{com}(A_1), \text{com}(A_2), \ldots, \text{com}(A_{n-1}) \right) + * \f] + * to the 'commitments' vector. + * + * 2. Computes the scalars: + * \f[ + * \frac{\nu^{2}}{z + r^2}, \frac{\nu^3}{z + r^4}, \ldots, \frac{\nu^{n-1}}{z + r^{2^{n-1}}} + * \f] + * and places them into the 'scalars' vector. + * + * 3. Accumulates the summands of the constant term: + * \f[ + * \sum_{i=2}^{n-1} \frac{\nu^{i} \cdot A_i(-r^{2^i})}{z + r^{2^i}} + * \f] + * and adds them to the 'constant_term_accumulator'. + */ + mem.constantTermAccumulator = Fr.wrap(0); + mem.batchingChallenge = tp.shplonkNu.sqr(); + + for (uint256 i; i < CONST_PROOF_SIZE_LOG_N - 1; ++i) { + bool dummy_round = i >= (LOG_N - 1); + + Fr scalingFactor = Fr.wrap(0); + if (!dummy_round) { + scalingFactor = mem.batchingChallenge * inverse_vanishing_evals[i + 2]; + scalars[NUMBER_OF_ENTITIES + 1 + i] = scalingFactor.neg(); + } - let count := 0x01 + mem.constantTermAccumulator = + mem.constantTermAccumulator + (scalingFactor * proof.geminiAEvaluations[i + 1]); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; - for {} lt(count, limit) { count := add(count, 1) } { - // Get loop offsets - let base_base := add(base, mul(count, 0x20)) - let scalar_base := add(scalars, mul(count, 0x20)) + commitments[NUMBER_OF_ENTITIES + 1 + i] = convertProofPoint(proof.geminiFoldComms[i]); + } - mstore(add(free, 0x40), mload(mload(base_base))) - mstore(add(free, 0x60), mload(add(0x20, mload(base_base)))) - // Add scalar - mstore(add(free, 0x80), mload(scalar_base)) + // Add contributions from A₀(r) and A₀(-r) to constant_term_accumulator: + // Compute evaluation A₀(r) + Fr a_0_pos = computeGeminiBatchedUnivariateEvaluation( + tp, mem.batchedEvaluation, proof.geminiAEvaluations, powers_of_evaluation_challenge + ); - success := and(success, staticcall(gas(), 7, add(free, 0x40), 0x60, add(free, 0x40), 0x40)) - success := and(success, staticcall(gas(), 6, free, 0x80, free, 0x40)) + mem.constantTermAccumulator = mem.constantTermAccumulator + (a_0_pos * inverse_vanishing_evals[0]); + mem.constantTermAccumulator = + mem.constantTermAccumulator + (proof.geminiAEvaluations[0] * tp.shplonkNu * inverse_vanishing_evals[1]); + + // Finalise the batch opening claim + commitments[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N] = Honk.G1Point({x: 1, y: 2}); + scalars[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N] = mem.constantTermAccumulator; + + Honk.G1Point memory quotient_commitment = convertProofPoint(proof.kzgQuotient); + + commitments[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 1] = quotient_commitment; + scalars[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 1] = tp.shplonkZ; // evaluation challenge + + Honk.G1Point memory P_0 = batchMul(commitments, scalars); + Honk.G1Point memory P_1 = negateInplace(quotient_commitment); + + return pairing(P_0, P_1); + } + + function computeSquares(Fr r) internal pure returns (Fr[CONST_PROOF_SIZE_LOG_N] memory squares) { + squares[0] = r; + for (uint256 i = 1; i < CONST_PROOF_SIZE_LOG_N; ++i) { + squares[i] = squares[i - 1].sqr(); + } + } + + function computeInvertedGeminiDenominators( + Transcript memory tp, + Fr[CONST_PROOF_SIZE_LOG_N] memory eval_challenge_powers + ) internal view returns (Fr[CONST_PROOF_SIZE_LOG_N + 1] memory inverse_vanishing_evals) { + Fr eval_challenge = tp.shplonkZ; + inverse_vanishing_evals[0] = (eval_challenge - eval_challenge_powers[0]).invert(); + + for (uint256 i = 0; i < CONST_PROOF_SIZE_LOG_N; ++i) { + Fr round_inverted_denominator = Fr.wrap(0); + if (i <= LOG_N + 1) { + round_inverted_denominator = (eval_challenge + eval_challenge_powers[i]).invert(); } + inverse_vanishing_evals[i + 1] = round_inverted_denominator; + } + } - mstore(result, mload(free)) - mstore(add(result, 0x20), mload(add(free, 0x20))) + function computeGeminiBatchedUnivariateEvaluation( + Transcript memory tp, + Fr batchedEvalAccumulator, + Fr[CONST_PROOF_SIZE_LOG_N] memory geminiEvaluations, + Fr[CONST_PROOF_SIZE_LOG_N] memory geminiEvalChallengePowers + ) internal view returns (Fr a_0_pos) { + for (uint256 i = CONST_PROOF_SIZE_LOG_N; i > 0; --i) { + Fr challengePower = geminiEvalChallengePowers[i - 1]; + Fr u = tp.sumCheckUChallenges[i - 1]; + Fr evalNeg = geminiEvaluations[i - 1]; + + Fr batchedEvalRoundAcc = ( + (challengePower * batchedEvalAccumulator * Fr.wrap(2)) + - evalNeg * (challengePower * (Fr.wrap(1) - u) - u) + ); + // Divide by the denominator + batchedEvalRoundAcc = batchedEvalRoundAcc * (challengePower * (Fr.wrap(1) - u) + u).invert(); + + bool is_dummy_round = (i > LOG_N); + if (!is_dummy_round) { + batchedEvalAccumulator = batchedEvalRoundAcc; + } } + + a_0_pos = batchedEvalAccumulator; } // This implementation is the same as above with different constants - function batchMul2( - Honk.G1Point[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 1] memory base, - Fr[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 1] memory scalars + function batchMul( + Honk.G1Point[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2] memory base, + Fr[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2] memory scalars ) internal view returns (Honk.G1Point memory result) { - uint256 limit = NUMBER_OF_ENTITIES + LOG_N + 1; + uint256 limit = NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2; assembly { let success := 0x01 let free := mload(0x40) @@ -269,27 +476,6 @@ contract Add2HonkVerifier is IVerifier { } } - // function kzgReduceVerify( - // Honk.Proof memory proof, - // Transcript memory tp, - // Fr evaluation, - // Honk.G1Point memory commitment - // ) internal view returns (bool) { - // Honk.G1Point memory quotient_commitment = convertProofPoint(proof.zmPi); - // Honk.G1Point memory ONE = Honk.G1Point({x: 1, y: 2}); - - // Honk.G1Point memory P0 = commitment; - // P0 = ecAdd(P0, ecMul(quotient_commitment, tp.zmX)); - - // Honk.G1Point memory evalAsPoint = ecMul(ONE, evaluation); - // P0 = ecSub(P0, evalAsPoint); - - // Honk.G1Point memory P1 = negateInplace(quotient_commitment); - - // // Perform pairing check - // return pairing(P0, P1); - // } - function pairing(Honk.G1Point memory rhs, Honk.G1Point memory lhs) internal view returns (bool) { bytes memory input = abi.encodePacked( rhs.x, @@ -309,7 +495,8 @@ contract Add2HonkVerifier is IVerifier { ); (bool success, bytes memory result) = address(0x08).staticcall(input); - return abi.decode(result, (bool)); + bool decodedResult = abi.decode(result, (bool)); + return success && decodedResult; } } diff --git a/barretenberg/sol/src/honk/instance/BlakeHonk.sol b/barretenberg/sol/src/honk/instance/BlakeHonk.sol index 4c40fc2337b..d5f739f0315 100644 --- a/barretenberg/sol/src/honk/instance/BlakeHonk.sol +++ b/barretenberg/sol/src/honk/instance/BlakeHonk.sol @@ -12,6 +12,7 @@ import { NUMBER_OF_SUBRELATIONS, NUMBER_OF_ALPHAS, NUMBER_UNSHIFTED, + NUMBER_TO_BE_SHIFTED, BATCHED_RELATION_PARTIAL_LENGTH, CONST_PROOF_SIZE_LOG_N } from "../HonkTypes.sol"; @@ -28,9 +29,12 @@ import {RelationsLib} from "../Relations.sol"; // Errors error PublicInputsLengthWrong(); error SumcheckFailed(); +error ShpleminiFailed(); /// Smart contract verifier of honk proofs contract BlakeHonkVerifier is IVerifier { + using FrLib for Fr; + function verify(bytes calldata proof, bytes32[] calldata publicInputs) public view override returns (bool) { Honk.VerificationKey memory vk = loadVerificationKey(); Honk.Proof memory p = TranscriptLib.loadProof(proof); @@ -50,10 +54,13 @@ contract BlakeHonkVerifier is IVerifier { bool sumcheckVerified = verifySumcheck(p, t); if (!sumcheckVerified) revert SumcheckFailed(); - return sumcheckVerified; // Boolean condition not required - nice for vanity :) + bool shpleminiVerified = verifyShplemini(p, vk, t); + if (!shpleminiVerified) revert ShpleminiFailed(); + + return sumcheckVerified && shpleminiVerified; // Boolean condition not required - nice for vanity :) } - function loadVerificationKey() internal view returns (Honk.VerificationKey memory) { + function loadVerificationKey() internal pure returns (Honk.VerificationKey memory) { return VK.loadVerificationKey(); } @@ -112,7 +119,7 @@ contract BlakeHonkVerifier is IVerifier { function checkSum(Fr[BATCHED_RELATION_PARTIAL_LENGTH] memory roundUnivariate, Fr roundTarget) internal - view + pure returns (bool checked) { Fr totalSum = roundUnivariate[0] + roundUnivariate[1]; @@ -186,60 +193,261 @@ contract BlakeHonkVerifier is IVerifier { newEvaluation = currentEvaluation * univariateEval; } - // TODO: TODO: TODO: optimize - // Scalar Mul and acumulate into total - function batchMul(Honk.G1Point[LOG_N + 1] memory base, Fr[LOG_N + 1] memory scalars) + // Avoid stack too deep + struct ShpleminiIntermediates { + Fr unshiftedScalar; + Fr shiftedScalar; + // Scalar to be multiplied by [1]₁ + Fr constantTermAccumulator; + // Linear combination of multilinear (sumcheck) evaluations and powers of rho + Fr batchingChallenge; + // Accumulator for powers of rho + Fr batchedEvaluation; + } + + function verifyShplemini(Honk.Proof memory proof, Honk.VerificationKey memory vk, Transcript memory tp) internal view - returns (Honk.G1Point memory result) + returns (bool verified) { - uint256 limit = LOG_N + 1; - assembly { - let success := 0x01 - let free := mload(0x40) + ShpleminiIntermediates memory mem; // stack + + // - Compute vector (r, r², ... , r²⁽ⁿ⁻¹⁾), where n = log_circuit_size + Fr[CONST_PROOF_SIZE_LOG_N] memory powers_of_evaluation_challenge = computeSquares(tp.geminiR); + + // Arrays hold values that will be linearly combined for the gemini and shplonk batch openings + Fr[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2] memory scalars; + Honk.G1Point[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2] memory commitments; + + Fr[CONST_PROOF_SIZE_LOG_N + 1] memory inverse_vanishing_evals = + computeInvertedGeminiDenominators(tp, powers_of_evaluation_challenge); + + mem.unshiftedScalar = inverse_vanishing_evals[0] + (tp.shplonkNu * inverse_vanishing_evals[1]); + mem.shiftedScalar = + tp.geminiR.invert() * (inverse_vanishing_evals[0] - (tp.shplonkNu * inverse_vanishing_evals[1])); + + scalars[0] = Fr.wrap(1); + commitments[0] = convertProofPoint(proof.shplonkQ); + + /* Batch multivariate opening claims, shifted and unshifted + * The vector of scalars is populated as follows: + * \f[ + * \left( + * - \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{i+k-1} \times \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * - \rho^{i+k} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{k+m-1} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right) + * \right) + * \f] + * + * The following vector is concatenated to the vector of commitments: + * \f[ + * f_0, \ldots, f_{m-1}, f_{\text{shift}, 0}, \ldots, f_{\text{shift}, k-1} + * \f] + * + * Simultaneously, the evaluation of the multilinear polynomial + * \f[ + * \sum \rho^i \cdot f_i + \sum \rho^{i+k} \cdot f_{\text{shift}, i} + * \f] + * at the challenge point \f$ (u_0,\ldots, u_{n-1}) \f$ is computed. + * + * This approach minimizes the number of iterations over the commitments to multilinear polynomials + * and eliminates the need to store the powers of \f$ \rho \f$. + */ + mem.batchingChallenge = Fr.wrap(1); + mem.batchedEvaluation = Fr.wrap(0); + + for (uint256 i = 1; i <= NUMBER_UNSHIFTED; ++i) { + scalars[i] = mem.unshiftedScalar.neg() * mem.batchingChallenge; + mem.batchedEvaluation = mem.batchedEvaluation + (proof.sumcheckEvaluations[i - 1] * mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + // g commitments are accumulated at r + for (uint256 i = NUMBER_UNSHIFTED + 1; i <= NUMBER_OF_ENTITIES; ++i) { + scalars[i] = mem.shiftedScalar.neg() * mem.batchingChallenge; + mem.batchedEvaluation = mem.batchedEvaluation + (proof.sumcheckEvaluations[i - 1] * mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } - // Write the original into the accumulator - // Load into memory forecMUL, leave offset foreccAdd result - // base is an array of pointers, so we have to dereference them - mstore(add(free, 0x40), mload(mload(base))) - mstore(add(free, 0x60), mload(add(0x20, mload(base)))) - // Add scalar - mstore(add(free, 0x80), mload(scalars)) - success := and(success, staticcall(gas(), 7, add(free, 0x40), 0x60, free, 0x40)) + commitments[1] = vk.qm; + commitments[2] = vk.qc; + commitments[3] = vk.ql; + commitments[4] = vk.qr; + commitments[5] = vk.qo; + commitments[6] = vk.q4; + commitments[7] = vk.qArith; + commitments[8] = vk.qDeltaRange; + commitments[9] = vk.qElliptic; + commitments[10] = vk.qAux; + commitments[11] = vk.qLookup; + commitments[12] = vk.qPoseidon2External; + commitments[13] = vk.qPoseidon2Internal; + commitments[14] = vk.s1; + commitments[15] = vk.s2; + commitments[16] = vk.s3; + commitments[17] = vk.s4; + commitments[18] = vk.id1; + commitments[19] = vk.id2; + commitments[20] = vk.id3; + commitments[21] = vk.id4; + commitments[22] = vk.t1; + commitments[23] = vk.t2; + commitments[24] = vk.t3; + commitments[25] = vk.t4; + commitments[26] = vk.lagrangeFirst; + commitments[27] = vk.lagrangeLast; + + // Accumulate proof points + commitments[28] = convertProofPoint(proof.w1); + commitments[29] = convertProofPoint(proof.w2); + commitments[30] = convertProofPoint(proof.w3); + commitments[31] = convertProofPoint(proof.w4); + commitments[32] = convertProofPoint(proof.zPerm); + commitments[33] = convertProofPoint(proof.lookupInverses); + commitments[34] = convertProofPoint(proof.lookupReadCounts); + commitments[35] = convertProofPoint(proof.lookupReadTags); + + // to be Shifted + commitments[36] = vk.t1; + commitments[37] = vk.t2; + commitments[38] = vk.t3; + commitments[39] = vk.t4; + commitments[40] = convertProofPoint(proof.w1); + commitments[41] = convertProofPoint(proof.w2); + commitments[42] = convertProofPoint(proof.w3); + commitments[43] = convertProofPoint(proof.w4); + commitments[44] = convertProofPoint(proof.zPerm); + + /* Batch gemini claims from the prover + * place the commitments to gemini aᵢ to the vector of commitments, compute the contributions from + * aᵢ(−r²ⁱ) for i=1, … , n−1 to the constant term accumulator, add corresponding scalars + * + * 1. Moves the vector + * \f[ + * \left( \text{com}(A_1), \text{com}(A_2), \ldots, \text{com}(A_{n-1}) \right) + * \f] + * to the 'commitments' vector. + * + * 2. Computes the scalars: + * \f[ + * \frac{\nu^{2}}{z + r^2}, \frac{\nu^3}{z + r^4}, \ldots, \frac{\nu^{n-1}}{z + r^{2^{n-1}}} + * \f] + * and places them into the 'scalars' vector. + * + * 3. Accumulates the summands of the constant term: + * \f[ + * \sum_{i=2}^{n-1} \frac{\nu^{i} \cdot A_i(-r^{2^i})}{z + r^{2^i}} + * \f] + * and adds them to the 'constant_term_accumulator'. + */ + mem.constantTermAccumulator = Fr.wrap(0); + mem.batchingChallenge = tp.shplonkNu.sqr(); + + for (uint256 i; i < CONST_PROOF_SIZE_LOG_N - 1; ++i) { + bool dummy_round = i >= (LOG_N - 1); + + Fr scalingFactor = Fr.wrap(0); + if (!dummy_round) { + scalingFactor = mem.batchingChallenge * inverse_vanishing_evals[i + 2]; + scalars[NUMBER_OF_ENTITIES + 1 + i] = scalingFactor.neg(); + } - let count := 0x01 + mem.constantTermAccumulator = + mem.constantTermAccumulator + (scalingFactor * proof.geminiAEvaluations[i + 1]); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; - for {} lt(count, limit) { count := add(count, 1) } { - // Get loop offsets - let base_base := add(base, mul(count, 0x20)) - let scalar_base := add(scalars, mul(count, 0x20)) + commitments[NUMBER_OF_ENTITIES + 1 + i] = convertProofPoint(proof.geminiFoldComms[i]); + } - mstore(add(free, 0x40), mload(mload(base_base))) - mstore(add(free, 0x60), mload(add(0x20, mload(base_base)))) - // Add scalar - mstore(add(free, 0x80), mload(scalar_base)) + // Add contributions from A₀(r) and A₀(-r) to constant_term_accumulator: + // Compute evaluation A₀(r) + Fr a_0_pos = computeGeminiBatchedUnivariateEvaluation( + tp, mem.batchedEvaluation, proof.geminiAEvaluations, powers_of_evaluation_challenge + ); - success := and(success, staticcall(gas(), 7, add(free, 0x40), 0x60, add(free, 0x40), 0x40)) - success := and(success, staticcall(gas(), 6, free, 0x80, free, 0x40)) + mem.constantTermAccumulator = mem.constantTermAccumulator + (a_0_pos * inverse_vanishing_evals[0]); + mem.constantTermAccumulator = + mem.constantTermAccumulator + (proof.geminiAEvaluations[0] * tp.shplonkNu * inverse_vanishing_evals[1]); + + // Finalise the batch opening claim + commitments[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N] = Honk.G1Point({x: 1, y: 2}); + scalars[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N] = mem.constantTermAccumulator; + + Honk.G1Point memory quotient_commitment = convertProofPoint(proof.kzgQuotient); + + commitments[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 1] = quotient_commitment; + scalars[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 1] = tp.shplonkZ; // evaluation challenge + + Honk.G1Point memory P_0 = batchMul(commitments, scalars); + Honk.G1Point memory P_1 = negateInplace(quotient_commitment); + + return pairing(P_0, P_1); + } + + function computeSquares(Fr r) internal pure returns (Fr[CONST_PROOF_SIZE_LOG_N] memory squares) { + squares[0] = r; + for (uint256 i = 1; i < CONST_PROOF_SIZE_LOG_N; ++i) { + squares[i] = squares[i - 1].sqr(); + } + } + + function computeInvertedGeminiDenominators( + Transcript memory tp, + Fr[CONST_PROOF_SIZE_LOG_N] memory eval_challenge_powers + ) internal view returns (Fr[CONST_PROOF_SIZE_LOG_N + 1] memory inverse_vanishing_evals) { + Fr eval_challenge = tp.shplonkZ; + inverse_vanishing_evals[0] = (eval_challenge - eval_challenge_powers[0]).invert(); + + for (uint256 i = 0; i < CONST_PROOF_SIZE_LOG_N; ++i) { + Fr round_inverted_denominator = Fr.wrap(0); + if (i <= LOG_N + 1) { + round_inverted_denominator = (eval_challenge + eval_challenge_powers[i]).invert(); } + inverse_vanishing_evals[i + 1] = round_inverted_denominator; + } + } - mstore(result, mload(free)) - mstore(add(result, 0x20), mload(add(free, 0x20))) + function computeGeminiBatchedUnivariateEvaluation( + Transcript memory tp, + Fr batchedEvalAccumulator, + Fr[CONST_PROOF_SIZE_LOG_N] memory geminiEvaluations, + Fr[CONST_PROOF_SIZE_LOG_N] memory geminiEvalChallengePowers + ) internal view returns (Fr a_0_pos) { + for (uint256 i = CONST_PROOF_SIZE_LOG_N; i > 0; --i) { + Fr challengePower = geminiEvalChallengePowers[i - 1]; + Fr u = tp.sumCheckUChallenges[i - 1]; + Fr evalNeg = geminiEvaluations[i - 1]; + + Fr batchedEvalRoundAcc = ( + (challengePower * batchedEvalAccumulator * Fr.wrap(2)) + - evalNeg * (challengePower * (Fr.wrap(1) - u) - u) + ); + // Divide by the denominator + batchedEvalRoundAcc = batchedEvalRoundAcc * (challengePower * (Fr.wrap(1) - u) + u).invert(); + + bool is_dummy_round = (i > LOG_N); + if (!is_dummy_round) { + batchedEvalAccumulator = batchedEvalRoundAcc; + } } + + a_0_pos = batchedEvalAccumulator; } // This implementation is the same as above with different constants - function batchMul2( - Honk.G1Point[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 1] memory base, - Fr[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 1] memory scalars + function batchMul( + Honk.G1Point[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2] memory base, + Fr[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2] memory scalars ) internal view returns (Honk.G1Point memory result) { - uint256 limit = NUMBER_OF_ENTITIES + LOG_N + 1; + uint256 limit = NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2; assembly { let success := 0x01 let free := mload(0x40) // Write the original into the accumulator - // Load into memory forecMUL, leave offset foreccAdd result + // Load into memory for ecMUL, leave offset for eccAdd result // base is an array of pointers, so we have to dereference them mstore(add(free, 0x40), mload(mload(base))) mstore(add(free, 0x60), mload(add(0x20, mload(base)))) @@ -269,27 +477,6 @@ contract BlakeHonkVerifier is IVerifier { } } - // function kzgReduceVerify( - // Honk.Proof memory proof, - // Transcript memory tp, - // Fr evaluation, - // Honk.G1Point memory commitment - // ) internal view returns (bool) { - // Honk.G1Point memory quotient_commitment = convertProofPoint(proof.zmPi); - // Honk.G1Point memory ONE = Honk.G1Point({x: 1, y: 2}); - - // Honk.G1Point memory P0 = commitment; - // P0 = ecAdd(P0, ecMul(quotient_commitment, tp.zmX)); - - // Honk.G1Point memory evalAsPoint = ecMul(ONE, evaluation); - // P0 = ecSub(P0, evalAsPoint); - - // Honk.G1Point memory P1 = negateInplace(quotient_commitment); - - // // Perform pairing check - // return pairing(P0, P1); - // } - function pairing(Honk.G1Point memory rhs, Honk.G1Point memory lhs) internal view returns (bool) { bytes memory input = abi.encodePacked( rhs.x, @@ -309,7 +496,8 @@ contract BlakeHonkVerifier is IVerifier { ); (bool success, bytes memory result) = address(0x08).staticcall(input); - return abi.decode(result, (bool)); + bool decodedResult = abi.decode(result, (bool)); + return success && decodedResult; } } diff --git a/barretenberg/sol/src/honk/instance/EcdsaHonk.sol b/barretenberg/sol/src/honk/instance/EcdsaHonk.sol index 2a683c27dcc..5e3c064defc 100644 --- a/barretenberg/sol/src/honk/instance/EcdsaHonk.sol +++ b/barretenberg/sol/src/honk/instance/EcdsaHonk.sol @@ -28,9 +28,12 @@ import {RelationsLib} from "../Relations.sol"; // Errors error PublicInputsLengthWrong(); error SumcheckFailed(); +error ShpleminiFailed(); /// Smart contract verifier of honk proofs contract EcdsaHonkVerifier is IVerifier { + using FrLib for Fr; + function verify(bytes calldata proof, bytes32[] calldata publicInputs) public view override returns (bool) { Honk.VerificationKey memory vk = loadVerificationKey(); Honk.Proof memory p = TranscriptLib.loadProof(proof); @@ -50,10 +53,13 @@ contract EcdsaHonkVerifier is IVerifier { bool sumcheckVerified = verifySumcheck(p, t); if (!sumcheckVerified) revert SumcheckFailed(); - return sumcheckVerified; // Boolean condition not required - nice for vanity :) + bool shpleminiVerified = verifyShplemini(p, vk, t); + if (!shpleminiVerified) revert ShpleminiFailed(); + + return sumcheckVerified && shpleminiVerified; // Boolean condition not required - nice for vanity :) } - function loadVerificationKey() internal view returns (Honk.VerificationKey memory) { + function loadVerificationKey() internal pure returns (Honk.VerificationKey memory) { return VK.loadVerificationKey(); } @@ -112,7 +118,7 @@ contract EcdsaHonkVerifier is IVerifier { function checkSum(Fr[BATCHED_RELATION_PARTIAL_LENGTH] memory roundUnivariate, Fr roundTarget) internal - view + pure returns (bool checked) { Fr totalSum = roundUnivariate[0] + roundUnivariate[1]; @@ -186,60 +192,264 @@ contract EcdsaHonkVerifier is IVerifier { newEvaluation = currentEvaluation * univariateEval; } - // TODO: TODO: TODO: optimize - // Scalar Mul and acumulate into total - function batchMul(Honk.G1Point[LOG_N + 1] memory base, Fr[LOG_N + 1] memory scalars) + // Avoid stack too deep + struct ShpleminiIntermediates { + Fr unshiftedScalar; + Fr shiftedScalar; + // Scalar to be multiplied by [1]₁ + Fr constantTermAccumulator; + // Linear combination of multilinear (sumcheck) evaluations and powers of rho + Fr batchingChallenge; + // Accumulator for powers of rho + Fr batchedEvaluation; + } + + /** + * Shplemini is a combination of the gemini commitment scheme, that uses shplonk's batch opening claim. + */ + function verifyShplemini(Honk.Proof memory proof, Honk.VerificationKey memory vk, Transcript memory tp) internal view - returns (Honk.G1Point memory result) + returns (bool verified) { - uint256 limit = LOG_N + 1; - assembly { - let success := 0x01 - let free := mload(0x40) + ShpleminiIntermediates memory mem; // stack + + // - Compute vector (r, r², ... , r²⁽ⁿ⁻¹⁾), where n = log_circuit_size + Fr[CONST_PROOF_SIZE_LOG_N] memory powers_of_evaluation_challenge = computeSquares(tp.geminiR); + + // Arrays hold values that will be linearly combined for the gemini and shplonk batch openings + Fr[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2] memory scalars; + Honk.G1Point[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2] memory commitments; + + Fr[CONST_PROOF_SIZE_LOG_N + 1] memory inverse_vanishing_evals = + computeInvertedGeminiDenominators(tp, powers_of_evaluation_challenge); + + mem.unshiftedScalar = inverse_vanishing_evals[0] + (tp.shplonkNu * inverse_vanishing_evals[1]); + mem.shiftedScalar = + tp.geminiR.invert() * (inverse_vanishing_evals[0] - (tp.shplonkNu * inverse_vanishing_evals[1])); + + scalars[0] = Fr.wrap(1); + commitments[0] = convertProofPoint(proof.shplonkQ); + + /* Batch multivariate opening claims, shifted and unshifted + * The vector of scalars is populated as follows: + * \f[ + * \left( + * - \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{i+k-1} \times \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * - \rho^{i+k} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{k+m-1} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right) + * \right) + * \f] + * + * The following vector is concatenated to the vector of commitments: + * \f[ + * f_0, \ldots, f_{m-1}, f_{\text{shift}, 0}, \ldots, f_{\text{shift}, k-1} + * \f] + * + * Simultaneously, the evaluation of the multilinear polynomial + * \f[ + * \sum \rho^i \cdot f_i + \sum \rho^{i+k} \cdot f_{\text{shift}, i} + * \f] + * at the challenge point \f$ (u_0,\ldots, u_{n-1}) \f$ is computed. + * + * This approach minimizes the number of iterations over the commitments to multilinear polynomials + * and eliminates the need to store the powers of \f$ \rho \f$. + */ + mem.batchingChallenge = Fr.wrap(1); + mem.batchedEvaluation = Fr.wrap(0); + + for (uint256 i = 1; i <= NUMBER_UNSHIFTED; ++i) { + scalars[i] = mem.unshiftedScalar.neg() * mem.batchingChallenge; + mem.batchedEvaluation = mem.batchedEvaluation + (proof.sumcheckEvaluations[i - 1] * mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + // g commitments are accumulated at r + for (uint256 i = NUMBER_UNSHIFTED + 1; i <= NUMBER_OF_ENTITIES; ++i) { + scalars[i] = mem.shiftedScalar.neg() * mem.batchingChallenge; + mem.batchedEvaluation = mem.batchedEvaluation + (proof.sumcheckEvaluations[i - 1] * mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } - // Write the original into the accumulator - // Load into memory forecMUL, leave offset foreccAdd result - // base is an array of pointers, so we have to dereference them - mstore(add(free, 0x40), mload(mload(base))) - mstore(add(free, 0x60), mload(add(0x20, mload(base)))) - // Add scalar - mstore(add(free, 0x80), mload(scalars)) - success := and(success, staticcall(gas(), 7, add(free, 0x40), 0x60, free, 0x40)) + commitments[1] = vk.qm; + commitments[2] = vk.qc; + commitments[3] = vk.ql; + commitments[4] = vk.qr; + commitments[5] = vk.qo; + commitments[6] = vk.q4; + commitments[7] = vk.qArith; + commitments[8] = vk.qDeltaRange; + commitments[9] = vk.qElliptic; + commitments[10] = vk.qAux; + commitments[11] = vk.qLookup; + commitments[12] = vk.qPoseidon2External; + commitments[13] = vk.qPoseidon2Internal; + commitments[14] = vk.s1; + commitments[15] = vk.s2; + commitments[16] = vk.s3; + commitments[17] = vk.s4; + commitments[18] = vk.id1; + commitments[19] = vk.id2; + commitments[20] = vk.id3; + commitments[21] = vk.id4; + commitments[22] = vk.t1; + commitments[23] = vk.t2; + commitments[24] = vk.t3; + commitments[25] = vk.t4; + commitments[26] = vk.lagrangeFirst; + commitments[27] = vk.lagrangeLast; + + // Accumulate proof points + commitments[28] = convertProofPoint(proof.w1); + commitments[29] = convertProofPoint(proof.w2); + commitments[30] = convertProofPoint(proof.w3); + commitments[31] = convertProofPoint(proof.w4); + commitments[32] = convertProofPoint(proof.zPerm); + commitments[33] = convertProofPoint(proof.lookupInverses); + commitments[34] = convertProofPoint(proof.lookupReadCounts); + commitments[35] = convertProofPoint(proof.lookupReadTags); + + // to be Shifted + commitments[36] = vk.t1; + commitments[37] = vk.t2; + commitments[38] = vk.t3; + commitments[39] = vk.t4; + commitments[40] = convertProofPoint(proof.w1); + commitments[41] = convertProofPoint(proof.w2); + commitments[42] = convertProofPoint(proof.w3); + commitments[43] = convertProofPoint(proof.w4); + commitments[44] = convertProofPoint(proof.zPerm); + + /* Batch gemini claims from the prover + * place the commitments to gemini aᵢ to the vector of commitments, compute the contributions from + * aᵢ(−r²ⁱ) for i=1, … , n−1 to the constant term accumulator, add corresponding scalars + * + * 1. Moves the vector + * \f[ + * \left( \text{com}(A_1), \text{com}(A_2), \ldots, \text{com}(A_{n-1}) \right) + * \f] + * to the 'commitments' vector. + * + * 2. Computes the scalars: + * \f[ + * \frac{\nu^{2}}{z + r^2}, \frac{\nu^3}{z + r^4}, \ldots, \frac{\nu^{n-1}}{z + r^{2^{n-1}}} + * \f] + * and places them into the 'scalars' vector. + * + * 3. Accumulates the summands of the constant term: + * \f[ + * \sum_{i=2}^{n-1} \frac{\nu^{i} \cdot A_i(-r^{2^i})}{z + r^{2^i}} + * \f] + * and adds them to the 'constant_term_accumulator'. + */ + mem.constantTermAccumulator = Fr.wrap(0); + mem.batchingChallenge = tp.shplonkNu.sqr(); + + for (uint256 i; i < CONST_PROOF_SIZE_LOG_N - 1; ++i) { + bool dummy_round = i >= (LOG_N - 1); + + Fr scalingFactor = Fr.wrap(0); + if (!dummy_round) { + scalingFactor = mem.batchingChallenge * inverse_vanishing_evals[i + 2]; + scalars[NUMBER_OF_ENTITIES + 1 + i] = scalingFactor.neg(); + } - let count := 0x01 + mem.constantTermAccumulator = + mem.constantTermAccumulator + (scalingFactor * proof.geminiAEvaluations[i + 1]); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; - for {} lt(count, limit) { count := add(count, 1) } { - // Get loop offsets - let base_base := add(base, mul(count, 0x20)) - let scalar_base := add(scalars, mul(count, 0x20)) + commitments[NUMBER_OF_ENTITIES + 1 + i] = convertProofPoint(proof.geminiFoldComms[i]); + } - mstore(add(free, 0x40), mload(mload(base_base))) - mstore(add(free, 0x60), mload(add(0x20, mload(base_base)))) - // Add scalar - mstore(add(free, 0x80), mload(scalar_base)) + // Add contributions from A₀(r) and A₀(-r) to constant_term_accumulator: + // Compute evaluation A₀(r) + Fr a_0_pos = computeGeminiBatchedUnivariateEvaluation( + tp, mem.batchedEvaluation, proof.geminiAEvaluations, powers_of_evaluation_challenge + ); - success := and(success, staticcall(gas(), 7, add(free, 0x40), 0x60, add(free, 0x40), 0x40)) - success := and(success, staticcall(gas(), 6, free, 0x80, free, 0x40)) + mem.constantTermAccumulator = mem.constantTermAccumulator + (a_0_pos * inverse_vanishing_evals[0]); + mem.constantTermAccumulator = + mem.constantTermAccumulator + (proof.geminiAEvaluations[0] * tp.shplonkNu * inverse_vanishing_evals[1]); + + // Finalise the batch opening claim + commitments[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N] = Honk.G1Point({x: 1, y: 2}); + scalars[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N] = mem.constantTermAccumulator; + + Honk.G1Point memory quotient_commitment = convertProofPoint(proof.kzgQuotient); + + commitments[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 1] = quotient_commitment; + scalars[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 1] = tp.shplonkZ; // evaluation challenge + + Honk.G1Point memory P_0 = batchMul(commitments, scalars); + Honk.G1Point memory P_1 = negateInplace(quotient_commitment); + + return pairing(P_0, P_1); + } + + function computeSquares(Fr r) internal pure returns (Fr[CONST_PROOF_SIZE_LOG_N] memory squares) { + squares[0] = r; + for (uint256 i = 1; i < CONST_PROOF_SIZE_LOG_N; ++i) { + squares[i] = squares[i - 1].sqr(); + } + } + + function computeInvertedGeminiDenominators( + Transcript memory tp, + Fr[CONST_PROOF_SIZE_LOG_N] memory eval_challenge_powers + ) internal view returns (Fr[CONST_PROOF_SIZE_LOG_N + 1] memory inverse_vanishing_evals) { + Fr eval_challenge = tp.shplonkZ; + inverse_vanishing_evals[0] = (eval_challenge - eval_challenge_powers[0]).invert(); + + for (uint256 i = 0; i < CONST_PROOF_SIZE_LOG_N; ++i) { + Fr round_inverted_denominator = Fr.wrap(0); + if (i <= LOG_N + 1) { + round_inverted_denominator = (eval_challenge + eval_challenge_powers[i]).invert(); } + inverse_vanishing_evals[i + 1] = round_inverted_denominator; + } + } - mstore(result, mload(free)) - mstore(add(result, 0x20), mload(add(free, 0x20))) + function computeGeminiBatchedUnivariateEvaluation( + Transcript memory tp, + Fr batchedEvalAccumulator, + Fr[CONST_PROOF_SIZE_LOG_N] memory geminiEvaluations, + Fr[CONST_PROOF_SIZE_LOG_N] memory geminiEvalChallengePowers + ) internal view returns (Fr a_0_pos) { + for (uint256 i = CONST_PROOF_SIZE_LOG_N; i > 0; --i) { + Fr challengePower = geminiEvalChallengePowers[i - 1]; + Fr u = tp.sumCheckUChallenges[i - 1]; + Fr evalNeg = geminiEvaluations[i - 1]; + + Fr batchedEvalRoundAcc = ( + (challengePower * batchedEvalAccumulator * Fr.wrap(2)) + - evalNeg * (challengePower * (Fr.wrap(1) - u) - u) + ); + // Divide by the denominator + batchedEvalRoundAcc = batchedEvalRoundAcc * (challengePower * (Fr.wrap(1) - u) + u).invert(); + + bool is_dummy_round = (i > LOG_N); + if (!is_dummy_round) { + batchedEvalAccumulator = batchedEvalRoundAcc; + } } + + a_0_pos = batchedEvalAccumulator; } // This implementation is the same as above with different constants - function batchMul2( - Honk.G1Point[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 1] memory base, - Fr[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 1] memory scalars + function batchMul( + Honk.G1Point[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2] memory base, + Fr[NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2] memory scalars ) internal view returns (Honk.G1Point memory result) { - uint256 limit = NUMBER_OF_ENTITIES + LOG_N + 1; + uint256 limit = NUMBER_OF_ENTITIES + CONST_PROOF_SIZE_LOG_N + 2; assembly { let success := 0x01 let free := mload(0x40) // Write the original into the accumulator - // Load into memory forecMUL, leave offset foreccAdd result + // Load into memory for ecMUL, leave offset for eccAdd result // base is an array of pointers, so we have to dereference them mstore(add(free, 0x40), mload(mload(base))) mstore(add(free, 0x60), mload(add(0x20, mload(base)))) @@ -269,27 +479,6 @@ contract EcdsaHonkVerifier is IVerifier { } } - // function kzgReduceVerify( - // Honk.Proof memory proof, - // Transcript memory tp, - // Fr evaluation, - // Honk.G1Point memory commitment - // ) internal view returns (bool) { - // Honk.G1Point memory quotient_commitment = convertProofPoint(proof.zmPi); - // Honk.G1Point memory ONE = Honk.G1Point({x: 1, y: 2}); - - // Honk.G1Point memory P0 = commitment; - // P0 = ecAdd(P0, ecMul(quotient_commitment, tp.zmX)); - - // Honk.G1Point memory evalAsPoint = ecMul(ONE, evaluation); - // P0 = ecSub(P0, evalAsPoint); - - // Honk.G1Point memory P1 = negateInplace(quotient_commitment); - - // // Perform pairing check - // return pairing(P0, P1); - // } - function pairing(Honk.G1Point memory rhs, Honk.G1Point memory lhs) internal view returns (bool) { bytes memory input = abi.encodePacked( rhs.x, @@ -309,7 +498,8 @@ contract EcdsaHonkVerifier is IVerifier { ); (bool success, bytes memory result) = address(0x08).staticcall(input); - return abi.decode(result, (bool)); + bool decodedResult = abi.decode(result, (bool)); + return success && decodedResult; } } diff --git a/barretenberg/sol/src/honk/keys/EcdsaHonkVerificationKey.sol b/barretenberg/sol/src/honk/keys/EcdsaHonkVerificationKey.sol index b2d9abdf2a2..26207d04184 100644 --- a/barretenberg/sol/src/honk/keys/EcdsaHonkVerificationKey.sol +++ b/barretenberg/sol/src/honk/keys/EcdsaHonkVerificationKey.sol @@ -15,72 +15,72 @@ library EcdsaHonkVerificationKey { logCircuitSize: uint256(16), publicInputsSize: uint256(6), ql: Honk.G1Point({ - x: uint256(0x0b1acdcf739e1e6c27df046577122a292a77f4fcdf8056d8b8ae12f105d3a888), - y: uint256(0x145dad3bdd9a262411aaa657129df49dbf44a63f510e9ab8191622c643ebd9bd) + x: uint256(0x051ccdb8069f35f4ef85ad098e95681736a7bed10a7bee1b76a506235dc0b579), + y: uint256(0x05e168c2e4f90231545f5b24c1a84c1419b8798e4235cc2036c9e101e462b71d) }), qr: Honk.G1Point({ - x: uint256(0x1940872f30b32522e26efd0fd4a642289bce2c56083e7a03af564c30969066d8), - y: uint256(0x181fd173051ca19e37f09c42298c36d2e9834df50535d85d429f562352c0d924) + x: uint256(0x2c99eed1f855cd5152942cc090aabf15308eb00ac549e965eb3e1950479cce58), + y: uint256(0x170bf8541390153bf5807bc022c9369f99d8bc1fd87922a0627b144fec0414e2) }), qo: Honk.G1Point({ - x: uint256(0x2a1afa631e8b6ab8fb1444fb0154686a5a34c7a4ddae66bdc344e782a81382b3), - y: uint256(0x0cfa0936a5e63e723a5c318c7461ddc22824ad0ee62fa00e2e8b92f9b3f1cdf6) + x: uint256(0x1594abb7debcf41e3296178eeec941dbb6242ba13f50f4549734657ee5ebb8b1), + y: uint256(0x262e1469c56c719bdc4eaab93cc95868eed9fea1fa9ded03b46f2c061a341d4f) }), q4: Honk.G1Point({ - x: uint256(0x1a01666b2e915221eb0c1ae6bf91394d18c73e6882dd1241d244f932678982ec), - y: uint256(0x212b0436d2da1b4a6507142b794024ded58e3d41fdde2f95249405ffdd02b324) + x: uint256(0x16b49bbcd37e15ed89b2f6f5b97d021abe440ba7cbc69904484991fa7e6058a9), + y: uint256(0x197b14cb5d037642b27ed7cd79b9568e5853ad1e3508453c0ed1f30c1962fd52) }), qm: Honk.G1Point({ - x: uint256(0x0dd29943b961b1c615ab22df0e5b567489a7c9a9ad3ac92ae281d68ca603326c), - y: uint256(0x2a552165dc59dc5c5398e6b8c2227dc3f36ccdcc1250e7c9a8c1631c963aff2f) + x: uint256(0x175280d74e116a82ad6ccc34f640a5b3dda74b17372c9a0941d57749e37068a6), + y: uint256(0x0827b11a78b8a625ba940983effbcf7354aa0388bd472481c0a8a088653b9769) }), qc: Honk.G1Point({ - x: uint256(0x203785f30cf75ed2e8559faa797897174bca19ebcb44266c6bc87aee8dc86964), - y: uint256(0x11ae3fbccf0c302ab29a8123b2ef631a659a3750d27df3eb7c492ae978ac3f07) + x: uint256(0x2a262a7189292da31f3f4a7926c4d9fcae883188aafe9cf3ba2a623f0004a67a), + y: uint256(0x0d90b8808180521422b90889592111434dd5bbc0e5deb27419c1f5e6d0bf9883) }), qArith: Honk.G1Point({ - x: uint256(0x059453a86c23185b89783698e7da32ce59270611c312c82a16c42e83d66f3a11), - y: uint256(0x23403bda1774d1e372f94dd86571d393290df9d27cc1f032a1a2ba3a02becb28) + x: uint256(0x2026f95bb8f7b6ed57287e4833e2789cce8ec9a95b829e6a2abbf5d13d681d22), + y: uint256(0x19cea5af7d9b39a4ad86a0ab52f8a358f7f35236561a50cdf6f2860f0b3426a8) }), qDeltaRange: Honk.G1Point({ - x: uint256(0x189ec3e8c791a2933a4f188b2183c4bfeb9a2a8e51bb10a7571c243603dd3fce), - y: uint256(0x00d30f1839bdf225d00e20bcf76adcf2bfc6ea98a4ca12b4f36c68f4a865fa59) + x: uint256(0x02d0f736b422d74d9aa2ef26deedb67fdd2e798aae001c4292dabd2c5df31249), + y: uint256(0x0ae6265d6dcc9da8d3b23f088c6fb062c9be10bfa79e9d0463d4a7785ea4a5f9) }), qElliptic: Honk.G1Point({ - x: uint256(0x16b1166d95a8e2496eb12363dbfb9ca5aa5bc0975fc4994dc2c61cc0609d8eba), - y: uint256(0x1aded54ecb6c2ec4fdeaef0f9e3b2dae5da1e1958d76b953b9e29efb1e8962b4) + x: uint256(0x0ffa449a9d6e6c6f3e302eb3f16ce9d3d3711b9102ecf0e303ff91f3f9eb25f5), + y: uint256(0x095ef997439bccdd1234b2431a520823bcfe3e77f50190e66e70e2c51e906193) }), qAux: Honk.G1Point({ - x: uint256(0x1011b815b4505f86944621990bd81bd442780186904784572d50087942aa8607), - y: uint256(0x24e575bf4641129d492759c66a4a5c1d3da80b647d4e67adfea20ab72eb69854) + x: uint256(0x09023d45c436e756762d8b3527cfcb3f694cdbafd192ccae59210740bdf03ad3), + y: uint256(0x020c9b591603814f1815038e25d1bb3fb85261bf699abfc8921f48954f0bc2b0) }), qLookup: Honk.G1Point({ - x: uint256(0x13a5f6d8f4de0f66dc7ea0d75efa7ae6632e6448c13bbbe5358412f7a36518d6), - y: uint256(0x142fd8f3223785fbd36b380c6065215d16b821b3df4d86d5464f1bfff2a29544) + x: uint256(0x08c0d34ca72136661975f3b1ad658bfda38661b9ff320b60e2974496e03fd62e), + y: uint256(0x236caf48f4c3a7ca207f5c0ec75f304657e49780015cf40ff9be37f8ba3c6624) }), qPoseidon2External: Honk.G1Point({ - x: uint256(0x02c909437bb59751312ce2208a2b367d3c9eaa8721d7671306c41ebd9843b3ba), - y: uint256(0x1db8a23e0231ac4b008ccdb6f21aa37c59349a77b51d894217596f0ef543120c) + x: uint256(0x09d58ddd055d3d65b4f36a347c18c11956b7d43c4f15434ded62bdf1224ff37d), + y: uint256(0x3002f0782d68214149ae47ee94771a6509709499ca06a8421eeeae97ea37e2a9) }), qPoseidon2Internal: Honk.G1Point({ - x: uint256(0x19d898bac51355e0822e2aa6e6630494e47ea2476a0c4c15b6f03ce441f6c6d0), - y: uint256(0x2add808f3d5b3c608ce5937fcd3c9c968ba56dbe5855e2f6d3e4bdd9d118d19b) + x: uint256(0x1d11dbf6b2ced628ad64ea9d8afef60b6ea2e246160b6525915eb0ab7bdc94aa), + y: uint256(0x1ecef8438441a2565ee641757bdc6739da7389d913453eee0aaac561fb08495c) }), s1: Honk.G1Point({ - x: uint256(0x0dd1eea7735fc4052df5a19e4859c59e50e3ab9cb3cc2accbd42ef8a1104449b), - y: uint256(0x1541af79ad21fe21642a50d97899451c868b6d5d608431e5de6b0a730abe130d) + x: uint256(0x105eb99bfd557812572f2a5ec5b6eff27375b4ed5ce4e7a9649fe3038cfacbac), + y: uint256(0x1efd910252f319f9c0dc21c7688b92d80fd0a8636f152e0d9c8e0afb5c9a6d2e) }), s2: Honk.G1Point({ - x: uint256(0x21d9072c3474c1cfe1c2d96c098c4d9af4bb5d222944aa6470063f4a8b9b9770), - y: uint256(0x137ad8c018449f48311b5394ac91a6b2f5c5e40c676216a299a3d501d69b1f7d) + x: uint256(0x2bbbf5e8a2f7feb08ee64585bf3da54db0da09b211f726adda93020a2ae23e56), + y: uint256(0x2a9e8e1c3850c66da60224163dc4846ea6f37ed48f9d6dfd40b450fa61081484) }), s3: Honk.G1Point({ - x: uint256(0x2c2fe61ccbf18af13d41950ef58f3a2a64d355657a4dfba8e9917e618ea8add4), - y: uint256(0x2e7edf4dae50db17925e431d3198a39cb4bdc6f4e6e7d8d6163c972f4750a606) + x: uint256(0x0d264ba46f4a7bafd0ba9d9f9f4827109e1da2cfdb11835b9fc65aaafe9f9f20), + y: uint256(0x0f9ff6e122bcacd091ffd98d8caf249ab216e9c784e667475e2184ed34892272) }), s4: Honk.G1Point({ - x: uint256(0x1825a30f42c7508e2ee2158d374dc626cf4149b745ba55d533181f418ac605aa), - y: uint256(0x15d9b33a9612c0c8a55a75a827c0230656054765c7b37ba77a798b71a4766d1b) + x: uint256(0x2556809f13dc85764a5e4ea8fda1bbba54f36dad477124915fc8c198db16f496), + y: uint256(0x27461805fb3a7ee919331973984491c36cc83eee61d3664d5319922902327750) }), t1: Honk.G1Point({ x: uint256(0x1ddc9ef86584375e5998d9f6fc16a4e646dc315ab86b477abc2f18a723dc24f6), @@ -99,20 +99,20 @@ library EcdsaHonkVerificationKey { y: uint256(0x076bf1e1f682badebfca083e25d808e8dae96372631c0721a7ee238c333a862a) }), id1: Honk.G1Point({ - x: uint256(0x003bfa695fb125e2e815ae3565a2b7667fe2240edfd46c312fa6b6ed88226d3f), - y: uint256(0x080c85e17835fce14e045eeb531ef2c287ad933a2ca7f35d3c7df03d0367fb9c) + x: uint256(0x0b034b231d25a2e152b830397a59c97e02175212a6c5ce00129625cfb2e5c53d), + y: uint256(0x22e1842515d4569ca06477f4b2685d0a767bfa1eecca343c889840af8c086db9) }), id2: Honk.G1Point({ - x: uint256(0x17662e6b69e1a67d8682a5c00b4d3c57c8f3ce7d82df027ba71c5031a946e070), - y: uint256(0x14bd830834279aa5f4ff64181af68bef9121c6322d37d25b5490f60a83b755f9) + x: uint256(0x0e82a73cd55280503e70d5bdd855071d202ff65f31a65996955a7661775ff290), + y: uint256(0x1325a665dfee8e1247f3129ca943e12736f800afc1a9dcfa0476050b8e3c87f8) }), id3: Honk.G1Point({ - x: uint256(0x05bc83edcd40f963c7f6983f1c6a993ce32ca97a6e45c076dc4e38195ba8560a), - y: uint256(0x01239f42bab3bc0d1cc4194ca17fa76036ce2e4887a3dc499fe71da67d7af9a3) + x: uint256(0x2ad12a1238e051fba16108022b5e58bba1fc7966fe759016a93fae5397e8c403), + y: uint256(0x257cfc281b0135bb8dfb0df6a7b69ca39835af544007eb61ace84ce7014c1fea) }), id4: Honk.G1Point({ - x: uint256(0x1bcbd59c8e9e24132d3d3dfb1eaf21fa4ed74e922bb4d44f3c8d22ebb50105da), - y: uint256(0x147b021c1046d59dcc6b8be404ef2670f7e6f33a03dbaeef966c9bf3882324f4) + x: uint256(0x058bf4de2f71f4d2e11235d140d05db461fb50d8aef64c8c52e2c0f57438dcce), + y: uint256(0x1e90ce7ec8cca2e65d7deafb655e6c7b0c4b964cd2cb1e5b4ef5ad78ab2f4b46) }), lagrangeFirst: Honk.G1Point({ x: uint256(0x0000000000000000000000000000000000000000000000000000000000000001), diff --git a/barretenberg/sol/src/honk/utils.sol b/barretenberg/sol/src/honk/utils.sol index 15d5e9b7b67..55c0e73806e 100644 --- a/barretenberg/sol/src/honk/utils.sol +++ b/barretenberg/sol/src/honk/utils.sol @@ -46,8 +46,8 @@ function logG(string memory name, uint256 i, Honk.G1Point memory point) pure { string memory x = bytes32ToString(bytes32(point.x)); string memory y = bytes32ToString(bytes32(point.y)); - string memory message = string(abi.encodePacked(name, " ", i, " x: ", x, " y: ", y)); - console2.log(message); + string memory message = string(abi.encodePacked(" x: ", x, " y: ", y)); + console2.log(name, i, message); } function logUint(string memory name, uint256 value) pure { @@ -55,6 +55,11 @@ function logUint(string memory name, uint256 value) pure { console2.log(name, as_hex); } +function logUint(string memory name, uint256 i, uint256 value) pure { + string memory as_hex = bytes32ToString(bytes32(value)); + console2.log(name, i, as_hex); +} + function logFr(string memory name, Fr value) pure { string memory as_hex = bytes32ToString(bytes32(Fr.unwrap(value))); console2.log(name, as_hex); diff --git a/barretenberg/sol/src/ultra/keys/Add2UltraVerificationKey.sol b/barretenberg/sol/src/ultra/keys/Add2UltraVerificationKey.sol index 341b831b05a..b87c356a193 100644 --- a/barretenberg/sol/src/ultra/keys/Add2UltraVerificationKey.sol +++ b/barretenberg/sol/src/ultra/keys/Add2UltraVerificationKey.sol @@ -1,11 +1,11 @@ -// Verification Key Hash: 4199008b0f295433fcc5b10612c7b9a9d87fbd4a221275c2119e7c2060905534 +// Verification Key Hash: 40bb22daf923fbfe17fb0be06e0fa50474e40302c1af031f1aaf5f521998ad3a // SPDX-License-Identifier: Apache-2.0 // Copyright 2022 Aztec pragma solidity >=0.8.4; library Add2UltraVerificationKey { function verificationKeyHash() internal pure returns (bytes32) { - return 0x4199008b0f295433fcc5b10612c7b9a9d87fbd4a221275c2119e7c2060905534; + return 0x40bb22daf923fbfe17fb0be06e0fa50474e40302c1af031f1aaf5f521998ad3a; } function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure { diff --git a/barretenberg/sol/src/ultra/keys/BlakeUltraVerificationKey.sol b/barretenberg/sol/src/ultra/keys/BlakeUltraVerificationKey.sol index 27de321eb3d..572ab115fad 100644 --- a/barretenberg/sol/src/ultra/keys/BlakeUltraVerificationKey.sol +++ b/barretenberg/sol/src/ultra/keys/BlakeUltraVerificationKey.sol @@ -1,11 +1,11 @@ -// Verification Key Hash: f1610f1094b31fc37136369383140118871a3bf69a190023d73dce30a3e5ba2e +// Verification Key Hash: 3963021515adf584e49a665edcbb8f92b252b66554a7a9f6b880ae6d76c013c3 // SPDX-License-Identifier: Apache-2.0 // Copyright 2022 Aztec pragma solidity >=0.8.4; library BlakeUltraVerificationKey { function verificationKeyHash() internal pure returns (bytes32) { - return 0xf1610f1094b31fc37136369383140118871a3bf69a190023d73dce30a3e5ba2e; + return 0x3963021515adf584e49a665edcbb8f92b252b66554a7a9f6b880ae6d76c013c3; } function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure { diff --git a/barretenberg/sol/src/ultra/keys/EcdsaUltraVerificationKey.sol b/barretenberg/sol/src/ultra/keys/EcdsaUltraVerificationKey.sol index 63a0b71a890..44a8be7486d 100644 --- a/barretenberg/sol/src/ultra/keys/EcdsaUltraVerificationKey.sol +++ b/barretenberg/sol/src/ultra/keys/EcdsaUltraVerificationKey.sol @@ -1,11 +1,11 @@ -// Verification Key Hash: c1102f0000ae4bf7f5b38f96c80e03284a3ec4bada1f0682ddde94c8ba688c58 +// Verification Key Hash: 2f843a63de8da557c6caf7abb57a3110d0c057892dd42037b7ed109d1a7b6105 // SPDX-License-Identifier: Apache-2.0 // Copyright 2022 Aztec pragma solidity >=0.8.4; library EcdsaUltraVerificationKey { function verificationKeyHash() internal pure returns (bytes32) { - return 0xc1102f0000ae4bf7f5b38f96c80e03284a3ec4bada1f0682ddde94c8ba688c58; + return 0x2f843a63de8da557c6caf7abb57a3110d0c057892dd42037b7ed109d1a7b6105; } function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure { @@ -14,34 +14,34 @@ library EcdsaUltraVerificationKey { mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000006) // vk.num_inputs mstore(add(_vk, 0x40), 0x00eeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b7) // vk.work_root mstore(add(_vk, 0x60), 0x30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001) // vk.domain_inverse - mstore(add(_vk, 0x80), 0x149e839df8f43c6975d85aa1007d219354b3389f7c93c96935e531fe03d01f88) // vk.Q1.x - mstore(add(_vk, 0xa0), 0x15af1728559ee0f81053b668fa9978c5fc81ee84d017bc955ccfa37c19bd42a0) // vk.Q1.y - mstore(add(_vk, 0xc0), 0x29ba522730da8fa2a791946868afba96af78b025ba860d8e1d02e0325e677101) // vk.Q2.x - mstore(add(_vk, 0xe0), 0x1434909cf7d729b2f4227d83569641d90c4a72d393390825de20cea7ddad8044) // vk.Q2.y - mstore(add(_vk, 0x100), 0x03b90587c8746a60d96bc184e03c8469d813956caba6137040b350360357fe4f) // vk.Q3.x - mstore(add(_vk, 0x120), 0x211f025196191d107ae492f80f0effeb1e9242069f333d405698365df4838d43) // vk.Q3.y - mstore(add(_vk, 0x140), 0x0eae4a0952b07a5dbaf7750d79dae8fda3cfa4b5e7882413b6ada72c4297561e) // vk.Q4.x - mstore(add(_vk, 0x160), 0x0fa2558fd5e0afe53d359b1ec584eb6c0fabad27e4909227d9a4457d588b2830) // vk.Q4.y - mstore(add(_vk, 0x180), 0x01e7626aeb0ca204c26be5b01b3171994011b03f8966bb201303fc196c6c1a7e) // vk.Q_M.x - mstore(add(_vk, 0x1a0), 0x07972ee3ae6e0a0cf4978b64cd08783f42c7ce9905f1fd35da4ff6fa0e1a18e2) // vk.Q_M.y - mstore(add(_vk, 0x1c0), 0x03bd15837131c97d246c0aa57786e302b6d8227826104f70f56cba936a7b408e) // vk.Q_C.x - mstore(add(_vk, 0x1e0), 0x1a2e3be55cd01c1a4f4ef33fa96986e37c56abc06876e7f7d76229fb9f122c4c) // vk.Q_C.y - mstore(add(_vk, 0x200), 0x26d1d1578bb09f2f047035f103c3b32180c89b338e7d04ace8872b1154be6fb5) // vk.Q_ARITHMETIC.x - mstore(add(_vk, 0x220), 0x10c4691982c731ec4e2bb8216e8af8405fbe96fe8fe305ef2c3e03444fe68f85) // vk.Q_ARITHMETIC.y - mstore(add(_vk, 0x240), 0x1feb6cf63471a70e29caeee13eb393760c0f7d9e556327beb09a22b6b35e89f7) // vk.QSORT.x - mstore(add(_vk, 0x260), 0x1a834941cde87aa7a82450b4f093f149df9937db2edbdab47fa7216fbcb33580) // vk.QSORT.y + mstore(add(_vk, 0x80), 0x1cc85a07fb1009e23540957b29121dc57aaae5b1e89a22a932a1bdf7ccac1af2) // vk.Q1.x + mstore(add(_vk, 0xa0), 0x19a1a4fa6d8781abbcb696097c1817f54da296348a292954e2aa9856f2fa3b6a) // vk.Q1.y + mstore(add(_vk, 0xc0), 0x0409f05fe2901e7e339b3aaf0d7af7b5d4023e416da923321b15aae633b18fee) // vk.Q2.x + mstore(add(_vk, 0xe0), 0x0ae6cc44e9024c190ab310d7ad110226c5c76f15d158b60fc9acd98f2e1f1aa3) // vk.Q2.y + mstore(add(_vk, 0x100), 0x20e3b4e35df25ba02ac2a9be26bc6fe74640355e57455598e69922b8d3fd0939) // vk.Q3.x + mstore(add(_vk, 0x120), 0x1f49d18bdb86a449e676558c6d6349f123372641187e33e12128ee7468431942) // vk.Q3.y + mstore(add(_vk, 0x140), 0x00e95627d4db555ccf3b1ee6def34fab1a815f0482cb6a745a363940d3163831) // vk.Q4.x + mstore(add(_vk, 0x160), 0x19fe011a8a139da323b5ce5abebe54bf4c105acd6045d7b2b5df40a34411f44b) // vk.Q4.y + mstore(add(_vk, 0x180), 0x04b41648960da31317eff66b5ca9be0a6c81ebeead27e70b3c5b28d4aba11081) // vk.Q_M.x + mstore(add(_vk, 0x1a0), 0x1bff2df21a3fd9c49c29b7f7c153dd0bc331d75afc6a35fb7155c17bb0f67a63) // vk.Q_M.y + mstore(add(_vk, 0x1c0), 0x15faa2ea86a6a66cd9b969d6305f863595a73b9215c1ae442969f4993a8e5230) // vk.Q_C.x + mstore(add(_vk, 0x1e0), 0x26391cc92544b485d90313d3396b53d9207db8f84ead11bcf45467fa7eb38b94) // vk.Q_C.y + mstore(add(_vk, 0x200), 0x01a0d650b65d29965e4ae2a8cfb69470d7560f0826268da59c6e72e684a06c9b) // vk.Q_ARITHMETIC.x + mstore(add(_vk, 0x220), 0x2248d4a02e68036c8d0a4a6725ba0e5e8e95950a5285a3a7daa1a1726cc8ec6b) // vk.Q_ARITHMETIC.y + mstore(add(_vk, 0x240), 0x01afcbad715a0c382971311ad6fe4ff8b6e99200162aeb6245b585c99c8748a9) // vk.QSORT.x + mstore(add(_vk, 0x260), 0x18bf352081d1ba2ffe8088d34ce6471e4cf6d2ee63f006ea9a5e31cc41b6587c) // vk.QSORT.y mstore(add(_vk, 0x280), 0x21245d6c0a4d2ff12b21a825f39f30e8f8cf9b259448d111183e975828539576) // vk.Q_ELLIPTIC.x mstore(add(_vk, 0x2a0), 0x16a409532c8a1693536e93b6ce9920bfc2e6796e8dfe404675a0cdf6ee77ee7a) // vk.Q_ELLIPTIC.y - mstore(add(_vk, 0x2c0), 0x24005a1e8120ffcb3e5fc06ff50794b9d4b0bd70eabb1f8dfb342bec8a64dd61) // vk.Q_AUX.x - mstore(add(_vk, 0x2e0), 0x2c18b52f602a5a9b4461872eff0712f56d128bb9364471f838d7b07f008660e3) // vk.Q_AUX.y - mstore(add(_vk, 0x300), 0x02497b2d5e01266cea1f1bf4d9ad66e54045b3e388066db97b9623668728f65d) // vk.SIGMA1.x - mstore(add(_vk, 0x320), 0x0156cae236ca46f64832b4b826804da6c7221ab5ca4cdadd53a1b787992307fe) // vk.SIGMA1.y - mstore(add(_vk, 0x340), 0x2673cb9276dcc16be61e4c2ec24f6a881e771a273198ab0b392c26085a5f03b4) // vk.SIGMA2.x - mstore(add(_vk, 0x360), 0x1384aef6995f8e632b76cce98d900e2535d92719be668a8f0e20c893c87f391a) // vk.SIGMA2.y - mstore(add(_vk, 0x380), 0x11d48b7fc901d1e72489d937970ee3baea2662d268f9b1c08d71820a21ac6a39) // vk.SIGMA3.x - mstore(add(_vk, 0x3a0), 0x126e543f1951015c8a56ff6d571e67da3cc52d2671f3ce8d258378edcfe8a8f5) // vk.SIGMA3.y - mstore(add(_vk, 0x3c0), 0x0b41b102b59ecae092c04a4f09755db1dc4286c3072034ca23b7f885bcfec814) // vk.SIGMA4.x - mstore(add(_vk, 0x3e0), 0x13bf888757f9fad73f21ab3a0ef53a286329dbf0aaaa935d1689d8554db05813) // vk.SIGMA4.y + mstore(add(_vk, 0x2c0), 0x2d455f287e41544fd3744bab412640fd6916b01aa2163c84071eb47f0306a473) // vk.Q_AUX.x + mstore(add(_vk, 0x2e0), 0x09dea8e2b5e382a1c4a37bc4e60f5e8380688310b855c249d64153478d25e223) // vk.Q_AUX.y + mstore(add(_vk, 0x300), 0x09671927e293b22a3fb9fa8ea1680fcc4570bb2f312cb88004ff7fd4474e2109) // vk.SIGMA1.x + mstore(add(_vk, 0x320), 0x1c6442d9a49b3b93a928ef6ba2f348bc4c8cb778a59345faf7d173129f22b5a3) // vk.SIGMA1.y + mstore(add(_vk, 0x340), 0x0337d84b45a5abc701edbdc1a1d878178c23496b39ccddcc3f0f6199e3f97df6) // vk.SIGMA2.x + mstore(add(_vk, 0x360), 0x1c744f7be93d40c96d15fdf9d81c9502b7018573ad23e51dea7b065fdeb6f13a) // vk.SIGMA2.y + mstore(add(_vk, 0x380), 0x23a975cfb71f0c0d46ef9c0b01e6482e780b5e3af1a63547f7d01c46c1911699) // vk.SIGMA3.x + mstore(add(_vk, 0x3a0), 0x0d5a0be212cb2c7d3bba8c2406a9d2c4b04d4e64b0acef2681eb7c6aa490a7cb) // vk.SIGMA3.y + mstore(add(_vk, 0x3c0), 0x1ca2d0cca80bb16eab28d06c5c175e862a8ef14bceb6da79e65236a8a6a36838) // vk.SIGMA4.x + mstore(add(_vk, 0x3e0), 0x0555fe3dbd2ba2d7db2b5f740bf32fb57f4c5ac9d9f2e59e9a5a2cc2d84dae05) // vk.SIGMA4.y mstore(add(_vk, 0x400), 0x18f7cf965339d9c9d190296fa92f915767b0a8da455975f3e03fa98439fd7110) // vk.TABLE1.x mstore(add(_vk, 0x420), 0x0eecc02f9d44125407adbf00d56b086afd1adc5de536450afe05de382761b32f) // vk.TABLE1.y mstore(add(_vk, 0x440), 0x0bdfe662ea9f40f125ca5f7e99a8c6ba09b87ba8313864316745df862946c5c4) // vk.TABLE2.x @@ -50,16 +50,16 @@ library EcdsaUltraVerificationKey { mstore(add(_vk, 0x4a0), 0x1fda66dfb58273345f2471dff55c51b6856241460272e64b4cc67cde65231e89) // vk.TABLE3.y mstore(add(_vk, 0x4c0), 0x024ccc0fcff3b515cdc97dde2fae5c516bf3c97207891801707142af02538a83) // vk.TABLE4.x mstore(add(_vk, 0x4e0), 0x27827250d02b7b67d084bfc52b26c722f33f75ae5098c109573bfe92b782e559) // vk.TABLE4.y - mstore(add(_vk, 0x500), 0x302e6c8067a7ca14e1d75776754c1a3ad99d21056ae8e607ea66029cbe534906) // vk.TABLE_TYPE.x - mstore(add(_vk, 0x520), 0x07f2eb44fd686bf54e604a6b40c9151b7123db580a23c064ef703af4013dbc2f) // vk.TABLE_TYPE.y - mstore(add(_vk, 0x540), 0x00992a2f510c6371b9231c1d68d0e0fdbe10c5f4344de9441cc7c845afb37a1d) // vk.ID1.x - mstore(add(_vk, 0x560), 0x13eb38f67d8c03245e6f0655f5d40c145b2c06dd1657d8da26dc75af0cefa0f7) // vk.ID1.y - mstore(add(_vk, 0x580), 0x2ce905fbf9f932ae4f9b7b0feda15271b80921e9bf4e58c302ae99f1207fa4e7) // vk.ID2.x - mstore(add(_vk, 0x5a0), 0x2c2a6dc03599757fc625b0e55984d3fb28a954d40eb54f988b52c55936076988) // vk.ID2.y - mstore(add(_vk, 0x5c0), 0x0f547249b9aa5b9a951757893c059f8ed590366da4dd3ccd36aeac3069c7471f) // vk.ID3.x - mstore(add(_vk, 0x5e0), 0x2be2746434bfe0ccb2390357b17f8ec70ff12fc3aad4500b8d1723ec6709a170) // vk.ID3.y - mstore(add(_vk, 0x600), 0x19d1ed6b528ae5095d83167c3ba3578b36c7cd9249e47d10ceff352890d0938f) // vk.ID4.x - mstore(add(_vk, 0x620), 0x1dcd2caa39e180a497ff98414548e5de682d19fc598b3cd44242f1bb53a0e078) // vk.ID4.y + mstore(add(_vk, 0x500), 0x22b1d6b9827d6d03049f76dc9dc219ae6de93abe52d4d7de8677d961d3408c77) // vk.TABLE_TYPE.x + mstore(add(_vk, 0x520), 0x10ebc6be9f74e0367276028c613ab3efe0f2ed546c05339b36d5165d009c833a) // vk.TABLE_TYPE.y + mstore(add(_vk, 0x540), 0x2aa2e5247ce6524fecba0a2de9f383353096665f3ae8082fe7017fbf6d6572d8) // vk.ID1.x + mstore(add(_vk, 0x560), 0x1db802f61a6194bea68f7d5ec697facf26f1c1336b09e382801e8b773f0e116f) // vk.ID1.y + mstore(add(_vk, 0x580), 0x1aa955e508f3c2fbf55a36719eb666a45239935c4af10b8a1f4580d5cd614236) // vk.ID2.x + mstore(add(_vk, 0x5a0), 0x2bc21aa51420951a10a39d5c5242101d2207c47a0077852acb7d3fd6a16e1c58) // vk.ID2.y + mstore(add(_vk, 0x5c0), 0x245c89c4cf7c7e297b4db8e2625f5abd56398c351256a39aece0a36a940aaf62) // vk.ID3.x + mstore(add(_vk, 0x5e0), 0x01bd6e61d801d895c7edfee071518761f3c8c0e10bec5f0fb0b25ae430a2c91e) // vk.ID3.y + mstore(add(_vk, 0x600), 0x30223d4653291c03019e96bd716769c7c6d6520fddf2e633a75f94b08bee86dd) // vk.ID4.x + mstore(add(_vk, 0x620), 0x2e389428afa291855039f1b4af22e70d469f4e20116b85889737d624a2d27fef) // vk.ID4.y mstore(add(_vk, 0x640), 0x00) // vk.contains_recursive_proof mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 diff --git a/barretenberg/sol/src/ultra/keys/RecursiveUltraVerificationKey.sol b/barretenberg/sol/src/ultra/keys/RecursiveUltraVerificationKey.sol index 1cabff016cb..641305da4bc 100644 --- a/barretenberg/sol/src/ultra/keys/RecursiveUltraVerificationKey.sol +++ b/barretenberg/sol/src/ultra/keys/RecursiveUltraVerificationKey.sol @@ -1,72 +1,72 @@ -// Verification Key Hash: 9e6cf5dacef11085d9ea83e98b85ebdc37749931c90443898dcd8d18f639dad8 +// Verification Key Hash: a52397545a883471ee94e8a27e184be64d21640d76712b1e6fba67f3546503c9 // SPDX-License-Identifier: Apache-2.0 // Copyright 2022 Aztec pragma solidity >=0.8.4; library RecursiveUltraVerificationKey { function verificationKeyHash() internal pure returns (bytes32) { - return 0x9e6cf5dacef11085d9ea83e98b85ebdc37749931c90443898dcd8d18f639dad8; + return 0xa52397545a883471ee94e8a27e184be64d21640d76712b1e6fba67f3546503c9; } function loadVerificationKey(uint256 _vk, uint256 _omegaInverseLoc) internal pure { assembly { - mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000040000) // vk.circuit_size + mstore(add(_vk, 0x00), 0x0000000000000000000000000000000000000000000000000000000000080000) // vk.circuit_size mstore(add(_vk, 0x20), 0x0000000000000000000000000000000000000000000000000000000000000010) // vk.num_inputs - mstore(add(_vk, 0x40), 0x19ddbcaf3a8d46c15c0176fbb5b95e4dc57088ff13f4d1bd84c6bfa57dcdc0e0) // vk.work_root - mstore(add(_vk, 0x60), 0x30644259cd94e7dd5045d7a27013b7fcd21c9e3b7fa75222e7bda49b729b0401) // vk.domain_inverse - mstore(add(_vk, 0x80), 0x02c6f00fd259ba9440c68d211969bbd81509b234882d65fc79ee90fdcb6ccfda) // vk.Q1.x - mstore(add(_vk, 0xa0), 0x07f4fc84032451c171ea7150385b54a383fb083cc0c93895e2ef931e8e448345) // vk.Q1.y - mstore(add(_vk, 0xc0), 0x02b407e4c824960a965b5193ad8c6ccf4baaa4c99da5d11b13a2d6af52973ef7) // vk.Q2.x - mstore(add(_vk, 0xe0), 0x021fe5c3dd23b42f696dcd08659b8aa403c8e927f8c6e7b1446f4e9205c0a1c2) // vk.Q2.y - mstore(add(_vk, 0x100), 0x14f63403b60fb3ccf8325ec20e463e1daa492faf4d0151a8e7366f07c68f1d83) // vk.Q3.x - mstore(add(_vk, 0x120), 0x207cbbaffb34a0fe5eba27fd30f67e5389b1de65b703ccb78726831208ab600d) // vk.Q3.y - mstore(add(_vk, 0x140), 0x00ef12b054f19d72f2a6d0e628c6387026afd8a8924eb144ccc9948d4f6c5549) // vk.Q4.x - mstore(add(_vk, 0x160), 0x0a1cbb57818ceec1d15878315046a7db1238d292307cabafbb97f569df6dcefa) // vk.Q4.y - mstore(add(_vk, 0x180), 0x0d098b0bcd6db60c47f8e7e9eb1c072972deb39b294907cbc353352ebc2bea85) // vk.Q_M.x - mstore(add(_vk, 0x1a0), 0x0ff57407d8b18914e30d8583a77f67732f8b2762429a712c55b0c00fb83fe1c2) // vk.Q_M.y - mstore(add(_vk, 0x1c0), 0x2b01c45f214633bfaea1589083ab9a3a0915a6da362baa3151b1a0e80fb79160) // vk.Q_C.x - mstore(add(_vk, 0x1e0), 0x0392d6380d2912befda8d98bcddd6050683a814bb84eb7f57e28176033783f11) // vk.Q_C.y - mstore(add(_vk, 0x200), 0x24a6e759b9d12a53f809367cb3cbd00d96dfaa3af623e984bd986886447b642d) // vk.Q_ARITHMETIC.x - mstore(add(_vk, 0x220), 0x265e4202aa18f537a514281d72aaea8ab10090da270d8f9901363b4f48bc0610) // vk.Q_ARITHMETIC.y - mstore(add(_vk, 0x240), 0x04e5e383b53cf0f3eb3e824dcbc95d7fbb2ca7770bf92a3e86b652a425534714) // vk.QSORT.x - mstore(add(_vk, 0x260), 0x1bb4418c97c423508baf8d7825f2f41066dc4769dc4c9643ebddca0a71b71a87) // vk.QSORT.y - mstore(add(_vk, 0x280), 0x00a2e0e8c69ad29b60904f91a9db016a32a3de05f6ccdf024b5f149e8388484c) // vk.Q_ELLIPTIC.x - mstore(add(_vk, 0x2a0), 0x24be2bffbba65b40f4eeabba7a3660511baad3936c4ec40a6f9e20d194ec3a07) // vk.Q_ELLIPTIC.y - mstore(add(_vk, 0x2c0), 0x28725b01fa9c481b39aef64f5f54f9f967fd976b7ff4be45a9ca50f7500fef4c) // vk.Q_AUX.x - mstore(add(_vk, 0x2e0), 0x264e3e4c4529b321c407f802c173d2fb73b03e8ce09fe3de3c11f84b87b99d32) // vk.Q_AUX.y - mstore(add(_vk, 0x300), 0x1ec8ec2e5a6f36a00042f1199bad7fb25e950c9ce97f59777fd1739f422ce750) // vk.SIGMA1.x - mstore(add(_vk, 0x320), 0x002526bd09111cbc4d6f6c6e200f627e7ae60fb59bd5f1357d82f386b1009dc9) // vk.SIGMA1.y - mstore(add(_vk, 0x340), 0x0cc83ed6a722c67efdd44d5b6de2490621fd59c7c1c7a1416c99a6dff933e5d9) // vk.SIGMA2.x - mstore(add(_vk, 0x360), 0x01eb69a024162e13bc58e174cef5c0d2c7a12bdf3619f78010cfe09cd165c19d) // vk.SIGMA2.y - mstore(add(_vk, 0x380), 0x257e795ed0c6598cb79a148110eb2ce1dfb2a6378267e0a33f3c1d4dd7aadbcc) // vk.SIGMA3.x - mstore(add(_vk, 0x3a0), 0x01d596a895131eb6dbf6c9a89ddd9321ec5ed272d921b4edfed20b8f8ddc80cb) // vk.SIGMA3.y - mstore(add(_vk, 0x3c0), 0x167af14f050f637263e94a86a2408a14178c7ea304ffaee2db4b2d20e173832b) // vk.SIGMA4.x - mstore(add(_vk, 0x3e0), 0x211fb82fbb784f81f12914fbdb876c4a4b1f3670bf7aa291f661f7541bc8779c) // vk.SIGMA4.y - mstore(add(_vk, 0x400), 0x09796190fd3ba909c6530c89811df9b5b4f5f2fe6501ec21dd864b20673fc02c) // vk.TABLE1.x - mstore(add(_vk, 0x420), 0x00b9c2423e310caa43e1eb83b55f53977fccbed85422df8935635d77d146bf39) // vk.TABLE1.y - mstore(add(_vk, 0x440), 0x217dad26ccc0c543ec5750513e9365a5cae8164b08d364efcf4b5890ff05f334) // vk.TABLE2.x - mstore(add(_vk, 0x460), 0x1db28433f6bde424423f3587787f81c48101d2dc6e54b431332cb275f8518c62) // vk.TABLE2.y - mstore(add(_vk, 0x480), 0x2cc2d90f2da7f4ec16b7fe61babd4fb9b580ecff03c471764dd67a8c433afab5) // vk.TABLE3.x - mstore(add(_vk, 0x4a0), 0x3032b9ff096a43ce326cc63ffc6a86dcb913fb1f7700939f5304f6c6beb24574) // vk.TABLE3.y - mstore(add(_vk, 0x4c0), 0x1f4c58502ca713ed0bffb4ff31ed55e557e83a37d31b8e703aa9219d6158e2d2) // vk.TABLE4.x - mstore(add(_vk, 0x4e0), 0x0b0d5ed5432c5e7b56344c1d26ce0d9f632e8f8aa52505d6c89f6da89f357fa8) // vk.TABLE4.y - mstore(add(_vk, 0x500), 0x0869d6ec86b39958a4a10ed67954dc8931a1e5ee901099071c3c0684dd0eddde) // vk.TABLE_TYPE.x - mstore(add(_vk, 0x520), 0x1fc9d5e1b18c601f367b9551c00f5e541a48aa562cd0adb4369b51a7e99395b6) // vk.TABLE_TYPE.y - mstore(add(_vk, 0x540), 0x205b387095b6e538a6169c93c9db7d85ec219e2f0304b449f8849f5fde2c659f) // vk.ID1.x - mstore(add(_vk, 0x560), 0x07d8d408db8702ba4db7fec434fdee2b944313f72b0f94a9dcec74e7b715b3f8) // vk.ID1.y - mstore(add(_vk, 0x580), 0x2c758668e1cbf0572b139911af3f553c7898f7f07ffdcc58484a1a0acd14a03e) // vk.ID2.x - mstore(add(_vk, 0x5a0), 0x159322db7ac7485c5be7ce811a773c5fda9e26b0c47139eda1af6103c5c21b1c) // vk.ID2.y - mstore(add(_vk, 0x5c0), 0x026ba63c8620f00298a42a356b18392228d92c4301e8c51e44a3a2e14a6ebc89) // vk.ID3.x - mstore(add(_vk, 0x5e0), 0x2a962181e6a7df5a05d1750e7a22b6ec21fc84d8de08524aa75c4ee8f646bd0c) // vk.ID3.y - mstore(add(_vk, 0x600), 0x2c81aa9e4f466e56d2a6f1a971d431a487379970bb892424e12a0c71c41479b0) // vk.ID4.x - mstore(add(_vk, 0x620), 0x2e662e641087ed19b9ff866748197ab8a871deded79d2835f32e4bbadef1a889) // vk.ID4.y + mstore(add(_vk, 0x40), 0x2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd) // vk.work_root + mstore(add(_vk, 0x60), 0x3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d8201) // vk.domain_inverse + mstore(add(_vk, 0x80), 0x05104b486160545badec11f151e7c70b87050871da5653387ab4ab2ad0eef5ca) // vk.Q1.x + mstore(add(_vk, 0xa0), 0x2672c7fb298fce83f510eb6e1b851a5bb2daf8fc43c7771e96c56c8a09ddfeae) // vk.Q1.y + mstore(add(_vk, 0xc0), 0x2c019acf99c5663da83cec224bd32570ee90f45c4486a54dec3ca4552d8ab07a) // vk.Q2.x + mstore(add(_vk, 0xe0), 0x0fb7a3385ab42cafb0e104ac17ac2dacfb161d292c00fca102b1e780e86ccaf3) // vk.Q2.y + mstore(add(_vk, 0x100), 0x273ca9c29ef10864f4c9c053c336776a71ca5ebbf4bec1cb381e431943f9b5d7) // vk.Q3.x + mstore(add(_vk, 0x120), 0x2a94f00fe384ab945a8f5e3c97194a425a4d2109e5b113f059e42ee232659436) // vk.Q3.y + mstore(add(_vk, 0x140), 0x0e8b5c127c8a3ec285c2ac80d9046528051387878802203988a60650a0a960ab) // vk.Q4.x + mstore(add(_vk, 0x160), 0x17efdb659ae0d26aa78db132f9be9130460c0fce0c2a8e9b726de68247f76891) // vk.Q4.y + mstore(add(_vk, 0x180), 0x2f668d8a50bdb5c366e39433892f903262a04b6473ba3468c12057d58ad3bbfb) // vk.Q_M.x + mstore(add(_vk, 0x1a0), 0x2397c6171bc6d084e98297690441c9da9f011d18b3ea0bb58ee4d47227feb6b4) // vk.Q_M.y + mstore(add(_vk, 0x1c0), 0x1dafbfb4d30fcf880ef839ecc7fda9a97c315c5fa1713d08f7cdf6dba53ffb17) // vk.Q_C.x + mstore(add(_vk, 0x1e0), 0x099fa3de9ce0cc28085739745582b53bf7939e3d97928afd491392053c1c0a68) // vk.Q_C.y + mstore(add(_vk, 0x200), 0x028912be5d0accd4edf4949f89be1c1a2fcf4f59559ba03114da00ec3bf643ac) // vk.Q_ARITHMETIC.x + mstore(add(_vk, 0x220), 0x2428952bfba8ba44830fb0ae6fcdeb9bf17d611add9432450ebbe3d928e2f431) // vk.Q_ARITHMETIC.y + mstore(add(_vk, 0x240), 0x2b40c900824bcca193d402e0ef7f78792deaccd99743a78e5330abe8886ac989) // vk.QSORT.x + mstore(add(_vk, 0x260), 0x102a7a02bc1a7317702c09560636e991b856f26f88ee8f0b33da3dd7fe222dbb) // vk.QSORT.y + mstore(add(_vk, 0x280), 0x2bcf00433471db2be265df28ba2e70c36ca52f2932a4de25c0d60868703a0726) // vk.Q_ELLIPTIC.x + mstore(add(_vk, 0x2a0), 0x2f225b86590c67ae48360cb41d5b291ba94ce2dbae850afd9a6854122341b5ba) // vk.Q_ELLIPTIC.y + mstore(add(_vk, 0x2c0), 0x2eaee34d8508092cc4e19bc3f27ffa7dfc72230710e220f228f48906fae21e56) // vk.Q_AUX.x + mstore(add(_vk, 0x2e0), 0x0c503c5d6245b99bbc056925e96abd20feaed6507707311092b3ed87eadb3874) // vk.Q_AUX.y + mstore(add(_vk, 0x300), 0x021ba851cec3aedfbf1d9944907ae721f0d3e8fa3548513b6f108d101067ae85) // vk.SIGMA1.x + mstore(add(_vk, 0x320), 0x24eef378da346c4f9eededc5dc519d35b14fec46412c8fcf7564cafb9843d761) // vk.SIGMA1.y + mstore(add(_vk, 0x340), 0x0492b2fed8a158177dd3e825fb34ca7481bfead06bc01f308dc81fcd852ef3bc) // vk.SIGMA2.x + mstore(add(_vk, 0x360), 0x289bf1bcc6a9cb19b102c7fb9dba839e1817a24257194cad404b393ce77e66b5) // vk.SIGMA2.y + mstore(add(_vk, 0x380), 0x05d2a9c66d5c142b254b4f7d09f0eb837d95d8ec002e0644f51d455041403ca5) // vk.SIGMA3.x + mstore(add(_vk, 0x3a0), 0x2434b76f470965c85363ff15b3f37c7b4be4fb2741451dc33943879f1e4cbba4) // vk.SIGMA3.y + mstore(add(_vk, 0x3c0), 0x2f4bcc93500665a87a8f959e1636fe88cb1f17688b8c286fe930ccf934a49ac2) // vk.SIGMA4.x + mstore(add(_vk, 0x3e0), 0x243f7b4ae1d483c99523b6a2999f404ab744017c8f43080c3582c38ea8ea3d1a) // vk.SIGMA4.y + mstore(add(_vk, 0x400), 0x0ddc3b6d8e59cf0996ca71ad4132ca9d618ffd933cf58a8a0953dc76f97cf108) // vk.TABLE1.x + mstore(add(_vk, 0x420), 0x153193287060386695f4f2d0d3525dec4c6a253f431d3f3fc06aa0e5b0448b8c) // vk.TABLE1.y + mstore(add(_vk, 0x440), 0x1170f0ece62f8c572bca96b141d27f4bd25585edb9319128045c005d48491b1e) // vk.TABLE2.x + mstore(add(_vk, 0x460), 0x246cd041690f653f88ed0c56ad282a3dd2e37b8edb1f56b785809d7710bf1c88) // vk.TABLE2.y + mstore(add(_vk, 0x480), 0x26153c937447356a0c6d6be09d85eb34bc8a00ce9d452888e5fc2b5a7e14fed7) // vk.TABLE3.x + mstore(add(_vk, 0x4a0), 0x189da022421fbd8dfd7973084d978e555388ad9364679246b07992f84b4e91b2) // vk.TABLE3.y + mstore(add(_vk, 0x4c0), 0x285311c5e9a4cbb56a3f04f29d5443e8c0f9753e2a5a35acec051fafe2cecce5) // vk.TABLE4.x + mstore(add(_vk, 0x4e0), 0x2436400260c9d3180beedd0bf49fec92d2d0ac76a1be7f1fad96cbd997175312) // vk.TABLE4.y + mstore(add(_vk, 0x500), 0x139bb66456d96a4e2dad361f7949a6b8c6739650965ae729788162fbb0382399) // vk.TABLE_TYPE.x + mstore(add(_vk, 0x520), 0x098fad1329e1765863f8ac829332168359901da71702e5119ce4b89a7ae6f017) // vk.TABLE_TYPE.y + mstore(add(_vk, 0x540), 0x14fc4c6c2521387172a6b801e2b6c8a2308d725695d3f49a57151c2a0a8af0fe) // vk.ID1.x + mstore(add(_vk, 0x560), 0x2ce0c2c73ded7bcf19c1208f134b67ed74f77ef717db1c05c010bc8df7bed39e) // vk.ID1.y + mstore(add(_vk, 0x580), 0x0e2455a361f4a3741dab6a03b8186996a5a9873a3b62b3fa8eb5a551cb46bb7a) // vk.ID2.x + mstore(add(_vk, 0x5a0), 0x29a288b84aeabb0421861492256c6ea82530b5b14c0e01e5b7b2553cf197a2e7) // vk.ID2.y + mstore(add(_vk, 0x5c0), 0x01fbecd3bc90ad298a27bf4f9aa071746c30b5af932a1ba8d5b04394f85e0370) // vk.ID3.x + mstore(add(_vk, 0x5e0), 0x0b21c924fc2b44729ff84deeae724c68dd1636e847b0f7cdd92ad203af7cf0d5) // vk.ID3.y + mstore(add(_vk, 0x600), 0x12f7ebb5e50b429b766b1dc5e8b32b7727593641e4f976b72a7046d0a3ff8dea) // vk.ID4.x + mstore(add(_vk, 0x620), 0x2d45226edb0f8338bb5fa88ecefeeaa9bbb72232a2e842f8c7f37cd11f7065ed) // vk.ID4.y mstore(add(_vk, 0x640), 0x01) // vk.contains_recursive_proof mstore(add(_vk, 0x660), 0) // vk.recursive_proof_public_input_indices mstore(add(_vk, 0x680), 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1) // vk.g2_x.X.c1 mstore(add(_vk, 0x6a0), 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0) // vk.g2_x.X.c0 mstore(add(_vk, 0x6c0), 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4) // vk.g2_x.Y.c1 mstore(add(_vk, 0x6e0), 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55) // vk.g2_x.Y.c0 - mstore(_omegaInverseLoc, 0x036853f083780e87f8d7c71d111119c57dbe118c22d5ad707a82317466c5174c) // vk.work_root_inverse + mstore(_omegaInverseLoc, 0x06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321) // vk.work_root_inverse } } } diff --git a/barretenberg/ts/.rebuild_patterns b/barretenberg/ts/.rebuild_patterns new file mode 100644 index 00000000000..562e0c9acb2 --- /dev/null +++ b/barretenberg/ts/.rebuild_patterns @@ -0,0 +1 @@ +^barretenberg/ts/.*$ \ No newline at end of file diff --git a/barretenberg/ts/Earthfile b/barretenberg/ts/Earthfile index b18e91f9039..cc5d1695544 100644 --- a/barretenberg/ts/Earthfile +++ b/barretenberg/ts/Earthfile @@ -1,49 +1,78 @@ VERSION 0.8 -FROM ../../build-images+from-registry -WORKDIR /usr/src/barretenberg/ts-build +CACHE: + FUNCTION + ARG command + ARG build_artifacts + ARG prefix + # TODO(#8929): reinstate bb.js caching + RUN $command + # DO ../../build-system/s3-cache-scripts/+WITH_CACHE \ + # --prefix="bb.js-$prefix" \ + # --command="$command" \ + # --rebuild_patterns="../cpp/.rebuild_patterns .rebuild_patterns" \ + # --build_artifacts="$build_artifacts" -# minimum files to download yarn packages -# keep timestamps for incremental builds -COPY --dir .yarn package.json yarn.lock .yarnrc.yml . -RUN echo CONTENT HASH $(find . -type f -exec sha256sum {} ';' | sort | sha256sum | awk '{print $1}') | tee .content-hash -RUN yarn --immutable +deps: + FROM ../../build-images+from-registry + WORKDIR /usr/src/barretenberg/ts -# other source files -COPY --dir src *.json *.js *.cjs . + # minimum files to download yarn packages + # keep timestamps for incremental builds + COPY --dir .yarn package.json yarn.lock .yarnrc.yml . + RUN yarn --immutable -# copy over wasm builds from cpp folder -COPY ../cpp/+preset-wasm-threads/bin/barretenberg.wasm src/barretenberg_wasm/barretenberg-threads.wasm -COPY ../cpp/+preset-wasm/bin/barretenberg.wasm src/barretenberg_wasm/barretenberg.wasm -COPY ../cpp/+preset-wasm-threads/bin/barretenberg.wasm dest/node/barretenberg_wasm/barretenberg-threads.wasm -COPY ../cpp/+preset-wasm-threads/bin/barretenberg.wasm dest/node-cjs/barretenberg_wasm/barretenberg-threads.wasm + # other source files + COPY --dir src *.json *.js *.cjs . + + # copy over wasm builds from cpp folder + COPY ../cpp/+preset-wasm-threads/bin/barretenberg.wasm src/barretenberg_wasm/barretenberg-threads.wasm + COPY ../cpp/+preset-wasm/bin/barretenberg.wasm src/barretenberg_wasm/barretenberg.wasm + COPY ../cpp/+preset-wasm-threads/bin/barretenberg.wasm dest/node/barretenberg_wasm/barretenberg-threads.wasm + COPY ../cpp/+preset-wasm-threads/bin/barretenberg.wasm dest/node-cjs/barretenberg_wasm/barretenberg-threads.wasm esm: - RUN yarn build:esm - SAVE ARTIFACT /usr/src/barretenberg/ts-build build + FROM +deps + DO +CACHE \ + --prefix="browser" \ + --command="yarn build:esm" \ + --build_artifacts="." + SAVE ARTIFACT /usr/src/barretenberg/ts build cjs: + FROM +deps COPY scripts/cjs_postprocess.sh scripts/ - RUN yarn build:cjs - SAVE ARTIFACT /usr/src/barretenberg/ts-build build + DO +CACHE \ + --prefix="cjs" \ + --command="yarn build:cjs" \ + --build_artifacts="." + SAVE ARTIFACT /usr/src/barretenberg/ts build browser: + FROM +deps RUN yarn build:browser - SAVE ARTIFACT /usr/src/barretenberg/ts-build build + DO +CACHE \ + --prefix="browser" \ + --command="yarn build:browser" \ + --build_artifacts="." + SAVE ARTIFACT /usr/src/barretenberg/ts build test-prettier-format: + FROM +deps RUN yarn formatting build: + FROM +deps # collect all our build types - COPY +esm/build /usr/src/barretenberg/ts-build - COPY +cjs/build /usr/src/barretenberg/ts-build - COPY +browser/build /usr/src/barretenberg/ts-build + COPY +esm/build /usr/src/barretenberg/ts + COPY +cjs/build /usr/src/barretenberg/ts + COPY +browser/build /usr/src/barretenberg/ts # We want to create a pure package, as would be published to npm, for consuming projects. - RUN yarn pack && tar zxf package.tgz && rm package.tgz && mv package ../ts + RUN yarn pack && tar zxf package.tgz && rm package.tgz SAVE ARTIFACT /usr/src/barretenberg/ts build test: + FROM +deps BUILD +test-prettier-format # We frequently get tests timing out in GA, increase the timeout here RUN yarn test --testTimeout=300000 diff --git a/barretenberg/ts/src/barretenberg/index.ts b/barretenberg/ts/src/barretenberg/index.ts index 264f8e91d9b..cb8c6607751 100644 --- a/barretenberg/ts/src/barretenberg/index.ts +++ b/barretenberg/ts/src/barretenberg/index.ts @@ -14,8 +14,14 @@ export { UltraPlonkBackend, UltraHonkBackend } from './backend.js'; const debug = createDebug('bb.js:wasm'); export type BackendOptions = { + /** @description Number of threads to run the backend worker on */ threads?: number; + + /** @description Initial and Maximum memory to be alloted to the backend worker */ memory?: { initial?: number; maximum?: number }; + + /** @description Path to download CRS files */ + crsPath?: string; }; /** @@ -23,8 +29,11 @@ export type BackendOptions = { * It extends the generated api, and provides a static constructor "new" to compose components. */ export class Barretenberg extends BarretenbergApi { - private constructor(private worker: any, wasm: BarretenbergWasmWorker) { + private options: BackendOptions; + + private constructor(private worker: any, wasm: BarretenbergWasmWorker, options: BackendOptions) { super(wasm); + this.options = options; } /** @@ -33,12 +42,12 @@ export class Barretenberg extends BarretenbergApi { * and blocking the main thread in the browser is not allowed. * It threads > 1 (defaults to hardware availability), child threads will be created on their own workers. */ - static async new({ threads: desiredThreads, memory }: BackendOptions = {}) { + static async new(options: BackendOptions = {}) { const worker = createMainWorker(); const wasm = getRemoteBarretenbergWasm(worker); - const { module, threads } = await fetchModuleAndThreads(desiredThreads); - await wasm.init(module, threads, proxy(debug), memory?.initial, memory?.maximum); - return new Barretenberg(worker, wasm); + const { module, threads } = await fetchModuleAndThreads(options.threads); + await wasm.init(module, threads, proxy(debug), options.memory?.initial, options.memory?.maximum); + return new Barretenberg(worker, wasm, options); } async getNumThreads() { @@ -46,7 +55,7 @@ export class Barretenberg extends BarretenbergApi { } async initSRSForCircuitSize(circuitSize: number): Promise { - const crs = await Crs.new(circuitSize + 1); + const crs = await Crs.new(circuitSize + Math.floor((circuitSize * 6) / 10) + 1, this.options.crsPath); await this.commonInitSlabAllocator(circuitSize); await this.srsInitSrs(new RawBuffer(crs.getG1Data()), crs.numPoints, new RawBuffer(crs.getG2Data())); } diff --git a/barretenberg/ts/src/index.ts b/barretenberg/ts/src/index.ts index a58a25203a0..d67bad794af 100644 --- a/barretenberg/ts/src/index.ts +++ b/barretenberg/ts/src/index.ts @@ -8,3 +8,4 @@ export { UltraHonkBackend, } from './barretenberg/index.js'; export { RawBuffer, Fr } from './types/index.js'; +export { splitHonkProof, reconstructHonkProof } from './proof/index.js'; diff --git a/barretenberg/ts/src/main.ts b/barretenberg/ts/src/main.ts index b12c4e83f60..1899cd1b97e 100755 --- a/barretenberg/ts/src/main.ts +++ b/barretenberg/ts/src/main.ts @@ -64,8 +64,11 @@ async function initUltraPlonk(bytecodePath: string, crsPath: string, subgroupSiz debug(`circuit size: ${circuitSize}`); debug(`subgroup size: ${subgroupSize}`); debug('loading crs...'); + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1097): tighter bound needed + // currently using 1.6x points in CRS because of structured polys, see notes for how to minimize + // Needed here for initUltraPlonk because MegaHonk currently uses this function. // Plus 1 needed! (Move +1 into Crs?) - const crs = await Crs.new(subgroupSize + 1, crsPath); + const crs = await Crs.new(subgroupSize + Math.floor((subgroupSize * 6) / 10) + 1, crsPath); // Important to init slab allocator as first thing, to ensure maximum memory efficiency for Plonk. await api.commonInitSlabAllocator(subgroupSize); @@ -87,8 +90,10 @@ async function initUltraHonk(bytecodePath: string, crsPath: string) { debug(`circuit size: ${circuitSize}`); debug(`dyadic circuit size size: ${dyadicCircuitSize}`); debug('loading crs...'); + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1097): tighter bound needed + // currently using 1.6x points in CRS because of structured polys, see notes for how to minimize // Plus 1 needed! (Move +1 into Crs?) - const crs = await Crs.new(dyadicCircuitSize + 1, crsPath); + const crs = await Crs.new(dyadicCircuitSize + Math.floor((dyadicCircuitSize * 6) / 10) + 1, crsPath); // Load CRS into wasm global CRS state. // TODO: Make RawBuffer be default behavior, and have a specific Vector type for when wanting length prefixed. @@ -100,8 +105,10 @@ async function initClientIVC(bytecodePath: string, crsPath: string) { const api = await Barretenberg.new({ threads }); debug('loading BN254 and Grumpkin crs...'); + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1097): tighter bound needed + // currently using 1.6x points in CRS because of structured polys, see notes for how to minimize // Plus 1 needed! (Move +1 into Crs?) - const crs = await Crs.new(2 ** 18 + 1, crsPath); + const crs = await Crs.new(2 ** 19 + 1, crsPath); const grumpkinCrs = await GrumpkinCrs.new(2 ** 14 + 1, crsPath); // Load CRS into wasm global CRS state. diff --git a/barretenberg/ts/src/proof/index.ts b/barretenberg/ts/src/proof/index.ts new file mode 100644 index 00000000000..4219f167fc9 --- /dev/null +++ b/barretenberg/ts/src/proof/index.ts @@ -0,0 +1,64 @@ +// Buffers are prepended with their size. The size takes 4 bytes. +const serializedBufferSize = 4; +const fieldByteSize = 32; +const publicInputOffset = 3; +const publicInputsOffsetBytes = publicInputOffset * fieldByteSize; + +export function splitHonkProof(proofWithPublicInputs: Uint8Array): { publicInputs: Uint8Array; proof: Uint8Array } { + const proofAsStrings = deflattenFields(proofWithPublicInputs.slice(4)); + + const numPublicInputs = Number(proofAsStrings[1]); + + // Account for the serialized buffer size at start + const publicInputsOffset = publicInputsOffsetBytes + serializedBufferSize; + // Get the part before and after the public inputs + const proofStart = proofWithPublicInputs.slice(0, publicInputsOffset); + const publicInputsSplitIndex = numPublicInputs * fieldByteSize; + const proofEnd = proofWithPublicInputs.slice(publicInputsOffset + publicInputsSplitIndex); + // Construct the proof without the public inputs + const proof = new Uint8Array([...proofStart, ...proofEnd]); + + // Fetch the number of public inputs out of the proof string + const publicInputs = proofWithPublicInputs.slice(publicInputsOffset, publicInputsOffset + publicInputsSplitIndex); + + return { + proof, + publicInputs, + }; +} + +export function reconstructHonkProof(publicInputs: Uint8Array, proof: Uint8Array): Uint8Array { + const proofStart = proof.slice(0, publicInputsOffsetBytes + serializedBufferSize); + const proofEnd = proof.slice(publicInputsOffsetBytes + serializedBufferSize); + + // Concatenate publicInputs and proof + const proofWithPublicInputs = Uint8Array.from([...proofStart, ...publicInputs, ...proofEnd]); + + return proofWithPublicInputs; +} + +function deflattenFields(flattenedFields: Uint8Array): string[] { + const publicInputSize = 32; + const chunkedFlattenedPublicInputs: Uint8Array[] = []; + + for (let i = 0; i < flattenedFields.length; i += publicInputSize) { + const publicInput = flattenedFields.slice(i, i + publicInputSize); + chunkedFlattenedPublicInputs.push(publicInput); + } + + return chunkedFlattenedPublicInputs.map(uint8ArrayToHex); +} + +function uint8ArrayToHex(buffer: Uint8Array): string { + const hex: string[] = []; + + buffer.forEach(function (i) { + let h = i.toString(16); + if (h.length % 2) { + h = '0' + h; + } + hex.push(h); + }); + + return '0x' + hex.join(''); +} diff --git a/bb-pilcom/bb-pil-backend/templates/verifier.cpp.hbs b/bb-pilcom/bb-pil-backend/templates/verifier.cpp.hbs index b6a101ff1fd..2b7bcfc07f4 100644 --- a/bb-pilcom/bb-pil-backend/templates/verifier.cpp.hbs +++ b/bb-pilcom/bb-pil-backend/templates/verifier.cpp.hbs @@ -38,7 +38,7 @@ inline FF AvmVerifier::evaluate_public_input_column(const std::vector& point * @brief This function verifies an {{name}} Honk proof for given program settings. * */ -bool {{name}}Verifier::verify_proof(const HonkProof& proof, [[maybe_unused]] const std::vector>& public_inputs) +bool {{name}}Verifier::verify_proof(const HonkProof& proof, const std::vector>& public_inputs) { using Flavor = {{name}}Flavor; using FF = Flavor::FF; diff --git a/bootstrap.sh b/bootstrap.sh index 9b6cc7d073b..2378c85ec1e 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -70,12 +70,12 @@ function check_toolchains { fi # Check foundry version. for tool in forge anvil; do - if ! $tool --version 2> /dev/null | grep de33b6a > /dev/null; then + if ! $tool --version 2> /dev/null | grep 25f24e6 > /dev/null; then encourage_dev_container - echo "$tool not in PATH or incorrect version (requires de33b6af53005037b463318d2628b5cfcaf39916)." + echo "$tool not in PATH or incorrect version (requires 25f24e677a6a32a62512ad4f561995589ac2c7dc)." echo "Installation: https://book.getfoundry.sh/getting-started/installation (requires rust 1.75)" echo " curl -L https://foundry.paradigm.xyz | bash" - echo " foundryup -b de33b6af53005037b463318d2628b5cfcaf39916" + echo " foundryup -b 25f24e677a6a32a62512ad4f561995589ac2c7dc" exit 1 fi done diff --git a/boxes/boxes/react/src/contracts/src/main.nr b/boxes/boxes/react/src/contracts/src/main.nr index 6d5d4ecc830..4c8e38cc476 100644 --- a/boxes/boxes/react/src/contracts/src/main.nr +++ b/boxes/boxes/react/src/contracts/src/main.nr @@ -5,7 +5,7 @@ contract BoxReact { use dep::aztec::{ keys::public_keys::{IvpkM, OvpkM}, prelude::{AztecAddress, PrivateMutable, Map, NoteInterface, NoteHeader, Point}, - encrypted_logs::encrypted_note_emission::encode_and_encrypt_note_with_keys, + encrypted_logs::encrypted_note_emission::encode_and_encrypt_note, macros::{storage::storage, functions::{private, public, initializer}} }; use dep::value_note::value_note::ValueNote; @@ -26,7 +26,7 @@ contract BoxReact { ) { let numbers = storage.numbers; let mut new_number = ValueNote::new(number, owner_npk_m_hash); - numbers.at(owner).initialize(&mut new_number).emit(encode_and_encrypt_note_with_keys(&mut context, owner_ovpk_m, owner_ivpk_m, owner)); + numbers.at(owner).initialize(&mut new_number).emit(encode_and_encrypt_note(&mut context, owner_ovpk_m, owner_ivpk_m, owner)); } #[private] @@ -39,7 +39,7 @@ contract BoxReact { ) { let numbers = storage.numbers; let mut new_number = ValueNote::new(number, owner_npk_m_hash); - numbers.at(owner).replace(&mut new_number).emit(encode_and_encrypt_note_with_keys(&mut context, owner_ovpk_m, owner_ivpk_m, owner)); + numbers.at(owner).replace(&mut new_number).emit(encode_and_encrypt_note(&mut context, owner_ovpk_m, owner_ivpk_m, owner)); } unconstrained fn getNumber(owner: AztecAddress) -> pub ValueNote { diff --git a/boxes/boxes/vanilla/src/contracts/src/main.nr b/boxes/boxes/vanilla/src/contracts/src/main.nr index f336c4ad841..41c0ff7d3a3 100644 --- a/boxes/boxes/vanilla/src/contracts/src/main.nr +++ b/boxes/boxes/vanilla/src/contracts/src/main.nr @@ -5,7 +5,7 @@ contract Vanilla { use dep::aztec::{ keys::public_keys::{IvpkM, OvpkM}, prelude::{AztecAddress, PrivateMutable, Map, NoteInterface, NoteHeader, Point}, - encrypted_logs::encrypted_note_emission::encode_and_encrypt_note_with_keys, + encrypted_logs::encrypted_note_emission::encode_and_encrypt_note, macros::{storage::storage, functions::{private, public, initializer}} }; use dep::value_note::value_note::{ValueNote, VALUE_NOTE_LEN}; @@ -26,7 +26,7 @@ contract Vanilla { ) { let numbers = storage.numbers; let mut new_number = ValueNote::new(number, owner_npk_m_hash); - numbers.at(owner).initialize(&mut new_number).emit(encode_and_encrypt_note_with_keys(&mut context, owner_ovpk_m, owner_ivpk_m, owner)); + numbers.at(owner).initialize(&mut new_number).emit(encode_and_encrypt_note(&mut context, owner_ovpk_m, owner_ivpk_m, owner)); } #[private] @@ -39,7 +39,7 @@ contract Vanilla { ) { let numbers = storage.numbers; let mut new_number = ValueNote::new(number, owner_npk_m_hash); - numbers.at(owner).replace(&mut new_number).emit(encode_and_encrypt_note_with_keys(&mut context, owner_ovpk_m, owner_ivpk_m, owner)); + numbers.at(owner).replace(&mut new_number).emit(encode_and_encrypt_note(&mut context, owner_ovpk_m, owner_ivpk_m, owner)); } unconstrained fn getNumber(owner: AztecAddress) -> pub ValueNote { diff --git a/build-images/Earthfile b/build-images/Earthfile index da8aeb737c0..8d3c577e459 100644 --- a/build-images/Earthfile +++ b/build-images/Earthfile @@ -86,15 +86,21 @@ osxcross: ######################################################################################################################## # Build foundry. foundry-build: - LET FOUNDRY_TAG = de33b6af53005037b463318d2628b5cfcaf39916 + LET FOUNDRY_TAG = 25f24e677a6a32a62512ad4f561995589ac2c7dc FROM +base-build + # We use rustup rather than cargo to manage the cargo version via a tool-chain file + # It is done this way to avoid conflicting with noir builds + # This image should only be rebuilt when our foundry tag changes, so it should be extremely infrequent + RUN apt remove -y cargo + RUN apt update && apt install -y rustup RUN ulimit -n 65535 \ && git clone --depth 1 --branch nightly-$FOUNDRY_TAG https://github.com/foundry-rs/foundry.git \ && cd foundry \ - && cargo build --profile local \ + && echo '[toolchain]\nchannel = "1.80.0"\n' > rust-toolchain.toml \ + && cargo build --release \ && mkdir -p /opt/foundry/bin \ && for t in forge cast anvil chisel; do \ - mv ./target/local/$t /opt/foundry/bin/$t; \ + mv ./target/release/$t /opt/foundry/bin/$t; \ strip /opt/foundry/bin/$t; \ done \ && rm -rf /foundry @@ -104,7 +110,7 @@ foundry-build: foundry: BUILD +foundry-build - LET FOUNDRY_TAG = de33b6af53005037b463318d2628b5cfcaf39916 + LET FOUNDRY_TAG = 25f24e677a6a32a62512ad4f561995589ac2c7dc ARG TARGETARCH FROM ubuntu:noble COPY +foundry-build/opt/foundry /opt/foundry diff --git a/build-system/s3-cache-scripts/Earthfile b/build-system/s3-cache-scripts/Earthfile new file mode 100644 index 00000000000..95034145a63 --- /dev/null +++ b/build-system/s3-cache-scripts/Earthfile @@ -0,0 +1,54 @@ +VERSION 0.8 +# Sets up Earthly boilerplate for using our s3 cache. + +setup-cache-helper: + FROM scratch + COPY *.sh . + SAVE ARTIFACT ./* + +SETUP_CACHE: + FUNCTION + COPY +setup-cache-helper/* /usr/src/build-system/s3-cache-scripts/ + +# needed intermediary to call out to LOCALLY and go back to normal context +compute-content-hash: + ARG local_directory_equivalent + ARG rebuild_patterns + LOCALLY + RUN [ ! -z "$rebuild_patterns" ] || (echo 'Did not pass rebuild patterns to cache command!' && exit 1) + LET content_hash_script="$(pwd)/compute-content-hash.sh" + LET content_hash=$(cd "../../$local_directory_equivalent" && AZTEC_CACHE_REBUILD_PATTERNS="$rebuild_patterns" "$content_hash_script") + FROM ubuntu:noble + RUN echo "$content_hash" > .content-hash + SAVE ARTIFACT .content-hash + +WRITE_CONTENT_HASH: + FUNCTION + ARG rebuild_patterns + LET local_dir=$(pwd | sed 's|^/usr/src/||') + COPY (+compute-content-hash/.content-hash --local_directory_equivalent="$local_dir" --rebuild_patterns="$rebuild_patterns") . + +# 1) copies necessary context +# 2) first tries our rebuild pattern and context against our S3/minio cache +# 3) if not, we build with $command +# 4) then we try to upload to S3/minio cache for next time +WITH_CACHE: + FUNCTION + ARG command + ARG prefix + ARG rebuild_patterns + ARG build_artifacts + # print a clean version as the one below will be obfuscated + RUN echo "--> RUN WITH CACHE $command (start)" + DO +SETUP_CACHE + DO +WRITE_CONTENT_HASH --rebuild_patterns="$rebuild_patterns" + # configure AWS access and S3 cache params (note these can be blank if not using S3 build cache) + # we abuse secrets here somewhat to keep a stable build hash in Earthly, as secrets don't affect earthly's caching + RUN --secret AWS_ACCESS_KEY_ID \ + --secret AWS_SECRET_ACCESS_KEY \ + --secret S3_BUILD_CACHE_UPLOAD \ + --secret S3_BUILD_CACHE_DOWNLOAD \ + --secret S3_BUILD_CACHE_MINIO_URL \ + # Note, this should be edited in tandem with the ARGs above, but for clean logs we wrap this in a script + /usr/src/build-system/s3-cache-scripts/earthly-s3-cache.sh + RUN echo "--> RUN WITH CACHE $command (end)" diff --git a/build-system/s3-cache-scripts/README.md b/build-system/s3-cache-scripts/README.md new file mode 100644 index 00000000000..9b9b6bd03b2 --- /dev/null +++ b/build-system/s3-cache-scripts/README.md @@ -0,0 +1,10 @@ +Scripts that implement a simple scheme to upload and download from S3 for use with caching. Supports .rebuild_patterns files inside the monorepo for detecting changes. +Assumes a git committed state. If that is not the case, you should not use the cache (as the Earthly usage does not). + +Rationale: +- We need a unified cache tool that can support distributed caching. This is needed to replace our old docker image-based caching. It is easier to share S3 access and overall easier to use S3 tarballs rather than docker images. + +See Earthfile and test.sh for usage. + +Installation: +- This is just some shell scripts, but you do need AWS credentials set up and aws commandline installed otherwise the scripts **do nothing**. diff --git a/build-system/s3-cache-scripts/cache-download.sh b/build-system/s3-cache-scripts/cache-download.sh new file mode 100755 index 00000000000..3fbbf43503e --- /dev/null +++ b/build-system/s3-cache-scripts/cache-download.sh @@ -0,0 +1,25 @@ +#!/bin/bash +set -eu + +if [ "$#" -ne 1 ]; then + echo "Usage: $0 " + exit 1 +fi + +# Get the tar.gz file name from the argument +TAR_FILE="$1" + +function on_exit() { + # Cleanup the temporary tar.gz file + rm -f "$TAR_FILE" +} +# Run on any exit +trap on_exit EXIT + +# Attempt to download the cache file +aws ${S3_BUILD_CACHE_AWS_PARAMS:-} s3 cp "s3://aztec-ci-artifacts/build-cache/$TAR_FILE" "$TAR_FILE" --quiet + +# Extract the cache file +tar -xzf "$TAR_FILE" + +echo "Cache download and extraction complete." diff --git a/build-system/s3-cache-scripts/cache-upload.sh b/build-system/s3-cache-scripts/cache-upload.sh new file mode 100755 index 00000000000..d574d246e90 --- /dev/null +++ b/build-system/s3-cache-scripts/cache-upload.sh @@ -0,0 +1,27 @@ +#!/bin/bash +set -eu + +if [ "$#" -lt 2 ]; then + echo "Usage: $0 " + exit 1 +fi + +# Name, intended to have .tar.gz ending +NAME="$1" + +shift 1 + +TAR_DIR=$(mktemp -d) +TAR_FILE="$TAR_DIR/${NAME}" + +function on_exit() { + # Cleanup the temporary folder + rm -rf "$TAR_DIR" +} +trap on_exit EXIT + +# Create the tar.gz file +# Rest of args are our binary paths +tar -czf "$TAR_FILE" $@ + +aws ${S3_BUILD_CACHE_AWS_PARAMS:-} s3 cp "$TAR_FILE" "s3://aztec-ci-artifacts/build-cache/$NAME" \ No newline at end of file diff --git a/build-system/s3-cache-scripts/compute-content-hash.sh b/build-system/s3-cache-scripts/compute-content-hash.sh new file mode 100755 index 00000000000..d65e19c2c7f --- /dev/null +++ b/build-system/s3-cache-scripts/compute-content-hash.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Ensure AZTEC_CACHE_REBUILD_PATTERNS is set +if [ -z "${AZTEC_CACHE_REBUILD_PATTERNS:-}" ]; then + echo "Error: AZTEC_CACHE_REBUILD_PATTERNS environment variable is not set." + exit 1 +fi + +# Read rebuild patterns as multi-line string +REBUILD_PATTERNS="$AZTEC_CACHE_REBUILD_PATTERNS" + +# Concatenate patterns with '|' and double escape backslashes for AWK +AWK_PATTERN=$(cat $REBUILD_PATTERNS | sed 's/\\/\\\\/g' | tr '\n' '|' | sed 's/|$//') + +# use git repo root because that is where our patterns are focused +cd $(git rev-parse --show-toplevel) +# Use git ls-tree and AWK to filter files matching the rebuild patterns and extract their hashes +FILE_HASHES=$(git ls-tree -r HEAD | awk -v pattern="($AWK_PATTERN)" '$4 ~ pattern {print $3}') + +# Check if FILE_HASHES is empty +if [ -z "$FILE_HASHES" ]; then + echo "No files matched the rebuild patterns $REBUILD_PATTERNS." + echo "Awk pattern expanded: $AWK_PATTERN." + exit 1 +fi + +# Sort the hashes and compute the content hash +CONTENT_HASH=$(echo "$FILE_HASHES" | sort | git hash-object --stdin) +# important: include architecture in content hash because we target x86_64 and arm64 +echo "$CONTENT_HASH-$(uname -m)" diff --git a/build-system/s3-cache-scripts/earthly-s3-cache.sh b/build-system/s3-cache-scripts/earthly-s3-cache.sh new file mode 100755 index 00000000000..571eb210450 --- /dev/null +++ b/build-system/s3-cache-scripts/earthly-s3-cache.sh @@ -0,0 +1,57 @@ +#!/bin/bash +# Note, this should be edited in tandem with the Earthfile in this folder that uses it, it is coupled heavily with earthly's needs +# and uses these ARGs directly +# - $build_artifacts +# - $prefix +# - $command +# The rest of the env variables are injected as secrets (e.g. aws creds and s3 modes) +set -eu + +# definitions +FILE="$prefix-$(cat .content-hash).tar.gz" +function s3_download() { + if [ "${S3_BUILD_CACHE_DOWNLOAD:-true}" = "false" ] || [ "${AWS_ACCESS_KEY_ID}" == "" ] ; then + return 1 # require a rebuild + fi + /usr/src/build-system/s3-cache-scripts/cache-download.sh "$FILE" +} +function s3_upload() { + if [ "${S3_BUILD_CACHE_UPLOAD:-true}" = "false" ] || [ "${AWS_ACCESS_KEY_ID}" == "" ] ; then + return 0 # exit silently + fi + /usr/src/build-system/s3-cache-scripts/cache-upload.sh "$FILE" $build_artifacts +} +function minio_download() { + if [ -z "$S3_BUILD_CACHE_MINIO_URL" ] ; then + return 1 # require rebuild + fi + # minio is S3-compatible + S3_BUILD_CACHE_AWS_PARAMS="--endpoint-url $S3_BUILD_CACHE_MINIO_URL" AWS_SECRET_ACCESS_KEY=minioadmin AWS_ACCESS_KEY_ID=minioadmin \ + /usr/src/build-system/s3-cache-scripts/cache-download.sh "$FILE" +} +function minio_upload() { + if [ -z "$S3_BUILD_CACHE_MINIO_URL" ] ; then + return 0 # exit silently + fi + # minio is S3-compatible + S3_BUILD_CACHE_AWS_PARAMS="--endpoint-url $S3_BUILD_CACHE_MINIO_URL" AWS_SECRET_ACCESS_KEY=minioadmin AWS_ACCESS_KEY_ID=minioadmin \ + /usr/src/build-system/s3-cache-scripts/cache-upload.sh "$FILE" $build_artifacts +} + +# commands +if minio_download ; then + # got them from local file server cache, great + exit +fi +if s3_download ; then + # got them from S3, replicate to minio for faster cache next time (if configured, won't be in CI) + minio_upload + exit +fi + +if ! bash -c "$command" ; then + exit 1 # we have failed to build, don't continue +fi + +minio_upload || echo "Minio upload failed!" +s3_upload || echo "S3 upload failed!" diff --git a/build-system/s3-cache-scripts/test.sh b/build-system/s3-cache-scripts/test.sh new file mode 100755 index 00000000000..765de5ed00b --- /dev/null +++ b/build-system/s3-cache-scripts/test.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# test only minio caching +set -eu +function delete_test_cache() { + AWS_SECRET_ACCESS_KEY=minioadmin AWS_ACCESS_KEY_ID=minioadmin \ + aws --endpoint http://localhost:12000 \ + s3 rm s3://aztec-ci-artifacts --recursive --exclude "*" --include "build-cache/barretenberg-test-cache-*.tar.gz" 2>&1 || true +} +function minio_cache_only() { + "$(git rev-parse --show-toplevel)/scripts/earthly-local" --no-cache $@ +} + +cd $(dirname $0) + +# if we have minio already running make sure the cache is deleted +# otherwise it will be run by next earthly local command +nc -z 127.0.0.1 12000 2>/dev/null >/dev/null && delete_test_cache +# Our assertions (thanks to -e flag): +# expect file to not exist at first +if minio_cache_only ../../barretenberg/cpp/+test-cache-read 2>/dev/null ; then + echo "Cache read without write should fail!" + exit 1 +fi +minio_cache_only ../../barretenberg/cpp/+test-cache-write 2>/dev/null +[ -d ~/.minio/data/*/*/barretenberg-test-cache*.tar.gz ] # minio cache files should be written +minio_cache_only ../../barretenberg/cpp/+test-cache-read 2>/dev/null # we should be able to read now +echo "Success!" diff --git a/docs/docs/migration_notes.md b/docs/docs/migration_notes.md index 25735e13590..dffb976a069 100644 --- a/docs/docs/migration_notes.md +++ b/docs/docs/migration_notes.md @@ -8,6 +8,31 @@ Aztec is in full-speed development. Literally every version breaks compatibility ## TBD +### [Aztec.nr] Renamed `unsafe_rand` to `random` + +Since this is an `unconstrained` function, callers are already supposed to include an `unsafe` block, so this function has been renamed for reduced verbosity. + +```diff +-use aztec::oracle::unsafe_rand::unsafe_rand; ++use aztec::oracle::random::random; + +-let random_value = unsafe { unsafe_rand() }; ++let random_value = unsafe { random() }; +``` + +### [Aztec.js] Removed `L2Block.fromFields` + +`L2Block.fromFields` was a syntactic sugar which is causing [issues](https://github.com/AztecProtocol/aztec-packages/issues/8340) so we've removed it. + +```diff +-const l2Block = L2Block.fromFields({ header, archive, body }); ++const l2Block = new L2Block(archive, header, body); +``` + +### [Aztec.nr] Removed `SharedMutablePrivateGetter` + +This state variable was deleted due to it being difficult to use safely. + ### [Aztec.nr] Changes to `NullifiableNote` The `compute_nullifier_without_context` function is now `unconstrained`. It had always been meant to be called in unconstrained contexts (which is why it did not receive the `context` object), but now that Noir supports trait functions being `unconstrained` this can be implemented properly. Users must add the `unconstrained` keyword to their implementations of the trait: @@ -29,6 +54,19 @@ All of `TestEnvironment`'s functions are now `unconstrained`, preventing acciden let env = TestEnvironment::new(); ``` +### [Aztec.nr] removed `encode_and_encrypt_note` and renamed `encode_and_encrypt_note_with_keys` to `encode_and_encrypt_note` + +```diff +contract XYZ { +- use dep::aztec::encrypted_logs::encrypted_note_emission::encode_and_encrypt_note_with_keys; ++ use dep::aztec::encrypted_logs::encrypted_note_emission::encode_and_encrypt_note; +... + +- numbers.at(owner).initialize(&mut new_number).emit(encode_and_encrypt_note_with_keys(&mut context, owner_ovpk_m, owner_ivpk_m, owner)); ++ numbers.at(owner).initialize(&mut new_number).emit(encode_and_encrypt_note(&mut context, owner_ovpk_m, owner_ivpk_m, owner)); + +} + ## 0.56.0 ### [Aztec.nr] Changes to contract definition @@ -165,7 +203,7 @@ export LOG_LEVEL="debug" `is_valid_impl` method in account contract asserted if signature was true. Instead now we will return the verification to give flexibility to developers to handle it as they please. -````diff +```diff - let verification = std::ecdsa_secp256k1::verify_signature(public_key.x, public_key.y, signature, hashed_message); - assert(verification == true); - true @@ -186,7 +224,7 @@ Public keys (ivpk, ovpk, npk, tpk) should no longer be fetched using the old `ge +let owner_keys = get_current_public_keys(&mut context, owner); +let owner_ivpk_m = owner_keys.ivpk_m; +let owner_ovpk_m = owner_keys.ovpk_m; -```` +``` If using more than one key per account, this will result in very large circuit gate count reductions. diff --git a/docs/docs/reference/developer_references/smart_contract_reference/portals/data_structures.md b/docs/docs/reference/developer_references/smart_contract_reference/portals/data_structures.md index 662e409c124..57c16ca3367 100644 --- a/docs/docs/reference/developer_references/smart_contract_reference/portals/data_structures.md +++ b/docs/docs/reference/developer_references/smart_contract_reference/portals/data_structures.md @@ -58,13 +58,11 @@ A message that is sent from L2 to L1. A snapshot of the registry values. -#include_code registry_snapshot l1-contracts/src/core/libraries/DataStructures.sol solidity +#include_code registry_snapshot l1-contracts/src/governance/libraries/DataStructures.sol solidity | Name | Type | Description | | -------------- | ------- | ----------- | | `rollup` | `address` | The address of the rollup contract for the snapshot. | -| `inbox` | `address` | The address of the inbox contract for the snapshot. | -| `outbox` | `address` | The address of the outbox contract for the snapshot. | | `blockNumber` | `uint256` | The block number at which the snapshot was created. | diff --git a/docs/docs/reference/developer_references/smart_contract_reference/portals/registry.md b/docs/docs/reference/developer_references/smart_contract_reference/portals/registry.md index 337fd7e4bad..1a129fe83c7 100644 --- a/docs/docs/reference/developer_references/smart_contract_reference/portals/registry.md +++ b/docs/docs/reference/developer_references/smart_contract_reference/portals/registry.md @@ -5,13 +5,13 @@ tags: [portals, contracts] The registry is a contract deployed on L1, that contains addresses for the `Rollup`. It also keeps track of the different versions that have been deployed and let you query prior deployments easily. -**Links**: [Interface (GitHub link)](https://github.com/AztecProtocol/aztec-packages/blob/master/l1-contracts/src/core/interfaces/messagebridge/IRegistry.sol), [Implementation (GitHub link)](https://github.com/AztecProtocol/aztec-packages/blob/master/l1-contracts/src/core/messagebridge/Registry.sol). +**Links**: [Interface (GitHub link)](https://github.com/AztecProtocol/aztec-packages/blob/master/l1-contracts/src/governance/interfaces/IRegistry.sol), [Implementation (GitHub link)](https://github.com/AztecProtocol/aztec-packages/blob/master/l1-contracts/src/governance/Registry.sol). ## `numberOfVersions()` Retrieves the number of versions that have been deployed. -#include_code registry_number_of_versions l1-contracts/src/core/interfaces/messagebridge/IRegistry.sol solidity +#include_code registry_number_of_versions l1-contracts/src/governance/interfaces/IRegistry.sol solidity | Name | Description | | -------------- | ----------- | @@ -20,7 +20,7 @@ Retrieves the number of versions that have been deployed. ## `getRollup()` Retrieves the current rollup contract. -#include_code registry_get_rollup l1-contracts/src/core/interfaces/messagebridge/IRegistry.sol solidity +#include_code registry_get_rollup l1-contracts/src/governance/interfaces/IRegistry.sol solidity | Name | Description | | -------------- | ----------- | @@ -28,9 +28,9 @@ Retrieves the current rollup contract. ## `getVersionFor(address _rollup)` -Retrieve the version of a specific rollup contract. +Retrieve the version of a specific rollup contract. -#include_code registry_get_version_for l1-contracts/src/core/interfaces/messagebridge/IRegistry.sol solidity +#include_code registry_get_version_for l1-contracts/src/governance/interfaces/IRegistry.sol solidity | Name | Description | | -------------- | ----------- | @@ -42,10 +42,10 @@ Will revert with `Registry__RollupNotRegistered(_rollup)` if the rollup have not ## `getSnapshot(uint256 _version)` -Retrieve the snapshot of a specific version. +Retrieve the snapshot of a specific version. -#include_code registry_snapshot l1-contracts/src/core/libraries/DataStructures.sol solidity -#include_code registry_get_snapshot l1-contracts/src/core/interfaces/messagebridge/IRegistry.sol solidity +#include_code registry_snapshot l1-contracts/src/governance/libraries/DataStructures.sol solidity +#include_code registry_get_snapshot l1-contracts/src/governance/interfaces/IRegistry.sol solidity | Name | Description | | -------------- | ----------- | @@ -58,7 +58,7 @@ Retrieve the snapshot of a specific version. Retrieves the snapshot for the current version. -#include_code registry_get_current_snapshot l1-contracts/src/core/interfaces/messagebridge/IRegistry.sol solidity +#include_code registry_get_current_snapshot l1-contracts/src/governance/interfaces/IRegistry.sol solidity | Name | Description | | -------------- | ----------- | diff --git a/docs/docs/tutorials/codealong/contract_tutorials/advanced/token_bridge/1_depositing_to_aztec.md b/docs/docs/tutorials/codealong/contract_tutorials/advanced/token_bridge/1_depositing_to_aztec.md index 0b05d3e92a6..ba35449ba13 100644 --- a/docs/docs/tutorials/codealong/contract_tutorials/advanced/token_bridge/1_depositing_to_aztec.md +++ b/docs/docs/tutorials/codealong/contract_tutorials/advanced/token_bridge/1_depositing_to_aztec.md @@ -32,9 +32,9 @@ This imports relevant files including the interfaces used by the Aztec rollup. A Create a basic ERC20 contract that can mint tokens to anyone. We will use this to test. -Create a file `PortalERC20.sol` in the same folder and add: +Create a file `TestERC20.sol` in the same folder and add: -#include_code contract /l1-contracts/test/portals/PortalERC20.sol solidity +#include_code contract /l1-contracts/test/TestERC20.sol solidity Replace the openzeppelin import with this: diff --git a/docs/docs/tutorials/codealong/contract_tutorials/token_contract.md b/docs/docs/tutorials/codealong/contract_tutorials/token_contract.md index 26ae89d4570..e5d421fd8f6 100644 --- a/docs/docs/tutorials/codealong/contract_tutorials/token_contract.md +++ b/docs/docs/tutorials/codealong/contract_tutorials/token_contract.md @@ -200,15 +200,13 @@ This function allows an account approved in the public `minters` mapping to crea First, storage is initialized. Then the function checks that the `msg_sender` is approved to mint in the `minters` mapping. If it is, a new `U128` value is created of the `amount` provided. The function reads the recipients public balance and then adds the amount to mint, saving the output as `new_balance`, then reads to total supply and adds the amount to mint, saving the output as `supply`. `new_balance` and `supply` are then written to storage. -The function returns 1 to indicate successful execution. - #include_code mint_public /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust #### `mint_private` This public function allows an account approved in the public `minters` mapping to create new private tokens that can be claimed by anyone that has the pre-image to the `secret_hash`. -First, public storage is initialized. Then it checks that the `msg_sender` is an approved minter. Then a new `TransparentNote` is created with the specified `amount` and `secret_hash`. You can read the details of the `TransparentNote` in the `types.nr` file [here (GitHub link)](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/noir-contracts/contracts/token_contract/src/types.nr#L61). The `amount` is added to the existing public `total_supply` and the storage value is updated. Then the new `TransparentNote` is added to the `pending_shields` using the `insert_from_public` function, which is accessible on the `PrivateSet` type. Then it's ready to be claimed by anyone with the `secret_hash` pre-image using the `redeem_shield` function. It returns `1` to indicate successful execution. +First, public storage is initialized. Then it checks that the `msg_sender` is an approved minter. Then a new `TransparentNote` is created with the specified `amount` and `secret_hash`. You can read the details of the `TransparentNote` in the `types.nr` file [here (GitHub link)](https://github.com/AztecProtocol/aztec-packages/blob/#include_aztec_version/noir-projects/noir-contracts/contracts/token_contract/src/types.nr#L61). The `amount` is added to the existing public `total_supply` and the storage value is updated. Then the new `TransparentNote` is added to the `pending_shields` using the `insert_from_public` function, which is accessible on the `PrivateSet` type. Then it's ready to be claimed by anyone with the `secret_hash` pre-image using the `redeem_shield` function. #include_code mint_private /noir-projects/noir-contracts/contracts/token_contract/src/main.nr rust diff --git a/iac/mainnet-fork/scripts/install_foundry.sh b/iac/mainnet-fork/scripts/install_foundry.sh index e5f878288bd..0e5a1cc86d8 100755 --- a/iac/mainnet-fork/scripts/install_foundry.sh +++ b/iac/mainnet-fork/scripts/install_foundry.sh @@ -6,7 +6,7 @@ FOUNDRY_BIN_DIR="$FOUNDRY_DIR/bin" BIN_URL="https://raw.githubusercontent.com/foundry-rs/foundry/master/foundryup/foundryup" BIN_PATH="$FOUNDRY_BIN_DIR/foundryup" FOUNDRY_MAN_DIR="$FOUNDRY_DIR/share/man/man1" -FOUNDRY_VERSION="nightly-de33b6af53005037b463318d2628b5cfcaf39916" +FOUNDRY_VERSION="nightly-25f24e677a6a32a62512ad4f561995589ac2c7dc" # Clean rm -rf $FOUNDRY_DIR diff --git a/l1-contracts/.solhint.json b/l1-contracts/.solhint.json index 556d4236331..2acdeeb2a60 100644 --- a/l1-contracts/.solhint.json +++ b/l1-contracts/.solhint.json @@ -1,21 +1,41 @@ { "extends": "solhint:recommended", "rules": { - "compiler-version": ["error", ">=0.8.4"], + "compiler-version": ["error", ">=0.8.27"], "no-inline-assembly": "off", - "func-visibility": ["error", { "ignoreConstructors": true }], + "gas-custom-errors": "off", + "func-visibility": [ + "error", + { + "ignoreConstructors": true + } + ], "no-empty-blocks": "off", "no-unused-vars": ["error"], "state-visibility": ["error"], "not-rely-on-time": "off", - "const-name-snakecase": ["error", { "treatImmutableVarAsConstant": true }], - "var-name-mixedcase": ["error", { "treatImmutableVarAsConstant": true }], - "custom-error-name-camelcase": ["error", { "allowPrefix": true }], + "const-name-snakecase": [ + "error", + { + "treatImmutableVarAsConstant": true + } + ], + "var-name-mixedcase": [ + "error", + { + "treatImmutableVarAsConstant": true + } + ], + "custom-error-name-camelcase": [ + "error", + { + "allowPrefix": true + } + ], "private-func-leading-underscore": ["error"], "private-vars-no-leading-underscore": ["error"], "func-param-name-leading-underscore": ["error"], "func-param-name-mixedcase": ["error"], - "custom-error-over-require": ["error"], "strict-override": ["error"], "strict-import": ["error"], "ordering": ["error"], diff --git a/l1-contracts/Dockerfile b/l1-contracts/Dockerfile index fbdf61b0e50..6aafd98bc95 100644 --- a/l1-contracts/Dockerfile +++ b/l1-contracts/Dockerfile @@ -10,7 +10,7 @@ RUN curl -L https://foundry.paradigm.xyz | bash # Set env variables for foundry and venv ENV PATH="${PATH}:/root/.foundry/bin:/root/.venv/bin" -RUN foundryup --version nightly-de33b6af53005037b463318d2628b5cfcaf39916 +RUN foundryup --version nightly-25f24e677a6a32a62512ad4f561995589ac2c7dc WORKDIR /usr/src/l1-contracts COPY . . diff --git a/l1-contracts/README.md b/l1-contracts/README.md index ddae20c94ed..149ae82027c 100644 --- a/l1-contracts/README.md +++ b/l1-contracts/README.md @@ -56,6 +56,29 @@ Currently not running any proofs _nor_ access control so blocks can be submitted --- +# Branching Tree Technique + +For writing tests we will be using the [Branching Tree Technique](https://www.youtube.com/watch?v=0-EmbNVgFA4). +The approach is simple, for a function that is to be tested (all functions) you should write a `.tree` file first. +Then the tree file can be used to generate a solidity tests file using [Bulloak](https://github.com/alexfertel/bulloak) by running the `scaffold` command. + +```bash +bulloak scaffold -w **/*.tree +``` + +To check that the tests are following the expected format, you can run the `check` command. + +```bash +bulloak check **/*.tree +``` + +We assume that you already have `bulloak` installed, if not you can install it as `cargo install bulloak`. +Also, we suggest using [Ascii Tree Generator](https://marketplace.visualstudio.com/items?itemName=aprilandjan.ascii-tree-generator), since the pipes can be a bit of a pain otherwise. + +For examples, see the tests for the registry. + +--- + # Linter We use an extended version of solhint (https://github.com/LHerskind/solhint) to include custom rules. These custom rules relate to how errors should be named, using custom errors instead of reverts etc, see `.solhint.json` for more specifics about the rules. @@ -73,12 +96,13 @@ yarn lint # Slither & Slitherin We use slither as an automatic way to find blunders and common vulnerabilities in our contracts. It is not part of the docker image due to its slowness, but it can be run using the following command to generate a markdown file with the results: + ```bash yarn slither ``` -When this command is run in CI, it will fail if the markdown file generated in docker don't match the one in the repository. +When this command is run in CI, it will fail if the markdown file generated in docker don't match the one in the repository. We assume that you already have slither installed. You can install it with `pip3 install slither-analyzer==0.10.0 slitherin==0.5.0`. It is kept out of the bootstrap script as it is not a requirement for people who just want to run tests or are uninterested in the contracts. -> We are not running the `naming-convention` detector because we have our own rules for naming which is enforced by the linter. \ No newline at end of file +> We are not running the `naming-convention` detector because we have our own rules for naming which is enforced by the linter. diff --git a/l1-contracts/foundry.toml b/l1-contracts/foundry.toml index 012bcf9cf06..b511b3d64c2 100644 --- a/l1-contracts/foundry.toml +++ b/l1-contracts/foundry.toml @@ -2,10 +2,11 @@ src = 'src' out = 'out' libs = ['lib'] -solc = "0.8.23" +solc = "0.8.27" remappings = [ - "@oz/=lib/openzeppelin-contracts/contracts/" + "@oz/=lib/openzeppelin-contracts/contracts/", + "@aztec/=src" ] # See more config options https://github.com/foundry-rs/foundry/tree/master/config diff --git a/l1-contracts/src/core/FeeJuicePortal.sol b/l1-contracts/src/core/FeeJuicePortal.sol index d315a9f5297..f6a13e429e4 100644 --- a/l1-contracts/src/core/FeeJuicePortal.sol +++ b/l1-contracts/src/core/FeeJuicePortal.sol @@ -1,19 +1,20 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import {IERC20} from "@oz/token/ERC20/IERC20.sol"; +import {IFeeJuicePortal} from "@aztec/core/interfaces/IFeeJuicePortal.sol"; +import {IInbox} from "@aztec/core/interfaces/messagebridge/IInbox.sol"; +import {IRegistry} from "@aztec/governance/interfaces/IRegistry.sol"; +import {IRollup} from "@aztec/core/interfaces/IRollup.sol"; + +import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; +import {DataStructures} from "@aztec/core/libraries/DataStructures.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; +import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; import {SafeERC20} from "@oz/token/ERC20/utils/SafeERC20.sol"; -import {Ownable} from "@oz/access/Ownable.sol"; -// Messaging -import {IRegistry} from "./interfaces/messagebridge/IRegistry.sol"; -import {IInbox} from "./interfaces/messagebridge/IInbox.sol"; -import {IFeeJuicePortal} from "./interfaces/IFeeJuicePortal.sol"; -import {DataStructures} from "./libraries/DataStructures.sol"; -import {Errors} from "./libraries/Errors.sol"; -import {Constants} from "./libraries/ConstantsGen.sol"; -import {Hash} from "./libraries/Hash.sol"; +import {Ownable} from "@oz/access/Ownable.sol"; contract FeeJuicePortal is IFeeJuicePortal, Ownable { using SafeERC20 for IERC20; @@ -41,13 +42,14 @@ contract FeeJuicePortal is IFeeJuicePortal, Ownable { override(IFeeJuicePortal) onlyOwner { - if (address(registry) != address(0) || address(underlying) != address(0) || l2TokenAddress != 0) - { - revert Errors.FeeJuicePortal__AlreadyInitialized(); - } - if (_registry == address(0) || _underlying == address(0) || _l2TokenAddress == 0) { - revert Errors.FeeJuicePortal__InvalidInitialization(); - } + require( + address(registry) == address(0) && address(underlying) == address(0) && l2TokenAddress == 0, + Errors.FeeJuicePortal__AlreadyInitialized() + ); + require( + _registry != address(0) && _underlying != address(0) && _l2TokenAddress != 0, + Errors.FeeJuicePortal__InvalidInitialization() + ); registry = IRegistry(_registry); underlying = IERC20(_underlying); @@ -74,7 +76,7 @@ contract FeeJuicePortal is IFeeJuicePortal, Ownable { returns (bytes32) { // Preamble - IInbox inbox = registry.getRollup().INBOX(); + IInbox inbox = IRollup(registry.getRollup()).INBOX(); DataStructures.L2Actor memory actor = DataStructures.L2Actor(l2TokenAddress, 1); // Hash the message content to be reconstructed in the receiving contract @@ -99,9 +101,7 @@ contract FeeJuicePortal is IFeeJuicePortal, Ownable { * @param _amount - The amount to pay them */ function distributeFees(address _to, uint256 _amount) external override(IFeeJuicePortal) { - if (msg.sender != address(registry.getRollup())) { - revert Errors.FeeJuicePortal__Unauthorized(); - } + require(msg.sender == registry.getRollup(), Errors.FeeJuicePortal__Unauthorized()); underlying.safeTransfer(_to, _amount); } } diff --git a/l1-contracts/src/core/sequencer_selection/Leonidas.sol b/l1-contracts/src/core/Leonidas.sol similarity index 83% rename from l1-contracts/src/core/sequencer_selection/Leonidas.sol rename to l1-contracts/src/core/Leonidas.sol index 8a90052500f..eaca4ce3fa4 100644 --- a/l1-contracts/src/core/sequencer_selection/Leonidas.sol +++ b/l1-contracts/src/core/Leonidas.sol @@ -1,17 +1,20 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -import {DataStructures} from "../libraries/DataStructures.sol"; -import {Errors} from "../libraries/Errors.sol"; +import {ILeonidas} from "@aztec/core/interfaces/ILeonidas.sol"; + +import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; +import {DataStructures} from "@aztec/core/libraries/DataStructures.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; +import {SampleLib} from "@aztec/core/libraries/crypto/SampleLib.sol"; +import {SignatureLib} from "@aztec/core/libraries/crypto/SignatureLib.sol"; +import {MessageHashUtils} from "@oz/utils/cryptography/MessageHashUtils.sol"; import {EnumerableSet} from "@oz/utils/structs/EnumerableSet.sol"; + import {Ownable} from "@oz/access/Ownable.sol"; -import {SampleLib} from "./SampleLib.sol"; -import {SignatureLib} from "../libraries/SignatureLib.sol"; -import {Constants} from "../libraries/ConstantsGen.sol"; -import {MessageHashUtils} from "@oz/utils/cryptography/MessageHashUtils.sol"; -import {ILeonidas} from "./ILeonidas.sol"; +import {Timestamp, Slot, Epoch, SlotLib, EpochLib} from "@aztec/core/libraries/TimeMath.sol"; /** * @title Leonidas @@ -32,13 +35,16 @@ contract Leonidas is Ownable, ILeonidas { using SignatureLib for SignatureLib.Signature; using MessageHashUtils for bytes32; + using SlotLib for Slot; + using EpochLib for Epoch; + /** * @notice The data structure for an epoch * @param committee - The validator set for the epoch * @param sampleSeed - The seed used to sample the validator set of the epoch * @param nextSeed - The seed used to influence the NEXT epoch */ - struct Epoch { + struct EpochData { address[] committee; uint256 sampleSeed; uint256 nextSeed; @@ -65,19 +71,19 @@ contract Leonidas is Ownable, ILeonidas { uint256 public constant TARGET_COMMITTEE_SIZE = Constants.AZTEC_TARGET_COMMITTEE_SIZE; // The time that the contract was deployed - uint256 public immutable GENESIS_TIME; + Timestamp public immutable GENESIS_TIME; // An enumerable set of validators that are up to date EnumerableSet.AddressSet private validatorSet; // A mapping to snapshots of the validator set - mapping(uint256 epochNumber => Epoch epoch) public epochs; + mapping(Epoch => EpochData) public epochs; // The last stored randao value, same value as `seed` in the last inserted epoch uint256 private lastSeed; constructor(address _ares) Ownable(_ares) { - GENESIS_TIME = block.timestamp; + GENESIS_TIME = Timestamp.wrap(block.timestamp); } /** @@ -119,7 +125,7 @@ contract Leonidas is Ownable, ILeonidas { * * @return The validator set for the given epoch */ - function getEpochCommittee(uint256 _epoch) + function getEpochCommittee(Epoch _epoch) external view override(ILeonidas) @@ -133,7 +139,7 @@ contract Leonidas is Ownable, ILeonidas { * @return The validator set for the current epoch */ function getCurrentEpochCommittee() external view override(ILeonidas) returns (address[] memory) { - return getCommitteeAt(block.timestamp); + return getCommitteeAt(Timestamp.wrap(block.timestamp)); } /** @@ -158,8 +164,8 @@ contract Leonidas is Ownable, ILeonidas { * https://i.giphy.com/U1aN4HTfJ2SmgB2BBK.webp */ function setupEpoch() public override(ILeonidas) { - uint256 epochNumber = getCurrentEpoch(); - Epoch storage epoch = epochs[epochNumber]; + Epoch epochNumber = getCurrentEpoch(); + EpochData storage epoch = epochs[epochNumber]; if (epoch.sampleSeed == 0) { epoch.sampleSeed = _getSampleSeed(epochNumber); @@ -203,8 +209,8 @@ contract Leonidas is Ownable, ILeonidas { * * @return The current epoch number */ - function getCurrentEpoch() public view override(ILeonidas) returns (uint256) { - return getEpochAt(block.timestamp); + function getCurrentEpoch() public view override(ILeonidas) returns (Epoch) { + return getEpochAt(Timestamp.wrap(block.timestamp)); } /** @@ -212,8 +218,8 @@ contract Leonidas is Ownable, ILeonidas { * * @return The current slot number */ - function getCurrentSlot() public view override(ILeonidas) returns (uint256) { - return getSlotAt(block.timestamp); + function getCurrentSlot() public view override(ILeonidas) returns (Slot) { + return getSlotAt(Timestamp.wrap(block.timestamp)); } /** @@ -223,13 +229,13 @@ contract Leonidas is Ownable, ILeonidas { * * @return The timestamp for the given slot */ - function getTimestampForSlot(uint256 _slotNumber) + function getTimestampForSlot(Slot _slotNumber) public view override(ILeonidas) - returns (uint256) + returns (Timestamp) { - return _slotNumber * SLOT_DURATION + GENESIS_TIME; + return GENESIS_TIME + _slotNumber.toTimestamp(); } /** @@ -240,7 +246,7 @@ contract Leonidas is Ownable, ILeonidas { * @return The address of the proposer */ function getCurrentProposer() public view override(ILeonidas) returns (address) { - return getProposerAt(block.timestamp); + return getProposerAt(Timestamp.wrap(block.timestamp)); } /** @@ -264,11 +270,11 @@ contract Leonidas is Ownable, ILeonidas { * * @return The address of the proposer */ - function getProposerAt(uint256 _ts) public view override(ILeonidas) returns (address) { - uint256 epochNumber = getEpochAt(_ts); - uint256 slot = getSlotAt(_ts); + function getProposerAt(Timestamp _ts) public view override(ILeonidas) returns (address) { + Epoch epochNumber = getEpochAt(_ts); + Slot slot = getSlotAt(_ts); - Epoch storage epoch = epochs[epochNumber]; + EpochData storage epoch = epochs[epochNumber]; // If the epoch is setup, we can just return the proposer. Otherwise we have to emulate sampling if (epoch.sampleSeed != 0) { @@ -299,8 +305,8 @@ contract Leonidas is Ownable, ILeonidas { * * @return The computed epoch */ - function getEpochAt(uint256 _ts) public view override(ILeonidas) returns (uint256) { - return _ts < GENESIS_TIME ? 0 : (_ts - GENESIS_TIME) / (EPOCH_DURATION * SLOT_DURATION); + function getEpochAt(Timestamp _ts) public view override(ILeonidas) returns (Epoch) { + return _ts < GENESIS_TIME ? Epoch.wrap(0) : EpochLib.fromTimestamp(_ts - GENESIS_TIME); } /** @@ -310,8 +316,19 @@ contract Leonidas is Ownable, ILeonidas { * * @return The computed slot */ - function getSlotAt(uint256 _ts) public view override(ILeonidas) returns (uint256) { - return _ts < GENESIS_TIME ? 0 : (_ts - GENESIS_TIME) / SLOT_DURATION; + function getSlotAt(Timestamp _ts) public view override(ILeonidas) returns (Slot) { + return _ts < GENESIS_TIME ? Slot.wrap(0) : SlotLib.fromTimestamp(_ts - GENESIS_TIME); + } + + /** + * @notice Computes the epoch at a specific slot + * + * @param _slotNumber - The slot number to compute the epoch for + * + * @return The computed epoch + */ + function getEpochAtSlot(Slot _slotNumber) public pure override(ILeonidas) returns (Epoch) { + return Epoch.wrap(_slotNumber.unwrap() / EPOCH_DURATION); } /** @@ -322,9 +339,9 @@ contract Leonidas is Ownable, ILeonidas { validatorSet.add(_validator); } - function getCommitteeAt(uint256 _ts) internal view returns (address[] memory) { - uint256 epochNumber = getEpochAt(_ts); - Epoch storage epoch = epochs[epochNumber]; + function getCommitteeAt(Timestamp _ts) internal view returns (address[] memory) { + Epoch epochNumber = getEpochAt(_ts); + EpochData storage epoch = epochs[epochNumber]; if (epoch.sampleSeed != 0) { uint256 committeeSize = epoch.committee.length; @@ -361,12 +378,12 @@ contract Leonidas is Ownable, ILeonidas { * @param _digest - The digest of the block */ function _validateLeonidas( - uint256 _slot, + Slot _slot, SignatureLib.Signature[] memory _signatures, bytes32 _digest, DataStructures.ExecutionFlags memory _flags ) internal view { - uint256 ts = getTimestampForSlot(_slot); + Timestamp ts = getTimestampForSlot(_slot); address proposer = getProposerAt(ts); // If the proposer is open, we allow anyone to propose without needing any signatures @@ -375,9 +392,7 @@ contract Leonidas is Ownable, ILeonidas { } // @todo We should allow to provide a signature instead of needing the proposer to broadcast. - if (proposer != msg.sender) { - revert Errors.Leonidas__InvalidProposer(proposer, msg.sender); - } + require(proposer == msg.sender, Errors.Leonidas__InvalidProposer(proposer, msg.sender)); // @note This is NOT the efficient way to do it, but it is a very convenient way for us to do it // that allows us to reduce the number of code paths. Also when changed with optimistic for @@ -390,9 +405,10 @@ contract Leonidas is Ownable, ILeonidas { address[] memory committee = getCommitteeAt(ts); uint256 needed = committee.length * 2 / 3 + 1; - if (_signatures.length < needed) { - revert Errors.Leonidas__InsufficientAttestationsProvided(needed, _signatures.length); - } + require( + _signatures.length >= needed, + Errors.Leonidas__InsufficientAttestationsProvided(needed, _signatures.length) + ); // Validate the attestations uint256 validAttestations = 0; @@ -409,9 +425,10 @@ contract Leonidas is Ownable, ILeonidas { validAttestations++; } - if (validAttestations < needed) { - revert Errors.Leonidas__InsufficientAttestations(needed, validAttestations); - } + require( + validAttestations >= needed, + Errors.Leonidas__InsufficientAttestations(needed, validAttestations) + ); } /** @@ -424,7 +441,7 @@ contract Leonidas is Ownable, ILeonidas { * * @return The computed seed */ - function _computeNextSeed(uint256 _epoch) private view returns (uint256) { + function _computeNextSeed(Epoch _epoch) private view returns (uint256) { return uint256(keccak256(abi.encode(_epoch, block.prevrandao))); } @@ -471,8 +488,8 @@ contract Leonidas is Ownable, ILeonidas { * * @return The sample seed for the epoch */ - function _getSampleSeed(uint256 _epoch) private view returns (uint256) { - if (_epoch == 0) { + function _getSampleSeed(Epoch _epoch) private view returns (uint256) { + if (Epoch.unwrap(_epoch) == 0) { return type(uint256).max; } uint256 sampleSeed = epochs[_epoch].sampleSeed; @@ -480,7 +497,7 @@ contract Leonidas is Ownable, ILeonidas { return sampleSeed; } - sampleSeed = epochs[_epoch - 1].nextSeed; + sampleSeed = epochs[_epoch - Epoch.wrap(1)].nextSeed; if (sampleSeed != 0) { return sampleSeed; } @@ -498,7 +515,7 @@ contract Leonidas is Ownable, ILeonidas { * * @return The index of the proposer */ - function _computeProposerIndex(uint256 _epoch, uint256 _slot, uint256 _seed, uint256 _size) + function _computeProposerIndex(Epoch _epoch, Slot _slot, uint256 _seed, uint256 _size) private pure returns (uint256) diff --git a/l1-contracts/src/core/ProofCommitmentEscrow.sol b/l1-contracts/src/core/ProofCommitmentEscrow.sol new file mode 100644 index 00000000000..a29f92ac0c4 --- /dev/null +++ b/l1-contracts/src/core/ProofCommitmentEscrow.sol @@ -0,0 +1,146 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2024 Aztec Labs. +pragma solidity >=0.8.27; + +import {SafeERC20} from "@oz/token/ERC20/utils/SafeERC20.sol"; +import {IERC20} from "@oz/token/ERC20/IERC20.sol"; + +import {IProofCommitmentEscrow} from "@aztec/core/interfaces/IProofCommitmentEscrow.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; +import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; +import {Timestamp} from "@aztec/core/libraries/TimeMath.sol"; + +contract ProofCommitmentEscrow is IProofCommitmentEscrow { + using SafeERC20 for IERC20; + + struct WithdrawRequest { + uint256 amount; + Timestamp executableAt; + } + + address public immutable ROLLUP; + uint256 public constant WITHDRAW_DELAY = + Constants.ETHEREUM_SLOT_DURATION * Constants.AZTEC_EPOCH_DURATION * 3; + mapping(address => uint256) public deposits; + mapping(address => WithdrawRequest) public withdrawRequests; + IERC20 public immutable token; + + modifier onlyRollup() { + require(msg.sender == ROLLUP, Errors.ProofCommitmentEscrow__NotOwner(msg.sender)); + _; + } + + constructor(IERC20 _token, address _owner) { + token = _token; + ROLLUP = _owner; + } + + /** + * @notice Deposit tokens into the escrow + * + * @dev The caller must have approved the token transfer + * + * @param _amount The amount of tokens to deposit + */ + function deposit(uint256 _amount) external override { + token.safeTransferFrom(msg.sender, address(this), _amount); + + deposits[msg.sender] += _amount; + + emit Deposit(msg.sender, _amount); + } + + /** + * @notice Start a withdrawal request + * + * @dev The caller must have sufficient balance + * The withdrawal request will be executable after a delay + * Subsequent calls to this function will overwrite the previous request + * + * @param _amount - The amount of tokens to withdraw + */ + function startWithdraw(uint256 _amount) external override { + require( + deposits[msg.sender] >= _amount, + Errors.ProofCommitmentEscrow__InsufficientBalance(deposits[msg.sender], _amount) + ); + + withdrawRequests[msg.sender] = WithdrawRequest({ + amount: _amount, + executableAt: Timestamp.wrap(block.timestamp + WITHDRAW_DELAY) + }); + + emit StartWithdraw(msg.sender, _amount, withdrawRequests[msg.sender].executableAt); + } + + /** + * @notice Execute a mature withdrawal request + */ + function executeWithdraw() external override { + WithdrawRequest memory request = withdrawRequests[msg.sender]; + require( + request.executableAt <= Timestamp.wrap(block.timestamp), + Errors.ProofCommitmentEscrow__WithdrawRequestNotReady(block.timestamp, request.executableAt) + ); + + delete withdrawRequests[msg.sender]; + deposits[msg.sender] -= request.amount; + token.safeTransfer(msg.sender, request.amount); + + emit ExecuteWithdraw(msg.sender, request.amount); + } + + /** + * @notice Stake an amount of previously deposited tokens + * + * @dev Only callable by the owner + * The prover must have sufficient balance + * The prover's balance will be reduced by the bond amount + */ + function stakeBond(address _prover, uint256 _amount) external override onlyRollup { + deposits[_prover] -= _amount; + + emit StakeBond(_prover, _amount); + } + + /** + * @notice Unstake the bonded tokens, returning them to the prover + * + * @dev Only callable by the owner + */ + function unstakeBond(address _prover, uint256 _amount) external override onlyRollup { + deposits[_prover] += _amount; + + emit UnstakeBond(_prover, _amount); + } + + /** + * @notice Get the minimum balance of a prover at a given timestamp. + * + * @dev Returns 0 if the timestamp is beyond the WITHDRAW_DELAY from the current block timestamp + * + * @param _timestamp The timestamp at which to check the balance + * @param _prover The address of the prover + * + * @return The balance of the prover at the given timestamp, compensating for withdrawal requests that have matured by that time + */ + function minBalanceAtTime(Timestamp _timestamp, address _prover) + external + view + override + returns (uint256) + { + // If the timestamp is beyond the WITHDRAW_DELAY, the minimum possible balance is 0; + // the prover could issue a withdraw request in this block for the full amount, + // and execute it exactly WITHDRAW_DELAY later. + if (_timestamp >= Timestamp.wrap(block.timestamp + WITHDRAW_DELAY)) { + return 0; + } + + uint256 balance = deposits[_prover]; + if (withdrawRequests[_prover].executableAt <= _timestamp) { + balance -= withdrawRequests[_prover].amount; + } + return balance; + } +} diff --git a/l1-contracts/src/core/Rollup.sol b/l1-contracts/src/core/Rollup.sol index 73cdccaac44..c6f08a170e1 100644 --- a/l1-contracts/src/core/Rollup.sol +++ b/l1-contracts/src/core/Rollup.sol @@ -1,32 +1,34 @@ // SPDX-License-Identifier: Apache-2.0 -// Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; - -// Interfaces -import {IRollup, ITestRollup} from "./interfaces/IRollup.sol"; -import {IProofCommitmentEscrow} from "./interfaces/IProofCommitmentEscrow.sol"; -import {IInbox} from "./interfaces/messagebridge/IInbox.sol"; -import {IOutbox} from "./interfaces/messagebridge/IOutbox.sol"; -import {IRegistry} from "./interfaces/messagebridge/IRegistry.sol"; -import {IVerifier} from "./interfaces/IVerifier.sol"; -import {IFeeJuicePortal} from "./interfaces/IFeeJuicePortal.sol"; - -// Libraries -import {HeaderLib} from "./libraries/HeaderLib.sol"; -import {Errors} from "./libraries/Errors.sol"; -import {Constants} from "./libraries/ConstantsGen.sol"; -import {MerkleLib} from "./libraries/MerkleLib.sol"; -import {SignatureLib} from "./libraries/SignatureLib.sol"; +// Copyright 2024 Aztec Labs. +pragma solidity >=0.8.27; + +import {EIP712} from "@oz/utils/cryptography/EIP712.sol"; +import {ECDSA} from "@oz/utils/cryptography/ECDSA.sol"; + +import {IProofCommitmentEscrow} from "@aztec/core/interfaces/IProofCommitmentEscrow.sol"; +import {IInbox} from "@aztec/core/interfaces/messagebridge/IInbox.sol"; +import {IOutbox} from "@aztec/core/interfaces/messagebridge/IOutbox.sol"; +import {IFeeJuicePortal} from "@aztec/core/interfaces/IFeeJuicePortal.sol"; +import {IRollup, ITestRollup} from "@aztec/core/interfaces/IRollup.sol"; +import {IVerifier} from "@aztec/core/interfaces/IVerifier.sol"; + +import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; +import {DataStructures} from "@aztec/core/libraries/DataStructures.sol"; +import {EpochProofQuoteLib} from "@aztec/core/libraries/EpochProofQuoteLib.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; +import {HeaderLib} from "@aztec/core/libraries/HeaderLib.sol"; +import {TxsDecoder} from "@aztec/core/libraries/TxsDecoder.sol"; +import {MerkleLib} from "@aztec/core/libraries/crypto/MerkleLib.sol"; +import {SignatureLib} from "@aztec/core/libraries/crypto/SignatureLib.sol"; import {SafeCast} from "@oz/utils/math/SafeCast.sol"; -import {DataStructures} from "./libraries/DataStructures.sol"; -import {TxsDecoder} from "./libraries/decoders/TxsDecoder.sol"; -// Contracts -import {MockVerifier} from "../mock/MockVerifier.sol"; -import {MockProofCommitmentEscrow} from "../mock/MockProofCommitmentEscrow.sol"; -import {Inbox} from "./messagebridge/Inbox.sol"; -import {Outbox} from "./messagebridge/Outbox.sol"; -import {Leonidas} from "./sequencer_selection/Leonidas.sol"; +import {Inbox} from "@aztec/core/messagebridge/Inbox.sol"; +import {Leonidas} from "@aztec/core/Leonidas.sol"; +import {MockVerifier} from "@aztec/mock/MockVerifier.sol"; +import {MockProofCommitmentEscrow} from "@aztec/mock/MockProofCommitmentEscrow.sol"; +import {Outbox} from "@aztec/core/messagebridge/Outbox.sol"; + +import {Timestamp, Slot, Epoch, SlotLib, EpochLib} from "@aztec/core/libraries/TimeMath.sol"; /** * @title Rollup @@ -34,8 +36,10 @@ import {Leonidas} from "./sequencer_selection/Leonidas.sol"; * @notice Rollup contract that is concerned about readability and velocity of development * not giving a damn about gas costs. */ -contract Rollup is Leonidas, IRollup, ITestRollup { +contract Rollup is EIP712("Aztec Rollup", "1"), Leonidas, IRollup, ITestRollup { using SafeCast for uint256; + using SlotLib for Slot; + using EpochLib for Epoch; struct ChainTips { uint256 pendingBlockNumber; @@ -45,7 +49,7 @@ contract Rollup is Leonidas, IRollup, ITestRollup { struct BlockLog { bytes32 archive; bytes32 blockHash; - uint128 slotNumber; + Slot slotNumber; } // See https://github.com/AztecProtocol/engineering-designs/blob/main/in-progress/8401-proof-timeliness/proof-timeliness.ipynb @@ -54,13 +58,12 @@ contract Rollup is Leonidas, IRollup, ITestRollup { uint256 public constant PROOF_COMMITMENT_MIN_BOND_AMOUNT_IN_TST = 1000; uint256 public immutable L1_BLOCK_AT_GENESIS; - IRegistry public immutable REGISTRY; IInbox public immutable INBOX; IOutbox public immutable OUTBOX; IProofCommitmentEscrow public immutable PROOF_COMMITMENT_ESCROW; uint256 public immutable VERSION; IFeeJuicePortal public immutable FEE_JUICE_PORTAL; - IVerifier public verifier; + IVerifier public epochProofVerifier; ChainTips public tips; DataStructures.EpochProofClaim public proofClaim; @@ -79,18 +82,16 @@ contract Rollup is Leonidas, IRollup, ITestRollup { uint256 private assumeProvenThroughBlockNumber; constructor( - IRegistry _registry, IFeeJuicePortal _fpcJuicePortal, bytes32 _vkTreeRoot, address _ares, address[] memory _validators ) Leonidas(_ares) { - verifier = new MockVerifier(); - REGISTRY = _registry; + epochProofVerifier = new MockVerifier(); FEE_JUICE_PORTAL = _fpcJuicePortal; PROOF_COMMITMENT_ESCROW = new MockProofCommitmentEscrow(); - INBOX = new Inbox(address(this), Constants.L1_TO_L2_MSG_SUBTREE_HEIGHT); - OUTBOX = new Outbox(address(this)); + INBOX = IInbox(address(new Inbox(address(this), Constants.L1_TO_L2_MSG_SUBTREE_HEIGHT))); + OUTBOX = IOutbox(address(new Outbox(address(this)))); vkTreeRoot = _vkTreeRoot; VERSION = 1; L1_BLOCK_AT_GENESIS = block.number; @@ -98,8 +99,8 @@ contract Rollup is Leonidas, IRollup, ITestRollup { // Genesis block blocks[0] = BlockLog({ archive: bytes32(Constants.GENESIS_ARCHIVE_ROOT), - blockHash: bytes32(0), - slotNumber: 0 + blockHash: bytes32(0), // TODO(palla/prover): The first block does not have hash zero + slotNumber: Slot.wrap(0) }); for (uint256 i = 0; i < _validators.length; i++) { _addValidator(_validators[i]); @@ -107,16 +108,22 @@ contract Rollup is Leonidas, IRollup, ITestRollup { setupEpoch(); } + function quoteToDigest(EpochProofQuoteLib.EpochProofQuote memory quote) + public + view + override(IRollup) + returns (bytes32) + { + return _hashTypedDataV4(EpochProofQuoteLib.hash(quote)); + } + /** * @notice Prune the pending chain up to the last proven block * * @dev Will revert if there is nothing to prune or if the chain is not ready to be pruned */ function prune() external override(IRollup) { - if (!_canPrune()) { - revert Errors.Rollup__NothingToPrune(); - } - + require(_canPrune(), Errors.Rollup__NothingToPrune()); _prune(); } @@ -129,10 +136,27 @@ contract Rollup is Leonidas, IRollup, ITestRollup { override(ITestRollup) onlyOwner { + fakeBlockNumberAsProven(blockNumber); + assumeProvenThroughBlockNumber = blockNumber; + } + + function fakeBlockNumberAsProven(uint256 blockNumber) private { if (blockNumber > tips.provenBlockNumber && blockNumber <= tips.pendingBlockNumber) { tips.provenBlockNumber = blockNumber; + + // If this results on a new epoch, create a fake claim for it + // Otherwise nextEpochToProve will report an old epoch + Epoch epoch = getEpochForBlock(blockNumber); + if (Epoch.unwrap(epoch) == 0 || Epoch.unwrap(epoch) > Epoch.unwrap(proofClaim.epochToProve)) { + proofClaim = DataStructures.EpochProofClaim({ + epochToProve: epoch, + basisPointFee: 0, + bondAmount: 0, + bondProvider: address(0), + proposerClaimant: msg.sender + }); + } } - assumeProvenThroughBlockNumber = blockNumber; } /** @@ -142,8 +166,8 @@ contract Rollup is Leonidas, IRollup, ITestRollup { * * @param _verifier - The new verifier contract */ - function setVerifier(address _verifier) external override(ITestRollup) onlyOwner { - verifier = IVerifier(_verifier); + function setEpochVerifier(address _verifier) external override(ITestRollup) onlyOwner { + epochProofVerifier = IVerifier(_verifier); } /** @@ -157,58 +181,203 @@ contract Rollup is Leonidas, IRollup, ITestRollup { vkTreeRoot = _vkTreeRoot; } - function claimEpochProofRight(DataStructures.EpochProofQuote calldata _quote) + /** + * @notice Publishes the body and propose the block + * @dev `eth_log_handlers` rely on this function + * + * @param _header - The L2 block header + * @param _archive - A root of the archive tree after the L2 block is applied + * @param _blockHash - The poseidon2 hash of the header added to the archive tree in the rollup circuit + * @param _signatures - Signatures from the validators + * @param _body - The body of the L2 block + */ + function proposeAndClaim( + bytes calldata _header, + bytes32 _archive, + bytes32 _blockHash, + bytes32[] memory _txHashes, + SignatureLib.Signature[] memory _signatures, + bytes calldata _body, + EpochProofQuoteLib.SignedEpochProofQuote calldata _quote + ) external override(IRollup) { + propose(_header, _archive, _blockHash, _txHashes, _signatures, _body); + claimEpochProofRight(_quote); + } + + /** + * @notice Submit a proof for an epoch in the pending chain + * + * @dev Will emit `L2ProofVerified` if the proof is valid + * + * @dev Will throw if: + * - The block number is past the pending chain + * - The last archive root of the header does not match the archive root of parent block + * - The archive root of the header does not match the archive root of the proposed block + * - The proof is invalid + * + * @dev We provide the `_archive` and `_blockHash` even if it could be read from storage itself because it allow for + * better error messages. Without passing it, we would just have a proof verification failure. + * + * @param _epochSize - The size of the epoch (to be promoted to a constant) + * @param _args - Array of public inputs to the proof (previousArchive, endArchive, previousBlockHash, endBlockHash, endTimestamp, outHash, proverId) + * @param _fees - Array of recipient-value pairs with fees to be distributed for the epoch + * @param _aggregationObject - The aggregation object for the proof + * @param _proof - The proof to verify + */ + function submitEpochRootProof( + uint256 _epochSize, + bytes32[7] calldata _args, + bytes32[64] calldata _fees, + bytes calldata _aggregationObject, + bytes calldata _proof + ) external override(IRollup) { + uint256 previousBlockNumber = tips.provenBlockNumber; + uint256 endBlockNumber = previousBlockNumber + _epochSize; + + bytes32[] memory publicInputs = + getEpochProofPublicInputs(_epochSize, _args, _fees, _aggregationObject); + + require(epochProofVerifier.verify(_proof, publicInputs), Errors.Rollup__InvalidProof()); + + tips.provenBlockNumber = endBlockNumber; + + for (uint256 i = 0; i < 32; i++) { + address coinbase = address(uint160(uint256(publicInputs[9 + i * 2]))); + uint256 fees = uint256(publicInputs[10 + i * 2]); + + if (coinbase != address(0) && fees > 0) { + // @note This will currently fail if there are insufficient funds in the bridge + // which WILL happen for the old version after an upgrade where the bridge follow. + // Consider allowing a failure. See #7938. + FEE_JUICE_PORTAL.distributeFees(coinbase, fees); + } + } + + emit L2ProofVerified(endBlockNumber, _args[6]); + } + + function status(uint256 myHeaderBlockNumber) external + view override(IRollup) + returns ( + uint256 provenBlockNumber, + bytes32 provenArchive, + uint256 pendingBlockNumber, + bytes32 pendingArchive, + bytes32 archiveOfMyBlock, + Epoch provenEpochNumber + ) { - uint256 currentSlot = getCurrentSlot(); - address currentProposer = getCurrentProposer(); - uint256 epochToProve = getEpochToProve(); + return ( + tips.provenBlockNumber, + blocks[tips.provenBlockNumber].archive, + tips.pendingBlockNumber, + blocks[tips.pendingBlockNumber].archive, + archiveAt(myHeaderBlockNumber), + getEpochForBlock(tips.provenBlockNumber) + ); + } - if (currentProposer != address(0) && currentProposer != msg.sender) { - revert Errors.Leonidas__InvalidProposer(currentProposer, msg.sender); - } + /** + * @notice Check if msg.sender can propose at a given time + * + * @param _ts - The timestamp to check + * @param _archive - The archive to check (should be the latest archive) + * + * @return uint256 - The slot at the given timestamp + * @return uint256 - The block number at the given timestamp + */ + function canProposeAtTime(Timestamp _ts, bytes32 _archive) + external + view + override(IRollup) + returns (Slot, uint256) + { + Slot slot = getSlotAt(_ts); - if (_quote.epochToProve != epochToProve) { - revert Errors.Rollup__NotClaimingCorrectEpoch(epochToProve, _quote.epochToProve); - } + Slot lastSlot = blocks[tips.pendingBlockNumber].slotNumber; - if (currentSlot % Constants.AZTEC_EPOCH_DURATION >= CLAIM_DURATION_IN_L2_SLOTS) { - revert Errors.Rollup__NotInClaimPhase( - currentSlot % Constants.AZTEC_EPOCH_DURATION, CLAIM_DURATION_IN_L2_SLOTS - ); - } + require(slot > lastSlot, Errors.Rollup__SlotAlreadyInChain(lastSlot, slot)); - // if the epoch to prove is not the one that has been claimed, - // then whatever is in the proofClaim is stale - if (proofClaim.epochToProve == epochToProve && proofClaim.proposerClaimant != address(0)) { - revert Errors.Rollup__ProofRightAlreadyClaimed(); - } + // Make sure that the proposer is up to date + bytes32 tipArchive = archive(); + require(tipArchive == _archive, Errors.Rollup__InvalidArchive(tipArchive, _archive)); - if (_quote.bondAmount < PROOF_COMMITMENT_MIN_BOND_AMOUNT_IN_TST) { - revert Errors.Rollup__InsufficientBondAmount( - PROOF_COMMITMENT_MIN_BOND_AMOUNT_IN_TST, _quote.bondAmount - ); - } + SignatureLib.Signature[] memory sigs = new SignatureLib.Signature[](0); + DataStructures.ExecutionFlags memory flags = + DataStructures.ExecutionFlags({ignoreDA: true, ignoreSignatures: true}); + _validateLeonidas(slot, sigs, _archive, flags); - if (_quote.validUntilSlot < currentSlot) { - revert Errors.Rollup__QuoteExpired(currentSlot, _quote.validUntilSlot); + return (slot, tips.pendingBlockNumber + 1); + } + + /** + * @notice Validate a header for submission + * + * @dev This is a convenience function that can be used by the sequencer to validate a "partial" header + * without having to deal with viem or anvil for simulating timestamps in the future. + * + * @param _header - The header to validate + * @param _signatures - The signatures to validate + * @param _digest - The digest to validate + * @param _currentTime - The current time + * @param _flags - The flags to validate + */ + function validateHeader( + bytes calldata _header, + SignatureLib.Signature[] memory _signatures, + bytes32 _digest, + Timestamp _currentTime, + bytes32 _txsEffectsHash, + DataStructures.ExecutionFlags memory _flags + ) external view override(IRollup) { + HeaderLib.Header memory header = HeaderLib.decode(_header); + _validateHeader(header, _signatures, _digest, _currentTime, _txsEffectsHash, _flags); + } + + function nextEpochToClaim() external view override(IRollup) returns (Epoch) { + Epoch epochClaimed = proofClaim.epochToProve; + if (proofClaim.proposerClaimant == address(0) && epochClaimed == Epoch.wrap(0)) { + return Epoch.wrap(0); } + return Epoch.wrap(1) + epochClaimed; + } + + function computeTxsEffectsHash(bytes calldata _body) + external + pure + override(IRollup) + returns (bytes32) + { + return TxsDecoder.decode(_body); + } + + function claimEpochProofRight(EpochProofQuoteLib.SignedEpochProofQuote calldata _quote) + public + override(IRollup) + { + validateEpochProofRightClaim(_quote); + + Slot currentSlot = getCurrentSlot(); + Epoch epochToProve = getEpochToProve(); // We don't currently unstake, // but we will as part of https://github.com/AztecProtocol/aztec-packages/issues/8652. // Blocked on submitting epoch proofs to this contract. - PROOF_COMMITMENT_ESCROW.stakeBond(_quote.bondAmount, _quote.prover); + PROOF_COMMITMENT_ESCROW.stakeBond(_quote.quote.prover, _quote.quote.bondAmount); proofClaim = DataStructures.EpochProofClaim({ epochToProve: epochToProve, - basisPointFee: _quote.basisPointFee, - bondAmount: _quote.bondAmount, - bondProvider: _quote.prover, + basisPointFee: _quote.quote.basisPointFee, + bondAmount: _quote.quote.bondAmount, + bondProvider: _quote.quote.prover, proposerClaimant: msg.sender }); - emit ProofRightClaimed(epochToProve, _quote.prover, msg.sender, _quote.bondAmount, currentSlot); + emit ProofRightClaimed( + epochToProve, _quote.quote.prover, msg.sender, _quote.quote.bondAmount, currentSlot + ); } /** @@ -228,7 +397,7 @@ contract Rollup is Leonidas, IRollup, ITestRollup { bytes32[] memory _txHashes, SignatureLib.Signature[] memory _signatures, bytes calldata _body - ) external override(IRollup) { + ) public override(IRollup) { if (_canPrune()) { _prune(); } @@ -243,7 +412,7 @@ contract Rollup is Leonidas, IRollup, ITestRollup { _header: header, _signatures: _signatures, _digest: digest, - _currentTime: block.timestamp, + _currentTime: Timestamp.wrap(block.timestamp), _txEffectsHash: txsEffectsHash, _flags: DataStructures.ExecutionFlags({ignoreDA: false, ignoreSignatures: false}) }); @@ -253,14 +422,15 @@ contract Rollup is Leonidas, IRollup, ITestRollup { blocks[blockNumber] = BlockLog({ archive: _archive, blockHash: _blockHash, - slotNumber: header.globalVariables.slotNumber.toUint128() + slotNumber: Slot.wrap(header.globalVariables.slotNumber) }); // @note The block number here will always be >=1 as the genesis block is at 0 bytes32 inHash = INBOX.consume(blockNumber); - if (header.contentCommitment.inHash != inHash) { - revert Errors.Rollup__InvalidInHash(inHash, header.contentCommitment.inHash); - } + require( + header.contentCommitment.inHash == inHash, + Errors.Rollup__InvalidInHash(inHash, header.contentCommitment.inHash) + ); // TODO(#7218): Revert to fixed height tree for outbox, currently just providing min as interim // Min size = smallest path of the rollup tree + 1 @@ -272,7 +442,7 @@ contract Rollup is Leonidas, IRollup, ITestRollup { // Automatically flag the block as proven if we have cheated and set assumeProvenThroughBlockNumber. if (blockNumber <= assumeProvenThroughBlockNumber) { - tips.provenBlockNumber = blockNumber; + fakeBlockNumberAsProven(blockNumber); if (header.globalVariables.coinbase != address(0) && header.totalFees > 0) { // @note This will currently fail if there are insufficient funds in the bridge @@ -286,113 +456,122 @@ contract Rollup is Leonidas, IRollup, ITestRollup { } /** - * @notice Submit a proof for a block in the pending chain - * - * @dev TODO(#7346): Verify root proofs rather than block root when batch rollups are integrated. - * - * @dev Will emit `L2ProofVerified` if the proof is valid - * - * @dev Will throw if: - * - The block number is past the pending chain - * - The last archive root of the header does not match the archive root of parent block - * - The archive root of the header does not match the archive root of the proposed block - * - The proof is invalid + * @notice Returns the computed public inputs for the given epoch proof. * - * @dev We provide the `_archive` even if it could be read from storage itself because it allow for - * better error messages. Without passing it, we would just have a proof verification failure. - * - * @dev Following the `BlockLog` struct assumption + * @dev Useful for debugging and testing. Allows submitter to compare their + * own public inputs used for generating the proof vs the ones assembled + * by this contract when verifying it. * - * @param _header - The header of the block (should match the block in the pending chain) - * @param _archive - The archive root of the block (should match the block in the pending chain) - * @param _proverId - The id of this block's prover + * @param _epochSize - The size of the epoch (to be promoted to a constant) + * @param _args - Array of public inputs to the proof (previousArchive, endArchive, previousBlockHash, endBlockHash, endTimestamp, outHash, proverId) + * @param _fees - Array of recipient-value pairs with fees to be distributed for the epoch * @param _aggregationObject - The aggregation object for the proof - * @param _proof - The proof to verify */ - function submitBlockRootProof( - bytes calldata _header, - bytes32 _archive, - bytes32 _proverId, - bytes calldata _aggregationObject, - bytes calldata _proof - ) external override(IRollup) { - if (_canPrune()) { - _prune(); - } - HeaderLib.Header memory header = HeaderLib.decode(_header); - - if (header.globalVariables.blockNumber > tips.pendingBlockNumber) { - revert Errors.Rollup__TryingToProveNonExistingBlock(); - } + function getEpochProofPublicInputs( + uint256 _epochSize, + bytes32[7] calldata _args, + bytes32[64] calldata _fees, + bytes calldata _aggregationObject + ) public view override(IRollup) returns (bytes32[] memory) { + uint256 previousBlockNumber = tips.provenBlockNumber; + uint256 endBlockNumber = previousBlockNumber + _epochSize; + + // Args are defined as an array because Solidity complains with "stack too deep" otherwise + // 0 bytes32 _previousArchive, + // 1 bytes32 _endArchive, + // 2 bytes32 _previousBlockHash, + // 3 bytes32 _endBlockHash, + // 4 bytes32 _endTimestamp, + // 5 bytes32 _outHash, + // 6 bytes32 _proverId, + + // TODO(#7373): Public inputs are not fully verified + + { + // We do it this way to provide better error messages than passing along the storage values + bytes32 expectedPreviousArchive = blocks[previousBlockNumber].archive; + require( + expectedPreviousArchive == _args[0], + Errors.Rollup__InvalidPreviousArchive(expectedPreviousArchive, _args[0]) + ); - // @note This implicitly also ensures that we have not already proven, since - // the value `tips.provenBlockNumber` is incremented at the end of this function - if (header.globalVariables.blockNumber != tips.provenBlockNumber + 1) { - revert Errors.Rollup__NonSequentialProving(); - } + bytes32 expectedEndArchive = blocks[endBlockNumber].archive; + require( + expectedEndArchive == _args[1], Errors.Rollup__InvalidArchive(expectedEndArchive, _args[1]) + ); - bytes32 expectedLastArchive = blocks[header.globalVariables.blockNumber - 1].archive; - // We do it this way to provide better error messages than passing along the storage values - if (header.lastArchive.root != expectedLastArchive) { - revert Errors.Rollup__InvalidArchive(expectedLastArchive, header.lastArchive.root); - } + bytes32 expectedPreviousBlockHash = blocks[previousBlockNumber].blockHash; + // TODO: Remove 0 check once we inject the proper genesis block hash + require( + expectedPreviousBlockHash == 0 || expectedPreviousBlockHash == _args[2], + Errors.Rollup__InvalidPreviousBlockHash(expectedPreviousBlockHash, _args[2]) + ); - bytes32 expectedArchive = blocks[header.globalVariables.blockNumber].archive; - if (_archive != expectedArchive) { - revert Errors.Rollup__InvalidProposedArchive(expectedArchive, _archive); + bytes32 expectedEndBlockHash = blocks[endBlockNumber].blockHash; + require( + expectedEndBlockHash == _args[3], + Errors.Rollup__InvalidBlockHash(expectedEndBlockHash, _args[3]) + ); } - // TODO(#7346): Currently verifying block root proofs until batch rollups fully integrated. - // Hence the below pub inputs are BlockRootOrBlockMergePublicInputs, which are larger than - // the planned set (RootRollupPublicInputs), for the interim. - // Public inputs are not fully verified (TODO(#7373)) - bytes32[] memory publicInputs = new bytes32[]( - Constants.BLOCK_ROOT_OR_BLOCK_MERGE_PUBLIC_INPUTS_LENGTH + Constants.AGGREGATION_OBJECT_LENGTH + Constants.ROOT_ROLLUP_PUBLIC_INPUTS_LENGTH + Constants.AGGREGATION_OBJECT_LENGTH ); - // From block_root_or_block_merge_public_inputs.nr: BlockRootOrBlockMergePublicInputs. + // Structure of the root rollup public inputs we need to reassemble: + // + // struct RootRollupPublicInputs { + // previous_archive: AppendOnlyTreeSnapshot, + // end_archive: AppendOnlyTreeSnapshot, + // previous_block_hash: Field, + // end_block_hash: Field, + // end_timestamp: u64, + // end_block_number: Field, + // out_hash: Field, + // fees: [FeeRecipient; 32], + // vk_tree_root: Field, + // prover_id: Field + // } + // previous_archive.root: the previous archive tree root - publicInputs[0] = expectedLastArchive; - // previous_archive.next_available_leaf_index: the previous archive next available index - publicInputs[1] = bytes32(header.globalVariables.blockNumber); + publicInputs[0] = _args[0]; - // new_archive.root: the new archive tree root - publicInputs[2] = expectedArchive; - // this is the _next_ available leaf in the archive tree + // previous_archive.next_available_leaf_index: the previous archive next available index // normally this should be equal to the block number (since leaves are 0-indexed and blocks 1-indexed) // but in yarn-project/merkle-tree/src/new_tree.ts we prefill the tree so that block N is in leaf N - // new_archive.next_available_leaf_index: the new archive next available index - publicInputs[3] = bytes32(header.globalVariables.blockNumber + 1); - - // previous_block_hash: the block hash just preceding this block (will eventually become the end_block_hash of the prev batch) - publicInputs[4] = blocks[header.globalVariables.blockNumber - 1].blockHash; - - // end_block_hash: the current block hash (will eventually become the hash of the final block proven in a batch) - publicInputs[5] = blocks[header.globalVariables.blockNumber].blockHash; - - // For block root proof outputs, we have a block 'range' of just 1 block => start and end globals are the same - bytes32[] memory globalVariablesFields = HeaderLib.toFields(header.globalVariables); - for (uint256 i = 0; i < globalVariablesFields.length; i++) { - // start_global_variables - publicInputs[i + 6] = globalVariablesFields[i]; - // end_global_variables - publicInputs[globalVariablesFields.length + i + 6] = globalVariablesFields[i]; - } - // out_hash: root of this block's l2 to l1 message tree (will eventually be root of roots) - publicInputs[24] = header.contentCommitment.outHash; + publicInputs[1] = bytes32(previousBlockNumber + 1); + + // end_archive.root: the new archive tree root + publicInputs[2] = _args[1]; + + // end_archive.next_available_leaf_index: the new archive next available index + publicInputs[3] = bytes32(endBlockNumber + 1); + + // previous_block_hash: the block hash just preceding this epoch + publicInputs[4] = _args[2]; + + // end_block_hash: the last block hash in the epoch + publicInputs[5] = _args[3]; - // For block root proof outputs, we have a single recipient-value fee payment pair, - // but the struct contains space for the max (32) => we keep 31*2=62 fields blank to represent it. - // fees: array of recipient-value pairs, for a single block just one entry (will eventually be filled and paid out here) - publicInputs[25] = bytes32(uint256(uint160(header.globalVariables.coinbase))); - publicInputs[26] = bytes32(header.totalFees); - // publicInputs[27] -> publicInputs[88] left blank for empty fee array entries + // end_timestamp: the timestamp of the last block in the epoch + publicInputs[6] = _args[4]; + + // end_block_number: last block number in the epoch + publicInputs[7] = bytes32(endBlockNumber); + + // out_hash: root of this epoch's l2 to l1 message tree + publicInputs[8] = _args[5]; + + // fees[9-72]: array of recipient-value pairs + for (uint256 i = 0; i < 64; i++) { + publicInputs[9 + i] = _fees[i]; + } // vk_tree_root - publicInputs[89] = vkTreeRoot; - // prover_id: id of current block range's prover - publicInputs[90] = _proverId; + publicInputs[73] = vkTreeRoot; + + // prover_id: id of current epoch's prover + publicInputs[74] = _args[6]; // the block proof is recursive, which means it comes with an aggregation object // this snippet copies it into the public inputs needed for verification @@ -403,117 +582,56 @@ contract Rollup is Leonidas, IRollup, ITestRollup { assembly { part := calldataload(add(_aggregationObject.offset, mul(i, 32))) } - publicInputs[i + 91] = part; + publicInputs[i + 75] = part; } - if (!verifier.verify(_proof, publicInputs)) { - revert Errors.Rollup__InvalidProof(); - } - - tips.provenBlockNumber = header.globalVariables.blockNumber; - - for (uint256 i = 0; i < 32; i++) { - address coinbase = address(uint160(uint256(publicInputs[25 + i * 2]))); - uint256 fees = uint256(publicInputs[26 + i * 2]); - - if (coinbase != address(0) && fees > 0) { - // @note This will currently fail if there are insufficient funds in the bridge - // which WILL happen for the old version after an upgrade where the bridge follow. - // Consider allowing a failure. See #7938. - FEE_JUICE_PORTAL.distributeFees(coinbase, fees); - } - } - emit L2ProofVerified(header.globalVariables.blockNumber, _proverId); + return publicInputs; } - function status(uint256 myHeaderBlockNumber) - external + function validateEpochProofRightClaim(EpochProofQuoteLib.SignedEpochProofQuote calldata _quote) + public view override(IRollup) - returns ( - uint256 provenBlockNumber, - bytes32 provenArchive, - uint256 pendingBlockNumber, - bytes32 pendingArchive, - bytes32 archiveOfMyBlock - ) { - return ( - tips.provenBlockNumber, - blocks[tips.provenBlockNumber].archive, - tips.pendingBlockNumber, - blocks[tips.pendingBlockNumber].archive, - archiveAt(myHeaderBlockNumber) - ); - } + SignatureLib.verify(_quote.signature, _quote.quote.prover, quoteToDigest(_quote.quote)); - /** - * @notice Check if msg.sender can propose at a given time - * - * @param _ts - The timestamp to check - * @param _archive - The archive to check (should be the latest archive) - * - * @return uint256 - The slot at the given timestamp - * @return uint256 - The block number at the given timestamp - */ - function canProposeAtTime(uint256 _ts, bytes32 _archive) - external - view - override(IRollup) - returns (uint256, uint256) - { - uint256 slot = getSlotAt(_ts); + Slot currentSlot = getCurrentSlot(); + address currentProposer = getCurrentProposer(); + Epoch epochToProve = getEpochToProve(); - uint256 lastSlot = uint256(blocks[tips.pendingBlockNumber].slotNumber); - if (slot <= lastSlot) { - revert Errors.Rollup__SlotAlreadyInChain(lastSlot, slot); - } + require( + currentProposer == address(0) || currentProposer == msg.sender, + Errors.Leonidas__InvalidProposer(currentProposer, msg.sender) + ); - // Make sure that the proposer is up to date - bytes32 tipArchive = archive(); - if (tipArchive != _archive) { - revert Errors.Rollup__InvalidArchive(tipArchive, _archive); - } + require( + _quote.quote.epochToProve == epochToProve, + Errors.Rollup__NotClaimingCorrectEpoch(epochToProve, _quote.quote.epochToProve) + ); - SignatureLib.Signature[] memory sigs = new SignatureLib.Signature[](0); - DataStructures.ExecutionFlags memory flags = - DataStructures.ExecutionFlags({ignoreDA: true, ignoreSignatures: true}); - _validateLeonidas(slot, sigs, _archive, flags); + require( + currentSlot.positionInEpoch() < CLAIM_DURATION_IN_L2_SLOTS, + Errors.Rollup__NotInClaimPhase(currentSlot.positionInEpoch(), CLAIM_DURATION_IN_L2_SLOTS) + ); - return (slot, tips.pendingBlockNumber + 1); - } + // if the epoch to prove is not the one that has been claimed, + // then whatever is in the proofClaim is stale + require( + proofClaim.epochToProve != epochToProve || proofClaim.proposerClaimant == address(0), + Errors.Rollup__ProofRightAlreadyClaimed() + ); - /** - * @notice Validate a header for submission - * - * @dev This is a convenience function that can be used by the sequencer to validate a "partial" header - * without having to deal with viem or anvil for simulating timestamps in the future. - * - * @param _header - The header to validate - * @param _signatures - The signatures to validate - * @param _digest - The digest to validate - * @param _currentTime - The current time - * @param _flags - The flags to validate - */ - function validateHeader( - bytes calldata _header, - SignatureLib.Signature[] memory _signatures, - bytes32 _digest, - uint256 _currentTime, - bytes32 _txsEffectsHash, - DataStructures.ExecutionFlags memory _flags - ) external view override(IRollup) { - HeaderLib.Header memory header = HeaderLib.decode(_header); - _validateHeader(header, _signatures, _digest, _currentTime, _txsEffectsHash, _flags); - } + require( + _quote.quote.bondAmount >= PROOF_COMMITMENT_MIN_BOND_AMOUNT_IN_TST, + Errors.Rollup__InsufficientBondAmount( + PROOF_COMMITMENT_MIN_BOND_AMOUNT_IN_TST, _quote.quote.bondAmount + ) + ); - function computeTxsEffectsHash(bytes calldata _body) - external - pure - override(IRollup) - returns (bytes32) - { - return TxsDecoder.decode(_body); + require( + _quote.quote.validUntilSlot >= currentSlot, + Errors.Rollup__QuoteExpired(currentSlot, _quote.quote.validUntilSlot) + ); } /** @@ -533,6 +651,14 @@ contract Rollup is Leonidas, IRollup, ITestRollup { return tips.pendingBlockNumber; } + function getEpochForBlock(uint256 blockNumber) public view override(IRollup) returns (Epoch) { + require( + blockNumber <= tips.pendingBlockNumber, + Errors.Rollup__InvalidBlockNumber(tips.pendingBlockNumber, blockNumber) + ); + return getEpochAt(getTimestampForSlot(blocks[blockNumber].slotNumber)); + } + /** * @notice Get the epoch that should be proven * @@ -542,12 +668,9 @@ contract Rollup is Leonidas, IRollup, ITestRollup { * * @return uint256 - The epoch to prove */ - function getEpochToProve() public view override(IRollup) returns (uint256) { - if (tips.provenBlockNumber == tips.pendingBlockNumber) { - revert Errors.Rollup__NoEpochToProve(); - } else { - return getEpochAt(blocks[getProvenBlockNumber() + 1].slotNumber); - } + function getEpochToProve() public view override(IRollup) returns (Epoch) { + require(tips.provenBlockNumber != tips.pendingBlockNumber, Errors.Rollup__NoEpochToProve()); + return getEpochForBlock(getProvenBlockNumber() + 1); } /** @@ -587,18 +710,18 @@ contract Rollup is Leonidas, IRollup, ITestRollup { return false; } - uint256 currentSlot = getCurrentSlot(); - uint256 oldestPendingEpoch = getEpochAt(blocks[tips.provenBlockNumber + 1].slotNumber); - uint256 startSlotOfPendingEpoch = oldestPendingEpoch * Constants.AZTEC_EPOCH_DURATION; + Slot currentSlot = getCurrentSlot(); + Epoch oldestPendingEpoch = getEpochForBlock(tips.provenBlockNumber + 1); + Slot startSlotOfPendingEpoch = oldestPendingEpoch.toSlots(); // suppose epoch 1 is proven, epoch 2 is pending, epoch 3 is the current epoch. // we prune the pending chain back to the end of epoch 1 if: // - the proof claim phase of epoch 3 has ended without a claim to prove epoch 2 (or proof of epoch 2) // - we reach epoch 4 without a proof of epoch 2 (regardless of whether a proof claim was submitted) bool inClaimPhase = currentSlot - < startSlotOfPendingEpoch + Constants.AZTEC_EPOCH_DURATION + CLAIM_DURATION_IN_L2_SLOTS; + < startSlotOfPendingEpoch + Epoch.wrap(1).toSlots() + Slot.wrap(CLAIM_DURATION_IN_L2_SLOTS); - bool claimExists = currentSlot < startSlotOfPendingEpoch + 2 * Constants.AZTEC_EPOCH_DURATION + bool claimExists = currentSlot < startSlotOfPendingEpoch + Epoch.wrap(2).toSlots() && proofClaim.epochToProve == oldestPendingEpoch && proofClaim.proposerClaimant != address(0); if (inClaimPhase || claimExists) { @@ -622,13 +745,13 @@ contract Rollup is Leonidas, IRollup, ITestRollup { HeaderLib.Header memory _header, SignatureLib.Signature[] memory _signatures, bytes32 _digest, - uint256 _currentTime, + Timestamp _currentTime, bytes32 _txEffectsHash, DataStructures.ExecutionFlags memory _flags ) internal view { _validateHeaderForSubmissionBase(_header, _currentTime, _txEffectsHash, _flags); _validateHeaderForSubmissionSequencerSelection( - _header.globalVariables.slotNumber, _signatures, _digest, _currentTime, _flags + Slot.wrap(_header.globalVariables.slotNumber), _signatures, _digest, _currentTime, _flags ); } @@ -649,28 +772,24 @@ contract Rollup is Leonidas, IRollup, ITestRollup { * @param _digest - The digest that signatures sign over */ function _validateHeaderForSubmissionSequencerSelection( - uint256 _slot, + Slot _slot, SignatureLib.Signature[] memory _signatures, bytes32 _digest, - uint256 _currentTime, + Timestamp _currentTime, DataStructures.ExecutionFlags memory _flags ) internal view { // Ensure that the slot proposed is NOT in the future - uint256 currentSlot = getSlotAt(_currentTime); - if (_slot != currentSlot) { - revert Errors.HeaderLib__InvalidSlotNumber(currentSlot, _slot); - } + Slot currentSlot = getSlotAt(_currentTime); + require(_slot == currentSlot, Errors.HeaderLib__InvalidSlotNumber(currentSlot, _slot)); // @note We are currently enforcing that the slot is in the current epoch // If this is not the case, there could potentially be a weird reorg // of an entire epoch if no-one from the new epoch committee have seen // those blocks or behaves as if they did not. - uint256 epochNumber = getEpochAt(getTimestampForSlot(_slot)); - uint256 currentEpoch = getEpochAt(_currentTime); - if (epochNumber != currentEpoch) { - revert Errors.Rollup__InvalidEpoch(currentEpoch, epochNumber); - } + Epoch epochNumber = getEpochAt(getTimestampForSlot(_slot)); + Epoch currentEpoch = getEpochAt(_currentTime); + require(epochNumber == currentEpoch, Errors.Rollup__InvalidEpoch(currentEpoch, epochNumber)); _validateLeonidas(_slot, _signatures, _digest, _flags); } @@ -694,57 +813,55 @@ contract Rollup is Leonidas, IRollup, ITestRollup { */ function _validateHeaderForSubmissionBase( HeaderLib.Header memory _header, - uint256 _currentTime, + Timestamp _currentTime, bytes32 _txsEffectsHash, DataStructures.ExecutionFlags memory _flags ) internal view { - if (block.chainid != _header.globalVariables.chainId) { - revert Errors.Rollup__InvalidChainId(block.chainid, _header.globalVariables.chainId); - } + require( + block.chainid == _header.globalVariables.chainId, + Errors.Rollup__InvalidChainId(block.chainid, _header.globalVariables.chainId) + ); - if (_header.globalVariables.version != VERSION) { - revert Errors.Rollup__InvalidVersion(VERSION, _header.globalVariables.version); - } + require( + _header.globalVariables.version == VERSION, + Errors.Rollup__InvalidVersion(VERSION, _header.globalVariables.version) + ); - if (_header.globalVariables.blockNumber != tips.pendingBlockNumber + 1) { - revert Errors.Rollup__InvalidBlockNumber( + require( + _header.globalVariables.blockNumber == tips.pendingBlockNumber + 1, + Errors.Rollup__InvalidBlockNumber( tips.pendingBlockNumber + 1, _header.globalVariables.blockNumber - ); - } + ) + ); bytes32 tipArchive = archive(); - if (tipArchive != _header.lastArchive.root) { - revert Errors.Rollup__InvalidArchive(tipArchive, _header.lastArchive.root); - } + require( + tipArchive == _header.lastArchive.root, + Errors.Rollup__InvalidArchive(tipArchive, _header.lastArchive.root) + ); - uint256 slot = _header.globalVariables.slotNumber; - if (slot > type(uint128).max) { - revert Errors.Rollup__SlotValueTooLarge(slot); - } + Slot slot = Slot.wrap(_header.globalVariables.slotNumber); + Slot lastSlot = blocks[tips.pendingBlockNumber].slotNumber; + require(slot > lastSlot, Errors.Rollup__SlotAlreadyInChain(lastSlot, slot)); - uint256 lastSlot = uint256(blocks[tips.pendingBlockNumber].slotNumber); - if (slot <= lastSlot) { - revert Errors.Rollup__SlotAlreadyInChain(lastSlot, slot); - } - - uint256 timestamp = getTimestampForSlot(slot); - if (_header.globalVariables.timestamp != timestamp) { - revert Errors.Rollup__InvalidTimestamp(timestamp, _header.globalVariables.timestamp); - } + Timestamp timestamp = getTimestampForSlot(slot); + require( + Timestamp.wrap(_header.globalVariables.timestamp) == timestamp, + Errors.Rollup__InvalidTimestamp(timestamp, Timestamp.wrap(_header.globalVariables.timestamp)) + ); - if (timestamp > _currentTime) { - // @note If you are hitting this error, it is likely because the chain you use have a blocktime that differs - // from the value that we have in the constants. - // When you are encountering this, it will likely be as the sequencer expects to be able to include - // an Aztec block in the "next" ethereum block based on a timestamp that is 12 seconds in the future - // from the last block. However, if the actual will only be 1 second in the future, you will end up - // expecting this value to be in the future. - revert Errors.Rollup__TimestampInFuture(_currentTime, timestamp); - } + // @note If you are hitting this error, it is likely because the chain you use have a blocktime that differs + // from the value that we have in the constants. + // When you are encountering this, it will likely be as the sequencer expects to be able to include + // an Aztec block in the "next" ethereum block based on a timestamp that is 12 seconds in the future + // from the last block. However, if the actual will only be 1 second in the future, you will end up + // expecting this value to be in the future. + require(timestamp <= _currentTime, Errors.Rollup__TimestampInFuture(_currentTime, timestamp)); // Check if the data is available - if (!_flags.ignoreDA && _header.contentCommitment.txsEffectsHash != _txsEffectsHash) { - revert Errors.Rollup__UnavailableTxs(_header.contentCommitment.txsEffectsHash); - } + require( + _flags.ignoreDA || _header.contentCommitment.txsEffectsHash == _txsEffectsHash, + Errors.Rollup__UnavailableTxs(_header.contentCommitment.txsEffectsHash) + ); } } diff --git a/l1-contracts/src/core/interfaces/IFeeJuicePortal.sol b/l1-contracts/src/core/interfaces/IFeeJuicePortal.sol index 19dd38a059e..0d72524ddea 100644 --- a/l1-contracts/src/core/interfaces/IFeeJuicePortal.sol +++ b/l1-contracts/src/core/interfaces/IFeeJuicePortal.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; interface IFeeJuicePortal { function initialize(address _registry, address _underlying, bytes32 _l2TokenAddress) external; diff --git a/l1-contracts/src/core/sequencer_selection/ILeonidas.sol b/l1-contracts/src/core/interfaces/ILeonidas.sol similarity index 58% rename from l1-contracts/src/core/sequencer_selection/ILeonidas.sol rename to l1-contracts/src/core/interfaces/ILeonidas.sol index 68a58572236..ece101d7277 100644 --- a/l1-contracts/src/core/sequencer_selection/ILeonidas.sol +++ b/l1-contracts/src/core/interfaces/ILeonidas.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; + +import {Timestamp, Slot, Epoch} from "@aztec/core/libraries/TimeMath.sol"; interface ILeonidas { // Changing depending on sybil mechanism and slashing enforcement @@ -10,24 +12,25 @@ interface ILeonidas { // Likely changing to optimize in Pleistarchus function setupEpoch() external; function getCurrentProposer() external view returns (address); - function getProposerAt(uint256 _ts) external view returns (address); + function getProposerAt(Timestamp _ts) external view returns (address); // Stable - function getCurrentEpoch() external view returns (uint256); - function getCurrentSlot() external view returns (uint256); + function getCurrentEpoch() external view returns (Epoch); + function getCurrentSlot() external view returns (Slot); function isValidator(address _validator) external view returns (bool); function getValidatorCount() external view returns (uint256); function getValidatorAt(uint256 _index) external view returns (address); // Consider removing below this point - function getTimestampForSlot(uint256 _slotNumber) external view returns (uint256); + function getTimestampForSlot(Slot _slotNumber) external view returns (Timestamp); // Likely removal of these to replace with a size and indiviual getter // Get the current epoch committee function getCurrentEpochCommittee() external view returns (address[] memory); - function getEpochCommittee(uint256 _epoch) external view returns (address[] memory); + function getEpochCommittee(Epoch _epoch) external view returns (address[] memory); function getValidators() external view returns (address[] memory); - function getEpochAt(uint256 _ts) external view returns (uint256); - function getSlotAt(uint256 _ts) external view returns (uint256); + function getEpochAt(Timestamp _ts) external view returns (Epoch); + function getSlotAt(Timestamp _ts) external view returns (Slot); + function getEpochAtSlot(Slot _slotNumber) external view returns (Epoch); } diff --git a/l1-contracts/src/core/interfaces/IProofCommitmentEscrow.sol b/l1-contracts/src/core/interfaces/IProofCommitmentEscrow.sol index 5aa2be81ec8..e844400fba5 100644 --- a/l1-contracts/src/core/interfaces/IProofCommitmentEscrow.sol +++ b/l1-contracts/src/core/interfaces/IProofCommitmentEscrow.sol @@ -1,12 +1,20 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -import {SignatureLib} from "../libraries/SignatureLib.sol"; +import {Timestamp} from "@aztec/core/libraries/TimeMath.sol"; interface IProofCommitmentEscrow { + event Deposit(address indexed depositor, uint256 amount); + event StartWithdraw(address indexed withdrawer, uint256 amount, Timestamp executableAt); + event ExecuteWithdraw(address indexed withdrawer, uint256 amount); + event StakeBond(address indexed prover, uint256 amount); + event UnstakeBond(address indexed prover, uint256 amount); + function deposit(uint256 _amount) external; - function withdraw(uint256 _amount) external; - function stakeBond(uint256 _bondAmount, address _prover) external; - function unstakeBond(uint256 _bondAmount, address _prover) external; + function startWithdraw(uint256 _amount) external; + function executeWithdraw() external; + function stakeBond(address _prover, uint256 _amount) external; + function unstakeBond(address _prover, uint256 _amount) external; + function minBalanceAtTime(Timestamp _timestamp, address _prover) external view returns (uint256); } diff --git a/l1-contracts/src/core/interfaces/IRollup.sol b/l1-contracts/src/core/interfaces/IRollup.sol index 464f4c93a96..6aa9f616938 100644 --- a/l1-contracts/src/core/interfaces/IRollup.sol +++ b/l1-contracts/src/core/interfaces/IRollup.sol @@ -1,15 +1,18 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -import {IInbox} from "../interfaces/messagebridge/IInbox.sol"; -import {IOutbox} from "../interfaces/messagebridge/IOutbox.sol"; +import {IInbox} from "@aztec/core/interfaces/messagebridge/IInbox.sol"; +import {IOutbox} from "@aztec/core/interfaces/messagebridge/IOutbox.sol"; -import {SignatureLib} from "../libraries/SignatureLib.sol"; -import {DataStructures} from "../libraries/DataStructures.sol"; +import {SignatureLib} from "@aztec/core/libraries/crypto/SignatureLib.sol"; +import {DataStructures} from "@aztec/core/libraries/DataStructures.sol"; +import {EpochProofQuoteLib} from "@aztec/core/libraries/EpochProofQuoteLib.sol"; + +import {Timestamp, Slot, Epoch} from "@aztec/core/libraries/TimeMath.sol"; interface ITestRollup { - function setVerifier(address _verifier) external; + function setEpochVerifier(address _verifier) external; function setVkTreeRoot(bytes32 _vkTreeRoot) external; function setAssumeProvenThroughBlockNumber(uint256 blockNumber) external; } @@ -19,16 +22,16 @@ interface IRollup { event L2ProofVerified(uint256 indexed blockNumber, bytes32 indexed proverId); event PrunedPending(uint256 provenBlockNumber, uint256 pendingBlockNumber); event ProofRightClaimed( - uint256 indexed epoch, + Epoch indexed epoch, address indexed bondProvider, address indexed proposer, uint256 bondAmount, - uint256 currentSlot + Slot currentSlot ); function prune() external; - function claimEpochProofRight(DataStructures.EpochProofQuote calldata _quote) external; + function claimEpochProofRight(EpochProofQuoteLib.SignedEpochProofQuote calldata _quote) external; function propose( bytes calldata _header, @@ -39,20 +42,31 @@ interface IRollup { bytes calldata _body ) external; - function submitBlockRootProof( + function proposeAndClaim( bytes calldata _header, bytes32 _archive, - bytes32 _proverId, + bytes32 _blockHash, + bytes32[] memory _txHashes, + SignatureLib.Signature[] memory _signatures, + bytes calldata _body, + EpochProofQuoteLib.SignedEpochProofQuote calldata _quote + ) external; + + function submitEpochRootProof( + uint256 _epochSize, + bytes32[7] calldata _args, + bytes32[64] calldata _fees, bytes calldata _aggregationObject, bytes calldata _proof ) external; - function canProposeAtTime(uint256 _ts, bytes32 _archive) external view returns (uint256, uint256); + function canProposeAtTime(Timestamp _ts, bytes32 _archive) external view returns (Slot, uint256); + function validateHeader( bytes calldata _header, SignatureLib.Signature[] memory _signatures, bytes32 _digest, - uint256 _currentTime, + Timestamp _currentTime, bytes32 _txsEffecstHash, DataStructures.ExecutionFlags memory _flags ) external view; @@ -70,29 +84,34 @@ interface IRollup { external view returns ( - uint256 provenBlockCount, + uint256 provenBlockNumber, bytes32 provenArchive, - uint256 pendingBlockCount, + uint256 pendingBlockNumber, bytes32 pendingArchive, - bytes32 archiveOfMyBlock + bytes32 archiveOfMyBlock, + Epoch provenEpochNumber ); - // TODO(#7346): Integrate batch rollups - // function submitRootProof( - // bytes32 _previousArchive, - // bytes32 _archive, - // bytes32 outHash, - // address[32] calldata coinbases, - // uint256[32] calldata fees, - // bytes32 _proverId, - // bytes calldata _aggregationObject, - // bytes calldata _proof - // ) external; + function quoteToDigest(EpochProofQuoteLib.EpochProofQuote memory quote) + external + view + returns (bytes32); function archive() external view returns (bytes32); function archiveAt(uint256 _blockNumber) external view returns (bytes32); function getProvenBlockNumber() external view returns (uint256); function getPendingBlockNumber() external view returns (uint256); - function getEpochToProve() external view returns (uint256); + function getEpochToProve() external view returns (Epoch); + function nextEpochToClaim() external view returns (Epoch); + function getEpochForBlock(uint256 blockNumber) external view returns (Epoch); + function validateEpochProofRightClaim(EpochProofQuoteLib.SignedEpochProofQuote calldata _quote) + external + view; + function getEpochProofPublicInputs( + uint256 _epochSize, + bytes32[7] calldata _args, + bytes32[64] calldata _fees, + bytes calldata _aggregationObject + ) external view returns (bytes32[] memory); function computeTxsEffectsHash(bytes calldata _body) external pure returns (bytes32); } diff --git a/l1-contracts/src/core/interfaces/IVerifier.sol b/l1-contracts/src/core/interfaces/IVerifier.sol index 61cbe7fcf52..ab412dc1500 100644 --- a/l1-contracts/src/core/interfaces/IVerifier.sol +++ b/l1-contracts/src/core/interfaces/IVerifier.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; interface IVerifier { function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) diff --git a/l1-contracts/src/core/interfaces/messagebridge/IFrontier.sol b/l1-contracts/src/core/interfaces/messagebridge/IFrontier.sol deleted file mode 100644 index 9f158cb0258..00000000000 --- a/l1-contracts/src/core/interfaces/messagebridge/IFrontier.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; - -interface IFrontier { - /** - * @notice Inserts a new leaf into the frontier tree and returns its index - * @param _leaf - The leaf to insert - * @return The index of the leaf in the tree - */ - function insertLeaf(bytes32 _leaf) external returns (uint256); - - /** - * @notice Returns the root of the frontier tree - * @return The root of the tree - */ - function root() external view returns (bytes32); - - /** - * @notice Returns whether the tree is full - * @return True if full, false otherwise - */ - function isFull() external view returns (bool); -} diff --git a/l1-contracts/src/core/interfaces/messagebridge/IInbox.sol b/l1-contracts/src/core/interfaces/messagebridge/IInbox.sol index 547fc773693..f3e7c00b463 100644 --- a/l1-contracts/src/core/interfaces/messagebridge/IInbox.sol +++ b/l1-contracts/src/core/interfaces/messagebridge/IInbox.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import {DataStructures} from "../../libraries/DataStructures.sol"; diff --git a/l1-contracts/src/core/interfaces/messagebridge/IOutbox.sol b/l1-contracts/src/core/interfaces/messagebridge/IOutbox.sol index c5a986c3944..c5b0a7fa5ae 100644 --- a/l1-contracts/src/core/interfaces/messagebridge/IOutbox.sol +++ b/l1-contracts/src/core/interfaces/messagebridge/IOutbox.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import {DataStructures} from "../../libraries/DataStructures.sol"; diff --git a/l1-contracts/src/core/libraries/ConstantsGen.sol b/l1-contracts/src/core/libraries/ConstantsGen.sol index 3d488ae07d9..d6a1f7c4778 100644 --- a/l1-contracts/src/core/libraries/ConstantsGen.sol +++ b/l1-contracts/src/core/libraries/ConstantsGen.sol @@ -1,7 +1,7 @@ // GENERATED FILE - DO NOT EDIT, RUN yarn remake-constants in circuits.js // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; /** * @title Constants Library @@ -32,7 +32,7 @@ library Constants { uint256 internal constant MAX_ENCRYPTED_LOGS_PER_CALL = 4; uint256 internal constant MAX_UNENCRYPTED_LOGS_PER_CALL = 4; uint256 internal constant ARCHIVE_HEIGHT = 16; - uint256 internal constant VK_TREE_HEIGHT = 5; + uint256 internal constant VK_TREE_HEIGHT = 6; uint256 internal constant FUNCTION_TREE_HEIGHT = 5; uint256 internal constant NOTE_HASH_TREE_HEIGHT = 32; uint256 internal constant PUBLIC_DATA_TREE_HEIGHT = 40; @@ -71,29 +71,24 @@ library Constants { uint256 internal constant MAX_UNENCRYPTED_LOGS_PER_TX = 8; uint256 internal constant MAX_PUBLIC_DATA_HINTS = 128; uint256 internal constant NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP = 16; - uint256 internal constant PRIVATE_KERNEL_INIT_INDEX = 0; - uint256 internal constant PRIVATE_KERNEL_INNER_INDEX = 1; - uint256 internal constant PRIVATE_KERNEL_RESET_FULL_INDEX = 2; - uint256 internal constant PRIVATE_KERNEL_RESET_FULL_INNER_INDEX = 3; - uint256 internal constant PRIVATE_KERNEL_RESET_BIG_INDEX = 4; - uint256 internal constant PRIVATE_KERNEL_RESET_MEDIUM_INDEX = 5; - uint256 internal constant PRIVATE_KERNEL_RESET_SMALL_INDEX = 6; - uint256 internal constant PRIVATE_KERNEL_RESET_TINY_INDEX = 7; - uint256 internal constant PRIVATE_KERNEL_TAIL_INDEX = 10; - uint256 internal constant PRIVATE_KERNEL_TAIL_TO_PUBLIC_INDEX = 11; - uint256 internal constant EMPTY_NESTED_INDEX = 12; - uint256 internal constant PRIVATE_KERNEL_EMPTY_INDEX = 13; - uint256 internal constant PUBLIC_KERNEL_INNER_INDEX = 15; - uint256 internal constant PUBLIC_KERNEL_MERGE_INDEX = 16; - uint256 internal constant PUBLIC_KERNEL_TAIL_INDEX = 17; - uint256 internal constant BASE_PARITY_INDEX = 18; - uint256 internal constant ROOT_PARITY_INDEX = 19; - uint256 internal constant BASE_ROLLUP_INDEX = 20; - uint256 internal constant MERGE_ROLLUP_INDEX = 21; - uint256 internal constant BLOCK_ROOT_ROLLUP_INDEX = 22; - uint256 internal constant BLOCK_MERGE_ROLLUP_INDEX = 23; - uint256 internal constant ROOT_ROLLUP_INDEX = 24; - uint256 internal constant BLOCK_ROOT_ROLLUP_FINAL_INDEX = 25; + uint256 internal constant EMPTY_NESTED_INDEX = 0; + uint256 internal constant PRIVATE_KERNEL_EMPTY_INDEX = 1; + uint256 internal constant PRIVATE_KERNEL_INIT_INDEX = 2; + uint256 internal constant PRIVATE_KERNEL_INNER_INDEX = 3; + uint256 internal constant PRIVATE_KERNEL_TAIL_INDEX = 4; + uint256 internal constant PRIVATE_KERNEL_TAIL_TO_PUBLIC_INDEX = 5; + uint256 internal constant PUBLIC_KERNEL_MERGE_INDEX = 6; + uint256 internal constant PUBLIC_KERNEL_TAIL_INDEX = 7; + uint256 internal constant PUBLIC_KERNEL_INNER_INDEX = 8; + uint256 internal constant BASE_PARITY_INDEX = 10; + uint256 internal constant ROOT_PARITY_INDEX = 11; + uint256 internal constant BASE_ROLLUP_INDEX = 12; + uint256 internal constant MERGE_ROLLUP_INDEX = 13; + uint256 internal constant BLOCK_ROOT_ROLLUP_INDEX = 14; + uint256 internal constant BLOCK_MERGE_ROLLUP_INDEX = 15; + uint256 internal constant ROOT_ROLLUP_INDEX = 16; + uint256 internal constant BLOCK_ROOT_ROLLUP_EMPTY_INDEX = 17; + uint256 internal constant PRIVATE_KERNEL_RESET_INDEX = 20; uint256 internal constant FUNCTION_SELECTOR_NUM_BYTES = 4; uint256 internal constant INITIALIZATION_SLOT_SEPARATOR = 1000000000; uint256 internal constant INITIAL_L2_BLOCK_NUM = 1; @@ -215,6 +210,8 @@ library Constants { uint256 internal constant CONSTANT_ROLLUP_DATA_LENGTH = 12; uint256 internal constant BASE_OR_MERGE_PUBLIC_INPUTS_LENGTH = 29; uint256 internal constant BLOCK_ROOT_OR_BLOCK_MERGE_PUBLIC_INPUTS_LENGTH = 91; + uint256 internal constant FEE_RECIPIENT_LENGTH = 2; + uint256 internal constant ROOT_ROLLUP_PUBLIC_INPUTS_LENGTH = 75; uint256 internal constant GET_NOTES_ORACLE_RETURN_LENGTH = 674; uint256 internal constant NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP = 2048; uint256 internal constant NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP = 2048; @@ -226,9 +223,9 @@ library Constants { uint256 internal constant LOGS_HASHES_NUM_BYTES_PER_BASE_ROLLUP = 64; uint256 internal constant NUM_MSGS_PER_BASE_PARITY = 4; uint256 internal constant NUM_BASE_PARITY_PER_ROOT_PARITY = 4; - uint256 internal constant RECURSIVE_PROOF_LENGTH = 439; - uint256 internal constant NESTED_RECURSIVE_PROOF_LENGTH = 439; - uint256 internal constant TUBE_PROOF_LENGTH = 439; + uint256 internal constant RECURSIVE_PROOF_LENGTH = 463; + uint256 internal constant NESTED_RECURSIVE_PROOF_LENGTH = 463; + uint256 internal constant TUBE_PROOF_LENGTH = 463; uint256 internal constant VERIFICATION_KEY_LENGTH_IN_FIELDS = 128; uint256 internal constant MEM_TAG_U1 = 1; uint256 internal constant MEM_TAG_U8 = 2; diff --git a/l1-contracts/src/core/libraries/DataStructures.sol b/l1-contracts/src/core/libraries/DataStructures.sol index 8a114ce55c0..537f3d6e7b2 100644 --- a/l1-contracts/src/core/libraries/DataStructures.sol +++ b/l1-contracts/src/core/libraries/DataStructures.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: Apache-2.0 -// Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +// Copyright 2024 Aztec Labs. +pragma solidity >=0.8.27; -import {SignatureLib} from "./SignatureLib.sol"; +import {Epoch} from "@aztec/core/libraries/TimeMath.sol"; /** * @title Data Structures Library @@ -65,37 +65,29 @@ library DataStructures { } // docs:end:l2_to_l1_msg - // docs:start:registry_snapshot /** - * @notice Struct for storing address of cross communication components and the block number when it was updated - * @param rollup - The address of the rollup contract - * @param blockNumber - The block number of the snapshot + * @notice Struct for storing flags for block header validation + * @param ignoreDA - True will ignore DA check, otherwise checks + * @param ignoreSignature - True will ignore the signatures, otherwise checks */ - struct RegistrySnapshot { - address rollup; - uint256 blockNumber; - } - // docs:end:registry_snapshot - struct ExecutionFlags { bool ignoreDA; bool ignoreSignatures; } - struct EpochProofQuote { - SignatureLib.Signature signature; - uint256 epochToProve; - uint256 validUntilSlot; - uint256 bondAmount; - address prover; - uint32 basisPointFee; - } - + /** + * @notice Struct containing the Epoch Proof Claim + * @param epochToProve - the epoch that the bond provider is claiming to prove + * @param basisPointFee the fee that the bond provider will receive as a percentage of the block rewards + * @param bondAmount - the size of the bond + * @param bondProvider - the address that put up the bond + * @param proposerClaimant - the address of the proposer that submitted the claim + */ struct EpochProofClaim { - uint256 epochToProve; // the epoch that the bond provider is claiming to prove - uint256 basisPointFee; // the fee that the bond provider will receive as a percentage of the block rewards - uint256 bondAmount; // the amount of escrowed funds that the bond provider will stake. Must be at least PROOF_COMMITMENT_BOND_AMOUNT - address bondProvider; // the address that has deposited funds in the escrow contract - address proposerClaimant; // the address of the proposer that submitted the claim + Epoch epochToProve; + uint256 basisPointFee; + uint256 bondAmount; + address bondProvider; + address proposerClaimant; } } diff --git a/l1-contracts/src/core/libraries/EpochProofQuoteLib.sol b/l1-contracts/src/core/libraries/EpochProofQuoteLib.sol new file mode 100644 index 00000000000..1aba031a64d --- /dev/null +++ b/l1-contracts/src/core/libraries/EpochProofQuoteLib.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2024 Aztec Labs. +pragma solidity >=0.8.27; + +import {Slot, Epoch} from "@aztec/core/libraries/TimeMath.sol"; +import {SignatureLib} from "@aztec/core/libraries/crypto/SignatureLib.sol"; + +library EpochProofQuoteLib { + /** + * @notice Struct encompassing an epoch proof quote + * @param epochToProve - The epoch number to prove + * @param validUntilSlot - The deadline of the quote, denoted in L2 slots + * @param bondAmount - The size of the bond + * @param prover - The address of the prover + * @param basisPointFee - The fee measured in basis points + */ + struct EpochProofQuote { + Epoch epochToProve; + Slot validUntilSlot; + uint256 bondAmount; + address prover; + uint32 basisPointFee; + } + + /** + * @notice A signed quote for the epoch proof + * @param quote - The Epoch Proof Quote + * @param signature - A signature on the quote + */ + struct SignedEpochProofQuote { + EpochProofQuote quote; + SignatureLib.Signature signature; + } + + bytes32 public constant EPOCH_PROOF_QUOTE_TYPEHASH = keccak256( + "EpochProofQuote(uint256 epochToProve,uint256 validUntilSlot,uint256 bondAmount,address prover,uint32 basisPointFee)" + ); + + function hash(EpochProofQuote memory quote) internal pure returns (bytes32) { + return keccak256( + abi.encode( + EPOCH_PROOF_QUOTE_TYPEHASH, + quote.epochToProve, + quote.validUntilSlot, + quote.bondAmount, + quote.prover, + quote.basisPointFee + ) + ); + } +} diff --git a/l1-contracts/src/core/libraries/Errors.sol b/l1-contracts/src/core/libraries/Errors.sol index b5086474992..8df16131fd1 100644 --- a/l1-contracts/src/core/libraries/Errors.sol +++ b/l1-contracts/src/core/libraries/Errors.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; + +import {Timestamp, Slot, Epoch} from "@aztec/core/libraries/TimeMath.sol"; /** * @title Errors Library @@ -46,39 +48,37 @@ library Errors { // Rollup error Rollup__InsufficientBondAmount(uint256 minimum, uint256 provided); // 0xa165f276 error Rollup__InvalidArchive(bytes32 expected, bytes32 actual); // 0xb682a40e + error Rollup__InvalidBlockHash(bytes32 expected, bytes32 actual); error Rollup__InvalidBlockNumber(uint256 expected, uint256 actual); // 0xe5edf847 error Rollup__InvalidChainId(uint256 expected, uint256 actual); // 0x37b5bc12 - error Rollup__InvalidEpoch(uint256 expected, uint256 actual); // 0x3c6d65e6 + error Rollup__InvalidEpoch(Epoch expected, Epoch actual); // 0x3c6d65e6 error Rollup__InvalidInHash(bytes32 expected, bytes32 actual); // 0xcd6f4233 + error Rollup__InvalidPreviousArchive(bytes32 expected, bytes32 actual); // 0xb682a40e + error Rollup__InvalidPreviousBlockHash(bytes32 expected, bytes32 actual); error Rollup__InvalidProof(); // 0xa5b2ba17 error Rollup__InvalidProposedArchive(bytes32 expected, bytes32 actual); // 0x32532e73 - error Rollup__InvalidTimestamp(uint256 expected, uint256 actual); // 0x3132e895 + error Rollup__InvalidTimestamp(Timestamp expected, Timestamp actual); // 0x3132e895 error Rollup__InvalidVersion(uint256 expected, uint256 actual); // 0x9ef30794 error Rollup__NoEpochToProve(); // 0xcbaa3951 error Rollup__NonSequentialProving(); // 0x1e5be132 - error Rollup__NotClaimingCorrectEpoch(uint256 expected, uint256 actual); // 0xf0e0744d + error Rollup__NotClaimingCorrectEpoch(Epoch expected, Epoch actual); // 0xf0e0744d error Rollup__NothingToPrune(); // 0x850defd3 error Rollup__NotInClaimPhase(uint256 currentSlotInEpoch, uint256 claimDuration); // 0xe6969f11 error Rollup__ProofRightAlreadyClaimed(); // 0x2cac5f0a - error Rollup__QuoteExpired(uint256 currentSlot, uint256 quoteSlot); // 0x20a001eb - error Rollup__SlotAlreadyInChain(uint256 lastSlot, uint256 proposedSlot); // 0x83510bd0 - error Rollup__SlotValueTooLarge(uint256 slot); // 0x7234f4fe - error Rollup__TimestampInFuture(uint256 max, uint256 actual); // 0x89f30690 + error Rollup__QuoteExpired(Slot currentSlot, Slot quoteSlot); // 0x20a001eb + error Rollup__SlotAlreadyInChain(Slot lastSlot, Slot proposedSlot); // 0x83510bd0 + error Rollup__TimestampInFuture(Timestamp max, Timestamp actual); // 0x89f30690 error Rollup__TimestampTooOld(); // 0x72ed9c81 error Rollup__TryingToProveNonExistingBlock(); // 0x34ef4954 error Rollup__UnavailableTxs(bytes32 txsHash); // 0x414906c3 - // Registry - error Registry__RollupNotRegistered(address rollup); // 0xa1fee4cf - error Registry__RollupAlreadyRegistered(address rollup); // 0x3c34eabf - //TxsDecoder error TxsDecoder__InvalidLogsLength(uint256 expected, uint256 actual); // 0x829ca981 error TxsDecoder__TxsTooLarge(uint256 expected, uint256 actual); // 0xc7d44a62 // HeaderLib error HeaderLib__InvalidHeaderSize(uint256 expected, uint256 actual); // 0xf3ccb247 - error HeaderLib__InvalidSlotNumber(uint256 expected, uint256 actual); // 0x09ba91ff + error HeaderLib__InvalidSlotNumber(Slot expected, Slot actual); // 0x09ba91ff // MerkleLib error MerkleLib__InvalidRoot(bytes32 expected, bytes32 actual, bytes32 leaf, uint256 leafIndex); // 0x5f216bf1 @@ -100,4 +100,9 @@ library Errors { error FeeJuicePortal__AlreadyInitialized(); // 0xc7a172fe error FeeJuicePortal__InvalidInitialization(); // 0xfd9b3208 error FeeJuicePortal__Unauthorized(); // 0x67e3691e + + // Proof Commitment Escrow + error ProofCommitmentEscrow__InsufficientBalance(uint256 balance, uint256 requested); // 0x09b8b789 + error ProofCommitmentEscrow__NotOwner(address caller); // 0x2ac332c1 + error ProofCommitmentEscrow__WithdrawRequestNotReady(uint256 current, Timestamp readyAt); // 0xb32ab8a7 } diff --git a/l1-contracts/src/core/libraries/HeaderLib.sol b/l1-contracts/src/core/libraries/HeaderLib.sol index 0f9cb427182..fa5aff3033a 100644 --- a/l1-contracts/src/core/libraries/HeaderLib.sol +++ b/l1-contracts/src/core/libraries/HeaderLib.sol @@ -1,10 +1,9 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -// Libraries -import {Errors} from "./Errors.sol"; -import {Constants} from "./ConstantsGen.sol"; +import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; /** * @title Header Library @@ -113,9 +112,10 @@ library HeaderLib { * @return The decoded header */ function decode(bytes calldata _header) internal pure returns (Header memory) { - if (_header.length != HEADER_LENGTH) { - revert Errors.HeaderLib__InvalidHeaderSize(HEADER_LENGTH, _header.length); - } + require( + _header.length == HEADER_LENGTH, + Errors.HeaderLib__InvalidHeaderSize(HEADER_LENGTH, _header.length) + ); Header memory header; @@ -197,9 +197,10 @@ library HeaderLib { fields[23] = bytes32(_header.totalFees); // fail if the header structure has changed without updating this function - if (fields.length != Constants.HEADER_LENGTH) { - revert Errors.HeaderLib__InvalidHeaderSize(Constants.HEADER_LENGTH, fields.length); - } + require( + fields.length == Constants.HEADER_LENGTH, + Errors.HeaderLib__InvalidHeaderSize(Constants.HEADER_LENGTH, fields.length) + ); return fields; } @@ -224,11 +225,12 @@ library HeaderLib { fields[8] = bytes32(_globalVariables.gasFees.feePerL2Gas); // fail if the header structure has changed without updating this function - if (fields.length != Constants.GLOBAL_VARIABLES_LENGTH) { - // TODO(Miranda): Temporarily using this method and below error while block-root proofs are verified - // When we verify root proofs, this method can be removed => no need for separate named error - revert Errors.HeaderLib__InvalidHeaderSize(Constants.HEADER_LENGTH, fields.length); - } + // TODO(Miranda): Temporarily using this method and below error while block-root proofs are verified + // When we verify root proofs, this method can be removed => no need for separate named error + require( + fields.length == Constants.GLOBAL_VARIABLES_LENGTH, + Errors.HeaderLib__InvalidHeaderSize(Constants.HEADER_LENGTH, fields.length) + ); return fields; } diff --git a/l1-contracts/src/core/libraries/TimeMath.sol b/l1-contracts/src/core/libraries/TimeMath.sol new file mode 100644 index 00000000000..245a133d40f --- /dev/null +++ b/l1-contracts/src/core/libraries/TimeMath.sol @@ -0,0 +1,155 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2024 Aztec Labs. +pragma solidity >=0.8.27; + +import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; + +type Timestamp is uint256; + +type Slot is uint256; + +type Epoch is uint256; + +library SlotLib { + function toTimestamp(Slot a) internal pure returns (Timestamp) { + return Timestamp.wrap(Slot.unwrap(a) * Constants.AZTEC_SLOT_DURATION); + } + + function fromTimestamp(Timestamp a) internal pure returns (Slot) { + return Slot.wrap(Timestamp.unwrap(a) / Constants.AZTEC_SLOT_DURATION); + } + + function positionInEpoch(Slot a) internal pure returns (uint256) { + return Slot.unwrap(a) % Constants.AZTEC_EPOCH_DURATION; + } + + function unwrap(Slot a) internal pure returns (uint256) { + return Slot.unwrap(a); + } +} + +library EpochLib { + function toSlots(Epoch a) internal pure returns (Slot) { + return Slot.wrap(Epoch.unwrap(a) * Constants.AZTEC_EPOCH_DURATION); + } + + function toTimestamp(Epoch a) internal pure returns (Timestamp) { + return SlotLib.toTimestamp(toSlots(a)); + } + + function fromTimestamp(Timestamp a) internal pure returns (Epoch) { + return Epoch.wrap( + Timestamp.unwrap(a) / (Constants.AZTEC_EPOCH_DURATION * Constants.AZTEC_SLOT_DURATION) + ); + } + + function unwrap(Epoch a) internal pure returns (uint256) { + return Epoch.unwrap(a); + } +} + +using SlotLib for Slot; +using EpochLib for Epoch; + +function addTimestamp(Timestamp a, Timestamp b) pure returns (Timestamp) { + return Timestamp.wrap(Timestamp.unwrap(a) + Timestamp.unwrap(b)); +} + +function subTimestamp(Timestamp a, Timestamp b) pure returns (Timestamp) { + return Timestamp.wrap(Timestamp.unwrap(a) - Timestamp.unwrap(b)); +} + +function ltTimestamp(Timestamp a, Timestamp b) pure returns (bool) { + return Timestamp.unwrap(a) < Timestamp.unwrap(b); +} + +function lteTimestamp(Timestamp a, Timestamp b) pure returns (bool) { + return Timestamp.unwrap(a) <= Timestamp.unwrap(b); +} + +function gtTimestamp(Timestamp a, Timestamp b) pure returns (bool) { + return Timestamp.unwrap(a) > Timestamp.unwrap(b); +} + +function gteTimestamp(Timestamp a, Timestamp b) pure returns (bool) { + return Timestamp.unwrap(a) >= Timestamp.unwrap(b); +} + +function neqTimestamp(Timestamp a, Timestamp b) pure returns (bool) { + return Timestamp.unwrap(a) != Timestamp.unwrap(b); +} + +function eqTimestamp(Timestamp a, Timestamp b) pure returns (bool) { + return Timestamp.unwrap(a) == Timestamp.unwrap(b); +} + +// Slot + +function addSlot(Slot a, Slot b) pure returns (Slot) { + return Slot.wrap(Slot.unwrap(a) + Slot.unwrap(b)); +} + +function eqSlot(Slot a, Slot b) pure returns (bool) { + return Slot.unwrap(a) == Slot.unwrap(b); +} + +function neqSlot(Slot a, Slot b) pure returns (bool) { + return Slot.unwrap(a) != Slot.unwrap(b); +} + +function ltSlot(Slot a, Slot b) pure returns (bool) { + return Slot.unwrap(a) < Slot.unwrap(b); +} + +function lteSlot(Slot a, Slot b) pure returns (bool) { + return Slot.unwrap(a) <= Slot.unwrap(b); +} + +function gtSlot(Slot a, Slot b) pure returns (bool) { + return Slot.unwrap(a) > Slot.unwrap(b); +} + +function gteSlot(Slot a, Slot b) pure returns (bool) { + return Slot.unwrap(a) >= Slot.unwrap(b); +} + +// Epoch + +function eqEpoch(Epoch a, Epoch b) pure returns (bool) { + return Epoch.unwrap(a) == Epoch.unwrap(b); +} + +function neqEpoch(Epoch a, Epoch b) pure returns (bool) { + return Epoch.unwrap(a) != Epoch.unwrap(b); +} + +function subEpoch(Epoch a, Epoch b) pure returns (Epoch) { + return Epoch.wrap(Epoch.unwrap(a) - Epoch.unwrap(b)); +} + +function addEpoch(Epoch a, Epoch b) pure returns (Epoch) { + return Epoch.wrap(Epoch.unwrap(a) + Epoch.unwrap(b)); +} + +using { + addTimestamp as +, + subTimestamp as -, + ltTimestamp as <, + gtTimestamp as >, + lteTimestamp as <=, + gteTimestamp as >=, + neqTimestamp as !=, + eqTimestamp as == +} for Timestamp global; + +using {addEpoch as +, subEpoch as -, eqEpoch as ==, neqEpoch as !=} for Epoch global; + +using { + eqSlot as ==, + neqSlot as !=, + gteSlot as >=, + gtSlot as >, + lteSlot as <=, + ltSlot as <, + addSlot as + +} for Slot global; diff --git a/l1-contracts/src/core/libraries/decoders/TxsDecoder.sol b/l1-contracts/src/core/libraries/TxsDecoder.sol similarity index 97% rename from l1-contracts/src/core/libraries/decoders/TxsDecoder.sol rename to l1-contracts/src/core/libraries/TxsDecoder.sol index 7a2c4c63231..c892a2e8439 100644 --- a/l1-contracts/src/core/libraries/decoders/TxsDecoder.sol +++ b/l1-contracts/src/core/libraries/TxsDecoder.sol @@ -1,11 +1,10 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -// Libraries -import {Errors} from "../Errors.sol"; -import {Constants} from "../ConstantsGen.sol"; -import {Hash} from "../Hash.sol"; +import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; +import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; /** * @title Txs Decoder Library @@ -185,33 +184,30 @@ library TxsDecoder { // We throw to ensure that the byte len we charge for DA gas in the kernels matches the actual chargable log byte len // Without this check, the user may provide the kernels with a lower log len than reality - if ( + require( uint256(bytes32(slice(_body, offsets.noteEncryptedLogsLength, 0x20))) - != vars.kernelNoteEncryptedLogsLength - ) { - revert Errors.TxsDecoder__InvalidLogsLength( + == vars.kernelNoteEncryptedLogsLength, + Errors.TxsDecoder__InvalidLogsLength( uint256(bytes32(slice(_body, offsets.noteEncryptedLogsLength, 0x20))), vars.kernelNoteEncryptedLogsLength - ); - } - if ( + ) + ); + require( uint256(bytes32(slice(_body, offsets.encryptedLogsLength, 0x20))) - != vars.kernelEncryptedLogsLength - ) { - revert Errors.TxsDecoder__InvalidLogsLength( + == vars.kernelEncryptedLogsLength, + Errors.TxsDecoder__InvalidLogsLength( uint256(bytes32(slice(_body, offsets.encryptedLogsLength, 0x20))), vars.kernelEncryptedLogsLength - ); - } - if ( + ) + ); + require( uint256(bytes32(slice(_body, offsets.unencryptedLogsLength, 0x20))) - != vars.kernelUnencryptedLogsLength - ) { - revert Errors.TxsDecoder__InvalidLogsLength( + == vars.kernelUnencryptedLogsLength, + Errors.TxsDecoder__InvalidLogsLength( uint256(bytes32(slice(_body, offsets.unencryptedLogsLength, 0x20))), vars.kernelUnencryptedLogsLength - ); - } + ) + ); // Insertions are split into multiple `bytes.concat` to work around stack too deep. vars.baseLeaf = bytes.concat( diff --git a/l1-contracts/src/core/messagebridge/frontier_tree/FrontierLib.sol b/l1-contracts/src/core/libraries/crypto/FrontierLib.sol similarity index 96% rename from l1-contracts/src/core/messagebridge/frontier_tree/FrontierLib.sol rename to l1-contracts/src/core/libraries/crypto/FrontierLib.sol index 74bfb78e215..6b9e7aef132 100644 --- a/l1-contracts/src/core/messagebridge/frontier_tree/FrontierLib.sol +++ b/l1-contracts/src/core/libraries/crypto/FrontierLib.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -import {Hash} from "../../libraries/Hash.sol"; +import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; /** * @title FrontierLib diff --git a/l1-contracts/src/core/libraries/Hash.sol b/l1-contracts/src/core/libraries/crypto/Hash.sol similarity index 94% rename from l1-contracts/src/core/libraries/Hash.sol rename to l1-contracts/src/core/libraries/crypto/Hash.sol index eb572b2fc53..df3f9467279 100644 --- a/l1-contracts/src/core/libraries/Hash.sol +++ b/l1-contracts/src/core/libraries/crypto/Hash.sol @@ -1,10 +1,8 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -// Libraries -import {Constants} from "./ConstantsGen.sol"; -import {DataStructures} from "./DataStructures.sol"; +import {DataStructures} from "@aztec/core/libraries/DataStructures.sol"; /** * @title Hash library diff --git a/l1-contracts/src/core/libraries/MerkleLib.sol b/l1-contracts/src/core/libraries/crypto/MerkleLib.sol similarity index 94% rename from l1-contracts/src/core/libraries/MerkleLib.sol rename to l1-contracts/src/core/libraries/crypto/MerkleLib.sol index 89dc020a5a2..bd8d53a0df3 100644 --- a/l1-contracts/src/core/libraries/MerkleLib.sol +++ b/l1-contracts/src/core/libraries/crypto/MerkleLib.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -import {Errors} from "../libraries/Errors.sol"; -import {Hash} from "../libraries/Hash.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; +import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; /** * @title Merkle Library @@ -47,9 +47,10 @@ library MerkleLib { indexAtHeight >>= 1; } - if (subtreeRoot != _expectedRoot) { - revert Errors.MerkleLib__InvalidRoot(_expectedRoot, subtreeRoot, _leaf, _index); - } + require( + subtreeRoot == _expectedRoot, + Errors.MerkleLib__InvalidRoot(_expectedRoot, subtreeRoot, _leaf, _index) + ); } /** diff --git a/l1-contracts/src/core/sequencer_selection/SampleLib.sol b/l1-contracts/src/core/libraries/crypto/SampleLib.sol similarity index 96% rename from l1-contracts/src/core/sequencer_selection/SampleLib.sol rename to l1-contracts/src/core/libraries/crypto/SampleLib.sol index 721ed37f23b..973e316a3a9 100644 --- a/l1-contracts/src/core/sequencer_selection/SampleLib.sol +++ b/l1-contracts/src/core/libraries/crypto/SampleLib.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -import {Errors} from "../libraries/Errors.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; /** * @title SampleLib @@ -33,9 +33,7 @@ library SampleLib { pure returns (uint256) { - if (_index >= _indexCount) { - revert Errors.SampleLib__IndexOutOfBounds(_index, _indexCount); - } + require(_index < _indexCount, Errors.SampleLib__IndexOutOfBounds(_index, _indexCount)); uint256 rounds = computeShuffleRounds(_indexCount); uint256 index = _index; @@ -64,9 +62,9 @@ library SampleLib { pure returns (uint256) { - if (_shuffledIndex >= _indexCount) { - revert Errors.SampleLib__IndexOutOfBounds(_shuffledIndex, _indexCount); - } + require( + _shuffledIndex < _indexCount, Errors.SampleLib__IndexOutOfBounds(_shuffledIndex, _indexCount) + ); uint256 rounds = computeShuffleRounds(_indexCount); diff --git a/l1-contracts/src/core/libraries/SignatureLib.sol b/l1-contracts/src/core/libraries/crypto/SignatureLib.sol similarity index 60% rename from l1-contracts/src/core/libraries/SignatureLib.sol rename to l1-contracts/src/core/libraries/crypto/SignatureLib.sol index 1bb8d6fb050..bcae500df8c 100644 --- a/l1-contracts/src/core/libraries/SignatureLib.sol +++ b/l1-contracts/src/core/libraries/crypto/SignatureLib.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity ^0.8.13; +pragma solidity ^0.8.27; -import {Errors} from "./Errors.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; library SignatureLib { struct Signature { @@ -20,12 +20,12 @@ library SignatureLib { * @param _digest - The digest that was signed */ function verify(Signature memory _signature, address _signer, bytes32 _digest) internal pure { - if (_signature.isEmpty) { - revert Errors.SignatureLib__CannotVerifyEmpty(); - } + require(!_signature.isEmpty, Errors.SignatureLib__CannotVerifyEmpty()); address recovered = ecrecover(_digest, _signature.v, _signature.r, _signature.s); - if (_signer != recovered) { - revert Errors.SignatureLib__InvalidSignature(_signer, recovered); - } + require(_signer == recovered, Errors.SignatureLib__InvalidSignature(_signer, recovered)); + } + + function toBytes(Signature memory _signature) internal pure returns (bytes memory) { + return abi.encodePacked(_signature.r, _signature.s, _signature.v); } } diff --git a/l1-contracts/src/core/messagebridge/Inbox.sol b/l1-contracts/src/core/messagebridge/Inbox.sol index babf2f5ec07..51adaa26ee8 100644 --- a/l1-contracts/src/core/messagebridge/Inbox.sol +++ b/l1-contracts/src/core/messagebridge/Inbox.sol @@ -1,17 +1,14 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -// Interfaces -import {IInbox} from "../interfaces/messagebridge/IInbox.sol"; +import {IInbox} from "@aztec/core/interfaces/messagebridge/IInbox.sol"; -// Libraries -import {Constants} from "../libraries/ConstantsGen.sol"; -import {DataStructures} from "../libraries/DataStructures.sol"; -import {Errors} from "../libraries/Errors.sol"; -import {Hash} from "../libraries/Hash.sol"; - -import {FrontierLib} from "./frontier_tree/FrontierLib.sol"; +import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; +import {DataStructures} from "@aztec/core/libraries/DataStructures.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; +import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; +import {FrontierLib} from "@aztec/core/libraries/crypto/FrontierLib.sol"; /** * @title Inbox @@ -37,6 +34,10 @@ contract Inbox is IInbox { mapping(uint256 blockNumber => FrontierLib.Tree tree) public trees; + // This value is not used much by the contract, but it is useful for synching the node faster + // as it can more easily figure out if it can just skip looking for events for a time period. + uint256 public totalMessagesInserted = 0; + constructor(address _rollup, uint256 _height) { ROLLUP = _rollup; @@ -63,15 +64,15 @@ contract Inbox is IInbox { bytes32 _content, bytes32 _secretHash ) external override(IInbox) returns (bytes32) { - if (uint256(_recipient.actor) > Constants.MAX_FIELD_VALUE) { - revert Errors.Inbox__ActorTooLarge(_recipient.actor); - } - if (uint256(_content) > Constants.MAX_FIELD_VALUE) { - revert Errors.Inbox__ContentTooLarge(_content); - } - if (uint256(_secretHash) > Constants.MAX_FIELD_VALUE) { - revert Errors.Inbox__SecretHashTooLarge(_secretHash); - } + require( + uint256(_recipient.actor) <= Constants.MAX_FIELD_VALUE, + Errors.Inbox__ActorTooLarge(_recipient.actor) + ); + require(uint256(_content) <= Constants.MAX_FIELD_VALUE, Errors.Inbox__ContentTooLarge(_content)); + require( + uint256(_secretHash) <= Constants.MAX_FIELD_VALUE, + Errors.Inbox__SecretHashTooLarge(_secretHash) + ); FrontierLib.Tree storage currentTree = trees[inProgress]; @@ -89,6 +90,7 @@ contract Inbox is IInbox { bytes32 leaf = message.sha256ToField(); uint256 index = currentTree.insertLeaf(leaf); + totalMessagesInserted++; emit MessageSent(inProgress, index, leaf); return leaf; @@ -106,13 +108,8 @@ contract Inbox is IInbox { * @return The root of the consumed tree */ function consume(uint256 _toConsume) external override(IInbox) returns (bytes32) { - if (msg.sender != ROLLUP) { - revert Errors.Inbox__Unauthorized(); - } - - if (_toConsume >= inProgress) { - revert Errors.Inbox__MustBuildBeforeConsume(); - } + require(msg.sender == ROLLUP, Errors.Inbox__Unauthorized()); + require(_toConsume < inProgress, Errors.Inbox__MustBuildBeforeConsume()); bytes32 root = EMPTY_ROOT; if (_toConsume > Constants.INITIAL_L2_BLOCK_NUM) { diff --git a/l1-contracts/src/core/messagebridge/Outbox.sol b/l1-contracts/src/core/messagebridge/Outbox.sol index eeb56348450..513f615c437 100644 --- a/l1-contracts/src/core/messagebridge/Outbox.sol +++ b/l1-contracts/src/core/messagebridge/Outbox.sol @@ -1,15 +1,15 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -// Libraries -import {DataStructures} from "../libraries/DataStructures.sol"; -import {Errors} from "../libraries/Errors.sol"; -import {MerkleLib} from "../libraries/MerkleLib.sol"; -import {Hash} from "../libraries/Hash.sol"; -import {IOutbox} from "../interfaces/messagebridge/IOutbox.sol"; +import {IOutbox} from "@aztec/core//interfaces/messagebridge/IOutbox.sol"; -import {Rollup} from "../Rollup.sol"; +import {DataStructures} from "@aztec/core/libraries/DataStructures.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; +import {MerkleLib} from "@aztec/core/libraries/crypto/MerkleLib.sol"; +import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; + +import {Rollup} from "@aztec/core/Rollup.sol"; /** * @title Outbox @@ -48,13 +48,8 @@ contract Outbox is IOutbox { external override(IOutbox) { - if (msg.sender != address(ROLLUP)) { - revert Errors.Outbox__Unauthorized(); - } - - if (_root == bytes32(0)) { - revert Errors.Outbox__InsertingInvalidRoot(); - } + require(msg.sender == address(ROLLUP), Errors.Outbox__Unauthorized()); + require(_root != bytes32(0), Errors.Outbox__InsertingInvalidRoot()); roots[_l2BlockNumber].root = _root; roots[_l2BlockNumber].minHeight = _minHeight; @@ -81,38 +76,33 @@ contract Outbox is IOutbox { uint256 _leafIndex, bytes32[] calldata _path ) external override(IOutbox) { - if (_l2BlockNumber > ROLLUP.getProvenBlockNumber()) { - revert Errors.Outbox__BlockNotProven(_l2BlockNumber); - } + require( + _l2BlockNumber <= ROLLUP.getProvenBlockNumber(), Errors.Outbox__BlockNotProven(_l2BlockNumber) + ); - if (msg.sender != _message.recipient.actor) { - revert Errors.Outbox__InvalidRecipient(_message.recipient.actor, msg.sender); - } + require( + msg.sender == _message.recipient.actor, + Errors.Outbox__InvalidRecipient(_message.recipient.actor, msg.sender) + ); - if (block.chainid != _message.recipient.chainId) { - revert Errors.Outbox__InvalidChainId(); - } + require(block.chainid == _message.recipient.chainId, Errors.Outbox__InvalidChainId()); RootData storage rootData = roots[_l2BlockNumber]; bytes32 blockRoot = rootData.root; - if (blockRoot == 0) { - revert Errors.Outbox__NothingToConsumeAtBlock(_l2BlockNumber); - } + require(blockRoot != bytes32(0), Errors.Outbox__NothingToConsumeAtBlock(_l2BlockNumber)); - if (rootData.nullified[_leafIndex]) { - revert Errors.Outbox__AlreadyNullified(_l2BlockNumber, _leafIndex); - } + require( + !rootData.nullified[_leafIndex], Errors.Outbox__AlreadyNullified(_l2BlockNumber, _leafIndex) + ); // TODO(#7218): We will eventually move back to a balanced tree and constrain the path length // to be equal to height - for now we just check the min // Min height = height of rollup layers // The smallest num of messages will require a subtree of height 1 uint256 minHeight = rootData.minHeight; - if (minHeight > _path.length) { - revert Errors.Outbox__InvalidPathLength(minHeight, _path.length); - } + require(minHeight <= _path.length, Errors.Outbox__InvalidPathLength(minHeight, _path.length)); bytes32 messageHash = _message.sha256ToField(); diff --git a/l1-contracts/src/core/messagebridge/Registry.sol b/l1-contracts/src/governance/Registry.sol similarity index 83% rename from l1-contracts/src/core/messagebridge/Registry.sol rename to l1-contracts/src/governance/Registry.sol index 013f63df759..bab4b52ee80 100644 --- a/l1-contracts/src/core/messagebridge/Registry.sol +++ b/l1-contracts/src/governance/Registry.sol @@ -1,16 +1,13 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -import {Ownable} from "@oz/access/Ownable.sol"; +import {IRegistry} from "@aztec/governance/interfaces/IRegistry.sol"; -// Interfaces -import {IRegistry} from "../interfaces/messagebridge/IRegistry.sol"; -import {IRollup} from "../interfaces/IRollup.sol"; +import {DataStructures} from "@aztec/governance/libraries/DataStructures.sol"; +import {Errors} from "@aztec/governance/libraries/Errors.sol"; -// Libraries -import {DataStructures} from "../libraries/DataStructures.sol"; -import {Errors} from "../libraries/Errors.sol"; +import {Ownable} from "@oz/access/Ownable.sol"; /** * @title Registry @@ -31,11 +28,11 @@ contract Registry is IRegistry, Ownable { } /** - * @notice Returns the rollup contract - * @return The rollup contract (of type IRollup) + * @notice Returns the address of the rollup contract + * @return The rollup address */ - function getRollup() external view override(IRegistry) returns (IRollup) { - return IRollup(currentSnapshot.rollup); + function getRollup() external view override(IRegistry) returns (address) { + return currentSnapshot.rollup; } /** @@ -45,7 +42,7 @@ contract Registry is IRegistry, Ownable { */ function getVersionFor(address _rollup) external view override(IRegistry) returns (uint256) { (uint256 version, bool exists) = _getVersionFor(_rollup); - if (!exists) revert Errors.Registry__RollupNotRegistered(_rollup); + require(exists, Errors.Registry__RollupNotRegistered(_rollup)); return version; } @@ -102,7 +99,7 @@ contract Registry is IRegistry, Ownable { function _upgrade(address _rollup) internal returns (uint256) { (, bool exists) = _getVersionFor(_rollup); - if (exists) revert Errors.Registry__RollupAlreadyRegistered(_rollup); + require(!exists, Errors.Registry__RollupAlreadyRegistered(_rollup)); DataStructures.RegistrySnapshot memory newSnapshot = DataStructures.RegistrySnapshot(_rollup, block.number); @@ -111,11 +108,13 @@ contract Registry is IRegistry, Ownable { snapshots[version] = newSnapshot; rollupToVersion[_rollup] = version; + emit InstanceAdded(_rollup, version); + return version; } function _getVersionFor(address _rollup) internal view returns (uint256 version, bool exists) { version = rollupToVersion[_rollup]; - return (version, version > 0); + return (version, version > 0 || snapshots[0].rollup == _rollup); } } diff --git a/l1-contracts/src/core/interfaces/messagebridge/IRegistry.sol b/l1-contracts/src/governance/interfaces/IRegistry.sol similarity index 81% rename from l1-contracts/src/core/interfaces/messagebridge/IRegistry.sol rename to l1-contracts/src/governance/interfaces/IRegistry.sol index 707dd1ed704..6c9fd5d1a45 100644 --- a/l1-contracts/src/core/interfaces/messagebridge/IRegistry.sol +++ b/l1-contracts/src/governance/interfaces/IRegistry.sol @@ -1,16 +1,17 @@ // SPDX-License-Identifier: Apache-2.0 -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -import {DataStructures} from "../../libraries/DataStructures.sol"; -import {IRollup} from "../IRollup.sol"; +import {DataStructures} from "@aztec/governance/libraries/DataStructures.sol"; interface IRegistry { + event InstanceAdded(address indexed instance, uint256 indexed version); + // docs:start:registry_upgrade function upgrade(address _rollup) external returns (uint256); // docs:end:registry_upgrade // docs:start:registry_get_rollup - function getRollup() external view returns (IRollup); + function getRollup() external view returns (address); // docs:end:registry_get_rollup // docs:start:registry_get_version_for diff --git a/l1-contracts/src/governance/libraries/DataStructures.sol b/l1-contracts/src/governance/libraries/DataStructures.sol new file mode 100644 index 00000000000..6f0ebd13d48 --- /dev/null +++ b/l1-contracts/src/governance/libraries/DataStructures.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2023 Aztec Labs. +pragma solidity >=0.8.27; + +/** + * @title Data Structures Library + * @author Aztec Labs + * @notice Library that contains data structures used throughout Aztec governance + */ +library DataStructures { + // docs:start:registry_snapshot + /** + * @notice Struct for storing address of cross communication components and the block number when it was updated + * @param rollup - The address of the rollup contract + * @param blockNumber - The block number of the snapshot + */ + struct RegistrySnapshot { + address rollup; + uint256 blockNumber; + } + // docs:end:registry_snapshot +} diff --git a/l1-contracts/src/governance/libraries/Errors.sol b/l1-contracts/src/governance/libraries/Errors.sol new file mode 100644 index 00000000000..96a6736ec23 --- /dev/null +++ b/l1-contracts/src/governance/libraries/Errors.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2023 Aztec Labs. +pragma solidity >=0.8.27; + +/** + * @title Errors Library + * @author Aztec Labs + * @notice Library that contains errors used throughout the Aztec governance + * Errors are prefixed with the contract name to make it easy to identify where the error originated + * when there are multiple contracts that could have thrown the error. + */ +library Errors { + // Registry + error Registry__RollupNotRegistered(address rollup); // 0xa1fee4cf + error Registry__RollupAlreadyRegistered(address rollup); // 0x3c34eabf +} diff --git a/l1-contracts/src/mock/MockProofCommitmentEscrow.sol b/l1-contracts/src/mock/MockProofCommitmentEscrow.sol index 89e61d3c241..4568f3392eb 100644 --- a/l1-contracts/src/mock/MockProofCommitmentEscrow.sol +++ b/l1-contracts/src/mock/MockProofCommitmentEscrow.sol @@ -1,24 +1,32 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -import {SignatureLib} from "../core/libraries/SignatureLib.sol"; -import {IProofCommitmentEscrow} from "../core/interfaces/IProofCommitmentEscrow.sol"; +import {IProofCommitmentEscrow} from "@aztec/core/interfaces/IProofCommitmentEscrow.sol"; +import {Timestamp} from "@aztec/core/libraries/TimeMath.sol"; contract MockProofCommitmentEscrow is IProofCommitmentEscrow { function deposit(uint256 _amount) external override { // do nothing } - function withdraw(uint256 _amount) external override { + function startWithdraw(uint256 _amount) external override { // do nothing } - function unstakeBond(uint256 _amount, address _prover) external override { + function executeWithdraw() external override { // do nothing } - function stakeBond(uint256 _amount, address _prover) external override { + function unstakeBond(address _prover, uint256 _amount) external override { // do nothing } + + function stakeBond(address _prover, uint256 _amount) external override { + // do nothing + } + + function minBalanceAtTime(Timestamp, address) external pure override returns (uint256) { + return 0; + } } diff --git a/l1-contracts/src/mock/MockVerifier.sol b/l1-contracts/src/mock/MockVerifier.sol index 3ee7139413a..6b1ec10746a 100644 --- a/l1-contracts/src/mock/MockVerifier.sol +++ b/l1-contracts/src/mock/MockVerifier.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; // Interfaces -import {IVerifier} from "../core/interfaces/IVerifier.sol"; +import {IVerifier} from "@aztec/core/interfaces/IVerifier.sol"; /** * @title Mock verifier diff --git a/l1-contracts/test/Inbox.t.sol b/l1-contracts/test/Inbox.t.sol index a879cadf67e..fd5e7295fb8 100644 --- a/l1-contracts/test/Inbox.t.sol +++ b/l1-contracts/test/Inbox.t.sol @@ -1,15 +1,15 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import {Test} from "forge-std/Test.sol"; -import {IInbox} from "../src/core/interfaces/messagebridge/IInbox.sol"; +import {IInbox} from "@aztec/core/interfaces/messagebridge/IInbox.sol"; import {InboxHarness} from "./harnesses/InboxHarness.sol"; -import {Constants} from "../src/core/libraries/ConstantsGen.sol"; -import {Errors} from "../src/core/libraries/Errors.sol"; -import {Hash} from "../src/core/libraries/Hash.sol"; -import {DataStructures} from "../src/core/libraries/DataStructures.sol"; +import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; +import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; +import {DataStructures} from "@aztec/core/libraries/DataStructures.sol"; contract InboxTest is Test { using Hash for DataStructures.L1ToL2Msg; diff --git a/l1-contracts/test/Outbox.t.sol b/l1-contracts/test/Outbox.t.sol index f25bfd2e1b9..007e8ec01e8 100644 --- a/l1-contracts/test/Outbox.t.sol +++ b/l1-contracts/test/Outbox.t.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import {Test} from "forge-std/Test.sol"; -import {Outbox} from "../src/core/messagebridge/Outbox.sol"; -import {IOutbox} from "../src/core/interfaces/messagebridge/IOutbox.sol"; -import {Errors} from "../src/core/libraries/Errors.sol"; -import {DataStructures} from "../src/core/libraries/DataStructures.sol"; -import {Hash} from "../src/core/libraries/Hash.sol"; +import {Outbox} from "@aztec/core/messagebridge/Outbox.sol"; +import {IOutbox} from "@aztec/core/interfaces/messagebridge/IOutbox.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; +import {DataStructures} from "@aztec/core/libraries/DataStructures.sol"; +import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; import {NaiveMerkle} from "./merkle/Naive.sol"; import {MerkleTestUtil} from "./merkle/TestUtil.sol"; diff --git a/l1-contracts/test/Parity.t.sol b/l1-contracts/test/Parity.t.sol index 38221c75e66..6ffe4221967 100644 --- a/l1-contracts/test/Parity.t.sol +++ b/l1-contracts/test/Parity.t.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import {Test} from "forge-std/Test.sol"; -import {FrontierMerkle} from "./../src/core/messagebridge/frontier_tree/Frontier.sol"; -import {Constants} from "../src/core/libraries/ConstantsGen.sol"; +import {FrontierMerkle} from "./harnesses/Frontier.sol"; +import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; contract ParityTest is Test { function setUp() public {} diff --git a/l1-contracts/test/Registry.t.sol b/l1-contracts/test/Registry.t.sol deleted file mode 100644 index 9935e77040b..00000000000 --- a/l1-contracts/test/Registry.t.sol +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; - -import {Test} from "forge-std/Test.sol"; -import {Ownable} from "@oz/access/Ownable.sol"; -import {Registry} from "../src/core/messagebridge/Registry.sol"; -import {Errors} from "../src/core/libraries/Errors.sol"; - -import {DataStructures} from "../src/core/libraries/DataStructures.sol"; - -contract RegistryTest is Test { - address internal constant DEAD = address(0xdead); - - Registry internal registry; - - function setUp() public { - registry = new Registry(address(this)); - } - - function testConstructorSetup() public { - assertEq(registry.numberOfVersions(), 1, "should have 1 version"); - DataStructures.RegistrySnapshot memory snapshot = registry.getCurrentSnapshot(); - assertEq(snapshot.rollup, DEAD, "should have dead rollup"); - assertEq(address(registry.getRollup()), DEAD); - - vm.expectRevert(abi.encodeWithSelector(Errors.Registry__RollupNotRegistered.selector, DEAD)); - registry.getVersionFor(DEAD); - } - - function testUpgrade() public { - address newRollup = address(0xbeef1); - uint256 newVersion = registry.upgrade(newRollup); - - assertEq(registry.numberOfVersions(), 2, "should have 2 versions"); - DataStructures.RegistrySnapshot memory snapshot = registry.getCurrentSnapshot(); - assertEq(snapshot.rollup, newRollup, "should have newRollup"); - - assertEq(address(registry.getRollup()), newRollup); - assertEq( - registry.getVersionFor(newRollup), newVersion, "should have version newVersion for newRollup" - ); - } - - function testRevertUpgradeToSame() public { - registry.upgrade(DEAD); - vm.expectRevert(abi.encodeWithSelector(Errors.Registry__RollupAlreadyRegistered.selector, DEAD)); - registry.upgrade(DEAD); - } - - function testRevertGetVersionForNonExistent() public { - address rollup = address(0xbeef1); - vm.expectRevert(abi.encodeWithSelector(Errors.Registry__RollupNotRegistered.selector, rollup)); - registry.getVersionFor(rollup); - } - - function testRevertUpgradeAsNonOwner(address _owner) public { - vm.assume(_owner != registry.owner()); - vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, _owner)); - vm.prank(_owner); - registry.upgrade(DEAD); - } -} diff --git a/l1-contracts/test/Rollup.t.sol b/l1-contracts/test/Rollup.t.sol index 27e20595c59..cc481648bfa 100644 --- a/l1-contracts/test/Rollup.t.sol +++ b/l1-contracts/test/Rollup.t.sol @@ -1,29 +1,31 @@ // SPDX-License-Identifier: Apache-2.0 -// Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +// Copyright 2024 Aztec Labs. +pragma solidity >=0.8.27; import {DecoderBase} from "./decoders/Base.sol"; -import {DataStructures} from "../src/core/libraries/DataStructures.sol"; -import {Constants} from "../src/core/libraries/ConstantsGen.sol"; -import {SignatureLib} from "../src/core/libraries/SignatureLib.sol"; - -import {Registry} from "../src/core/messagebridge/Registry.sol"; -import {Inbox} from "../src/core/messagebridge/Inbox.sol"; -import {Outbox} from "../src/core/messagebridge/Outbox.sol"; -import {Errors} from "../src/core/libraries/Errors.sol"; -import {Rollup} from "../src/core/Rollup.sol"; -import {IFeeJuicePortal} from "../src/core/interfaces/IFeeJuicePortal.sol"; -import {IRollup} from "../src/core/interfaces/IRollup.sol"; -import {FeeJuicePortal} from "../src/core/FeeJuicePortal.sol"; -import {Leonidas} from "../src/core/sequencer_selection/Leonidas.sol"; +import {DataStructures} from "@aztec/core/libraries/DataStructures.sol"; +import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; +import {SignatureLib} from "@aztec/core/libraries/crypto/SignatureLib.sol"; +import {EpochProofQuoteLib} from "@aztec/core/libraries/EpochProofQuoteLib.sol"; + +import {Registry} from "@aztec/governance/Registry.sol"; +import {Inbox} from "@aztec/core/messagebridge/Inbox.sol"; +import {Outbox} from "@aztec/core/messagebridge/Outbox.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; +import {Rollup} from "@aztec/core/Rollup.sol"; +import {IRollup} from "@aztec/core/interfaces/IRollup.sol"; +import {FeeJuicePortal} from "@aztec/core/FeeJuicePortal.sol"; +import {Leonidas} from "@aztec/core/Leonidas.sol"; import {NaiveMerkle} from "./merkle/Naive.sol"; import {MerkleTestUtil} from "./merkle/TestUtil.sol"; -import {PortalERC20} from "./portals/PortalERC20.sol"; +import {TestERC20} from "./TestERC20.sol"; import {TxsDecoderHelper} from "./decoders/helpers/TxsDecoderHelper.sol"; import {IERC20Errors} from "@oz/interfaces/draft-IERC6093.sol"; +import {Timestamp, Slot, Epoch, SlotLib, EpochLib} from "@aztec/core/libraries/TimeMath.sol"; + // solhint-disable comprehensive-interface /** @@ -31,17 +33,23 @@ import {IERC20Errors} from "@oz/interfaces/draft-IERC6093.sol"; * Main use of these test is shorter cycles when updating the decoder contract. */ contract RollupTest is DecoderBase { + using SlotLib for Slot; + using EpochLib for Epoch; + Registry internal registry; Inbox internal inbox; Outbox internal outbox; Rollup internal rollup; MerkleTestUtil internal merkleTestUtil; TxsDecoderHelper internal txsHelper; - PortalERC20 internal portalERC20; + TestERC20 internal testERC20; FeeJuicePortal internal feeJuicePortal; SignatureLib.Signature[] internal signatures; + EpochProofQuoteLib.EpochProofQuote internal quote; + EpochProofQuoteLib.SignedEpochProofQuote internal signedQuote; + /** * @notice Set up the contracts needed for the tests with time aligned to the provided block name */ @@ -56,19 +64,13 @@ contract RollupTest is DecoderBase { } registry = new Registry(address(this)); - portalERC20 = new PortalERC20(); + testERC20 = new TestERC20(); feeJuicePortal = new FeeJuicePortal(address(this)); - portalERC20.mint(address(feeJuicePortal), Constants.FEE_JUICE_INITIAL_MINT); + testERC20.mint(address(feeJuicePortal), Constants.FEE_JUICE_INITIAL_MINT); feeJuicePortal.initialize( - address(registry), address(portalERC20), bytes32(Constants.FEE_JUICE_ADDRESS) - ); - rollup = new Rollup( - registry, - IFeeJuicePortal(address(feeJuicePortal)), - bytes32(0), - address(this), - new address[](0) + address(registry), address(testERC20), bytes32(Constants.FEE_JUICE_ADDRESS) ); + rollup = new Rollup(feeJuicePortal, bytes32(0), address(this), new address[](0)); inbox = Inbox(address(rollup.INBOX())); outbox = Outbox(address(rollup.OUTBOX())); @@ -76,28 +78,30 @@ contract RollupTest is DecoderBase { merkleTestUtil = new MerkleTestUtil(); txsHelper = new TxsDecoderHelper(); + + uint256 privateKey = 0x123456789abcdef123456789abcdef123456789abcdef123456789abcdef1234; + address signer = vm.addr(privateKey); + quote = EpochProofQuoteLib.EpochProofQuote({ + epochToProve: Epoch.wrap(0), + validUntilSlot: Slot.wrap(1), + bondAmount: rollup.PROOF_COMMITMENT_MIN_BOND_AMOUNT_IN_TST(), + prover: signer, + basisPointFee: 0 + }); + signedQuote = _quoteToSignedQuote(quote); _; } function warpToL2Slot(uint256 _slot) public { - vm.warp(rollup.getTimestampForSlot(_slot)); + vm.warp(Timestamp.unwrap(rollup.getTimestampForSlot(Slot.wrap(_slot)))); } function testClaimWithNothingToProve() public setUpFor("mixed_block_1") { assertEq(rollup.getCurrentSlot(), 0, "genesis slot should be zero"); - DataStructures.EpochProofQuote memory quote = DataStructures.EpochProofQuote({ - signature: SignatureLib.Signature({isEmpty: false, v: 27, r: bytes32(0), s: bytes32(0)}), - epochToProve: 0, - validUntilSlot: 1, - bondAmount: rollup.PROOF_COMMITMENT_MIN_BOND_AMOUNT_IN_TST(), - prover: address(this), - basisPointFee: 0 - }); - // sanity check that proven/pending tip are at genesis vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__NoEpochToProve.selector)); - rollup.claimEpochProofRight(quote); + rollup.claimEpochProofRight(signedQuote); warpToL2Slot(1); assertEq(rollup.getCurrentSlot(), 1, "warp to slot 1 failed"); @@ -105,127 +109,88 @@ contract RollupTest is DecoderBase { // empty slots do not move pending chain vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__NoEpochToProve.selector)); - rollup.claimEpochProofRight(quote); + rollup.claimEpochProofRight(signedQuote); } function testClaimWithWrongEpoch() public setUpFor("mixed_block_1") { - _testBlock("mixed_block_1", false, 0); - - DataStructures.EpochProofQuote memory quote = DataStructures.EpochProofQuote({ - signature: SignatureLib.Signature({isEmpty: false, v: 27, r: bytes32(0), s: bytes32(0)}), - epochToProve: 1, - validUntilSlot: 1, - bondAmount: rollup.PROOF_COMMITMENT_MIN_BOND_AMOUNT_IN_TST(), - prover: address(this), - basisPointFee: 0 - }); + _testBlock("mixed_block_1", false, 1); + quote.epochToProve = Epoch.wrap(1); + signedQuote = _quoteToSignedQuote(quote); vm.expectRevert( - abi.encodeWithSelector(Errors.Rollup__NotClaimingCorrectEpoch.selector, 0, quote.epochToProve) + abi.encodeWithSelector( + Errors.Rollup__NotClaimingCorrectEpoch.selector, 0, signedQuote.quote.epochToProve + ) ); - rollup.claimEpochProofRight(quote); + rollup.claimEpochProofRight(signedQuote); } function testClaimWithInsufficientBond() public setUpFor("mixed_block_1") { - _testBlock("mixed_block_1", false, 0); - - DataStructures.EpochProofQuote memory quote = DataStructures.EpochProofQuote({ - signature: SignatureLib.Signature({isEmpty: false, v: 27, r: bytes32(0), s: bytes32(0)}), - epochToProve: 0, - validUntilSlot: 1, - bondAmount: 0, - prover: address(this), - basisPointFee: 0 - }); + _testBlock("mixed_block_1", false, 1); + + quote.bondAmount = 0; + signedQuote = _quoteToSignedQuote(quote); vm.expectRevert( abi.encodeWithSelector( Errors.Rollup__InsufficientBondAmount.selector, rollup.PROOF_COMMITMENT_MIN_BOND_AMOUNT_IN_TST(), - quote.bondAmount + signedQuote.quote.bondAmount ) ); - rollup.claimEpochProofRight(quote); + rollup.claimEpochProofRight(signedQuote); } function testClaimPastValidUntil() public setUpFor("mixed_block_1") { - _testBlock("mixed_block_1", false, 0); + _testBlock("mixed_block_1", false, 1); - DataStructures.EpochProofQuote memory quote = DataStructures.EpochProofQuote({ - signature: SignatureLib.Signature({isEmpty: false, v: 27, r: bytes32(0), s: bytes32(0)}), - epochToProve: 0, - validUntilSlot: 0, - bondAmount: rollup.PROOF_COMMITMENT_MIN_BOND_AMOUNT_IN_TST(), - prover: address(this), - basisPointFee: 0 - }); - - warpToL2Slot(1); + quote.validUntilSlot = Slot.wrap(0); + signedQuote = _quoteToSignedQuote(quote); vm.expectRevert( - abi.encodeWithSelector(Errors.Rollup__QuoteExpired.selector, 1, quote.validUntilSlot) + abi.encodeWithSelector( + Errors.Rollup__QuoteExpired.selector, 1, signedQuote.quote.validUntilSlot + ) ); - rollup.claimEpochProofRight(quote); + rollup.claimEpochProofRight(signedQuote); } function testClaimSimple() public setUpFor("mixed_block_1") { - _testBlock("mixed_block_1", false, 0); - - DataStructures.EpochProofQuote memory quote = DataStructures.EpochProofQuote({ - signature: SignatureLib.Signature({isEmpty: false, v: 27, r: bytes32(0), s: bytes32(0)}), - epochToProve: 0, - validUntilSlot: 1, - bondAmount: rollup.PROOF_COMMITMENT_MIN_BOND_AMOUNT_IN_TST(), - prover: address(0), - basisPointFee: 0 - }); - - warpToL2Slot(1); + _testBlock("mixed_block_1", false, 1); vm.expectEmit(true, true, true, true); emit IRollup.ProofRightClaimed( - quote.epochToProve, address(0), address(this), quote.bondAmount, 1 + quote.epochToProve, quote.prover, address(this), quote.bondAmount, Slot.wrap(1) ); - rollup.claimEpochProofRight(quote); + rollup.claimEpochProofRight(signedQuote); ( - uint256 epochToProve, + Epoch epochToProve, uint256 basisPointFee, uint256 bondAmount, address bondProvider, address proposerClaimant ) = rollup.proofClaim(); - assertEq(epochToProve, quote.epochToProve, "Invalid epoch to prove"); - assertEq(basisPointFee, quote.basisPointFee, "Invalid basis point fee"); - assertEq(bondAmount, quote.bondAmount, "Invalid bond amount"); + assertEq(epochToProve, signedQuote.quote.epochToProve, "Invalid epoch to prove"); + assertEq(basisPointFee, signedQuote.quote.basisPointFee, "Invalid basis point fee"); + assertEq(bondAmount, signedQuote.quote.bondAmount, "Invalid bond amount"); // TODO #8573 // This will be fixed with proper escrow - assertEq(bondProvider, address(0), "Invalid bond provider"); + assertEq(bondProvider, quote.prover, "Invalid bond provider"); assertEq(proposerClaimant, address(this), "Invalid proposer claimant"); } function testClaimTwice() public setUpFor("mixed_block_1") { - _testBlock("mixed_block_1", false, 0); - - DataStructures.EpochProofQuote memory quote = DataStructures.EpochProofQuote({ - signature: SignatureLib.Signature({isEmpty: false, v: 27, r: bytes32(0), s: bytes32(0)}), - epochToProve: 0, - validUntilSlot: 1, - bondAmount: rollup.PROOF_COMMITMENT_MIN_BOND_AMOUNT_IN_TST(), - prover: address(this), - basisPointFee: 0 - }); + _testBlock("mixed_block_1", false, 1); - warpToL2Slot(1); - - rollup.claimEpochProofRight(quote); + rollup.claimEpochProofRight(signedQuote); vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__ProofRightAlreadyClaimed.selector)); - rollup.claimEpochProofRight(quote); + rollup.claimEpochProofRight(signedQuote); warpToL2Slot(2); vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__ProofRightAlreadyClaimed.selector)); - rollup.claimEpochProofRight(quote); + rollup.claimEpochProofRight(signedQuote); // warp to epoch 1 warpToL2Slot(Constants.AZTEC_EPOCH_DURATION); @@ -233,7 +198,7 @@ contract RollupTest is DecoderBase { // We should still be trying to prove epoch 0 in epoch 1 vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__ProofRightAlreadyClaimed.selector)); - rollup.claimEpochProofRight(quote); + rollup.claimEpochProofRight(signedQuote); // still nothing to prune vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__NothingToPrune.selector)); @@ -241,16 +206,7 @@ contract RollupTest is DecoderBase { } function testClaimOutsideClaimPhase() public setUpFor("mixed_block_1") { - _testBlock("mixed_block_1", false, 0); - - DataStructures.EpochProofQuote memory quote = DataStructures.EpochProofQuote({ - signature: SignatureLib.Signature({isEmpty: false, v: 27, r: bytes32(0), s: bytes32(0)}), - epochToProve: 0, - validUntilSlot: 1, - bondAmount: rollup.PROOF_COMMITMENT_MIN_BOND_AMOUNT_IN_TST(), - prover: address(this), - basisPointFee: 0 - }); + _testBlock("mixed_block_1", false, 1); warpToL2Slot(Constants.AZTEC_EPOCH_DURATION + rollup.CLAIM_DURATION_IN_L2_SLOTS()); @@ -261,24 +217,18 @@ contract RollupTest is DecoderBase { rollup.CLAIM_DURATION_IN_L2_SLOTS() ) ); - rollup.claimEpochProofRight(quote); + rollup.claimEpochProofRight(signedQuote); } function testNoPruneWhenClaimExists() public setUpFor("mixed_block_1") { - _testBlock("mixed_block_1", false, 0); + _testBlock("mixed_block_1", false, 1); - DataStructures.EpochProofQuote memory quote = DataStructures.EpochProofQuote({ - signature: SignatureLib.Signature({isEmpty: false, v: 27, r: bytes32(0), s: bytes32(0)}), - epochToProve: 0, - validUntilSlot: 2 * Constants.AZTEC_EPOCH_DURATION, - bondAmount: rollup.PROOF_COMMITMENT_MIN_BOND_AMOUNT_IN_TST(), - prover: address(this), - basisPointFee: 0 - }); + quote.validUntilSlot = Epoch.wrap(2).toSlots(); + signedQuote = _quoteToSignedQuote(quote); warpToL2Slot(Constants.AZTEC_EPOCH_DURATION + rollup.CLAIM_DURATION_IN_L2_SLOTS() - 1); - rollup.claimEpochProofRight(quote); + rollup.claimEpochProofRight(signedQuote); warpToL2Slot(Constants.AZTEC_EPOCH_DURATION + rollup.CLAIM_DURATION_IN_L2_SLOTS()); @@ -287,68 +237,55 @@ contract RollupTest is DecoderBase { } function testPruneWhenClaimExpires() public setUpFor("mixed_block_1") { - _testBlock("mixed_block_1", false, 0); + _testBlock("mixed_block_1", false, 1); - DataStructures.EpochProofQuote memory quote = DataStructures.EpochProofQuote({ - signature: SignatureLib.Signature({isEmpty: false, v: 27, r: bytes32(0), s: bytes32(0)}), - epochToProve: 0, - validUntilSlot: 2 * Constants.AZTEC_EPOCH_DURATION, - bondAmount: rollup.PROOF_COMMITMENT_MIN_BOND_AMOUNT_IN_TST(), - prover: address(this), - basisPointFee: 0 - }); + quote.validUntilSlot = Epoch.wrap(2).toSlots(); + signedQuote = _quoteToSignedQuote(quote); warpToL2Slot(Constants.AZTEC_EPOCH_DURATION + rollup.CLAIM_DURATION_IN_L2_SLOTS() - 1); - rollup.claimEpochProofRight(quote); + rollup.claimEpochProofRight(signedQuote); warpToL2Slot(Constants.AZTEC_EPOCH_DURATION * 2); // We should still be trying to prove epoch 0 in epoch 2 vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__ProofRightAlreadyClaimed.selector)); - rollup.claimEpochProofRight(quote); + rollup.claimEpochProofRight(signedQuote); rollup.prune(); vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__NoEpochToProve.selector)); - rollup.claimEpochProofRight(quote); + rollup.claimEpochProofRight(signedQuote); } function testClaimAfterPrune() public setUpFor("mixed_block_1") { - _testBlock("mixed_block_1", false, 0); + _testBlock("mixed_block_1", false, 1); - DataStructures.EpochProofQuote memory quote = DataStructures.EpochProofQuote({ - signature: SignatureLib.Signature({isEmpty: false, v: 27, r: bytes32(0), s: bytes32(0)}), - epochToProve: 0, - validUntilSlot: 2 * Constants.AZTEC_EPOCH_DURATION, - bondAmount: rollup.PROOF_COMMITMENT_MIN_BOND_AMOUNT_IN_TST(), - prover: address(this), - basisPointFee: 0 - }); + quote.validUntilSlot = Epoch.wrap(3).toSlots(); + signedQuote = _quoteToSignedQuote(quote); warpToL2Slot(Constants.AZTEC_EPOCH_DURATION + rollup.CLAIM_DURATION_IN_L2_SLOTS() - 1); - rollup.claimEpochProofRight(quote); + rollup.claimEpochProofRight(signedQuote); - warpToL2Slot(Constants.AZTEC_EPOCH_DURATION * 2); + warpToL2Slot(Constants.AZTEC_EPOCH_DURATION * 3); rollup.prune(); - _testBlock("mixed_block_1", false, Constants.AZTEC_EPOCH_DURATION * 2); + _testBlock("mixed_block_1", false, Epoch.wrap(3).toSlots().unwrap()); + + quote.epochToProve = Epoch.wrap(3); + signedQuote = _quoteToSignedQuote(quote); vm.expectEmit(true, true, true, true); emit IRollup.ProofRightClaimed( - quote.epochToProve, - address(this), - address(this), - quote.bondAmount, - Constants.AZTEC_EPOCH_DURATION * 2 + quote.epochToProve, quote.prover, address(this), quote.bondAmount, Epoch.wrap(3).toSlots() ); - rollup.claimEpochProofRight(quote); + rollup.claimEpochProofRight(signedQuote); } function testPruneWhenNoProofClaim() public setUpFor("mixed_block_1") { - _testBlock("mixed_block_1", false); + _testBlock("mixed_block_1", false, 1); warpToL2Slot(Constants.AZTEC_EPOCH_DURATION + rollup.CLAIM_DURATION_IN_L2_SLOTS() - 1); vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__NothingToPrune.selector)); rollup.prune(); @@ -361,25 +298,30 @@ contract RollupTest is DecoderBase { DecoderBase.Data memory data = load("mixed_block_1").block; bytes memory header = data.header; bytes32 archive = data.archive; + bytes32 blockHash = data.blockHash; + bytes32 proverId = bytes32(uint256(42)); bytes memory body = data.body; bytes32[] memory txHashes = new bytes32[](0); // We jump to the time of the block. (unless it is in the past) vm.warp(max(block.timestamp, data.decodedHeader.globalVariables.timestamp)); - rollup.propose(header, archive, bytes32(0), txHashes, signatures, body); + rollup.propose(header, archive, blockHash, txHashes, signatures, body); - rollup.submitBlockRootProof(header, archive, bytes32(0), "", ""); + (bytes32 preArchive, bytes32 preBlockHash,) = rollup.blocks(0); + _submitEpochProof(rollup, 1, preArchive, archive, preBlockHash, blockHash, proverId); - vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__NonSequentialProving.selector)); - rollup.submitBlockRootProof(header, archive, bytes32(0), "", ""); + vm.expectRevert( + abi.encodeWithSelector(Errors.Rollup__InvalidPreviousArchive.selector, archive, preArchive) + ); + _submitEpochProof(rollup, 1, preArchive, archive, preBlockHash, blockHash, proverId); } function testTimestamp() public setUpFor("mixed_block_1") { // Ensure that the timestamp of the current slot is never in the future. for (uint256 i = 0; i < 100; i++) { - uint256 slot = rollup.getCurrentSlot(); - uint256 ts = rollup.getTimestampForSlot(slot); + Slot slot = rollup.getCurrentSlot(); + Timestamp ts = rollup.getTimestampForSlot(slot); assertLe(ts, block.timestamp, "Invalid timestamp"); @@ -407,11 +349,11 @@ contract RollupTest is DecoderBase { // Even if we end up reverting block 1, we should still see the same root in the inbox. bytes32 inboxRoot2 = inbox.getRoot(2); - (,, uint128 slot) = rollup.blocks(1); - uint256 prunableAt = uint256(slot) + Constants.AZTEC_EPOCH_DURATION * 2; + (,, Slot slot) = rollup.blocks(1); + Slot prunableAt = slot + Epoch.wrap(2).toSlots(); - uint256 timeOfPrune = rollup.getTimestampForSlot(prunableAt); - vm.warp(timeOfPrune); + Timestamp timeOfPrune = rollup.getTimestampForSlot(prunableAt); + vm.warp(Timestamp.unwrap(timeOfPrune)); assertEq(rollup.getPendingBlockNumber(), 1, "Invalid pending block number"); assertEq(rollup.getProvenBlockNumber(), 0, "Invalid proven block number"); @@ -437,7 +379,8 @@ contract RollupTest is DecoderBase { // and timestamp as if it was created at a different point in time. This allow us to insert it // as if it was the first block, even after we had originally inserted the mixed block. // An example where this could happen would be if no-one could prove the mixed block. - _testBlock("empty_block_1", false, prunableAt); + // @note We prune the pending chain as part of the propose call. + _testBlock("empty_block_1", false, prunableAt.unwrap()); assertEq(inbox.inProgress(), 3, "Invalid in progress"); assertEq(inbox.getRoot(2), inboxRoot2, "Invalid inbox root"); @@ -455,10 +398,28 @@ contract RollupTest is DecoderBase { assertNotEq(minHeightEmpty, minHeightMixed, "Invalid min height"); } + function testShouldNotBeTooEagerToPrune() public setUpFor("mixed_block_1") { + warpToL2Slot(1); + _testBlock("mixed_block_1", false, 1); + // we prove epoch 0 + rollup.setAssumeProvenThroughBlockNumber(rollup.getPendingBlockNumber()); + + // jump to epoch 1 + warpToL2Slot(Constants.AZTEC_EPOCH_DURATION); + _testBlock("mixed_block_2", false, Constants.AZTEC_EPOCH_DURATION); + + // jump to epoch 2 + warpToL2Slot(Constants.AZTEC_EPOCH_DURATION * 2); + + vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__NothingToPrune.selector)); + rollup.prune(); + } + function testPruneDuringPropose() public setUpFor("mixed_block_1") { - _testBlock("mixed_block_1", false); + _testBlock("mixed_block_1", false, 1); + assertEq(rollup.getEpochToProve(), 0, "Invalid epoch to prove"); warpToL2Slot(Constants.AZTEC_EPOCH_DURATION * 2); - _testBlock("mixed_block_1", false, Constants.AZTEC_EPOCH_DURATION * 2); + _testBlock("mixed_block_1", false, Epoch.wrap(2).toSlots().unwrap()); assertEq(rollup.getPendingBlockNumber(), 1, "Invalid pending block number"); assertEq(rollup.getProvenBlockNumber(), 0, "Invalid proven block number"); @@ -468,49 +429,74 @@ contract RollupTest is DecoderBase { uint256 feeAmount = 2e18; DecoderBase.Data memory data = load("mixed_block_1").block; - bytes memory header = data.header; - bytes32 archive = data.archive; - bytes memory body = data.body; bytes32[] memory txHashes = new bytes32[](0); + uint256 portalBalance = testERC20.balanceOf(address(feeJuicePortal)); + address coinbase = data.decodedHeader.globalVariables.coinbase; // Progress time as necessary vm.warp(max(block.timestamp, data.decodedHeader.globalVariables.timestamp)); - assembly { - mstore(add(header, add(0x20, 0x0248)), feeAmount) - } + { + bytes memory header = data.header; + assembly { + mstore(add(header, add(0x20, 0x0248)), feeAmount) + } - assertEq(portalERC20.balanceOf(address(rollup)), 0, "invalid rollup balance"); + assertEq(testERC20.balanceOf(address(rollup)), 0, "invalid rollup balance"); - uint256 portalBalance = portalERC20.balanceOf(address(feeJuicePortal)); + // We jump to the time of the block. (unless it is in the past) + vm.warp(max(block.timestamp, data.decodedHeader.globalVariables.timestamp)); - // We jump to the time of the block. (unless it is in the past) - vm.warp(max(block.timestamp, data.decodedHeader.globalVariables.timestamp)); + uint256 coinbaseBalance = testERC20.balanceOf(coinbase); + assertEq(coinbaseBalance, 0, "invalid initial coinbase balance"); - address coinbase = data.decodedHeader.globalVariables.coinbase; - uint256 coinbaseBalance = portalERC20.balanceOf(coinbase); - assertEq(coinbaseBalance, 0, "invalid initial coinbase balance"); + // Assert that balance have NOT been increased by proposing the block + rollup.propose(header, data.archive, data.blockHash, txHashes, signatures, data.body); + assertEq(testERC20.balanceOf(coinbase), 0, "invalid coinbase balance"); + } - // Assert that balance have NOT been increased by proposing the block - rollup.propose(header, archive, bytes32(0), txHashes, signatures, body); - assertEq(portalERC20.balanceOf(coinbase), 0, "invalid coinbase balance"); + (bytes32 preArchive, bytes32 preBlockHash,) = rollup.blocks(0); - vm.expectRevert( - abi.encodeWithSelector( - IERC20Errors.ERC20InsufficientBalance.selector, - address(feeJuicePortal), - portalBalance, + { + vm.expectRevert( + abi.encodeWithSelector( + IERC20Errors.ERC20InsufficientBalance.selector, + address(feeJuicePortal), + portalBalance, + feeAmount + ) + ); + _submitEpochProofWithFee( + rollup, + 1, + preArchive, + data.archive, + preBlockHash, + data.blockHash, + bytes32(uint256(42)), + coinbase, feeAmount - ) - ); - rollup.submitBlockRootProof(header, archive, bytes32(0), "", ""); - assertEq(portalERC20.balanceOf(coinbase), 0, "invalid coinbase balance"); - - portalERC20.mint(address(feeJuicePortal), feeAmount - portalBalance); + ); + assertEq(testERC20.balanceOf(coinbase), 0, "invalid coinbase balance"); + } - // When the block is proven we should have received the funds - rollup.submitBlockRootProof(header, archive, bytes32(0), "", ""); - assertEq(portalERC20.balanceOf(coinbase), feeAmount, "invalid coinbase balance"); + { + testERC20.mint(address(feeJuicePortal), feeAmount - portalBalance); + + // When the block is proven we should have received the funds + _submitEpochProofWithFee( + rollup, + 1, + preArchive, + data.archive, + preBlockHash, + data.blockHash, + bytes32(uint256(42)), + coinbase, + feeAmount + ); + assertEq(testERC20.balanceOf(coinbase), feeAmount, "invalid coinbase balance"); + } } function testMixedBlock(bool _toProve) public setUpFor("mixed_block_1") { @@ -530,20 +516,40 @@ contract RollupTest is DecoderBase { assertEq(rollup.getProvenBlockNumber(), 0 + toProve, "Invalid proven block number"); } - function testConsecutiveMixedBlocksNonSequentialProof() public setUpFor("mixed_block_1") { + function testProveEpochWithTwoMixedBlocks() public setUpFor("mixed_block_1") { _testBlock("mixed_block_1", false); + _testBlock("mixed_block_2", false); DecoderBase.Data memory data = load("mixed_block_2").block; - bytes memory header = data.header; - bytes32 archive = data.archive; - bytes memory body = data.body; + + assertEq(rollup.getProvenBlockNumber(), 0, "Invalid initial proven block number"); + (bytes32 preArchive, bytes32 preBlockHash,) = rollup.blocks(0); + _submitEpochProof(rollup, 2, preArchive, data.archive, preBlockHash, data.blockHash, bytes32(0)); + + assertEq(rollup.getPendingBlockNumber(), 2, "Invalid pending block number"); + assertEq(rollup.getProvenBlockNumber(), 2, "Invalid proven block number"); + } + + function testConsecutiveMixedBlocksNonSequentialProof() public setUpFor("mixed_block_1") { + _testBlock("mixed_block_1", false); + + DecoderBase.Data memory data1 = load("mixed_block_1").block; + DecoderBase.Data memory data2 = load("mixed_block_2").block; bytes32[] memory txHashes = new bytes32[](0); - vm.warp(max(block.timestamp, data.decodedHeader.globalVariables.timestamp)); - rollup.propose(header, archive, bytes32(0), txHashes, signatures, body); + vm.warp(max(block.timestamp, data2.decodedHeader.globalVariables.timestamp)); + rollup.propose(data2.header, data2.archive, data2.blockHash, txHashes, signatures, data2.body); - vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__NonSequentialProving.selector)); - rollup.submitBlockRootProof(header, archive, bytes32(0), "", ""); + // Skips proving of block 1 + (bytes32 preArchive,,) = rollup.blocks(0); + vm.expectRevert( + abi.encodeWithSelector( + Errors.Rollup__InvalidPreviousArchive.selector, preArchive, data1.archive + ) + ); + _submitEpochProof( + rollup, 1, data1.archive, data2.archive, data1.archive, data2.archive, bytes32(0) + ); assertEq(rollup.getPendingBlockNumber(), 2, "Invalid pending block number"); assertEq(rollup.getProvenBlockNumber(), 0, "Invalid proven block number"); @@ -577,7 +583,7 @@ contract RollupTest is DecoderBase { } vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__InvalidBlockNumber.selector, 1, 0x420)); - rollup.propose(header, archive, bytes32(0), txHashes, signatures, body); + rollup.propose(header, archive, data.blockHash, txHashes, signatures, body); } function testRevertInvalidChainId() public setUpFor("empty_block_1") { @@ -592,7 +598,7 @@ contract RollupTest is DecoderBase { } vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__InvalidChainId.selector, 31337, 0x420)); - rollup.propose(header, archive, bytes32(0), txHashes, signatures, body); + rollup.propose(header, archive, data.blockHash, txHashes, signatures, body); } function testRevertInvalidVersion() public setUpFor("empty_block_1") { @@ -607,7 +613,7 @@ contract RollupTest is DecoderBase { } vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__InvalidVersion.selector, 1, 0x420)); - rollup.propose(header, archive, bytes32(0), txHashes, signatures, body); + rollup.propose(header, archive, data.blockHash, txHashes, signatures, body); } function testRevertInvalidTimestamp() public setUpFor("empty_block_1") { @@ -627,7 +633,7 @@ contract RollupTest is DecoderBase { } vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__InvalidTimestamp.selector, realTs, badTs)); - rollup.propose(header, archive, bytes32(0), txHashes, signatures, body); + rollup.propose(header, archive, data.blockHash, txHashes, signatures, body); } function testBlocksWithAssumeProven() public setUpFor("mixed_block_1") { @@ -655,47 +661,63 @@ contract RollupTest is DecoderBase { } function testSubmitProofNonExistantBlock() public setUpFor("empty_block_1") { + _testBlock("empty_block_1", false); DecoderBase.Data memory data = load("empty_block_1").block; - bytes memory header = data.header; - bytes32 archive = data.archive; - vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__TryingToProveNonExistingBlock.selector)); - rollup.submitBlockRootProof(header, archive, bytes32(0), "", ""); + (bytes32 preArchive, bytes32 preBlockHash,) = rollup.blocks(0); + bytes32 wrong = bytes32(uint256(0xdeadbeef)); + vm.expectRevert( + abi.encodeWithSelector(Errors.Rollup__InvalidPreviousArchive.selector, preArchive, wrong) + ); + _submitEpochProof(rollup, 1, wrong, data.archive, preBlockHash, data.blockHash, bytes32(0)); + + // TODO: Reenable when we setup proper initial block hash + // vm.expectRevert( + // abi.encodeWithSelector(Errors.Rollup__InvalidPreviousBlockHash.selector, preBlockHash, wrong) + // ); + // _submitEpochProof(rollup, 1, preArchive, data.archive, wrong, data.blockHash, bytes32(0)); } function testSubmitProofInvalidArchive() public setUpFor("empty_block_1") { _testBlock("empty_block_1", false); DecoderBase.Data memory data = load("empty_block_1").block; - bytes memory header = data.header; - bytes32 archive = data.archive; - - // Update the lastArchive value in the header and then submit a proof - assembly { - mstore(add(header, add(0x20, 0x00)), 0xdeadbeef) - } + bytes32 wrongArchive = bytes32(uint256(0xdeadbeef)); + (bytes32 preArchive, bytes32 preBlockHash,) = rollup.blocks(0); vm.expectRevert( - abi.encodeWithSelector( - Errors.Rollup__InvalidArchive.selector, rollup.archiveAt(0), 0xdeadbeef - ) + abi.encodeWithSelector(Errors.Rollup__InvalidArchive.selector, data.archive, 0xdeadbeef) ); - rollup.submitBlockRootProof(header, archive, bytes32(0), "", ""); + _submitEpochProof(rollup, 1, preArchive, wrongArchive, preBlockHash, data.blockHash, bytes32(0)); } - function testSubmitProofInvalidProposedArchive() public setUpFor("empty_block_1") { + function testSubmitProofInvalidBlockHash() public setUpFor("empty_block_1") { _testBlock("empty_block_1", false); DecoderBase.Data memory data = load("empty_block_1").block; - bytes memory header = data.header; - bytes32 archive = data.archive; - - bytes32 badArchive = keccak256(abi.encode(archive)); + bytes32 wrongBlockHash = bytes32(uint256(0xdeadbeef)); + (bytes32 preArchive, bytes32 preBlockHash,) = rollup.blocks(0); vm.expectRevert( - abi.encodeWithSelector(Errors.Rollup__InvalidProposedArchive.selector, archive, badArchive) + abi.encodeWithSelector( + Errors.Rollup__InvalidBlockHash.selector, data.blockHash, wrongBlockHash + ) ); - rollup.submitBlockRootProof(header, badArchive, bytes32(0), "", ""); + _submitEpochProof(rollup, 1, preArchive, data.archive, preBlockHash, wrongBlockHash, bytes32(0)); + } + + function _quoteToSignedQuote(EpochProofQuoteLib.EpochProofQuote memory _quote) + internal + view + returns (EpochProofQuoteLib.SignedEpochProofQuote memory) + { + bytes32 digest = rollup.quoteToDigest(_quote); + (uint8 v, bytes32 r, bytes32 s) = + vm.sign(0x123456789abcdef123456789abcdef123456789abcdef123456789abcdef1234, digest); + return EpochProofQuoteLib.SignedEpochProofQuote({ + quote: _quote, + signature: SignatureLib.Signature({isEmpty: false, v: v, r: r, s: s}) + }); } function _testBlock(string memory name, bool _submitProof) public { @@ -710,14 +732,16 @@ contract RollupTest is DecoderBase { uint32 numTxs = full.block.numTxs; bytes32[] memory txHashes = new bytes32[](0); + Slot slotNumber = Slot.wrap(_slotNumber); + // Overwrite some timestamps if needed - if (_slotNumber != 0) { - uint256 ts = rollup.getTimestampForSlot(_slotNumber); + if (slotNumber != Slot.wrap(0)) { + Timestamp ts = rollup.getTimestampForSlot(slotNumber); - full.block.decodedHeader.globalVariables.timestamp = ts; - full.block.decodedHeader.globalVariables.slotNumber = _slotNumber; + full.block.decodedHeader.globalVariables.timestamp = Timestamp.unwrap(ts); + full.block.decodedHeader.globalVariables.slotNumber = Slot.unwrap(slotNumber); assembly { - mstore(add(header, add(0x20, 0x0194)), _slotNumber) + mstore(add(header, add(0x20, 0x0194)), slotNumber) mstore(add(header, add(0x20, 0x01b4)), ts) } } @@ -727,13 +751,15 @@ contract RollupTest is DecoderBase { _populateInbox(full.populate.sender, full.populate.recipient, full.populate.l1ToL2Content); - rollup.propose(header, archive, bytes32(0), txHashes, signatures, body); + rollup.propose(header, archive, full.block.blockHash, txHashes, signatures, body); if (_submitProof) { uint256 pre = rollup.getProvenBlockNumber(); + (bytes32 preArchive, bytes32 preBlockHash,) = rollup.blocks(pre); - rollup.submitBlockRootProof(header, archive, bytes32(0), "", ""); - + _submitEpochProof( + rollup, 1, preArchive, archive, preBlockHash, full.block.blockHash, bytes32(0) + ); assertEq(pre + 1, rollup.getProvenBlockNumber(), "Block not proven"); } @@ -785,4 +811,57 @@ contract RollupTest is DecoderBase { ); } } + + function _submitEpochProof( + Rollup _rollup, + uint256 _epochSize, + bytes32 _previousArchive, + bytes32 _endArchive, + bytes32 _previousBlockHash, + bytes32 _endBlockHash, + bytes32 _proverId + ) internal { + _submitEpochProofWithFee( + _rollup, + _epochSize, + _previousArchive, + _endArchive, + _previousBlockHash, + _endBlockHash, + _proverId, + address(0), + uint256(0) + ); + } + + function _submitEpochProofWithFee( + Rollup _rollup, + uint256 _epochSize, + bytes32 _previousArchive, + bytes32 _endArchive, + bytes32 _previousBlockHash, + bytes32 _endBlockHash, + bytes32 _proverId, + address _feeRecipient, + uint256 _feeAmount + ) internal { + bytes32[7] memory args = [ + _previousArchive, + _endArchive, + _previousBlockHash, + _endBlockHash, + bytes32(0), + bytes32(0), + _proverId + ]; + + bytes32[64] memory fees; + fees[0] = bytes32(uint256(uint160(_feeRecipient))); + fees[1] = bytes32(_feeAmount); + + bytes memory aggregationObject = ""; + bytes memory proof = ""; + + _rollup.submitEpochRootProof(_epochSize, args, fees, aggregationObject, proof); + } } diff --git a/l1-contracts/test/portals/PortalERC20.sol b/l1-contracts/test/TestERC20.sol similarity index 89% rename from l1-contracts/test/portals/PortalERC20.sol rename to l1-contracts/test/TestERC20.sol index 4c1dc5372be..3f0e54dc5f6 100644 --- a/l1-contracts/test/portals/PortalERC20.sol +++ b/l1-contracts/test/TestERC20.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import "@oz/token/ERC20/ERC20.sol"; -contract PortalERC20 is ERC20 { +contract TestERC20 is ERC20 { constructor() ERC20("Portal", "PORTAL") {} function mint(address to, uint256 amount) external { diff --git a/l1-contracts/test/TestERC20.t.sol b/l1-contracts/test/TestERC20.t.sol new file mode 100644 index 00000000000..4f50cb73f21 --- /dev/null +++ b/l1-contracts/test/TestERC20.t.sol @@ -0,0 +1,17 @@ +pragma solidity ^0.8.18; + +import "forge-std/Test.sol"; +import {TestERC20} from "./TestERC20.sol"; + +contract TestERC20Test is Test { + TestERC20 testERC20; + + function setUp() public { + testERC20 = new TestERC20(); + } + + function test_mint() public { + testERC20.mint(address(this), 100); + assertEq(testERC20.balanceOf(address(this)), 100); + } +} diff --git a/l1-contracts/test/decoders/Base.sol b/l1-contracts/test/decoders/Base.sol index 45beed502c0..1f5eb075f0a 100644 --- a/l1-contracts/test/decoders/Base.sol +++ b/l1-contracts/test/decoders/Base.sol @@ -1,14 +1,19 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import {Test} from "forge-std/Test.sol"; +import {Timestamp, Slot, Epoch, SlotLib, EpochLib} from "@aztec/core/libraries/TimeMath.sol"; + // Many of the structs in here match what you see in `header` but with very important exceptions! // The order of variables is sorted alphabetically in the structs in here to work with the // JSON cheatcodes. contract DecoderBase is Test { + using SlotLib for Slot; + using EpochLib for Epoch; + struct AppendOnlyTreeSnapshot { uint32 nextAvailableLeafIndex; bytes32 root; @@ -34,6 +39,7 @@ contract DecoderBase is Test { struct Data { bytes32 archive; + bytes32 blockHash; bytes body; DecodedHeader decodedHeader; bytes header; @@ -97,4 +103,138 @@ contract DecoderBase is Test { function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } + + // timestamps + + function assertLe(Timestamp a, Timestamp b) internal { + if (a > b) { + emit log("Error: a <= b not satisfied [Timestamp]"); + emit log_named_uint(" Left", Timestamp.unwrap(a)); + emit log_named_uint(" Right", Timestamp.unwrap(b)); + fail(); + } + } + + function assertLe(Timestamp a, uint256 b) internal { + if (a > Timestamp.wrap(b)) { + emit log("Error: a <= b not satisfied [Timestamp]"); + emit log_named_uint(" Left", Timestamp.unwrap(a)); + emit log_named_uint(" Right", b); + fail(); + } + } + + function assertLe(Timestamp a, Timestamp b, string memory err) internal { + if (a > b) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + function assertLe(Timestamp a, uint256 b, string memory err) internal { + if (a > Timestamp.wrap(b)) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + function assertEq(Timestamp a, Timestamp b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [Timestamp]"); + emit log_named_uint(" Left", Timestamp.unwrap(a)); + emit log_named_uint(" Right", Timestamp.unwrap(b)); + fail(); + } + } + + function assertEq(Timestamp a, uint256 b) internal { + if (a != Timestamp.wrap(b)) { + emit log("Error: a == b not satisfied [Timestamp]"); + emit log_named_uint(" Left", Timestamp.unwrap(a)); + emit log_named_uint(" Right", b); + fail(); + } + } + + function assertEq(Timestamp a, Timestamp b, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + function assertEq(Timestamp a, uint256 b, string memory err) internal { + if (a != Timestamp.wrap(b)) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + // Slots + + function assertEq(Slot a, Slot b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [Slot]"); + emit log_named_uint(" Left", a.unwrap()); + emit log_named_uint(" Right", b.unwrap()); + fail(); + } + } + + function assertEq(Slot a, uint256 b) internal { + if (a != Slot.wrap(b)) { + emit log("Error: a == b not satisfied [Slot]"); + emit log_named_uint(" Left", a.unwrap()); + emit log_named_uint(" Right", b); + fail(); + } + } + + function assertEq(Slot a, Slot b, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + function assertEq(Slot a, uint256 b, string memory err) internal { + if (a != Slot.wrap(b)) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + // Epochs + + function assertEq(Epoch a, Epoch b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [Epoch]"); + emit log_named_uint(" Left", a.unwrap()); + emit log_named_uint(" Right", b.unwrap()); + fail(); + } + } + + function assertEq(Epoch a, uint256 b) internal { + if (a != Epoch.wrap(b)) { + emit log("Error: a == b not satisfied [Epoch]"); + emit log_named_uint(" Left", a.unwrap()); + emit log_named_uint(" Right", b); + fail(); + } + } + + function assertEq(Epoch a, Epoch b, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + function assertEq(Epoch a, uint256 b, string memory err) internal { + if (a != Epoch.wrap(b)) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } } diff --git a/l1-contracts/test/decoders/Decoders.t.sol b/l1-contracts/test/decoders/Decoders.t.sol index 2b4a6f5547f..973a46e6cb5 100644 --- a/l1-contracts/test/decoders/Decoders.t.sol +++ b/l1-contracts/test/decoders/Decoders.t.sol @@ -1,15 +1,15 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import {DecoderBase} from "./Base.sol"; -import {Hash} from "../../src/core/libraries/Hash.sol"; +import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; import {HeaderLibHelper} from "./helpers/HeaderLibHelper.sol"; import {TxsDecoderHelper} from "./helpers/TxsDecoderHelper.sol"; -import {HeaderLib} from "../../src/core/libraries/HeaderLib.sol"; -import {Constants} from "../../src/core/libraries/ConstantsGen.sol"; +import {HeaderLib} from "@aztec/core/libraries/HeaderLib.sol"; +import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; /** * Blocks are generated using the `integration_l1_publisher.test.ts` tests. diff --git a/l1-contracts/test/decoders/helpers/HeaderLibHelper.sol b/l1-contracts/test/decoders/helpers/HeaderLibHelper.sol index 7d839535a74..f265c6f61a5 100644 --- a/l1-contracts/test/decoders/helpers/HeaderLibHelper.sol +++ b/l1-contracts/test/decoders/helpers/HeaderLibHelper.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -import {HeaderLib} from "../../../src/core/libraries/HeaderLib.sol"; +import {HeaderLib} from "@aztec/core/libraries/HeaderLib.sol"; contract HeaderLibHelper { // A wrapper used such that we get "calldata" and not memory diff --git a/l1-contracts/test/decoders/helpers/TxsDecoderHelper.sol b/l1-contracts/test/decoders/helpers/TxsDecoderHelper.sol index 23a2f1db515..fad4763dc3d 100644 --- a/l1-contracts/test/decoders/helpers/TxsDecoderHelper.sol +++ b/l1-contracts/test/decoders/helpers/TxsDecoderHelper.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -import {TxsDecoder} from "../../../src/core/libraries/decoders/TxsDecoder.sol"; -import {MerkleLib} from "../../../src/core/libraries/MerkleLib.sol"; +import {TxsDecoder} from "@aztec/core/libraries/TxsDecoder.sol"; +import {MerkleLib} from "@aztec/core/libraries/crypto/MerkleLib.sol"; contract TxsDecoderHelper { // A wrapper used such that we get "calldata" and not memory diff --git a/l1-contracts/test/fixtures/empty_block_1.json b/l1-contracts/test/fixtures/empty_block_1.json index f62fe416457..1b2b5d30173 100644 --- a/l1-contracts/test/fixtures/empty_block_1.json +++ b/l1-contracts/test/fixtures/empty_block_1.json @@ -8,7 +8,8 @@ "l2ToL1Messages": [] }, "block": { - "archive": "0x2e45afa261e3aac1f5afe60c9c839d54feafeb03a1fa1676265cb50fd7144202", + "archive": "0x297eae831bd111157e6a0ca9a2b308582d40fe6df08b8783589f71689411f25c", + "blockHash": "0x198acc9f0edfeb7a35254bc6fbc0ebbd37a56c790ed080da3029c84d20c76dc4", "body": "0x00000000", "txsEffectsHash": "0x00e994e16b3763fd5039413cf99c2b3c378e2bab939e7992a77bd201b28160d6", "decodedHeader": { @@ -22,10 +23,10 @@ "blockNumber": 1, "slotNumber": "0x0000000000000000000000000000000000000000000000000000000000000031", "chainId": 31337, - "timestamp": 1725365629, + "timestamp": 1727209981, "version": 1, - "coinbase": "0xe18d2e77cb7d56929128e82138140e07f81237f0", - "feeRecipient": "0x249d3ad6f4117aa61fb1c3f901889be704af87fc9bb1686ba21218a3b50c36bf", + "coinbase": "0x48820dbe0aca89d270282a8f2b96858e4a02fd86", + "feeRecipient": "0x09507465bcdd9b36079acdd4d16c54325ec118241ae4d9d36d5b8c4a553a2bd4", "gasFees": { "feePerDaGas": 0, "feePerL2Gas": 0 @@ -56,8 +57,8 @@ } } }, - "header": "0x1200a06aae1368abe36530b585bd7a4d2ba4de5037b82076412691a187d7621e00000001000000000000000000000000000000000000000000000000000000000000000200e994e16b3763fd5039413cf99c2b3c378e2bab939e7992a77bd201b28160d600089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000100b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d0000008019a8c197c12bb33da6314c4ef4f8f6fcb9e25250c085df8672adf67c8f1e3dbc0000010023c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9000001000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000066d6fd7de18d2e77cb7d56929128e82138140e07f81237f0249d3ad6f4117aa61fb1c3f901889be704af87fc9bb1686ba21218a3b50c36bf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "publicInputsHash": "0x0042736ccfe5affa7d43b08218d225ef79539cf41495e3db480aedf4ec65d918", + "header": "0x1200a06aae1368abe36530b585bd7a4d2ba4de5037b82076412691a187d7621e00000001000000000000000000000000000000000000000000000000000000000000000200e994e16b3763fd5039413cf99c2b3c378e2bab939e7992a77bd201b28160d600089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000100b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d0000008019a8c197c12bb33da6314c4ef4f8f6fcb9e25250c085df8672adf67c8f1e3dbc0000010023c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9000001000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000066f321fd48820dbe0aca89d270282a8f2b96858e4a02fd8609507465bcdd9b36079acdd4d16c54325ec118241ae4d9d36d5b8c4a553a2bd4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "publicInputsHash": "0x004bfba06ac34bf94241679ac67b1d0feaba3974ffaa89130178f856f9dde151", "numTxs": 0 } } \ No newline at end of file diff --git a/l1-contracts/test/fixtures/empty_block_2.json b/l1-contracts/test/fixtures/empty_block_2.json index 895b1f906d3..ef17331ce83 100644 --- a/l1-contracts/test/fixtures/empty_block_2.json +++ b/l1-contracts/test/fixtures/empty_block_2.json @@ -8,7 +8,8 @@ "l2ToL1Messages": [] }, "block": { - "archive": "0x002edae6c81b7fcd630fd745c8e6fa957b8d4ac97b55baa072fae18f4a94b14e", + "archive": "0x27051db35349c7cce24904a49415ce16cdcca25ee7f4b008a0b61fc9085bfb59", + "blockHash": "0x085125d283a90ef5f0f76f86842d1ecb6e012435a574cc9db61c97890822d4ae", "body": "0x00000000", "txsEffectsHash": "0x00e994e16b3763fd5039413cf99c2b3c378e2bab939e7992a77bd201b28160d6", "decodedHeader": { @@ -22,10 +23,10 @@ "blockNumber": 2, "slotNumber": "0x0000000000000000000000000000000000000000000000000000000000000032", "chainId": 31337, - "timestamp": 1725365665, + "timestamp": 1727210017, "version": 1, - "coinbase": "0xe18d2e77cb7d56929128e82138140e07f81237f0", - "feeRecipient": "0x249d3ad6f4117aa61fb1c3f901889be704af87fc9bb1686ba21218a3b50c36bf", + "coinbase": "0x48820dbe0aca89d270282a8f2b96858e4a02fd86", + "feeRecipient": "0x09507465bcdd9b36079acdd4d16c54325ec118241ae4d9d36d5b8c4a553a2bd4", "gasFees": { "feePerDaGas": 0, "feePerL2Gas": 0 @@ -33,7 +34,7 @@ }, "lastArchive": { "nextAvailableLeafIndex": 2, - "root": "0x2e45afa261e3aac1f5afe60c9c839d54feafeb03a1fa1676265cb50fd7144202" + "root": "0x297eae831bd111157e6a0ca9a2b308582d40fe6df08b8783589f71689411f25c" }, "stateReference": { "l1ToL2MessageTree": { @@ -56,8 +57,8 @@ } } }, - "header": "0x2e45afa261e3aac1f5afe60c9c839d54feafeb03a1fa1676265cb50fd714420200000002000000000000000000000000000000000000000000000000000000000000000200e994e16b3763fd5039413cf99c2b3c378e2bab939e7992a77bd201b28160d600089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000200b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d0000010019a8c197c12bb33da6314c4ef4f8f6fcb9e25250c085df8672adf67c8f1e3dbc0000018023c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9000001800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000066d6fda1e18d2e77cb7d56929128e82138140e07f81237f0249d3ad6f4117aa61fb1c3f901889be704af87fc9bb1686ba21218a3b50c36bf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "publicInputsHash": "0x00b9a5096ad3d9edef7e78a242b1402a5cd1adeb08ee654c6e738a08b3522483", + "header": "0x297eae831bd111157e6a0ca9a2b308582d40fe6df08b8783589f71689411f25c00000002000000000000000000000000000000000000000000000000000000000000000200e994e16b3763fd5039413cf99c2b3c378e2bab939e7992a77bd201b28160d600089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000200b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d0000010019a8c197c12bb33da6314c4ef4f8f6fcb9e25250c085df8672adf67c8f1e3dbc0000018023c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9000001800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000066f3222148820dbe0aca89d270282a8f2b96858e4a02fd8609507465bcdd9b36079acdd4d16c54325ec118241ae4d9d36d5b8c4a553a2bd4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "publicInputsHash": "0x00cf034eb8c87c0608a9a3b0bb8685b1ae401527c72f171438c83bceaf792d84", "numTxs": 0 } } \ No newline at end of file diff --git a/l1-contracts/test/fixtures/mixed_block_1.json b/l1-contracts/test/fixtures/mixed_block_1.json index ca70a23d40d..56f2883a97a 100644 --- a/l1-contracts/test/fixtures/mixed_block_1.json +++ b/l1-contracts/test/fixtures/mixed_block_1.json @@ -58,7 +58,8 @@ ] }, "block": { - "archive": "0x216b15f092c571bf4e72deff46dbfc36e706d0dae56313d6dde566c42c2c706c", + "archive": "0x1eaee3f73128f764a0f5693fee59234aa4d8c07f6f54a1a6311a28a4c516b8fd", + "blockHash": "0x2bf51b063a5c58d78c90cd5479ae85a17054e73365c6be43f0e76d9fd30e9d8e", "body": "0x00000004000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000014100000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000000000000000000143000000000000000000000000000000000000000000000000000000000000014400000000000000000000000000000000000000000000000000000000000001450000000000000000000000000000000000000000000000000000000000000146000000000000000000000000000000000000000000000000000000000000014700000000000000000000000000000000000000000000000000000000000001480000000000000000000000000000000000000000000000000000000000000149000000000000000000000000000000000000000000000000000000000000014a000000000000000000000000000000000000000000000000000000000000014b000000000000000000000000000000000000000000000000000000000000014c000000000000000000000000000000000000000000000000000000000000014d000000000000000000000000000000000000000000000000000000000000014e000000000000000000000000000000000000000000000000000000000000014f0000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000015100000000000000000000000000000000000000000000000000000000000001520000000000000000000000000000000000000000000000000000000000000153000000000000000000000000000000000000000000000000000000000000015400000000000000000000000000000000000000000000000000000000000001550000000000000000000000000000000000000000000000000000000000000156000000000000000000000000000000000000000000000000000000000000015700000000000000000000000000000000000000000000000000000000000001580000000000000000000000000000000000000000000000000000000000000159000000000000000000000000000000000000000000000000000000000000015a000000000000000000000000000000000000000000000000000000000000015b000000000000000000000000000000000000000000000000000000000000015c000000000000000000000000000000000000000000000000000000000000015d000000000000000000000000000000000000000000000000000000000000015e000000000000000000000000000000000000000000000000000000000000015f0000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000016100000000000000000000000000000000000000000000000000000000000001620000000000000000000000000000000000000000000000000000000000000163000000000000000000000000000000000000000000000000000000000000016400000000000000000000000000000000000000000000000000000000000001650000000000000000000000000000000000000000000000000000000000000166000000000000000000000000000000000000000000000000000000000000016700000000000000000000000000000000000000000000000000000000000001680000000000000000000000000000000000000000000000000000000000000169000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000016b000000000000000000000000000000000000000000000000000000000000016c000000000000000000000000000000000000000000000000000000000000016d000000000000000000000000000000000000000000000000000000000000016e000000000000000000000000000000000000000000000000000000000000016f0000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000017100000000000000000000000000000000000000000000000000000000000001720000000000000000000000000000000000000000000000000000000000000173000000000000000000000000000000000000000000000000000000000000017400000000000000000000000000000000000000000000000000000000000001750000000000000000000000000000000000000000000000000000000000000176000000000000000000000000000000000000000000000000000000000000017700000000000000000000000000000000000000000000000000000000000001780000000000000000000000000000000000000000000000000000000000000179000000000000000000000000000000000000000000000000000000000000017a000000000000000000000000000000000000000000000000000000000000017b000000000000000000000000000000000000000000000000000000000000017c000000000000000000000000000000000000000000000000000000000000017d000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000017f3f0000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e000000000000000000000000000000000000000000000000000000000000024f0000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000025100000000000000000000000000000000000000000000000000000000000002520000000000000000000000000000000000000000000000000000000000000253000000000000000000000000000000000000000000000000000000000000025400000000000000000000000000000000000000000000000000000000000002550000000000000000000000000000000000000000000000000000000000000256000000000000000000000000000000000000000000000000000000000000025700000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000025a000000000000000000000000000000000000000000000000000000000000025b000000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000025d000000000000000000000000000000000000000000000000000000000000025e000000000000000000000000000000000000000000000000000000000000025f0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e000000000000000000000000000000000000000000000000000000000000026f0000000000000000000000000000000000000000000000000000000000000270000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000002720000000000000000000000000000000000000000000000000000000000000273000000000000000000000000000000000000000000000000000000000000027400000000000000000000000000000000000000000000000000000000000002750000000000000000000000000000000000000000000000000000000000000276000000000000000000000000000000000000000000000000000000000000027700000000000000000000000000000000000000000000000000000000000002780000000000000000000000000000000000000000000000000000000000000279000000000000000000000000000000000000000000000000000000000000027a000000000000000000000000000000000000000000000000000000000000027b000000000000000000000000000000000000000000000000000000000000027c000000000000000000000000000000000000000000000000000000000000027d000000000000000000000000000000000000000000000000000000000000027e0800c47667396742a5474f325e2567bff3bb99b7f0bfd2b1a689b635d8b8726cce00284120278895e8d47084ae759f390e9634881e41369a257a36fe99a2369dc800a328b4a4a6ed156325253b4ab2af7ca00e21caf7963f0fba8a88ccdc3512c300705c99df420bface231f6855799db1d0ed7d39419abc47aa8c6efe2ae7aae2009299cc308de6d23788384411e024791a5b2448e455fbdd1d1f28f3ff76631f002d6c03d81ad764de51b0f34584645191cdc2aaae2ca08fb838d142b95d62f5003032f3618b2df0fa335d5fd548d6d85e42b4e7eb5fff9eb687facbbdecb8a60016cab7ddf4d1b440d53d10284c5c82a78b2d4e27dcdb44ef434ef4c6bad6783f0000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000054a0000000000000000000000000000000000000000000000000000000000000541000000000000000000000000000000000000000000000000000000000000054b0000000000000000000000000000000000000000000000000000000000000542000000000000000000000000000000000000000000000000000000000000054c0000000000000000000000000000000000000000000000000000000000000543000000000000000000000000000000000000000000000000000000000000054d0000000000000000000000000000000000000000000000000000000000000544000000000000000000000000000000000000000000000000000000000000054e0000000000000000000000000000000000000000000000000000000000000545000000000000000000000000000000000000000000000000000000000000054f00000000000000000000000000000000000000000000000000000000000005460000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000054700000000000000000000000000000000000000000000000000000000000005510000000000000000000000000000000000000000000000000000000000000548000000000000000000000000000000000000000000000000000000000000055200000000000000000000000000000000000000000000000000000000000005490000000000000000000000000000000000000000000000000000000000000553000000000000000000000000000000000000000000000000000000000000054a0000000000000000000000000000000000000000000000000000000000000554000000000000000000000000000000000000000000000000000000000000054b0000000000000000000000000000000000000000000000000000000000000555000000000000000000000000000000000000000000000000000000000000054c0000000000000000000000000000000000000000000000000000000000000556000000000000000000000000000000000000000000000000000000000000054d0000000000000000000000000000000000000000000000000000000000000557000000000000000000000000000000000000000000000000000000000000054e0000000000000000000000000000000000000000000000000000000000000558000000000000000000000000000000000000000000000000000000000000054f00000000000000000000000000000000000000000000000000000000000005590000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000055a0000000000000000000000000000000000000000000000000000000000000551000000000000000000000000000000000000000000000000000000000000055b0000000000000000000000000000000000000000000000000000000000000552000000000000000000000000000000000000000000000000000000000000055c0000000000000000000000000000000000000000000000000000000000000553000000000000000000000000000000000000000000000000000000000000055d0000000000000000000000000000000000000000000000000000000000000554000000000000000000000000000000000000000000000000000000000000055e0000000000000000000000000000000000000000000000000000000000000555000000000000000000000000000000000000000000000000000000000000055f00000000000000000000000000000000000000000000000000000000000005560000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000055700000000000000000000000000000000000000000000000000000000000005610000000000000000000000000000000000000000000000000000000000000558000000000000000000000000000000000000000000000000000000000000056200000000000000000000000000000000000000000000000000000000000005590000000000000000000000000000000000000000000000000000000000000563000000000000000000000000000000000000000000000000000000000000055a0000000000000000000000000000000000000000000000000000000000000564000000000000000000000000000000000000000000000000000000000000055b0000000000000000000000000000000000000000000000000000000000000565000000000000000000000000000000000000000000000000000000000000055c0000000000000000000000000000000000000000000000000000000000000566000000000000000000000000000000000000000000000000000000000000055d0000000000000000000000000000000000000000000000000000000000000567000000000000000000000000000000000000000000000000000000000000055e0000000000000000000000000000000000000000000000000000000000000568000000000000000000000000000000000000000000000000000000000000055f00000000000000000000000000000000000000000000000000000000000005690000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000056a0000000000000000000000000000000000000000000000000000000000000561000000000000000000000000000000000000000000000000000000000000056b0000000000000000000000000000000000000000000000000000000000000562000000000000000000000000000000000000000000000000000000000000056c0000000000000000000000000000000000000000000000000000000000000563000000000000000000000000000000000000000000000000000000000000056d0000000000000000000000000000000000000000000000000000000000000564000000000000000000000000000000000000000000000000000000000000056e0000000000000000000000000000000000000000000000000000000000000565000000000000000000000000000000000000000000000000000000000000056f00000000000000000000000000000000000000000000000000000000000005660000000000000000000000000000000000000000000000000000000000000570000000000000000000000000000000000000000000000000000000000000056700000000000000000000000000000000000000000000000000000000000005710000000000000000000000000000000000000000000000000000000000000568000000000000000000000000000000000000000000000000000000000000057200000000000000000000000000000000000000000000000000000000000005690000000000000000000000000000000000000000000000000000000000000573000000000000000000000000000000000000000000000000000000000000056a0000000000000000000000000000000000000000000000000000000000000574000000000000000000000000000000000000000000000000000000000000056b0000000000000000000000000000000000000000000000000000000000000575000000000000000000000000000000000000000000000000000000000000056c0000000000000000000000000000000000000000000000000000000000000576000000000000000000000000000000000000000000000000000000000000056d0000000000000000000000000000000000000000000000000000000000000577000000000000000000000000000000000000000000000000000000000000056e0000000000000000000000000000000000000000000000000000000000000578000000000000000000000000000000000000000000000000000000000000056f00000000000000000000000000000000000000000000000000000000000005790000000000000000000000000000000000000000000000000000000000000570000000000000000000000000000000000000000000000000000000000000057a0000000000000000000000000000000000000000000000000000000000000571000000000000000000000000000000000000000000000000000000000000057b0000000000000000000000000000000000000000000000000000000000000572000000000000000000000000000000000000000000000000000000000000057c0000000000000000000000000000000000000000000000000000000000000573000000000000000000000000000000000000000000000000000000000000057d0000000000000000000000000000000000000000000000000000000000000574000000000000000000000000000000000000000000000000000000000000057e0000000000000000000000000000000000000000000000000000000000000575000000000000000000000000000000000000000000000000000000000000057f00000000000000000000000000000000000000000000000000000000000005760000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000057700000000000000000000000000000000000000000000000000000000000005810000000000000000000000000000000000000000000000000000000000000578000000000000000000000000000000000000000000000000000000000000058200000000000000000000000000000000000000000000000000000000000005790000000000000000000000000000000000000000000000000000000000000583000000000000000000000000000000000000000000000000000000000000057a0000000000000000000000000000000000000000000000000000000000000584000000000000000000000000000000000000000000000000000000000000057b0000000000000000000000000000000000000000000000000000000000000585000000000000000000000000000000000000000000000000000000000000057c0000000000000000000000000000000000000000000000000000000000000586000000000000000000000000000000000000000000000000000000000000057d0000000000000000000000000000000000000000000000000000000000000587000000000000000000000000000000000000000000000000000000000000057e0000000000000000000000000000000000000000000000000000000000000588000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000018100000000000000000000000000000000000000000000000000000000000001820000000000000000000000000000000000000000000000000000000000000183000000000000000000000000000000000000000000000000000000000000018400000000000000000000000000000000000000000000000000000000000001850000000000000000000000000000000000000000000000000000000000000186000000000000000000000000000000000000000000000000000000000000018700000000000000000000000000000000000000000000000000000000000001880000000000000000000000000000000000000000000000000000000000000189000000000000000000000000000000000000000000000000000000000000018a000000000000000000000000000000000000000000000000000000000000018b000000000000000000000000000000000000000000000000000000000000018c000000000000000000000000000000000000000000000000000000000000018d000000000000000000000000000000000000000000000000000000000000018e000000000000000000000000000000000000000000000000000000000000018f0000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019100000000000000000000000000000000000000000000000000000000000001920000000000000000000000000000000000000000000000000000000000000193000000000000000000000000000000000000000000000000000000000000019400000000000000000000000000000000000000000000000000000000000001950000000000000000000000000000000000000000000000000000000000000196000000000000000000000000000000000000000000000000000000000000019700000000000000000000000000000000000000000000000000000000000001980000000000000000000000000000000000000000000000000000000000000199000000000000000000000000000000000000000000000000000000000000019a000000000000000000000000000000000000000000000000000000000000019b000000000000000000000000000000000000000000000000000000000000019c000000000000000000000000000000000000000000000000000000000000019d000000000000000000000000000000000000000000000000000000000000019e000000000000000000000000000000000000000000000000000000000000019f00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001a100000000000000000000000000000000000000000000000000000000000001a200000000000000000000000000000000000000000000000000000000000001a300000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000001a500000000000000000000000000000000000000000000000000000000000001a600000000000000000000000000000000000000000000000000000000000001a700000000000000000000000000000000000000000000000000000000000001a800000000000000000000000000000000000000000000000000000000000001a900000000000000000000000000000000000000000000000000000000000001aa00000000000000000000000000000000000000000000000000000000000001ab00000000000000000000000000000000000000000000000000000000000001ac00000000000000000000000000000000000000000000000000000000000001ad00000000000000000000000000000000000000000000000000000000000001ae00000000000000000000000000000000000000000000000000000000000001af00000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001b100000000000000000000000000000000000000000000000000000000000001b200000000000000000000000000000000000000000000000000000000000001b300000000000000000000000000000000000000000000000000000000000001b400000000000000000000000000000000000000000000000000000000000001b500000000000000000000000000000000000000000000000000000000000001b600000000000000000000000000000000000000000000000000000000000001b700000000000000000000000000000000000000000000000000000000000001b800000000000000000000000000000000000000000000000000000000000001b900000000000000000000000000000000000000000000000000000000000001ba00000000000000000000000000000000000000000000000000000000000001bb00000000000000000000000000000000000000000000000000000000000001bc00000000000000000000000000000000000000000000000000000000000001bd00000000000000000000000000000000000000000000000000000000000001be00000000000000000000000000000000000000000000000000000000000001bf3f0000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e000000000000000000000000000000000000000000000000000000000000028f0000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000029100000000000000000000000000000000000000000000000000000000000002920000000000000000000000000000000000000000000000000000000000000293000000000000000000000000000000000000000000000000000000000000029400000000000000000000000000000000000000000000000000000000000002950000000000000000000000000000000000000000000000000000000000000296000000000000000000000000000000000000000000000000000000000000029700000000000000000000000000000000000000000000000000000000000002980000000000000000000000000000000000000000000000000000000000000299000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000029b000000000000000000000000000000000000000000000000000000000000029c000000000000000000000000000000000000000000000000000000000000029d000000000000000000000000000000000000000000000000000000000000029e000000000000000000000000000000000000000000000000000000000000029f00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a100000000000000000000000000000000000000000000000000000000000002a200000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a500000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002a700000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002a900000000000000000000000000000000000000000000000000000000000002aa00000000000000000000000000000000000000000000000000000000000002ab00000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002ad00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002af00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b100000000000000000000000000000000000000000000000000000000000002b200000000000000000000000000000000000000000000000000000000000002b300000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b500000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002b700000000000000000000000000000000000000000000000000000000000002b800000000000000000000000000000000000000000000000000000000000002b900000000000000000000000000000000000000000000000000000000000002ba00000000000000000000000000000000000000000000000000000000000002bb00000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000002bd00000000000000000000000000000000000000000000000000000000000002be0800789ff73d7787206612d96dfc2143f2344de21669a3f8cae7fe9a8918631eb00084a17f00bf8793b6851a106e9155543125e0be987ad3c8334456bdda171d0b00a400f8fd336ad84f467465964008238fd1b7f9c51c22912d706cd2b874d24e002c79bdd83c14ff50a46964f838ee207564909e28af79a57fc195810d36f9b20070083c6ef1e4dd88a064e94d2582283b203cf8a2ab1667f4370eda1b4c1fe8005373dffb5b590053d7762efcf9e11280f1486ce82e7996d94ee0f5d7c093bc009eefd90eb40e79c78bac1f71ec78bdc2f8b30041974239bdc765edffed813800ea95742e72792ca7a0f66ce9f55bc47dc09d5ea08c1b9018763102776978303f0000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000058a0000000000000000000000000000000000000000000000000000000000000581000000000000000000000000000000000000000000000000000000000000058b0000000000000000000000000000000000000000000000000000000000000582000000000000000000000000000000000000000000000000000000000000058c0000000000000000000000000000000000000000000000000000000000000583000000000000000000000000000000000000000000000000000000000000058d0000000000000000000000000000000000000000000000000000000000000584000000000000000000000000000000000000000000000000000000000000058e0000000000000000000000000000000000000000000000000000000000000585000000000000000000000000000000000000000000000000000000000000058f00000000000000000000000000000000000000000000000000000000000005860000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000058700000000000000000000000000000000000000000000000000000000000005910000000000000000000000000000000000000000000000000000000000000588000000000000000000000000000000000000000000000000000000000000059200000000000000000000000000000000000000000000000000000000000005890000000000000000000000000000000000000000000000000000000000000593000000000000000000000000000000000000000000000000000000000000058a0000000000000000000000000000000000000000000000000000000000000594000000000000000000000000000000000000000000000000000000000000058b0000000000000000000000000000000000000000000000000000000000000595000000000000000000000000000000000000000000000000000000000000058c0000000000000000000000000000000000000000000000000000000000000596000000000000000000000000000000000000000000000000000000000000058d0000000000000000000000000000000000000000000000000000000000000597000000000000000000000000000000000000000000000000000000000000058e0000000000000000000000000000000000000000000000000000000000000598000000000000000000000000000000000000000000000000000000000000058f00000000000000000000000000000000000000000000000000000000000005990000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000059a0000000000000000000000000000000000000000000000000000000000000591000000000000000000000000000000000000000000000000000000000000059b0000000000000000000000000000000000000000000000000000000000000592000000000000000000000000000000000000000000000000000000000000059c0000000000000000000000000000000000000000000000000000000000000593000000000000000000000000000000000000000000000000000000000000059d0000000000000000000000000000000000000000000000000000000000000594000000000000000000000000000000000000000000000000000000000000059e0000000000000000000000000000000000000000000000000000000000000595000000000000000000000000000000000000000000000000000000000000059f000000000000000000000000000000000000000000000000000000000000059600000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000059700000000000000000000000000000000000000000000000000000000000005a1000000000000000000000000000000000000000000000000000000000000059800000000000000000000000000000000000000000000000000000000000005a2000000000000000000000000000000000000000000000000000000000000059900000000000000000000000000000000000000000000000000000000000005a3000000000000000000000000000000000000000000000000000000000000059a00000000000000000000000000000000000000000000000000000000000005a4000000000000000000000000000000000000000000000000000000000000059b00000000000000000000000000000000000000000000000000000000000005a5000000000000000000000000000000000000000000000000000000000000059c00000000000000000000000000000000000000000000000000000000000005a6000000000000000000000000000000000000000000000000000000000000059d00000000000000000000000000000000000000000000000000000000000005a7000000000000000000000000000000000000000000000000000000000000059e00000000000000000000000000000000000000000000000000000000000005a8000000000000000000000000000000000000000000000000000000000000059f00000000000000000000000000000000000000000000000000000000000005a900000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000005aa00000000000000000000000000000000000000000000000000000000000005a100000000000000000000000000000000000000000000000000000000000005ab00000000000000000000000000000000000000000000000000000000000005a200000000000000000000000000000000000000000000000000000000000005ac00000000000000000000000000000000000000000000000000000000000005a300000000000000000000000000000000000000000000000000000000000005ad00000000000000000000000000000000000000000000000000000000000005a400000000000000000000000000000000000000000000000000000000000005ae00000000000000000000000000000000000000000000000000000000000005a500000000000000000000000000000000000000000000000000000000000005af00000000000000000000000000000000000000000000000000000000000005a600000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000005a700000000000000000000000000000000000000000000000000000000000005b100000000000000000000000000000000000000000000000000000000000005a800000000000000000000000000000000000000000000000000000000000005b200000000000000000000000000000000000000000000000000000000000005a900000000000000000000000000000000000000000000000000000000000005b300000000000000000000000000000000000000000000000000000000000005aa00000000000000000000000000000000000000000000000000000000000005b400000000000000000000000000000000000000000000000000000000000005ab00000000000000000000000000000000000000000000000000000000000005b500000000000000000000000000000000000000000000000000000000000005ac00000000000000000000000000000000000000000000000000000000000005b600000000000000000000000000000000000000000000000000000000000005ad00000000000000000000000000000000000000000000000000000000000005b700000000000000000000000000000000000000000000000000000000000005ae00000000000000000000000000000000000000000000000000000000000005b800000000000000000000000000000000000000000000000000000000000005af00000000000000000000000000000000000000000000000000000000000005b900000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000005ba00000000000000000000000000000000000000000000000000000000000005b100000000000000000000000000000000000000000000000000000000000005bb00000000000000000000000000000000000000000000000000000000000005b200000000000000000000000000000000000000000000000000000000000005bc00000000000000000000000000000000000000000000000000000000000005b300000000000000000000000000000000000000000000000000000000000005bd00000000000000000000000000000000000000000000000000000000000005b400000000000000000000000000000000000000000000000000000000000005be00000000000000000000000000000000000000000000000000000000000005b500000000000000000000000000000000000000000000000000000000000005bf00000000000000000000000000000000000000000000000000000000000005b600000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005b700000000000000000000000000000000000000000000000000000000000005c100000000000000000000000000000000000000000000000000000000000005b800000000000000000000000000000000000000000000000000000000000005c200000000000000000000000000000000000000000000000000000000000005b900000000000000000000000000000000000000000000000000000000000005c300000000000000000000000000000000000000000000000000000000000005ba00000000000000000000000000000000000000000000000000000000000005c400000000000000000000000000000000000000000000000000000000000005bb00000000000000000000000000000000000000000000000000000000000005c500000000000000000000000000000000000000000000000000000000000005bc00000000000000000000000000000000000000000000000000000000000005c600000000000000000000000000000000000000000000000000000000000005bd00000000000000000000000000000000000000000000000000000000000005c700000000000000000000000000000000000000000000000000000000000005be00000000000000000000000000000000000000000000000000000000000005c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001c100000000000000000000000000000000000000000000000000000000000001c200000000000000000000000000000000000000000000000000000000000001c300000000000000000000000000000000000000000000000000000000000001c400000000000000000000000000000000000000000000000000000000000001c500000000000000000000000000000000000000000000000000000000000001c600000000000000000000000000000000000000000000000000000000000001c700000000000000000000000000000000000000000000000000000000000001c800000000000000000000000000000000000000000000000000000000000001c900000000000000000000000000000000000000000000000000000000000001ca00000000000000000000000000000000000000000000000000000000000001cb00000000000000000000000000000000000000000000000000000000000001cc00000000000000000000000000000000000000000000000000000000000001cd00000000000000000000000000000000000000000000000000000000000001ce00000000000000000000000000000000000000000000000000000000000001cf00000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001d100000000000000000000000000000000000000000000000000000000000001d200000000000000000000000000000000000000000000000000000000000001d300000000000000000000000000000000000000000000000000000000000001d400000000000000000000000000000000000000000000000000000000000001d500000000000000000000000000000000000000000000000000000000000001d600000000000000000000000000000000000000000000000000000000000001d700000000000000000000000000000000000000000000000000000000000001d800000000000000000000000000000000000000000000000000000000000001d900000000000000000000000000000000000000000000000000000000000001da00000000000000000000000000000000000000000000000000000000000001db00000000000000000000000000000000000000000000000000000000000001dc00000000000000000000000000000000000000000000000000000000000001dd00000000000000000000000000000000000000000000000000000000000001de00000000000000000000000000000000000000000000000000000000000001df00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e100000000000000000000000000000000000000000000000000000000000001e200000000000000000000000000000000000000000000000000000000000001e300000000000000000000000000000000000000000000000000000000000001e400000000000000000000000000000000000000000000000000000000000001e500000000000000000000000000000000000000000000000000000000000001e600000000000000000000000000000000000000000000000000000000000001e700000000000000000000000000000000000000000000000000000000000001e800000000000000000000000000000000000000000000000000000000000001e900000000000000000000000000000000000000000000000000000000000001ea00000000000000000000000000000000000000000000000000000000000001eb00000000000000000000000000000000000000000000000000000000000001ec00000000000000000000000000000000000000000000000000000000000001ed00000000000000000000000000000000000000000000000000000000000001ee00000000000000000000000000000000000000000000000000000000000001ef00000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000001f100000000000000000000000000000000000000000000000000000000000001f200000000000000000000000000000000000000000000000000000000000001f300000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000001f500000000000000000000000000000000000000000000000000000000000001f600000000000000000000000000000000000000000000000000000000000001f700000000000000000000000000000000000000000000000000000000000001f800000000000000000000000000000000000000000000000000000000000001f900000000000000000000000000000000000000000000000000000000000001fa00000000000000000000000000000000000000000000000000000000000001fb00000000000000000000000000000000000000000000000000000000000001fc00000000000000000000000000000000000000000000000000000000000001fd00000000000000000000000000000000000000000000000000000000000001fe00000000000000000000000000000000000000000000000000000000000001ff3f00000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c100000000000000000000000000000000000000000000000000000000000002c200000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c500000000000000000000000000000000000000000000000000000000000002c600000000000000000000000000000000000000000000000000000000000002c700000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002c900000000000000000000000000000000000000000000000000000000000002ca00000000000000000000000000000000000000000000000000000000000002cb00000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002cd00000000000000000000000000000000000000000000000000000000000002ce00000000000000000000000000000000000000000000000000000000000002cf00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d100000000000000000000000000000000000000000000000000000000000002d200000000000000000000000000000000000000000000000000000000000002d300000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d500000000000000000000000000000000000000000000000000000000000002d600000000000000000000000000000000000000000000000000000000000002d700000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002d900000000000000000000000000000000000000000000000000000000000002da00000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002dd00000000000000000000000000000000000000000000000000000000000002de00000000000000000000000000000000000000000000000000000000000002df00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e100000000000000000000000000000000000000000000000000000000000002e200000000000000000000000000000000000000000000000000000000000002e300000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e500000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000000000000000002e700000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002e900000000000000000000000000000000000000000000000000000000000002ea00000000000000000000000000000000000000000000000000000000000002eb00000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002ed00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000002ef00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f100000000000000000000000000000000000000000000000000000000000002f200000000000000000000000000000000000000000000000000000000000002f300000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f500000000000000000000000000000000000000000000000000000000000002f600000000000000000000000000000000000000000000000000000000000002f700000000000000000000000000000000000000000000000000000000000002f800000000000000000000000000000000000000000000000000000000000002f900000000000000000000000000000000000000000000000000000000000002fa00000000000000000000000000000000000000000000000000000000000002fb00000000000000000000000000000000000000000000000000000000000002fc00000000000000000000000000000000000000000000000000000000000002fd00000000000000000000000000000000000000000000000000000000000002fe0800a68d2df6e48c8b31f4c76529e586de2cd9d0f2f2fdfbc4c523db9e3a29e9b80016c236e57bf17afe324437acd1060772e3f31d4f9e734ad758d0627c4ba2a200d659011ddde95e32886bdd8c9464da1ca144ccadd539f0992b4abb491d812a00c8025bb9006a976ebd6ad940155f15f89ca0bb7312b53841fc257e7ed689c8004165f2c46b70fb183468b38f31bba7aa9d22ce8dfb61fe721470729ce1c6b100afeb60dd983514ebbaee141b2196f3eb3c9c299f576a0097872cc85a79a43f005f6bfee53d20a474901493558419dbceb3aca40e5e18915d38031498f4d2bb008791217ee341ec5dc11f7d7a31160fb1b1f2cf767062970e9526e5751956253f00000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005ca00000000000000000000000000000000000000000000000000000000000005c100000000000000000000000000000000000000000000000000000000000005cb00000000000000000000000000000000000000000000000000000000000005c200000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005c300000000000000000000000000000000000000000000000000000000000005cd00000000000000000000000000000000000000000000000000000000000005c400000000000000000000000000000000000000000000000000000000000005ce00000000000000000000000000000000000000000000000000000000000005c500000000000000000000000000000000000000000000000000000000000005cf00000000000000000000000000000000000000000000000000000000000005c600000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005c700000000000000000000000000000000000000000000000000000000000005d100000000000000000000000000000000000000000000000000000000000005c800000000000000000000000000000000000000000000000000000000000005d200000000000000000000000000000000000000000000000000000000000005c900000000000000000000000000000000000000000000000000000000000005d300000000000000000000000000000000000000000000000000000000000005ca00000000000000000000000000000000000000000000000000000000000005d400000000000000000000000000000000000000000000000000000000000005cb00000000000000000000000000000000000000000000000000000000000005d500000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005d600000000000000000000000000000000000000000000000000000000000005cd00000000000000000000000000000000000000000000000000000000000005d700000000000000000000000000000000000000000000000000000000000005ce00000000000000000000000000000000000000000000000000000000000005d800000000000000000000000000000000000000000000000000000000000005cf00000000000000000000000000000000000000000000000000000000000005d900000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005da00000000000000000000000000000000000000000000000000000000000005d100000000000000000000000000000000000000000000000000000000000005db00000000000000000000000000000000000000000000000000000000000005d200000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000005d300000000000000000000000000000000000000000000000000000000000005dd00000000000000000000000000000000000000000000000000000000000005d400000000000000000000000000000000000000000000000000000000000005de00000000000000000000000000000000000000000000000000000000000005d500000000000000000000000000000000000000000000000000000000000005df00000000000000000000000000000000000000000000000000000000000005d600000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000005d700000000000000000000000000000000000000000000000000000000000005e100000000000000000000000000000000000000000000000000000000000005d800000000000000000000000000000000000000000000000000000000000005e200000000000000000000000000000000000000000000000000000000000005d900000000000000000000000000000000000000000000000000000000000005e300000000000000000000000000000000000000000000000000000000000005da00000000000000000000000000000000000000000000000000000000000005e400000000000000000000000000000000000000000000000000000000000005db00000000000000000000000000000000000000000000000000000000000005e500000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000005e600000000000000000000000000000000000000000000000000000000000005dd00000000000000000000000000000000000000000000000000000000000005e700000000000000000000000000000000000000000000000000000000000005de00000000000000000000000000000000000000000000000000000000000005e800000000000000000000000000000000000000000000000000000000000005df00000000000000000000000000000000000000000000000000000000000005e900000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000005ea00000000000000000000000000000000000000000000000000000000000005e100000000000000000000000000000000000000000000000000000000000005eb00000000000000000000000000000000000000000000000000000000000005e200000000000000000000000000000000000000000000000000000000000005ec00000000000000000000000000000000000000000000000000000000000005e300000000000000000000000000000000000000000000000000000000000005ed00000000000000000000000000000000000000000000000000000000000005e400000000000000000000000000000000000000000000000000000000000005ee00000000000000000000000000000000000000000000000000000000000005e500000000000000000000000000000000000000000000000000000000000005ef00000000000000000000000000000000000000000000000000000000000005e600000000000000000000000000000000000000000000000000000000000005f000000000000000000000000000000000000000000000000000000000000005e700000000000000000000000000000000000000000000000000000000000005f100000000000000000000000000000000000000000000000000000000000005e800000000000000000000000000000000000000000000000000000000000005f200000000000000000000000000000000000000000000000000000000000005e900000000000000000000000000000000000000000000000000000000000005f300000000000000000000000000000000000000000000000000000000000005ea00000000000000000000000000000000000000000000000000000000000005f400000000000000000000000000000000000000000000000000000000000005eb00000000000000000000000000000000000000000000000000000000000005f500000000000000000000000000000000000000000000000000000000000005ec00000000000000000000000000000000000000000000000000000000000005f600000000000000000000000000000000000000000000000000000000000005ed00000000000000000000000000000000000000000000000000000000000005f700000000000000000000000000000000000000000000000000000000000005ee00000000000000000000000000000000000000000000000000000000000005f800000000000000000000000000000000000000000000000000000000000005ef00000000000000000000000000000000000000000000000000000000000005f900000000000000000000000000000000000000000000000000000000000005f000000000000000000000000000000000000000000000000000000000000005fa00000000000000000000000000000000000000000000000000000000000005f100000000000000000000000000000000000000000000000000000000000005fb00000000000000000000000000000000000000000000000000000000000005f200000000000000000000000000000000000000000000000000000000000005fc00000000000000000000000000000000000000000000000000000000000005f300000000000000000000000000000000000000000000000000000000000005fd00000000000000000000000000000000000000000000000000000000000005f400000000000000000000000000000000000000000000000000000000000005fe00000000000000000000000000000000000000000000000000000000000005f500000000000000000000000000000000000000000000000000000000000005ff00000000000000000000000000000000000000000000000000000000000005f6000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000005f7000000000000000000000000000000000000000000000000000000000000060100000000000000000000000000000000000000000000000000000000000005f8000000000000000000000000000000000000000000000000000000000000060200000000000000000000000000000000000000000000000000000000000005f9000000000000000000000000000000000000000000000000000000000000060300000000000000000000000000000000000000000000000000000000000005fa000000000000000000000000000000000000000000000000000000000000060400000000000000000000000000000000000000000000000000000000000005fb000000000000000000000000000000000000000000000000000000000000060500000000000000000000000000000000000000000000000000000000000005fc000000000000000000000000000000000000000000000000000000000000060600000000000000000000000000000000000000000000000000000000000005fd000000000000000000000000000000000000000000000000000000000000060700000000000000000000000000000000000000000000000000000000000005fe0000000000000000000000000000000000000000000000000000000000000608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020100000000000000000000000000000000000000000000000000000000000002020000000000000000000000000000000000000000000000000000000000000203000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000206000000000000000000000000000000000000000000000000000000000000020700000000000000000000000000000000000000000000000000000000000002080000000000000000000000000000000000000000000000000000000000000209000000000000000000000000000000000000000000000000000000000000020a000000000000000000000000000000000000000000000000000000000000020b000000000000000000000000000000000000000000000000000000000000020c000000000000000000000000000000000000000000000000000000000000020d000000000000000000000000000000000000000000000000000000000000020e000000000000000000000000000000000000000000000000000000000000020f0000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000000021100000000000000000000000000000000000000000000000000000000000002120000000000000000000000000000000000000000000000000000000000000213000000000000000000000000000000000000000000000000000000000000021400000000000000000000000000000000000000000000000000000000000002150000000000000000000000000000000000000000000000000000000000000216000000000000000000000000000000000000000000000000000000000000021700000000000000000000000000000000000000000000000000000000000002180000000000000000000000000000000000000000000000000000000000000219000000000000000000000000000000000000000000000000000000000000021a000000000000000000000000000000000000000000000000000000000000021b000000000000000000000000000000000000000000000000000000000000021c000000000000000000000000000000000000000000000000000000000000021d000000000000000000000000000000000000000000000000000000000000021e000000000000000000000000000000000000000000000000000000000000021f0000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000022100000000000000000000000000000000000000000000000000000000000002220000000000000000000000000000000000000000000000000000000000000223000000000000000000000000000000000000000000000000000000000000022400000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000226000000000000000000000000000000000000000000000000000000000000022700000000000000000000000000000000000000000000000000000000000002280000000000000000000000000000000000000000000000000000000000000229000000000000000000000000000000000000000000000000000000000000022a000000000000000000000000000000000000000000000000000000000000022b000000000000000000000000000000000000000000000000000000000000022c000000000000000000000000000000000000000000000000000000000000022d000000000000000000000000000000000000000000000000000000000000022e000000000000000000000000000000000000000000000000000000000000022f0000000000000000000000000000000000000000000000000000000000000230000000000000000000000000000000000000000000000000000000000000023100000000000000000000000000000000000000000000000000000000000002320000000000000000000000000000000000000000000000000000000000000233000000000000000000000000000000000000000000000000000000000000023400000000000000000000000000000000000000000000000000000000000002350000000000000000000000000000000000000000000000000000000000000236000000000000000000000000000000000000000000000000000000000000023700000000000000000000000000000000000000000000000000000000000002380000000000000000000000000000000000000000000000000000000000000239000000000000000000000000000000000000000000000000000000000000023a000000000000000000000000000000000000000000000000000000000000023b000000000000000000000000000000000000000000000000000000000000023c000000000000000000000000000000000000000000000000000000000000023d000000000000000000000000000000000000000000000000000000000000023e000000000000000000000000000000000000000000000000000000000000023f3f0000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030100000000000000000000000000000000000000000000000000000000000003020000000000000000000000000000000000000000000000000000000000000303000000000000000000000000000000000000000000000000000000000000030400000000000000000000000000000000000000000000000000000000000003050000000000000000000000000000000000000000000000000000000000000306000000000000000000000000000000000000000000000000000000000000030700000000000000000000000000000000000000000000000000000000000003080000000000000000000000000000000000000000000000000000000000000309000000000000000000000000000000000000000000000000000000000000030a000000000000000000000000000000000000000000000000000000000000030b000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000030d000000000000000000000000000000000000000000000000000000000000030e000000000000000000000000000000000000000000000000000000000000030f0000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000031100000000000000000000000000000000000000000000000000000000000003120000000000000000000000000000000000000000000000000000000000000313000000000000000000000000000000000000000000000000000000000000031400000000000000000000000000000000000000000000000000000000000003150000000000000000000000000000000000000000000000000000000000000316000000000000000000000000000000000000000000000000000000000000031700000000000000000000000000000000000000000000000000000000000003180000000000000000000000000000000000000000000000000000000000000319000000000000000000000000000000000000000000000000000000000000031a000000000000000000000000000000000000000000000000000000000000031b000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000031d000000000000000000000000000000000000000000000000000000000000031e000000000000000000000000000000000000000000000000000000000000031f0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032100000000000000000000000000000000000000000000000000000000000003220000000000000000000000000000000000000000000000000000000000000323000000000000000000000000000000000000000000000000000000000000032400000000000000000000000000000000000000000000000000000000000003250000000000000000000000000000000000000000000000000000000000000326000000000000000000000000000000000000000000000000000000000000032700000000000000000000000000000000000000000000000000000000000003280000000000000000000000000000000000000000000000000000000000000329000000000000000000000000000000000000000000000000000000000000032a000000000000000000000000000000000000000000000000000000000000032b000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000032d000000000000000000000000000000000000000000000000000000000000032e000000000000000000000000000000000000000000000000000000000000032f0000000000000000000000000000000000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000033100000000000000000000000000000000000000000000000000000000000003320000000000000000000000000000000000000000000000000000000000000333000000000000000000000000000000000000000000000000000000000000033400000000000000000000000000000000000000000000000000000000000003350000000000000000000000000000000000000000000000000000000000000336000000000000000000000000000000000000000000000000000000000000033700000000000000000000000000000000000000000000000000000000000003380000000000000000000000000000000000000000000000000000000000000339000000000000000000000000000000000000000000000000000000000000033a000000000000000000000000000000000000000000000000000000000000033b000000000000000000000000000000000000000000000000000000000000033c000000000000000000000000000000000000000000000000000000000000033d000000000000000000000000000000000000000000000000000000000000033e0800c064a9343bfaf1345a5ad188e96aa4c5bad0b4a5590da51a9ff8f3c98ade8d008803d57dd0923c95a01b2bfbee4df6d66dc7baee1d2cd2770575feb86d040200ea64eed9489feb7bdf29bf817a6e8772e549da7b291028852d0dd3810cee9500947e8f904d41be8a4e08b146b4e1f0cd88f55722ef987d1d485c4196ab9f71002e5d9ed5d71bc3bea6edf988c4b9ba7fceb0815180d893852ed343c64ab55c0040f7f519ec89d360d83e242b6c0ce049d2b3356b8cfbf1ff3b733ef0f8a089006f5cfe5fc4a7b87c634f9e253a7cea2052229250d0c0e913eb50b5ef3612de00b759fce0eed36bb653b67255cce111b3529c383bd7d2b758f8cb53a4451f273f0000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060a0000000000000000000000000000000000000000000000000000000000000601000000000000000000000000000000000000000000000000000000000000060b0000000000000000000000000000000000000000000000000000000000000602000000000000000000000000000000000000000000000000000000000000060c0000000000000000000000000000000000000000000000000000000000000603000000000000000000000000000000000000000000000000000000000000060d0000000000000000000000000000000000000000000000000000000000000604000000000000000000000000000000000000000000000000000000000000060e0000000000000000000000000000000000000000000000000000000000000605000000000000000000000000000000000000000000000000000000000000060f00000000000000000000000000000000000000000000000000000000000006060000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000060700000000000000000000000000000000000000000000000000000000000006110000000000000000000000000000000000000000000000000000000000000608000000000000000000000000000000000000000000000000000000000000061200000000000000000000000000000000000000000000000000000000000006090000000000000000000000000000000000000000000000000000000000000613000000000000000000000000000000000000000000000000000000000000060a0000000000000000000000000000000000000000000000000000000000000614000000000000000000000000000000000000000000000000000000000000060b0000000000000000000000000000000000000000000000000000000000000615000000000000000000000000000000000000000000000000000000000000060c0000000000000000000000000000000000000000000000000000000000000616000000000000000000000000000000000000000000000000000000000000060d0000000000000000000000000000000000000000000000000000000000000617000000000000000000000000000000000000000000000000000000000000060e0000000000000000000000000000000000000000000000000000000000000618000000000000000000000000000000000000000000000000000000000000060f00000000000000000000000000000000000000000000000000000000000006190000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000061a0000000000000000000000000000000000000000000000000000000000000611000000000000000000000000000000000000000000000000000000000000061b0000000000000000000000000000000000000000000000000000000000000612000000000000000000000000000000000000000000000000000000000000061c0000000000000000000000000000000000000000000000000000000000000613000000000000000000000000000000000000000000000000000000000000061d0000000000000000000000000000000000000000000000000000000000000614000000000000000000000000000000000000000000000000000000000000061e0000000000000000000000000000000000000000000000000000000000000615000000000000000000000000000000000000000000000000000000000000061f00000000000000000000000000000000000000000000000000000000000006160000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000061700000000000000000000000000000000000000000000000000000000000006210000000000000000000000000000000000000000000000000000000000000618000000000000000000000000000000000000000000000000000000000000062200000000000000000000000000000000000000000000000000000000000006190000000000000000000000000000000000000000000000000000000000000623000000000000000000000000000000000000000000000000000000000000061a0000000000000000000000000000000000000000000000000000000000000624000000000000000000000000000000000000000000000000000000000000061b0000000000000000000000000000000000000000000000000000000000000625000000000000000000000000000000000000000000000000000000000000061c0000000000000000000000000000000000000000000000000000000000000626000000000000000000000000000000000000000000000000000000000000061d0000000000000000000000000000000000000000000000000000000000000627000000000000000000000000000000000000000000000000000000000000061e0000000000000000000000000000000000000000000000000000000000000628000000000000000000000000000000000000000000000000000000000000061f00000000000000000000000000000000000000000000000000000000000006290000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000062a0000000000000000000000000000000000000000000000000000000000000621000000000000000000000000000000000000000000000000000000000000062b0000000000000000000000000000000000000000000000000000000000000622000000000000000000000000000000000000000000000000000000000000062c0000000000000000000000000000000000000000000000000000000000000623000000000000000000000000000000000000000000000000000000000000062d0000000000000000000000000000000000000000000000000000000000000624000000000000000000000000000000000000000000000000000000000000062e0000000000000000000000000000000000000000000000000000000000000625000000000000000000000000000000000000000000000000000000000000062f00000000000000000000000000000000000000000000000000000000000006260000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000062700000000000000000000000000000000000000000000000000000000000006310000000000000000000000000000000000000000000000000000000000000628000000000000000000000000000000000000000000000000000000000000063200000000000000000000000000000000000000000000000000000000000006290000000000000000000000000000000000000000000000000000000000000633000000000000000000000000000000000000000000000000000000000000062a0000000000000000000000000000000000000000000000000000000000000634000000000000000000000000000000000000000000000000000000000000062b0000000000000000000000000000000000000000000000000000000000000635000000000000000000000000000000000000000000000000000000000000062c0000000000000000000000000000000000000000000000000000000000000636000000000000000000000000000000000000000000000000000000000000062d0000000000000000000000000000000000000000000000000000000000000637000000000000000000000000000000000000000000000000000000000000062e0000000000000000000000000000000000000000000000000000000000000638000000000000000000000000000000000000000000000000000000000000062f00000000000000000000000000000000000000000000000000000000000006390000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000063a0000000000000000000000000000000000000000000000000000000000000631000000000000000000000000000000000000000000000000000000000000063b0000000000000000000000000000000000000000000000000000000000000632000000000000000000000000000000000000000000000000000000000000063c0000000000000000000000000000000000000000000000000000000000000633000000000000000000000000000000000000000000000000000000000000063d0000000000000000000000000000000000000000000000000000000000000634000000000000000000000000000000000000000000000000000000000000063e0000000000000000000000000000000000000000000000000000000000000635000000000000000000000000000000000000000000000000000000000000063f00000000000000000000000000000000000000000000000000000000000006360000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000063700000000000000000000000000000000000000000000000000000000000006410000000000000000000000000000000000000000000000000000000000000638000000000000000000000000000000000000000000000000000000000000064200000000000000000000000000000000000000000000000000000000000006390000000000000000000000000000000000000000000000000000000000000643000000000000000000000000000000000000000000000000000000000000063a0000000000000000000000000000000000000000000000000000000000000644000000000000000000000000000000000000000000000000000000000000063b0000000000000000000000000000000000000000000000000000000000000645000000000000000000000000000000000000000000000000000000000000063c0000000000000000000000000000000000000000000000000000000000000646000000000000000000000000000000000000000000000000000000000000063d0000000000000000000000000000000000000000000000000000000000000647000000000000000000000000000000000000000000000000000000000000063e0000000000000000000000000000000000000000000000000000000000000648000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "txsEffectsHash": "0x00e7daa0660d17d3ae04747bd24c7238da34e77cb04b0b9dd2843dd08f0fd87b", "decodedHeader": { @@ -72,10 +73,10 @@ "blockNumber": 1, "slotNumber": "0x0000000000000000000000000000000000000000000000000000000000000036", "chainId": 31337, - "timestamp": 1725363553, + "timestamp": 1727207917, "version": 1, - "coinbase": "0x8b4e0a203a4cb152c773e772e885992eae96c1f5", - "feeRecipient": "0x2e8dcd300baa8f3802239585fb4b2cd9e80da86f6107dff3c3214ae9098937d2", + "coinbase": "0x47df7fa0407be5ecb80fb4f6441b8e38e4368bc5", + "feeRecipient": "0x09a496f12ed3c5b7a3487bf866dab5c856207360f96e7510cb501b04725de16c", "gasFees": { "feePerDaGas": 0, "feePerL2Gas": 0 @@ -106,8 +107,8 @@ } } }, - "header": "0x1200a06aae1368abe36530b585bd7a4d2ba4de5037b82076412691a187d7621e00000001000000000000000000000000000000000000000000000000000000000000000400e7daa0660d17d3ae04747bd24c7238da34e77cb04b0b9dd2843dd08f0fd87b00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00d0169cc64b8f1bd695ec8611a5602da48854dc4cc04989c4b63288b339cb1814f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000101a995cda6f326074cf650c6644269e29dbd0532e6a832238345b53ee70c878af000001000deac8396e31bc1196b442ad724bf8f751a245e518147d738cc84b9e1a56b4420000018023866f4c16f3ea1f37dd2ca42d1a635ea909b6c016e45e8434780d3741eb7dbb000001800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000066d6f5618b4e0a203a4cb152c773e772e885992eae96c1f52e8dcd300baa8f3802239585fb4b2cd9e80da86f6107dff3c3214ae9098937d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "publicInputsHash": "0x0071c722ed49fb32154c380d246094e2bd6a10c9e0d9f779b00fe3e812a8f553", + "header": "0x1200a06aae1368abe36530b585bd7a4d2ba4de5037b82076412691a187d7621e00000001000000000000000000000000000000000000000000000000000000000000000400e7daa0660d17d3ae04747bd24c7238da34e77cb04b0b9dd2843dd08f0fd87b00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00d0169cc64b8f1bd695ec8611a5602da48854dc4cc04989c4b63288b339cb1814f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000101a995cda6f326074cf650c6644269e29dbd0532e6a832238345b53ee70c878af000001000deac8396e31bc1196b442ad724bf8f751a245e518147d738cc84b9e1a56b4420000018023866f4c16f3ea1f37dd2ca42d1a635ea909b6c016e45e8434780d3741eb7dbb000001800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000066f319ed47df7fa0407be5ecb80fb4f6441b8e38e4368bc509a496f12ed3c5b7a3487bf866dab5c856207360f96e7510cb501b04725de16c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "publicInputsHash": "0x004246582d4cef3d0a95d4b0438f22ec827ec404d8771aae8e58cb797e570d2a", "numTxs": 4 } } \ No newline at end of file diff --git a/l1-contracts/test/fixtures/mixed_block_2.json b/l1-contracts/test/fixtures/mixed_block_2.json index 5f657e3cb5e..70767f41295 100644 --- a/l1-contracts/test/fixtures/mixed_block_2.json +++ b/l1-contracts/test/fixtures/mixed_block_2.json @@ -23,6 +23,38 @@ }, "messages": { "l2ToL1Messages": [ + "0x00c47667396742a5474f325e2567bff3bb99b7f0bfd2b1a689b635d8b8726cce", + "0x00284120278895e8d47084ae759f390e9634881e41369a257a36fe99a2369dc8", + "0x00a328b4a4a6ed156325253b4ab2af7ca00e21caf7963f0fba8a88ccdc3512c3", + "0x00705c99df420bface231f6855799db1d0ed7d39419abc47aa8c6efe2ae7aae2", + "0x009299cc308de6d23788384411e024791a5b2448e455fbdd1d1f28f3ff76631f", + "0x002d6c03d81ad764de51b0f34584645191cdc2aaae2ca08fb838d142b95d62f5", + "0x003032f3618b2df0fa335d5fd548d6d85e42b4e7eb5fff9eb687facbbdecb8a6", + "0x0016cab7ddf4d1b440d53d10284c5c82a78b2d4e27dcdb44ef434ef4c6bad678", + "0x00789ff73d7787206612d96dfc2143f2344de21669a3f8cae7fe9a8918631eb0", + "0x0084a17f00bf8793b6851a106e9155543125e0be987ad3c8334456bdda171d0b", + "0x00a400f8fd336ad84f467465964008238fd1b7f9c51c22912d706cd2b874d24e", + "0x002c79bdd83c14ff50a46964f838ee207564909e28af79a57fc195810d36f9b2", + "0x0070083c6ef1e4dd88a064e94d2582283b203cf8a2ab1667f4370eda1b4c1fe8", + "0x005373dffb5b590053d7762efcf9e11280f1486ce82e7996d94ee0f5d7c093bc", + "0x009eefd90eb40e79c78bac1f71ec78bdc2f8b30041974239bdc765edffed8138", + "0x00ea95742e72792ca7a0f66ce9f55bc47dc09d5ea08c1b901876310277697830", + "0x00a68d2df6e48c8b31f4c76529e586de2cd9d0f2f2fdfbc4c523db9e3a29e9b8", + "0x0016c236e57bf17afe324437acd1060772e3f31d4f9e734ad758d0627c4ba2a2", + "0x00d659011ddde95e32886bdd8c9464da1ca144ccadd539f0992b4abb491d812a", + "0x00c8025bb9006a976ebd6ad940155f15f89ca0bb7312b53841fc257e7ed689c8", + "0x004165f2c46b70fb183468b38f31bba7aa9d22ce8dfb61fe721470729ce1c6b1", + "0x00afeb60dd983514ebbaee141b2196f3eb3c9c299f576a0097872cc85a79a43f", + "0x005f6bfee53d20a474901493558419dbceb3aca40e5e18915d38031498f4d2bb", + "0x008791217ee341ec5dc11f7d7a31160fb1b1f2cf767062970e9526e575195625", + "0x00c064a9343bfaf1345a5ad188e96aa4c5bad0b4a5590da51a9ff8f3c98ade8d", + "0x008803d57dd0923c95a01b2bfbee4df6d66dc7baee1d2cd2770575feb86d0402", + "0x00ea64eed9489feb7bdf29bf817a6e8772e549da7b291028852d0dd3810cee95", + "0x00947e8f904d41be8a4e08b146b4e1f0cd88f55722ef987d1d485c4196ab9f71", + "0x002e5d9ed5d71bc3bea6edf988c4b9ba7fceb0815180d893852ed343c64ab55c", + "0x0040f7f519ec89d360d83e242b6c0ce049d2b3356b8cfbf1ff3b733ef0f8a089", + "0x006f5cfe5fc4a7b87c634f9e253a7cea2052229250d0c0e913eb50b5ef3612de", + "0x00b759fce0eed36bb653b67255cce111b3529c383bd7d2b758f8cb53a4451f27", "0x003bbb1177505f3433bb062787fcac6585d30fa1a7e0b809ca5eef1cecc56cd0", "0x002d5b86280022d106b72e4425ea49f927ca2b8138fc13b3d9feeaf36ae61fb1", "0x00adab9d66b73ae23a6e9127ebe0bcd963ef4312dd66878a6be131d39a7ee01c", @@ -58,24 +90,25 @@ ] }, "block": { - "archive": "0x10c574d7d51855bc971ce1dc2dfb7266e5ac050d424022ea4d36b883e8a53886", - "body": "0x00000004000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e000000000000000000000000000000000000000000000000000000000000024f0000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000025100000000000000000000000000000000000000000000000000000000000002520000000000000000000000000000000000000000000000000000000000000253000000000000000000000000000000000000000000000000000000000000025400000000000000000000000000000000000000000000000000000000000002550000000000000000000000000000000000000000000000000000000000000256000000000000000000000000000000000000000000000000000000000000025700000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000025a000000000000000000000000000000000000000000000000000000000000025b000000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000025d000000000000000000000000000000000000000000000000000000000000025e000000000000000000000000000000000000000000000000000000000000025f0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e000000000000000000000000000000000000000000000000000000000000026f0000000000000000000000000000000000000000000000000000000000000270000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000002720000000000000000000000000000000000000000000000000000000000000273000000000000000000000000000000000000000000000000000000000000027400000000000000000000000000000000000000000000000000000000000002750000000000000000000000000000000000000000000000000000000000000276000000000000000000000000000000000000000000000000000000000000027700000000000000000000000000000000000000000000000000000000000002780000000000000000000000000000000000000000000000000000000000000279000000000000000000000000000000000000000000000000000000000000027a000000000000000000000000000000000000000000000000000000000000027b000000000000000000000000000000000000000000000000000000000000027c000000000000000000000000000000000000000000000000000000000000027d000000000000000000000000000000000000000000000000000000000000027e000000000000000000000000000000000000000000000000000000000000027f3f0000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000034100000000000000000000000000000000000000000000000000000000000003420000000000000000000000000000000000000000000000000000000000000343000000000000000000000000000000000000000000000000000000000000034400000000000000000000000000000000000000000000000000000000000003450000000000000000000000000000000000000000000000000000000000000346000000000000000000000000000000000000000000000000000000000000034700000000000000000000000000000000000000000000000000000000000003480000000000000000000000000000000000000000000000000000000000000349000000000000000000000000000000000000000000000000000000000000034a000000000000000000000000000000000000000000000000000000000000034b000000000000000000000000000000000000000000000000000000000000034c000000000000000000000000000000000000000000000000000000000000034d000000000000000000000000000000000000000000000000000000000000034e000000000000000000000000000000000000000000000000000000000000034f0000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000035100000000000000000000000000000000000000000000000000000000000003520000000000000000000000000000000000000000000000000000000000000353000000000000000000000000000000000000000000000000000000000000035400000000000000000000000000000000000000000000000000000000000003550000000000000000000000000000000000000000000000000000000000000356000000000000000000000000000000000000000000000000000000000000035700000000000000000000000000000000000000000000000000000000000003580000000000000000000000000000000000000000000000000000000000000359000000000000000000000000000000000000000000000000000000000000035a000000000000000000000000000000000000000000000000000000000000035b000000000000000000000000000000000000000000000000000000000000035c000000000000000000000000000000000000000000000000000000000000035d000000000000000000000000000000000000000000000000000000000000035e000000000000000000000000000000000000000000000000000000000000035f0000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000036100000000000000000000000000000000000000000000000000000000000003620000000000000000000000000000000000000000000000000000000000000363000000000000000000000000000000000000000000000000000000000000036400000000000000000000000000000000000000000000000000000000000003650000000000000000000000000000000000000000000000000000000000000366000000000000000000000000000000000000000000000000000000000000036700000000000000000000000000000000000000000000000000000000000003680000000000000000000000000000000000000000000000000000000000000369000000000000000000000000000000000000000000000000000000000000036a000000000000000000000000000000000000000000000000000000000000036b000000000000000000000000000000000000000000000000000000000000036c000000000000000000000000000000000000000000000000000000000000036d000000000000000000000000000000000000000000000000000000000000036e000000000000000000000000000000000000000000000000000000000000036f0000000000000000000000000000000000000000000000000000000000000370000000000000000000000000000000000000000000000000000000000000037100000000000000000000000000000000000000000000000000000000000003720000000000000000000000000000000000000000000000000000000000000373000000000000000000000000000000000000000000000000000000000000037400000000000000000000000000000000000000000000000000000000000003750000000000000000000000000000000000000000000000000000000000000376000000000000000000000000000000000000000000000000000000000000037700000000000000000000000000000000000000000000000000000000000003780000000000000000000000000000000000000000000000000000000000000379000000000000000000000000000000000000000000000000000000000000037a000000000000000000000000000000000000000000000000000000000000037b000000000000000000000000000000000000000000000000000000000000037c000000000000000000000000000000000000000000000000000000000000037d000000000000000000000000000000000000000000000000000000000000037e08003bbb1177505f3433bb062787fcac6585d30fa1a7e0b809ca5eef1cecc56cd0002d5b86280022d106b72e4425ea49f927ca2b8138fc13b3d9feeaf36ae61fb100adab9d66b73ae23a6e9127ebe0bcd963ef4312dd66878a6be131d39a7ee01c00d48f30dbb82c96c734c8abe33f4f9f75e6d0ba4462ee07d73c5335e04a02e900f31a3a4e7333ac6043a929fca12f5347e9e8bf1d67f5993860a774f10b77bc00230e3132bfa5df23e2e018b20cd4e0c75555825ee7924da73f017a279d39cd0095e2affd6b67c6ecbf77fa1e638139498e1642abb468c58ca8ce275260ea6100362e0941035fd171fab926caf55d18b22f7de99d60ac6f454386a9cce4a1ff3f0000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064a0000000000000000000000000000000000000000000000000000000000000641000000000000000000000000000000000000000000000000000000000000064b0000000000000000000000000000000000000000000000000000000000000642000000000000000000000000000000000000000000000000000000000000064c0000000000000000000000000000000000000000000000000000000000000643000000000000000000000000000000000000000000000000000000000000064d0000000000000000000000000000000000000000000000000000000000000644000000000000000000000000000000000000000000000000000000000000064e0000000000000000000000000000000000000000000000000000000000000645000000000000000000000000000000000000000000000000000000000000064f00000000000000000000000000000000000000000000000000000000000006460000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000064700000000000000000000000000000000000000000000000000000000000006510000000000000000000000000000000000000000000000000000000000000648000000000000000000000000000000000000000000000000000000000000065200000000000000000000000000000000000000000000000000000000000006490000000000000000000000000000000000000000000000000000000000000653000000000000000000000000000000000000000000000000000000000000064a0000000000000000000000000000000000000000000000000000000000000654000000000000000000000000000000000000000000000000000000000000064b0000000000000000000000000000000000000000000000000000000000000655000000000000000000000000000000000000000000000000000000000000064c0000000000000000000000000000000000000000000000000000000000000656000000000000000000000000000000000000000000000000000000000000064d0000000000000000000000000000000000000000000000000000000000000657000000000000000000000000000000000000000000000000000000000000064e0000000000000000000000000000000000000000000000000000000000000658000000000000000000000000000000000000000000000000000000000000064f00000000000000000000000000000000000000000000000000000000000006590000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000065a0000000000000000000000000000000000000000000000000000000000000651000000000000000000000000000000000000000000000000000000000000065b0000000000000000000000000000000000000000000000000000000000000652000000000000000000000000000000000000000000000000000000000000065c0000000000000000000000000000000000000000000000000000000000000653000000000000000000000000000000000000000000000000000000000000065d0000000000000000000000000000000000000000000000000000000000000654000000000000000000000000000000000000000000000000000000000000065e0000000000000000000000000000000000000000000000000000000000000655000000000000000000000000000000000000000000000000000000000000065f00000000000000000000000000000000000000000000000000000000000006560000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000065700000000000000000000000000000000000000000000000000000000000006610000000000000000000000000000000000000000000000000000000000000658000000000000000000000000000000000000000000000000000000000000066200000000000000000000000000000000000000000000000000000000000006590000000000000000000000000000000000000000000000000000000000000663000000000000000000000000000000000000000000000000000000000000065a0000000000000000000000000000000000000000000000000000000000000664000000000000000000000000000000000000000000000000000000000000065b0000000000000000000000000000000000000000000000000000000000000665000000000000000000000000000000000000000000000000000000000000065c0000000000000000000000000000000000000000000000000000000000000666000000000000000000000000000000000000000000000000000000000000065d0000000000000000000000000000000000000000000000000000000000000667000000000000000000000000000000000000000000000000000000000000065e0000000000000000000000000000000000000000000000000000000000000668000000000000000000000000000000000000000000000000000000000000065f00000000000000000000000000000000000000000000000000000000000006690000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000066a0000000000000000000000000000000000000000000000000000000000000661000000000000000000000000000000000000000000000000000000000000066b0000000000000000000000000000000000000000000000000000000000000662000000000000000000000000000000000000000000000000000000000000066c0000000000000000000000000000000000000000000000000000000000000663000000000000000000000000000000000000000000000000000000000000066d0000000000000000000000000000000000000000000000000000000000000664000000000000000000000000000000000000000000000000000000000000066e0000000000000000000000000000000000000000000000000000000000000665000000000000000000000000000000000000000000000000000000000000066f00000000000000000000000000000000000000000000000000000000000006660000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000066700000000000000000000000000000000000000000000000000000000000006710000000000000000000000000000000000000000000000000000000000000668000000000000000000000000000000000000000000000000000000000000067200000000000000000000000000000000000000000000000000000000000006690000000000000000000000000000000000000000000000000000000000000673000000000000000000000000000000000000000000000000000000000000066a0000000000000000000000000000000000000000000000000000000000000674000000000000000000000000000000000000000000000000000000000000066b0000000000000000000000000000000000000000000000000000000000000675000000000000000000000000000000000000000000000000000000000000066c0000000000000000000000000000000000000000000000000000000000000676000000000000000000000000000000000000000000000000000000000000066d0000000000000000000000000000000000000000000000000000000000000677000000000000000000000000000000000000000000000000000000000000066e0000000000000000000000000000000000000000000000000000000000000678000000000000000000000000000000000000000000000000000000000000066f00000000000000000000000000000000000000000000000000000000000006790000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000067a0000000000000000000000000000000000000000000000000000000000000671000000000000000000000000000000000000000000000000000000000000067b0000000000000000000000000000000000000000000000000000000000000672000000000000000000000000000000000000000000000000000000000000067c0000000000000000000000000000000000000000000000000000000000000673000000000000000000000000000000000000000000000000000000000000067d0000000000000000000000000000000000000000000000000000000000000674000000000000000000000000000000000000000000000000000000000000067e0000000000000000000000000000000000000000000000000000000000000675000000000000000000000000000000000000000000000000000000000000067f00000000000000000000000000000000000000000000000000000000000006760000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000067700000000000000000000000000000000000000000000000000000000000006810000000000000000000000000000000000000000000000000000000000000678000000000000000000000000000000000000000000000000000000000000068200000000000000000000000000000000000000000000000000000000000006790000000000000000000000000000000000000000000000000000000000000683000000000000000000000000000000000000000000000000000000000000067a0000000000000000000000000000000000000000000000000000000000000684000000000000000000000000000000000000000000000000000000000000067b0000000000000000000000000000000000000000000000000000000000000685000000000000000000000000000000000000000000000000000000000000067c0000000000000000000000000000000000000000000000000000000000000686000000000000000000000000000000000000000000000000000000000000067d0000000000000000000000000000000000000000000000000000000000000687000000000000000000000000000000000000000000000000000000000000067e0000000000000000000000000000000000000000000000000000000000000688000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e000000000000000000000000000000000000000000000000000000000000028f0000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000029100000000000000000000000000000000000000000000000000000000000002920000000000000000000000000000000000000000000000000000000000000293000000000000000000000000000000000000000000000000000000000000029400000000000000000000000000000000000000000000000000000000000002950000000000000000000000000000000000000000000000000000000000000296000000000000000000000000000000000000000000000000000000000000029700000000000000000000000000000000000000000000000000000000000002980000000000000000000000000000000000000000000000000000000000000299000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000029b000000000000000000000000000000000000000000000000000000000000029c000000000000000000000000000000000000000000000000000000000000029d000000000000000000000000000000000000000000000000000000000000029e000000000000000000000000000000000000000000000000000000000000029f00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a100000000000000000000000000000000000000000000000000000000000002a200000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a500000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002a700000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002a900000000000000000000000000000000000000000000000000000000000002aa00000000000000000000000000000000000000000000000000000000000002ab00000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002ad00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002af00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b100000000000000000000000000000000000000000000000000000000000002b200000000000000000000000000000000000000000000000000000000000002b300000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b500000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002b700000000000000000000000000000000000000000000000000000000000002b800000000000000000000000000000000000000000000000000000000000002b900000000000000000000000000000000000000000000000000000000000002ba00000000000000000000000000000000000000000000000000000000000002bb00000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000002bd00000000000000000000000000000000000000000000000000000000000002be00000000000000000000000000000000000000000000000000000000000002bf3f0000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000038100000000000000000000000000000000000000000000000000000000000003820000000000000000000000000000000000000000000000000000000000000383000000000000000000000000000000000000000000000000000000000000038400000000000000000000000000000000000000000000000000000000000003850000000000000000000000000000000000000000000000000000000000000386000000000000000000000000000000000000000000000000000000000000038700000000000000000000000000000000000000000000000000000000000003880000000000000000000000000000000000000000000000000000000000000389000000000000000000000000000000000000000000000000000000000000038a000000000000000000000000000000000000000000000000000000000000038b000000000000000000000000000000000000000000000000000000000000038c000000000000000000000000000000000000000000000000000000000000038d000000000000000000000000000000000000000000000000000000000000038e000000000000000000000000000000000000000000000000000000000000038f0000000000000000000000000000000000000000000000000000000000000390000000000000000000000000000000000000000000000000000000000000039100000000000000000000000000000000000000000000000000000000000003920000000000000000000000000000000000000000000000000000000000000393000000000000000000000000000000000000000000000000000000000000039400000000000000000000000000000000000000000000000000000000000003950000000000000000000000000000000000000000000000000000000000000396000000000000000000000000000000000000000000000000000000000000039700000000000000000000000000000000000000000000000000000000000003980000000000000000000000000000000000000000000000000000000000000399000000000000000000000000000000000000000000000000000000000000039a000000000000000000000000000000000000000000000000000000000000039b000000000000000000000000000000000000000000000000000000000000039c000000000000000000000000000000000000000000000000000000000000039d000000000000000000000000000000000000000000000000000000000000039e000000000000000000000000000000000000000000000000000000000000039f00000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003a100000000000000000000000000000000000000000000000000000000000003a200000000000000000000000000000000000000000000000000000000000003a300000000000000000000000000000000000000000000000000000000000003a400000000000000000000000000000000000000000000000000000000000003a500000000000000000000000000000000000000000000000000000000000003a600000000000000000000000000000000000000000000000000000000000003a700000000000000000000000000000000000000000000000000000000000003a800000000000000000000000000000000000000000000000000000000000003a900000000000000000000000000000000000000000000000000000000000003aa00000000000000000000000000000000000000000000000000000000000003ab00000000000000000000000000000000000000000000000000000000000003ac00000000000000000000000000000000000000000000000000000000000003ad00000000000000000000000000000000000000000000000000000000000003ae00000000000000000000000000000000000000000000000000000000000003af00000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003b100000000000000000000000000000000000000000000000000000000000003b200000000000000000000000000000000000000000000000000000000000003b300000000000000000000000000000000000000000000000000000000000003b400000000000000000000000000000000000000000000000000000000000003b500000000000000000000000000000000000000000000000000000000000003b600000000000000000000000000000000000000000000000000000000000003b700000000000000000000000000000000000000000000000000000000000003b800000000000000000000000000000000000000000000000000000000000003b900000000000000000000000000000000000000000000000000000000000003ba00000000000000000000000000000000000000000000000000000000000003bb00000000000000000000000000000000000000000000000000000000000003bc00000000000000000000000000000000000000000000000000000000000003bd00000000000000000000000000000000000000000000000000000000000003be08004a32502b5d2a0cf5d776c92ef74de61a28e7882bdadeb3b0530f472704604300808c2412e2725ecaa6a6bd77e3159349e238dc7817f906ba32afd40b3cb3cb00d7d4e3b313c4cce9bd98c317ea715847a92d795b82a6f8b8144b7c61bee64200b76f07678c289f41378029b1353a73e1afbe241612a97c23e7fc059099f49d00c72046b39a9dc902cee36db5214c72315636bd824abfabdf80b1c5e6a01fd7006e0a74fec166a12f5a62954776784f01cba3be7ab876eef2e49a2ab7a5b0f900c83ddd8f6b91086bc83485adbe8056212b4d33b91840cd3dc649f9736881460022441e76225010acce7f429dc754fb3260ae1d387937978f69c67a879ed0733f0000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000068a0000000000000000000000000000000000000000000000000000000000000681000000000000000000000000000000000000000000000000000000000000068b0000000000000000000000000000000000000000000000000000000000000682000000000000000000000000000000000000000000000000000000000000068c0000000000000000000000000000000000000000000000000000000000000683000000000000000000000000000000000000000000000000000000000000068d0000000000000000000000000000000000000000000000000000000000000684000000000000000000000000000000000000000000000000000000000000068e0000000000000000000000000000000000000000000000000000000000000685000000000000000000000000000000000000000000000000000000000000068f00000000000000000000000000000000000000000000000000000000000006860000000000000000000000000000000000000000000000000000000000000690000000000000000000000000000000000000000000000000000000000000068700000000000000000000000000000000000000000000000000000000000006910000000000000000000000000000000000000000000000000000000000000688000000000000000000000000000000000000000000000000000000000000069200000000000000000000000000000000000000000000000000000000000006890000000000000000000000000000000000000000000000000000000000000693000000000000000000000000000000000000000000000000000000000000068a0000000000000000000000000000000000000000000000000000000000000694000000000000000000000000000000000000000000000000000000000000068b0000000000000000000000000000000000000000000000000000000000000695000000000000000000000000000000000000000000000000000000000000068c0000000000000000000000000000000000000000000000000000000000000696000000000000000000000000000000000000000000000000000000000000068d0000000000000000000000000000000000000000000000000000000000000697000000000000000000000000000000000000000000000000000000000000068e0000000000000000000000000000000000000000000000000000000000000698000000000000000000000000000000000000000000000000000000000000068f00000000000000000000000000000000000000000000000000000000000006990000000000000000000000000000000000000000000000000000000000000690000000000000000000000000000000000000000000000000000000000000069a0000000000000000000000000000000000000000000000000000000000000691000000000000000000000000000000000000000000000000000000000000069b0000000000000000000000000000000000000000000000000000000000000692000000000000000000000000000000000000000000000000000000000000069c0000000000000000000000000000000000000000000000000000000000000693000000000000000000000000000000000000000000000000000000000000069d0000000000000000000000000000000000000000000000000000000000000694000000000000000000000000000000000000000000000000000000000000069e0000000000000000000000000000000000000000000000000000000000000695000000000000000000000000000000000000000000000000000000000000069f000000000000000000000000000000000000000000000000000000000000069600000000000000000000000000000000000000000000000000000000000006a0000000000000000000000000000000000000000000000000000000000000069700000000000000000000000000000000000000000000000000000000000006a1000000000000000000000000000000000000000000000000000000000000069800000000000000000000000000000000000000000000000000000000000006a2000000000000000000000000000000000000000000000000000000000000069900000000000000000000000000000000000000000000000000000000000006a3000000000000000000000000000000000000000000000000000000000000069a00000000000000000000000000000000000000000000000000000000000006a4000000000000000000000000000000000000000000000000000000000000069b00000000000000000000000000000000000000000000000000000000000006a5000000000000000000000000000000000000000000000000000000000000069c00000000000000000000000000000000000000000000000000000000000006a6000000000000000000000000000000000000000000000000000000000000069d00000000000000000000000000000000000000000000000000000000000006a7000000000000000000000000000000000000000000000000000000000000069e00000000000000000000000000000000000000000000000000000000000006a8000000000000000000000000000000000000000000000000000000000000069f00000000000000000000000000000000000000000000000000000000000006a900000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006aa00000000000000000000000000000000000000000000000000000000000006a100000000000000000000000000000000000000000000000000000000000006ab00000000000000000000000000000000000000000000000000000000000006a200000000000000000000000000000000000000000000000000000000000006ac00000000000000000000000000000000000000000000000000000000000006a300000000000000000000000000000000000000000000000000000000000006ad00000000000000000000000000000000000000000000000000000000000006a400000000000000000000000000000000000000000000000000000000000006ae00000000000000000000000000000000000000000000000000000000000006a500000000000000000000000000000000000000000000000000000000000006af00000000000000000000000000000000000000000000000000000000000006a600000000000000000000000000000000000000000000000000000000000006b000000000000000000000000000000000000000000000000000000000000006a700000000000000000000000000000000000000000000000000000000000006b100000000000000000000000000000000000000000000000000000000000006a800000000000000000000000000000000000000000000000000000000000006b200000000000000000000000000000000000000000000000000000000000006a900000000000000000000000000000000000000000000000000000000000006b300000000000000000000000000000000000000000000000000000000000006aa00000000000000000000000000000000000000000000000000000000000006b400000000000000000000000000000000000000000000000000000000000006ab00000000000000000000000000000000000000000000000000000000000006b500000000000000000000000000000000000000000000000000000000000006ac00000000000000000000000000000000000000000000000000000000000006b600000000000000000000000000000000000000000000000000000000000006ad00000000000000000000000000000000000000000000000000000000000006b700000000000000000000000000000000000000000000000000000000000006ae00000000000000000000000000000000000000000000000000000000000006b800000000000000000000000000000000000000000000000000000000000006af00000000000000000000000000000000000000000000000000000000000006b900000000000000000000000000000000000000000000000000000000000006b000000000000000000000000000000000000000000000000000000000000006ba00000000000000000000000000000000000000000000000000000000000006b100000000000000000000000000000000000000000000000000000000000006bb00000000000000000000000000000000000000000000000000000000000006b200000000000000000000000000000000000000000000000000000000000006bc00000000000000000000000000000000000000000000000000000000000006b300000000000000000000000000000000000000000000000000000000000006bd00000000000000000000000000000000000000000000000000000000000006b400000000000000000000000000000000000000000000000000000000000006be00000000000000000000000000000000000000000000000000000000000006b500000000000000000000000000000000000000000000000000000000000006bf00000000000000000000000000000000000000000000000000000000000006b600000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006b700000000000000000000000000000000000000000000000000000000000006c100000000000000000000000000000000000000000000000000000000000006b800000000000000000000000000000000000000000000000000000000000006c200000000000000000000000000000000000000000000000000000000000006b900000000000000000000000000000000000000000000000000000000000006c300000000000000000000000000000000000000000000000000000000000006ba00000000000000000000000000000000000000000000000000000000000006c400000000000000000000000000000000000000000000000000000000000006bb00000000000000000000000000000000000000000000000000000000000006c500000000000000000000000000000000000000000000000000000000000006bc00000000000000000000000000000000000000000000000000000000000006c600000000000000000000000000000000000000000000000000000000000006bd00000000000000000000000000000000000000000000000000000000000006c700000000000000000000000000000000000000000000000000000000000006be00000000000000000000000000000000000000000000000000000000000006c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c100000000000000000000000000000000000000000000000000000000000002c200000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c500000000000000000000000000000000000000000000000000000000000002c600000000000000000000000000000000000000000000000000000000000002c700000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002c900000000000000000000000000000000000000000000000000000000000002ca00000000000000000000000000000000000000000000000000000000000002cb00000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002cd00000000000000000000000000000000000000000000000000000000000002ce00000000000000000000000000000000000000000000000000000000000002cf00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d100000000000000000000000000000000000000000000000000000000000002d200000000000000000000000000000000000000000000000000000000000002d300000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d500000000000000000000000000000000000000000000000000000000000002d600000000000000000000000000000000000000000000000000000000000002d700000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002d900000000000000000000000000000000000000000000000000000000000002da00000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002dd00000000000000000000000000000000000000000000000000000000000002de00000000000000000000000000000000000000000000000000000000000002df00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e100000000000000000000000000000000000000000000000000000000000002e200000000000000000000000000000000000000000000000000000000000002e300000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e500000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000000000000000002e700000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002e900000000000000000000000000000000000000000000000000000000000002ea00000000000000000000000000000000000000000000000000000000000002eb00000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002ed00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000002ef00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f100000000000000000000000000000000000000000000000000000000000002f200000000000000000000000000000000000000000000000000000000000002f300000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f500000000000000000000000000000000000000000000000000000000000002f600000000000000000000000000000000000000000000000000000000000002f700000000000000000000000000000000000000000000000000000000000002f800000000000000000000000000000000000000000000000000000000000002f900000000000000000000000000000000000000000000000000000000000002fa00000000000000000000000000000000000000000000000000000000000002fb00000000000000000000000000000000000000000000000000000000000002fc00000000000000000000000000000000000000000000000000000000000002fd00000000000000000000000000000000000000000000000000000000000002fe00000000000000000000000000000000000000000000000000000000000002ff3f00000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003c100000000000000000000000000000000000000000000000000000000000003c200000000000000000000000000000000000000000000000000000000000003c300000000000000000000000000000000000000000000000000000000000003c400000000000000000000000000000000000000000000000000000000000003c500000000000000000000000000000000000000000000000000000000000003c600000000000000000000000000000000000000000000000000000000000003c700000000000000000000000000000000000000000000000000000000000003c800000000000000000000000000000000000000000000000000000000000003c900000000000000000000000000000000000000000000000000000000000003ca00000000000000000000000000000000000000000000000000000000000003cb00000000000000000000000000000000000000000000000000000000000003cc00000000000000000000000000000000000000000000000000000000000003cd00000000000000000000000000000000000000000000000000000000000003ce00000000000000000000000000000000000000000000000000000000000003cf00000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003d100000000000000000000000000000000000000000000000000000000000003d200000000000000000000000000000000000000000000000000000000000003d300000000000000000000000000000000000000000000000000000000000003d400000000000000000000000000000000000000000000000000000000000003d500000000000000000000000000000000000000000000000000000000000003d600000000000000000000000000000000000000000000000000000000000003d700000000000000000000000000000000000000000000000000000000000003d800000000000000000000000000000000000000000000000000000000000003d900000000000000000000000000000000000000000000000000000000000003da00000000000000000000000000000000000000000000000000000000000003db00000000000000000000000000000000000000000000000000000000000003dc00000000000000000000000000000000000000000000000000000000000003dd00000000000000000000000000000000000000000000000000000000000003de00000000000000000000000000000000000000000000000000000000000003df00000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003e100000000000000000000000000000000000000000000000000000000000003e200000000000000000000000000000000000000000000000000000000000003e300000000000000000000000000000000000000000000000000000000000003e400000000000000000000000000000000000000000000000000000000000003e500000000000000000000000000000000000000000000000000000000000003e600000000000000000000000000000000000000000000000000000000000003e700000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003e900000000000000000000000000000000000000000000000000000000000003ea00000000000000000000000000000000000000000000000000000000000003eb00000000000000000000000000000000000000000000000000000000000003ec00000000000000000000000000000000000000000000000000000000000003ed00000000000000000000000000000000000000000000000000000000000003ee00000000000000000000000000000000000000000000000000000000000003ef00000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000003f100000000000000000000000000000000000000000000000000000000000003f200000000000000000000000000000000000000000000000000000000000003f300000000000000000000000000000000000000000000000000000000000003f400000000000000000000000000000000000000000000000000000000000003f500000000000000000000000000000000000000000000000000000000000003f600000000000000000000000000000000000000000000000000000000000003f700000000000000000000000000000000000000000000000000000000000003f800000000000000000000000000000000000000000000000000000000000003f900000000000000000000000000000000000000000000000000000000000003fa00000000000000000000000000000000000000000000000000000000000003fb00000000000000000000000000000000000000000000000000000000000003fc00000000000000000000000000000000000000000000000000000000000003fd00000000000000000000000000000000000000000000000000000000000003fe0800bb07f923e24c36227d717557d58d32b99370b81f7a70d1835becc1114f7d7700624291eff6ab801e5668bc6619a3df132f8b392b063f09dfe8a69e38224eb200bd6b195f8716ab3dc93c44037cac579d25d0e77c2782b5aa62534ee25d36bc008c99d470d2c53624a8c5bedfeffdcc5356f6da89ee0e372b3ea3fa4f8cd652009944e00a3f9a7d2e8a535d3a210c3271d5732518037704d67ef5d42a8b82c200523014cb6eabe4366c6e599ba96534fc15ecc804a13fbaaacf8717e1b0a8d20005621252c4b36c113f21ad6c13b99e5cef514bdd98ef0aae4075b5cb5a000a00d80cb2a60aae6c3d2e7d27fb1519a708a18bb5b5085f78684bdee7512856a93f00000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006ca00000000000000000000000000000000000000000000000000000000000006c100000000000000000000000000000000000000000000000000000000000006cb00000000000000000000000000000000000000000000000000000000000006c200000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006c300000000000000000000000000000000000000000000000000000000000006cd00000000000000000000000000000000000000000000000000000000000006c400000000000000000000000000000000000000000000000000000000000006ce00000000000000000000000000000000000000000000000000000000000006c500000000000000000000000000000000000000000000000000000000000006cf00000000000000000000000000000000000000000000000000000000000006c600000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006c700000000000000000000000000000000000000000000000000000000000006d100000000000000000000000000000000000000000000000000000000000006c800000000000000000000000000000000000000000000000000000000000006d200000000000000000000000000000000000000000000000000000000000006c900000000000000000000000000000000000000000000000000000000000006d300000000000000000000000000000000000000000000000000000000000006ca00000000000000000000000000000000000000000000000000000000000006d400000000000000000000000000000000000000000000000000000000000006cb00000000000000000000000000000000000000000000000000000000000006d500000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006d600000000000000000000000000000000000000000000000000000000000006cd00000000000000000000000000000000000000000000000000000000000006d700000000000000000000000000000000000000000000000000000000000006ce00000000000000000000000000000000000000000000000000000000000006d800000000000000000000000000000000000000000000000000000000000006cf00000000000000000000000000000000000000000000000000000000000006d900000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006da00000000000000000000000000000000000000000000000000000000000006d100000000000000000000000000000000000000000000000000000000000006db00000000000000000000000000000000000000000000000000000000000006d200000000000000000000000000000000000000000000000000000000000006dc00000000000000000000000000000000000000000000000000000000000006d300000000000000000000000000000000000000000000000000000000000006dd00000000000000000000000000000000000000000000000000000000000006d400000000000000000000000000000000000000000000000000000000000006de00000000000000000000000000000000000000000000000000000000000006d500000000000000000000000000000000000000000000000000000000000006df00000000000000000000000000000000000000000000000000000000000006d600000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000006d700000000000000000000000000000000000000000000000000000000000006e100000000000000000000000000000000000000000000000000000000000006d800000000000000000000000000000000000000000000000000000000000006e200000000000000000000000000000000000000000000000000000000000006d900000000000000000000000000000000000000000000000000000000000006e300000000000000000000000000000000000000000000000000000000000006da00000000000000000000000000000000000000000000000000000000000006e400000000000000000000000000000000000000000000000000000000000006db00000000000000000000000000000000000000000000000000000000000006e500000000000000000000000000000000000000000000000000000000000006dc00000000000000000000000000000000000000000000000000000000000006e600000000000000000000000000000000000000000000000000000000000006dd00000000000000000000000000000000000000000000000000000000000006e700000000000000000000000000000000000000000000000000000000000006de00000000000000000000000000000000000000000000000000000000000006e800000000000000000000000000000000000000000000000000000000000006df00000000000000000000000000000000000000000000000000000000000006e900000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000006ea00000000000000000000000000000000000000000000000000000000000006e100000000000000000000000000000000000000000000000000000000000006eb00000000000000000000000000000000000000000000000000000000000006e200000000000000000000000000000000000000000000000000000000000006ec00000000000000000000000000000000000000000000000000000000000006e300000000000000000000000000000000000000000000000000000000000006ed00000000000000000000000000000000000000000000000000000000000006e400000000000000000000000000000000000000000000000000000000000006ee00000000000000000000000000000000000000000000000000000000000006e500000000000000000000000000000000000000000000000000000000000006ef00000000000000000000000000000000000000000000000000000000000006e600000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006e700000000000000000000000000000000000000000000000000000000000006f100000000000000000000000000000000000000000000000000000000000006e800000000000000000000000000000000000000000000000000000000000006f200000000000000000000000000000000000000000000000000000000000006e900000000000000000000000000000000000000000000000000000000000006f300000000000000000000000000000000000000000000000000000000000006ea00000000000000000000000000000000000000000000000000000000000006f400000000000000000000000000000000000000000000000000000000000006eb00000000000000000000000000000000000000000000000000000000000006f500000000000000000000000000000000000000000000000000000000000006ec00000000000000000000000000000000000000000000000000000000000006f600000000000000000000000000000000000000000000000000000000000006ed00000000000000000000000000000000000000000000000000000000000006f700000000000000000000000000000000000000000000000000000000000006ee00000000000000000000000000000000000000000000000000000000000006f800000000000000000000000000000000000000000000000000000000000006ef00000000000000000000000000000000000000000000000000000000000006f900000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006fa00000000000000000000000000000000000000000000000000000000000006f100000000000000000000000000000000000000000000000000000000000006fb00000000000000000000000000000000000000000000000000000000000006f200000000000000000000000000000000000000000000000000000000000006fc00000000000000000000000000000000000000000000000000000000000006f300000000000000000000000000000000000000000000000000000000000006fd00000000000000000000000000000000000000000000000000000000000006f400000000000000000000000000000000000000000000000000000000000006fe00000000000000000000000000000000000000000000000000000000000006f500000000000000000000000000000000000000000000000000000000000006ff00000000000000000000000000000000000000000000000000000000000006f6000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000006f7000000000000000000000000000000000000000000000000000000000000070100000000000000000000000000000000000000000000000000000000000006f8000000000000000000000000000000000000000000000000000000000000070200000000000000000000000000000000000000000000000000000000000006f9000000000000000000000000000000000000000000000000000000000000070300000000000000000000000000000000000000000000000000000000000006fa000000000000000000000000000000000000000000000000000000000000070400000000000000000000000000000000000000000000000000000000000006fb000000000000000000000000000000000000000000000000000000000000070500000000000000000000000000000000000000000000000000000000000006fc000000000000000000000000000000000000000000000000000000000000070600000000000000000000000000000000000000000000000000000000000006fd000000000000000000000000000000000000000000000000000000000000070700000000000000000000000000000000000000000000000000000000000006fe0000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030100000000000000000000000000000000000000000000000000000000000003020000000000000000000000000000000000000000000000000000000000000303000000000000000000000000000000000000000000000000000000000000030400000000000000000000000000000000000000000000000000000000000003050000000000000000000000000000000000000000000000000000000000000306000000000000000000000000000000000000000000000000000000000000030700000000000000000000000000000000000000000000000000000000000003080000000000000000000000000000000000000000000000000000000000000309000000000000000000000000000000000000000000000000000000000000030a000000000000000000000000000000000000000000000000000000000000030b000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000030d000000000000000000000000000000000000000000000000000000000000030e000000000000000000000000000000000000000000000000000000000000030f0000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000031100000000000000000000000000000000000000000000000000000000000003120000000000000000000000000000000000000000000000000000000000000313000000000000000000000000000000000000000000000000000000000000031400000000000000000000000000000000000000000000000000000000000003150000000000000000000000000000000000000000000000000000000000000316000000000000000000000000000000000000000000000000000000000000031700000000000000000000000000000000000000000000000000000000000003180000000000000000000000000000000000000000000000000000000000000319000000000000000000000000000000000000000000000000000000000000031a000000000000000000000000000000000000000000000000000000000000031b000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000031d000000000000000000000000000000000000000000000000000000000000031e000000000000000000000000000000000000000000000000000000000000031f0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032100000000000000000000000000000000000000000000000000000000000003220000000000000000000000000000000000000000000000000000000000000323000000000000000000000000000000000000000000000000000000000000032400000000000000000000000000000000000000000000000000000000000003250000000000000000000000000000000000000000000000000000000000000326000000000000000000000000000000000000000000000000000000000000032700000000000000000000000000000000000000000000000000000000000003280000000000000000000000000000000000000000000000000000000000000329000000000000000000000000000000000000000000000000000000000000032a000000000000000000000000000000000000000000000000000000000000032b000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000032d000000000000000000000000000000000000000000000000000000000000032e000000000000000000000000000000000000000000000000000000000000032f0000000000000000000000000000000000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000033100000000000000000000000000000000000000000000000000000000000003320000000000000000000000000000000000000000000000000000000000000333000000000000000000000000000000000000000000000000000000000000033400000000000000000000000000000000000000000000000000000000000003350000000000000000000000000000000000000000000000000000000000000336000000000000000000000000000000000000000000000000000000000000033700000000000000000000000000000000000000000000000000000000000003380000000000000000000000000000000000000000000000000000000000000339000000000000000000000000000000000000000000000000000000000000033a000000000000000000000000000000000000000000000000000000000000033b000000000000000000000000000000000000000000000000000000000000033c000000000000000000000000000000000000000000000000000000000000033d000000000000000000000000000000000000000000000000000000000000033e000000000000000000000000000000000000000000000000000000000000033f3f0000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040100000000000000000000000000000000000000000000000000000000000004020000000000000000000000000000000000000000000000000000000000000403000000000000000000000000000000000000000000000000000000000000040400000000000000000000000000000000000000000000000000000000000004050000000000000000000000000000000000000000000000000000000000000406000000000000000000000000000000000000000000000000000000000000040700000000000000000000000000000000000000000000000000000000000004080000000000000000000000000000000000000000000000000000000000000409000000000000000000000000000000000000000000000000000000000000040a000000000000000000000000000000000000000000000000000000000000040b000000000000000000000000000000000000000000000000000000000000040c000000000000000000000000000000000000000000000000000000000000040d000000000000000000000000000000000000000000000000000000000000040e000000000000000000000000000000000000000000000000000000000000040f0000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000041100000000000000000000000000000000000000000000000000000000000004120000000000000000000000000000000000000000000000000000000000000413000000000000000000000000000000000000000000000000000000000000041400000000000000000000000000000000000000000000000000000000000004150000000000000000000000000000000000000000000000000000000000000416000000000000000000000000000000000000000000000000000000000000041700000000000000000000000000000000000000000000000000000000000004180000000000000000000000000000000000000000000000000000000000000419000000000000000000000000000000000000000000000000000000000000041a000000000000000000000000000000000000000000000000000000000000041b000000000000000000000000000000000000000000000000000000000000041c000000000000000000000000000000000000000000000000000000000000041d000000000000000000000000000000000000000000000000000000000000041e000000000000000000000000000000000000000000000000000000000000041f0000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000042100000000000000000000000000000000000000000000000000000000000004220000000000000000000000000000000000000000000000000000000000000423000000000000000000000000000000000000000000000000000000000000042400000000000000000000000000000000000000000000000000000000000004250000000000000000000000000000000000000000000000000000000000000426000000000000000000000000000000000000000000000000000000000000042700000000000000000000000000000000000000000000000000000000000004280000000000000000000000000000000000000000000000000000000000000429000000000000000000000000000000000000000000000000000000000000042a000000000000000000000000000000000000000000000000000000000000042b000000000000000000000000000000000000000000000000000000000000042c000000000000000000000000000000000000000000000000000000000000042d000000000000000000000000000000000000000000000000000000000000042e000000000000000000000000000000000000000000000000000000000000042f0000000000000000000000000000000000000000000000000000000000000430000000000000000000000000000000000000000000000000000000000000043100000000000000000000000000000000000000000000000000000000000004320000000000000000000000000000000000000000000000000000000000000433000000000000000000000000000000000000000000000000000000000000043400000000000000000000000000000000000000000000000000000000000004350000000000000000000000000000000000000000000000000000000000000436000000000000000000000000000000000000000000000000000000000000043700000000000000000000000000000000000000000000000000000000000004380000000000000000000000000000000000000000000000000000000000000439000000000000000000000000000000000000000000000000000000000000043a000000000000000000000000000000000000000000000000000000000000043b000000000000000000000000000000000000000000000000000000000000043c000000000000000000000000000000000000000000000000000000000000043d000000000000000000000000000000000000000000000000000000000000043e0800a38df4d53fe5da3d48c97dd0f58e7a52faade40c8f50bc0f6408a2b5b3829800a3d4b994758c6630518cce3116391874b9b3b8a1bbcb36485d2702f05af359004c06e9dd14418667d7c66384699665f9222ed08be87c67293a2f1b6b4c41aa006b77b11703f0e3d21aa68c9f6d2ae8ad94ecafdb56be0c4605a0c6723e9ddc0049a087e215b640d8360f8dd98e07c77e4d2025a0dcdcaf78bc00bd6fde09680014741a52013a10622de90b1a7854f1203af5c97121a4b3774c249fba6e0dba00c783bd01c4a4cafe83fd3b4d1ce0c555be4b6d1f772cccccf86049f9af0bbe002ff3ac4d7e2f1caf1fb30e1d20eba5be2b6a42dd54690dee988a934026491e3f0000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000070a0000000000000000000000000000000000000000000000000000000000000701000000000000000000000000000000000000000000000000000000000000070b0000000000000000000000000000000000000000000000000000000000000702000000000000000000000000000000000000000000000000000000000000070c0000000000000000000000000000000000000000000000000000000000000703000000000000000000000000000000000000000000000000000000000000070d0000000000000000000000000000000000000000000000000000000000000704000000000000000000000000000000000000000000000000000000000000070e0000000000000000000000000000000000000000000000000000000000000705000000000000000000000000000000000000000000000000000000000000070f00000000000000000000000000000000000000000000000000000000000007060000000000000000000000000000000000000000000000000000000000000710000000000000000000000000000000000000000000000000000000000000070700000000000000000000000000000000000000000000000000000000000007110000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000071200000000000000000000000000000000000000000000000000000000000007090000000000000000000000000000000000000000000000000000000000000713000000000000000000000000000000000000000000000000000000000000070a0000000000000000000000000000000000000000000000000000000000000714000000000000000000000000000000000000000000000000000000000000070b0000000000000000000000000000000000000000000000000000000000000715000000000000000000000000000000000000000000000000000000000000070c0000000000000000000000000000000000000000000000000000000000000716000000000000000000000000000000000000000000000000000000000000070d0000000000000000000000000000000000000000000000000000000000000717000000000000000000000000000000000000000000000000000000000000070e0000000000000000000000000000000000000000000000000000000000000718000000000000000000000000000000000000000000000000000000000000070f00000000000000000000000000000000000000000000000000000000000007190000000000000000000000000000000000000000000000000000000000000710000000000000000000000000000000000000000000000000000000000000071a0000000000000000000000000000000000000000000000000000000000000711000000000000000000000000000000000000000000000000000000000000071b0000000000000000000000000000000000000000000000000000000000000712000000000000000000000000000000000000000000000000000000000000071c0000000000000000000000000000000000000000000000000000000000000713000000000000000000000000000000000000000000000000000000000000071d0000000000000000000000000000000000000000000000000000000000000714000000000000000000000000000000000000000000000000000000000000071e0000000000000000000000000000000000000000000000000000000000000715000000000000000000000000000000000000000000000000000000000000071f00000000000000000000000000000000000000000000000000000000000007160000000000000000000000000000000000000000000000000000000000000720000000000000000000000000000000000000000000000000000000000000071700000000000000000000000000000000000000000000000000000000000007210000000000000000000000000000000000000000000000000000000000000718000000000000000000000000000000000000000000000000000000000000072200000000000000000000000000000000000000000000000000000000000007190000000000000000000000000000000000000000000000000000000000000723000000000000000000000000000000000000000000000000000000000000071a0000000000000000000000000000000000000000000000000000000000000724000000000000000000000000000000000000000000000000000000000000071b0000000000000000000000000000000000000000000000000000000000000725000000000000000000000000000000000000000000000000000000000000071c0000000000000000000000000000000000000000000000000000000000000726000000000000000000000000000000000000000000000000000000000000071d0000000000000000000000000000000000000000000000000000000000000727000000000000000000000000000000000000000000000000000000000000071e0000000000000000000000000000000000000000000000000000000000000728000000000000000000000000000000000000000000000000000000000000071f00000000000000000000000000000000000000000000000000000000000007290000000000000000000000000000000000000000000000000000000000000720000000000000000000000000000000000000000000000000000000000000072a0000000000000000000000000000000000000000000000000000000000000721000000000000000000000000000000000000000000000000000000000000072b0000000000000000000000000000000000000000000000000000000000000722000000000000000000000000000000000000000000000000000000000000072c0000000000000000000000000000000000000000000000000000000000000723000000000000000000000000000000000000000000000000000000000000072d0000000000000000000000000000000000000000000000000000000000000724000000000000000000000000000000000000000000000000000000000000072e0000000000000000000000000000000000000000000000000000000000000725000000000000000000000000000000000000000000000000000000000000072f00000000000000000000000000000000000000000000000000000000000007260000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000072700000000000000000000000000000000000000000000000000000000000007310000000000000000000000000000000000000000000000000000000000000728000000000000000000000000000000000000000000000000000000000000073200000000000000000000000000000000000000000000000000000000000007290000000000000000000000000000000000000000000000000000000000000733000000000000000000000000000000000000000000000000000000000000072a0000000000000000000000000000000000000000000000000000000000000734000000000000000000000000000000000000000000000000000000000000072b0000000000000000000000000000000000000000000000000000000000000735000000000000000000000000000000000000000000000000000000000000072c0000000000000000000000000000000000000000000000000000000000000736000000000000000000000000000000000000000000000000000000000000072d0000000000000000000000000000000000000000000000000000000000000737000000000000000000000000000000000000000000000000000000000000072e0000000000000000000000000000000000000000000000000000000000000738000000000000000000000000000000000000000000000000000000000000072f00000000000000000000000000000000000000000000000000000000000007390000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000073a0000000000000000000000000000000000000000000000000000000000000731000000000000000000000000000000000000000000000000000000000000073b0000000000000000000000000000000000000000000000000000000000000732000000000000000000000000000000000000000000000000000000000000073c0000000000000000000000000000000000000000000000000000000000000733000000000000000000000000000000000000000000000000000000000000073d0000000000000000000000000000000000000000000000000000000000000734000000000000000000000000000000000000000000000000000000000000073e0000000000000000000000000000000000000000000000000000000000000735000000000000000000000000000000000000000000000000000000000000073f00000000000000000000000000000000000000000000000000000000000007360000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000073700000000000000000000000000000000000000000000000000000000000007410000000000000000000000000000000000000000000000000000000000000738000000000000000000000000000000000000000000000000000000000000074200000000000000000000000000000000000000000000000000000000000007390000000000000000000000000000000000000000000000000000000000000743000000000000000000000000000000000000000000000000000000000000073a0000000000000000000000000000000000000000000000000000000000000744000000000000000000000000000000000000000000000000000000000000073b0000000000000000000000000000000000000000000000000000000000000745000000000000000000000000000000000000000000000000000000000000073c0000000000000000000000000000000000000000000000000000000000000746000000000000000000000000000000000000000000000000000000000000073d0000000000000000000000000000000000000000000000000000000000000747000000000000000000000000000000000000000000000000000000000000073e0000000000000000000000000000000000000000000000000000000000000748000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "txsEffectsHash": "0x008e46703a73fee39cb8a1bd50a03e090eb250de227639bbf1448462452bd646", + "archive": "0x2b747dae8f9a1f0466aca084070e39f559ed0eb9a1f9d5c0c9dab0a9d0fd8ed1", + "blockHash": "0x15ffec62930223ebcde1cbf94f15085361cf43cbd21e0aa78b4ba8d3d14a2564", + "body": "0x00000008000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000014100000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000000000000000000143000000000000000000000000000000000000000000000000000000000000014400000000000000000000000000000000000000000000000000000000000001450000000000000000000000000000000000000000000000000000000000000146000000000000000000000000000000000000000000000000000000000000014700000000000000000000000000000000000000000000000000000000000001480000000000000000000000000000000000000000000000000000000000000149000000000000000000000000000000000000000000000000000000000000014a000000000000000000000000000000000000000000000000000000000000014b000000000000000000000000000000000000000000000000000000000000014c000000000000000000000000000000000000000000000000000000000000014d000000000000000000000000000000000000000000000000000000000000014e000000000000000000000000000000000000000000000000000000000000014f0000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000015100000000000000000000000000000000000000000000000000000000000001520000000000000000000000000000000000000000000000000000000000000153000000000000000000000000000000000000000000000000000000000000015400000000000000000000000000000000000000000000000000000000000001550000000000000000000000000000000000000000000000000000000000000156000000000000000000000000000000000000000000000000000000000000015700000000000000000000000000000000000000000000000000000000000001580000000000000000000000000000000000000000000000000000000000000159000000000000000000000000000000000000000000000000000000000000015a000000000000000000000000000000000000000000000000000000000000015b000000000000000000000000000000000000000000000000000000000000015c000000000000000000000000000000000000000000000000000000000000015d000000000000000000000000000000000000000000000000000000000000015e000000000000000000000000000000000000000000000000000000000000015f0000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000016100000000000000000000000000000000000000000000000000000000000001620000000000000000000000000000000000000000000000000000000000000163000000000000000000000000000000000000000000000000000000000000016400000000000000000000000000000000000000000000000000000000000001650000000000000000000000000000000000000000000000000000000000000166000000000000000000000000000000000000000000000000000000000000016700000000000000000000000000000000000000000000000000000000000001680000000000000000000000000000000000000000000000000000000000000169000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000016b000000000000000000000000000000000000000000000000000000000000016c000000000000000000000000000000000000000000000000000000000000016d000000000000000000000000000000000000000000000000000000000000016e000000000000000000000000000000000000000000000000000000000000016f0000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000017100000000000000000000000000000000000000000000000000000000000001720000000000000000000000000000000000000000000000000000000000000173000000000000000000000000000000000000000000000000000000000000017400000000000000000000000000000000000000000000000000000000000001750000000000000000000000000000000000000000000000000000000000000176000000000000000000000000000000000000000000000000000000000000017700000000000000000000000000000000000000000000000000000000000001780000000000000000000000000000000000000000000000000000000000000179000000000000000000000000000000000000000000000000000000000000017a000000000000000000000000000000000000000000000000000000000000017b000000000000000000000000000000000000000000000000000000000000017c000000000000000000000000000000000000000000000000000000000000017d000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000017f3f0000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e000000000000000000000000000000000000000000000000000000000000024f0000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000025100000000000000000000000000000000000000000000000000000000000002520000000000000000000000000000000000000000000000000000000000000253000000000000000000000000000000000000000000000000000000000000025400000000000000000000000000000000000000000000000000000000000002550000000000000000000000000000000000000000000000000000000000000256000000000000000000000000000000000000000000000000000000000000025700000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000025a000000000000000000000000000000000000000000000000000000000000025b000000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000025d000000000000000000000000000000000000000000000000000000000000025e000000000000000000000000000000000000000000000000000000000000025f0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e000000000000000000000000000000000000000000000000000000000000026f0000000000000000000000000000000000000000000000000000000000000270000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000002720000000000000000000000000000000000000000000000000000000000000273000000000000000000000000000000000000000000000000000000000000027400000000000000000000000000000000000000000000000000000000000002750000000000000000000000000000000000000000000000000000000000000276000000000000000000000000000000000000000000000000000000000000027700000000000000000000000000000000000000000000000000000000000002780000000000000000000000000000000000000000000000000000000000000279000000000000000000000000000000000000000000000000000000000000027a000000000000000000000000000000000000000000000000000000000000027b000000000000000000000000000000000000000000000000000000000000027c000000000000000000000000000000000000000000000000000000000000027d000000000000000000000000000000000000000000000000000000000000027e0800c47667396742a5474f325e2567bff3bb99b7f0bfd2b1a689b635d8b8726cce00284120278895e8d47084ae759f390e9634881e41369a257a36fe99a2369dc800a328b4a4a6ed156325253b4ab2af7ca00e21caf7963f0fba8a88ccdc3512c300705c99df420bface231f6855799db1d0ed7d39419abc47aa8c6efe2ae7aae2009299cc308de6d23788384411e024791a5b2448e455fbdd1d1f28f3ff76631f002d6c03d81ad764de51b0f34584645191cdc2aaae2ca08fb838d142b95d62f5003032f3618b2df0fa335d5fd548d6d85e42b4e7eb5fff9eb687facbbdecb8a60016cab7ddf4d1b440d53d10284c5c82a78b2d4e27dcdb44ef434ef4c6bad6783f0000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000054a0000000000000000000000000000000000000000000000000000000000000541000000000000000000000000000000000000000000000000000000000000054b0000000000000000000000000000000000000000000000000000000000000542000000000000000000000000000000000000000000000000000000000000054c0000000000000000000000000000000000000000000000000000000000000543000000000000000000000000000000000000000000000000000000000000054d0000000000000000000000000000000000000000000000000000000000000544000000000000000000000000000000000000000000000000000000000000054e0000000000000000000000000000000000000000000000000000000000000545000000000000000000000000000000000000000000000000000000000000054f00000000000000000000000000000000000000000000000000000000000005460000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000054700000000000000000000000000000000000000000000000000000000000005510000000000000000000000000000000000000000000000000000000000000548000000000000000000000000000000000000000000000000000000000000055200000000000000000000000000000000000000000000000000000000000005490000000000000000000000000000000000000000000000000000000000000553000000000000000000000000000000000000000000000000000000000000054a0000000000000000000000000000000000000000000000000000000000000554000000000000000000000000000000000000000000000000000000000000054b0000000000000000000000000000000000000000000000000000000000000555000000000000000000000000000000000000000000000000000000000000054c0000000000000000000000000000000000000000000000000000000000000556000000000000000000000000000000000000000000000000000000000000054d0000000000000000000000000000000000000000000000000000000000000557000000000000000000000000000000000000000000000000000000000000054e0000000000000000000000000000000000000000000000000000000000000558000000000000000000000000000000000000000000000000000000000000054f00000000000000000000000000000000000000000000000000000000000005590000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000055a0000000000000000000000000000000000000000000000000000000000000551000000000000000000000000000000000000000000000000000000000000055b0000000000000000000000000000000000000000000000000000000000000552000000000000000000000000000000000000000000000000000000000000055c0000000000000000000000000000000000000000000000000000000000000553000000000000000000000000000000000000000000000000000000000000055d0000000000000000000000000000000000000000000000000000000000000554000000000000000000000000000000000000000000000000000000000000055e0000000000000000000000000000000000000000000000000000000000000555000000000000000000000000000000000000000000000000000000000000055f00000000000000000000000000000000000000000000000000000000000005560000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000055700000000000000000000000000000000000000000000000000000000000005610000000000000000000000000000000000000000000000000000000000000558000000000000000000000000000000000000000000000000000000000000056200000000000000000000000000000000000000000000000000000000000005590000000000000000000000000000000000000000000000000000000000000563000000000000000000000000000000000000000000000000000000000000055a0000000000000000000000000000000000000000000000000000000000000564000000000000000000000000000000000000000000000000000000000000055b0000000000000000000000000000000000000000000000000000000000000565000000000000000000000000000000000000000000000000000000000000055c0000000000000000000000000000000000000000000000000000000000000566000000000000000000000000000000000000000000000000000000000000055d0000000000000000000000000000000000000000000000000000000000000567000000000000000000000000000000000000000000000000000000000000055e0000000000000000000000000000000000000000000000000000000000000568000000000000000000000000000000000000000000000000000000000000055f00000000000000000000000000000000000000000000000000000000000005690000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000056a0000000000000000000000000000000000000000000000000000000000000561000000000000000000000000000000000000000000000000000000000000056b0000000000000000000000000000000000000000000000000000000000000562000000000000000000000000000000000000000000000000000000000000056c0000000000000000000000000000000000000000000000000000000000000563000000000000000000000000000000000000000000000000000000000000056d0000000000000000000000000000000000000000000000000000000000000564000000000000000000000000000000000000000000000000000000000000056e0000000000000000000000000000000000000000000000000000000000000565000000000000000000000000000000000000000000000000000000000000056f00000000000000000000000000000000000000000000000000000000000005660000000000000000000000000000000000000000000000000000000000000570000000000000000000000000000000000000000000000000000000000000056700000000000000000000000000000000000000000000000000000000000005710000000000000000000000000000000000000000000000000000000000000568000000000000000000000000000000000000000000000000000000000000057200000000000000000000000000000000000000000000000000000000000005690000000000000000000000000000000000000000000000000000000000000573000000000000000000000000000000000000000000000000000000000000056a0000000000000000000000000000000000000000000000000000000000000574000000000000000000000000000000000000000000000000000000000000056b0000000000000000000000000000000000000000000000000000000000000575000000000000000000000000000000000000000000000000000000000000056c0000000000000000000000000000000000000000000000000000000000000576000000000000000000000000000000000000000000000000000000000000056d0000000000000000000000000000000000000000000000000000000000000577000000000000000000000000000000000000000000000000000000000000056e0000000000000000000000000000000000000000000000000000000000000578000000000000000000000000000000000000000000000000000000000000056f00000000000000000000000000000000000000000000000000000000000005790000000000000000000000000000000000000000000000000000000000000570000000000000000000000000000000000000000000000000000000000000057a0000000000000000000000000000000000000000000000000000000000000571000000000000000000000000000000000000000000000000000000000000057b0000000000000000000000000000000000000000000000000000000000000572000000000000000000000000000000000000000000000000000000000000057c0000000000000000000000000000000000000000000000000000000000000573000000000000000000000000000000000000000000000000000000000000057d0000000000000000000000000000000000000000000000000000000000000574000000000000000000000000000000000000000000000000000000000000057e0000000000000000000000000000000000000000000000000000000000000575000000000000000000000000000000000000000000000000000000000000057f00000000000000000000000000000000000000000000000000000000000005760000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000057700000000000000000000000000000000000000000000000000000000000005810000000000000000000000000000000000000000000000000000000000000578000000000000000000000000000000000000000000000000000000000000058200000000000000000000000000000000000000000000000000000000000005790000000000000000000000000000000000000000000000000000000000000583000000000000000000000000000000000000000000000000000000000000057a0000000000000000000000000000000000000000000000000000000000000584000000000000000000000000000000000000000000000000000000000000057b0000000000000000000000000000000000000000000000000000000000000585000000000000000000000000000000000000000000000000000000000000057c0000000000000000000000000000000000000000000000000000000000000586000000000000000000000000000000000000000000000000000000000000057d0000000000000000000000000000000000000000000000000000000000000587000000000000000000000000000000000000000000000000000000000000057e0000000000000000000000000000000000000000000000000000000000000588000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000018100000000000000000000000000000000000000000000000000000000000001820000000000000000000000000000000000000000000000000000000000000183000000000000000000000000000000000000000000000000000000000000018400000000000000000000000000000000000000000000000000000000000001850000000000000000000000000000000000000000000000000000000000000186000000000000000000000000000000000000000000000000000000000000018700000000000000000000000000000000000000000000000000000000000001880000000000000000000000000000000000000000000000000000000000000189000000000000000000000000000000000000000000000000000000000000018a000000000000000000000000000000000000000000000000000000000000018b000000000000000000000000000000000000000000000000000000000000018c000000000000000000000000000000000000000000000000000000000000018d000000000000000000000000000000000000000000000000000000000000018e000000000000000000000000000000000000000000000000000000000000018f0000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019100000000000000000000000000000000000000000000000000000000000001920000000000000000000000000000000000000000000000000000000000000193000000000000000000000000000000000000000000000000000000000000019400000000000000000000000000000000000000000000000000000000000001950000000000000000000000000000000000000000000000000000000000000196000000000000000000000000000000000000000000000000000000000000019700000000000000000000000000000000000000000000000000000000000001980000000000000000000000000000000000000000000000000000000000000199000000000000000000000000000000000000000000000000000000000000019a000000000000000000000000000000000000000000000000000000000000019b000000000000000000000000000000000000000000000000000000000000019c000000000000000000000000000000000000000000000000000000000000019d000000000000000000000000000000000000000000000000000000000000019e000000000000000000000000000000000000000000000000000000000000019f00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001a100000000000000000000000000000000000000000000000000000000000001a200000000000000000000000000000000000000000000000000000000000001a300000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000001a500000000000000000000000000000000000000000000000000000000000001a600000000000000000000000000000000000000000000000000000000000001a700000000000000000000000000000000000000000000000000000000000001a800000000000000000000000000000000000000000000000000000000000001a900000000000000000000000000000000000000000000000000000000000001aa00000000000000000000000000000000000000000000000000000000000001ab00000000000000000000000000000000000000000000000000000000000001ac00000000000000000000000000000000000000000000000000000000000001ad00000000000000000000000000000000000000000000000000000000000001ae00000000000000000000000000000000000000000000000000000000000001af00000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001b100000000000000000000000000000000000000000000000000000000000001b200000000000000000000000000000000000000000000000000000000000001b300000000000000000000000000000000000000000000000000000000000001b400000000000000000000000000000000000000000000000000000000000001b500000000000000000000000000000000000000000000000000000000000001b600000000000000000000000000000000000000000000000000000000000001b700000000000000000000000000000000000000000000000000000000000001b800000000000000000000000000000000000000000000000000000000000001b900000000000000000000000000000000000000000000000000000000000001ba00000000000000000000000000000000000000000000000000000000000001bb00000000000000000000000000000000000000000000000000000000000001bc00000000000000000000000000000000000000000000000000000000000001bd00000000000000000000000000000000000000000000000000000000000001be00000000000000000000000000000000000000000000000000000000000001bf3f0000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e000000000000000000000000000000000000000000000000000000000000028f0000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000029100000000000000000000000000000000000000000000000000000000000002920000000000000000000000000000000000000000000000000000000000000293000000000000000000000000000000000000000000000000000000000000029400000000000000000000000000000000000000000000000000000000000002950000000000000000000000000000000000000000000000000000000000000296000000000000000000000000000000000000000000000000000000000000029700000000000000000000000000000000000000000000000000000000000002980000000000000000000000000000000000000000000000000000000000000299000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000029b000000000000000000000000000000000000000000000000000000000000029c000000000000000000000000000000000000000000000000000000000000029d000000000000000000000000000000000000000000000000000000000000029e000000000000000000000000000000000000000000000000000000000000029f00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a100000000000000000000000000000000000000000000000000000000000002a200000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a500000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002a700000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002a900000000000000000000000000000000000000000000000000000000000002aa00000000000000000000000000000000000000000000000000000000000002ab00000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002ad00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002af00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b100000000000000000000000000000000000000000000000000000000000002b200000000000000000000000000000000000000000000000000000000000002b300000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b500000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002b700000000000000000000000000000000000000000000000000000000000002b800000000000000000000000000000000000000000000000000000000000002b900000000000000000000000000000000000000000000000000000000000002ba00000000000000000000000000000000000000000000000000000000000002bb00000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000002bd00000000000000000000000000000000000000000000000000000000000002be0800789ff73d7787206612d96dfc2143f2344de21669a3f8cae7fe9a8918631eb00084a17f00bf8793b6851a106e9155543125e0be987ad3c8334456bdda171d0b00a400f8fd336ad84f467465964008238fd1b7f9c51c22912d706cd2b874d24e002c79bdd83c14ff50a46964f838ee207564909e28af79a57fc195810d36f9b20070083c6ef1e4dd88a064e94d2582283b203cf8a2ab1667f4370eda1b4c1fe8005373dffb5b590053d7762efcf9e11280f1486ce82e7996d94ee0f5d7c093bc009eefd90eb40e79c78bac1f71ec78bdc2f8b30041974239bdc765edffed813800ea95742e72792ca7a0f66ce9f55bc47dc09d5ea08c1b9018763102776978303f0000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000058a0000000000000000000000000000000000000000000000000000000000000581000000000000000000000000000000000000000000000000000000000000058b0000000000000000000000000000000000000000000000000000000000000582000000000000000000000000000000000000000000000000000000000000058c0000000000000000000000000000000000000000000000000000000000000583000000000000000000000000000000000000000000000000000000000000058d0000000000000000000000000000000000000000000000000000000000000584000000000000000000000000000000000000000000000000000000000000058e0000000000000000000000000000000000000000000000000000000000000585000000000000000000000000000000000000000000000000000000000000058f00000000000000000000000000000000000000000000000000000000000005860000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000058700000000000000000000000000000000000000000000000000000000000005910000000000000000000000000000000000000000000000000000000000000588000000000000000000000000000000000000000000000000000000000000059200000000000000000000000000000000000000000000000000000000000005890000000000000000000000000000000000000000000000000000000000000593000000000000000000000000000000000000000000000000000000000000058a0000000000000000000000000000000000000000000000000000000000000594000000000000000000000000000000000000000000000000000000000000058b0000000000000000000000000000000000000000000000000000000000000595000000000000000000000000000000000000000000000000000000000000058c0000000000000000000000000000000000000000000000000000000000000596000000000000000000000000000000000000000000000000000000000000058d0000000000000000000000000000000000000000000000000000000000000597000000000000000000000000000000000000000000000000000000000000058e0000000000000000000000000000000000000000000000000000000000000598000000000000000000000000000000000000000000000000000000000000058f00000000000000000000000000000000000000000000000000000000000005990000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000059a0000000000000000000000000000000000000000000000000000000000000591000000000000000000000000000000000000000000000000000000000000059b0000000000000000000000000000000000000000000000000000000000000592000000000000000000000000000000000000000000000000000000000000059c0000000000000000000000000000000000000000000000000000000000000593000000000000000000000000000000000000000000000000000000000000059d0000000000000000000000000000000000000000000000000000000000000594000000000000000000000000000000000000000000000000000000000000059e0000000000000000000000000000000000000000000000000000000000000595000000000000000000000000000000000000000000000000000000000000059f000000000000000000000000000000000000000000000000000000000000059600000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000059700000000000000000000000000000000000000000000000000000000000005a1000000000000000000000000000000000000000000000000000000000000059800000000000000000000000000000000000000000000000000000000000005a2000000000000000000000000000000000000000000000000000000000000059900000000000000000000000000000000000000000000000000000000000005a3000000000000000000000000000000000000000000000000000000000000059a00000000000000000000000000000000000000000000000000000000000005a4000000000000000000000000000000000000000000000000000000000000059b00000000000000000000000000000000000000000000000000000000000005a5000000000000000000000000000000000000000000000000000000000000059c00000000000000000000000000000000000000000000000000000000000005a6000000000000000000000000000000000000000000000000000000000000059d00000000000000000000000000000000000000000000000000000000000005a7000000000000000000000000000000000000000000000000000000000000059e00000000000000000000000000000000000000000000000000000000000005a8000000000000000000000000000000000000000000000000000000000000059f00000000000000000000000000000000000000000000000000000000000005a900000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000005aa00000000000000000000000000000000000000000000000000000000000005a100000000000000000000000000000000000000000000000000000000000005ab00000000000000000000000000000000000000000000000000000000000005a200000000000000000000000000000000000000000000000000000000000005ac00000000000000000000000000000000000000000000000000000000000005a300000000000000000000000000000000000000000000000000000000000005ad00000000000000000000000000000000000000000000000000000000000005a400000000000000000000000000000000000000000000000000000000000005ae00000000000000000000000000000000000000000000000000000000000005a500000000000000000000000000000000000000000000000000000000000005af00000000000000000000000000000000000000000000000000000000000005a600000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000005a700000000000000000000000000000000000000000000000000000000000005b100000000000000000000000000000000000000000000000000000000000005a800000000000000000000000000000000000000000000000000000000000005b200000000000000000000000000000000000000000000000000000000000005a900000000000000000000000000000000000000000000000000000000000005b300000000000000000000000000000000000000000000000000000000000005aa00000000000000000000000000000000000000000000000000000000000005b400000000000000000000000000000000000000000000000000000000000005ab00000000000000000000000000000000000000000000000000000000000005b500000000000000000000000000000000000000000000000000000000000005ac00000000000000000000000000000000000000000000000000000000000005b600000000000000000000000000000000000000000000000000000000000005ad00000000000000000000000000000000000000000000000000000000000005b700000000000000000000000000000000000000000000000000000000000005ae00000000000000000000000000000000000000000000000000000000000005b800000000000000000000000000000000000000000000000000000000000005af00000000000000000000000000000000000000000000000000000000000005b900000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000005ba00000000000000000000000000000000000000000000000000000000000005b100000000000000000000000000000000000000000000000000000000000005bb00000000000000000000000000000000000000000000000000000000000005b200000000000000000000000000000000000000000000000000000000000005bc00000000000000000000000000000000000000000000000000000000000005b300000000000000000000000000000000000000000000000000000000000005bd00000000000000000000000000000000000000000000000000000000000005b400000000000000000000000000000000000000000000000000000000000005be00000000000000000000000000000000000000000000000000000000000005b500000000000000000000000000000000000000000000000000000000000005bf00000000000000000000000000000000000000000000000000000000000005b600000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005b700000000000000000000000000000000000000000000000000000000000005c100000000000000000000000000000000000000000000000000000000000005b800000000000000000000000000000000000000000000000000000000000005c200000000000000000000000000000000000000000000000000000000000005b900000000000000000000000000000000000000000000000000000000000005c300000000000000000000000000000000000000000000000000000000000005ba00000000000000000000000000000000000000000000000000000000000005c400000000000000000000000000000000000000000000000000000000000005bb00000000000000000000000000000000000000000000000000000000000005c500000000000000000000000000000000000000000000000000000000000005bc00000000000000000000000000000000000000000000000000000000000005c600000000000000000000000000000000000000000000000000000000000005bd00000000000000000000000000000000000000000000000000000000000005c700000000000000000000000000000000000000000000000000000000000005be00000000000000000000000000000000000000000000000000000000000005c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001c100000000000000000000000000000000000000000000000000000000000001c200000000000000000000000000000000000000000000000000000000000001c300000000000000000000000000000000000000000000000000000000000001c400000000000000000000000000000000000000000000000000000000000001c500000000000000000000000000000000000000000000000000000000000001c600000000000000000000000000000000000000000000000000000000000001c700000000000000000000000000000000000000000000000000000000000001c800000000000000000000000000000000000000000000000000000000000001c900000000000000000000000000000000000000000000000000000000000001ca00000000000000000000000000000000000000000000000000000000000001cb00000000000000000000000000000000000000000000000000000000000001cc00000000000000000000000000000000000000000000000000000000000001cd00000000000000000000000000000000000000000000000000000000000001ce00000000000000000000000000000000000000000000000000000000000001cf00000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001d100000000000000000000000000000000000000000000000000000000000001d200000000000000000000000000000000000000000000000000000000000001d300000000000000000000000000000000000000000000000000000000000001d400000000000000000000000000000000000000000000000000000000000001d500000000000000000000000000000000000000000000000000000000000001d600000000000000000000000000000000000000000000000000000000000001d700000000000000000000000000000000000000000000000000000000000001d800000000000000000000000000000000000000000000000000000000000001d900000000000000000000000000000000000000000000000000000000000001da00000000000000000000000000000000000000000000000000000000000001db00000000000000000000000000000000000000000000000000000000000001dc00000000000000000000000000000000000000000000000000000000000001dd00000000000000000000000000000000000000000000000000000000000001de00000000000000000000000000000000000000000000000000000000000001df00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e100000000000000000000000000000000000000000000000000000000000001e200000000000000000000000000000000000000000000000000000000000001e300000000000000000000000000000000000000000000000000000000000001e400000000000000000000000000000000000000000000000000000000000001e500000000000000000000000000000000000000000000000000000000000001e600000000000000000000000000000000000000000000000000000000000001e700000000000000000000000000000000000000000000000000000000000001e800000000000000000000000000000000000000000000000000000000000001e900000000000000000000000000000000000000000000000000000000000001ea00000000000000000000000000000000000000000000000000000000000001eb00000000000000000000000000000000000000000000000000000000000001ec00000000000000000000000000000000000000000000000000000000000001ed00000000000000000000000000000000000000000000000000000000000001ee00000000000000000000000000000000000000000000000000000000000001ef00000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000001f100000000000000000000000000000000000000000000000000000000000001f200000000000000000000000000000000000000000000000000000000000001f300000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000001f500000000000000000000000000000000000000000000000000000000000001f600000000000000000000000000000000000000000000000000000000000001f700000000000000000000000000000000000000000000000000000000000001f800000000000000000000000000000000000000000000000000000000000001f900000000000000000000000000000000000000000000000000000000000001fa00000000000000000000000000000000000000000000000000000000000001fb00000000000000000000000000000000000000000000000000000000000001fc00000000000000000000000000000000000000000000000000000000000001fd00000000000000000000000000000000000000000000000000000000000001fe00000000000000000000000000000000000000000000000000000000000001ff3f00000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c100000000000000000000000000000000000000000000000000000000000002c200000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c500000000000000000000000000000000000000000000000000000000000002c600000000000000000000000000000000000000000000000000000000000002c700000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002c900000000000000000000000000000000000000000000000000000000000002ca00000000000000000000000000000000000000000000000000000000000002cb00000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002cd00000000000000000000000000000000000000000000000000000000000002ce00000000000000000000000000000000000000000000000000000000000002cf00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d100000000000000000000000000000000000000000000000000000000000002d200000000000000000000000000000000000000000000000000000000000002d300000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d500000000000000000000000000000000000000000000000000000000000002d600000000000000000000000000000000000000000000000000000000000002d700000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002d900000000000000000000000000000000000000000000000000000000000002da00000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002dd00000000000000000000000000000000000000000000000000000000000002de00000000000000000000000000000000000000000000000000000000000002df00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e100000000000000000000000000000000000000000000000000000000000002e200000000000000000000000000000000000000000000000000000000000002e300000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e500000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000000000000000002e700000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002e900000000000000000000000000000000000000000000000000000000000002ea00000000000000000000000000000000000000000000000000000000000002eb00000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002ed00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000002ef00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f100000000000000000000000000000000000000000000000000000000000002f200000000000000000000000000000000000000000000000000000000000002f300000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f500000000000000000000000000000000000000000000000000000000000002f600000000000000000000000000000000000000000000000000000000000002f700000000000000000000000000000000000000000000000000000000000002f800000000000000000000000000000000000000000000000000000000000002f900000000000000000000000000000000000000000000000000000000000002fa00000000000000000000000000000000000000000000000000000000000002fb00000000000000000000000000000000000000000000000000000000000002fc00000000000000000000000000000000000000000000000000000000000002fd00000000000000000000000000000000000000000000000000000000000002fe0800a68d2df6e48c8b31f4c76529e586de2cd9d0f2f2fdfbc4c523db9e3a29e9b80016c236e57bf17afe324437acd1060772e3f31d4f9e734ad758d0627c4ba2a200d659011ddde95e32886bdd8c9464da1ca144ccadd539f0992b4abb491d812a00c8025bb9006a976ebd6ad940155f15f89ca0bb7312b53841fc257e7ed689c8004165f2c46b70fb183468b38f31bba7aa9d22ce8dfb61fe721470729ce1c6b100afeb60dd983514ebbaee141b2196f3eb3c9c299f576a0097872cc85a79a43f005f6bfee53d20a474901493558419dbceb3aca40e5e18915d38031498f4d2bb008791217ee341ec5dc11f7d7a31160fb1b1f2cf767062970e9526e5751956253f00000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005ca00000000000000000000000000000000000000000000000000000000000005c100000000000000000000000000000000000000000000000000000000000005cb00000000000000000000000000000000000000000000000000000000000005c200000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005c300000000000000000000000000000000000000000000000000000000000005cd00000000000000000000000000000000000000000000000000000000000005c400000000000000000000000000000000000000000000000000000000000005ce00000000000000000000000000000000000000000000000000000000000005c500000000000000000000000000000000000000000000000000000000000005cf00000000000000000000000000000000000000000000000000000000000005c600000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005c700000000000000000000000000000000000000000000000000000000000005d100000000000000000000000000000000000000000000000000000000000005c800000000000000000000000000000000000000000000000000000000000005d200000000000000000000000000000000000000000000000000000000000005c900000000000000000000000000000000000000000000000000000000000005d300000000000000000000000000000000000000000000000000000000000005ca00000000000000000000000000000000000000000000000000000000000005d400000000000000000000000000000000000000000000000000000000000005cb00000000000000000000000000000000000000000000000000000000000005d500000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005d600000000000000000000000000000000000000000000000000000000000005cd00000000000000000000000000000000000000000000000000000000000005d700000000000000000000000000000000000000000000000000000000000005ce00000000000000000000000000000000000000000000000000000000000005d800000000000000000000000000000000000000000000000000000000000005cf00000000000000000000000000000000000000000000000000000000000005d900000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005da00000000000000000000000000000000000000000000000000000000000005d100000000000000000000000000000000000000000000000000000000000005db00000000000000000000000000000000000000000000000000000000000005d200000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000005d300000000000000000000000000000000000000000000000000000000000005dd00000000000000000000000000000000000000000000000000000000000005d400000000000000000000000000000000000000000000000000000000000005de00000000000000000000000000000000000000000000000000000000000005d500000000000000000000000000000000000000000000000000000000000005df00000000000000000000000000000000000000000000000000000000000005d600000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000005d700000000000000000000000000000000000000000000000000000000000005e100000000000000000000000000000000000000000000000000000000000005d800000000000000000000000000000000000000000000000000000000000005e200000000000000000000000000000000000000000000000000000000000005d900000000000000000000000000000000000000000000000000000000000005e300000000000000000000000000000000000000000000000000000000000005da00000000000000000000000000000000000000000000000000000000000005e400000000000000000000000000000000000000000000000000000000000005db00000000000000000000000000000000000000000000000000000000000005e500000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000005e600000000000000000000000000000000000000000000000000000000000005dd00000000000000000000000000000000000000000000000000000000000005e700000000000000000000000000000000000000000000000000000000000005de00000000000000000000000000000000000000000000000000000000000005e800000000000000000000000000000000000000000000000000000000000005df00000000000000000000000000000000000000000000000000000000000005e900000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000005ea00000000000000000000000000000000000000000000000000000000000005e100000000000000000000000000000000000000000000000000000000000005eb00000000000000000000000000000000000000000000000000000000000005e200000000000000000000000000000000000000000000000000000000000005ec00000000000000000000000000000000000000000000000000000000000005e300000000000000000000000000000000000000000000000000000000000005ed00000000000000000000000000000000000000000000000000000000000005e400000000000000000000000000000000000000000000000000000000000005ee00000000000000000000000000000000000000000000000000000000000005e500000000000000000000000000000000000000000000000000000000000005ef00000000000000000000000000000000000000000000000000000000000005e600000000000000000000000000000000000000000000000000000000000005f000000000000000000000000000000000000000000000000000000000000005e700000000000000000000000000000000000000000000000000000000000005f100000000000000000000000000000000000000000000000000000000000005e800000000000000000000000000000000000000000000000000000000000005f200000000000000000000000000000000000000000000000000000000000005e900000000000000000000000000000000000000000000000000000000000005f300000000000000000000000000000000000000000000000000000000000005ea00000000000000000000000000000000000000000000000000000000000005f400000000000000000000000000000000000000000000000000000000000005eb00000000000000000000000000000000000000000000000000000000000005f500000000000000000000000000000000000000000000000000000000000005ec00000000000000000000000000000000000000000000000000000000000005f600000000000000000000000000000000000000000000000000000000000005ed00000000000000000000000000000000000000000000000000000000000005f700000000000000000000000000000000000000000000000000000000000005ee00000000000000000000000000000000000000000000000000000000000005f800000000000000000000000000000000000000000000000000000000000005ef00000000000000000000000000000000000000000000000000000000000005f900000000000000000000000000000000000000000000000000000000000005f000000000000000000000000000000000000000000000000000000000000005fa00000000000000000000000000000000000000000000000000000000000005f100000000000000000000000000000000000000000000000000000000000005fb00000000000000000000000000000000000000000000000000000000000005f200000000000000000000000000000000000000000000000000000000000005fc00000000000000000000000000000000000000000000000000000000000005f300000000000000000000000000000000000000000000000000000000000005fd00000000000000000000000000000000000000000000000000000000000005f400000000000000000000000000000000000000000000000000000000000005fe00000000000000000000000000000000000000000000000000000000000005f500000000000000000000000000000000000000000000000000000000000005ff00000000000000000000000000000000000000000000000000000000000005f6000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000005f7000000000000000000000000000000000000000000000000000000000000060100000000000000000000000000000000000000000000000000000000000005f8000000000000000000000000000000000000000000000000000000000000060200000000000000000000000000000000000000000000000000000000000005f9000000000000000000000000000000000000000000000000000000000000060300000000000000000000000000000000000000000000000000000000000005fa000000000000000000000000000000000000000000000000000000000000060400000000000000000000000000000000000000000000000000000000000005fb000000000000000000000000000000000000000000000000000000000000060500000000000000000000000000000000000000000000000000000000000005fc000000000000000000000000000000000000000000000000000000000000060600000000000000000000000000000000000000000000000000000000000005fd000000000000000000000000000000000000000000000000000000000000060700000000000000000000000000000000000000000000000000000000000005fe0000000000000000000000000000000000000000000000000000000000000608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020100000000000000000000000000000000000000000000000000000000000002020000000000000000000000000000000000000000000000000000000000000203000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000206000000000000000000000000000000000000000000000000000000000000020700000000000000000000000000000000000000000000000000000000000002080000000000000000000000000000000000000000000000000000000000000209000000000000000000000000000000000000000000000000000000000000020a000000000000000000000000000000000000000000000000000000000000020b000000000000000000000000000000000000000000000000000000000000020c000000000000000000000000000000000000000000000000000000000000020d000000000000000000000000000000000000000000000000000000000000020e000000000000000000000000000000000000000000000000000000000000020f0000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000000021100000000000000000000000000000000000000000000000000000000000002120000000000000000000000000000000000000000000000000000000000000213000000000000000000000000000000000000000000000000000000000000021400000000000000000000000000000000000000000000000000000000000002150000000000000000000000000000000000000000000000000000000000000216000000000000000000000000000000000000000000000000000000000000021700000000000000000000000000000000000000000000000000000000000002180000000000000000000000000000000000000000000000000000000000000219000000000000000000000000000000000000000000000000000000000000021a000000000000000000000000000000000000000000000000000000000000021b000000000000000000000000000000000000000000000000000000000000021c000000000000000000000000000000000000000000000000000000000000021d000000000000000000000000000000000000000000000000000000000000021e000000000000000000000000000000000000000000000000000000000000021f0000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000022100000000000000000000000000000000000000000000000000000000000002220000000000000000000000000000000000000000000000000000000000000223000000000000000000000000000000000000000000000000000000000000022400000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000226000000000000000000000000000000000000000000000000000000000000022700000000000000000000000000000000000000000000000000000000000002280000000000000000000000000000000000000000000000000000000000000229000000000000000000000000000000000000000000000000000000000000022a000000000000000000000000000000000000000000000000000000000000022b000000000000000000000000000000000000000000000000000000000000022c000000000000000000000000000000000000000000000000000000000000022d000000000000000000000000000000000000000000000000000000000000022e000000000000000000000000000000000000000000000000000000000000022f0000000000000000000000000000000000000000000000000000000000000230000000000000000000000000000000000000000000000000000000000000023100000000000000000000000000000000000000000000000000000000000002320000000000000000000000000000000000000000000000000000000000000233000000000000000000000000000000000000000000000000000000000000023400000000000000000000000000000000000000000000000000000000000002350000000000000000000000000000000000000000000000000000000000000236000000000000000000000000000000000000000000000000000000000000023700000000000000000000000000000000000000000000000000000000000002380000000000000000000000000000000000000000000000000000000000000239000000000000000000000000000000000000000000000000000000000000023a000000000000000000000000000000000000000000000000000000000000023b000000000000000000000000000000000000000000000000000000000000023c000000000000000000000000000000000000000000000000000000000000023d000000000000000000000000000000000000000000000000000000000000023e000000000000000000000000000000000000000000000000000000000000023f3f0000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030100000000000000000000000000000000000000000000000000000000000003020000000000000000000000000000000000000000000000000000000000000303000000000000000000000000000000000000000000000000000000000000030400000000000000000000000000000000000000000000000000000000000003050000000000000000000000000000000000000000000000000000000000000306000000000000000000000000000000000000000000000000000000000000030700000000000000000000000000000000000000000000000000000000000003080000000000000000000000000000000000000000000000000000000000000309000000000000000000000000000000000000000000000000000000000000030a000000000000000000000000000000000000000000000000000000000000030b000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000030d000000000000000000000000000000000000000000000000000000000000030e000000000000000000000000000000000000000000000000000000000000030f0000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000031100000000000000000000000000000000000000000000000000000000000003120000000000000000000000000000000000000000000000000000000000000313000000000000000000000000000000000000000000000000000000000000031400000000000000000000000000000000000000000000000000000000000003150000000000000000000000000000000000000000000000000000000000000316000000000000000000000000000000000000000000000000000000000000031700000000000000000000000000000000000000000000000000000000000003180000000000000000000000000000000000000000000000000000000000000319000000000000000000000000000000000000000000000000000000000000031a000000000000000000000000000000000000000000000000000000000000031b000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000031d000000000000000000000000000000000000000000000000000000000000031e000000000000000000000000000000000000000000000000000000000000031f0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032100000000000000000000000000000000000000000000000000000000000003220000000000000000000000000000000000000000000000000000000000000323000000000000000000000000000000000000000000000000000000000000032400000000000000000000000000000000000000000000000000000000000003250000000000000000000000000000000000000000000000000000000000000326000000000000000000000000000000000000000000000000000000000000032700000000000000000000000000000000000000000000000000000000000003280000000000000000000000000000000000000000000000000000000000000329000000000000000000000000000000000000000000000000000000000000032a000000000000000000000000000000000000000000000000000000000000032b000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000032d000000000000000000000000000000000000000000000000000000000000032e000000000000000000000000000000000000000000000000000000000000032f0000000000000000000000000000000000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000033100000000000000000000000000000000000000000000000000000000000003320000000000000000000000000000000000000000000000000000000000000333000000000000000000000000000000000000000000000000000000000000033400000000000000000000000000000000000000000000000000000000000003350000000000000000000000000000000000000000000000000000000000000336000000000000000000000000000000000000000000000000000000000000033700000000000000000000000000000000000000000000000000000000000003380000000000000000000000000000000000000000000000000000000000000339000000000000000000000000000000000000000000000000000000000000033a000000000000000000000000000000000000000000000000000000000000033b000000000000000000000000000000000000000000000000000000000000033c000000000000000000000000000000000000000000000000000000000000033d000000000000000000000000000000000000000000000000000000000000033e0800c064a9343bfaf1345a5ad188e96aa4c5bad0b4a5590da51a9ff8f3c98ade8d008803d57dd0923c95a01b2bfbee4df6d66dc7baee1d2cd2770575feb86d040200ea64eed9489feb7bdf29bf817a6e8772e549da7b291028852d0dd3810cee9500947e8f904d41be8a4e08b146b4e1f0cd88f55722ef987d1d485c4196ab9f71002e5d9ed5d71bc3bea6edf988c4b9ba7fceb0815180d893852ed343c64ab55c0040f7f519ec89d360d83e242b6c0ce049d2b3356b8cfbf1ff3b733ef0f8a089006f5cfe5fc4a7b87c634f9e253a7cea2052229250d0c0e913eb50b5ef3612de00b759fce0eed36bb653b67255cce111b3529c383bd7d2b758f8cb53a4451f273f0000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060a0000000000000000000000000000000000000000000000000000000000000601000000000000000000000000000000000000000000000000000000000000060b0000000000000000000000000000000000000000000000000000000000000602000000000000000000000000000000000000000000000000000000000000060c0000000000000000000000000000000000000000000000000000000000000603000000000000000000000000000000000000000000000000000000000000060d0000000000000000000000000000000000000000000000000000000000000604000000000000000000000000000000000000000000000000000000000000060e0000000000000000000000000000000000000000000000000000000000000605000000000000000000000000000000000000000000000000000000000000060f00000000000000000000000000000000000000000000000000000000000006060000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000060700000000000000000000000000000000000000000000000000000000000006110000000000000000000000000000000000000000000000000000000000000608000000000000000000000000000000000000000000000000000000000000061200000000000000000000000000000000000000000000000000000000000006090000000000000000000000000000000000000000000000000000000000000613000000000000000000000000000000000000000000000000000000000000060a0000000000000000000000000000000000000000000000000000000000000614000000000000000000000000000000000000000000000000000000000000060b0000000000000000000000000000000000000000000000000000000000000615000000000000000000000000000000000000000000000000000000000000060c0000000000000000000000000000000000000000000000000000000000000616000000000000000000000000000000000000000000000000000000000000060d0000000000000000000000000000000000000000000000000000000000000617000000000000000000000000000000000000000000000000000000000000060e0000000000000000000000000000000000000000000000000000000000000618000000000000000000000000000000000000000000000000000000000000060f00000000000000000000000000000000000000000000000000000000000006190000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000061a0000000000000000000000000000000000000000000000000000000000000611000000000000000000000000000000000000000000000000000000000000061b0000000000000000000000000000000000000000000000000000000000000612000000000000000000000000000000000000000000000000000000000000061c0000000000000000000000000000000000000000000000000000000000000613000000000000000000000000000000000000000000000000000000000000061d0000000000000000000000000000000000000000000000000000000000000614000000000000000000000000000000000000000000000000000000000000061e0000000000000000000000000000000000000000000000000000000000000615000000000000000000000000000000000000000000000000000000000000061f00000000000000000000000000000000000000000000000000000000000006160000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000061700000000000000000000000000000000000000000000000000000000000006210000000000000000000000000000000000000000000000000000000000000618000000000000000000000000000000000000000000000000000000000000062200000000000000000000000000000000000000000000000000000000000006190000000000000000000000000000000000000000000000000000000000000623000000000000000000000000000000000000000000000000000000000000061a0000000000000000000000000000000000000000000000000000000000000624000000000000000000000000000000000000000000000000000000000000061b0000000000000000000000000000000000000000000000000000000000000625000000000000000000000000000000000000000000000000000000000000061c0000000000000000000000000000000000000000000000000000000000000626000000000000000000000000000000000000000000000000000000000000061d0000000000000000000000000000000000000000000000000000000000000627000000000000000000000000000000000000000000000000000000000000061e0000000000000000000000000000000000000000000000000000000000000628000000000000000000000000000000000000000000000000000000000000061f00000000000000000000000000000000000000000000000000000000000006290000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000062a0000000000000000000000000000000000000000000000000000000000000621000000000000000000000000000000000000000000000000000000000000062b0000000000000000000000000000000000000000000000000000000000000622000000000000000000000000000000000000000000000000000000000000062c0000000000000000000000000000000000000000000000000000000000000623000000000000000000000000000000000000000000000000000000000000062d0000000000000000000000000000000000000000000000000000000000000624000000000000000000000000000000000000000000000000000000000000062e0000000000000000000000000000000000000000000000000000000000000625000000000000000000000000000000000000000000000000000000000000062f00000000000000000000000000000000000000000000000000000000000006260000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000062700000000000000000000000000000000000000000000000000000000000006310000000000000000000000000000000000000000000000000000000000000628000000000000000000000000000000000000000000000000000000000000063200000000000000000000000000000000000000000000000000000000000006290000000000000000000000000000000000000000000000000000000000000633000000000000000000000000000000000000000000000000000000000000062a0000000000000000000000000000000000000000000000000000000000000634000000000000000000000000000000000000000000000000000000000000062b0000000000000000000000000000000000000000000000000000000000000635000000000000000000000000000000000000000000000000000000000000062c0000000000000000000000000000000000000000000000000000000000000636000000000000000000000000000000000000000000000000000000000000062d0000000000000000000000000000000000000000000000000000000000000637000000000000000000000000000000000000000000000000000000000000062e0000000000000000000000000000000000000000000000000000000000000638000000000000000000000000000000000000000000000000000000000000062f00000000000000000000000000000000000000000000000000000000000006390000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000063a0000000000000000000000000000000000000000000000000000000000000631000000000000000000000000000000000000000000000000000000000000063b0000000000000000000000000000000000000000000000000000000000000632000000000000000000000000000000000000000000000000000000000000063c0000000000000000000000000000000000000000000000000000000000000633000000000000000000000000000000000000000000000000000000000000063d0000000000000000000000000000000000000000000000000000000000000634000000000000000000000000000000000000000000000000000000000000063e0000000000000000000000000000000000000000000000000000000000000635000000000000000000000000000000000000000000000000000000000000063f00000000000000000000000000000000000000000000000000000000000006360000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000063700000000000000000000000000000000000000000000000000000000000006410000000000000000000000000000000000000000000000000000000000000638000000000000000000000000000000000000000000000000000000000000064200000000000000000000000000000000000000000000000000000000000006390000000000000000000000000000000000000000000000000000000000000643000000000000000000000000000000000000000000000000000000000000063a0000000000000000000000000000000000000000000000000000000000000644000000000000000000000000000000000000000000000000000000000000063b0000000000000000000000000000000000000000000000000000000000000645000000000000000000000000000000000000000000000000000000000000063c0000000000000000000000000000000000000000000000000000000000000646000000000000000000000000000000000000000000000000000000000000063d0000000000000000000000000000000000000000000000000000000000000647000000000000000000000000000000000000000000000000000000000000063e0000000000000000000000000000000000000000000000000000000000000648000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e000000000000000000000000000000000000000000000000000000000000024f0000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000025100000000000000000000000000000000000000000000000000000000000002520000000000000000000000000000000000000000000000000000000000000253000000000000000000000000000000000000000000000000000000000000025400000000000000000000000000000000000000000000000000000000000002550000000000000000000000000000000000000000000000000000000000000256000000000000000000000000000000000000000000000000000000000000025700000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000025a000000000000000000000000000000000000000000000000000000000000025b000000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000025d000000000000000000000000000000000000000000000000000000000000025e000000000000000000000000000000000000000000000000000000000000025f0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e000000000000000000000000000000000000000000000000000000000000026f0000000000000000000000000000000000000000000000000000000000000270000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000002720000000000000000000000000000000000000000000000000000000000000273000000000000000000000000000000000000000000000000000000000000027400000000000000000000000000000000000000000000000000000000000002750000000000000000000000000000000000000000000000000000000000000276000000000000000000000000000000000000000000000000000000000000027700000000000000000000000000000000000000000000000000000000000002780000000000000000000000000000000000000000000000000000000000000279000000000000000000000000000000000000000000000000000000000000027a000000000000000000000000000000000000000000000000000000000000027b000000000000000000000000000000000000000000000000000000000000027c000000000000000000000000000000000000000000000000000000000000027d000000000000000000000000000000000000000000000000000000000000027e000000000000000000000000000000000000000000000000000000000000027f3f0000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000034100000000000000000000000000000000000000000000000000000000000003420000000000000000000000000000000000000000000000000000000000000343000000000000000000000000000000000000000000000000000000000000034400000000000000000000000000000000000000000000000000000000000003450000000000000000000000000000000000000000000000000000000000000346000000000000000000000000000000000000000000000000000000000000034700000000000000000000000000000000000000000000000000000000000003480000000000000000000000000000000000000000000000000000000000000349000000000000000000000000000000000000000000000000000000000000034a000000000000000000000000000000000000000000000000000000000000034b000000000000000000000000000000000000000000000000000000000000034c000000000000000000000000000000000000000000000000000000000000034d000000000000000000000000000000000000000000000000000000000000034e000000000000000000000000000000000000000000000000000000000000034f0000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000035100000000000000000000000000000000000000000000000000000000000003520000000000000000000000000000000000000000000000000000000000000353000000000000000000000000000000000000000000000000000000000000035400000000000000000000000000000000000000000000000000000000000003550000000000000000000000000000000000000000000000000000000000000356000000000000000000000000000000000000000000000000000000000000035700000000000000000000000000000000000000000000000000000000000003580000000000000000000000000000000000000000000000000000000000000359000000000000000000000000000000000000000000000000000000000000035a000000000000000000000000000000000000000000000000000000000000035b000000000000000000000000000000000000000000000000000000000000035c000000000000000000000000000000000000000000000000000000000000035d000000000000000000000000000000000000000000000000000000000000035e000000000000000000000000000000000000000000000000000000000000035f0000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000036100000000000000000000000000000000000000000000000000000000000003620000000000000000000000000000000000000000000000000000000000000363000000000000000000000000000000000000000000000000000000000000036400000000000000000000000000000000000000000000000000000000000003650000000000000000000000000000000000000000000000000000000000000366000000000000000000000000000000000000000000000000000000000000036700000000000000000000000000000000000000000000000000000000000003680000000000000000000000000000000000000000000000000000000000000369000000000000000000000000000000000000000000000000000000000000036a000000000000000000000000000000000000000000000000000000000000036b000000000000000000000000000000000000000000000000000000000000036c000000000000000000000000000000000000000000000000000000000000036d000000000000000000000000000000000000000000000000000000000000036e000000000000000000000000000000000000000000000000000000000000036f0000000000000000000000000000000000000000000000000000000000000370000000000000000000000000000000000000000000000000000000000000037100000000000000000000000000000000000000000000000000000000000003720000000000000000000000000000000000000000000000000000000000000373000000000000000000000000000000000000000000000000000000000000037400000000000000000000000000000000000000000000000000000000000003750000000000000000000000000000000000000000000000000000000000000376000000000000000000000000000000000000000000000000000000000000037700000000000000000000000000000000000000000000000000000000000003780000000000000000000000000000000000000000000000000000000000000379000000000000000000000000000000000000000000000000000000000000037a000000000000000000000000000000000000000000000000000000000000037b000000000000000000000000000000000000000000000000000000000000037c000000000000000000000000000000000000000000000000000000000000037d000000000000000000000000000000000000000000000000000000000000037e08003bbb1177505f3433bb062787fcac6585d30fa1a7e0b809ca5eef1cecc56cd0002d5b86280022d106b72e4425ea49f927ca2b8138fc13b3d9feeaf36ae61fb100adab9d66b73ae23a6e9127ebe0bcd963ef4312dd66878a6be131d39a7ee01c00d48f30dbb82c96c734c8abe33f4f9f75e6d0ba4462ee07d73c5335e04a02e900f31a3a4e7333ac6043a929fca12f5347e9e8bf1d67f5993860a774f10b77bc00230e3132bfa5df23e2e018b20cd4e0c75555825ee7924da73f017a279d39cd0095e2affd6b67c6ecbf77fa1e638139498e1642abb468c58ca8ce275260ea6100362e0941035fd171fab926caf55d18b22f7de99d60ac6f454386a9cce4a1ff3f0000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064a0000000000000000000000000000000000000000000000000000000000000641000000000000000000000000000000000000000000000000000000000000064b0000000000000000000000000000000000000000000000000000000000000642000000000000000000000000000000000000000000000000000000000000064c0000000000000000000000000000000000000000000000000000000000000643000000000000000000000000000000000000000000000000000000000000064d0000000000000000000000000000000000000000000000000000000000000644000000000000000000000000000000000000000000000000000000000000064e0000000000000000000000000000000000000000000000000000000000000645000000000000000000000000000000000000000000000000000000000000064f00000000000000000000000000000000000000000000000000000000000006460000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000064700000000000000000000000000000000000000000000000000000000000006510000000000000000000000000000000000000000000000000000000000000648000000000000000000000000000000000000000000000000000000000000065200000000000000000000000000000000000000000000000000000000000006490000000000000000000000000000000000000000000000000000000000000653000000000000000000000000000000000000000000000000000000000000064a0000000000000000000000000000000000000000000000000000000000000654000000000000000000000000000000000000000000000000000000000000064b0000000000000000000000000000000000000000000000000000000000000655000000000000000000000000000000000000000000000000000000000000064c0000000000000000000000000000000000000000000000000000000000000656000000000000000000000000000000000000000000000000000000000000064d0000000000000000000000000000000000000000000000000000000000000657000000000000000000000000000000000000000000000000000000000000064e0000000000000000000000000000000000000000000000000000000000000658000000000000000000000000000000000000000000000000000000000000064f00000000000000000000000000000000000000000000000000000000000006590000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000065a0000000000000000000000000000000000000000000000000000000000000651000000000000000000000000000000000000000000000000000000000000065b0000000000000000000000000000000000000000000000000000000000000652000000000000000000000000000000000000000000000000000000000000065c0000000000000000000000000000000000000000000000000000000000000653000000000000000000000000000000000000000000000000000000000000065d0000000000000000000000000000000000000000000000000000000000000654000000000000000000000000000000000000000000000000000000000000065e0000000000000000000000000000000000000000000000000000000000000655000000000000000000000000000000000000000000000000000000000000065f00000000000000000000000000000000000000000000000000000000000006560000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000065700000000000000000000000000000000000000000000000000000000000006610000000000000000000000000000000000000000000000000000000000000658000000000000000000000000000000000000000000000000000000000000066200000000000000000000000000000000000000000000000000000000000006590000000000000000000000000000000000000000000000000000000000000663000000000000000000000000000000000000000000000000000000000000065a0000000000000000000000000000000000000000000000000000000000000664000000000000000000000000000000000000000000000000000000000000065b0000000000000000000000000000000000000000000000000000000000000665000000000000000000000000000000000000000000000000000000000000065c0000000000000000000000000000000000000000000000000000000000000666000000000000000000000000000000000000000000000000000000000000065d0000000000000000000000000000000000000000000000000000000000000667000000000000000000000000000000000000000000000000000000000000065e0000000000000000000000000000000000000000000000000000000000000668000000000000000000000000000000000000000000000000000000000000065f00000000000000000000000000000000000000000000000000000000000006690000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000066a0000000000000000000000000000000000000000000000000000000000000661000000000000000000000000000000000000000000000000000000000000066b0000000000000000000000000000000000000000000000000000000000000662000000000000000000000000000000000000000000000000000000000000066c0000000000000000000000000000000000000000000000000000000000000663000000000000000000000000000000000000000000000000000000000000066d0000000000000000000000000000000000000000000000000000000000000664000000000000000000000000000000000000000000000000000000000000066e0000000000000000000000000000000000000000000000000000000000000665000000000000000000000000000000000000000000000000000000000000066f00000000000000000000000000000000000000000000000000000000000006660000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000066700000000000000000000000000000000000000000000000000000000000006710000000000000000000000000000000000000000000000000000000000000668000000000000000000000000000000000000000000000000000000000000067200000000000000000000000000000000000000000000000000000000000006690000000000000000000000000000000000000000000000000000000000000673000000000000000000000000000000000000000000000000000000000000066a0000000000000000000000000000000000000000000000000000000000000674000000000000000000000000000000000000000000000000000000000000066b0000000000000000000000000000000000000000000000000000000000000675000000000000000000000000000000000000000000000000000000000000066c0000000000000000000000000000000000000000000000000000000000000676000000000000000000000000000000000000000000000000000000000000066d0000000000000000000000000000000000000000000000000000000000000677000000000000000000000000000000000000000000000000000000000000066e0000000000000000000000000000000000000000000000000000000000000678000000000000000000000000000000000000000000000000000000000000066f00000000000000000000000000000000000000000000000000000000000006790000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000067a0000000000000000000000000000000000000000000000000000000000000671000000000000000000000000000000000000000000000000000000000000067b0000000000000000000000000000000000000000000000000000000000000672000000000000000000000000000000000000000000000000000000000000067c0000000000000000000000000000000000000000000000000000000000000673000000000000000000000000000000000000000000000000000000000000067d0000000000000000000000000000000000000000000000000000000000000674000000000000000000000000000000000000000000000000000000000000067e0000000000000000000000000000000000000000000000000000000000000675000000000000000000000000000000000000000000000000000000000000067f00000000000000000000000000000000000000000000000000000000000006760000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000067700000000000000000000000000000000000000000000000000000000000006810000000000000000000000000000000000000000000000000000000000000678000000000000000000000000000000000000000000000000000000000000068200000000000000000000000000000000000000000000000000000000000006790000000000000000000000000000000000000000000000000000000000000683000000000000000000000000000000000000000000000000000000000000067a0000000000000000000000000000000000000000000000000000000000000684000000000000000000000000000000000000000000000000000000000000067b0000000000000000000000000000000000000000000000000000000000000685000000000000000000000000000000000000000000000000000000000000067c0000000000000000000000000000000000000000000000000000000000000686000000000000000000000000000000000000000000000000000000000000067d0000000000000000000000000000000000000000000000000000000000000687000000000000000000000000000000000000000000000000000000000000067e0000000000000000000000000000000000000000000000000000000000000688000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e000000000000000000000000000000000000000000000000000000000000028f0000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000029100000000000000000000000000000000000000000000000000000000000002920000000000000000000000000000000000000000000000000000000000000293000000000000000000000000000000000000000000000000000000000000029400000000000000000000000000000000000000000000000000000000000002950000000000000000000000000000000000000000000000000000000000000296000000000000000000000000000000000000000000000000000000000000029700000000000000000000000000000000000000000000000000000000000002980000000000000000000000000000000000000000000000000000000000000299000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000029b000000000000000000000000000000000000000000000000000000000000029c000000000000000000000000000000000000000000000000000000000000029d000000000000000000000000000000000000000000000000000000000000029e000000000000000000000000000000000000000000000000000000000000029f00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a100000000000000000000000000000000000000000000000000000000000002a200000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a500000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002a700000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002a900000000000000000000000000000000000000000000000000000000000002aa00000000000000000000000000000000000000000000000000000000000002ab00000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002ad00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002af00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b100000000000000000000000000000000000000000000000000000000000002b200000000000000000000000000000000000000000000000000000000000002b300000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b500000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002b700000000000000000000000000000000000000000000000000000000000002b800000000000000000000000000000000000000000000000000000000000002b900000000000000000000000000000000000000000000000000000000000002ba00000000000000000000000000000000000000000000000000000000000002bb00000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000002bd00000000000000000000000000000000000000000000000000000000000002be00000000000000000000000000000000000000000000000000000000000002bf3f0000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000038100000000000000000000000000000000000000000000000000000000000003820000000000000000000000000000000000000000000000000000000000000383000000000000000000000000000000000000000000000000000000000000038400000000000000000000000000000000000000000000000000000000000003850000000000000000000000000000000000000000000000000000000000000386000000000000000000000000000000000000000000000000000000000000038700000000000000000000000000000000000000000000000000000000000003880000000000000000000000000000000000000000000000000000000000000389000000000000000000000000000000000000000000000000000000000000038a000000000000000000000000000000000000000000000000000000000000038b000000000000000000000000000000000000000000000000000000000000038c000000000000000000000000000000000000000000000000000000000000038d000000000000000000000000000000000000000000000000000000000000038e000000000000000000000000000000000000000000000000000000000000038f0000000000000000000000000000000000000000000000000000000000000390000000000000000000000000000000000000000000000000000000000000039100000000000000000000000000000000000000000000000000000000000003920000000000000000000000000000000000000000000000000000000000000393000000000000000000000000000000000000000000000000000000000000039400000000000000000000000000000000000000000000000000000000000003950000000000000000000000000000000000000000000000000000000000000396000000000000000000000000000000000000000000000000000000000000039700000000000000000000000000000000000000000000000000000000000003980000000000000000000000000000000000000000000000000000000000000399000000000000000000000000000000000000000000000000000000000000039a000000000000000000000000000000000000000000000000000000000000039b000000000000000000000000000000000000000000000000000000000000039c000000000000000000000000000000000000000000000000000000000000039d000000000000000000000000000000000000000000000000000000000000039e000000000000000000000000000000000000000000000000000000000000039f00000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003a100000000000000000000000000000000000000000000000000000000000003a200000000000000000000000000000000000000000000000000000000000003a300000000000000000000000000000000000000000000000000000000000003a400000000000000000000000000000000000000000000000000000000000003a500000000000000000000000000000000000000000000000000000000000003a600000000000000000000000000000000000000000000000000000000000003a700000000000000000000000000000000000000000000000000000000000003a800000000000000000000000000000000000000000000000000000000000003a900000000000000000000000000000000000000000000000000000000000003aa00000000000000000000000000000000000000000000000000000000000003ab00000000000000000000000000000000000000000000000000000000000003ac00000000000000000000000000000000000000000000000000000000000003ad00000000000000000000000000000000000000000000000000000000000003ae00000000000000000000000000000000000000000000000000000000000003af00000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003b100000000000000000000000000000000000000000000000000000000000003b200000000000000000000000000000000000000000000000000000000000003b300000000000000000000000000000000000000000000000000000000000003b400000000000000000000000000000000000000000000000000000000000003b500000000000000000000000000000000000000000000000000000000000003b600000000000000000000000000000000000000000000000000000000000003b700000000000000000000000000000000000000000000000000000000000003b800000000000000000000000000000000000000000000000000000000000003b900000000000000000000000000000000000000000000000000000000000003ba00000000000000000000000000000000000000000000000000000000000003bb00000000000000000000000000000000000000000000000000000000000003bc00000000000000000000000000000000000000000000000000000000000003bd00000000000000000000000000000000000000000000000000000000000003be08004a32502b5d2a0cf5d776c92ef74de61a28e7882bdadeb3b0530f472704604300808c2412e2725ecaa6a6bd77e3159349e238dc7817f906ba32afd40b3cb3cb00d7d4e3b313c4cce9bd98c317ea715847a92d795b82a6f8b8144b7c61bee64200b76f07678c289f41378029b1353a73e1afbe241612a97c23e7fc059099f49d00c72046b39a9dc902cee36db5214c72315636bd824abfabdf80b1c5e6a01fd7006e0a74fec166a12f5a62954776784f01cba3be7ab876eef2e49a2ab7a5b0f900c83ddd8f6b91086bc83485adbe8056212b4d33b91840cd3dc649f9736881460022441e76225010acce7f429dc754fb3260ae1d387937978f69c67a879ed0733f0000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000068a0000000000000000000000000000000000000000000000000000000000000681000000000000000000000000000000000000000000000000000000000000068b0000000000000000000000000000000000000000000000000000000000000682000000000000000000000000000000000000000000000000000000000000068c0000000000000000000000000000000000000000000000000000000000000683000000000000000000000000000000000000000000000000000000000000068d0000000000000000000000000000000000000000000000000000000000000684000000000000000000000000000000000000000000000000000000000000068e0000000000000000000000000000000000000000000000000000000000000685000000000000000000000000000000000000000000000000000000000000068f00000000000000000000000000000000000000000000000000000000000006860000000000000000000000000000000000000000000000000000000000000690000000000000000000000000000000000000000000000000000000000000068700000000000000000000000000000000000000000000000000000000000006910000000000000000000000000000000000000000000000000000000000000688000000000000000000000000000000000000000000000000000000000000069200000000000000000000000000000000000000000000000000000000000006890000000000000000000000000000000000000000000000000000000000000693000000000000000000000000000000000000000000000000000000000000068a0000000000000000000000000000000000000000000000000000000000000694000000000000000000000000000000000000000000000000000000000000068b0000000000000000000000000000000000000000000000000000000000000695000000000000000000000000000000000000000000000000000000000000068c0000000000000000000000000000000000000000000000000000000000000696000000000000000000000000000000000000000000000000000000000000068d0000000000000000000000000000000000000000000000000000000000000697000000000000000000000000000000000000000000000000000000000000068e0000000000000000000000000000000000000000000000000000000000000698000000000000000000000000000000000000000000000000000000000000068f00000000000000000000000000000000000000000000000000000000000006990000000000000000000000000000000000000000000000000000000000000690000000000000000000000000000000000000000000000000000000000000069a0000000000000000000000000000000000000000000000000000000000000691000000000000000000000000000000000000000000000000000000000000069b0000000000000000000000000000000000000000000000000000000000000692000000000000000000000000000000000000000000000000000000000000069c0000000000000000000000000000000000000000000000000000000000000693000000000000000000000000000000000000000000000000000000000000069d0000000000000000000000000000000000000000000000000000000000000694000000000000000000000000000000000000000000000000000000000000069e0000000000000000000000000000000000000000000000000000000000000695000000000000000000000000000000000000000000000000000000000000069f000000000000000000000000000000000000000000000000000000000000069600000000000000000000000000000000000000000000000000000000000006a0000000000000000000000000000000000000000000000000000000000000069700000000000000000000000000000000000000000000000000000000000006a1000000000000000000000000000000000000000000000000000000000000069800000000000000000000000000000000000000000000000000000000000006a2000000000000000000000000000000000000000000000000000000000000069900000000000000000000000000000000000000000000000000000000000006a3000000000000000000000000000000000000000000000000000000000000069a00000000000000000000000000000000000000000000000000000000000006a4000000000000000000000000000000000000000000000000000000000000069b00000000000000000000000000000000000000000000000000000000000006a5000000000000000000000000000000000000000000000000000000000000069c00000000000000000000000000000000000000000000000000000000000006a6000000000000000000000000000000000000000000000000000000000000069d00000000000000000000000000000000000000000000000000000000000006a7000000000000000000000000000000000000000000000000000000000000069e00000000000000000000000000000000000000000000000000000000000006a8000000000000000000000000000000000000000000000000000000000000069f00000000000000000000000000000000000000000000000000000000000006a900000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006aa00000000000000000000000000000000000000000000000000000000000006a100000000000000000000000000000000000000000000000000000000000006ab00000000000000000000000000000000000000000000000000000000000006a200000000000000000000000000000000000000000000000000000000000006ac00000000000000000000000000000000000000000000000000000000000006a300000000000000000000000000000000000000000000000000000000000006ad00000000000000000000000000000000000000000000000000000000000006a400000000000000000000000000000000000000000000000000000000000006ae00000000000000000000000000000000000000000000000000000000000006a500000000000000000000000000000000000000000000000000000000000006af00000000000000000000000000000000000000000000000000000000000006a600000000000000000000000000000000000000000000000000000000000006b000000000000000000000000000000000000000000000000000000000000006a700000000000000000000000000000000000000000000000000000000000006b100000000000000000000000000000000000000000000000000000000000006a800000000000000000000000000000000000000000000000000000000000006b200000000000000000000000000000000000000000000000000000000000006a900000000000000000000000000000000000000000000000000000000000006b300000000000000000000000000000000000000000000000000000000000006aa00000000000000000000000000000000000000000000000000000000000006b400000000000000000000000000000000000000000000000000000000000006ab00000000000000000000000000000000000000000000000000000000000006b500000000000000000000000000000000000000000000000000000000000006ac00000000000000000000000000000000000000000000000000000000000006b600000000000000000000000000000000000000000000000000000000000006ad00000000000000000000000000000000000000000000000000000000000006b700000000000000000000000000000000000000000000000000000000000006ae00000000000000000000000000000000000000000000000000000000000006b800000000000000000000000000000000000000000000000000000000000006af00000000000000000000000000000000000000000000000000000000000006b900000000000000000000000000000000000000000000000000000000000006b000000000000000000000000000000000000000000000000000000000000006ba00000000000000000000000000000000000000000000000000000000000006b100000000000000000000000000000000000000000000000000000000000006bb00000000000000000000000000000000000000000000000000000000000006b200000000000000000000000000000000000000000000000000000000000006bc00000000000000000000000000000000000000000000000000000000000006b300000000000000000000000000000000000000000000000000000000000006bd00000000000000000000000000000000000000000000000000000000000006b400000000000000000000000000000000000000000000000000000000000006be00000000000000000000000000000000000000000000000000000000000006b500000000000000000000000000000000000000000000000000000000000006bf00000000000000000000000000000000000000000000000000000000000006b600000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006b700000000000000000000000000000000000000000000000000000000000006c100000000000000000000000000000000000000000000000000000000000006b800000000000000000000000000000000000000000000000000000000000006c200000000000000000000000000000000000000000000000000000000000006b900000000000000000000000000000000000000000000000000000000000006c300000000000000000000000000000000000000000000000000000000000006ba00000000000000000000000000000000000000000000000000000000000006c400000000000000000000000000000000000000000000000000000000000006bb00000000000000000000000000000000000000000000000000000000000006c500000000000000000000000000000000000000000000000000000000000006bc00000000000000000000000000000000000000000000000000000000000006c600000000000000000000000000000000000000000000000000000000000006bd00000000000000000000000000000000000000000000000000000000000006c700000000000000000000000000000000000000000000000000000000000006be00000000000000000000000000000000000000000000000000000000000006c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c100000000000000000000000000000000000000000000000000000000000002c200000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c500000000000000000000000000000000000000000000000000000000000002c600000000000000000000000000000000000000000000000000000000000002c700000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002c900000000000000000000000000000000000000000000000000000000000002ca00000000000000000000000000000000000000000000000000000000000002cb00000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002cd00000000000000000000000000000000000000000000000000000000000002ce00000000000000000000000000000000000000000000000000000000000002cf00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d100000000000000000000000000000000000000000000000000000000000002d200000000000000000000000000000000000000000000000000000000000002d300000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d500000000000000000000000000000000000000000000000000000000000002d600000000000000000000000000000000000000000000000000000000000002d700000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002d900000000000000000000000000000000000000000000000000000000000002da00000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002dd00000000000000000000000000000000000000000000000000000000000002de00000000000000000000000000000000000000000000000000000000000002df00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e100000000000000000000000000000000000000000000000000000000000002e200000000000000000000000000000000000000000000000000000000000002e300000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e500000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000000000000000002e700000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002e900000000000000000000000000000000000000000000000000000000000002ea00000000000000000000000000000000000000000000000000000000000002eb00000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002ed00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000002ef00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f100000000000000000000000000000000000000000000000000000000000002f200000000000000000000000000000000000000000000000000000000000002f300000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f500000000000000000000000000000000000000000000000000000000000002f600000000000000000000000000000000000000000000000000000000000002f700000000000000000000000000000000000000000000000000000000000002f800000000000000000000000000000000000000000000000000000000000002f900000000000000000000000000000000000000000000000000000000000002fa00000000000000000000000000000000000000000000000000000000000002fb00000000000000000000000000000000000000000000000000000000000002fc00000000000000000000000000000000000000000000000000000000000002fd00000000000000000000000000000000000000000000000000000000000002fe00000000000000000000000000000000000000000000000000000000000002ff3f00000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003c100000000000000000000000000000000000000000000000000000000000003c200000000000000000000000000000000000000000000000000000000000003c300000000000000000000000000000000000000000000000000000000000003c400000000000000000000000000000000000000000000000000000000000003c500000000000000000000000000000000000000000000000000000000000003c600000000000000000000000000000000000000000000000000000000000003c700000000000000000000000000000000000000000000000000000000000003c800000000000000000000000000000000000000000000000000000000000003c900000000000000000000000000000000000000000000000000000000000003ca00000000000000000000000000000000000000000000000000000000000003cb00000000000000000000000000000000000000000000000000000000000003cc00000000000000000000000000000000000000000000000000000000000003cd00000000000000000000000000000000000000000000000000000000000003ce00000000000000000000000000000000000000000000000000000000000003cf00000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003d100000000000000000000000000000000000000000000000000000000000003d200000000000000000000000000000000000000000000000000000000000003d300000000000000000000000000000000000000000000000000000000000003d400000000000000000000000000000000000000000000000000000000000003d500000000000000000000000000000000000000000000000000000000000003d600000000000000000000000000000000000000000000000000000000000003d700000000000000000000000000000000000000000000000000000000000003d800000000000000000000000000000000000000000000000000000000000003d900000000000000000000000000000000000000000000000000000000000003da00000000000000000000000000000000000000000000000000000000000003db00000000000000000000000000000000000000000000000000000000000003dc00000000000000000000000000000000000000000000000000000000000003dd00000000000000000000000000000000000000000000000000000000000003de00000000000000000000000000000000000000000000000000000000000003df00000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003e100000000000000000000000000000000000000000000000000000000000003e200000000000000000000000000000000000000000000000000000000000003e300000000000000000000000000000000000000000000000000000000000003e400000000000000000000000000000000000000000000000000000000000003e500000000000000000000000000000000000000000000000000000000000003e600000000000000000000000000000000000000000000000000000000000003e700000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003e900000000000000000000000000000000000000000000000000000000000003ea00000000000000000000000000000000000000000000000000000000000003eb00000000000000000000000000000000000000000000000000000000000003ec00000000000000000000000000000000000000000000000000000000000003ed00000000000000000000000000000000000000000000000000000000000003ee00000000000000000000000000000000000000000000000000000000000003ef00000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000003f100000000000000000000000000000000000000000000000000000000000003f200000000000000000000000000000000000000000000000000000000000003f300000000000000000000000000000000000000000000000000000000000003f400000000000000000000000000000000000000000000000000000000000003f500000000000000000000000000000000000000000000000000000000000003f600000000000000000000000000000000000000000000000000000000000003f700000000000000000000000000000000000000000000000000000000000003f800000000000000000000000000000000000000000000000000000000000003f900000000000000000000000000000000000000000000000000000000000003fa00000000000000000000000000000000000000000000000000000000000003fb00000000000000000000000000000000000000000000000000000000000003fc00000000000000000000000000000000000000000000000000000000000003fd00000000000000000000000000000000000000000000000000000000000003fe0800bb07f923e24c36227d717557d58d32b99370b81f7a70d1835becc1114f7d7700624291eff6ab801e5668bc6619a3df132f8b392b063f09dfe8a69e38224eb200bd6b195f8716ab3dc93c44037cac579d25d0e77c2782b5aa62534ee25d36bc008c99d470d2c53624a8c5bedfeffdcc5356f6da89ee0e372b3ea3fa4f8cd652009944e00a3f9a7d2e8a535d3a210c3271d5732518037704d67ef5d42a8b82c200523014cb6eabe4366c6e599ba96534fc15ecc804a13fbaaacf8717e1b0a8d20005621252c4b36c113f21ad6c13b99e5cef514bdd98ef0aae4075b5cb5a000a00d80cb2a60aae6c3d2e7d27fb1519a708a18bb5b5085f78684bdee7512856a93f00000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006ca00000000000000000000000000000000000000000000000000000000000006c100000000000000000000000000000000000000000000000000000000000006cb00000000000000000000000000000000000000000000000000000000000006c200000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006c300000000000000000000000000000000000000000000000000000000000006cd00000000000000000000000000000000000000000000000000000000000006c400000000000000000000000000000000000000000000000000000000000006ce00000000000000000000000000000000000000000000000000000000000006c500000000000000000000000000000000000000000000000000000000000006cf00000000000000000000000000000000000000000000000000000000000006c600000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006c700000000000000000000000000000000000000000000000000000000000006d100000000000000000000000000000000000000000000000000000000000006c800000000000000000000000000000000000000000000000000000000000006d200000000000000000000000000000000000000000000000000000000000006c900000000000000000000000000000000000000000000000000000000000006d300000000000000000000000000000000000000000000000000000000000006ca00000000000000000000000000000000000000000000000000000000000006d400000000000000000000000000000000000000000000000000000000000006cb00000000000000000000000000000000000000000000000000000000000006d500000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006d600000000000000000000000000000000000000000000000000000000000006cd00000000000000000000000000000000000000000000000000000000000006d700000000000000000000000000000000000000000000000000000000000006ce00000000000000000000000000000000000000000000000000000000000006d800000000000000000000000000000000000000000000000000000000000006cf00000000000000000000000000000000000000000000000000000000000006d900000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006da00000000000000000000000000000000000000000000000000000000000006d100000000000000000000000000000000000000000000000000000000000006db00000000000000000000000000000000000000000000000000000000000006d200000000000000000000000000000000000000000000000000000000000006dc00000000000000000000000000000000000000000000000000000000000006d300000000000000000000000000000000000000000000000000000000000006dd00000000000000000000000000000000000000000000000000000000000006d400000000000000000000000000000000000000000000000000000000000006de00000000000000000000000000000000000000000000000000000000000006d500000000000000000000000000000000000000000000000000000000000006df00000000000000000000000000000000000000000000000000000000000006d600000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000006d700000000000000000000000000000000000000000000000000000000000006e100000000000000000000000000000000000000000000000000000000000006d800000000000000000000000000000000000000000000000000000000000006e200000000000000000000000000000000000000000000000000000000000006d900000000000000000000000000000000000000000000000000000000000006e300000000000000000000000000000000000000000000000000000000000006da00000000000000000000000000000000000000000000000000000000000006e400000000000000000000000000000000000000000000000000000000000006db00000000000000000000000000000000000000000000000000000000000006e500000000000000000000000000000000000000000000000000000000000006dc00000000000000000000000000000000000000000000000000000000000006e600000000000000000000000000000000000000000000000000000000000006dd00000000000000000000000000000000000000000000000000000000000006e700000000000000000000000000000000000000000000000000000000000006de00000000000000000000000000000000000000000000000000000000000006e800000000000000000000000000000000000000000000000000000000000006df00000000000000000000000000000000000000000000000000000000000006e900000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000006ea00000000000000000000000000000000000000000000000000000000000006e100000000000000000000000000000000000000000000000000000000000006eb00000000000000000000000000000000000000000000000000000000000006e200000000000000000000000000000000000000000000000000000000000006ec00000000000000000000000000000000000000000000000000000000000006e300000000000000000000000000000000000000000000000000000000000006ed00000000000000000000000000000000000000000000000000000000000006e400000000000000000000000000000000000000000000000000000000000006ee00000000000000000000000000000000000000000000000000000000000006e500000000000000000000000000000000000000000000000000000000000006ef00000000000000000000000000000000000000000000000000000000000006e600000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006e700000000000000000000000000000000000000000000000000000000000006f100000000000000000000000000000000000000000000000000000000000006e800000000000000000000000000000000000000000000000000000000000006f200000000000000000000000000000000000000000000000000000000000006e900000000000000000000000000000000000000000000000000000000000006f300000000000000000000000000000000000000000000000000000000000006ea00000000000000000000000000000000000000000000000000000000000006f400000000000000000000000000000000000000000000000000000000000006eb00000000000000000000000000000000000000000000000000000000000006f500000000000000000000000000000000000000000000000000000000000006ec00000000000000000000000000000000000000000000000000000000000006f600000000000000000000000000000000000000000000000000000000000006ed00000000000000000000000000000000000000000000000000000000000006f700000000000000000000000000000000000000000000000000000000000006ee00000000000000000000000000000000000000000000000000000000000006f800000000000000000000000000000000000000000000000000000000000006ef00000000000000000000000000000000000000000000000000000000000006f900000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006fa00000000000000000000000000000000000000000000000000000000000006f100000000000000000000000000000000000000000000000000000000000006fb00000000000000000000000000000000000000000000000000000000000006f200000000000000000000000000000000000000000000000000000000000006fc00000000000000000000000000000000000000000000000000000000000006f300000000000000000000000000000000000000000000000000000000000006fd00000000000000000000000000000000000000000000000000000000000006f400000000000000000000000000000000000000000000000000000000000006fe00000000000000000000000000000000000000000000000000000000000006f500000000000000000000000000000000000000000000000000000000000006ff00000000000000000000000000000000000000000000000000000000000006f6000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000006f7000000000000000000000000000000000000000000000000000000000000070100000000000000000000000000000000000000000000000000000000000006f8000000000000000000000000000000000000000000000000000000000000070200000000000000000000000000000000000000000000000000000000000006f9000000000000000000000000000000000000000000000000000000000000070300000000000000000000000000000000000000000000000000000000000006fa000000000000000000000000000000000000000000000000000000000000070400000000000000000000000000000000000000000000000000000000000006fb000000000000000000000000000000000000000000000000000000000000070500000000000000000000000000000000000000000000000000000000000006fc000000000000000000000000000000000000000000000000000000000000070600000000000000000000000000000000000000000000000000000000000006fd000000000000000000000000000000000000000000000000000000000000070700000000000000000000000000000000000000000000000000000000000006fe0000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030100000000000000000000000000000000000000000000000000000000000003020000000000000000000000000000000000000000000000000000000000000303000000000000000000000000000000000000000000000000000000000000030400000000000000000000000000000000000000000000000000000000000003050000000000000000000000000000000000000000000000000000000000000306000000000000000000000000000000000000000000000000000000000000030700000000000000000000000000000000000000000000000000000000000003080000000000000000000000000000000000000000000000000000000000000309000000000000000000000000000000000000000000000000000000000000030a000000000000000000000000000000000000000000000000000000000000030b000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000030d000000000000000000000000000000000000000000000000000000000000030e000000000000000000000000000000000000000000000000000000000000030f0000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000031100000000000000000000000000000000000000000000000000000000000003120000000000000000000000000000000000000000000000000000000000000313000000000000000000000000000000000000000000000000000000000000031400000000000000000000000000000000000000000000000000000000000003150000000000000000000000000000000000000000000000000000000000000316000000000000000000000000000000000000000000000000000000000000031700000000000000000000000000000000000000000000000000000000000003180000000000000000000000000000000000000000000000000000000000000319000000000000000000000000000000000000000000000000000000000000031a000000000000000000000000000000000000000000000000000000000000031b000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000031d000000000000000000000000000000000000000000000000000000000000031e000000000000000000000000000000000000000000000000000000000000031f0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032100000000000000000000000000000000000000000000000000000000000003220000000000000000000000000000000000000000000000000000000000000323000000000000000000000000000000000000000000000000000000000000032400000000000000000000000000000000000000000000000000000000000003250000000000000000000000000000000000000000000000000000000000000326000000000000000000000000000000000000000000000000000000000000032700000000000000000000000000000000000000000000000000000000000003280000000000000000000000000000000000000000000000000000000000000329000000000000000000000000000000000000000000000000000000000000032a000000000000000000000000000000000000000000000000000000000000032b000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000032d000000000000000000000000000000000000000000000000000000000000032e000000000000000000000000000000000000000000000000000000000000032f0000000000000000000000000000000000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000033100000000000000000000000000000000000000000000000000000000000003320000000000000000000000000000000000000000000000000000000000000333000000000000000000000000000000000000000000000000000000000000033400000000000000000000000000000000000000000000000000000000000003350000000000000000000000000000000000000000000000000000000000000336000000000000000000000000000000000000000000000000000000000000033700000000000000000000000000000000000000000000000000000000000003380000000000000000000000000000000000000000000000000000000000000339000000000000000000000000000000000000000000000000000000000000033a000000000000000000000000000000000000000000000000000000000000033b000000000000000000000000000000000000000000000000000000000000033c000000000000000000000000000000000000000000000000000000000000033d000000000000000000000000000000000000000000000000000000000000033e000000000000000000000000000000000000000000000000000000000000033f3f0000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040100000000000000000000000000000000000000000000000000000000000004020000000000000000000000000000000000000000000000000000000000000403000000000000000000000000000000000000000000000000000000000000040400000000000000000000000000000000000000000000000000000000000004050000000000000000000000000000000000000000000000000000000000000406000000000000000000000000000000000000000000000000000000000000040700000000000000000000000000000000000000000000000000000000000004080000000000000000000000000000000000000000000000000000000000000409000000000000000000000000000000000000000000000000000000000000040a000000000000000000000000000000000000000000000000000000000000040b000000000000000000000000000000000000000000000000000000000000040c000000000000000000000000000000000000000000000000000000000000040d000000000000000000000000000000000000000000000000000000000000040e000000000000000000000000000000000000000000000000000000000000040f0000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000041100000000000000000000000000000000000000000000000000000000000004120000000000000000000000000000000000000000000000000000000000000413000000000000000000000000000000000000000000000000000000000000041400000000000000000000000000000000000000000000000000000000000004150000000000000000000000000000000000000000000000000000000000000416000000000000000000000000000000000000000000000000000000000000041700000000000000000000000000000000000000000000000000000000000004180000000000000000000000000000000000000000000000000000000000000419000000000000000000000000000000000000000000000000000000000000041a000000000000000000000000000000000000000000000000000000000000041b000000000000000000000000000000000000000000000000000000000000041c000000000000000000000000000000000000000000000000000000000000041d000000000000000000000000000000000000000000000000000000000000041e000000000000000000000000000000000000000000000000000000000000041f0000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000042100000000000000000000000000000000000000000000000000000000000004220000000000000000000000000000000000000000000000000000000000000423000000000000000000000000000000000000000000000000000000000000042400000000000000000000000000000000000000000000000000000000000004250000000000000000000000000000000000000000000000000000000000000426000000000000000000000000000000000000000000000000000000000000042700000000000000000000000000000000000000000000000000000000000004280000000000000000000000000000000000000000000000000000000000000429000000000000000000000000000000000000000000000000000000000000042a000000000000000000000000000000000000000000000000000000000000042b000000000000000000000000000000000000000000000000000000000000042c000000000000000000000000000000000000000000000000000000000000042d000000000000000000000000000000000000000000000000000000000000042e000000000000000000000000000000000000000000000000000000000000042f0000000000000000000000000000000000000000000000000000000000000430000000000000000000000000000000000000000000000000000000000000043100000000000000000000000000000000000000000000000000000000000004320000000000000000000000000000000000000000000000000000000000000433000000000000000000000000000000000000000000000000000000000000043400000000000000000000000000000000000000000000000000000000000004350000000000000000000000000000000000000000000000000000000000000436000000000000000000000000000000000000000000000000000000000000043700000000000000000000000000000000000000000000000000000000000004380000000000000000000000000000000000000000000000000000000000000439000000000000000000000000000000000000000000000000000000000000043a000000000000000000000000000000000000000000000000000000000000043b000000000000000000000000000000000000000000000000000000000000043c000000000000000000000000000000000000000000000000000000000000043d000000000000000000000000000000000000000000000000000000000000043e0800a38df4d53fe5da3d48c97dd0f58e7a52faade40c8f50bc0f6408a2b5b3829800a3d4b994758c6630518cce3116391874b9b3b8a1bbcb36485d2702f05af359004c06e9dd14418667d7c66384699665f9222ed08be87c67293a2f1b6b4c41aa006b77b11703f0e3d21aa68c9f6d2ae8ad94ecafdb56be0c4605a0c6723e9ddc0049a087e215b640d8360f8dd98e07c77e4d2025a0dcdcaf78bc00bd6fde09680014741a52013a10622de90b1a7854f1203af5c97121a4b3774c249fba6e0dba00c783bd01c4a4cafe83fd3b4d1ce0c555be4b6d1f772cccccf86049f9af0bbe002ff3ac4d7e2f1caf1fb30e1d20eba5be2b6a42dd54690dee988a934026491e3f0000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000070a0000000000000000000000000000000000000000000000000000000000000701000000000000000000000000000000000000000000000000000000000000070b0000000000000000000000000000000000000000000000000000000000000702000000000000000000000000000000000000000000000000000000000000070c0000000000000000000000000000000000000000000000000000000000000703000000000000000000000000000000000000000000000000000000000000070d0000000000000000000000000000000000000000000000000000000000000704000000000000000000000000000000000000000000000000000000000000070e0000000000000000000000000000000000000000000000000000000000000705000000000000000000000000000000000000000000000000000000000000070f00000000000000000000000000000000000000000000000000000000000007060000000000000000000000000000000000000000000000000000000000000710000000000000000000000000000000000000000000000000000000000000070700000000000000000000000000000000000000000000000000000000000007110000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000071200000000000000000000000000000000000000000000000000000000000007090000000000000000000000000000000000000000000000000000000000000713000000000000000000000000000000000000000000000000000000000000070a0000000000000000000000000000000000000000000000000000000000000714000000000000000000000000000000000000000000000000000000000000070b0000000000000000000000000000000000000000000000000000000000000715000000000000000000000000000000000000000000000000000000000000070c0000000000000000000000000000000000000000000000000000000000000716000000000000000000000000000000000000000000000000000000000000070d0000000000000000000000000000000000000000000000000000000000000717000000000000000000000000000000000000000000000000000000000000070e0000000000000000000000000000000000000000000000000000000000000718000000000000000000000000000000000000000000000000000000000000070f00000000000000000000000000000000000000000000000000000000000007190000000000000000000000000000000000000000000000000000000000000710000000000000000000000000000000000000000000000000000000000000071a0000000000000000000000000000000000000000000000000000000000000711000000000000000000000000000000000000000000000000000000000000071b0000000000000000000000000000000000000000000000000000000000000712000000000000000000000000000000000000000000000000000000000000071c0000000000000000000000000000000000000000000000000000000000000713000000000000000000000000000000000000000000000000000000000000071d0000000000000000000000000000000000000000000000000000000000000714000000000000000000000000000000000000000000000000000000000000071e0000000000000000000000000000000000000000000000000000000000000715000000000000000000000000000000000000000000000000000000000000071f00000000000000000000000000000000000000000000000000000000000007160000000000000000000000000000000000000000000000000000000000000720000000000000000000000000000000000000000000000000000000000000071700000000000000000000000000000000000000000000000000000000000007210000000000000000000000000000000000000000000000000000000000000718000000000000000000000000000000000000000000000000000000000000072200000000000000000000000000000000000000000000000000000000000007190000000000000000000000000000000000000000000000000000000000000723000000000000000000000000000000000000000000000000000000000000071a0000000000000000000000000000000000000000000000000000000000000724000000000000000000000000000000000000000000000000000000000000071b0000000000000000000000000000000000000000000000000000000000000725000000000000000000000000000000000000000000000000000000000000071c0000000000000000000000000000000000000000000000000000000000000726000000000000000000000000000000000000000000000000000000000000071d0000000000000000000000000000000000000000000000000000000000000727000000000000000000000000000000000000000000000000000000000000071e0000000000000000000000000000000000000000000000000000000000000728000000000000000000000000000000000000000000000000000000000000071f00000000000000000000000000000000000000000000000000000000000007290000000000000000000000000000000000000000000000000000000000000720000000000000000000000000000000000000000000000000000000000000072a0000000000000000000000000000000000000000000000000000000000000721000000000000000000000000000000000000000000000000000000000000072b0000000000000000000000000000000000000000000000000000000000000722000000000000000000000000000000000000000000000000000000000000072c0000000000000000000000000000000000000000000000000000000000000723000000000000000000000000000000000000000000000000000000000000072d0000000000000000000000000000000000000000000000000000000000000724000000000000000000000000000000000000000000000000000000000000072e0000000000000000000000000000000000000000000000000000000000000725000000000000000000000000000000000000000000000000000000000000072f00000000000000000000000000000000000000000000000000000000000007260000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000072700000000000000000000000000000000000000000000000000000000000007310000000000000000000000000000000000000000000000000000000000000728000000000000000000000000000000000000000000000000000000000000073200000000000000000000000000000000000000000000000000000000000007290000000000000000000000000000000000000000000000000000000000000733000000000000000000000000000000000000000000000000000000000000072a0000000000000000000000000000000000000000000000000000000000000734000000000000000000000000000000000000000000000000000000000000072b0000000000000000000000000000000000000000000000000000000000000735000000000000000000000000000000000000000000000000000000000000072c0000000000000000000000000000000000000000000000000000000000000736000000000000000000000000000000000000000000000000000000000000072d0000000000000000000000000000000000000000000000000000000000000737000000000000000000000000000000000000000000000000000000000000072e0000000000000000000000000000000000000000000000000000000000000738000000000000000000000000000000000000000000000000000000000000072f00000000000000000000000000000000000000000000000000000000000007390000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000073a0000000000000000000000000000000000000000000000000000000000000731000000000000000000000000000000000000000000000000000000000000073b0000000000000000000000000000000000000000000000000000000000000732000000000000000000000000000000000000000000000000000000000000073c0000000000000000000000000000000000000000000000000000000000000733000000000000000000000000000000000000000000000000000000000000073d0000000000000000000000000000000000000000000000000000000000000734000000000000000000000000000000000000000000000000000000000000073e0000000000000000000000000000000000000000000000000000000000000735000000000000000000000000000000000000000000000000000000000000073f00000000000000000000000000000000000000000000000000000000000007360000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000073700000000000000000000000000000000000000000000000000000000000007410000000000000000000000000000000000000000000000000000000000000738000000000000000000000000000000000000000000000000000000000000074200000000000000000000000000000000000000000000000000000000000007390000000000000000000000000000000000000000000000000000000000000743000000000000000000000000000000000000000000000000000000000000073a0000000000000000000000000000000000000000000000000000000000000744000000000000000000000000000000000000000000000000000000000000073b0000000000000000000000000000000000000000000000000000000000000745000000000000000000000000000000000000000000000000000000000000073c0000000000000000000000000000000000000000000000000000000000000746000000000000000000000000000000000000000000000000000000000000073d0000000000000000000000000000000000000000000000000000000000000747000000000000000000000000000000000000000000000000000000000000073e0000000000000000000000000000000000000000000000000000000000000748000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "txsEffectsHash": "0x00e73bbc5444fa184c4c8bdd7f3ae7e3060c0b9a1a0ad96fe7472a7854786778", "decodedHeader": { "contentCommitment": { "inHash": "0x00212ff46db74e06c26240f9a92fb6fea84709380935d657361bbd5bcb891937", - "outHash": "0x00d4b436f0c9857646ed7cf0836bd61c857183956d1acefe52fc99ef7b333a38", - "numTxs": 4, - "txsEffectsHash": "0x008e46703a73fee39cb8a1bd50a03e090eb250de227639bbf1448462452bd646" + "outHash": "0x00b581181fdd29a9e20363313973f1545a94d0157e542d9b116ff7ae3f58a428", + "numTxs": 8, + "txsEffectsHash": "0x00e73bbc5444fa184c4c8bdd7f3ae7e3060c0b9a1a0ad96fe7472a7854786778" }, "globalVariables": { "blockNumber": 2, "slotNumber": "0x000000000000000000000000000000000000000000000000000000000000003c", "chainId": 31337, - "timestamp": 1725363769, + "timestamp": 1727208133, "version": 1, - "coinbase": "0x8b4e0a203a4cb152c773e772e885992eae96c1f5", - "feeRecipient": "0x2e8dcd300baa8f3802239585fb4b2cd9e80da86f6107dff3c3214ae9098937d2", + "coinbase": "0x47df7fa0407be5ecb80fb4f6441b8e38e4368bc5", + "feeRecipient": "0x09a496f12ed3c5b7a3487bf866dab5c856207360f96e7510cb501b04725de16c", "gasFees": { "feePerDaGas": 0, "feePerL2Gas": 0 @@ -83,7 +116,7 @@ }, "lastArchive": { "nextAvailableLeafIndex": 2, - "root": "0x216b15f092c571bf4e72deff46dbfc36e706d0dae56313d6dde566c42c2c706c" + "root": "0x1eaee3f73128f764a0f5693fee59234aa4d8c07f6f54a1a6311a28a4c516b8fd" }, "stateReference": { "l1ToL2MessageTree": { @@ -106,8 +139,8 @@ } } }, - "header": "0x216b15f092c571bf4e72deff46dbfc36e706d0dae56313d6dde566c42c2c706c000000020000000000000000000000000000000000000000000000000000000000000004008e46703a73fee39cb8a1bd50a03e090eb250de227639bbf1448462452bd64600212ff46db74e06c26240f9a92fb6fea84709380935d657361bbd5bcb89193700d4b436f0c9857646ed7cf0836bd61c857183956d1acefe52fc99ef7b333a38224c43ed89fb9404e06e7382170d1e279a53211bab61876f38d8a4180390b7ad0000002017752a4346cf34b18277458ace73be4895316cb1c3cbce628d573d5d10cde7ce00000200152db065a479b5630768d6c5250bb6233e71729f857c16cffa98569acf90a2bf000002800a020b31737a919cbd6b0c0fe25d466a11e2186eb8038cd63a5e7d2900473d53000002800000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000066d6f6398b4e0a203a4cb152c773e772e885992eae96c1f52e8dcd300baa8f3802239585fb4b2cd9e80da86f6107dff3c3214ae9098937d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "publicInputsHash": "0x0036cc7f0dc092d6e6a05eeb3482ec901a4631d4ae504a5aa41cb465e0bf7f4c", - "numTxs": 4 + "header": "0x1eaee3f73128f764a0f5693fee59234aa4d8c07f6f54a1a6311a28a4c516b8fd00000002000000000000000000000000000000000000000000000000000000000000000800e73bbc5444fa184c4c8bdd7f3ae7e3060c0b9a1a0ad96fe7472a785478677800212ff46db74e06c26240f9a92fb6fea84709380935d657361bbd5bcb89193700b581181fdd29a9e20363313973f1545a94d0157e542d9b116ff7ae3f58a428224c43ed89fb9404e06e7382170d1e279a53211bab61876f38d8a4180390b7ad0000002017752a4346cf34b18277458ace73be4895316cb1c3cbce628d573d5d10cde7ce00000200152db065a479b5630768d6c5250bb6233e71729f857c16cffa98569acf90a2bf000002800a020b31737a919cbd6b0c0fe25d466a11e2186eb8038cd63a5e7d2900473d53000002800000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000066f31ac547df7fa0407be5ecb80fb4f6441b8e38e4368bc509a496f12ed3c5b7a3487bf866dab5c856207360f96e7510cb501b04725de16c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "publicInputsHash": "0x0063acf7c9628aad087697bc1531503809956b7f7cb71754f8083c52d3b2edbc", + "numTxs": 8 } } \ No newline at end of file diff --git a/l1-contracts/test/governance/registry/Base.t.sol b/l1-contracts/test/governance/registry/Base.t.sol new file mode 100644 index 00000000000..e76ef145355 --- /dev/null +++ b/l1-contracts/test/governance/registry/Base.t.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.27; + +import {Test} from "forge-std/Test.sol"; + +import {Registry} from "@aztec/governance/Registry.sol"; + +contract RegistryBase is Test { + Registry internal registry; + + function setUp() public { + registry = new Registry(address(this)); + } +} diff --git a/l1-contracts/test/governance/registry/getCurentSnapshotTest.t.sol b/l1-contracts/test/governance/registry/getCurentSnapshotTest.t.sol new file mode 100644 index 00000000000..4e9e1d652db --- /dev/null +++ b/l1-contracts/test/governance/registry/getCurentSnapshotTest.t.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.27; + +import {RegistryBase} from "./Base.t.sol"; + +import {DataStructures} from "@aztec/governance/libraries/DataStructures.sol"; + +contract GetCurrentSnapshotTest is RegistryBase { + function test_GivenOneListedRollup() external { + // it should return the newest + DataStructures.RegistrySnapshot memory snapshot = registry.getCurrentSnapshot(); + assertEq(snapshot.blockNumber, block.number); + assertEq(snapshot.rollup, address(0xdead)); + assertEq(registry.numberOfVersions(), 1); + } + + function test_GivenMultipleListedRollups() external { + // it should return the newest + address rollup = address(uint160(uint256(bytes32("new instance")))); + registry.upgrade(rollup); + + DataStructures.RegistrySnapshot memory snapshot = registry.getCurrentSnapshot(); + assertEq(snapshot.blockNumber, block.number); + assertGt(snapshot.blockNumber, 0); + assertEq(snapshot.rollup, rollup); + } +} diff --git a/l1-contracts/test/governance/registry/getCurentSnapshotTest.tree b/l1-contracts/test/governance/registry/getCurentSnapshotTest.tree new file mode 100644 index 00000000000..0b2a3b826a7 --- /dev/null +++ b/l1-contracts/test/governance/registry/getCurentSnapshotTest.tree @@ -0,0 +1,5 @@ +GetCurrentSnapshotTest +├── given one listed rollup +│ └── it should return the newest +└── given multiple listed rollups + └── it should return the newest \ No newline at end of file diff --git a/l1-contracts/test/governance/registry/getRollup.t.sol b/l1-contracts/test/governance/registry/getRollup.t.sol new file mode 100644 index 00000000000..28d336f32e1 --- /dev/null +++ b/l1-contracts/test/governance/registry/getRollup.t.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.27; + +import {RegistryBase} from "./Base.t.sol"; + +contract GetRollupTest is RegistryBase { + function test_GivenOneListedRollup() external { + // it should return the newest + assertEq(registry.getRollup(), address(0xdead)); + } + + function test_GivenMultipleListedRollups() external { + // it should return the newest + address rollup = address(uint160(uint256(bytes32("new instance")))); + registry.upgrade(rollup); + assertEq(registry.getRollup(), rollup); + } +} diff --git a/l1-contracts/test/governance/registry/getRollup.tree b/l1-contracts/test/governance/registry/getRollup.tree new file mode 100644 index 00000000000..6064511d509 --- /dev/null +++ b/l1-contracts/test/governance/registry/getRollup.tree @@ -0,0 +1,5 @@ +GetRollupTest +├── given one listed rollup +│ └── it should return the newest +└── given multiple listed rollups + └── it should return the newest \ No newline at end of file diff --git a/l1-contracts/test/governance/registry/getSnapshot.t.sol b/l1-contracts/test/governance/registry/getSnapshot.t.sol new file mode 100644 index 00000000000..2c3ee39e8b7 --- /dev/null +++ b/l1-contracts/test/governance/registry/getSnapshot.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.27; + +import {RegistryBase} from "./Base.t.sol"; + +import {DataStructures} from "@aztec/governance/libraries/DataStructures.sol"; + +contract GetSnapshotTest is RegistryBase { + modifier givenMultipleListedRollups() { + _; + } + + function test_When_versionExists() external givenMultipleListedRollups { + // it should return the snapshot + + DataStructures.RegistrySnapshot memory snapshot = registry.getSnapshot(0); + assertEq(snapshot.blockNumber, block.number); + assertEq(snapshot.rollup, address(0xdead)); + assertEq(registry.numberOfVersions(), 1); + } + + function test_When_versionDoesNotExists(uint256 _version) external givenMultipleListedRollups { + // it should return empty snapshot + + uint256 version = bound(_version, 1, type(uint256).max); + + DataStructures.RegistrySnapshot memory snapshot = registry.getSnapshot(version); + assertEq(snapshot.blockNumber, 0); + assertEq(snapshot.rollup, address(0)); + assertEq(registry.numberOfVersions(), 1); + } +} diff --git a/l1-contracts/test/governance/registry/getSnapshot.tree b/l1-contracts/test/governance/registry/getSnapshot.tree new file mode 100644 index 00000000000..ed095a9473e --- /dev/null +++ b/l1-contracts/test/governance/registry/getSnapshot.tree @@ -0,0 +1,6 @@ +GetSnapshotTest +└── given multiple listed rollups + ├── when _version exists + │ └── it should return the snapshot + └── when _version does not exists + └── it should return empty snapshot \ No newline at end of file diff --git a/l1-contracts/test/governance/registry/getVersionFor.t.sol b/l1-contracts/test/governance/registry/getVersionFor.t.sol new file mode 100644 index 00000000000..e9a6a05b0c5 --- /dev/null +++ b/l1-contracts/test/governance/registry/getVersionFor.t.sol @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.27; + +import {RegistryBase} from "./Base.t.sol"; +import {Errors} from "@aztec/governance/libraries/Errors.sol"; + +contract GetVersionForTest is RegistryBase { + address internal rollup; + + modifier givenNoAdditionalListedRollups() { + _; + } + + function test_When_rollupIs0xdead() external givenNoAdditionalListedRollups { + // it should return 0 + assertEq(registry.getVersionFor(address(0xdead)), 0); + } + + function test_RevertWhen__rollupNot0xdead(address _rollup) + external + givenNoAdditionalListedRollups + { + // it should revert + vm.assume(_rollup != address(0xdead)); + vm.expectRevert(abi.encodeWithSelector(Errors.Registry__RollupNotRegistered.selector, _rollup)); + registry.getVersionFor(_rollup); + } + + modifier givenMultipleListedRollups() { + rollup = address(0xbeef); + registry.upgrade(rollup); + _; + } + + function test_When_rollupIsListed() external givenMultipleListedRollups { + // it should return the rollup version + assertEq(registry.getVersionFor(address(0xdead)), 0); + assertEq(registry.getVersionFor(address(0xbeef)), 1); + } + + function test_RevertWhen__rollupIsNotListed(address _rollup) external givenMultipleListedRollups { + // it should revert + vm.assume(_rollup != address(0xdead) && _rollup != address(0xbeef)); + vm.expectRevert(abi.encodeWithSelector(Errors.Registry__RollupNotRegistered.selector, _rollup)); + registry.getVersionFor(_rollup); + } +} diff --git a/l1-contracts/test/governance/registry/getVersionFor.tree b/l1-contracts/test/governance/registry/getVersionFor.tree new file mode 100644 index 00000000000..25e2d07b3aa --- /dev/null +++ b/l1-contracts/test/governance/registry/getVersionFor.tree @@ -0,0 +1,11 @@ +GetVersionForTest +├── given no additional listed rollups +│ ├── when _rollup is 0xdead +│ │ └── it should return 0 +│ └── when _rollup not 0xdead +│ └── it should revert +└── given multiple listed rollups + ├── when _rollup is listed + │ └── it should return the rollup version + └── when _rollup is not listed + └── it should revert \ No newline at end of file diff --git a/l1-contracts/test/governance/registry/isRollupRegistered.t.sol b/l1-contracts/test/governance/registry/isRollupRegistered.t.sol new file mode 100644 index 00000000000..b426dedf039 --- /dev/null +++ b/l1-contracts/test/governance/registry/isRollupRegistered.t.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.27; + +import {RegistryBase} from "./Base.t.sol"; + +contract IsRollupRegisteredTest is RegistryBase { + address internal rollup; + + modifier givenNoAdditionalListedRollups() { + _; + } + + function test_When_rollupIs0xdead() external givenNoAdditionalListedRollups { + // it should return true + assertTrue(registry.isRollupRegistered(address(0xdead))); + } + + function test_When_rollupNot0xdead(address _rollup) external givenNoAdditionalListedRollups { + // it should return false + vm.assume(_rollup != address(0xdead)); + assertFalse(registry.isRollupRegistered(_rollup)); + } + + modifier givenMultipleListedRollups() { + rollup = address(0xbeef); + registry.upgrade(rollup); + _; + } + + function test_When_rollupIsListed() external givenMultipleListedRollups { + // it should return true + assertTrue(registry.isRollupRegistered(address(0xdead))); + assertTrue(registry.isRollupRegistered(address(0xbeef))); + } + + function test_When_rollupIsNotListed(address _rollup) external givenMultipleListedRollups { + // it should return false + vm.assume(_rollup != address(0xdead) && _rollup != address(0xbeef)); + assertFalse(registry.isRollupRegistered(_rollup)); + } +} diff --git a/l1-contracts/test/governance/registry/isRollupRegistered.tree b/l1-contracts/test/governance/registry/isRollupRegistered.tree new file mode 100644 index 00000000000..b5b06372076 --- /dev/null +++ b/l1-contracts/test/governance/registry/isRollupRegistered.tree @@ -0,0 +1,11 @@ +IsRollupRegisteredTest +├── given no additional listed rollups +│ ├── when _rollup is 0xdead +│ │ └── it should return true +│ └── when _rollup not 0xdead +│ └── it should return false +└── given multiple listed rollups + ├── when _rollup is listed + │ └── it should return true + └── when _rollup is not listed + └── it should return false \ No newline at end of file diff --git a/l1-contracts/test/governance/registry/upgrade.t.sol b/l1-contracts/test/governance/registry/upgrade.t.sol new file mode 100644 index 00000000000..534465031b6 --- /dev/null +++ b/l1-contracts/test/governance/registry/upgrade.t.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.27; + +import {RegistryBase} from "./Base.t.sol"; + +import {Ownable} from "@oz/access/Ownable.sol"; + +import {IRegistry} from "@aztec/governance/interfaces/IRegistry.sol"; +import {Errors} from "@aztec/governance/libraries/Errors.sol"; +import {DataStructures} from "@aztec/governance/libraries/DataStructures.sol"; + +contract UpgradeTest is RegistryBase { + function test_RevertWhen_CallerIsNotOwner(address _caller) external { + // it should revert + vm.assume(_caller != address(this)); + vm.prank(_caller); + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, _caller)); + registry.upgrade(address(uint160(uint256(bytes32("new instance"))))); + } + + modifier whenCallerIsOwner() { + _; + } + + function test_RevertWhen_RollupAlreadyInSet() external whenCallerIsOwner { + // it should revert + address rollup = registry.getRollup(); + + vm.expectRevert( + abi.encodeWithSelector(Errors.Registry__RollupAlreadyRegistered.selector, rollup) + ); + registry.upgrade(rollup); + } + + function test_WhenRollupNotAlreadyInSet(address _rollup) external whenCallerIsOwner { + // it should add the rollup to state + // it should emit a {InstanceAdded} event + vm.assume(_rollup != address(0xdead)); + + { + DataStructures.RegistrySnapshot memory snapshotBefore = registry.getCurrentSnapshot(); + assertEq(snapshotBefore.blockNumber, block.number); + assertEq(snapshotBefore.rollup, address(0xdead)); + assertEq(registry.numberOfVersions(), 1); + } + + vm.expectEmit(true, true, false, false, address(registry)); + emit IRegistry.InstanceAdded(_rollup, 1); + registry.upgrade(_rollup); + + assertEq(registry.numberOfVersions(), 2); + + DataStructures.RegistrySnapshot memory snapshot = registry.getCurrentSnapshot(); + assertEq(snapshot.blockNumber, block.number); + assertGt(snapshot.blockNumber, 0); + assertEq(snapshot.rollup, _rollup); + } +} diff --git a/l1-contracts/test/governance/registry/upgrade.tree b/l1-contracts/test/governance/registry/upgrade.tree new file mode 100644 index 00000000000..ac72d6892c3 --- /dev/null +++ b/l1-contracts/test/governance/registry/upgrade.tree @@ -0,0 +1,9 @@ +UpgradeTest +├── when caller is not owner +│ └── it should revert +└── when caller is owner + ├── when rollup already in set + │ └── it should revert + └── when rollup not already in set + ├── it should add the rollup to state + └── it should emit a {InstanceAdded} event \ No newline at end of file diff --git a/l1-contracts/src/core/messagebridge/frontier_tree/Frontier.sol b/l1-contracts/test/harnesses/Frontier.sol similarity index 70% rename from l1-contracts/src/core/messagebridge/frontier_tree/Frontier.sol rename to l1-contracts/test/harnesses/Frontier.sol index 48582bc47a8..60cc4d800a1 100644 --- a/l1-contracts/src/core/messagebridge/frontier_tree/Frontier.sol +++ b/l1-contracts/test/harnesses/Frontier.sol @@ -1,17 +1,16 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -import {FrontierLib} from "./FrontierLib.sol"; +import {FrontierLib} from "@aztec/core/libraries/crypto/FrontierLib.sol"; -import {IFrontier} from "../../interfaces/messagebridge/IFrontier.sol"; import {Ownable} from "@oz/access/Ownable.sol"; // This truncates each hash and hash preimage to 31 bytes to follow Noir. // It follows the logic in /noir-protocol-circuits/crates/parity-lib/src/utils/sha256_merkle_tree.nr // TODO(Miranda): Possibly nuke this contract, and use a generic version which can either use // regular sha256 or sha256ToField when emulating circuits -contract FrontierMerkle is IFrontier, Ownable { +contract FrontierMerkle is Ownable { using FrontierLib for FrontierLib.Tree; using FrontierLib for FrontierLib.Forest; @@ -29,15 +28,15 @@ contract FrontierMerkle is IFrontier, Ownable { forest.initialize(_height); } - function insertLeaf(bytes32 _leaf) external override(IFrontier) onlyOwner returns (uint256) { + function insertLeaf(bytes32 _leaf) external onlyOwner returns (uint256) { return tree.insertLeaf(_leaf); } - function root() external view override(IFrontier) returns (bytes32) { + function root() external view returns (bytes32) { return tree.root(forest, HEIGHT, SIZE); } - function isFull() external view override(IFrontier) returns (bool) { + function isFull() external view returns (bool) { return tree.isFull(SIZE); } } diff --git a/l1-contracts/test/harnesses/InboxHarness.sol b/l1-contracts/test/harnesses/InboxHarness.sol index d0152d137af..420960467c2 100644 --- a/l1-contracts/test/harnesses/InboxHarness.sol +++ b/l1-contracts/test/harnesses/InboxHarness.sol @@ -1,12 +1,11 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -import {Inbox} from "../../src/core/messagebridge/Inbox.sol"; -import {FrontierLib} from "../../src/core/messagebridge/frontier_tree/FrontierLib.sol"; +import {Inbox} from "@aztec/core/messagebridge/Inbox.sol"; -// Libraries -import {Constants} from "../../src/core/libraries/ConstantsGen.sol"; +import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; +import {FrontierLib} from "@aztec/core/libraries/crypto/FrontierLib.sol"; contract InboxHarness is Inbox { using FrontierLib for FrontierLib.Tree; diff --git a/l1-contracts/test/merkle/Frontier.t.sol b/l1-contracts/test/merkle/Frontier.t.sol index fa4cb85956e..b6b8e3844a9 100644 --- a/l1-contracts/test/merkle/Frontier.t.sol +++ b/l1-contracts/test/merkle/Frontier.t.sol @@ -1,14 +1,17 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import {Test} from "forge-std/Test.sol"; import {NaiveMerkle} from "./Naive.sol"; -import {FrontierMerkle} from "./../../src/core/messagebridge/frontier_tree/Frontier.sol"; +import {FrontierMerkle} from "../harnesses/Frontier.sol"; contract FrontierTest is Test { - function setUp() public {} + function setUp() public { + // Pause gas metering as calculating the root on each insert is expensive + vm.pauseGasMetering(); + } function testFrontier() public { uint256 depth = 10; diff --git a/l1-contracts/test/merkle/MerkleLib.t.sol b/l1-contracts/test/merkle/MerkleLib.t.sol index b296fae8947..53886f5073c 100644 --- a/l1-contracts/test/merkle/MerkleLib.t.sol +++ b/l1-contracts/test/merkle/MerkleLib.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import {Test} from "forge-std/Test.sol"; diff --git a/l1-contracts/test/merkle/Naive.sol b/l1-contracts/test/merkle/Naive.sol index 9d9fcbf84b2..63367438c5c 100644 --- a/l1-contracts/test/merkle/Naive.sol +++ b/l1-contracts/test/merkle/Naive.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -import {Hash} from "../../src/core/libraries/Hash.sol"; +import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; contract NaiveMerkle { uint256 public immutable DEPTH; diff --git a/l1-contracts/test/merkle/Naive.t.sol b/l1-contracts/test/merkle/Naive.t.sol index d3f056781ec..34269d32564 100644 --- a/l1-contracts/test/merkle/Naive.t.sol +++ b/l1-contracts/test/merkle/Naive.t.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import {Test} from "forge-std/Test.sol"; -import {Hash} from "../../src/core/libraries/Hash.sol"; +import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; import {NaiveMerkle} from "./Naive.sol"; contract NaiveTest is Test { diff --git a/l1-contracts/test/merkle/TestUtil.sol b/l1-contracts/test/merkle/TestUtil.sol index 4ca20511fcd..2024b461150 100644 --- a/l1-contracts/test/merkle/TestUtil.sol +++ b/l1-contracts/test/merkle/TestUtil.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import {Test} from "forge-std/Test.sol"; diff --git a/l1-contracts/test/merkle/UnbalancedMerkle.t.sol b/l1-contracts/test/merkle/UnbalancedMerkle.t.sol index ce3604351ab..e248f878b5a 100644 --- a/l1-contracts/test/merkle/UnbalancedMerkle.t.sol +++ b/l1-contracts/test/merkle/UnbalancedMerkle.t.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import {Test} from "forge-std/Test.sol"; -import {Hash} from "../../src/core/libraries/Hash.sol"; +import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; import {TxsDecoderHelper} from "../decoders/helpers/TxsDecoderHelper.sol"; /** diff --git a/l1-contracts/test/merkle/helpers/MerkleLibHelper.sol b/l1-contracts/test/merkle/helpers/MerkleLibHelper.sol index be8234ea023..a897896666b 100644 --- a/l1-contracts/test/merkle/helpers/MerkleLibHelper.sol +++ b/l1-contracts/test/merkle/helpers/MerkleLibHelper.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; -import {MerkleLib} from "../../../src/core/libraries/MerkleLib.sol"; +import {MerkleLib} from "@aztec/core/libraries/crypto/MerkleLib.sol"; // A wrapper used to be able to "call" library functions, instead of "jumping" to them, allowing forge to catch the reverts contract MerkleLibHelper { diff --git a/l1-contracts/test/portals/DataStructures.sol b/l1-contracts/test/portals/DataStructures.sol index 03245f859c1..e47a772897c 100644 --- a/l1-contracts/test/portals/DataStructures.sol +++ b/l1-contracts/test/portals/DataStructures.sol @@ -1,7 +1,7 @@ // docs:start:portals_data_structures // SPDX-License-Identifier: Apache-2.0 // Copyright 2024 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; library DataStructures { struct OutboxMessageMetadata { diff --git a/l1-contracts/test/portals/PortalERC20.t.sol b/l1-contracts/test/portals/PortalERC20.t.sol deleted file mode 100644 index cf69d9a6882..00000000000 --- a/l1-contracts/test/portals/PortalERC20.t.sol +++ /dev/null @@ -1,17 +0,0 @@ -pragma solidity ^0.8.18; - -import "forge-std/Test.sol"; -import {PortalERC20} from "./PortalERC20.sol"; - -contract PortalERC20Test is Test { - PortalERC20 portalERC20; - - function setUp() public { - portalERC20 = new PortalERC20(); - } - - function test_mint() public { - portalERC20.mint(address(this), 100); - assertEq(portalERC20.balanceOf(address(this)), 100); - } -} diff --git a/l1-contracts/test/portals/TokenPortal.sol b/l1-contracts/test/portals/TokenPortal.sol index ce9f4408b52..b6d0a503e14 100644 --- a/l1-contracts/test/portals/TokenPortal.sol +++ b/l1-contracts/test/portals/TokenPortal.sol @@ -1,15 +1,16 @@ -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import {IERC20} from "@oz/token/ERC20/IERC20.sol"; import {SafeERC20} from "@oz/token/ERC20/utils/SafeERC20.sol"; // Messaging -import {IRegistry} from "../../src/core/interfaces/messagebridge/IRegistry.sol"; -import {IInbox} from "../../src/core/interfaces/messagebridge/IInbox.sol"; -import {IOutbox} from "../../src/core/interfaces/messagebridge/IOutbox.sol"; -import {DataStructures} from "../../src/core/libraries/DataStructures.sol"; +import {IRegistry} from "@aztec/governance/interfaces/IRegistry.sol"; +import {IInbox} from "@aztec/core/interfaces/messagebridge/IInbox.sol"; +import {IOutbox} from "@aztec/core/interfaces/messagebridge/IOutbox.sol"; +import {IRollup} from "@aztec/core/interfaces/IRollup.sol"; +import {DataStructures} from "@aztec/core/libraries/DataStructures.sol"; // docs:start:content_hash_sol_import -import {Hash} from "../../src/core/libraries/Hash.sol"; +import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; // docs:end:content_hash_sol_import // docs:start:init @@ -40,7 +41,7 @@ contract TokenPortal { returns (bytes32) { // Preamble - IInbox inbox = registry.getRollup().INBOX(); + IInbox inbox = IRollup(registry.getRollup()).INBOX(); DataStructures.L2Actor memory actor = DataStructures.L2Actor(l2Bridge, 1); // Hash the message content to be reconstructed in the receiving contract @@ -69,7 +70,7 @@ contract TokenPortal { bytes32 _secretHashForL2MessageConsumption ) external returns (bytes32) { // Preamble - IInbox inbox = registry.getRollup().INBOX(); + IInbox inbox = IRollup(registry.getRollup()).INBOX(); DataStructures.L2Actor memory actor = DataStructures.L2Actor(l2Bridge, 1); // Hash the message content to be reconstructed in the receiving contract @@ -117,10 +118,10 @@ contract TokenPortal { _amount, _withCaller ? msg.sender : address(0) ) - ) + ) }); - IOutbox outbox = registry.getRollup().OUTBOX(); + IOutbox outbox = IRollup(registry.getRollup()).OUTBOX(); outbox.consume(message, _l2BlockNumber, _leafIndex, _path); diff --git a/l1-contracts/test/portals/TokenPortal.t.sol b/l1-contracts/test/portals/TokenPortal.t.sol index 5832c544437..dff8eca55b1 100644 --- a/l1-contracts/test/portals/TokenPortal.t.sol +++ b/l1-contracts/test/portals/TokenPortal.t.sol @@ -1,23 +1,23 @@ -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import "forge-std/Test.sol"; // Rollup Processor -import {Rollup} from "../../src/core/Rollup.sol"; -import {Constants} from "../../src/core/libraries/ConstantsGen.sol"; -import {Registry} from "../../src/core/messagebridge/Registry.sol"; -import {DataStructures} from "../../src/core/libraries/DataStructures.sol"; -import {Hash} from "../../src/core/libraries/Hash.sol"; -import {Errors} from "../../src/core/libraries/Errors.sol"; +import {Rollup} from "@aztec/core/Rollup.sol"; +import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; +import {Registry} from "@aztec/governance/Registry.sol"; +import {DataStructures} from "@aztec/core/libraries/DataStructures.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; +import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; // Interfaces -import {IInbox} from "../../src/core/interfaces/messagebridge/IInbox.sol"; -import {IOutbox} from "../../src/core/interfaces/messagebridge/IOutbox.sol"; -import {IFeeJuicePortal} from "../../src/core/interfaces/IFeeJuicePortal.sol"; +import {IInbox} from "@aztec/core/interfaces/messagebridge/IInbox.sol"; +import {IOutbox} from "@aztec/core/interfaces/messagebridge/IOutbox.sol"; +import {IFeeJuicePortal} from "@aztec/core/interfaces/IFeeJuicePortal.sol"; // Portal tokens import {TokenPortal} from "./TokenPortal.sol"; -import {PortalERC20} from "./PortalERC20.sol"; +import {TestERC20} from "../TestERC20.sol"; import {NaiveMerkle} from "../merkle/Naive.sol"; @@ -37,7 +37,7 @@ contract TokenPortalTest is Test { bytes32 internal l2TokenAddress = bytes32(uint256(0x42)); TokenPortal internal tokenPortal; - PortalERC20 internal portalERC20; + TestERC20 internal testERC20; // input params uint32 internal deadline = uint32(block.timestamp + 1 days); @@ -59,19 +59,18 @@ contract TokenPortalTest is Test { function setUp() public { registry = new Registry(address(this)); - portalERC20 = new PortalERC20(); - rollup = - new Rollup(registry, IFeeJuicePortal(address(0)), bytes32(0), address(this), new address[](0)); + testERC20 = new TestERC20(); + rollup = new Rollup(IFeeJuicePortal(address(0)), bytes32(0), address(this), new address[](0)); inbox = rollup.INBOX(); outbox = rollup.OUTBOX(); registry.upgrade(address(rollup)); tokenPortal = new TokenPortal(); - tokenPortal.initialize(address(registry), address(portalERC20), l2TokenAddress); + tokenPortal.initialize(address(registry), address(testERC20), l2TokenAddress); // Modify the proven block count - vm.store(address(rollup), bytes32(uint256(7)), bytes32(l2BlockNumber)); + vm.store(address(rollup), bytes32(uint256(9)), bytes32(l2BlockNumber)); assertEq(rollup.getProvenBlockNumber(), l2BlockNumber); vm.deal(address(this), 100 ether); @@ -89,7 +88,7 @@ contract TokenPortalTest is Test { abi.encodeWithSignature( "mint_private(bytes32,uint256)", secretHashForRedeemingMintedNotes, amount ) - ), + ), secretHash: secretHashForL2MessageConsumption }); } @@ -109,8 +108,8 @@ contract TokenPortalTest is Test { function testDepositPrivate() public returns (bytes32) { // mint token and approve to the portal - portalERC20.mint(address(this), mintAmount); - portalERC20.approve(address(tokenPortal), mintAmount); + testERC20.mint(address(this), mintAmount); + testERC20.approve(address(tokenPortal), mintAmount); // Check for the expected message DataStructures.L1ToL2Msg memory expectedMessage = _createExpectedMintPrivateL1ToL2Message(); @@ -135,8 +134,8 @@ contract TokenPortalTest is Test { function testDepositPublic() public returns (bytes32) { // mint token and approve to the portal - portalERC20.mint(address(this), mintAmount); - portalERC20.approve(address(tokenPortal), mintAmount); + testERC20.mint(address(this), mintAmount); + testERC20.approve(address(tokenPortal), mintAmount); // Check for the expected message DataStructures.L1ToL2Msg memory expectedMessage = _createExpectedMintPublicL1ToL2Message(); @@ -167,7 +166,7 @@ contract TokenPortalTest is Test { abi.encodeWithSignature( "withdraw(address,uint256,address)", recipient, withdrawAmount, _designatedCaller ) - ) + ) }) ); @@ -184,7 +183,7 @@ contract TokenPortalTest is Test { returns (bytes32, bytes32[] memory, bytes32) { // send assets to the portal - portalERC20.mint(address(tokenPortal), withdrawAmount); + testERC20.mint(address(tokenPortal), withdrawAmount); // Create the message (bytes32 l2ToL1Message,) = _createWithdrawMessageForOutbox(_designatedCaller); @@ -209,7 +208,7 @@ contract TokenPortalTest is Test { // add message with caller as this address (bytes32 l2ToL1Message, bytes32[] memory siblingPath, bytes32 treeRoot) = _addWithdrawMessageInOutbox(address(0), l2BlockNumber); - assertEq(portalERC20.balanceOf(recipient), 0); + assertEq(testERC20.balanceOf(recipient), 0); vm.startPrank(_caller); vm.expectEmit(true, true, true, true); @@ -217,7 +216,7 @@ contract TokenPortalTest is Test { tokenPortal.withdraw(recipient, withdrawAmount, false, l2BlockNumber, 0, siblingPath); // Should have received 654 RNA tokens - assertEq(portalERC20.balanceOf(recipient), withdrawAmount); + assertEq(testERC20.balanceOf(recipient), withdrawAmount); // Should not be able to withdraw again vm.expectRevert( @@ -262,6 +261,6 @@ contract TokenPortalTest is Test { tokenPortal.withdraw(recipient, withdrawAmount, true, l2BlockNumber, 0, siblingPath); // Should have received 654 RNA tokens - assertEq(portalERC20.balanceOf(recipient), withdrawAmount); + assertEq(testERC20.balanceOf(recipient), withdrawAmount); } } diff --git a/l1-contracts/test/portals/UniswapPortal.sol b/l1-contracts/test/portals/UniswapPortal.sol index 26ba79b78dc..9d8688b255e 100644 --- a/l1-contracts/test/portals/UniswapPortal.sol +++ b/l1-contracts/test/portals/UniswapPortal.sol @@ -1,12 +1,13 @@ -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import {IERC20} from "@oz/token/ERC20/IERC20.sol"; -import {IRegistry} from "../../src/core/interfaces/messagebridge/IRegistry.sol"; -import {IOutbox} from "../../src/core/interfaces/messagebridge/IOutbox.sol"; -import {DataStructures} from "../../src/core/libraries/DataStructures.sol"; +import {IRegistry} from "@aztec/governance/interfaces/IRegistry.sol"; +import {IOutbox} from "@aztec/core/interfaces/messagebridge/IOutbox.sol"; +import {IRollup} from "@aztec/core/interfaces/IRollup.sol"; +import {DataStructures} from "@aztec/core/libraries/DataStructures.sol"; import {DataStructures as PortalDataStructures} from "./DataStructures.sol"; -import {Hash} from "../../src/core/libraries/Hash.sol"; +import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; // docs:start:setup import {TokenPortal} from "./TokenPortal.sol"; @@ -103,7 +104,7 @@ contract UniswapPortal { // Consume the message from the outbox { - IOutbox outbox = registry.getRollup().OUTBOX(); + IOutbox outbox = IRollup(registry.getRollup()).OUTBOX(); outbox.consume( DataStructures.L2ToL1Msg({ @@ -209,7 +210,7 @@ contract UniswapPortal { // Consume the message from the outbox { - IOutbox outbox = registry.getRollup().OUTBOX(); + IOutbox outbox = IRollup(registry.getRollup()).OUTBOX(); outbox.consume( DataStructures.L2ToL1Msg({ diff --git a/l1-contracts/test/portals/UniswapPortal.t.sol b/l1-contracts/test/portals/UniswapPortal.t.sol index f0710fa9c3b..afb986f9046 100644 --- a/l1-contracts/test/portals/UniswapPortal.t.sol +++ b/l1-contracts/test/portals/UniswapPortal.t.sol @@ -1,20 +1,20 @@ -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import "forge-std/Test.sol"; // Rollup Processor -import {Rollup} from "../../src/core/Rollup.sol"; -import {Registry} from "../../src/core/messagebridge/Registry.sol"; -import {DataStructures} from "../../src/core/libraries/DataStructures.sol"; +import {Rollup} from "@aztec/core/Rollup.sol"; +import {Registry} from "@aztec/governance/Registry.sol"; +import {DataStructures} from "@aztec/core/libraries/DataStructures.sol"; import {DataStructures as PortalDataStructures} from "./DataStructures.sol"; -import {Hash} from "../../src/core/libraries/Hash.sol"; -import {Errors} from "../../src/core/libraries/Errors.sol"; +import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; // Interfaces import {IERC20} from "@oz/token/ERC20/IERC20.sol"; -import {IOutbox} from "../../src/core/interfaces/messagebridge/IOutbox.sol"; +import {IOutbox} from "@aztec/core/interfaces/messagebridge/IOutbox.sol"; import {NaiveMerkle} from "../merkle/Naive.sol"; -import {IFeeJuicePortal} from "../../src/core/interfaces/IFeeJuicePortal.sol"; +import {IFeeJuicePortal} from "@aztec/core/interfaces/IFeeJuicePortal.sol"; // Portals import {TokenPortal} from "./TokenPortal.sol"; @@ -52,8 +52,7 @@ contract UniswapPortalTest is Test { vm.selectFork(forkId); registry = new Registry(address(this)); - rollup = - new Rollup(registry, IFeeJuicePortal(address(0)), bytes32(0), address(this), new address[](0)); + rollup = new Rollup(IFeeJuicePortal(address(0)), bytes32(0), address(this), new address[](0)); registry.upgrade(address(rollup)); daiTokenPortal = new TokenPortal(); @@ -66,7 +65,7 @@ contract UniswapPortalTest is Test { uniswapPortal.initialize(address(registry), l2UniswapAddress); // Modify the proven block count - vm.store(address(rollup), bytes32(uint256(7)), bytes32(l2BlockNumber + 1)); + vm.store(address(rollup), bytes32(uint256(9)), bytes32(l2BlockNumber + 1)); assertEq(rollup.getProvenBlockNumber(), l2BlockNumber + 1); // have DAI locked in portal that can be moved when funds are withdrawn @@ -91,7 +90,7 @@ contract UniswapPortalTest is Test { recipient: DataStructures.L1Actor(address(daiTokenPortal), block.chainid), content: Hash.sha256ToField( abi.encodeWithSignature("withdraw(address,uint256,address)", _recipient, amount, _caller) - ) + ) }); return message.sha256ToField(); @@ -123,7 +122,7 @@ contract UniswapPortalTest is Test { secretHash, _caller ) - ) + ) }); return message.sha256ToField(); @@ -154,7 +153,7 @@ contract UniswapPortalTest is Test { secretHash, _caller ) - ) + ) }); return message.sha256ToField(); diff --git a/l1-contracts/test/prover-coordination/ProofCommitmentEscrow.t.sol b/l1-contracts/test/prover-coordination/ProofCommitmentEscrow.t.sol new file mode 100644 index 00000000000..401fd67a2bc --- /dev/null +++ b/l1-contracts/test/prover-coordination/ProofCommitmentEscrow.t.sol @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2024 Aztec Labs. +pragma solidity >=0.8.27; + +import {Test} from "forge-std/Test.sol"; + +import {ProofCommitmentEscrow} from "@aztec/core/ProofCommitmentEscrow.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; +import {Timestamp} from "@aztec/core/libraries/TimeMath.sol"; + +import {TestERC20} from "../TestERC20.sol"; + +// solhint-disable comprehensive-interface + +contract TestProofCommitmentEscrow is Test { + // solhint-disable-next-line var-name-mixedcase + ProofCommitmentEscrow internal ESCROW; + // solhint-disable-next-line var-name-mixedcase + TestERC20 internal TOKEN; + address internal prover; + uint256 internal depositAmount; + + modifier setupWithApproval(address _prover, uint256 _depositAmount) { + TOKEN.mint(_prover, _depositAmount); + vm.prank(_prover); + TOKEN.approve(address(ESCROW), _depositAmount); + + prover = _prover; + depositAmount = _depositAmount; + _; + } + + function setUp() public { + TOKEN = new TestERC20(); + ESCROW = new ProofCommitmentEscrow(TOKEN, address(this)); + } + + function testDeposit() public setupWithApproval(address(42), 100) { + vm.prank(prover); + ESCROW.deposit(depositAmount); + + assertEq( + TOKEN.balanceOf(address(ESCROW)), depositAmount, "Escrow balance should match deposit amount" + ); + assertEq(TOKEN.balanceOf(prover), 0, "Prover balance should be 0 after deposit"); + } + + function testCannotWithdrawWithoutMatureRequest() public setupWithApproval(address(42), 100) { + vm.prank(prover); + ESCROW.deposit(depositAmount); + uint256 withdrawReadyAt = block.timestamp + ESCROW.WITHDRAW_DELAY(); + + vm.prank(prover); + ESCROW.startWithdraw(depositAmount); + + vm.prank(prover); + vm.expectRevert( + abi.encodeWithSelector( + Errors.ProofCommitmentEscrow__WithdrawRequestNotReady.selector, + block.timestamp, + withdrawReadyAt + ) + ); + ESCROW.executeWithdraw(); + + vm.warp(block.timestamp + ESCROW.WITHDRAW_DELAY() - 1); + vm.prank(prover); + vm.expectRevert( + abi.encodeWithSelector( + Errors.ProofCommitmentEscrow__WithdrawRequestNotReady.selector, + block.timestamp, + withdrawReadyAt + ) + ); + ESCROW.executeWithdraw(); + } + + function testWithdrawAfterDelay() public setupWithApproval(address(42), 100) { + vm.prank(prover); + ESCROW.deposit(depositAmount); + uint256 withdrawAmount = 50; + uint256 withdrawReadyAt = block.timestamp + ESCROW.WITHDRAW_DELAY(); + + vm.prank(prover); + ESCROW.startWithdraw(withdrawAmount); + + vm.warp(withdrawReadyAt); + + vm.prank(prover); + ESCROW.executeWithdraw(); + + assertEq( + TOKEN.balanceOf(address(ESCROW)), + depositAmount - withdrawAmount, + "Escrow balance should be reduced after withdrawal" + ); + assertEq(TOKEN.balanceOf(prover), withdrawAmount, "Prover balance should match deposit amount"); + } + + function testCannotReplayWithdrawRequest(uint256 _withdrawAmount) + public + setupWithApproval(address(42), 100) + { + vm.prank(prover); + ESCROW.deposit(depositAmount); + uint256 withdrawAmount = bound(_withdrawAmount, 1, depositAmount); + uint256 withdrawReadyAt = block.timestamp + ESCROW.WITHDRAW_DELAY(); + + vm.prank(prover); + ESCROW.startWithdraw(withdrawAmount); + vm.warp(withdrawReadyAt); + + vm.prank(prover); + ESCROW.executeWithdraw(); + + vm.prank(prover); + ESCROW.executeWithdraw(); + + assertEq( + TOKEN.balanceOf(address(ESCROW)), + depositAmount - withdrawAmount, + "Escrow balance should be reduced after withdrawal" + ); + } + + function testOnlyOwnerCanStake(address nonOwner) public { + vm.assume(nonOwner != address(this)); + vm.prank(nonOwner); + vm.expectRevert( + abi.encodeWithSelector(Errors.ProofCommitmentEscrow__NotOwner.selector, nonOwner) + ); + ESCROW.stakeBond(address(0), 0); + } + + function testCannotStakeMoreThanProverBalance() public setupWithApproval(address(42), 100) { + vm.prank(prover); + ESCROW.deposit(depositAmount); + uint256 stakeAmount = depositAmount + 1; + + vm.expectRevert(); + ESCROW.stakeBond(prover, stakeAmount); + + assertEq( + TOKEN.balanceOf(address(ESCROW)), depositAmount, "Escrow balance should match deposit amount" + ); + assertEq(ESCROW.deposits(prover), depositAmount, "Prover balance should match deposit amount"); + } + + function testOnlyOwnerCanUnstake(address nonOwner) public { + vm.assume(nonOwner != address(this)); + vm.prank(nonOwner); + vm.expectRevert( + abi.encodeWithSelector(Errors.ProofCommitmentEscrow__NotOwner.selector, nonOwner) + ); + ESCROW.unstakeBond(address(0), 0); + } + + function testStakeAndUnstake() public setupWithApproval(address(42), 100) { + vm.prank(prover); + ESCROW.deposit(depositAmount); + uint256 stakeAmount = 50; + + ESCROW.stakeBond(prover, stakeAmount); + + assertEq( + ESCROW.deposits(prover), depositAmount - stakeAmount, "Prover balance should be reduced" + ); + + ESCROW.unstakeBond(prover, stakeAmount); + + assertEq( + ESCROW.deposits(prover), depositAmount, "Prover balance should be restored after unstake" + ); + } + + function testOverwritingStakeSlashesPreviousProver() public { + address proverA = address(42); + address proverB = address(43); + uint256 depositAmountA = 100; + uint256 stakeAmountA = 50; + uint256 depositAmountB = 200; + uint256 stakeAmountB = 100; + + TOKEN.mint(proverA, depositAmountA); + vm.prank(proverA); + TOKEN.approve(address(ESCROW), depositAmountA); + vm.prank(proverA); + ESCROW.deposit(depositAmountA); + + TOKEN.mint(proverB, depositAmountB); + vm.prank(proverB); + TOKEN.approve(address(ESCROW), depositAmountB); + vm.prank(proverB); + ESCROW.deposit(depositAmountB); + + // Prover A is staked + ESCROW.stakeBond(proverA, stakeAmountA); + + // Prover B is staked + ESCROW.stakeBond(proverB, stakeAmountB); + + // Prover A is missing the stake + uint256 expectedDepositA = depositAmountA - stakeAmountA; + assertEq( + ESCROW.deposits(proverA), + expectedDepositA, + "Prover A's deposit should reflect the slashed stake" + ); + + // Prover B gets unstaked + ESCROW.unstakeBond(proverB, stakeAmountB); + assertEq( + ESCROW.deposits(proverB), + depositAmountB, + "Prover B's deposit should be restored after unstake" + ); + assertEq( + ESCROW.deposits(proverA), expectedDepositA, "Prover A's deposit remains slashed after unstake" + ); + } + + function testWithdrawRequestOverwriting() public setupWithApproval(address(42), 100) { + uint256 withdrawAmountA = 40; + uint256 withdrawAmountB = 60; + uint256 withdrawReadyAtA = block.timestamp + ESCROW.WITHDRAW_DELAY(); + uint256 withdrawReadyAtB = block.timestamp + 2 * ESCROW.WITHDRAW_DELAY(); + + vm.prank(prover); + ESCROW.deposit(depositAmount); + + // Prover starts first withdraw request + vm.prank(prover); + ESCROW.startWithdraw(withdrawAmountA); + + // Prover starts second withdraw request before executing first + vm.warp(withdrawReadyAtA); + + vm.prank(prover); + ESCROW.startWithdraw(withdrawAmountB); + + // Attempt to execute first withdraw request after its delay + vm.prank(prover); + vm.expectRevert( + abi.encodeWithSelector( + Errors.ProofCommitmentEscrow__WithdrawRequestNotReady.selector, + withdrawReadyAtA, + withdrawReadyAtB + ) + ); + ESCROW.executeWithdraw(); + + // Execute second withdraw request after its delay + vm.warp(withdrawReadyAtB); + vm.prank(prover); + ESCROW.executeWithdraw(); + + // Assert + assertEq( + ESCROW.deposits(prover), + depositAmount - withdrawAmountB, + "Prover's deposit should be reduced by the withdrawn amount" + ); + } + + function testMinBalanceAtTime() public setupWithApproval(address(42), 100) { + uint256 withdrawAmount = 25; + Timestamp withdrawReadyAt = Timestamp.wrap(block.timestamp + ESCROW.WITHDRAW_DELAY()); + + vm.prank(prover); + ESCROW.deposit(depositAmount); + + assertEq( + ESCROW.minBalanceAtTime(Timestamp.wrap(block.timestamp), prover), + depositAmount, + "Min balance should match deposit amount before any withdraw request" + ); + + assertEq( + ESCROW.minBalanceAtTime(withdrawReadyAt - Timestamp.wrap(1), prover), + depositAmount, + "Min balance should match deposit amount before withdraw request matures" + ); + + vm.prank(prover); + ESCROW.startWithdraw(withdrawAmount); + + assertEq( + ESCROW.minBalanceAtTime(Timestamp.wrap(block.timestamp), prover), + depositAmount, + "Min balance should be unaffected by pending withdraw request before maturity" + ); + + assertEq( + ESCROW.minBalanceAtTime(Timestamp.wrap(block.timestamp + ESCROW.WITHDRAW_DELAY()), prover), + 0, + "Min balance should be 0 at or beyond the delay window" + ); + + vm.warp(block.timestamp + 1); + + assertEq( + ESCROW.minBalanceAtTime(withdrawReadyAt, prover), + depositAmount - withdrawAmount, + "Min balance should be 75 after withdraw request matures" + ); + + assertEq( + ESCROW.minBalanceAtTime(withdrawReadyAt + Timestamp.wrap(1), prover), + 0, + "Min balance should be 0 at or beyond the delay window" + ); + } +} diff --git a/l1-contracts/test/sparta/Sampling.t.sol b/l1-contracts/test/sparta/Sampling.t.sol index 35c349ad746..8e6932f1d23 100644 --- a/l1-contracts/test/sparta/Sampling.t.sol +++ b/l1-contracts/test/sparta/Sampling.t.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import {Test} from "forge-std/Test.sol"; -import {SampleLib} from "../../src/core/sequencer_selection/SampleLib.sol"; +import {SampleLib} from "@aztec/core/libraries/crypto/SampleLib.sol"; // Adding a contract to get some gas-numbers out. contract Sampler { diff --git a/l1-contracts/test/sparta/Sparta.t.sol b/l1-contracts/test/sparta/Sparta.t.sol index 44700b1e4f5..a6e290c2fc1 100644 --- a/l1-contracts/test/sparta/Sparta.t.sol +++ b/l1-contracts/test/sparta/Sparta.t.sol @@ -1,26 +1,27 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; import {DecoderBase} from "../decoders/Base.sol"; -import {DataStructures} from "../../src/core/libraries/DataStructures.sol"; -import {Constants} from "../../src/core/libraries/ConstantsGen.sol"; -import {SignatureLib} from "../../src/core/libraries/SignatureLib.sol"; +import {DataStructures} from "@aztec/core/libraries/DataStructures.sol"; +import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; +import {SignatureLib} from "@aztec/core/libraries/crypto/SignatureLib.sol"; -import {Registry} from "../../src/core/messagebridge/Registry.sol"; -import {Inbox} from "../../src/core/messagebridge/Inbox.sol"; -import {Outbox} from "../../src/core/messagebridge/Outbox.sol"; -import {Errors} from "../../src/core/libraries/Errors.sol"; -import {Rollup} from "../../src/core/Rollup.sol"; -import {Leonidas} from "../../src/core/sequencer_selection/Leonidas.sol"; +import {Inbox} from "@aztec/core/messagebridge/Inbox.sol"; +import {Outbox} from "@aztec/core/messagebridge/Outbox.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; +import {Rollup} from "@aztec/core/Rollup.sol"; +import {Leonidas} from "@aztec/core/Leonidas.sol"; import {NaiveMerkle} from "../merkle/Naive.sol"; import {MerkleTestUtil} from "../merkle/TestUtil.sol"; -import {PortalERC20} from "../portals/PortalERC20.sol"; +import {TestERC20} from "../TestERC20.sol"; import {TxsDecoderHelper} from "../decoders/helpers/TxsDecoderHelper.sol"; -import {IFeeJuicePortal} from "../../src/core/interfaces/IFeeJuicePortal.sol"; +import {IFeeJuicePortal} from "@aztec/core/interfaces/IFeeJuicePortal.sol"; import {MessageHashUtils} from "@oz/utils/cryptography/MessageHashUtils.sol"; +import {Slot, Epoch, SlotLib, EpochLib} from "@aztec/core/libraries/TimeMath.sol"; + // solhint-disable comprehensive-interface /** @@ -29,6 +30,8 @@ import {MessageHashUtils} from "@oz/utils/cryptography/MessageHashUtils.sol"; */ contract SpartaTest is DecoderBase { using MessageHashUtils for bytes32; + using SlotLib for Slot; + using EpochLib for Epoch; struct StructToAvoidDeepStacks { uint256 needed; @@ -36,13 +39,12 @@ contract SpartaTest is DecoderBase { bool shouldRevert; } - Registry internal registry; Inbox internal inbox; Outbox internal outbox; Rollup internal rollup; MerkleTestUtil internal merkleTestUtil; TxsDecoderHelper internal txsHelper; - PortalERC20 internal portalERC20; + TestERC20 internal testERC20; SignatureLib.Signature internal emptySignature; mapping(address validator => uint256 privateKey) internal privateKeys; @@ -71,16 +73,11 @@ contract SpartaTest is DecoderBase { initialValidators[i - 1] = validator; } - registry = new Registry(address(this)); - portalERC20 = new PortalERC20(); - rollup = new Rollup( - registry, IFeeJuicePortal(address(0)), bytes32(0), address(this), initialValidators - ); + testERC20 = new TestERC20(); + rollup = new Rollup(IFeeJuicePortal(address(0)), bytes32(0), address(this), initialValidators); inbox = Inbox(address(rollup.INBOX())); outbox = Outbox(address(rollup.OUTBOX())); - registry.upgrade(address(rollup)); - merkleTestUtil = new MerkleTestUtil(); txsHelper = new TxsDecoderHelper(); @@ -109,12 +106,12 @@ contract SpartaTest is DecoderBase { } function testProposerForNonSetupEpoch(uint8 _epochsToJump) public setup(4) { - uint256 pre = rollup.getCurrentEpoch(); + Epoch pre = rollup.getCurrentEpoch(); vm.warp( block.timestamp + uint256(_epochsToJump) * rollup.EPOCH_DURATION() * rollup.SLOT_DURATION() ); - uint256 post = rollup.getCurrentEpoch(); - assertEq(pre + _epochsToJump, post, "Invalid epoch"); + Epoch post = rollup.getCurrentEpoch(); + assertEq(pre + Epoch.wrap(_epochsToJump), post, "Invalid epoch"); address expectedProposer = rollup.getCurrentProposer(); diff --git a/noir-projects/Earthfile b/noir-projects/Earthfile index 658f5987e48..54b780691ba 100644 --- a/noir-projects/Earthfile +++ b/noir-projects/Earthfile @@ -5,8 +5,6 @@ source: # Install nargo COPY ../noir/+nargo/nargo /usr/bin/nargo - # Install bb - COPY ../barretenberg/cpp/+preset-release/bin/bb /usr/src/barretenberg/cpp/build/bin/bb # Install world state napi COPY ../barretenberg/cpp/+preset-release-world-state/bin/world_state_napi.node /usr/src/barretenberg/cpp/build/bin/world_state_napi.node @@ -16,9 +14,6 @@ source: COPY package.json yarn.lock mega_honk_circuits.json . COPY --dir aztec-nr noir-contracts noir-protocol-circuits mock-protocol-circuits scripts . - # for debugging rebuilds - RUN echo CONTENT HASH $(find . -type f -exec sha256sum {} ';' | sort | sha256sum | awk '{print $1}') | tee .content-hash - build-contracts: FROM +source @@ -98,7 +93,7 @@ format: FROM +source WORKDIR /usr/src/noir-projects/noir-protocol-circuits - RUN yarn && node ./generate_variants.js + RUN yarn && node ./scripts/generate_variants.js RUN nargo fmt --check WORKDIR /usr/src/noir-projects/mock-protocol-circuits @@ -118,7 +113,7 @@ gates-report: COPY ../barretenberg/cpp/+preset-release/bin/bb /usr/src/barretenberg/cpp/build/bin/bb ENV BB_BIN /usr/src/barretenberg/cpp/build/bin/bb - RUN cd noir-protocol-circuits && yarn && node ./generate_variants.js && nargo compile --silence-warnings + RUN cd noir-protocol-circuits && yarn && node ./scripts/generate_variants.js tiny && nargo compile --silence-warnings COPY ./gates_report.sh ./gates_report.sh RUN ./gates_report.sh diff --git a/noir-projects/aztec-nr/.gitrepo b/noir-projects/aztec-nr/.gitrepo index 4c8887c0dae..00e08f50291 100644 --- a/noir-projects/aztec-nr/.gitrepo +++ b/noir-projects/aztec-nr/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/AztecProtocol/aztec-nr branch = master - commit = 909b3d87ba54961f8c2fc766e98ede64a224b8d6 + commit = 5ef2bff86ccebf91cca3425879a71d8c18d31341 method = merge cmdver = 0.4.6 - parent = 7bd4e9c665d6f327e8673537d75953fbbfa91e84 + parent = 672270a6d7dbde183009b02c874479531efe21c2 diff --git a/noir-projects/aztec-nr/address-note/src/address_note.nr b/noir-projects/aztec-nr/address-note/src/address_note.nr index 9da6a381c1a..38319830f53 100644 --- a/noir-projects/aztec-nr/address-note/src/address_note.nr +++ b/noir-projects/aztec-nr/address-note/src/address_note.nr @@ -1,8 +1,7 @@ use dep::aztec::{ protocol_types::{address::AztecAddress, constants::GENERATOR_INDEX__NOTE_NULLIFIER, hash::poseidon2_hash_with_separator}, note::{note_header::NoteHeader, note_interface::NullifiableNote, utils::compute_note_hash_for_nullify}, - oracle::unsafe_rand::unsafe_rand, keys::getters::get_nsk_app, context::PrivateContext, - macros::notes::note + oracle::random::random, keys::getters::get_nsk_app, context::PrivateContext, macros::notes::note }; // docs:start:address_note_def @@ -45,7 +44,13 @@ impl NullifiableNote for AddressNote { impl AddressNote { pub fn new(address: AztecAddress, npk_m_hash: Field) -> Self { - let randomness = unsafe_rand(); + // We use the randomness to preserve the privacy of the note recipient by preventing brute-forcing, so a + // malicious sender could use non-random values to make the note less private. But they already know the full + // note pre-image anyway, and so the recipient already trusts them to not disclose this information. We can + // therefore assume that the sender will cooperate in the random value generation. + let randomness = unsafe { + random() + }; AddressNote { address, npk_m_hash, randomness, header: NoteHeader::empty() } } // docs:end:address_note_def diff --git a/noir-projects/aztec-nr/aztec/src/context/call_interfaces.nr b/noir-projects/aztec-nr/aztec/src/context/call_interfaces.nr index 49d5a424ac0..21bcb6fb7ef 100644 --- a/noir-projects/aztec-nr/aztec/src/context/call_interfaces.nr +++ b/noir-projects/aztec-nr/aztec/src/context/call_interfaces.nr @@ -53,10 +53,7 @@ pub struct PrivateCallInterface { impl PrivateCallInterface { pub fn call(self, context: &mut PrivateContext) -> T where T: Deserialize { - let packed_args_hash = unsafe { - pack_arguments(self.args) - }; - assert(self.args_hash == packed_args_hash); + pack_arguments(self.args); let returns = context.call_private_function_with_packed_args( self.target_contract, self.selector, @@ -69,19 +66,13 @@ impl PrivateCallInterface { } pub fn view(self, context: &mut PrivateContext) -> T where T: Deserialize { - let packed_args_hash = unsafe { - pack_arguments(self.args) - }; - assert(self.args_hash == packed_args_hash); + pack_arguments(self.args); let returns = context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, true, false); returns.unpack_into() } pub fn delegate_call(self, context: &mut PrivateContext) -> T where T: Deserialize { - let packed_args_hash = unsafe { - pack_arguments(self.args) - }; - assert(self.args_hash == packed_args_hash); + pack_arguments(self.args); let returns = context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, false, true); returns.unpack_into() } @@ -105,10 +96,7 @@ pub struct PrivateVoidCallInterface { impl PrivateVoidCallInterface { pub fn call(self, context: &mut PrivateContext) { - let packed_args_hash = unsafe { - pack_arguments(self.args) - }; - assert(self.args_hash == packed_args_hash); + pack_arguments(self.args); context.call_private_function_with_packed_args( self.target_contract, self.selector, @@ -119,18 +107,12 @@ impl PrivateVoidCallInterface { } pub fn view(self, context: &mut PrivateContext) { - let packed_args_hash = unsafe { - pack_arguments(self.args) - }; - assert(self.args_hash == packed_args_hash); + pack_arguments(self.args); context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, true, false).assert_empty(); } pub fn delegate_call(self, context: &mut PrivateContext) { - let packed_args_hash = unsafe { - pack_arguments(self.args) - }; - assert(self.args_hash == packed_args_hash); + pack_arguments(self.args); context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, false, true).assert_empty(); } } @@ -153,10 +135,7 @@ pub struct PrivateStaticCallInterface { impl PrivateStaticCallInterface { pub fn view(self, context: &mut PrivateContext) -> T where T: Deserialize { - let packed_args_hash = unsafe { - pack_arguments(self.args) - }; - assert(self.args_hash == packed_args_hash); + pack_arguments(self.args); let returns = context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, true, false); returns.unpack_into() } @@ -180,10 +159,7 @@ pub struct PrivateStaticVoidCallInterface { impl PrivateStaticVoidCallInterface { pub fn view(self, context: &mut PrivateContext) { - let packed_args_hash = unsafe { - pack_arguments(self.args) - }; - assert(self.args_hash == packed_args_hash); + pack_arguments(self.args); context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, true, false).assert_empty(); } } @@ -227,10 +203,7 @@ impl PublicCallInterface { pub fn enqueue(self, context: &mut PrivateContext) { let args_hash = hash_args(self.args); - let packed_args_hash = unsafe { - pack_arguments(self.args) - }; - assert(args_hash == packed_args_hash); + pack_arguments(self.args); context.call_public_function_with_packed_args( self.target_contract, self.selector, @@ -242,10 +215,7 @@ impl PublicCallInterface { pub fn enqueue_view(self, context: &mut PrivateContext) { let args_hash = hash_args(self.args); - let packed_args_hash = unsafe { - pack_arguments(self.args) - }; - assert(args_hash == packed_args_hash); + pack_arguments(self.args); context.call_public_function_with_packed_args( self.target_contract, self.selector, @@ -257,10 +227,7 @@ impl PublicCallInterface { pub fn delegate_enqueue(self, context: &mut PrivateContext) { let args_hash = hash_args(self.args); - let packed_args_hash = unsafe { - pack_arguments(self.args) - }; - assert(args_hash == packed_args_hash); + pack_arguments(self.args); context.call_public_function_with_packed_args( self.target_contract, self.selector, @@ -310,10 +277,7 @@ impl PublicVoidCallInterface { pub fn enqueue(self, context: &mut PrivateContext) { let args_hash = hash_args(self.args); - let packed_args_hash = unsafe { - pack_arguments(self.args) - }; - assert(args_hash == packed_args_hash); + pack_arguments(self.args); context.call_public_function_with_packed_args( self.target_contract, self.selector, @@ -325,10 +289,7 @@ impl PublicVoidCallInterface { pub fn enqueue_view(self, context: &mut PrivateContext) { let args_hash = hash_args(self.args); - let packed_args_hash = unsafe { - pack_arguments(self.args) - }; - assert(args_hash == packed_args_hash); + pack_arguments(self.args); context.call_public_function_with_packed_args( self.target_contract, self.selector, @@ -340,10 +301,7 @@ impl PublicVoidCallInterface { pub fn delegate_enqueue(self, context: &mut PrivateContext) { let args_hash = hash_args(self.args); - let packed_args_hash = unsafe { - pack_arguments(self.args) - }; - assert(args_hash == packed_args_hash); + pack_arguments(self.args); context.call_public_function_with_packed_args( self.target_contract, self.selector, @@ -384,10 +342,7 @@ impl PublicStaticCallInterface { pub fn enqueue_view(self, context: &mut PrivateContext) { let args_hash = hash_args(self.args); - let packed_args_hash = unsafe { - pack_arguments(self.args) - }; - assert(args_hash == packed_args_hash); + pack_arguments(self.args); context.call_public_function_with_packed_args( self.target_contract, self.selector, @@ -427,10 +382,7 @@ impl PublicStaticVoidCallInterface { pub fn enqueue_view(self, context: &mut PrivateContext) { let args_hash = hash_args(self.args); - let packed_args_hash = unsafe { - pack_arguments(self.args) - }; - assert(args_hash == packed_args_hash); + pack_arguments(self.args); context.call_public_function_with_packed_args( self.target_contract, self.selector, diff --git a/noir-projects/aztec-nr/aztec/src/context/packed_returns.nr b/noir-projects/aztec-nr/aztec/src/context/packed_returns.nr index abf2ee7ea39..015324f0ede 100644 --- a/noir-projects/aztec-nr/aztec/src/context/packed_returns.nr +++ b/noir-projects/aztec-nr/aztec/src/context/packed_returns.nr @@ -19,7 +19,11 @@ impl PackedReturns { } pub fn unpack(self) -> [Field; N] { - let unpacked: [Field; N] = unpack_returns(self.packed_returns); + // We verify that the value returned by `unpack_returns` is the preimage of `packed_returns`, fully constraining + // it. + let unpacked: [Field; N] = unsafe { + unpack_returns(self.packed_returns) + }; assert_eq(self.packed_returns, hash_args_array(unpacked)); unpacked } diff --git a/noir-projects/aztec-nr/aztec/src/context/private_context.nr b/noir-projects/aztec-nr/aztec/src/context/private_context.nr index c5b79df6937..0b002a3cc67 100644 --- a/noir-projects/aztec-nr/aztec/src/context/private_context.nr +++ b/noir-projects/aztec-nr/aztec/src/context/private_context.nr @@ -295,7 +295,7 @@ impl PrivateContext { args: [Field; ARGS_COUNT] ) -> PackedReturns { let args_hash = hash_args_array(args); - assert(args_hash == arguments::pack_arguments_array(args)); + arguments::pack_arguments_array(args); self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, false, false) } @@ -306,7 +306,7 @@ impl PrivateContext { args: [Field; ARGS_COUNT] ) -> PackedReturns { let args_hash = hash_args_array(args); - assert(args_hash == arguments::pack_arguments_array(args)); + arguments::pack_arguments_array(args); self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, true, false) } @@ -317,7 +317,7 @@ impl PrivateContext { args: [Field; ARGS_COUNT] ) -> PackedReturns { let args_hash = hash_args_array(args); - assert(args_hash == arguments::pack_arguments_array(args)); + arguments::pack_arguments_array(args); self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, false, true) } @@ -407,7 +407,7 @@ impl PrivateContext { args: [Field; ARGS_COUNT] ) { let args_hash = hash_args_array(args); - assert(args_hash == arguments::pack_arguments_array(args)); + arguments::pack_arguments_array(args); self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, false, false) } @@ -418,7 +418,7 @@ impl PrivateContext { args: [Field; ARGS_COUNT] ) { let args_hash = hash_args_array(args); - assert(args_hash == arguments::pack_arguments_array(args)); + arguments::pack_arguments_array(args); self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, true, false) } @@ -429,7 +429,7 @@ impl PrivateContext { args: [Field; ARGS_COUNT] ) { let args_hash = hash_args_array(args); - assert(args_hash == arguments::pack_arguments_array(args)); + arguments::pack_arguments_array(args); self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, false, true) } @@ -495,7 +495,7 @@ impl PrivateContext { args: [Field; ARGS_COUNT] ) { let args_hash = hash_args_array(args); - assert(args_hash == arguments::pack_arguments_array(args)); + arguments::pack_arguments_array(args); self.set_public_teardown_function_with_packed_args(contract_address, function_selector, args_hash, false, false) } diff --git a/noir-projects/aztec-nr/aztec/src/context/public_context.nr b/noir-projects/aztec-nr/aztec/src/context/public_context.nr index 0a3da729960..be95853c7a8 100644 --- a/noir-projects/aztec-nr/aztec/src/context/public_context.nr +++ b/noir-projects/aztec-nr/aztec/src/context/public_context.nr @@ -4,7 +4,6 @@ use dep::protocol_types::constants::MAX_FIELD_VALUE; use dep::protocol_types::traits::{Serialize, Deserialize, Empty}; use dep::protocol_types::abis::function_selector::FunctionSelector; use crate::context::gas::GasOpts; -use crate::hash::ArgsHasher; pub struct PublicContext { args_hash: Option, @@ -204,7 +203,6 @@ fn gas_for_call(user_gas: GasOpts) -> [Field; 2] { } // Unconstrained opcode wrappers (do not use directly). -// TODO(https://github.com/AztecProtocol/aztec-packages/issues/6420): reconsider. unconstrained fn address() -> AztecAddress { address_opcode() } diff --git a/noir-projects/aztec-nr/aztec/src/encrypted_logs/encrypted_event_emission.nr b/noir-projects/aztec-nr/aztec/src/encrypted_logs/encrypted_event_emission.nr index 70953b5fe66..75bd9a49d79 100644 --- a/noir-projects/aztec-nr/aztec/src/encrypted_logs/encrypted_event_emission.nr +++ b/noir-projects/aztec-nr/aztec/src/encrypted_logs/encrypted_event_emission.nr @@ -1,164 +1,121 @@ use crate::{ context::PrivateContext, event::event_interface::EventInterface, - encrypted_logs::payload::compute_encrypted_event_log, - keys::{getters::get_public_keys, public_keys::{OvpkM, IvpkM}}, - oracle::logs_traits::LensForEncryptedEvent, oracle::unsafe_rand::unsafe_rand + encrypted_logs::payload::compute_encrypted_log, + keys::{getters::get_ovsk_app, public_keys::{OvpkM, IvpkM}}, oracle::random::random }; use dep::protocol_types::{address::AztecAddress, hash::sha256_to_field}; -unconstrained fn compute_unconstrained( - contract_address: AztecAddress, - randomness: Field, - ovsk_app: Field, - ovpk: OvpkM, - ivpk: IvpkM, - recipient: AztecAddress, - event: Event -) -> ([u8; OB], Field) where Event: EventInterface, [u8; N * 32 + 64]: LensForEncryptedEvent { - compute( - contract_address, - randomness, - ovsk_app, - ovpk, - ivpk, - recipient, - event - ) -} - -fn compute( - contract_address: AztecAddress, +fn compute_raw_event_log( + context: PrivateContext, + event: Event, randomness: Field, ovsk_app: Field, ovpk: OvpkM, ivpk: IvpkM, - recipient: AztecAddress, - event: Event -) -> ([u8; OB], Field) where Event: EventInterface, [u8; N * 32 + 64]: LensForEncryptedEvent { - let encrypted_log: [u8; OB] = compute_encrypted_event_log( - contract_address, - randomness, - ovsk_app, - ovpk, - ivpk, - recipient, - event - ); + recipient: AztecAddress +) -> ([u8; 416 + N * 32], Field) where Event: EventInterface { + let contract_address: AztecAddress = context.this_address(); + let plaintext = event.private_to_be_bytes(randomness); + let encrypted_log: [u8; 416 + N * 32] = compute_encrypted_log(contract_address, ovsk_app, ovpk, ivpk, recipient, plaintext); let log_hash = sha256_to_field(encrypted_log); (encrypted_log, log_hash) } -fn emit_with_keys( - context: &mut PrivateContext, - randomness: Field, +unconstrained fn compute_raw_event_log_unconstrained( + context: PrivateContext, event: Event, + randomness: Field, ovpk: OvpkM, ivpk: IvpkM, - iv: AztecAddress, - inner_compute: fn(AztecAddress, Field, Field, OvpkM, IvpkM, AztecAddress, Event) -> ([u8; OB], Field) -) where Event: EventInterface, [u8; N * 32 + 64]: LensForEncryptedEvent { - let contract_address: AztecAddress = context.this_address(); - let ovsk_app: Field = context.request_ovsk_app(ovpk.hash()); - let (encrypted_log, log_hash) = inner_compute(contract_address, randomness, ovsk_app, ovpk, ivpk, iv, event); - context.emit_raw_event_log_with_masked_address(randomness, encrypted_log, log_hash); -} - -pub fn encode_and_encrypt_event( - context: &mut PrivateContext, - ov: AztecAddress, - iv: AztecAddress -) -> fn[(AztecAddress, AztecAddress, &mut PrivateContext)](Event) -> () where Event: EventInterface, [u8; N * 32 + 64]: LensForEncryptedEvent { - | e: Event | { - let ovpk = get_public_keys(ov).ovpk_m; - let ivpk = get_public_keys(iv).ivpk_m; - let randomness = unsafe_rand(); - emit_with_keys(context, randomness, e, ovpk, ivpk, iv, compute); - } -} - -pub fn encode_and_encrypt_event_unconstrained( - context: &mut PrivateContext, - ov: AztecAddress, - iv: AztecAddress -) -> fn[(AztecAddress, AztecAddress, &mut PrivateContext)](Event) -> () where Event: EventInterface, [u8; N * 32 + 64]: LensForEncryptedEvent { - | e: Event | { - let ovpk = get_public_keys(ov).ovpk_m; - let ivpk = get_public_keys(iv).ivpk_m; - let randomness = unsafe_rand(); - emit_with_keys(context, randomness, e, ovpk, ivpk, iv, compute_unconstrained); - } -} - -pub fn encode_and_encrypt_event_with_randomness( - context: &mut PrivateContext, - randomness: Field, - ov: AztecAddress, - iv: AztecAddress -) -> fn[(AztecAddress, AztecAddress, &mut PrivateContext, Field)](Event) -> () where Event: EventInterface, [u8; N * 32 + 64]: LensForEncryptedEvent { - | e: Event | { - let ovpk = get_public_keys(ov).ovpk_m; - let ivpk = get_public_keys(iv).ivpk_m; - emit_with_keys(context, randomness, e, ovpk, ivpk, iv, compute); - } -} - -pub fn encode_and_encrypt_event_with_randomness_unconstrained( - context: &mut PrivateContext, - randomness: Field, - ov: AztecAddress, - iv: AztecAddress -) -> fn[(AztecAddress, AztecAddress, &mut PrivateContext, Field)](Event) -> () where Event: EventInterface, [u8; N * 32 + 64]: LensForEncryptedEvent { - | e: Event | { - let ovpk = get_public_keys(ov).ovpk_m; - let ivpk = get_public_keys(iv).ivpk_m; - emit_with_keys(context, randomness, e, ovpk, ivpk, iv, compute_unconstrained); - } + recipient: AztecAddress +) -> ([u8; 416 + N * 32], Field) where Event: EventInterface { + let ovsk_app = get_ovsk_app(ovpk.hash()); + compute_raw_event_log(context, event, randomness, ovsk_app, ovpk, ivpk, recipient) } -pub fn encode_and_encrypt_event_with_keys( +pub fn encode_and_encrypt_event( context: &mut PrivateContext, ovpk: OvpkM, ivpk: IvpkM, recipient: AztecAddress -) -> fn[(&mut PrivateContext, OvpkM, IvpkM, AztecAddress)](Event) -> () where Event: EventInterface, [u8; N * 32 + 64]: LensForEncryptedEvent { +) -> fn[(&mut PrivateContext, OvpkM, IvpkM, AztecAddress)](Event) -> () where Event: EventInterface { | e: Event | { - let randomness = unsafe_rand(); - emit_with_keys(context, randomness, e, ovpk, ivpk, recipient, compute); + // We use the randomness to preserve function privacy by making it non brute-forceable, so a malicious sender could + // use non-random values to reveal the plaintext. But they already know it themselves anyway, and is presumably not + // interested in disclosing this information. We can therefore assume that the sender will cooperate in the random + // value generation. + let randomness = unsafe { + random() + }; + let ovsk_app: Field = context.request_ovsk_app(ovpk.hash()); + let (encrypted_log, log_hash) = compute_raw_event_log(*context, e, randomness, ovsk_app, ovpk, ivpk, recipient); + context.emit_raw_event_log_with_masked_address(randomness, encrypted_log, log_hash); } } -pub fn encode_and_encrypt_event_with_keys_unconstrained( +pub fn encode_and_encrypt_event_unconstrained( context: &mut PrivateContext, ovpk: OvpkM, ivpk: IvpkM, recipient: AztecAddress -) -> fn[(&mut PrivateContext, OvpkM, IvpkM, AztecAddress)](Event) -> () where Event: EventInterface, [u8; N * 32 + 64]: LensForEncryptedEvent { +) -> fn[(&mut PrivateContext, OvpkM, IvpkM, AztecAddress)](Event) -> () where Event: EventInterface { | e: Event | { - let randomness = unsafe_rand(); - emit_with_keys(context, randomness, e, ovpk, ivpk, recipient, compute_unconstrained); + // We use the randomness to preserve function privacy by making it non brute-forceable, so a malicious sender could + // use non-random values to reveal the plaintext. But they already know it themselves anyway, and is presumably not + // interested in disclosing this information. We can therefore assume that the sender will cooperate in the random + // value generation. + let randomness = unsafe { + random() + }; + let (encrypted_log, log_hash) = unsafe { + compute_raw_event_log_unconstrained(*context, e, randomness, ovpk, ivpk, recipient) + }; + context.emit_raw_event_log_with_masked_address(randomness, encrypted_log, log_hash); } } -pub fn encode_and_encrypt_event_with_keys_with_randomness( +// This function seems to be affected by the following Noir bug: +// https://github.com/noir-lang/noir/issues/5771 +// If you get weird behavior it might be because of it. +pub fn encode_and_encrypt_event_with_randomness( context: &mut PrivateContext, randomness: Field, ovpk: OvpkM, ivpk: IvpkM, recipient: AztecAddress -) -> fn[(&mut PrivateContext, Field, OvpkM, IvpkM, AztecAddress)](Event) -> () where Event: EventInterface, [u8; N * 32 + 64]: LensForEncryptedEvent { +) -> fn[(&mut PrivateContext, OvpkM, Field, IvpkM, AztecAddress)](Event) -> () where Event: EventInterface { | e: Event | { - emit_with_keys(context, randomness, e, ovpk, ivpk, recipient, compute); + let ovsk_app: Field = context.request_ovsk_app(ovpk.hash()); + let (encrypted_log, log_hash) = compute_raw_event_log(*context, e, randomness, ovsk_app, ovpk, ivpk, recipient); + context.emit_raw_event_log_with_masked_address(randomness, encrypted_log, log_hash); } } -pub fn encode_and_encrypt_event_with_keys_with_randomness_unconstrained( +pub fn encode_and_encrypt_event_with_randomness_unconstrained( context: &mut PrivateContext, randomness: Field, ovpk: OvpkM, ivpk: IvpkM, recipient: AztecAddress -) -> fn[(&mut PrivateContext, Field, OvpkM, IvpkM, AztecAddress)](Event) -> () where Event: EventInterface, [u8; N * 32 + 64]: LensForEncryptedEvent { +) -> fn[(&mut PrivateContext, Field, OvpkM, IvpkM, AztecAddress)](Event) -> () where Event: EventInterface { | e: Event | { - emit_with_keys(context, randomness, e, ovpk, ivpk, recipient, compute_unconstrained); + // Having the log hash be unconstrained here is fine because the way this works is we send the log hash + // to the kernel, and it gets included as part of its public inputs. Then we send the tx to the sequencer, + // which includes the kernel proof and the log preimages. The sequencer computes the hashes of the logs + // and checks that they are the ones in the public inputs of the kernel, and drops the tx otherwise (proposing + // the block on L1 would later fail if it didn't because of txs effects hash mismatch). + // So if we don't constrain the log hash, then a malicious sender can compute the correct log, submit a bad + // log hash to the kernel, and then submit the bad log preimage to the sequencer. All checks will pass, but + // the submitted log will not be the one that was computed by the app. + // In the unconstrained case, we don't care about the log at all because we don't do anything with it, + // and because it's unconstrained: it could be anything. So if a sender chooses to broadcast the tx with a log + // that is different from the one that was used in the circuit, then they'll be able to, but they were already + // able to change the log before anyway, so the end result is the same. It's important here that we do not + // return the log from this function to the app, otherwise it could try to do stuff with it and then that might + // be wrong. + let (encrypted_log, log_hash) = unsafe { + compute_raw_event_log_unconstrained(*context, e, randomness, ovpk, ivpk, recipient) + }; + context.emit_raw_event_log_with_masked_address(randomness, encrypted_log, log_hash); } } diff --git a/noir-projects/aztec-nr/aztec/src/encrypted_logs/encrypted_note_emission.nr b/noir-projects/aztec-nr/aztec/src/encrypted_logs/encrypted_note_emission.nr index fc55b43ea64..e8946c73a26 100644 --- a/noir-projects/aztec-nr/aztec/src/encrypted_logs/encrypted_note_emission.nr +++ b/noir-projects/aztec-nr/aztec/src/encrypted_logs/encrypted_note_emission.nr @@ -1,19 +1,18 @@ use crate::{ context::PrivateContext, note::{note_emission::NoteEmission, note_interface::NoteInterface}, - keys::{getters::{get_public_keys, get_ovsk_app}, public_keys::{OvpkM, IvpkM}}, - encrypted_logs::payload::compute_encrypted_note_log, oracle::logs_traits::LensForEncryptedLog + keys::{getters::get_ovsk_app, public_keys::{OvpkM, IvpkM}}, + encrypted_logs::payload::compute_encrypted_log }; use dep::protocol_types::{hash::sha256_to_field, address::AztecAddress, abis::note_hash::NoteHash}; -fn compute_raw_note_log( +fn compute_raw_note_log( context: PrivateContext, note: Note, ovsk_app: Field, ovpk: OvpkM, ivpk: IvpkM, - recipient: AztecAddress, - num_public_values: u8 // Number of values to be appended to the log in public (used in partial note flow). -) -> (u32, [u8; M], Field) where Note: NoteInterface, [Field; N]: LensForEncryptedLog { + recipient: AztecAddress +) -> (u32, [u8; 416 + N * 32], Field) where Note: NoteInterface { let note_header = note.get_header(); let note_hash_counter = note_header.note_hash_counter; let storage_slot = note_header.storage_slot; @@ -24,104 +23,48 @@ fn compute_raw_note_log( let contract_address: AztecAddress = context.this_address(); - let encrypted_log: [u8; M] = compute_encrypted_note_log( - contract_address, - storage_slot, - ovsk_app, - ovpk, - ivpk, - recipient, - note, - num_public_values - ); + let plaintext = note.to_be_bytes(storage_slot); + let encrypted_log: [u8; 416 + N * 32] = compute_encrypted_log(contract_address, ovsk_app, ovpk, ivpk, recipient, plaintext); let log_hash = sha256_to_field(encrypted_log); (note_hash_counter, encrypted_log, log_hash) } -unconstrained fn compute_raw_note_log_unconstrained( +unconstrained fn compute_raw_note_log_unconstrained( context: PrivateContext, note: Note, ovpk: OvpkM, ivpk: IvpkM, - recipient: AztecAddress, - num_public_values: u8 // Number of values to be appended to the log in public (used in partial note flow). -) -> (u32, [u8; M], Field) where Note: NoteInterface, [Field; N]: LensForEncryptedLog { + recipient: AztecAddress +) -> (u32, [u8; 416 + N * 32], Field) where Note: NoteInterface { let ovsk_app = get_ovsk_app(ovpk.hash()); - compute_raw_note_log(context, note, ovsk_app, ovpk, ivpk, recipient, num_public_values) -} - -pub fn encode_and_encrypt_note( - context: &mut PrivateContext, - ov: AztecAddress, - iv: AztecAddress -) -> fn[(AztecAddress, AztecAddress, &mut PrivateContext)](NoteEmission) -> () where Note: NoteInterface, [Field; N]: LensForEncryptedLog { - | e: NoteEmission | { - let ovpk = get_public_keys(ov).ovpk_m; - let ivpk = get_public_keys(iv).ivpk_m; - let ovsk_app: Field = context.request_ovsk_app(ovpk.hash()); - - // Number of public values is always 0 here because `encode_and_encrypt_note(...)` is only called - // in the non-partial note flow. - let num_public_values = 0; - let (note_hash_counter, encrypted_log, log_hash) = compute_raw_note_log(*context, e.note, ovsk_app, ovpk, ivpk, iv, num_public_values); - context.emit_raw_note_log(note_hash_counter, encrypted_log, log_hash); - } -} - -pub fn encode_and_encrypt_note_unconstrained( - context: &mut PrivateContext, - ov: AztecAddress, - iv: AztecAddress -) -> fn[(AztecAddress, AztecAddress, &mut PrivateContext)](NoteEmission) -> () where Note: NoteInterface, [Field; N]: LensForEncryptedLog { - | e: NoteEmission | { - // Note: We could save a lot of gates by obtaining the following keys in an unconstrained context but this - // function is currently not used anywhere so we are not optimizing it. - let ovpk = get_public_keys(ov).ovpk_m; - let ivpk = get_public_keys(iv).ivpk_m; - - // Number of public values is always 0 here because `encode_and_encrypt_note_unconstrained(...)` is only called - // in the non-partial note flow. - let num_public_values = 0; - - // See the comment in `encode_and_encrypt_note_with_keys_unconstrained` for why having note hash counter - // and log hash unconstrained here is fine. - let (note_hash_counter, encrypted_log, log_hash) = unsafe { - compute_raw_note_log_unconstrained(*context, e.note, ovpk, ivpk, iv, num_public_values) - }; - context.emit_raw_note_log(note_hash_counter, encrypted_log, log_hash); - } + compute_raw_note_log(context, note, ovsk_app, ovpk, ivpk, recipient) } -pub fn encode_and_encrypt_note_with_keys( +// This function seems to be affected by the following Noir bug: +// https://github.com/noir-lang/noir/issues/5771 +// If you get weird behavior it might be because of it. +pub fn encode_and_encrypt_note( context: &mut PrivateContext, ovpk: OvpkM, ivpk: IvpkM, recipient: AztecAddress -) -> fn[(&mut PrivateContext, OvpkM, IvpkM, AztecAddress)](NoteEmission) -> () where Note: NoteInterface, [Field; N]: LensForEncryptedLog { +) -> fn[(&mut PrivateContext, OvpkM, IvpkM, AztecAddress)](NoteEmission) -> () where Note: NoteInterface { | e: NoteEmission | { let ovsk_app: Field = context.request_ovsk_app(ovpk.hash()); - // Number of public values is always 0 here because `encode_and_encrypt_note_unconstrained(...)` is only called - // in the non-partial note flow. - let num_public_values = 0; - - let (note_hash_counter, encrypted_log, log_hash) = compute_raw_note_log(*context, e.note, ovsk_app, ovpk, ivpk, recipient, num_public_values); + let (note_hash_counter, encrypted_log, log_hash) = compute_raw_note_log(*context, e.note, ovsk_app, ovpk, ivpk, recipient); context.emit_raw_note_log(note_hash_counter, encrypted_log, log_hash); } } -pub fn encode_and_encrypt_note_with_keys_unconstrained( +pub fn encode_and_encrypt_note_unconstrained( context: &mut PrivateContext, ovpk: OvpkM, ivpk: IvpkM, recipient: AztecAddress -) -> fn[(&mut PrivateContext, OvpkM, IvpkM, AztecAddress)](NoteEmission) -> () where Note: NoteInterface, [Field; N]: LensForEncryptedLog { +) -> fn[(&mut PrivateContext, OvpkM, IvpkM, AztecAddress)](NoteEmission) -> () where Note: NoteInterface { | e: NoteEmission | { - // Number of public values is always 0 here because `encode_and_encrypt_note_with_keys_unconstrained(...)` is only called - // in the non-partial note flow. - let num_public_values = 0; - // Having the log hash be unconstrained here is fine because the way this works is we send the log hash // to the kernel, and it gets included as part of its public inputs. Then we send the tx to the sequencer, // which includes the kernel proof and the log preimages. The sequencer computes the hashes of the logs @@ -142,7 +85,7 @@ pub fn encode_and_encrypt_note_with_keys_unconstrained { - plaintext: [u8; N * 32 + 64] -} - -impl EncryptedLogIncomingBody { - pub fn from_note(note: T, storage_slot: Field) -> Self where T: NoteInterface { - let mut plaintext = note.to_be_bytes(storage_slot); - EncryptedLogIncomingBody { plaintext } - } - - pub fn from_event(event: T, randomness: Field) -> Self where T: EventInterface { - let mut plaintext = event.private_to_be_bytes(randomness); - EncryptedLogIncomingBody { plaintext } - } - - pub fn compute_ciphertext(self, eph_sk: Scalar, ivpk: IvpkM) -> [u8] { - let full_key = point_to_symmetric_key(eph_sk, ivpk.to_point()); - let mut sym_key = [0; 16]; - let mut iv = [0; 16]; - - for i in 0..16 { - sym_key[i] = full_key[i]; - iv[i] = full_key[i + 16]; - } - aes128_encrypt(self.plaintext, iv, sym_key) - } -} - -mod test { - use dep::protocol_types::{ - address::AztecAddress, scalar::Scalar, point::Point, traits::Serialize, - abis::event_selector::EventSelector - }; - - use crate::{ - note::{note_header::NoteHeader, note_interface::{NoteInterface, NullifiableNote}}, - encrypted_logs::incoming_body::EncryptedLogIncomingBody, event::event_interface::EventInterface, - context::PrivateContext, keys::public_keys::IvpkM - }; - - struct AddressNote { - address: AztecAddress, - owner: AztecAddress, - randomness: Field, - header: NoteHeader, - } - - global ADDRESS_NOTE_LEN: u32 = 3; - - impl NullifiableNote for AddressNote { - fn compute_nullifier( - _self: Self, - _context: &mut PrivateContext, - _note_hash_for_nullify: Field - ) -> Field { - 1 - } - - unconstrained fn compute_nullifier_without_context(_self: Self) -> Field { - 1 - } - } - - struct AddressNoteHidingPoint { - inner: Point - } - - impl NoteInterface for AddressNote { - - fn get_note_type_id() -> Field { - 1 - } - - fn get_header(self) -> NoteHeader { - self.header - } - - fn set_header(&mut self, header: NoteHeader) { - self.header = header; - } - - fn serialize_content(self) -> [Field; ADDRESS_NOTE_LEN] { - [self.address.to_field(), self.owner.to_field(), self.randomness] - } - - fn deserialize_content(fields: [Field; ADDRESS_NOTE_LEN]) -> Self { - AddressNote { - address: AztecAddress::from_field(fields[0]), - owner: AztecAddress::from_field(fields[1]), - randomness: fields[2], - header: NoteHeader::empty() - } - } - - fn to_be_bytes(self, storage_slot: Field) -> [u8; ADDRESS_NOTE_LEN * 32 + 64] { - let serialized_note = self.serialize_content(); - - let mut buffer: [u8; ADDRESS_NOTE_LEN * 32 + 64] = [0; ADDRESS_NOTE_LEN * 32 + 64]; - - let storage_slot_bytes: [u8; 32] = storage_slot.to_be_bytes(); - let note_type_id_bytes: [u8; 32] = AddressNote::get_note_type_id().to_be_bytes(); - - for i in 0..32 { - buffer[i] = storage_slot_bytes[i]; - buffer[32 + i] = note_type_id_bytes[i]; - } - - for i in 0..serialized_note.len() { - let bytes: [u8; 32] = serialized_note[i].to_be_bytes(); - for j in 0..32 { - buffer[64 + i * 32 + j] = bytes[j]; - } - } - buffer - } - - fn compute_note_hash(_self: Self) -> Field { - crate::generators::Ga1.x - } - } - - impl AddressNote { - pub fn new(address: AztecAddress, owner: AztecAddress, randomness: Field) -> Self { - AddressNote { address, owner, randomness, header: NoteHeader::empty() } - } - } - - #[test] - unconstrained fn test_encrypted_note_log_incoming_body_matches_typescript() { - // All the values in this test were copied over from `encrypted_note_log_incoming_body.test.ts` - let note = AddressNote::new( - AztecAddress::from_field(0x1), - AztecAddress::from_field(0x2), - 3 - ); - - let storage_slot = 2; - - let eph_sk = Scalar { - lo: 0x00000000000000000000000000000000649e7ca01d9de27b21624098b897babd, - hi: 0x0000000000000000000000000000000023b3127c127b1f29a7adff5cccf8fb06 - }; - let ivpk = IvpkM { - inner: Point { - x: 0x2688431c705a5ff3e6c6f2573c9e3ba1c1026d2251d0dbbf2d810aa53fd1d186, - y: 0x1e96887b117afca01c00468264f4f80b5bb16d94c1808a448595f115556e5c8e, - is_infinite: false - } - }; - - // 1. `EncryptedLogIncomingBody::from_note` calls `note.to_be_bytes(storage_slot)` function which serializes - // the note to bytes - note that in the case of `AddressNote` the `to_be_bytes` function was automatically - // implemented by Aztec macros. - let body = EncryptedLogIncomingBody::from_note(note, storage_slot); - - // 2. `body.compute_ciphertext(...)` function then derives symmetric key from `eph_sk` and `ivpk` and encrypts - // the note plaintext using AES-128. - let ciphertext = body.compute_ciphertext(eph_sk, ivpk); - - // The following value was generated by `encrypted_note_log_incoming_body.test.ts`. - // --> Run the test with AZTEC_GENERATE_TEST_DATA=1 flag to update test data. - let note_body_ciphertext_from_typescript = [ - 226, 240, 253, 6, 28, 52, 19, 131, 33, 132, 178, 212, 245, 62, 14, 190, 147, 228, 160, 190, 146, 61, 95, 203, 124, 153, 68, 168, 17, 150, 92, 0, 99, 214, 85, 64, 191, 78, 157, 131, 149, 96, 236, 253, 96, 172, 157, 30, 27, 176, 228, 74, 242, 190, 138, 48, 33, 93, 46, 37, 223, 130, 25, 245, 188, 163, 159, 223, 187, 24, 139, 206, 131, 154, 159, 130, 37, 17, 158, 114, 242, 141, 124, 193, 232, 54, 146, 96, 145, 100, 125, 234, 57, 43, 95, 115, 183, 39, 121, 232, 134, 229, 148, 25, 46, 77, 87, 127, 95, 7, 77, 188, 37, 234, 245, 142, 232, 87, 252, 28, 67, 67, 90, 214, 254, 89, 47, 68, 66, 187, 227, 8, 59, 162, 25, 141, 97, 141, 217, 197, 115, 15, 212, 202, 157, 41, 150, 62, 219, 57, 224, 92, 185, 212, 142, 94, 146, 41, 178, 145, 68, 169, 23, 185, 206, 138, 70, 47, 176, 210, 165, 236, 23, 206, 229, 108 - ]; - - assert_eq(note_body_ciphertext_from_typescript.len(), ciphertext.len()); - - for i in 0..note_body_ciphertext_from_typescript.len() { - assert_eq(ciphertext[i], note_body_ciphertext_from_typescript[i]); - } - } - - struct TestEvent { - value0: Field, - value1: Field, - value2: Field, - } - - impl Serialize<3> for TestEvent { - fn serialize(self) -> [Field; 3] { - [self.value0, self.value1, self.value2] - } - } - - global TEST_EVENT_LEN: u32 = 3; - - impl EventInterface for TestEvent { - fn get_event_type_id() -> EventSelector { - comptime - { - EventSelector::from_signature("TestEvent(Field,Field,Field)") - } - } - - fn private_to_be_bytes(self, randomness: Field) -> [u8; TEST_EVENT_LEN * 32 + 64] { - let mut buffer: [u8; TEST_EVENT_LEN * 32 + 64] = [0; TEST_EVENT_LEN * 32 + 64]; - - let randomness_bytes: [u8; 32] = randomness.to_be_bytes(); - let event_type_id_bytes: [u8; 32] = TestEvent::get_event_type_id().to_field().to_be_bytes(); - - for i in 0..32 { - buffer[i] = randomness_bytes[i]; - buffer[32 + i] = event_type_id_bytes[i]; - } - - let serialized_event = self.serialize(); - - for i in 0..serialized_event.len() { - let bytes: [u8; 32] = serialized_event[i].to_be_bytes(); - for j in 0..32 { - buffer[64 + i * 32 + j] = bytes[j]; - } - } - - buffer - } - - fn to_be_bytes(self) -> [u8; TEST_EVENT_LEN * 32 + 32] { - let mut buffer: [u8; TEST_EVENT_LEN * 32 + 32] = [0; TEST_EVENT_LEN * 32 + 32]; - - let event_type_id_bytes: [u8; 32] = TestEvent::get_event_type_id().to_field().to_be_bytes(); - - for i in 0..32 { - buffer[i] = event_type_id_bytes[i]; - } - - let serialized_event = self.serialize(); - - for i in 0..serialized_event.len() { - let bytes: [u8; 32] = serialized_event[i].to_be_bytes(); - for j in 0..32 { - buffer[32 + i * 32 + j] = bytes[j]; - } - } - - buffer - } - - fn emit(self, _emit: fn[Env](Self) -> ()) { - _emit(self); - } - } - - #[test] - unconstrained fn test_encrypted_log_event_incoming_body() { - let test_event = TestEvent { value0: 1, value1: 2, value2: 3 }; - - let eph_sk = Scalar { - lo: 0x00000000000000000000000000000000649e7ca01d9de27b21624098b897babd, - hi: 0x0000000000000000000000000000000023b3127c127b1f29a7adff5cccf8fb06 - }; - - let ivpk = IvpkM { - inner: Point { - x: 0x2688431c705a5ff3e6c6f2573c9e3ba1c1026d2251d0dbbf2d810aa53fd1d186, - y: 0x1e96887b117afca01c00468264f4f80b5bb16d94c1808a448595f115556e5c8e, - is_infinite: false - } - }; - - let randomness = 2; - - let body = EncryptedLogIncomingBody::from_event(test_event, randomness); - - let ciphertext = body.compute_ciphertext(eph_sk, ivpk); - - // The following value was generated by `encrypted_event_log_incoming_body.test.ts` - // --> Run the test with AZTEC_GENERATE_TEST_DATA=1 flag to update test data. - let event_body_ciphertext_from_typescript = [ - 226, 240, 253, 6, 28, 52, 19, 131, 33, 132, 178, 212, 245, 62, 14, 190, 147, 228, 160, 190, 146, 61, 95, 203, 124, 153, 68, 168, 17, 150, 92, 0, 99, 214, 85, 64, 191, 78, 157, 131, 149, 96, 236, 253, 96, 172, 157, 30, 201, 247, 40, 80, 60, 188, 158, 251, 242, 103, 197, 79, 165, 195, 10, 160, 255, 35, 167, 152, 25, 233, 77, 145, 214, 243, 210, 119, 0, 20, 29, 95, 15, 63, 33, 190, 184, 67, 254, 96, 128, 243, 220, 228, 201, 130, 86, 163, 52, 127, 111, 10, 212, 7, 160, 16, 87, 13, 39, 11, 5, 1, 164, 65, 8, 56, 82, 245, 13, 68, 176, 90, 100, 69, 243, 78, 117, 188, 221, 34, 178, 31, 155, 89, 143, 176, 129, 118, 36, 236, 64, 179, 52, 239, 184, 51, 51, 199, 221, 49, 81, 197, 17, 199, 192, 99, 49, 168, 157, 164, 190, 33, 240, 182, 214, 173, 7, 156, 102, 95, 65, 217, 225, 123, 42, 21, 124, 144 - ]; - - assert_eq(event_body_ciphertext_from_typescript.len(), ciphertext.len()); - - for i in 0..event_body_ciphertext_from_typescript.len() { - assert_eq(ciphertext[i], event_body_ciphertext_from_typescript[i]); - } - } -} diff --git a/noir-projects/aztec-nr/aztec/src/encrypted_logs/mod.nr b/noir-projects/aztec-nr/aztec/src/encrypted_logs/mod.nr index dfc49fc0a86..3053e35728f 100644 --- a/noir-projects/aztec-nr/aztec/src/encrypted_logs/mod.nr +++ b/noir-projects/aztec-nr/aztec/src/encrypted_logs/mod.nr @@ -1,6 +1,4 @@ mod header; -mod incoming_body; -mod outgoing_body; mod payload; mod encrypted_note_emission; mod encrypted_event_emission; diff --git a/noir-projects/aztec-nr/aztec/src/encrypted_logs/outgoing_body.nr b/noir-projects/aztec-nr/aztec/src/encrypted_logs/outgoing_body.nr deleted file mode 100644 index dfd92f65121..00000000000 --- a/noir-projects/aztec-nr/aztec/src/encrypted_logs/outgoing_body.nr +++ /dev/null @@ -1,97 +0,0 @@ -use dep::protocol_types::{ - address::AztecAddress, scalar::Scalar, point::Point, constants::GENERATOR_INDEX__SYMMETRIC_KEY, - hash::poseidon2_hash_with_separator -}; -use std::aes128::aes128_encrypt; - -use crate::{keys::public_keys::IvpkM, utils::point::point_to_bytes}; - -pub struct EncryptedLogOutgoingBody { - eph_sk: Scalar, - recipient: AztecAddress, - recipient_ivpk: IvpkM, -} - -impl EncryptedLogOutgoingBody { - pub fn new(eph_sk: Scalar, recipient: AztecAddress, recipient_ivpk: IvpkM) -> Self { - Self { eph_sk, recipient, recipient_ivpk } - } - - /// Encrypts ephemeral secret key and recipient's ivpk --> with this information the recipient of outgoing will - /// be able to derive the key with which the incoming log can be decrypted. - pub fn compute_ciphertext(self, ovsk_app: Scalar, eph_pk: Point) -> [u8; 144] { - // Again, we could compute `eph_pk` here, but we keep the interface more similar - // and also make it easier to optimise it later as we just pass it along - - let mut buffer = [0 as u8; 128]; - - let serialized_eph_sk_high: [u8; 32] = self.eph_sk.hi.to_be_bytes(); - let serialized_eph_sk_low: [u8; 32] = self.eph_sk.lo.to_be_bytes(); - - let address_bytes: [u8; 32] = self.recipient.to_field().to_be_bytes(); - let serialized_recipient_ivpk = point_to_bytes(self.recipient_ivpk.to_point()); - - for i in 0..32 { - buffer[i] = serialized_eph_sk_high[i]; - buffer[i + 32] = serialized_eph_sk_low[i]; - buffer[i + 64] = address_bytes[i]; - } - for i in 0..32 { - buffer[i + 96] = serialized_recipient_ivpk[i]; - } - - // We compute the symmetric key using poseidon. - let full_key: [u8; 32] = poseidon2_hash_with_separator( - [ovsk_app.hi, ovsk_app.lo, eph_pk.x, eph_pk.y], - GENERATOR_INDEX__SYMMETRIC_KEY as Field - ).to_be_bytes(); - - let mut sym_key = [0; 16]; - let mut iv = [0; 16]; - - for i in 0..16 { - sym_key[i] = full_key[i]; - iv[i] = full_key[i + 16]; - } - aes128_encrypt(buffer, iv, sym_key).as_array() - } -} - -mod test { - use crate::{encrypted_logs::outgoing_body::EncryptedLogOutgoingBody, keys::public_keys::IvpkM}; - use dep::protocol_types::{address::AztecAddress, scalar::Scalar}; - use std::embedded_curve_ops::fixed_base_scalar_mul as derive_public_key; - - #[test] - unconstrained fn test_encrypted_log_outgoing_body_matches_typescript() { - let eph_sk = Scalar { - lo: 0x00000000000000000000000000000000d0d302ee245dfaf2807e604eec4715fe, - hi: 0x000000000000000000000000000000000f096b423017226a18461115fa8d34bb - }; - let recipient_ivsk = Scalar { - lo: 0x000000000000000000000000000000004828f8f95676ebb481df163f87fd4022, - hi: 0x000000000000000000000000000000000f4d97c25d578f9348251a71ca17ae31 - }; - let sender_ovsk_app = Scalar { - lo: 0x0000000000000000000000000000000074d2e28c6bc5176ac02cf7c7d36a444e, - hi: 0x00000000000000000000000000000000089c6887cb1446d86c64e81afc78048b - }; - - let eph_pk = derive_public_key(eph_sk); - let recipient_ivpk = IvpkM { inner: derive_public_key(recipient_ivsk) }; - - let recipient = AztecAddress::from_field(0xdeadbeef); - - let body = EncryptedLogOutgoingBody::new(eph_sk, recipient, recipient_ivpk); - - let ciphertext = body.compute_ciphertext(sender_ovsk_app, eph_pk); - - // The following value was generated by `encrypted_log_outgoing_body.test.ts` - // --> Run the test with AZTEC_GENERATE_TEST_DATA=1 flag to update test data. - let outgoing_body_ciphertext_from_typescript = [ - 127, 182, 227, 75, 192, 197, 54, 47, 168, 134, 233, 148, 251, 46, 86, 12, 73, 50, 238, 50, 31, 174, 27, 202, 110, 77, 161, 197, 244, 124, 17, 100, 143, 150, 232, 14, 156, 248, 43, 177, 16, 82, 244, 103, 88, 74, 84, 200, 15, 65, 187, 14, 163, 60, 91, 22, 104, 31, 211, 190, 124, 121, 79, 92, 239, 65, 185, 106, 51, 178, 168, 137, 84, 43, 79, 158, 151, 152, 83, 42, 170, 13, 106, 209, 254, 74, 39, 145, 73, 215, 17, 234, 196, 89, 30, 58, 120, 127, 88, 69, 121, 61, 18, 206, 89, 118, 243, 238, 177, 71, 73, 47, 147, 4, 155, 25, 173, 248, 206, 52, 17, 180, 122, 186, 106, 191, 252, 102, 197, 91, 16, 39, 94, 91, 224, 30, 168, 177, 26, 144, 5, 124, 128, 6 - ]; - - assert_eq(outgoing_body_ciphertext_from_typescript, ciphertext); - } -} diff --git a/noir-projects/aztec-nr/aztec/src/encrypted_logs/payload.nr b/noir-projects/aztec-nr/aztec/src/encrypted_logs/payload.nr index 782ec40be53..8d203447160 100644 --- a/noir-projects/aztec-nr/aztec/src/encrypted_logs/payload.nr +++ b/noir-projects/aztec-nr/aztec/src/encrypted_logs/payload.nr @@ -1,38 +1,35 @@ -use dep::protocol_types::{address::AztecAddress, scalar::Scalar, point::Point}; +use dep::protocol_types::{ + address::AztecAddress, scalar::Scalar, point::Point, constants::GENERATOR_INDEX__SYMMETRIC_KEY, + hash::poseidon2_hash_with_separator +}; use std::{ - embedded_curve_ops::fixed_base_scalar_mul as derive_public_key, + aes128::aes128_encrypt, embedded_curve_ops::fixed_base_scalar_mul as derive_public_key, hash::from_field_unsafe as fr_to_fq_unsafe, field::bn254::decompose }; use crate::{ - event::event_interface::EventInterface, oracle::unsafe_rand::unsafe_rand, - utils::point::point_to_bytes, note::note_interface::NoteInterface, - encrypted_logs::{ - header::EncryptedLogHeader, incoming_body::EncryptedLogIncomingBody, - outgoing_body::EncryptedLogOutgoingBody -}, - keys::public_keys::{OvpkM, IvpkM} + oracle::random::random, utils::point::point_to_bytes, encrypted_logs::{header::EncryptedLogHeader}, + keys::{point_to_symmetric_key::point_to_symmetric_key, public_keys::{OvpkM, IvpkM}} }; -pub fn compute_encrypted_event_log( +pub fn compute_encrypted_log( contract_address: AztecAddress, - randomness: Field, ovsk_app: Field, ovpk: OvpkM, ivpk: IvpkM, recipient: AztecAddress, - event: Event -) -> [u8; OB] where Event: EventInterface { + plaintext: [u8; P] +) -> [u8; M] { let (eph_sk, eph_pk) = generate_ephemeral_key_pair(); let header = EncryptedLogHeader::new(contract_address); let incoming_header_ciphertext: [u8; 48] = header.compute_ciphertext(eph_sk, ivpk); let outgoing_header_ciphertext: [u8; 48] = header.compute_ciphertext(eph_sk, ovpk); - let incoming_body_ciphertext = EncryptedLogIncomingBody::from_event(event, randomness).compute_ciphertext(eph_sk, ivpk); - let outgoing_body_ciphertext: [u8; 144] = EncryptedLogOutgoingBody::new(eph_sk, recipient, ivpk).compute_ciphertext(fr_to_fq(ovsk_app), eph_pk); + let incoming_body_ciphertext = compute_incoming_body_ciphertext(plaintext, eph_sk, ivpk); + let outgoing_body_ciphertext: [u8; 144] = compute_outgoing_body_ciphertext(recipient, ivpk, fr_to_fq(ovsk_app), eph_sk, eph_pk); - let mut encrypted_bytes: [u8; OB] = [0; OB]; + let mut encrypted_bytes: [u8; M] = [0; M]; // @todo We ignore the tags for now let eph_pk_bytes = point_to_bytes(eph_pk); @@ -47,7 +44,7 @@ pub fn compute_encrypted_event_log( encrypted_bytes[192 + i] = outgoing_body_ciphertext[i]; } // Then we fill in the rest as the incoming body ciphertext - let size = OB - 336; + let size = M - 336; assert_eq(size, incoming_body_ciphertext.len(), "ciphertext length mismatch"); for i in 0..size { encrypted_bytes[336 + i] = incoming_body_ciphertext[i]; @@ -61,61 +58,7 @@ pub fn compute_encrypted_event_log( // outgoing_header (48 bytes) // outgoing_body (144 bytes) // incoming_body_fixed (64 bytes) - // incoming_body_variable (N * 32 bytes + 16 bytes padding) - encrypted_bytes -} - -pub fn compute_encrypted_note_log( - contract_address: AztecAddress, - storage_slot: Field, - ovsk_app: Field, - ovpk: OvpkM, - ivpk: IvpkM, - recipient: AztecAddress, - note: Note, - num_public_values: u8 // Number of values to be appended to the log in public (used in partial note flow). -) -> [u8; M] where Note: NoteInterface { - let (eph_sk, eph_pk) = generate_ephemeral_key_pair(); - - let header = EncryptedLogHeader::new(contract_address); - - let incoming_header_ciphertext: [u8; 48] = header.compute_ciphertext(eph_sk, ivpk); - let outgoing_header_ciphertext: [u8; 48] = header.compute_ciphertext(eph_sk, ovpk); - let incoming_body_ciphertext = EncryptedLogIncomingBody::from_note(note, storage_slot).compute_ciphertext(eph_sk, ivpk); - let outgoing_body_ciphertext: [u8; 144] = EncryptedLogOutgoingBody::new(eph_sk, recipient, ivpk).compute_ciphertext(fr_to_fq(ovsk_app), eph_pk); - - let mut encrypted_bytes: [u8; M] = [0; M]; - // @todo We ignore the tags for now - - encrypted_bytes[64] = num_public_values; // TODO(#8558): This can be just a single bit if we store info about partial fields in ABI - let eph_pk_bytes = point_to_bytes(eph_pk); - for i in 0..32 { - encrypted_bytes[65 + i] = eph_pk_bytes[i]; - } - for i in 0..48 { - encrypted_bytes[97 + i] = incoming_header_ciphertext[i]; - encrypted_bytes[145 + i] = outgoing_header_ciphertext[i]; - } - for i in 0..144 { - encrypted_bytes[193 + i] = outgoing_body_ciphertext[i]; - } - // Then we fill in the rest as the incoming body ciphertext - let size = M - 337; - assert_eq(size, incoming_body_ciphertext.len(), "ciphertext length mismatch"); - for i in 0..size { - encrypted_bytes[337 + i] = incoming_body_ciphertext[i]; - } - - // Current unoptimized size of the encrypted log - // incoming_tag (32 bytes) - // outgoing_tag (32 bytes) - // num_public_values (1 byte) - // eph_pk (32 bytes) - // incoming_header (48 bytes) - // outgoing_header (48 bytes) - // outgoing_body (144 bytes) - // incoming_body_fixed (64 bytes) - // incoming_body_variable (N * 32 bytes + 16 bytes padding) + // incoming_body_variable (P + 16 bytes padding) encrypted_bytes } @@ -129,27 +72,93 @@ fn fr_to_fq(r: Field) -> Scalar { fn generate_ephemeral_key_pair() -> (Scalar, Point) { // @todo Need to draw randomness from the full domain of Fq not only Fr + + // We use the randomness to preserve the privacy of both the sender and recipient via encryption, so a malicious + // sender could use non-random values to reveal the plaintext. But they already know it themselves anyway, and so + // the recipient already trusts them to not disclose this information. We can therefore assume that the sender will + // cooperate in the random value generation. + let randomness = unsafe { + random() + }; + // We use the unsafe version of `fr_to_fq` because multi_scalar_mul (called by derive_public_key) will constrain // the scalars. - let eph_sk = fr_to_fq_unsafe(unsafe_rand()); + let eph_sk = fr_to_fq_unsafe(randomness); let eph_pk = derive_public_key(eph_sk); (eph_sk, eph_pk) } +pub fn compute_incoming_body_ciphertext(plaintext: [u8; P], eph_sk: Scalar, ivpk: IvpkM) -> [u8] { + let full_key = point_to_symmetric_key(eph_sk, ivpk.to_point()); + let mut sym_key = [0; 16]; + let mut iv = [0; 16]; + + for i in 0..16 { + sym_key[i] = full_key[i]; + iv[i] = full_key[i + 16]; + } + aes128_encrypt(plaintext, iv, sym_key) +} + +/// Encrypts ephemeral secret key and recipient's ivpk --> with this information the recipient of outgoing will +/// be able to derive the key with which the incoming log can be decrypted. +pub fn compute_outgoing_body_ciphertext( + recipient: AztecAddress, + recipient_ivpk: IvpkM, + ovsk_app: Scalar, + eph_sk: Scalar, + eph_pk: Point +) -> [u8; 144] { + // Again, we could compute `eph_pk` here, but we keep the interface more similar + // and also make it easier to optimise it later as we just pass it along + + let mut buffer = [0 as u8; 128]; + + let serialized_eph_sk_high: [u8; 32] = eph_sk.hi.to_be_bytes(); + let serialized_eph_sk_low: [u8; 32] = eph_sk.lo.to_be_bytes(); + + let address_bytes: [u8; 32] = recipient.to_field().to_be_bytes(); + let serialized_recipient_ivpk = point_to_bytes(recipient_ivpk.to_point()); + + for i in 0..32 { + buffer[i] = serialized_eph_sk_high[i]; + buffer[i + 32] = serialized_eph_sk_low[i]; + buffer[i + 64] = address_bytes[i]; + } + for i in 0..32 { + buffer[i + 96] = serialized_recipient_ivpk[i]; + } + + // We compute the symmetric key using poseidon. + let full_key: [u8; 32] = poseidon2_hash_with_separator( + [ovsk_app.hi, ovsk_app.lo, eph_pk.x, eph_pk.y], + GENERATOR_INDEX__SYMMETRIC_KEY as Field + ).to_be_bytes(); + + let mut sym_key = [0; 16]; + let mut iv = [0; 16]; + + for i in 0..16 { + sym_key[i] = full_key[i]; + iv[i] = full_key[i + 16]; + } + aes128_encrypt(buffer, iv, sym_key).as_array() +} + mod test { use crate::{ - encrypted_logs::payload::compute_encrypted_note_log, keys::public_keys::{OvpkM, IvpkM}, - test::mocks::mock_note::MockNoteBuilder + encrypted_logs::payload::{compute_encrypted_log, compute_incoming_body_ciphertext, compute_outgoing_body_ciphertext}, + keys::public_keys::{OvpkM, IvpkM} }; - use dep::protocol_types::{address::AztecAddress, point::Point}; + use std::embedded_curve_ops::fixed_base_scalar_mul as derive_public_key; + use dep::protocol_types::{address::AztecAddress, point::Point, scalar::Scalar}; use std::test::OracleMock; #[test] - unconstrained fn test_encrypted_note_log_matches_typescript() { + unconstrained fn test_encrypted_log_matches_typescript() { // All the values in this test were copied over from `tagged_log.test.ts` let contract_address = AztecAddress::from_field(0x10f48cd9eff7ae5b209c557c70de2e657ee79166868676b787e9417e19260e04); - let storage_slot = 0x0fe46be583b71f4ab5b70c2657ff1d05cccf1d292a9369628d1a194f944e6599; let ovsk_app = 0x03a6513d6def49f41d20373d2cec894c23e7492794b08fc50c0e8a1bd2512612; let ovpk_m = OvpkM { inner: Point { @@ -166,95 +175,91 @@ mod test { } }; - let note_value = 0x301640ceea758391b2e161c92c0513f129020f4125256afdae2646ce31099f5c; - let note = MockNoteBuilder::new(note_value).contract_address(contract_address).storage_slot(storage_slot).build(); + let plaintext = [ + 0, 0, 0, 1, 48, 22, 64, 206, 234, 117, 131, 145, 178, 225, 97, 201, 44, 5, 19, 241, 41, 2, 15, 65, 37, 37, 106, 253, 174, 38, 70, 206, 49, 9, 159, 92, 16, 244, 140, 217, 239, 247, 174, 91, 32, 156, 85, 124, 112, 222, 46, 101, 126, 231, 145, 102, 134, 134, 118, 183, 135, 233, 65, 126, 25, 38, 14, 4, 15, 228, 107, 229, 131, 183, 31, 74, 181, 183, 12, 38, 87, 255, 29, 5, 204, 207, 29, 41, 42, 147, 105, 98, 141, 26, 25, 79, 148, 78, 101, 153, 0, 0, 16, 39 + ]; let eph_sk = 0x1358d15019d4639393d62b97e1588c095957ce74a1c32d6ec7d62fe6705d9538; let _ = OracleMock::mock("getRandomField").returns(eph_sk); let recipient = AztecAddress::from_field(0x10ee41ee4b62703b16f61e03cb0d88c4b306a9eb4a6ceeb2aff13428541689a2); - let num_public_values: u8 = 0; - - let log: [u8; 449] = compute_encrypted_note_log( - contract_address, - storage_slot, - ovsk_app, - ovpk_m, - ivpk_m, - recipient, - note, - num_public_values - ); + + let log: [u8; 448] = compute_encrypted_log(contract_address, ovsk_app, ovpk_m, ivpk_m, recipient, plaintext); // The following value was generated by `tagged_log.test.ts` // --> Run the test with AZTEC_GENERATE_TEST_DATA=1 flag to update test data. - let encrypted_note_log_from_typescript = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, 70, 12, 14, 67, 77, 132, 110, 193, 234, 40, 110, 64, 144, 235, 86, 55, 111, 242, 123, 221, 193, 170, 202, 225, 216, 86, 84, 159, 112, 31, 167, 126, 79, 51, 186, 47, 71, 253, 172, 99, 112, 241, 59, 197, 241, 107, 186, 232, 87, 187, 230, 171, 62, 228, 234, 42, 51, 145, 146, 238, 242, 42, 71, 206, 13, 244, 66, 111, 195, 20, 203, 98, 148, 204, 242, 145, 183, 156, 29, 141, 54, 44, 220, 194, 35, 229, 16, 32, 204, 211, 49, 142, 112, 82, 202, 116, 241, 254, 146, 42, 217, 20, 189, 70, 228, 182, 171, 205, 104, 27, 99, 171, 28, 91, 244, 21, 30, 130, 240, 5, 72, 174, 124, 97, 197, 157, 248, 193, 23, 193, 76, 46, 141, 144, 70, 211, 45, 67, 167, 218, 129, 140, 104, 190, 41, 110, 249, 209, 68, 106, 135, 164, 80, 235, 63, 101, 80, 32, 13, 38, 99, 145, 91, 11, 173, 151, 231, 247, 65, 153, 117, 229, 167, 64, 239, 182, 126, 235, 83, 4, 169, 8, 8, 160, 4, 235, 252, 21, 96, 84, 161, 69, 145, 145, 215, 254, 161, 117, 246, 198, 65, 89, 179, 194, 90, 19, 121, 12, 202, 114, 80, 195, 14, 60, 128, 105, 142, 100, 86, 90, 108, 157, 219, 22, 172, 20, 121, 195, 25, 159, 236, 2, 70, 75, 42, 37, 34, 2, 17, 149, 20, 176, 32, 18, 204, 56, 117, 121, 34, 15, 3, 88, 123, 64, 68, 74, 233, 63, 59, 131, 222, 194, 192, 167, 110, 217, 10, 128, 73, 129, 172, 205, 103, 212, 60, 151, 141, 10, 151, 222, 151, 180, 43, 91, 148, 201, 110, 165, 10, 238, 32, 134, 235, 99, 216, 200, 182, 31, 22, 156, 18, 209, 222, 172, 239, 193, 212, 86, 99, 62, 70, 182, 45, 175, 241, 91, 202, 179, 225, 236, 95, 71, 66, 151, 225, 203, 53, 216, 85, 102, 130, 6, 8, 25, 180, 86, 58, 140, 198, 105, 102, 177, 42, 94, 115, 247, 145, 147, 24, 231, 39, 73, 27, 10, 219, 130, 115, 188, 74, 114, 5, 177, 199, 83, 183, 106, 87, 204, 238, 231, 72, 45, 240, 39, 174, 25, 98, 53, 187, 156, 159, 244, 38 + let encrypted_log_from_typescript = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, 70, 12, 14, 67, 77, 132, 110, 193, 234, 40, 110, 64, 144, 235, 86, 55, 111, 242, 123, 221, 193, 170, 202, 225, 216, 86, 84, 159, 112, 31, 167, 126, 79, 51, 186, 47, 71, 253, 172, 99, 112, 241, 59, 197, 241, 107, 186, 232, 87, 187, 230, 171, 62, 228, 234, 42, 51, 145, 146, 238, 242, 42, 71, 206, 13, 244, 66, 111, 195, 20, 203, 98, 148, 204, 242, 145, 183, 156, 29, 141, 54, 44, 220, 194, 35, 229, 16, 32, 204, 211, 49, 142, 112, 82, 202, 116, 241, 254, 146, 42, 217, 20, 189, 70, 228, 182, 171, 205, 104, 27, 99, 171, 28, 91, 244, 21, 30, 130, 240, 5, 72, 174, 124, 97, 197, 157, 248, 193, 23, 193, 76, 46, 141, 144, 70, 211, 45, 67, 167, 218, 129, 140, 104, 190, 41, 110, 249, 209, 68, 106, 135, 164, 80, 235, 63, 101, 80, 32, 13, 38, 99, 145, 91, 11, 173, 151, 231, 247, 65, 153, 117, 229, 167, 64, 239, 182, 126, 235, 83, 4, 169, 8, 8, 160, 4, 235, 252, 21, 96, 84, 161, 69, 145, 145, 215, 254, 161, 117, 246, 198, 65, 89, 179, 194, 90, 19, 121, 12, 202, 114, 80, 195, 14, 60, 128, 105, 142, 100, 86, 90, 108, 157, 219, 22, 172, 20, 121, 195, 25, 159, 236, 2, 70, 75, 42, 37, 34, 2, 17, 149, 20, 176, 32, 18, 204, 56, 117, 121, 34, 15, 3, 88, 123, 64, 68, 74, 233, 63, 59, 131, 222, 194, 192, 167, 110, 217, 10, 128, 73, 129, 172, 61, 43, 12, 98, 165, 203, 191, 154, 161, 150, 4, 239, 95, 48, 60, 159, 33, 222, 142, 102, 73, 193, 236, 145, 197, 160, 216, 254, 113, 243, 25, 244, 251, 192, 222, 35, 7, 114, 101, 35, 152, 151, 112, 24, 32, 94, 138, 71, 160, 91, 68, 131, 217, 117, 140, 19, 147, 37, 197, 192, 21, 43, 172, 239, 239, 205, 15, 110, 76, 26, 211, 42, 117, 4, 15, 135, 145, 247, 37, 73, 84, 164, 149, 250, 35, 0, 205, 105, 178, 143, 104, 98, 100, 250, 193, 154, 136, 175, 177, 109, 225, 207, 252, 147, 250, 250, 189, 117, 147, 101, 230, 132 ]; - assert_eq(encrypted_note_log_from_typescript, log); + assert_eq(encrypted_log_from_typescript, log); } #[test] - unconstrained fn test_encrypted_note_log_of_finalized_partial_note_matches_typescript() { - // All the values in this test were copied over from `tagged_log.test.ts` - let contract_address = AztecAddress::from_field(0x10f48cd9eff7ae5b209c557c70de2e657ee79166868676b787e9417e19260e04); - let storage_slot = 0x0fe46be583b71f4ab5b70c2657ff1d05cccf1d292a9369628d1a194f944e6599; - let ovsk_app = 0x03a6513d6def49f41d20373d2cec894c23e7492794b08fc50c0e8a1bd2512612; - let ovpk_m = OvpkM { - inner: Point { - x: 0x1961448682803198631f299340e4206bb12809d4bebbf012b30f59af73ba1a15, - y: 0x133674060c3925142aceb4f1dcd9f9137d0217d37ff8729ee5ceaa6e2790353d, - is_infinite: false - } + fn test_incoming_body_ciphertext_matches_typescript() { + // All the values in this test were copied over from `encrypted_note_log_incoming_body.test.ts` + let eph_sk = Scalar { + lo: 0x00000000000000000000000000000000649e7ca01d9de27b21624098b897babd, + hi: 0x0000000000000000000000000000000023b3127c127b1f29a7adff5cccf8fb06 }; - let ivpk_m = IvpkM { + let ivpk = IvpkM { inner: Point { - x: 0x260cd3904f6df16e974c29944fdc839e40fb5cf293f03df2eb370851d3a527bc, - y: 0x0eef2964fe6640e84c82b5d2915892409b38e9e25d39f68dd79edb725c55387f, + x: 0x2688431c705a5ff3e6c6f2573c9e3ba1c1026d2251d0dbbf2d810aa53fd1d186, + y: 0x1e96887b117afca01c00468264f4f80b5bb16d94c1808a448595f115556e5c8e, is_infinite: false } }; + let plaintext = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 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 + ]; - let note_value = 0x301640ceea758391b2e161c92c0513f129020f4125256afdae2646ce31099f5c; - let note_public_value1 = 0x14172339287e8d281545c177313f02b6aa2fedfd628cfd8b7f11a136fd0d6557; - let note_public_value2 = 0x0834d81e3f73c7e2809b08ae38600ffc76a2554473eeab6de7bff4b33a84feac; - let note = MockNoteBuilder::new(note_value).contract_address(contract_address).storage_slot(storage_slot).build(); + // `compute_incoming_body_ciphertext(...)` function then derives symmetric key from `eph_sk` and `ivpk` and encrypts + // the note plaintext using AES-128. + let ciphertext = compute_incoming_body_ciphertext(plaintext, eph_sk, ivpk); - let eph_sk = 0x1358d15019d4639393d62b97e1588c095957ce74a1c32d6ec7d62fe6705d9538; - let _ = OracleMock::mock("getRandomField").returns(eph_sk); + // The following value was generated by `encrypted_note_log_incoming_body.test.ts`. + // --> Run the test with AZTEC_GENERATE_TEST_DATA=1 flag to update test data. + let note_body_ciphertext_from_typescript = [ + 226, 240, 253, 6, 28, 52, 19, 131, 33, 132, 178, 212, 245, 62, 14, 190, 147, 228, 160, 190, 146, 61, 95, 203, 124, 153, 68, 168, 17, 150, 92, 0, 99, 214, 85, 64, 191, 78, 157, 131, 149, 96, 236, 253, 96, 172, 157, 30, 27, 176, 228, 74, 242, 190, 138, 48, 33, 93, 46, 37, 223, 130, 25, 245, 188, 163, 159, 223, 187, 24, 139, 206, 131, 154, 159, 130, 37, 17, 158, 114, 242, 141, 124, 193, 232, 54, 146, 96, 145, 100, 125, 234, 57, 43, 95, 115, 183, 39, 121, 232, 134, 229, 148, 25, 46, 77, 87, 127, 95, 7, 77, 188, 37, 234, 245, 142, 232, 87, 252, 28, 67, 67, 90, 214, 254, 89, 47, 68, 66, 187, 227, 8, 59, 162, 25, 141, 97, 141, 217, 197, 115, 15, 212, 202, 157, 41, 150, 62, 219, 57, 224, 92, 185, 212, 142, 94, 146, 41, 178, 145, 68, 169, 23, 185, 206, 138, 70, 47, 176, 210, 165, 236, 23, 206, 229, 108 + ]; - let recipient = AztecAddress::from_field(0x10ee41ee4b62703b16f61e03cb0d88c4b306a9eb4a6ceeb2aff13428541689a2); - let num_public_values: u8 = 2; - - // First we compute the encrypted log without the public values - let log_without_public_values: [u8; 449] = compute_encrypted_note_log( - contract_address, - storage_slot, - ovsk_app, - ovpk_m, - ivpk_m, - recipient, - note, - num_public_values - ); - - // Then we "append" the public values to the log by copying both the original log and the current log into a new byte array - let mut log: [u8; 513] = [0; 513]; - for i in 0..449 { - log[i] = log_without_public_values[i]; - } - let note_public_value1_bytes: [u8; 32] = note_public_value1.to_be_bytes(); - let note_public_value2_bytes: [u8; 32] = note_public_value2.to_be_bytes(); - for i in 0..32 { - log[449 + i] = note_public_value1_bytes[i]; - log[481 + i] = note_public_value2_bytes[i]; + assert_eq(note_body_ciphertext_from_typescript.len(), ciphertext.len()); + + for i in 0..note_body_ciphertext_from_typescript.len() { + assert_eq(ciphertext[i], note_body_ciphertext_from_typescript[i]); } + } - // The following value was generated by `tagged_log.test.ts` + #[test] + fn test_encrypted_log_outgoing_body_matches_typescript() { + let eph_sk = Scalar { + lo: 0x00000000000000000000000000000000d0d302ee245dfaf2807e604eec4715fe, + hi: 0x000000000000000000000000000000000f096b423017226a18461115fa8d34bb + }; + let recipient_ivsk = Scalar { + lo: 0x000000000000000000000000000000004828f8f95676ebb481df163f87fd4022, + hi: 0x000000000000000000000000000000000f4d97c25d578f9348251a71ca17ae31 + }; + let sender_ovsk_app = Scalar { + lo: 0x0000000000000000000000000000000074d2e28c6bc5176ac02cf7c7d36a444e, + hi: 0x00000000000000000000000000000000089c6887cb1446d86c64e81afc78048b + }; + + let eph_pk = derive_public_key(eph_sk); + let recipient_ivpk = IvpkM { inner: derive_public_key(recipient_ivsk) }; + + let recipient = AztecAddress::from_field(0xdeadbeef); + + let ciphertext = compute_outgoing_body_ciphertext(recipient, recipient_ivpk, sender_ovsk_app, eph_sk, eph_pk); + + // The following value was generated by `encrypted_log_outgoing_body.test.ts` // --> Run the test with AZTEC_GENERATE_TEST_DATA=1 flag to update test data. - let encrypted_note_log_of_finalized_partial_from_typescript = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 141, 70, 12, 14, 67, 77, 132, 110, 193, 234, 40, 110, 64, 144, 235, 86, 55, 111, 242, 123, 221, 193, 170, 202, 225, 216, 86, 84, 159, 112, 31, 167, 126, 79, 51, 186, 47, 71, 253, 172, 99, 112, 241, 59, 197, 241, 107, 186, 232, 87, 187, 230, 171, 62, 228, 234, 42, 51, 145, 146, 238, 242, 42, 71, 206, 13, 244, 66, 111, 195, 20, 203, 98, 148, 204, 242, 145, 183, 156, 29, 141, 54, 44, 220, 194, 35, 229, 16, 32, 204, 211, 49, 142, 112, 82, 202, 116, 241, 254, 146, 42, 217, 20, 189, 70, 228, 182, 171, 205, 104, 27, 99, 171, 28, 91, 244, 21, 30, 130, 240, 5, 72, 174, 124, 97, 197, 157, 248, 193, 23, 193, 76, 46, 141, 144, 70, 211, 45, 67, 167, 218, 129, 140, 104, 190, 41, 110, 249, 209, 68, 106, 135, 164, 80, 235, 63, 101, 80, 32, 13, 38, 99, 145, 91, 11, 173, 151, 231, 247, 65, 153, 117, 229, 167, 64, 239, 182, 126, 235, 83, 4, 169, 8, 8, 160, 4, 235, 252, 21, 96, 84, 161, 69, 145, 145, 215, 254, 161, 117, 246, 198, 65, 89, 179, 194, 90, 19, 121, 12, 202, 114, 80, 195, 14, 60, 128, 105, 142, 100, 86, 90, 108, 157, 219, 22, 172, 20, 121, 195, 25, 159, 236, 2, 70, 75, 42, 37, 34, 2, 17, 149, 20, 176, 32, 18, 204, 56, 117, 121, 34, 15, 3, 88, 123, 64, 68, 74, 233, 63, 59, 131, 222, 194, 192, 167, 110, 217, 10, 128, 73, 129, 172, 205, 103, 212, 60, 151, 141, 10, 151, 222, 151, 180, 43, 91, 148, 201, 110, 165, 10, 238, 32, 134, 235, 99, 216, 200, 182, 31, 22, 156, 18, 209, 222, 172, 239, 193, 212, 86, 99, 62, 70, 182, 45, 175, 241, 91, 202, 179, 225, 236, 95, 71, 66, 151, 225, 203, 53, 216, 85, 102, 130, 6, 8, 25, 180, 86, 58, 140, 198, 105, 102, 177, 42, 94, 115, 247, 145, 147, 24, 231, 39, 73, 27, 10, 219, 130, 115, 188, 74, 114, 5, 177, 199, 83, 183, 106, 87, 204, 238, 231, 72, 45, 240, 39, 174, 25, 98, 53, 187, 156, 159, 244, 38, 20, 23, 35, 57, 40, 126, 141, 40, 21, 69, 193, 119, 49, 63, 2, 182, 170, 47, 237, 253, 98, 140, 253, 139, 127, 17, 161, 54, 253, 13, 101, 87, 8, 52, 216, 30, 63, 115, 199, 226, 128, 155, 8, 174, 56, 96, 15, 252, 118, 162, 85, 68, 115, 238, 171, 109, 231, 191, 244, 179, 58, 132, 254, 172 + let outgoing_body_ciphertext_from_typescript = [ + 127, 182, 227, 75, 192, 197, 54, 47, 168, 134, 233, 148, 251, 46, 86, 12, 73, 50, 238, 50, 31, 174, 27, 202, 110, 77, 161, 197, 244, 124, 17, 100, 143, 150, 232, 14, 156, 248, 43, 177, 16, 82, 244, 103, 88, 74, 84, 200, 15, 65, 187, 14, 163, 60, 91, 22, 104, 31, 211, 190, 124, 121, 79, 92, 239, 65, 185, 106, 51, 178, 168, 137, 84, 43, 79, 158, 151, 152, 83, 42, 170, 13, 106, 209, 254, 74, 39, 145, 73, 215, 17, 234, 196, 89, 30, 58, 120, 127, 88, 69, 121, 61, 18, 206, 89, 118, 243, 238, 177, 71, 73, 47, 147, 4, 155, 25, 173, 248, 206, 52, 17, 180, 122, 186, 106, 191, 252, 102, 197, 91, 16, 39, 94, 91, 224, 30, 168, 177, 26, 144, 5, 124, 128, 6 ]; - assert_eq(encrypted_note_log_of_finalized_partial_from_typescript, log); + + for i in 0..outgoing_body_ciphertext_from_typescript.len() { + assert_eq(ciphertext[i], outgoing_body_ciphertext_from_typescript[i]); + } + assert_eq(outgoing_body_ciphertext_from_typescript.len(), ciphertext.len()); } } diff --git a/noir-projects/aztec-nr/aztec/src/hash.nr b/noir-projects/aztec-nr/aztec/src/hash.nr index 490cc13bbfd..b96fec6e1a5 100644 --- a/noir-projects/aztec-nr/aztec/src/hash.nr +++ b/noir-projects/aztec-nr/aztec/src/hash.nr @@ -4,7 +4,7 @@ use dep::protocol_types::{ point::Point, traits::Hash, hash::{sha256_to_field, poseidon2_hash_with_separator, poseidon2_hash_with_separator_slice} }; -use crate::oracle::logs_traits::ToBytesForUnencryptedLog; +use crate::utils::to_bytes::{arr_to_be_bytes_arr, str_to_be_bytes_arr}; pub use dep::protocol_types::hash::{compute_siloed_nullifier, pedersen_hash}; @@ -16,25 +16,19 @@ pub fn compute_secret_hash(secret: Field) -> Field { poseidon2_hash_with_separator([secret], GENERATOR_INDEX__SECRET_HASH) } -pub fn compute_unencrypted_log_hash( - contract_address: AztecAddress, - log: T -) -> Field where T: ToBytesForUnencryptedLog { - let message_bytes: [u8; N] = log.to_be_bytes_arr(); - // can't use N - not in scope error - let n = message_bytes.len(); - let mut hash_bytes = [0; M]; +pub fn compute_unencrypted_log_hash(contract_address: AztecAddress, log: [u8; N]) -> Field { + let mut hash_bytes = [0; N + 36]; // Address is converted to 32 bytes in ts - let address_bytes = contract_address.to_be_bytes_arr(); + let address_bytes: [u8; 32] = contract_address.to_field().to_be_bytes(); for i in 0..32 { hash_bytes[i] = address_bytes[i]; } - let len_bytes: [u8; 4] = (n as Field).to_be_bytes(); + let len_bytes: [u8; 4] = (N as Field).to_be_bytes(); for i in 0..4 { hash_bytes[32 + i] = len_bytes[i]; } - for i in 0..n { - hash_bytes[36 + i] = message_bytes[i]; + for i in 0..N { + hash_bytes[36 + i] = log[i]; } sha256_to_field(hash_bytes) @@ -140,7 +134,8 @@ unconstrained fn compute_unenc_log_hash_array() { 0x25d0f689c4a4178a29d59306f2675824d19be6d25e44fa03b03f49c263053dd2, 0x2d513a722d6f352dc0961f156afdc5e31495b9f0e35cb069261a8e55e2df67fd ]; - let hash = compute_unencrypted_log_hash(contract_address, log); + let serialized_log = arr_to_be_bytes_arr(log); + let hash = compute_unencrypted_log_hash(contract_address, serialized_log); assert(hash == 0x0095b2d17ab72f4b27a341f7ac63e49ec73935ae8c9181a0ac02023eb12f3284); } @@ -148,7 +143,8 @@ unconstrained fn compute_unenc_log_hash_array() { unconstrained fn compute_unenc_log_hash_addr() { let contract_address = AztecAddress::from_field(0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6); let log = AztecAddress::from_field(0x26aa302d4715fd8a687453cb26d616b0768027bd54bcae56b09d908ecd9f8303); - let hash = compute_unencrypted_log_hash(contract_address, log); + let serialized_log: [u8; 32] = log.to_field().to_be_bytes(); + let hash = compute_unencrypted_log_hash(contract_address, serialized_log); assert(hash == 0x0083ab647dfb26e7ddee90a0f4209d049d4660cab42000c544b986aaa84c55a3); } @@ -156,7 +152,8 @@ unconstrained fn compute_unenc_log_hash_addr() { unconstrained fn compute_unenc_log_hash_str() { let contract_address = AztecAddress::from_field(0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8); let log = "dummy"; - let hash = compute_unencrypted_log_hash(contract_address, log); + let serialized_log = str_to_be_bytes_arr(log); + let hash = compute_unencrypted_log_hash(contract_address, serialized_log); assert(hash == 0x00629e88ebd6374f44aa6cfe07e251ecf07213ebc7267e8f6b578ae57ffd6c20); } @@ -164,6 +161,7 @@ unconstrained fn compute_unenc_log_hash_str() { unconstrained fn compute_unenc_log_hash_longer_str() { let contract_address = AztecAddress::from_field(0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8); let log = "Hello this is a string"; - let hash = compute_unencrypted_log_hash(contract_address, log); + let serialized_log = str_to_be_bytes_arr(log); + let hash = compute_unencrypted_log_hash(contract_address, serialized_log); assert(hash == 0x0098637962f7d34fa202b7ffad8a07a238c5d1fd897b82a108f7f467fa73b841); } diff --git a/noir-projects/aztec-nr/aztec/src/macros/dispatch/mod.nr b/noir-projects/aztec-nr/aztec/src/macros/dispatch/mod.nr new file mode 100644 index 00000000000..bbd9f972421 --- /dev/null +++ b/noir-projects/aztec-nr/aztec/src/macros/dispatch/mod.nr @@ -0,0 +1,193 @@ +use super::utils::compute_fn_selector; +use std::panic; + +/// Returns an `fn public_dispatch(...)` function for the given module that's assumed to be an Aztec contract. +pub comptime fn generate_public_dispatch(m: Module) -> Quoted { + let functions = m.functions(); + let functions = functions.filter(|function: FunctionDefinition| function.has_named_attribute("public")); + + let unit = get_type::<()>(); + + let ifs = functions.map( + |function: FunctionDefinition| { + let name = function.name(); + let parameters = function.parameters(); + let return_type = function.return_type(); + + let selector: Field = compute_fn_selector(function); + + let mut parameters_size = 0; + for param in parameters { + parameters_size += size_in_fields(param.1); + } + + let initial_read = if parameters.len() == 0 { + quote {} + } else { + // The initial calldata_copy offset is 1 to skip the Field selector + // The expected calldata is the serialization of + // - FunctionSelector: the selector of the function intended to dispatch + // - Parameters: the parameters of the function intended to dispatch + // That is, exactly what is expected for a call to the target function, + // but with a selector added at the beginning. + quote { + let input_calldata: [Field; $parameters_size] = dep::aztec::context::public_context::calldata_copy(1, $parameters_size); + let mut reader = dep::aztec::protocol_types::utils::reader::Reader::new(input_calldata); + } + }; + + let mut parameter_index = 0; + let reads = parameters.map(|param: (Quoted, Type)| { + let param_name = f"arg{parameter_index}".quoted_contents(); + let param_type = param.1; + let read = quote { + let $param_name: $param_type = reader.read_struct(dep::aztec::protocol_types::traits::Deserialize::deserialize); + }; + parameter_index += 1; + quote { $read } + }); + let read = reads.join(quote { }); + + let mut args = &[]; + for parameter_index in 0..parameters.len() { + let param_name = f"arg{parameter_index}".quoted_contents(); + args = args.push_back(quote { $param_name }); + } + + let args = args.join(quote { , }); + let call = quote { $name($args) }; + + let return_code = if return_type == unit { + quote { + $call; + // Force early return. + dep::aztec::context::public_context::avm_return([]); + } + } else { + quote { + let return_value = dep::aztec::protocol_types::traits::Serialize::serialize($call); + dep::aztec::context::public_context::avm_return(return_value); + } + }; + + let if_ = quote { + if selector == $selector { + $initial_read + $read + $return_code + } + }; + if_ + } + ); + + if ifs.len() == 0 { + // No dispatch function if there are no public functions + quote {} + } else { + let ifs = ifs.push_back(quote { panic(f"Unknown selector") }); + let dispatch = ifs.join(quote { }); + + let body = quote { + // We mark this as public because our whole system depends on public + // functions having this attribute. However, the public MACRO will + // handle the public_dispatch function specially and do nothing. + #[public] + unconstrained pub fn public_dispatch(selector: Field) { + $dispatch + } + }; + + body + } +} + +comptime fn size_in_fields(typ: Type) -> u32 { + let size = array_size_in_fields(typ); + let size = size.or_else(|| bool_size_in_fields(typ)); + let size = size.or_else(|| constant_size_in_fields(typ)); + let size = size.or_else(|| field_size_in_fields(typ)); + let size = size.or_else(|| int_size_in_fields(typ)); + let size = size.or_else(|| str_size_in_fields(typ)); + let size = size.or_else(|| struct_size_in_fields(typ)); + let size = size.or_else(|| tuple_size_in_fields(typ)); + if size.is_some() { + size.unwrap() + } else { + panic(f"Can't determine size in fields of {typ}") + } +} + +comptime fn array_size_in_fields(typ: Type) -> Option { + typ.as_array().and_then( + |typ: (Type, Type)| { + let (typ, element_size) = typ; + element_size.as_constant().map(|x: u32| { + x * size_in_fields(typ) + }) + } + ) +} + +comptime fn bool_size_in_fields(typ: Type) -> Option { + if typ.is_bool() { + Option::some(1) + } else { + Option::none() + } +} + +comptime fn field_size_in_fields(typ: Type) -> Option { + if typ.is_field() { + Option::some(1) + } else { + Option::none() + } +} + +comptime fn int_size_in_fields(typ: Type) -> Option { + if typ.as_integer().is_some() { + Option::some(1) + } else { + Option::none() + } +} + +comptime fn constant_size_in_fields(typ: Type) -> Option { + typ.as_constant() +} + +comptime fn str_size_in_fields(typ: Type) -> Option { + typ.as_str().map(|typ| size_in_fields(typ)) +} + +comptime fn struct_size_in_fields(typ: Type) -> Option { + typ.as_struct().map( + |typ: (StructDefinition, [Type])| { + let struct_type = typ.0; + let mut size = 0; + for field in struct_type.fields() { + size += size_in_fields(field.1); + } + size + } + ) +} + +comptime fn tuple_size_in_fields(typ: Type) -> Option { + typ.as_tuple().map( + |types: [Type]| { + let mut size = 0; + for typ in types { + size += size_in_fields(typ); + } + size + } + ) +} + +comptime fn get_type() -> Type { + let t: T = std::mem::zeroed(); + std::meta::type_of(t) +} + diff --git a/noir-projects/aztec-nr/aztec/src/macros/functions/mod.nr b/noir-projects/aztec-nr/aztec/src/macros/functions/mod.nr index 2b576827881..1fc42fbab76 100644 --- a/noir-projects/aztec-nr/aztec/src/macros/functions/mod.nr +++ b/noir-projects/aztec-nr/aztec/src/macros/functions/mod.nr @@ -225,6 +225,15 @@ pub comptime fn private(f: FunctionDefinition) -> Quoted { /// Public functions are executed sequencer-side and do not preserve privacy, similar to the EVM. pub comptime fn public(f: FunctionDefinition) -> Quoted { + // We don't want to transform the public_dispatch function. + if f.name() == quote { public_dispatch } { + quote {} + } else { + transform_public(f) + } +} + +comptime fn transform_public(f: FunctionDefinition) -> Quoted { let fn_abi = create_fn_abi_export(f); let fn_stub = stub_fn(f); register_stub(f.module(), fn_stub); diff --git a/noir-projects/aztec-nr/aztec/src/macros/mod.nr b/noir-projects/aztec-nr/aztec/src/macros/mod.nr index 23da22f2d1d..677d0af070b 100644 --- a/noir-projects/aztec-nr/aztec/src/macros/mod.nr +++ b/noir-projects/aztec-nr/aztec/src/macros/mod.nr @@ -1,3 +1,4 @@ +mod dispatch; mod functions; mod utils; mod notes; @@ -10,26 +11,28 @@ use notes::{NOTES, generate_note_export}; use functions::transform_unconstrained; use utils::module_has_storage; +use dispatch::generate_public_dispatch; /// Marks a contract as an Aztec contract, generating the interfaces for its functions and notes, as well as injecting /// the `compute_note_hash_and_optionally_a_nullifier` function PXE requires in order to validate notes. +/// +/// Note: This is a module annotation, so the returned quote gets injected inside the module (contract) itself. pub comptime fn aztec(m: Module) -> Quoted { let interface = generate_contract_interface(m); - let unconstrained_functions = m.functions().filter( | f: FunctionDefinition | f.is_unconstrained() & !f.has_named_attribute("test") & !f.has_named_attribute("public") ); for f in unconstrained_functions { transform_unconstrained(f); } - let compute_note_hash_and_optionally_a_nullifier = generate_compute_note_hash_and_optionally_a_nullifier(); let note_exports = generate_note_exports(); - + let public_dispatch = generate_public_dispatch(m); quote { $note_exports $interface $compute_note_hash_and_optionally_a_nullifier + $public_dispatch } } @@ -46,8 +49,8 @@ comptime fn generate_contract_interface(m: Module) -> Quoted { let storage_layout_getter = if has_storage_layout { let storage_layout_name = STORAGE_LAYOUT_NAME.get(m).unwrap(); quote { - pub fn storage_layout() -> StorageLayout { - $storage_layout_name + pub fn storage_layout() -> StorageLayoutFields { + $storage_layout_name.fields } } } else { @@ -105,14 +108,14 @@ comptime fn generate_compute_note_hash_and_optionally_a_nullifier() -> Quoted { let mut max_note_length: u32 = 0; let notes = NOTES.entries(); let body = if notes.len() > 0 { - max_note_length = notes.fold(0, | acc, (_, (_, len, _)): (Type, (StructDefinition, u32, Field)) | { + max_note_length = notes.fold(0, | acc, (_, (_, len, _, _)): (Type, (StructDefinition, u32, Field, [(Quoted, u32, bool)])) | { acc + len }); let mut if_statements_list = &[]; for i in 0..notes.len() { - let (typ, (_, _, _)) = notes[i]; + let (typ, (_, _, _, _)) = notes[i]; let if_or_else_if = if i == 0 { quote { if } } else { @@ -156,9 +159,11 @@ comptime fn generate_compute_note_hash_and_optionally_a_nullifier() -> Quoted { comptime fn generate_note_exports() -> Quoted { let notes = NOTES.values(); + // Second value in each tuple is `note_serialized_len` and that is ignored here because it's only used when + // generating the `compute_note_hash_and_optionally_a_nullifier` function. notes.map( - | (s, _, note_type_id): (StructDefinition, u32, Field) | { - generate_note_export(s, note_type_id) + | (s, _, note_type_id, fields): (StructDefinition, u32, Field, [(Quoted, u32, bool)]) | { + generate_note_export(s, note_type_id, fields) } ).join(quote {}) } diff --git a/noir-projects/aztec-nr/aztec/src/macros/notes/mod.nr b/noir-projects/aztec-nr/aztec/src/macros/notes/mod.nr index fd8777873a1..21a852b5604 100644 --- a/noir-projects/aztec-nr/aztec/src/macros/notes/mod.nr +++ b/noir-projects/aztec-nr/aztec/src/macros/notes/mod.nr @@ -7,7 +7,11 @@ use crate::note::{note_header::NoteHeader, note_getter_options::PropertySelector comptime global NOTE_HEADER_TYPE = type_of(NoteHeader::empty()); -comptime mut global NOTES: UHashMap> = UHashMap::default(); +// A map from note type to (note_struct_definition, serialized_note_length, note_type_id, fields). +// `fields` is an array of tuples where each tuple contains the name of the field/struct member (e.g. `amount` +// in `TokenNote`), the index of where the serialized member starts in the serialized note and a flag indicating +// whether the field is nullable or not. +comptime mut global NOTES: UHashMap> = UHashMap::default(); comptime fn compute_note_type_id(name: Quoted) -> Field { let name_as_str_quote = name.as_str_quote(); @@ -144,14 +148,37 @@ comptime fn generate_note_properties(s: StructDefinition) -> Quoted { } } -pub(crate) comptime fn generate_note_export(s: StructDefinition, note_type_id: Field) -> Quoted { +/// Generates note export for a given note struct. The export is a global variable that contains note type id, +/// note name and information about note fields (field name, index and whether the field is nullable or not). +pub(crate) comptime fn generate_note_export( + s: StructDefinition, + note_type_id: Field, + fields: [(Quoted, u32, bool)] +) -> Quoted { let name = s.name(); let global_export_name = f"{name}_EXPORTS".quoted_contents(); + let note_fields_name = f"{name}Fields".quoted_contents(); let note_name_as_str = name.as_str_quote(); let note_name_str_len = unquote!(quote { $note_name_as_str.as_bytes().len() }); + + let mut note_fields = &[]; + let mut note_field_constructors = &[]; + for field in fields { + let (name, index, nullable) = field; + note_fields = note_fields.push_back(quote { $name: aztec::note::note_field::NoteField }); + note_field_constructors = note_field_constructors.push_back(quote { $name: aztec::note::note_field::NoteField { index: $index, nullable: $nullable }}); + } + + let note_fields = note_fields.join(quote {,}); + let note_field_constructors = note_field_constructors.join(quote {,}); + quote { + struct $note_fields_name { + $note_fields + } + #[abi(notes)] - global $global_export_name: (Field, str<$note_name_str_len>) = ($note_type_id,$note_name_as_str); + global $global_export_name: (Field, str<$note_name_str_len>, $note_fields_name) = ($note_type_id,$note_name_as_str, $note_fields_name { $note_field_constructors }); } } @@ -286,10 +313,32 @@ comptime fn generate_partial_note_impl(s: StructDefinition, hiding_point_name: Q } } -comptime fn register_note(note: StructDefinition, note_serialized_len: u32, note_type_id: Field) { - NOTES.insert(note.as_type(), (note, note_serialized_len, note_type_id)); +comptime fn register_note( + note: StructDefinition, + note_serialized_len: u32, + note_type_id: Field, + fixed_fields: [(Quoted, Type, u32)], + nullable_fields: [(Quoted, Type, u32)] +) { + let mut fields = &[]; + for field in fixed_fields { + let (name, _, index) = field; + fields = fields.push_back((name, index, false)); + } + for field in nullable_fields { + let (name, _, index) = field; + fields = fields.push_back((name, index, true)); + } + + NOTES.insert( + note.as_type(), + (note, note_serialized_len, note_type_id, fields) + ); } +/// Separates note struct members into fixed and nullable ones. It also stores the index of where each struct member +/// starts in the serialized note. Note that each struct member can occupy multiple fields (as in Field type). +/// An example of a struct member occupying multiple fields is `amount` in `TokenNote` that uses `U128` type. comptime fn index_note_fields( s: StructDefinition, nullable_fields: [Quoted] @@ -307,6 +356,7 @@ comptime fn index_note_fields( } } let (flattened, _) = flatten_to_fields(name, typ, &[]); + // Each struct member can occupy multiple fields so we need to increment the counter accordingly counter+=flattened.len(); } (indexed_fixed_fields, indexed_nullable_fields) @@ -329,6 +379,8 @@ comptime fn common_note_annotation(s: StructDefinition) -> (Quoted, Field) { #[varargs] pub comptime fn partial_note(s: StructDefinition, nullable_fields: [Quoted]) -> Quoted { + // We separate struct members into fixed ones and nullable ones and we store info about the start index of each + // member in the serialized note array. let (indexed_fixed_fields, indexed_nullable_fields) = index_note_fields(s, nullable_fields); let (common, note_type_id) = common_note_annotation(s); @@ -341,7 +393,13 @@ pub comptime fn partial_note(s: StructDefinition, nullable_fields: [Quoted]) -> indexed_nullable_fields ); let partial_note_impl = generate_partial_note_impl(s, hiding_point_name); - register_note(s, note_serialized_len, note_type_id); + register_note( + s, + note_serialized_len, + note_type_id, + indexed_fixed_fields, + indexed_nullable_fields + ); quote { $common @@ -362,7 +420,13 @@ pub comptime fn note(s: StructDefinition) -> Quoted { indexed_fixed_fields, indexed_nullable_fields ); - register_note(s, note_serialized_len, note_type_id); + register_note( + s, + note_serialized_len, + note_type_id, + indexed_fixed_fields, + indexed_nullable_fields + ); quote { $common @@ -379,7 +443,14 @@ pub comptime fn note_custom_interface(s: StructDefinition) -> Quoted { let note_serialized_len = note_interface_impl.expect(f"Note {name} must implement NoteInterface trait").trait_generic_args()[0].as_constant().unwrap(); - register_note(s, note_serialized_len, note_type_id); + let (indexed_fixed_fields, indexed_nullable_fields) = index_note_fields(s, &[]); + register_note( + s, + note_serialized_len, + note_type_id, + indexed_fixed_fields, + indexed_nullable_fields + ); quote { $common diff --git a/noir-projects/aztec-nr/aztec/src/macros/storage/mod.nr b/noir-projects/aztec-nr/aztec/src/macros/storage/mod.nr index 7b72fe8329e..391f6cc874b 100644 --- a/noir-projects/aztec-nr/aztec/src/macros/storage/mod.nr +++ b/noir-projects/aztec-nr/aztec/src/macros/storage/mod.nr @@ -1,4 +1,4 @@ -use std::{collections::umap::UHashMap, hash::{BuildHasherDefault, poseidon2::Poseidon2Hasher}}; +use std::{collections::umap::UHashMap, hash::{BuildHasherDefault, poseidon2::Poseidon2Hasher}, meta::unquote}; use super::utils::get_serialized_size; use super::utils::is_note; @@ -30,6 +30,9 @@ pub comptime fn storage(s: StructDefinition) -> Quoted { let (name, typ) = field; let (storage_field_constructor, serialized_size) = generate_storage_field_constructor(typ, quote { $slot }, false); storage_vars_constructors = storage_vars_constructors.push_back(quote { $name: $storage_field_constructor }); + // We have `Storable` in a separate `.nr` file instead of defining it in the last quote of this function + // because that way a dev gets a more reasonable error if he defines a struct with the same name in + // a contract. storage_layout_fields = storage_layout_fields.push_back(quote { $name: dep::aztec::prelude::Storable }); storage_layout_constructors = storage_layout_constructors.push_back(quote { $name: dep::aztec::prelude::Storable { slot: $slot } }); //let with_context_generic = add_context_generic(typ, context_generic); @@ -57,18 +60,25 @@ pub comptime fn storage(s: StructDefinition) -> Quoted { let module = s.module(); let module_name = module.name(); let storage_layout_name = f"STORAGE_LAYOUT_{module_name}".quoted_contents(); + let module_name_str = module_name.as_str_quote(); STORAGE_LAYOUT_NAME.insert(module, storage_layout_name); quote { $storage_impl - struct StorageLayout { + struct StorageLayoutFields { $storage_layout_fields } + struct StorageLayout { + contract_name: str, + fields: StorageLayoutFields + } + #[abi(storage)] global $storage_layout_name = StorageLayout { - $storage_layout_constructors + contract_name: $module_name_str, + fields: StorageLayoutFields { $storage_layout_constructors } }; } } diff --git a/noir-projects/aztec-nr/aztec/src/messaging.nr b/noir-projects/aztec-nr/aztec/src/messaging.nr index f0555bbf449..e54c44c45c0 100644 --- a/noir-projects/aztec-nr/aztec/src/messaging.nr +++ b/noir-projects/aztec-nr/aztec/src/messaging.nr @@ -3,8 +3,7 @@ use crate::{ oracle::get_l1_to_l2_membership_witness::get_l1_to_l2_membership_witness }; -use dep::protocol_types::merkle_tree::root::root_from_sibling_path; -use dep::protocol_types::{constants::L1_TO_L2_MSG_TREE_HEIGHT, address::{AztecAddress, EthAddress}, utils::arr_copy_slice}; +use dep::protocol_types::{address::{AztecAddress, EthAddress}, merkle_tree::root::root_from_sibling_path}; pub fn process_l1_to_l2_message( l1_to_l2_root: Field, @@ -25,12 +24,12 @@ pub fn process_l1_to_l2_message( secret_hash ); - let returned_message = get_l1_to_l2_membership_witness(storage_contract_address, message_hash, secret); - let leaf_index = returned_message[0]; - let sibling_path = arr_copy_slice(returned_message, [0; L1_TO_L2_MSG_TREE_HEIGHT], 1); + // We prove that `message_hash` is in the tree by showing the derivation of the tree root, using a merkle path we + // get from an oracle. + let (leaf_index, sibling_path) = unsafe { + get_l1_to_l2_membership_witness(storage_contract_address, message_hash, secret) + }; - // Check that the message is in the tree - // This is implicitly checking that the values of the message are correct let root = root_from_sibling_path(message_hash, leaf_index, sibling_path); assert(root == l1_to_l2_root, "Message not in state"); diff --git a/noir-projects/aztec-nr/aztec/src/note/lifecycle.nr b/noir-projects/aztec-nr/aztec/src/note/lifecycle.nr index 58321fff061..8d07d8c40ba 100644 --- a/noir-projects/aztec-nr/aztec/src/note/lifecycle.nr +++ b/noir-projects/aztec-nr/aztec/src/note/lifecycle.nr @@ -19,15 +19,12 @@ pub fn create_note( let note_hash = note.compute_note_hash(); let serialized_note = Note::serialize_content(*note); - assert( - notify_created_note( + notify_created_note( storage_slot, Note::get_note_type_id(), serialized_note, note_hash, note_hash_counter - ) - == 0 ); context.push_note_hash(note_hash); @@ -81,8 +78,7 @@ pub fn destroy_note_unsafe( }; let nullifier_counter = context.side_effect_counter; - assert(notify_nullified_note(nullifier, notification_note_hash, nullifier_counter) == 0); + notify_nullified_note(nullifier, notification_note_hash, nullifier_counter); context.push_nullifier_for_note_hash(nullifier, notification_note_hash) } - diff --git a/noir-projects/aztec-nr/aztec/src/note/mod.nr b/noir-projects/aztec-nr/aztec/src/note/mod.nr index 670b340735e..c076bf8ed1b 100644 --- a/noir-projects/aztec-nr/aztec/src/note/mod.nr +++ b/noir-projects/aztec-nr/aztec/src/note/mod.nr @@ -7,3 +7,4 @@ mod note_interface; mod note_viewer_options; mod utils; mod note_emission; +mod note_field; diff --git a/noir-projects/aztec-nr/aztec/src/note/note_field.nr b/noir-projects/aztec-nr/aztec/src/note/note_field.nr new file mode 100644 index 00000000000..35e7fbc282a --- /dev/null +++ b/noir-projects/aztec-nr/aztec/src/note/note_field.nr @@ -0,0 +1,5 @@ +// Used by macros when generating note export. +pub struct NoteField { + index: u32, + nullable: bool +} diff --git a/noir-projects/aztec-nr/aztec/src/note/utils.nr b/noir-projects/aztec-nr/aztec/src/note/utils.nr index 7b2f671f6ed..47f58177c04 100644 --- a/noir-projects/aztec-nr/aztec/src/note/utils.nr +++ b/noir-projects/aztec-nr/aztec/src/note/utils.nr @@ -105,7 +105,7 @@ pub fn compute_note_hash_for_nullify(note: Note) -> Field wher compute_note_hash_for_nullify_internal(note, note_hash_for_read_request) } -pub fn compute_note_hash_and_optionally_a_nullifier( +unconstrained pub fn compute_note_hash_and_optionally_a_nullifier( deserialize_content: fn([Field; N]) -> T, note_header: NoteHeader, compute_nullifier: bool, diff --git a/noir-projects/aztec-nr/aztec/src/oracle/arguments.nr b/noir-projects/aztec-nr/aztec/src/oracle/arguments.nr index 50316d50893..a6ea2b95de2 100644 --- a/noir-projects/aztec-nr/aztec/src/oracle/arguments.nr +++ b/noir-projects/aztec-nr/aztec/src/oracle/arguments.nr @@ -1,24 +1,34 @@ -#[oracle(packArgumentsArray)] -unconstrained fn pack_arguments_array_oracle(_args: [Field; N]) -> Field {} +/// Notifies the simulator that `args` will later be used at some point during execution, referenced by their hash. This +/// allows the simulator to know how to respond to this future request. +/// +/// This is only used during private execution, since in public it is the VM itself that keeps track of arguments. +pub fn pack_arguments(args: [Field]) { + // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call. When + // unpacking however the caller must check that the returned value is indeed the preimage. + unsafe { + pack_arguments_oracle_wrapper(args) + }; +} -#[oracle(packArguments)] -unconstrained fn pack_arguments_oracle(_args: [Field]) -> Field {} +/// Same as `pack_arguments`, but using arrays instead of slices. +pub fn pack_arguments_array(args: [Field; N]) { + // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call. When + // unpacking however the caller must check that the returned value is indeed the preimage. + unsafe { + pack_arguments_array_oracle_wrapper(args) + }; +} -/// - Pack arguments (array version) will notify the simulator that these arguments will be used later at -/// some point in the call. -/// - When the external call is made later, the simulator will know what the values unpack to. -/// - This oracle will not be required in public vm functions, as the vm will keep track of arguments -/// itself. -unconstrained pub fn pack_arguments_array(args: [Field; N]) -> Field { - pack_arguments_array_oracle(args) +unconstrained fn pack_arguments_oracle_wrapper(args: [Field]) { + let _ = pack_arguments_oracle(args); } -/// - Pack arguments (slice version) will notify the simulator that these arguments will be used later at -/// some point in the call. -/// - When the external call is made later, the simulator will know what the values unpack to. -/// - This oracle will not be required in public vm functions, as the vm will keep track of arguments -/// itself. -unconstrained pub fn pack_arguments(args: [Field]) -> Field { - pack_arguments_oracle(args) +unconstrained fn pack_arguments_array_oracle_wrapper(args: [Field; N]) { + let _ = pack_arguments_array_oracle(args); } +#[oracle(packArguments)] +unconstrained fn pack_arguments_oracle(_args: [Field]) -> Field {} + +#[oracle(packArgumentsArray)] +unconstrained fn pack_arguments_array_oracle(_args: [Field; N]) -> Field {} diff --git a/noir-projects/aztec-nr/aztec/src/oracle/encryption.nr b/noir-projects/aztec-nr/aztec/src/oracle/encryption.nr deleted file mode 100644 index cc9969fa7c7..00000000000 --- a/noir-projects/aztec-nr/aztec/src/oracle/encryption.nr +++ /dev/null @@ -1,12 +0,0 @@ -#[oracle(aes128Encrypt)] -unconstrained pub fn aes128_encrypt_oracle( - input: [u8; N], - iv: [u8; 16], - key: [u8; 16] -) -> [u8; M] {} - -// AES 128 CBC with PKCS7 is padding to multiples of 16 bytes so M has to be a multiple of 16! -// (e.g. from 65 bytes long input you get 80 bytes long output and M has to be set to `80`) -unconstrained pub fn aes128_encrypt(input: [u8; N], iv: [u8; 16], key: [u8; 16]) -> [u8; M] { - aes128_encrypt_oracle(input, iv, key) -} diff --git a/noir-projects/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr b/noir-projects/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr index 484c4e59030..fabfb4d8e2b 100644 --- a/noir-projects/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr +++ b/noir-projects/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr @@ -56,9 +56,15 @@ unconstrained pub fn set_public_teardown_function_call_internal( ); } -#[oracle(notifySetMinRevertibleSideEffectCounter)] -unconstrained fn notify_set_min_revertible_side_effect_counter_oracle(_counter: u32) {} +pub fn notify_set_min_revertible_side_effect_counter(counter: u32) { + unsafe { + notify_set_min_revertible_side_effect_counter_oracle_wrapper(counter) + }; +} -unconstrained pub fn notify_set_min_revertible_side_effect_counter(counter: u32) { +unconstrained pub fn notify_set_min_revertible_side_effect_counter_oracle_wrapper(counter: u32) { notify_set_min_revertible_side_effect_counter_oracle(counter); } + +#[oracle(notifySetMinRevertibleSideEffectCounter)] +unconstrained fn notify_set_min_revertible_side_effect_counter_oracle(_counter: u32) {} diff --git a/noir-projects/aztec-nr/aztec/src/oracle/get_l1_to_l2_membership_witness.nr b/noir-projects/aztec-nr/aztec/src/oracle/get_l1_to_l2_membership_witness.nr index 0a93fa3f8f2..b1adf7818c7 100644 --- a/noir-projects/aztec-nr/aztec/src/oracle/get_l1_to_l2_membership_witness.nr +++ b/noir-projects/aztec-nr/aztec/src/oracle/get_l1_to_l2_membership_witness.nr @@ -1,6 +1,18 @@ -use dep::protocol_types::address::AztecAddress; +use dep::protocol_types::{address::AztecAddress, constants::L1_TO_L2_MSG_TREE_HEIGHT, utils::arr_copy_slice}; -global L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH: u32 = 17; +/// Returns the leaf index and sibling path of an entry in the L1 to L2 messaging tree, which can then be used to prove +/// its existence. +unconstrained pub fn get_l1_to_l2_membership_witness( + contract_address: AztecAddress, + message_hash: Field, + secret: Field +) -> (Field, [Field; L1_TO_L2_MSG_TREE_HEIGHT]) { + let returned_message = get_l1_to_l2_membership_witness_oracle(contract_address, message_hash, secret); + let leaf_index = returned_message[0]; + let sibling_path = arr_copy_slice(returned_message, [0; L1_TO_L2_MSG_TREE_HEIGHT], 1); + + (leaf_index, sibling_path) +} // Obtains membership witness (index and sibling path) for a message in the L1 to L2 message tree. #[oracle(getL1ToL2MembershipWitness)] @@ -8,12 +20,4 @@ unconstrained fn get_l1_to_l2_membership_witness_oracle( _contract_address: AztecAddress, _message_hash: Field, _secret: Field -) -> [Field; L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH] {} - -unconstrained pub fn get_l1_to_l2_membership_witness( - contract_address: AztecAddress, - message_hash: Field, - secret: Field -) -> [Field; L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH] { - get_l1_to_l2_membership_witness_oracle(contract_address, message_hash, secret) -} +) -> [Field; L1_TO_L2_MSG_TREE_HEIGHT + 1] {} diff --git a/noir-projects/aztec-nr/aztec/src/oracle/logs.nr b/noir-projects/aztec-nr/aztec/src/oracle/logs.nr index e1384ffc17a..f0a4e457e95 100644 --- a/noir-projects/aztec-nr/aztec/src/oracle/logs.nr +++ b/noir-projects/aztec-nr/aztec/src/oracle/logs.nr @@ -1,117 +1,92 @@ -use dep::protocol_types::{address::AztecAddress, point::Point}; +use dep::protocol_types::address::AztecAddress; -// = 480 + 32 * N bytes -#[oracle(emitEncryptedNoteLog)] -unconstrained fn emit_encrypted_note_log_oracle(_note_hash_counter: u32, _encrypted_note: [u8; M], _counter: u32) {} +// This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call. -unconstrained pub fn emit_encrypted_note_log( +pub fn emit_encrypted_note_log( note_hash_counter: u32, encrypted_note: [u8; M], counter: u32 ) { - emit_encrypted_note_log_oracle(note_hash_counter, encrypted_note, counter) + // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call. + unsafe { + emit_encrypted_note_log_oracle_wrapper(note_hash_counter, encrypted_note, counter) + } } -#[oracle(emitEncryptedEventLog)] -unconstrained fn emit_encrypted_event_log_oracle(_contract_address: AztecAddress, _randomness: Field, _encrypted_event: [u8; M], _counter: u32) {} - -unconstrained pub fn emit_encrypted_event_log( +pub fn emit_encrypted_event_log( contract_address: AztecAddress, randomness: Field, encrypted_event: [u8; M], counter: u32 ) { - emit_encrypted_event_log_oracle(contract_address, randomness, encrypted_event, counter) + // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call. + unsafe { + emit_encrypted_event_log_oracle_wrapper(contract_address, randomness, encrypted_event, counter) + } } -// = 480 + 32 * N bytes -#[oracle(computeEncryptedNoteLog)] -unconstrained fn compute_encrypted_note_log_oracle( - _contract_address: AztecAddress, - _storage_slot: Field, - _note_type_id: Field, - _ovsk_app: Field, - _ovpk_m: Point, - _ivpk_m: Point, - _recipient: AztecAddress, - _preimage: [Field; N] -) -> [u8; M] {} - -unconstrained pub fn compute_encrypted_note_log( +pub fn emit_unencrypted_log_private_internal( contract_address: AztecAddress, - storage_slot: Field, - note_type_id: Field, - ovsk_app: Field, - ovpk_m: Point, - ivpk_m: Point, - recipient: AztecAddress, - preimage: [Field; N] -) -> [u8; M] { - compute_encrypted_note_log_oracle( - contract_address, - storage_slot, - note_type_id, - ovsk_app, - ovpk_m, - ivpk_m, - recipient, - preimage - ) + message: T, + counter: u32 +) { + // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call. + unsafe { + emit_unencrypted_log_private_internal_oracle_wrapper(contract_address, message, counter) + } } -// = 480 + 32 * N bytes -#[oracle(computeEncryptedEventLog)] -unconstrained fn compute_encrypted_event_log_oracle( - _contract_address: AztecAddress, - _randomness: Field, - _event_type_id: Field, - _ovsk_app: Field, - _ovpk_m: Point, - _ivpk_m: Point, - _recipient: AztecAddress, - _preimage: [Field; N] -) -> [u8; M] {} +unconstrained fn emit_encrypted_note_log_oracle_wrapper(note_hash_counter: u32, encrypted_note: [u8; M], counter: u32) { + emit_encrypted_note_log_oracle(note_hash_counter, encrypted_note, counter) +} -unconstrained pub fn compute_encrypted_event_log( +unconstrained fn emit_encrypted_event_log_oracle_wrapper( contract_address: AztecAddress, randomness: Field, - event_type_id: Field, - ovsk_app: Field, - ovpk_m: Point, - ivpk_m: Point, - recipient: AztecAddress, - preimage: [Field; N] -) -> [u8; M] { - compute_encrypted_event_log_oracle( - contract_address, - randomness, - event_type_id, - ovsk_app, - ovpk_m, - ivpk_m, - recipient, - preimage - ) + encrypted_event: [u8; M], + counter: u32 +) { + emit_encrypted_event_log_oracle(contract_address, randomness, encrypted_event, counter) } -#[oracle(emitUnencryptedLog)] -unconstrained fn emit_unencrypted_log_oracle_private(_contract_address: AztecAddress, _message: T, _counter: u32) -> Field {} +unconstrained fn emit_unencrypted_log_private_internal_oracle_wrapper(contract_address: AztecAddress, message: T, counter: u32) { + let _ = emit_unencrypted_log_oracle_private(contract_address, message, counter); +} -unconstrained pub fn emit_unencrypted_log_private_internal( +unconstrained pub fn emit_contract_class_unencrypted_log_private_internal( contract_address: AztecAddress, - message: T, + message: [Field; N], counter: u32 ) -> Field { - emit_unencrypted_log_oracle_private(contract_address, message, counter) + emit_contract_class_unencrypted_log_private(contract_address, message, counter) } +// = 480 + 32 * N bytes +#[oracle(emitEncryptedNoteLog)] +unconstrained fn emit_encrypted_note_log_oracle( + _note_hash_counter: u32, + _encrypted_note: [u8; M], + _counter: u32 +) {} + +#[oracle(emitEncryptedEventLog)] +unconstrained fn emit_encrypted_event_log_oracle( + _contract_address: AztecAddress, + _randomness: Field, + _encrypted_event: [u8; M], + _counter: u32 +) {} + +#[oracle(emitUnencryptedLog)] +unconstrained fn emit_unencrypted_log_oracle_private( + _contract_address: AztecAddress, + _message: T, + _counter: u32 +) -> Field {} + #[oracle(emitContractClassUnencryptedLog)] unconstrained fn emit_contract_class_unencrypted_log_private( contract_address: AztecAddress, message: [Field; N], counter: u32 ) -> Field {} - -unconstrained pub fn emit_contract_class_unencrypted_log_private_internal(contract_address: AztecAddress, message: [Field; N], counter: u32) -> Field { - emit_contract_class_unencrypted_log_private(contract_address, message, counter) -} diff --git a/noir-projects/aztec-nr/aztec/src/oracle/logs_traits.nr b/noir-projects/aztec-nr/aztec/src/oracle/logs_traits.nr deleted file mode 100644 index c8de6c54971..00000000000 --- a/noir-projects/aztec-nr/aztec/src/oracle/logs_traits.nr +++ /dev/null @@ -1,431 +0,0 @@ -use dep::protocol_types::address::AztecAddress; - -// TODO(#8548): We have arithmetics over generics now so this file can be nuked. -// TODO: this is awful but since we can't have a fn that maps [Field; N] -> [u8; 416 + N * 32] -// (where N is the note pre-image size and 416 + N * 32 is the encryption output size) -// The fns for LensForEncryptedLog are never used, it's just to tell the compiler what the lens are - -// The to_bytes fn for ToBytesForUnencryptedLog is used to allow us to hash some generic T - -// I could have omitted N from the trait, but wanted to keep it strictly for field arrs -// TODO(1139): Once we enc inside the circuit, we will no longer need the oracle to return -// anything, so we can remove this trait -pub trait LensForEncryptedLog { - // N = note preimage input in fields - // M = encryption output len in bytes (= 417 + N * 32) - fn output_fields(self: [Field; N]) -> [Field; N]; - fn output_bytes(self: [Field; N]) -> [u8; M]; -} - -impl LensForEncryptedLog<1, 449> for [Field; 1] { - fn output_fields(self) -> [Field; 1] { - [self[0]; 1] - } - fn output_bytes(self) -> [u8; 449] { - [self[0] as u8; 449] - } -} -impl LensForEncryptedLog<2, 481> for [Field; 2] { - fn output_fields(self) -> [Field; 2] { - [self[0]; 2] - } - fn output_bytes(self) -> [u8; 481] { - [self[0] as u8; 481] - } -} -impl LensForEncryptedLog<3, 513> for [Field; 3] { - fn output_fields(self) -> [Field; 3] { - [self[0]; 3] - } - fn output_bytes(self) -> [u8; 513] { - [self[0] as u8; 513] - } -} -impl LensForEncryptedLog<4, 545> for [Field; 4] { - fn output_fields(self) -> [Field; 4] { - [self[0]; 4] - } - fn output_bytes(self) -> [u8; 545] { - [self[0] as u8; 545] - } -} -impl LensForEncryptedLog<5, 577> for [Field; 5] { - fn output_fields(self) -> [Field; 5] { - [self[0]; 5] - } - fn output_bytes(self) -> [u8; 577] { - [self[0] as u8; 577] - } -} -impl LensForEncryptedLog<6, 609> for [Field; 6] { - fn output_fields(self) -> [Field; 6] { - [self[0]; 6] - } - fn output_bytes(self) -> [u8; 609] { - [self[0] as u8; 609] - } -} -impl LensForEncryptedLog<7, 641> for [Field; 7] { - fn output_fields(self) -> [Field; 7] { - [self[0]; 7] - } - fn output_bytes(self) -> [u8; 641] { - [self[0] as u8; 641] - } -} -impl LensForEncryptedLog<8, 673> for [Field; 8] { - fn output_fields(self) -> [Field; 8] { - [self[0]; 8] - } - fn output_bytes(self) -> [u8; 673] { - [self[0] as u8; 673] - } -} -impl LensForEncryptedLog<9, 705> for [Field; 9] { - fn output_fields(self) -> [Field; 9] { - [self[0]; 9] - } - fn output_bytes(self) -> [u8; 705] { - [self[0] as u8; 705] - } -} -impl LensForEncryptedLog<10, 737> for [Field; 10] { - fn output_fields(self) -> [Field; 10] { - [self[0]; 10] - } - fn output_bytes(self) -> [u8; 737] { - [self[0] as u8; 737] - } -} -impl LensForEncryptedLog<11, 769> for [Field; 11] { - fn output_fields(self) -> [Field; 11] { - [self[0]; 11] - } - fn output_bytes(self) -> [u8; 769] { - [self[0] as u8; 769] - } -} -impl LensForEncryptedLog<12, 801> for [Field; 12] { - fn output_fields(self) -> [Field; 12] { - [self[0]; 12] - } - fn output_bytes(self) -> [u8; 801] { - [self[0] as u8; 801] - } -} - -pub trait LensForEncryptedEvent { - // N = event preimage input in bytes - // M = encryption output len in bytes (= 416 + M) - fn output(self: [u8; N]) -> [u8; M]; -} - -impl LensForEncryptedEvent<96, 448> for [u8; 96] { - fn output(self) -> [u8; 448] { - [self[0] as u8; 448] - } -} -impl LensForEncryptedEvent<128, 480> for [u8; 128] { - fn output(self) -> [u8; 480] { - [self[0] as u8; 480] - } -} -impl LensForEncryptedEvent<160, 512> for [u8; 160] { - fn output(self) -> [u8; 512] { - [self[0] as u8; 512] - } -} -impl LensForEncryptedEvent<192, 544> for [u8; 192] { - fn output(self) -> [u8; 544] { - [self[0] as u8; 544] - } -} -impl LensForEncryptedEvent<224, 576> for [u8; 224] { - fn output(self) -> [u8; 576] { - [self[0] as u8; 576] - } -} -impl LensForEncryptedEvent<256, 608> for [u8; 256] { - fn output(self) -> [u8; 608] { - [self[0] as u8; 608] - } -} - -// This trait defines the length of the inputs in bytes to -// the unencrypted log hash fn, where the log can be any type T -// as long as the ACVM can convert to fields. -pub trait ToBytesForUnencryptedLog { - // N = preimage input in bytes (32 * num fields or chars) - // M = full log input in bytes ( = N + 40 = N + 32 for addr, + 4 for selector, + 4 for len) - fn to_be_bytes_arr(self) -> [u8; N]; - fn output_bytes(self) -> [u8; M]; -} - -impl ToBytesForUnencryptedLog<32, 68> for Field { - fn to_be_bytes_arr(self) -> [u8; 32] { - self.to_be_bytes() - } - fn output_bytes(self) -> [u8; 68] { - [self as u8; 68] - } -} - -impl ToBytesForUnencryptedLog<32, 68> for AztecAddress { - fn to_be_bytes_arr(self) -> [u8; 32] { - self.to_field().to_be_bytes() - } - fn output_bytes(self) -> [u8; 68] { - [self.to_field() as u8; 68] - } -} - -fn arr_to_be_bytes_arr(fields: [Field; L]) -> [u8; N] { - let mut bytes: [u8] = &[]; - for i in 0..L { - // Note that bytes.append() results in bound error - let to_add: [u8; 32] = fields[i].to_be_bytes(); - for j in 0..32 { - bytes = bytes.push_back(to_add[j]); - } - } - bytes.as_array() -} - -// each character of a string is converted into a byte -// then an ACVM field via the oracle => we recreate here -fn str_to_be_bytes_arr(string: str) -> [u8; N] { - let chars_bytes = string.as_bytes(); - let mut bytes: [u8] = &[]; - for i in 0..L { - let to_add: [u8; 32] = (chars_bytes[i] as Field).to_be_bytes(); - for j in 0..32 { - bytes = bytes.push_back(to_add[j]); - } - } - bytes.as_array() -} - -impl ToBytesForUnencryptedLog<32, 68> for [Field; 1] { - fn to_be_bytes_arr(self) -> [u8; 32] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 68] { - [self[0] as u8; 68] - } -} - -impl ToBytesForUnencryptedLog<64, 100> for [Field; 2] { - fn to_be_bytes_arr(self) -> [u8; 64] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 100] { - [self[0] as u8; 100] - } -} - -impl ToBytesForUnencryptedLog<96, 132> for [Field; 3] { - fn to_be_bytes_arr(self) -> [u8; 96] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 132] { - [self[0] as u8; 132] - } -} - -impl ToBytesForUnencryptedLog<128, 164> for [Field; 4] { - fn to_be_bytes_arr(self) -> [u8; 128] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 164] { - [self[0] as u8; 164] - } -} - -impl ToBytesForUnencryptedLog<160, 196> for [Field; 5] { - fn to_be_bytes_arr(self) -> [u8; 160] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 196] { - [self[0] as u8; 196] - } -} - -impl ToBytesForUnencryptedLog<192, 228> for [Field; 6] { - fn to_be_bytes_arr(self) -> [u8; 192] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 228] { - [self[0] as u8; 228] - } -} - -impl ToBytesForUnencryptedLog<224, 260> for [Field; 7] { - fn to_be_bytes_arr(self) -> [u8; 224] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 260] { - [self[0] as u8; 260] - } -} - -impl ToBytesForUnencryptedLog<256, 292> for [Field; 8] { - fn to_be_bytes_arr(self) -> [u8; 256] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 292] { - [self[0] as u8; 292] - } -} - -impl ToBytesForUnencryptedLog<288, 324> for [Field; 9] { - fn to_be_bytes_arr(self) -> [u8; 288] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 324] { - [self[0] as u8; 324] - } -} - -impl ToBytesForUnencryptedLog<320, 356> for [Field; 10] { - fn to_be_bytes_arr(self) -> [u8; 320] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 356] { - [self[0] as u8; 356] - } -} - -impl ToBytesForUnencryptedLog<352, 388> for [Field; 11] { - fn to_be_bytes_arr(self) -> [u8; 352] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 388] { - [self[0] as u8; 388] - } -} - -impl ToBytesForUnencryptedLog<384, 420> for [Field; 12] { - fn to_be_bytes_arr(self) -> [u8; 384] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 420] { - [self[0] as u8; 420] - } -} - -impl ToBytesForUnencryptedLog<416, 452> for [Field; 13] { - fn to_be_bytes_arr(self) -> [u8; 416] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 452] { - [self[0] as u8; 452] - } -} - -impl ToBytesForUnencryptedLog<448, 484> for [Field; 14] { - fn to_be_bytes_arr(self) -> [u8; 448] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 484] { - [self[0] as u8; 484] - } -} - -impl ToBytesForUnencryptedLog<480, 516> for [Field; 15] { - fn to_be_bytes_arr(self) -> [u8; 480] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 516] { - [self[0] as u8; 516] - } -} - -impl ToBytesForUnencryptedLog<512, 548> for [Field; 16] { - fn to_be_bytes_arr(self) -> [u8; 512] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 548] { - [self[0] as u8; 548] - } -} - -impl ToBytesForUnencryptedLog<544, 580> for [Field; 17] { - fn to_be_bytes_arr(self) -> [u8; 544] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 580] { - [self[0] as u8; 580] - } -} - -impl ToBytesForUnencryptedLog<576, 612> for [Field; 18] { - fn to_be_bytes_arr(self) -> [u8; 576] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 612] { - [self[0] as u8; 612] - } -} - -impl ToBytesForUnencryptedLog<608, 644> for [Field; 19] { - fn to_be_bytes_arr(self) -> [u8; 608] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 644] { - [self[0] as u8; 644] - } -} - -impl ToBytesForUnencryptedLog<640, 676> for [Field; 20] { - fn to_be_bytes_arr(self) -> [u8; 640] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 676] { - [self[0] as u8; 676] - } -} - -impl ToBytesForUnencryptedLog<672, 708> for [Field; 21] { - fn to_be_bytes_arr(self) -> [u8; 672] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 708] { - [self[0] as u8; 708] - } -} - -impl ToBytesForUnencryptedLog<704, 740> for [Field; 22] { - fn to_be_bytes_arr(self) -> [u8; 704] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 740] { - [self[0] as u8; 740] - } -} - -impl ToBytesForUnencryptedLog<736, 772> for [Field; 23] { - fn to_be_bytes_arr(self) -> [u8; 736] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 772] { - [self[0] as u8; 772] - } -} - -impl ToBytesForUnencryptedLog<768, 804> for [Field; 24] { - fn to_be_bytes_arr(self) -> [u8; 768] { - arr_to_be_bytes_arr(self) - } - fn output_bytes(self) -> [u8; 804] { - [self[0] as u8; 804] - } -} - -impl ToBytesForUnencryptedLog for str where [Field; L]: ToBytesForUnencryptedLog { - fn to_be_bytes_arr(self) -> [u8; N] { - str_to_be_bytes_arr(self) - } - fn output_bytes(_self: Self) -> [u8; M] { - [0; M] - } -} diff --git a/noir-projects/aztec-nr/aztec/src/oracle/mod.nr b/noir-projects/aztec-nr/aztec/src/oracle/mod.nr index a6e2ee0fdfd..a50f7558299 100644 --- a/noir-projects/aztec-nr/aztec/src/oracle/mod.nr +++ b/noir-projects/aztec-nr/aztec/src/oracle/mod.nr @@ -4,7 +4,6 @@ mod arguments; mod call_private_function; -mod encryption; mod execution; mod get_contract_instance; mod get_l1_to_l2_membership_witness; @@ -14,13 +13,12 @@ mod get_membership_witness; mod keys; mod key_validation_request; mod get_sibling_path; -mod unsafe_rand; +mod random; mod enqueue_public_function_call; mod header; mod notes; mod storage; mod logs; -mod logs_traits; mod returns; // debug_log oracle is used by both noir-protocol-circuits and this crate and for this reason we just re-export it diff --git a/noir-projects/aztec-nr/aztec/src/oracle/notes.nr b/noir-projects/aztec-nr/aztec/src/oracle/notes.nr index b3f95b57a4a..f1f08a15f17 100644 --- a/noir-projects/aztec-nr/aztec/src/oracle/notes.nr +++ b/noir-projects/aztec-nr/aztec/src/oracle/notes.nr @@ -2,6 +2,41 @@ use crate::note::{note_header::NoteHeader, note_interface::NoteInterface}; use dep::protocol_types::{address::AztecAddress, utils::arr_copy_slice}; +/// Notifies the simulator that a note has been created, so that it can be returned in future read requests in the same +/// transaction. This note should only be added to the non-volatile database if found in an actual block. +pub fn notify_created_note( + storage_slot: Field, + note_type_id: Field, + serialized_note: [Field; N], + note_hash: Field, + counter: u32 +) { + // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call. + unsafe { + notify_created_note_oracle_wrapper(storage_slot, note_type_id, serialized_note, note_hash, counter) + }; +} + +/// Notifies the simulator that a note has been nullified, so that it is no longer returned in future read requests in +/// the same transaction. This note should only be removed to the non-volatile database if its nullifier is found in an +/// actual block. +pub fn notify_nullified_note(nullifier: Field, note_hash: Field, counter: u32) { + // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call. + unsafe { + notify_nullified_note_oracle_wrapper(nullifier, note_hash, counter) + }; +} + +unconstrained fn notify_created_note_oracle_wrapper( + storage_slot: Field, + note_type_id: Field, + serialized_note: [Field; N], + note_hash: Field, + counter: u32 +) { + let _ = notify_created_note_oracle(storage_slot, note_type_id, serialized_note, note_hash, counter); +} + #[oracle(notifyCreatedNote)] unconstrained fn notify_created_note_oracle( _storage_slot: Field, @@ -11,23 +46,17 @@ unconstrained fn notify_created_note_oracle( _counter: u32 ) -> Field {} -unconstrained pub fn notify_created_note( - storage_slot: Field, - note_type_id: Field, - serialized_note: [Field; N], +unconstrained fn notify_nullified_note_oracle_wrapper( + nullifier: Field, note_hash: Field, counter: u32 -) -> Field { - notify_created_note_oracle(storage_slot, note_type_id, serialized_note, note_hash, counter) +) { + let _ = notify_nullified_note_oracle(nullifier, note_hash, counter); } #[oracle(notifyNullifiedNote)] unconstrained fn notify_nullified_note_oracle(_nullifier: Field, _note_hash: Field, _counter: u32) -> Field {} -unconstrained pub fn notify_nullified_note(nullifier: Field, note_hash: Field, counter: u32) -> Field { - notify_nullified_note_oracle(nullifier, note_hash, counter) -} - #[oracle(getNotes)] unconstrained fn get_notes_oracle( _storage_slot: Field, @@ -142,11 +171,13 @@ unconstrained pub fn get_notes Field {} - -// Only ever use this in private! +/// Returns true if the nullifier exists. Note that a `true` value can be constrained by proving existence of the +/// nullifier, but a `false` value should not be relied upon since other transactions may emit this nullifier before the +/// current transaction is included in a block. While this might seem of little use at first, certain design patterns +/// benefit from this abstraction (see e.g. `PrivateMutable`). unconstrained pub fn check_nullifier_exists(inner_nullifier: Field) -> bool { check_nullifier_exists_oracle(inner_nullifier) == 1 } + +#[oracle(checkNullifierExists)] +unconstrained fn check_nullifier_exists_oracle(_inner_nullifier: Field) -> Field {} diff --git a/noir-projects/aztec-nr/aztec/src/oracle/random.nr b/noir-projects/aztec-nr/aztec/src/oracle/random.nr new file mode 100644 index 00000000000..a3b901d714d --- /dev/null +++ b/noir-projects/aztec-nr/aztec/src/oracle/random.nr @@ -0,0 +1,10 @@ +/// Returns an unconstrained random value. Note that it is not possible to constrain this value to prove that it is +/// truly random: we assume that the oracle is cooperating and returning random values. +/// In some applications this behavior might not be acceptable and other techniques might be more suitable, such as +/// producing pseudo-random values by hashing values outside of user control (like block hashes) or secrets. +unconstrained pub fn random() -> Field { + rand_oracle() +} + +#[oracle(getRandomField)] +unconstrained fn rand_oracle() -> Field {} diff --git a/noir-projects/aztec-nr/aztec/src/oracle/returns.nr b/noir-projects/aztec-nr/aztec/src/oracle/returns.nr index b7372f40a0d..4b1dec74105 100644 --- a/noir-projects/aztec-nr/aztec/src/oracle/returns.nr +++ b/noir-projects/aztec-nr/aztec/src/oracle/returns.nr @@ -1,13 +1,25 @@ -#[oracle(packReturns)] -unconstrained fn pack_returns_oracle(_returns: [Field]) -> Field {} - -unconstrained pub fn pack_returns(returns: [Field]) { - let _unused = pack_returns_oracle(returns); +/// Notifies the simulator that `returns` will be later fetched once the function return is processed, referenced by +/// their hash. This allows the simulator to know how to respond to this future request. +/// +/// This is only used during private execution, since in public it is the VM itself that keeps track of return values. +pub fn pack_returns(returns: [Field]) { + // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call. When + // unpacking however the caller must check that the returned value is indeed the preimage. + unsafe { + pack_returns_oracle_wrapper(returns) + }; } -#[oracle(unpackReturns)] -unconstrained fn unpack_returns_oracle(_return_hash: Field) -> [Field; N] {} +unconstrained pub fn pack_returns_oracle_wrapper(returns: [Field]) { + let _ = pack_returns_oracle(returns); +} unconstrained pub fn unpack_returns(return_hash: Field) -> [Field; N] { unpack_returns_oracle(return_hash) } + +#[oracle(packReturns)] +unconstrained fn pack_returns_oracle(_returns: [Field]) -> Field {} + +#[oracle(unpackReturns)] +unconstrained fn unpack_returns_oracle(_return_hash: Field) -> [Field; N] {} diff --git a/noir-projects/aztec-nr/aztec/src/oracle/unsafe_rand.nr b/noir-projects/aztec-nr/aztec/src/oracle/unsafe_rand.nr deleted file mode 100644 index 2cc3bb0f768..00000000000 --- a/noir-projects/aztec-nr/aztec/src/oracle/unsafe_rand.nr +++ /dev/null @@ -1,8 +0,0 @@ -#[oracle(getRandomField)] -unconstrained fn rand_oracle() -> Field {} - -// Called `unsafe_rand` because we do not constrain in circuit that we are dealing with an actual random value. -// Instead we just trust our PXE. -unconstrained pub fn unsafe_rand() -> Field { - rand_oracle() -} diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable.nr b/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable.nr index 453f46b5515..66412d6b1d4 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/private_mutable.nr @@ -68,11 +68,7 @@ impl PrivateMutable where Note: Not // docs:end:replace pub fn initialize_or_replace(self, note: &mut Note) -> NoteEmission { - let is_initialized = unsafe { - check_nullifier_exists(self.compute_initialization_nullifier()) - }; - - // check_nullifier_exists() is an unconstrained function - we can constrain a true value by providing an + // `check_nullifier_exists` is an unconstrained function - we can constrain a true value by providing an // inclusion proof of the nullifier, but cannot constrain a false value since a non-inclusion proof would only // be valid if done in public. // Ultimately, this is not an issue ginen that we'll either: @@ -82,6 +78,10 @@ impl PrivateMutable where Note: Not // an inclusion proof for the current note // This means that an honest oracle will assist the prover to produce a valid proof, while a malicious oracle // (i.e. one that returns an incorrect value for is_initialized) will simply fail to produce a proof. + let is_initialized = unsafe { + check_nullifier_exists(self.compute_initialization_nullifier()) + }; + if (!is_initialized) { self.initialize(note) } else { diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable.nr b/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable.nr index 618b06a675c..afcfc4795ac 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable.nr @@ -1,7 +1,5 @@ mod shared_mutable; mod scheduled_delay_change; mod scheduled_value_change; -mod shared_mutable_private_getter; pub use shared_mutable::SharedMutable; -pub use shared_mutable_private_getter::SharedMutablePrivateGetter; diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/shared_mutable.nr b/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/shared_mutable.nr index 2b72072aa97..2d6bef36da2 100644 --- a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/shared_mutable.nr +++ b/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/shared_mutable.nr @@ -1,6 +1,6 @@ use dep::protocol_types::{ - hash::{pedersen_hash, poseidon2_hash}, header::Header, address::AztecAddress, - traits::{FromField, ToField} + hash::{poseidon2_hash, poseidon2_hash_with_separator}, address::AztecAddress, + traits::{FromField, ToField}, utils::arrays::array_concat }; use crate::context::{PrivateContext, PublicContext, UnconstrainedContext}; @@ -32,19 +32,6 @@ global HASH_SEPARATOR: u32 = 2; // can actually use it here impl Storage for SharedMutable {} -// TODO: extract into a utils module once we can do arithmetic on generics, i.e. https://github.com/noir-lang/noir/issues/4784 -fn concat_arrays(arr_n: [Field; N], arr_m: [Field; M]) -> [Field; O] { - assert_eq(N + M, O); - let mut out: [Field; O] = [0; O]; - for i in 0..N { - out[i] = arr_n[i]; - } - for i in 0..M { - out[N+i] = arr_m[i]; - } - out -} - // SharedMutable stores a value of type T that is: // - publicly known (i.e. unencrypted) // - mutable in public @@ -71,55 +58,15 @@ impl SharedMutable Field { - pedersen_hash([self.storage_slot], VALUE_CHANGE_SEPARATOR) + poseidon2_hash_with_separator([self.storage_slot], VALUE_CHANGE_SEPARATOR) } fn get_delay_change_storage_slot(self) -> Field { - pedersen_hash([self.storage_slot], DELAY_CHANGE_SEPARATOR) + poseidon2_hash_with_separator([self.storage_slot], DELAY_CHANGE_SEPARATOR) } fn get_hash_storage_slot(self) -> Field { - pedersen_hash([self.storage_slot], HASH_SEPARATOR) - } - - // It may seem odd that we take a header and address instead of reading from e.g. a PrivateContext, but this lets us - // reuse this function in SharedMutablePrivateGetter. - fn historical_read_from_public_storage( - self, - header: Header, - address: AztecAddress - ) -> (ScheduledValueChange, ScheduledDelayChange, u32) { - let historical_block_number = header.global_variables.block_number as u32; - - // We could simply produce historical inclusion proofs for both the ScheduledValueChange and - // ScheduledDelayChange, but that'd require one full sibling path per storage slot (since due to kernel siloing - // the storage is not contiguous), and in the best case in which T is a single field that'd be 4 slots. - // Instead, we get an oracle to provide us the correct values for both the value and delay changes, and instead - // prove inclusion of their hash, which is both a much smaller proof (a single slot), and also independent of - // the size of T. - let (value_change_hint, delay_change_hint) = unsafe { - get_public_storage_hints(address, self.storage_slot, historical_block_number) - }; - - // Ideally the following would be simply public_storage::read_historical, but we can't implement that yet. - let hash = header.public_storage_historical_read(self.get_hash_storage_slot(), address); - - if hash != 0 { - assert_eq( - hash, SharedMutable::hash_scheduled_data(value_change_hint, delay_change_hint), "Hint values do not match hash" - ); - } else { - // The hash slot can only hold a zero if it is uninitialized, meaning no value or delay change was ever - // scheduled. Therefore, the hints must then correspond to uninitialized scheduled changes. - assert_eq( - value_change_hint, ScheduledValueChange::deserialize(zeroed()), "Non-zero value change for zero hash" - ); - assert_eq( - delay_change_hint, ScheduledDelayChange::deserialize(zeroed()), "Non-zero delay change for zero hash" - ); - }; - - (value_change_hint, delay_change_hint, historical_block_number) + poseidon2_hash_with_separator([self.storage_slot], HASH_SEPARATOR) } } @@ -203,7 +150,7 @@ impl SharedMutable SharedMutable (ScheduledValueChange, ScheduledDelayChange, u32) { + let header = self.context.get_header(); + let address = self.context.this_address(); + + let historical_block_number = header.global_variables.block_number as u32; + + // We could simply produce historical inclusion proofs for both the ScheduledValueChange and + // ScheduledDelayChange, but that'd require one full sibling path per storage slot (since due to kernel siloing + // the storage is not contiguous), and in the best case in which T is a single field that'd be 4 slots. + // Instead, we get an oracle to provide us the correct values for both the value and delay changes, and instead + // prove inclusion of their hash, which is both a much smaller proof (a single slot), and also independent of + // the size of T. + let (value_change_hint, delay_change_hint) = unsafe { + get_public_storage_hints(address, self.storage_slot, historical_block_number) + }; + + // Ideally the following would be simply public_storage::read_historical, but we can't implement that yet. + let hash = header.public_storage_historical_read(self.get_hash_storage_slot(), address); + + if hash != 0 { + assert_eq( + hash, SharedMutable::hash_scheduled_data(value_change_hint, delay_change_hint), "Hint values do not match hash" + ); + } else { + // The hash slot can only hold a zero if it is uninitialized, meaning no value or delay change was ever + // scheduled. Therefore, the hints must then correspond to uninitialized scheduled changes. + assert_eq( + value_change_hint, ScheduledValueChange::deserialize(zeroed()), "Non-zero value change for zero hash" + ); + assert_eq( + delay_change_hint, ScheduledDelayChange::deserialize(zeroed()), "Non-zero delay change for zero hash" + ); + }; + + (value_change_hint, delay_change_hint, historical_block_number) + } + fn hash_scheduled_data( value_change: ScheduledValueChange, delay_change: ScheduledDelayChange ) -> Field { - // TODO(#5491 and https://github.com/noir-lang/noir/issues/4784): update this so that we don't need to rely on - // ScheduledValueChange serializing to 3 and ScheduledDelayChange serializing to 1 - let concatenated: [Field; 4] = concat_arrays(value_change.serialize(), delay_change.serialize()); + let concatenated: [Field; 4] = array_concat(value_change.serialize(), delay_change.serialize()); poseidon2_hash(concatenated) } } diff --git a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/shared_mutable_private_getter.nr b/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/shared_mutable_private_getter.nr deleted file mode 100644 index a5078d9cb95..00000000000 --- a/noir-projects/aztec-nr/aztec/src/state_vars/shared_mutable/shared_mutable_private_getter.nr +++ /dev/null @@ -1,44 +0,0 @@ -use dep::protocol_types::{traits::{FromField, ToField}, address::AztecAddress, header::Header}; - -use crate::{context::PrivateContext, state_vars::shared_mutable::shared_mutable::SharedMutable}; - -pub struct SharedMutablePrivateGetter { - context: &mut PrivateContext, - // The contract address of the contract we want to read from - other_contract_address: AztecAddress, - // The storage slot where the SharedMutable is stored on the other contract - storage_slot: Field, -} - -// We have this as a view-only interface to reading Shared Mutables in other contracts. -// Currently the Shared Mutable does not support this. We can adapt SharedMutable at a later date -impl SharedMutablePrivateGetter where T: FromField + ToField + Eq { - pub fn new( - context: &mut PrivateContext, - other_contract_address: AztecAddress, - storage_slot: Field - ) -> Self { - assert(storage_slot != 0, "Storage slot 0 not allowed. Storage slots must start from 1."); - assert(other_contract_address.to_field() != 0, "Other contract address cannot be 0"); - Self { context, other_contract_address, storage_slot } - } - - pub fn get_value_in_private(self, header: Header) -> T { - // We create a dummy SharedMutable state variable so that we can reuse its historical_read_from_public_storage - // method, greatly reducing code duplication. - let dummy: SharedMutable = SharedMutable::new((), self.storage_slot); - let (value_change, delay_change, historical_block_number) = dummy.historical_read_from_public_storage(header, self.other_contract_address); - - let effective_minimum_delay = delay_change.get_effective_minimum_delay_at(historical_block_number); - let block_horizon = value_change.get_block_horizon(historical_block_number, effective_minimum_delay); - - // If our context has the same header as the one we pass in via the parameter, we are trying to read the "current" value - // and thus need to set the tx max block number below. If the context header is not the same as the one we pass in, this means - // we are trying to read a historical value and thus have no constraint on the max block number that this transaction can be included in. - if (self.context.historical_header.global_variables.block_number.eq(header.global_variables.block_number)) { - self.context.set_tx_max_block_number(block_horizon); - } - - value_change.get_current_at(historical_block_number) - } -} diff --git a/noir-projects/aztec-nr/aztec/src/test/helpers/test_environment.nr b/noir-projects/aztec-nr/aztec/src/test/helpers/test_environment.nr index d176db97cb2..72533505bf0 100644 --- a/noir-projects/aztec-nr/aztec/src/test/helpers/test_environment.nr +++ b/noir-projects/aztec-nr/aztec/src/test/helpers/test_environment.nr @@ -202,15 +202,12 @@ impl TestEnvironment { note.set_header(header); let note_hash = note.compute_note_hash(); let serialized_note = Note::serialize_content(*note); - assert( - notify_created_note( + notify_created_note( storage_slot, Note::get_note_type_id(), serialized_note, note_hash, note_hash_counter - ) - == 0 ); cheatcodes::set_contract_address(original_contract_address); } diff --git a/noir-projects/aztec-nr/aztec/src/test/mocks/mock_note.nr b/noir-projects/aztec-nr/aztec/src/test/mocks/mock_note.nr index 13f1723d481..eb1456b49be 100644 --- a/noir-projects/aztec-nr/aztec/src/test/mocks/mock_note.nr +++ b/noir-projects/aztec-nr/aztec/src/test/mocks/mock_note.nr @@ -1,9 +1,9 @@ use crate::{ - context::PrivateContext, generators::Ga1 as G_val, hash::poseidon2_hash_with_separator, + context::PrivateContext, generators::Ga1 as G_val, note::{note_header::NoteHeader, note_interface::NoteInterface, utils::compute_note_hash_for_nullify} }; -use dep::protocol_types::{address::AztecAddress, constants::GENERATOR_INDEX__NOTE_NULLIFIER, traits::Eq}; +use dep::protocol_types::{address::AztecAddress, constants::GENERATOR_INDEX__NOTE_NULLIFIER, hash::poseidon2_hash_with_separator}; use dep::std::{embedded_curve_ops::multi_scalar_mul, hash::from_field_unsafe}; use crate::note::note_interface::NullifiableNote; diff --git a/noir-projects/aztec-nr/aztec/src/utils/mod.nr b/noir-projects/aztec-nr/aztec/src/utils/mod.nr index 77d3a6531d2..2da0e5b639e 100644 --- a/noir-projects/aztec-nr/aztec/src/utils/mod.nr +++ b/noir-projects/aztec-nr/aztec/src/utils/mod.nr @@ -2,5 +2,6 @@ mod collapse_array; mod comparison; mod point; mod test; +mod to_bytes; pub use crate::utils::collapse_array::collapse_array; diff --git a/noir-projects/aztec-nr/aztec/src/utils/point.nr b/noir-projects/aztec-nr/aztec/src/utils/point.nr index 65967ce1a57..40b555c5655 100644 --- a/noir-projects/aztec-nr/aztec/src/utils/point.nr +++ b/noir-projects/aztec-nr/aztec/src/utils/point.nr @@ -48,7 +48,10 @@ mod test { 154, 244, 31, 93, 233, 100, 70, 220, 55, 118, 161, 235, 45, 152, 187, 149, 107, 122, 205, 153, 121, 166, 120, 84, 190, 198, 250, 124, 41, 115, 189, 115 ]; - assert_eq(expected_compressed_point_positive_sign, compressed_point); + assert_eq(expected_compressed_point_positive_sign.len(), compressed_point.len()); + for i in 0..expected_compressed_point_positive_sign.len() { + assert_eq(compressed_point[i], expected_compressed_point_positive_sign[i]); + } } #[test] @@ -65,6 +68,9 @@ mod test { 36, 115, 113, 101, 46, 85, 221, 116, 201, 175, 141, 190, 159, 180, 73, 49, 186, 41, 169, 34, 153, 148, 56, 75, 215, 7, 119, 150, 193, 78, 226, 181 ]; - assert_eq(expected_compressed_point_negative_sign, compressed_point); + assert_eq(expected_compressed_point_negative_sign.len(), compressed_point.len()); + for i in 0..expected_compressed_point_negative_sign.len() { + assert_eq(compressed_point[i], expected_compressed_point_negative_sign[i]); + } } } diff --git a/noir-projects/aztec-nr/aztec/src/utils/to_bytes.nr b/noir-projects/aztec-nr/aztec/src/utils/to_bytes.nr new file mode 100644 index 00000000000..8b439c8d388 --- /dev/null +++ b/noir-projects/aztec-nr/aztec/src/utils/to_bytes.nr @@ -0,0 +1,25 @@ +pub fn arr_to_be_bytes_arr(fields: [Field; L]) -> [u8; L * 32] { + let mut bytes = [0 as u8; L * 32]; + for i in 0..L { + // Note that bytes.append() results in bound error + let to_add: [u8; 32] = fields[i].to_be_bytes(); + for j in 0..32 { + bytes[i * 32 + j] = to_add[j]; + } + } + bytes +} + +// each character of a string is converted into a byte +// then an ACVM field via the oracle => we recreate here +pub fn str_to_be_bytes_arr(string: str) -> [u8; L * 32] { + let chars_bytes: [u8; L] = string.as_bytes(); + let mut bytes = [0 as u8; L * 32]; + for i in 0..L { + let to_add: [u8; 32] = (chars_bytes[i] as Field).to_be_bytes(); + for j in 0..32 { + bytes[i * 32 + j] = to_add[j]; + } + } + bytes +} diff --git a/noir-projects/aztec-nr/easy-private-state/src/easy_private_uint.nr b/noir-projects/aztec-nr/easy-private-state/src/easy_private_uint.nr index 8863b8e9699..2bf133a7f25 100644 --- a/noir-projects/aztec-nr/easy-private-state/src/easy_private_uint.nr +++ b/noir-projects/aztec-nr/easy-private-state/src/easy_private_uint.nr @@ -1,8 +1,7 @@ use dep::aztec::{ context::PrivateContext, protocol_types::{address::AztecAddress}, note::note_getter_options::NoteGetterOptions, state_vars::PrivateSet, - encrypted_logs::encrypted_note_emission::encode_and_encrypt_note_with_keys, - keys::getters::get_public_keys + encrypted_logs::encrypted_note_emission::encode_and_encrypt_note, keys::getters::get_public_keys }; use dep::value_note::{filter::filter_notes_min_sum, value_note::ValueNote}; @@ -32,7 +31,7 @@ impl EasyPrivateUint<&mut PrivateContext> { // Insert the new note to the owner's set of notes. // docs:start:insert self.set.insert(&mut addend_note).emit( - encode_and_encrypt_note_with_keys( + encode_and_encrypt_note( self.context, outgoing_viewer_keys.ovpk_m, owner_keys.ivpk_m, @@ -67,7 +66,7 @@ impl EasyPrivateUint<&mut PrivateContext> { let result_value = minuend - subtrahend; let mut result_note = ValueNote::new(result_value as Field, owner_keys.npk_m.hash()); self.set.insert(&mut result_note).emit( - encode_and_encrypt_note_with_keys( + encode_and_encrypt_note( self.context, outgoing_viewer_keys.ovpk_m, owner_keys.ivpk_m, diff --git a/noir-projects/aztec-nr/value-note/src/utils.nr b/noir-projects/aztec-nr/value-note/src/utils.nr index d6a65d16af8..3efc118588b 100644 --- a/noir-projects/aztec-nr/value-note/src/utils.nr +++ b/noir-projects/aztec-nr/value-note/src/utils.nr @@ -1,6 +1,6 @@ use dep::aztec::prelude::{AztecAddress, PrivateContext, PrivateSet, NoteGetterOptions}; use dep::aztec::note::note_getter_options::SortOrder; -use dep::aztec::encrypted_logs::encrypted_note_emission::encode_and_encrypt_note_with_keys; +use dep::aztec::encrypted_logs::encrypted_note_emission::encode_and_encrypt_note; use dep::aztec::keys::getters::get_public_keys; use crate::{filter::filter_notes_min_sum, value_note::{ValueNote, VALUE_NOTE_LEN}}; @@ -25,7 +25,7 @@ pub fn increment( let mut note = ValueNote::new(amount, recipient_keys.npk_m.hash()); // Insert the new note to the owner's set of notes and emit the log if value is non-zero. balance.insert(&mut note).emit( - encode_and_encrypt_note_with_keys( + encode_and_encrypt_note( balance.context, outgoing_viewer_ovpk_m, recipient_keys.ivpk_m, diff --git a/noir-projects/aztec-nr/value-note/src/value_note.nr b/noir-projects/aztec-nr/value-note/src/value_note.nr index cc581512017..c749cf4f399 100644 --- a/noir-projects/aztec-nr/value-note/src/value_note.nr +++ b/noir-projects/aztec-nr/value-note/src/value_note.nr @@ -2,7 +2,7 @@ use dep::aztec::{ protocol_types::{traits::Serialize, constants::GENERATOR_INDEX__NOTE_NULLIFIER, hash::poseidon2_hash_with_separator}, macros::notes::note, note::{note_header::NoteHeader, note_interface::NullifiableNote, utils::compute_note_hash_for_nullify}, - oracle::unsafe_rand::unsafe_rand, keys::getters::get_nsk_app, context::PrivateContext + oracle::random::random, keys::getters::get_nsk_app, context::PrivateContext }; global VALUE_NOTE_LEN: u32 = 3; // 3 plus a header. @@ -51,7 +51,13 @@ impl NullifiableNote for ValueNote { impl ValueNote { pub fn new(value: Field, npk_m_hash: Field) -> Self { - let randomness = unsafe_rand(); + // We use the randomness to preserve the privacy of the note recipient by preventing brute-forcing, so a + // malicious sender could use non-random values to make the note less private. But they already know the full + // note pre-image anyway, and so the recipient already trusts them to not disclose this information. We can + // therefore assume that the sender will cooperate in the random value generation. + let randomness = unsafe { + random() + }; let header = NoteHeader::empty(); ValueNote { value, npk_m_hash, randomness, header } } diff --git a/noir-projects/mock-protocol-circuits/crates/mock-public-kernel/src/main.nr b/noir-projects/mock-protocol-circuits/crates/mock-public-kernel/src/main.nr index b66b27da567..5f99389e499 100644 --- a/noir-projects/mock-protocol-circuits/crates/mock-public-kernel/src/main.nr +++ b/noir-projects/mock-protocol-circuits/crates/mock-public-kernel/src/main.nr @@ -1,9 +1,13 @@ -use dep::types::constants::{AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS, AVM_PROOF_LENGTH_IN_FIELDS, PROOF_TYPE_AVM}; +use dep::types::constants::{ + AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS, AVM_PROOF_LENGTH_IN_FIELDS, AVM_PUBLIC_INPUTS_FLATTENED_SIZE, + PROOF_TYPE_AVM +}; fn main( verification_key: [Field; AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS], - proof: [Field; AVM_PROOF_LENGTH_IN_FIELDS] + proof: [Field; AVM_PROOF_LENGTH_IN_FIELDS], + pub_cols_flattened: [Field; AVM_PUBLIC_INPUTS_FLATTENED_SIZE] ) -> pub u8 { - std::verify_proof_with_type(verification_key, proof, [], 0, PROOF_TYPE_AVM); + std::verify_proof_with_type(verification_key, proof, pub_cols_flattened, 0, PROOF_TYPE_AVM); 1 // Dummy value to return for the mock kernel as void function creates some pain. } diff --git a/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr b/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr index dc5db7ace32..dfd2f5480ab 100644 --- a/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/app_subscription_contract/src/main.nr @@ -10,7 +10,7 @@ contract AppSubscription { use aztec::{ prelude::{AztecAddress, Map, PrivateMutable, SharedImmutable}, keys::getters::get_public_keys, protocol_types::constants::MAX_FIELD_VALUE, utils::comparison::Comparator, - encrypted_logs::encrypted_note_emission::{encode_and_encrypt_note, encode_and_encrypt_note_with_keys}, + encrypted_logs::encrypted_note_emission::encode_and_encrypt_note, macros::{storage::storage, functions::{public, initializer, private}} }; use authwit::auth::assert_current_call_valid_authwit; @@ -46,7 +46,8 @@ contract AppSubscription { // We are emitting both the outgoing and the incoming logs to the subscriber here because passing a separate // outgoing_viewer arg to entrypoint function is impractical and the outgoing are not so valuable here. - storage.subscriptions.at(user_address).replace(&mut note).emit(encode_and_encrypt_note(&mut context, user_address, user_address)); + let keys = get_public_keys(user_address); + storage.subscriptions.at(user_address).replace(&mut note).emit(encode_and_encrypt_note(&mut context, keys.ovpk_m, keys.ivpk_m, user_address)); context.set_as_fee_payer(); @@ -102,7 +103,7 @@ contract AppSubscription { let mut subscription_note = SubscriptionNote::new(subscriber_keys.npk_m.hash(), expiry_block_number, tx_count); storage.subscriptions.at(subscriber).initialize_or_replace(&mut subscription_note).emit( - encode_and_encrypt_note_with_keys( + encode_and_encrypt_note( &mut context, msg_sender_ovpk_m, subscriber_keys.ivpk_m, diff --git a/noir-projects/noir-contracts/contracts/app_subscription_contract/src/subscription_note.nr b/noir-projects/noir-contracts/contracts/app_subscription_contract/src/subscription_note.nr index 29a55da9218..58a0101880d 100644 --- a/noir-projects/noir-contracts/contracts/app_subscription_contract/src/subscription_note.nr +++ b/noir-projects/noir-contracts/contracts/app_subscription_contract/src/subscription_note.nr @@ -1,6 +1,6 @@ use dep::aztec::{ hash::poseidon2_hash_with_separator, note::utils::compute_note_hash_for_nullify, - keys::getters::get_nsk_app, oracle::unsafe_rand::unsafe_rand, + keys::getters::get_nsk_app, oracle::random::random, prelude::{PrivateContext, NoteHeader, NullifiableNote}, protocol_types::constants::GENERATOR_INDEX__NOTE_NULLIFIER, macros::notes::note }; @@ -42,8 +42,12 @@ impl NullifiableNote for SubscriptionNote { impl SubscriptionNote { pub fn new(npk_m_hash: Field, expiry_block_number: Field, remaining_txs: Field) -> Self { + // We use the randomness to preserve the privacy of the note recipient by preventing brute-forcing, so a + // malicious sender could use non-random values to make the note less private. But they already know the full + // note pre-image anyway, and so the recipient already trusts them to not disclose this information. We can + // therefore assume that the sender will cooperate in the random value generation. let randomness = unsafe { - unsafe_rand() + random() }; Self { npk_m_hash, expiry_block_number, remaining_txs, randomness, header: NoteHeader::empty() } } diff --git a/noir-projects/noir-contracts/contracts/card_game_contract/src/cards.nr b/noir-projects/noir-contracts/contracts/card_game_contract/src/cards.nr index 4d575eae01e..93fecf7c288 100644 --- a/noir-projects/noir-contracts/contracts/card_game_contract/src/cards.nr +++ b/noir-projects/noir-contracts/contracts/card_game_contract/src/cards.nr @@ -3,8 +3,8 @@ use dep::aztec::prelude::{AztecAddress, PrivateContext, NoteGetterOptions, NoteV use dep::aztec::{ context::UnconstrainedContext, protocol_types::{traits::{ToField, Serialize, FromField}, constants::MAX_NOTE_HASH_READ_REQUESTS_PER_CALL}, - encrypted_logs::encrypted_note_emission::encode_and_encrypt_note_with_keys, - keys::getters::get_public_keys, state_vars::PrivateSet, note::constants::MAX_NOTES_PER_PAGE + encrypted_logs::encrypted_note_emission::encode_and_encrypt_note, keys::getters::get_public_keys, + state_vars::PrivateSet, note::constants::MAX_NOTES_PER_PAGE }; use dep::value_note::value_note::ValueNote; @@ -112,9 +112,7 @@ impl Deck<&mut PrivateContext> { let mut inserted_cards = &[]; for card in cards { let mut card_note = CardNote::from_card(card, owner_npk_m_hash); - self.set.insert(&mut card_note.note).emit( - encode_and_encrypt_note_with_keys(self.set.context, msg_sender_ovpk_m, owner_ivpk_m, owner) - ); + self.set.insert(&mut card_note.note).emit(encode_and_encrypt_note(self.set.context, msg_sender_ovpk_m, owner_ivpk_m, owner)); inserted_cards = inserted_cards.push_back(card_note); } diff --git a/noir-projects/noir-contracts/contracts/child_contract/src/main.nr b/noir-projects/noir-contracts/contracts/child_contract/src/main.nr index a6fb7ffbf11..04a90c9a08d 100644 --- a/noir-projects/noir-contracts/contracts/child_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/child_contract/src/main.nr @@ -7,7 +7,7 @@ contract Child { use dep::aztec::{ note::{note_getter_options::NoteGetterOptions}, - encrypted_logs::encrypted_note_emission::encode_and_encrypt_note_with_keys, + encrypted_logs::encrypted_note_emission::encode_and_encrypt_note, keys::getters::get_public_keys, utils::comparison::Comparator, macros::{storage::storage, functions::{private, public, internal}} }; @@ -58,7 +58,7 @@ contract Child { let owner_keys = get_public_keys(owner); let mut note = ValueNote::new(new_value, owner_keys.npk_m.hash()); - storage.a_map_with_private_values.at(owner).insert(&mut note).emit(encode_and_encrypt_note_with_keys(&mut context, owner_keys.ovpk_m, owner_keys.ivpk_m, owner)); + storage.a_map_with_private_values.at(owner).insert(&mut note).emit(encode_and_encrypt_note(&mut context, owner_keys.ovpk_m, owner_keys.ivpk_m, owner)); new_value } diff --git a/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr b/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr index b14d4188713..c6855fd9d68 100644 --- a/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr @@ -9,7 +9,7 @@ contract ContractInstanceDeployer { }; use dep::aztec::{ hash::compute_unencrypted_log_hash, oracle::logs::emit_unencrypted_log_private_internal, - macros::{events::event, functions::private} + macros::{events::event, functions::private}, utils::to_bytes::arr_to_be_bytes_arr }; use std::meta::derive; @@ -68,13 +68,13 @@ contract ContractInstanceDeployer { let counter = context.next_counter(); // @todo This is very inefficient, we are doing a lot of back and forth conversions. - let log_slice = payload.to_be_bytes_arr(); - let log_hash = compute_unencrypted_log_hash(contract_address, payload); + let serialized_log = arr_to_be_bytes_arr(payload); + let log_hash = compute_unencrypted_log_hash(contract_address, serialized_log); // 40 = addr (32) + raw log len (4) + processed log len (4) - let len = 40 + log_slice.len().to_field(); + let len = 40 + serialized_log.len().to_field(); let side_effect = LogHash { value: log_hash, counter, length: len }; context.unencrypted_logs_hashes.push(side_effect); - let _void = emit_unencrypted_log_private_internal(contract_address, payload, counter); + emit_unencrypted_log_private_internal(contract_address, payload, counter); } } diff --git a/noir-projects/noir-contracts/contracts/counter_contract/src/main.nr b/noir-projects/noir-contracts/contracts/counter_contract/src/main.nr index dbf98f6719b..42bc8c396f8 100644 --- a/noir-projects/noir-contracts/contracts/counter_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/counter_contract/src/main.nr @@ -44,7 +44,7 @@ contract Counter { // docs:end:get_counter // docs:start:test_imports - use dep::aztec::test::helpers::test_environment::TestEnvironment; + use dep::aztec::test::{helpers::{cheatcodes, test_environment::TestEnvironment}}; use dep::aztec::protocol_types::storage::map::derive_storage_slot_in_map; use dep::aztec::note::note_getter::{MAX_NOTES_PER_PAGE, view_notes}; use dep::aztec::note::note_viewer_options::NoteViewerOptions; diff --git a/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr b/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr index bd34f60917d..a6c6b183041 100644 --- a/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr @@ -7,7 +7,7 @@ contract Crowdfunding { // docs:start:all-deps use dep::aztec::{ - encrypted_logs::encrypted_note_emission::encode_and_encrypt_note_with_keys, + encrypted_logs::encrypted_note_emission::encode_and_encrypt_note, keys::getters::get_public_keys, prelude::{AztecAddress, PrivateSet, SharedImmutable}, utils::comparison::Comparator, unencrypted_logs::unencrypted_event_emission::encode_event, macros::{storage::storage, events::event, functions::{public, initializer, private, internal}}, @@ -80,7 +80,7 @@ contract Crowdfunding { // docs:start:valuenote_new let mut note = ValueNote::new(amount as Field, donor_keys.npk_m.hash()); // docs:end:valuenote_new - storage.donation_receipts.insert(&mut note).emit(encode_and_encrypt_note_with_keys(&mut context, donor_keys.ovpk_m, donor_keys.ivpk_m, donor)); + storage.donation_receipts.insert(&mut note).emit(encode_and_encrypt_note(&mut context, donor_keys.ovpk_m, donor_keys.ivpk_m, donor)); } // docs:end:donate diff --git a/noir-projects/noir-contracts/contracts/delegated_on_contract/src/main.nr b/noir-projects/noir-contracts/contracts/delegated_on_contract/src/main.nr index 2548052f7ec..30a4ab02771 100644 --- a/noir-projects/noir-contracts/contracts/delegated_on_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/delegated_on_contract/src/main.nr @@ -19,10 +19,11 @@ contract DelegatedOn { #[private] fn private_set_value(new_value: Field, owner: AztecAddress) -> Field { - let owner_npk_m_hash = get_public_keys(owner).npk_m.hash(); + let msg_sender_keys = get_public_keys(context.msg_sender()); + let owner_keys = get_public_keys(owner); - let mut note = ValueNote::new(new_value, owner_npk_m_hash); - storage.a_map_with_private_values.at(owner).insert(&mut note).emit(encode_and_encrypt_note(&mut context, context.msg_sender(), owner)); + let mut note = ValueNote::new(new_value, owner_keys.npk_m.hash()); + storage.a_map_with_private_values.at(owner).insert(&mut note).emit(encode_and_encrypt_note(&mut context, msg_sender_keys.ovpk_m, owner_keys.ivpk_m, owner)); new_value } diff --git a/noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr b/noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr index b5a6465d2c3..c62ddf6663d 100644 --- a/noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/docs_example_contract/src/main.nr @@ -21,7 +21,7 @@ contract DocsExample { PrivateMutable, PrivateImmutable, PrivateSet, SharedImmutable }; use dep::aztec::{ - encrypted_logs::encrypted_note_emission::{encode_and_encrypt_note, encode_and_encrypt_note_with_keys}, + encrypted_logs::encrypted_note_emission::encode_and_encrypt_note, keys::getters::get_public_keys, macros::{storage::storage, functions::{public, private, internal, view}} }; @@ -174,35 +174,48 @@ contract DocsExample { // docs:start:initialize-private-mutable #[private] fn initialize_private_immutable(randomness: Field, points: u8) { - let msg_sender_npk_m_hash = get_public_keys(context.msg_sender()).npk_m.hash(); + let msg_sender_keys = get_public_keys(context.msg_sender()); - let mut new_card = CardNote::new(points, randomness, msg_sender_npk_m_hash); - storage.private_immutable.initialize(&mut new_card).emit(encode_and_encrypt_note(&mut context, context.msg_sender(), context.msg_sender())); + let mut new_card = CardNote::new(points, randomness, msg_sender_keys.npk_m.hash()); + storage.private_immutable.initialize(&mut new_card).emit( + encode_and_encrypt_note( + &mut context, + msg_sender_keys.ovpk_m, + msg_sender_keys.ivpk_m, + context.msg_sender() + ) + ); } // docs:end:initialize-private-mutable #[private] // msg_sender() is 0 at deploy time. So created another function fn initialize_private(randomness: Field, points: u8) { - let msg_sender_npk_m_hash = get_public_keys(context.msg_sender()).npk_m.hash(); + let msg_sender_keys = get_public_keys(context.msg_sender()); - let mut legendary_card = CardNote::new(points, randomness, msg_sender_npk_m_hash); + let mut legendary_card = CardNote::new(points, randomness, msg_sender_keys.npk_m.hash()); // create and broadcast note - storage.legendary_card.initialize(&mut legendary_card).emit(encode_and_encrypt_note(&mut context, context.msg_sender(), context.msg_sender())); + storage.legendary_card.initialize(&mut legendary_card).emit( + encode_and_encrypt_note( + &mut context, + msg_sender_keys.ovpk_m, + msg_sender_keys.ivpk_m, + context.msg_sender() + ) + ); } #[private] fn insert_notes(amounts: [u8; 3]) { - let sender_keys = get_public_keys(context.msg_sender()); - let sender_npk_m_hash = sender_keys.npk_m.hash(); + let msg_sender_keys = get_public_keys(context.msg_sender()); for i in 0..amounts.len() { - let mut note = CardNote::new(amounts[i], 1, sender_npk_m_hash); + let mut note = CardNote::new(amounts[i], 1, msg_sender_keys.npk_m.hash()); storage.set.insert(&mut note).emit( - encode_and_encrypt_note_with_keys( + encode_and_encrypt_note( &mut context, - sender_keys.ovpk_m, - sender_keys.ivpk_m, + msg_sender_keys.ovpk_m, + msg_sender_keys.ivpk_m, context.msg_sender() ) ); @@ -210,10 +223,17 @@ contract DocsExample { } #[private] fn insert_note(amount: u8, randomness: Field) { - let sender_npk_m_hash = get_public_keys(context.msg_sender()).npk_m.hash(); + let msg_sender_keys = get_public_keys(context.msg_sender()); - let mut note = CardNote::new(amount, randomness, sender_npk_m_hash); - storage.set.insert(&mut note).emit(encode_and_encrypt_note(&mut context, context.msg_sender(), context.msg_sender())); + let mut note = CardNote::new(amount, randomness, msg_sender_keys.npk_m.hash()); + storage.set.insert(&mut note).emit( + encode_and_encrypt_note( + &mut context, + msg_sender_keys.ovpk_m, + msg_sender_keys.ivpk_m, + context.msg_sender() + ) + ); } // docs:start:state_vars-NoteGetterOptionsComparatorExampleNoir unconstrained fn read_note(comparator: u8, amount: Field) -> BoundedVec { @@ -223,10 +243,17 @@ contract DocsExample { // docs:end:state_vars-NoteGetterOptionsComparatorExampleNoir #[private] fn update_legendary_card(randomness: Field, points: u8) { - let sender_npk_m_hash = get_public_keys(context.msg_sender()).npk_m.hash(); + let msg_sender_keys = get_public_keys(context.msg_sender()); - let mut new_card = CardNote::new(points, randomness, sender_npk_m_hash); - storage.legendary_card.replace(&mut new_card).emit(encode_and_encrypt_note(&mut context, context.msg_sender(), context.msg_sender())); + let mut new_card = CardNote::new(points, randomness, msg_sender_keys.npk_m.hash()); + storage.legendary_card.replace(&mut new_card).emit( + encode_and_encrypt_note( + &mut context, + msg_sender_keys.ovpk_m, + msg_sender_keys.ivpk_m, + context.msg_sender() + ) + ); DocsExample::at(context.this_address()).update_leader(context.msg_sender(), points).enqueue(&mut context); } #[private] @@ -234,15 +261,22 @@ contract DocsExample { // Ensure `points` > current value // Also serves as a e2e test that you can `get_note()` and then `replace()` - let sender_npk_m_hash = get_public_keys(context.msg_sender()).npk_m.hash(); + let msg_sender_keys = get_public_keys(context.msg_sender()); // docs:start:state_vars-PrivateMutableGet let card = storage.legendary_card.get_note().note; // docs:end:state_vars-PrivateMutableGet let points = card.points + 1; - let mut new_card = CardNote::new(points, card.randomness, sender_npk_m_hash); + let mut new_card = CardNote::new(points, card.randomness, msg_sender_keys.npk_m.hash()); // docs:start:state_vars-PrivateMutableReplace - storage.legendary_card.replace(&mut new_card).emit(encode_and_encrypt_note(&mut context, context.msg_sender(), context.msg_sender())); + storage.legendary_card.replace(&mut new_card).emit( + encode_and_encrypt_note( + &mut context, + msg_sender_keys.ovpk_m, + msg_sender_keys.ivpk_m, + context.msg_sender() + ) + ); // docs:end:state_vars-PrivateMutableReplace DocsExample::at(context.this_address()).update_leader(context.msg_sender(), points).enqueue(&mut context); } diff --git a/noir-projects/noir-contracts/contracts/ecdsa_k_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/ecdsa_k_account_contract/src/main.nr index 5bdce740498..3e3b9c0405d 100644 --- a/noir-projects/noir-contracts/contracts/ecdsa_k_account_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/ecdsa_k_account_contract/src/main.nr @@ -6,7 +6,7 @@ use dep::aztec::macros::aztec; contract EcdsaKAccount { use dep::aztec::prelude::{PrivateContext, PrivateImmutable}; use dep::aztec::{ - encrypted_logs::encrypted_note_emission::encode_and_encrypt_note_with_keys, + encrypted_logs::encrypted_note_emission::encode_and_encrypt_note, keys::getters::get_public_keys, macros::{storage::storage, functions::{private, initializer, view, noinitcheck}} }; @@ -34,7 +34,7 @@ contract EcdsaKAccount { // important. let mut pub_key_note = EcdsaPublicKeyNote::new(signing_pub_key_x, signing_pub_key_y, this_keys.npk_m.hash()); - storage.public_key.initialize(&mut pub_key_note).emit(encode_and_encrypt_note_with_keys(&mut context, this_keys.ovpk_m, this_keys.ivpk_m, this)); + storage.public_key.initialize(&mut pub_key_note).emit(encode_and_encrypt_note(&mut context, this_keys.ovpk_m, this_keys.ivpk_m, this)); } // Note: If you globally change the entrypoint signature don't forget to update account_entrypoint.ts diff --git a/noir-projects/noir-contracts/contracts/ecdsa_r_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/ecdsa_r_account_contract/src/main.nr index 06335e30a91..be0c4d14ccb 100644 --- a/noir-projects/noir-contracts/contracts/ecdsa_r_account_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/ecdsa_r_account_contract/src/main.nr @@ -5,7 +5,7 @@ use dep::aztec::macros::aztec; contract EcdsaRAccount { use dep::aztec::prelude::{PrivateContext, PrivateImmutable}; use dep::aztec::{ - encrypted_logs::encrypted_note_emission::encode_and_encrypt_note_with_keys, + encrypted_logs::encrypted_note_emission::encode_and_encrypt_note, keys::getters::get_public_keys, macros::{storage::storage, functions::{private, initializer, view, noinitcheck}} }; @@ -33,7 +33,7 @@ contract EcdsaRAccount { // important. let mut pub_key_note = EcdsaPublicKeyNote::new(signing_pub_key_x, signing_pub_key_y, this_keys.npk_m.hash()); - storage.public_key.initialize(&mut pub_key_note).emit(encode_and_encrypt_note_with_keys(&mut context, this_keys.ovpk_m, this_keys.ivpk_m, this)); + storage.public_key.initialize(&mut pub_key_note).emit(encode_and_encrypt_note(&mut context, this_keys.ovpk_m, this_keys.ivpk_m, this)); } // Note: If you globally change the entrypoint signature don't forget to update account_entrypoint.ts diff --git a/noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr b/noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr index f121333cf2e..785f6dbcfc1 100644 --- a/noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/escrow_contract/src/main.nr @@ -5,7 +5,7 @@ use dep::aztec::macros::aztec; contract Escrow { use dep::aztec::prelude::{AztecAddress, PrivateImmutable}; use dep::aztec::{ - encrypted_logs::encrypted_note_emission::encode_and_encrypt_note_with_keys, + encrypted_logs::encrypted_note_emission::encode_and_encrypt_note, keys::getters::get_public_keys, macros::{storage::storage, functions::{private, initializer}} }; @@ -28,9 +28,7 @@ contract Escrow { // docs:start:addressnote_new let mut note = AddressNote::new(owner, owner_keys.npk_m.hash()); // docs:end:addressnote_new - storage.owner.initialize(&mut note).emit( - encode_and_encrypt_note_with_keys(&mut context, msg_sender_keys.ovpk_m, owner_keys.ivpk_m, owner) - ); + storage.owner.initialize(&mut note).emit(encode_and_encrypt_note(&mut context, msg_sender_keys.ovpk_m, owner_keys.ivpk_m, owner)); } // Withdraws balance. Requires that msg.sender is the owner. diff --git a/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr b/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr index b67fdd30cfd..971162f2d7e 100644 --- a/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/inclusion_proofs_contract/src/main.nr @@ -30,11 +30,11 @@ contract InclusionProofs { // Creates a value note owned by `owner`. #[private] fn create_note(owner: AztecAddress, value: Field) { - let owner_private_values = storage.private_values.at(owner); - let owner_npk_m_hash = get_public_keys(owner).npk_m.hash(); + let msg_sender_keys = get_public_keys(context.msg_sender()); + let owner_keys = get_public_keys(owner); - let mut note = ValueNote::new(value, owner_npk_m_hash); - owner_private_values.insert(&mut note).emit(encode_and_encrypt_note(&mut context, context.msg_sender(), owner)); + let mut note = ValueNote::new(value, owner_keys.npk_m.hash()); + storage.private_values.at(owner).insert(&mut note).emit(encode_and_encrypt_note(&mut context, msg_sender_keys.ovpk_m, owner_keys.ivpk_m, owner)); } // docs:end:create_note diff --git a/noir-projects/noir-contracts/contracts/nft_contract/src/main.nr b/noir-projects/noir-contracts/contracts/nft_contract/src/main.nr index 03cb0d0a8d3..cb72da92eec 100644 --- a/noir-projects/noir-contracts/contracts/nft_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/nft_contract/src/main.nr @@ -10,8 +10,8 @@ contract NFT { use dep::compressed_string::FieldCompressedString; use dep::aztec::{ prelude::{NoteGetterOptions, NoteViewerOptions, Map, PublicMutable, SharedImmutable, PrivateSet, AztecAddress}, - encrypted_logs::{encrypted_note_emission::encode_and_encrypt_note_with_keys}, - hash::pedersen_hash, keys::getters::get_public_keys, note::constants::MAX_NOTES_PER_PAGE, + encrypted_logs::{encrypted_note_emission::encode_and_encrypt_note}, hash::pedersen_hash, + keys::getters::get_public_keys, note::constants::MAX_NOTES_PER_PAGE, protocol_types::traits::is_empty, utils::comparison::Comparator, protocol_types::{point::Point, traits::Serialize}, macros::{storage::storage, events::event, functions::{private, public, view, internal, initializer}} @@ -246,7 +246,7 @@ contract NFT { let to_keys = get_public_keys(to); let mut new_note = NFTNote::new(token_id, to_keys.npk_m.hash()); - nfts.at(to).insert(&mut new_note).emit(encode_and_encrypt_note_with_keys(&mut context, from_ovpk_m, to_keys.ivpk_m, to)); + nfts.at(to).insert(&mut new_note).emit(encode_and_encrypt_note(&mut context, from_ovpk_m, to_keys.ivpk_m, to)); } #[private] diff --git a/noir-projects/noir-contracts/contracts/nft_contract/src/test/transfer_in_private.nr b/noir-projects/noir-contracts/contracts/nft_contract/src/test/transfer_in_private.nr index 817a30c8306..4fd1d663504 100644 --- a/noir-projects/noir-contracts/contracts/nft_contract/src/test/transfer_in_private.nr +++ b/noir-projects/noir-contracts/contracts/nft_contract/src/test/transfer_in_private.nr @@ -1,6 +1,6 @@ use crate::test::utils; use dep::aztec::test::helpers::cheatcodes; -use aztec::oracle::unsafe_rand::unsafe_rand; +use aztec::oracle::random::random; use dep::authwit::cheatcodes as authwit_cheatcodes; use crate::NFT; @@ -76,7 +76,7 @@ unconstrained fn transfer_in_private_failure_on_behalf_of_self_non_zero_nonce() let (env, nft_contract_address, sender, recipient) = utils::setup(/* with_account_contracts */ false); // We set random value for the token_id as the nonce check is before we use the value. - let token_id = unsafe_rand(); + let token_id = random(); // Try transferring the NFT env.call_private_void(NFT::at(nft_contract_address).transfer_in_private(sender, recipient, token_id, 1)); @@ -90,7 +90,7 @@ unconstrained fn transfer_in_private_failure_on_behalf_of_other_without_approval let (env, nft_contract_address, sender, recipient) = utils::setup(/* with_account_contracts */ true); // We set random value for the token_id as the nonce check is before we use the value. - let token_id = unsafe_rand(); + let token_id = random(); // Impersonate recipient to perform the call env.impersonate(recipient); @@ -106,7 +106,7 @@ unconstrained fn transfer_in_private_failure_on_behalf_of_other_wrong_caller() { let (env, nft_contract_address, sender, recipient) = utils::setup(/* with_account_contracts */ true); // We set random value for the token_id as the nonce check is before we use the value. - let token_id = unsafe_rand(); + let token_id = random(); let transfer_in_private_from_call_interface = NFT::at(nft_contract_address).transfer_in_private(sender, recipient, token_id, 1); authwit_cheatcodes::add_private_authwit_from_call_interface(sender, sender, transfer_in_private_from_call_interface); diff --git a/noir-projects/noir-contracts/contracts/nft_contract/src/test/transfer_in_public.nr b/noir-projects/noir-contracts/contracts/nft_contract/src/test/transfer_in_public.nr index 81136a9bbeb..d08ccb821ac 100644 --- a/noir-projects/noir-contracts/contracts/nft_contract/src/test/transfer_in_public.nr +++ b/noir-projects/noir-contracts/contracts/nft_contract/src/test/transfer_in_public.nr @@ -1,5 +1,5 @@ use crate::test::utils; -use dep::aztec::oracle::unsafe_rand::unsafe_rand; +use dep::aztec::oracle::random::random; use dep::authwit::cheatcodes as authwit_cheatcodes; use crate::NFT; @@ -50,10 +50,10 @@ unconstrained fn transfer_in_public_failure_on_behalf_of_self_non_zero_nonce() { let (env, nft_contract_address, sender, recipient) = utils::setup(/* with_account_contracts */ false); // We set random value for the token_id as the nonce check is before we use the value. - let token_id = unsafe_rand(); + let token_id = random(); // Try to transfer the NFT - env.call_public(NFT::at(nft_contract_address).transfer_in_public(sender, recipient, token_id, unsafe_rand())); + env.call_public(NFT::at(nft_contract_address).transfer_in_public(sender, recipient, token_id, random())); } #[test(should_fail_with="invalid owner")] diff --git a/noir-projects/noir-contracts/contracts/nft_contract/src/test/transfer_to_private.nr b/noir-projects/noir-contracts/contracts/nft_contract/src/test/transfer_to_private.nr index 51350ae3adf..aa8ad337253 100644 --- a/noir-projects/noir-contracts/contracts/nft_contract/src/test/transfer_to_private.nr +++ b/noir-projects/noir-contracts/contracts/nft_contract/src/test/transfer_to_private.nr @@ -1,7 +1,7 @@ use crate::test::utils; use dep::aztec::{ hash::pedersen_hash, keys::getters::get_public_keys, prelude::{AztecAddress, NoteHeader}, - oracle::unsafe_rand::unsafe_rand, protocol_types::storage::map::derive_storage_slot_in_map + oracle::random::random, protocol_types::storage::map::derive_storage_slot_in_map }; use crate::{types::nft_note::NFTNote, NFT}; @@ -25,8 +25,8 @@ unconstrained fn transfer_to_private_to_a_different_account() { // Setup without account contracts. We are not using authwits here, so dummy accounts are enough let (env, nft_contract_address, sender, recipient, token_id) = utils::setup_and_mint(/* with_account_contracts */ false); - let note_randomness = unsafe_rand(); - let transient_storage_slot_randomness = unsafe_rand(); + let note_randomness = random(); + let transient_storage_slot_randomness = random(); // Sender will be the msg_sender/transfer_preparer in prepare_transfer_to_private let transfer_preparer_storage_slot_commitment = pedersen_hash( [sender.to_field(), transient_storage_slot_randomness], @@ -72,7 +72,7 @@ unconstrained fn transfer_to_private_to_self_transfer_not_prepared() { let (env, nft_contract_address, _, _, token_id) = utils::setup_and_mint(/* with_account_contracts */ false); // Transfer was not prepared so we can use random value for the commitment - let transfer_preparer_storage_slot_commitment = unsafe_rand(); + let transfer_preparer_storage_slot_commitment = random(); // Try finalizing the transfer without preparing it env.call_public( @@ -87,8 +87,8 @@ unconstrained fn transfer_to_private_finalizing_from_incorrect_sender() { let correct_sender = AztecAddress::from_field(9); - let note_randomness = unsafe_rand(); - let transient_storage_slot_randomness = unsafe_rand(); + let note_randomness = random(); + let transient_storage_slot_randomness = random(); // Sender will be the msg_sender/transfer_preparer in prepare_transfer_to_private let transfer_preparer_storage_slot_commitment = pedersen_hash( [correct_sender.to_field(), transient_storage_slot_randomness], @@ -120,7 +120,7 @@ unconstrained fn transfer_to_private_failure_not_an_owner() { let (env, nft_contract_address, _, not_owner, token_id) = utils::setup_and_mint(/* with_account_contracts */ false); // We set random value for the commitment as the NFT owner check is before we use the value - let transfer_preparer_storage_slot_commitment = unsafe_rand(); + let transfer_preparer_storage_slot_commitment = random(); // Try transferring someone else's public NFT env.impersonate(not_owner); diff --git a/noir-projects/noir-contracts/contracts/nft_contract/src/test/transfer_to_public.nr b/noir-projects/noir-contracts/contracts/nft_contract/src/test/transfer_to_public.nr index ca24227e785..bfc027e06d1 100644 --- a/noir-projects/noir-contracts/contracts/nft_contract/src/test/transfer_to_public.nr +++ b/noir-projects/noir-contracts/contracts/nft_contract/src/test/transfer_to_public.nr @@ -1,5 +1,5 @@ use crate::test::utils; -use dep::aztec::oracle::unsafe_rand::unsafe_rand; +use dep::aztec::oracle::random::random; use dep::authwit::cheatcodes as authwit_cheatcodes; use crate::NFT; @@ -54,7 +54,7 @@ unconstrained fn transfer_to_public_failure_on_behalf_of_self_non_zero_nonce() { // Setup without account contracts. We are not using authwits here, so dummy accounts are enough let (env, nft_contract_address, user, _, token_id) = utils::setup_mint_and_transfer_to_private(/* with_account_contracts */ false); - env.call_private_void(NFT::at(nft_contract_address).transfer_to_public(user, user, token_id, unsafe_rand())); + env.call_private_void(NFT::at(nft_contract_address).transfer_to_public(user, user, token_id, random())); } #[test(should_fail_with="Authorization not found for message hash")] diff --git a/noir-projects/noir-contracts/contracts/nft_contract/src/test/utils.nr b/noir-projects/noir-contracts/contracts/nft_contract/src/test/utils.nr index 7b95f3efda3..4e2aa858b50 100644 --- a/noir-projects/noir-contracts/contracts/nft_contract/src/test/utils.nr +++ b/noir-projects/noir-contracts/contracts/nft_contract/src/test/utils.nr @@ -2,7 +2,7 @@ use dep::aztec::{ hash::pedersen_hash, keys::getters::get_public_keys, prelude::{AztecAddress, NoteHeader}, test::helpers::{cheatcodes, test_environment::TestEnvironment}, protocol_types::storage::map::derive_storage_slot_in_map, - oracle::{execution::{get_block_number, get_contract_address}, unsafe_rand::unsafe_rand, storage::storage_read} + oracle::{execution::{get_block_number, get_contract_address}, random::random, storage::storage_read} }; use crate::{types::nft_note::NFTNote, NFT}; @@ -50,8 +50,8 @@ unconstrained pub fn setup_and_mint(with_account_contracts: bool) -> (&mut TestE unconstrained pub fn setup_mint_and_transfer_to_private(with_account_contracts: bool) -> (&mut TestEnvironment, AztecAddress, AztecAddress, AztecAddress, Field) { let (env, nft_contract_address, owner, recipient, minted_token_id) = setup_and_mint(with_account_contracts); - let note_randomness = unsafe_rand(); - let transient_storage_slot_randomness = unsafe_rand(); + let note_randomness = random(); + let transient_storage_slot_randomness = random(); let transfer_preparer_storage_slot_commitment = pedersen_hash( [owner.to_field(), transient_storage_slot_randomness], NFT::TRANSIENT_STORAGE_SLOT_PEDERSEN_INDEX diff --git a/noir-projects/noir-contracts/contracts/nft_contract/src/types/nft_note.nr b/noir-projects/noir-contracts/contracts/nft_contract/src/types/nft_note.nr index ea331467bcc..6755478b14c 100644 --- a/noir-projects/noir-contracts/contracts/nft_contract/src/types/nft_note.nr +++ b/noir-projects/noir-contracts/contracts/nft_contract/src/types/nft_note.nr @@ -1,6 +1,6 @@ use dep::aztec::{ - note::utils::compute_note_hash_for_nullify, keys::getters::get_nsk_app, - oracle::unsafe_rand::unsafe_rand, prelude::{NullifiableNote, NoteHeader, PrivateContext}, + note::utils::compute_note_hash_for_nullify, keys::getters::get_nsk_app, oracle::random::random, + prelude::{NullifiableNote, NoteHeader, PrivateContext}, protocol_types::{constants::GENERATOR_INDEX__NOTE_NULLIFIER, hash::poseidon2_hash_with_separator, traits::{Empty, Eq}}, macros::notes::partial_note }; @@ -42,8 +42,12 @@ impl NullifiableNote for NFTNote { impl NFTNote { pub fn new(token_id: Field, npk_m_hash: Field) -> Self { + // We use the randomness to preserve the privacy of the note recipient by preventing brute-forcing, so a + // malicious sender could use non-random values to make the note less private. But they already know the full + // note pre-image anyway, and so the recipient already trusts them to not disclose this information. We can + // therefore assume that the sender will cooperate in the random value generation. let randomness = unsafe { - unsafe_rand() + random() }; NFTNote { token_id, npk_m_hash, randomness, header: NoteHeader::empty() } } diff --git a/noir-projects/noir-contracts/contracts/pending_note_hashes_contract/src/main.nr b/noir-projects/noir-contracts/contracts/pending_note_hashes_contract/src/main.nr index 9663eebb80f..dc4ba79a8b7 100644 --- a/noir-projects/noir-contracts/contracts/pending_note_hashes_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/pending_note_hashes_contract/src/main.nr @@ -10,7 +10,7 @@ contract PendingNoteHashes { use dep::aztec::prelude::{AztecAddress, FunctionSelector, NoteGetterOptions, PrivateContext, Map, PrivateSet}; use dep::value_note::{filter::filter_notes_min_sum, value_note::ValueNote}; use dep::aztec::protocol_types::constants::{MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, MAX_NOTE_HASHES_PER_CALL}; - use dep::aztec::encrypted_logs::encrypted_note_emission::{encode_and_encrypt_note, encode_and_encrypt_note_with_keys}; + use dep::aztec::encrypted_logs::encrypted_note_emission::encode_and_encrypt_note; use dep::aztec::note::note_emission::NoteEmission; use dep::aztec::keys::getters::get_public_keys; use dep::aztec::macros::{storage::storage, functions::private}; @@ -34,12 +34,20 @@ contract PendingNoteHashes { ) -> Field { let owner_balance = storage.balances.at(owner); - let owner_npk_m_hash = get_public_keys(owner).npk_m.hash(); + let owner_keys = get_public_keys(owner); + let outgoing_viewer_keys = get_public_keys(outgoing_viewer); - let mut note = ValueNote::new(amount, owner_npk_m_hash); + let mut note = ValueNote::new(amount, owner_keys.npk_m.hash()); // Insert note - owner_balance.insert(&mut note).emit(encode_and_encrypt_note(&mut context, outgoing_viewer, owner)); + owner_balance.insert(&mut note).emit( + encode_and_encrypt_note( + &mut context, + outgoing_viewer_keys.ovpk_m, + owner_keys.ivpk_m, + owner + ) + ); let options = NoteGetterOptions::with_filter(filter_notes_min_sum, amount); // get note inserted above @@ -81,12 +89,20 @@ contract PendingNoteHashes { fn insert_note(amount: Field, owner: AztecAddress, outgoing_viewer: AztecAddress) { let owner_balance = storage.balances.at(owner); - let owner_npk_m_hash = get_public_keys(owner).npk_m.hash(); + let owner_keys = get_public_keys(owner); + let outgoing_viewer_keys = get_public_keys(outgoing_viewer); - let mut note = ValueNote::new(amount, owner_npk_m_hash); + let mut note = ValueNote::new(amount, owner_keys.npk_m.hash()); // Insert note - owner_balance.insert(&mut note).emit(encode_and_encrypt_note(&mut context, outgoing_viewer, owner)); + owner_balance.insert(&mut note).emit( + encode_and_encrypt_note( + &mut context, + outgoing_viewer_keys.ovpk_m, + owner_keys.ivpk_m, + owner + ) + ); } // Nested/inner function to create and insert a note @@ -100,13 +116,21 @@ contract PendingNoteHashes { ) { let mut owner_balance = storage.balances.at(owner); - let owner_npk_m_hash = get_public_keys(owner).npk_m.hash(); + let owner_keys = get_public_keys(owner); + let outgoing_viewer_keys = get_public_keys(outgoing_viewer); - let mut note = ValueNote::new(amount, owner_npk_m_hash); + let mut note = ValueNote::new(amount, owner_keys.npk_m.hash()); note.randomness = 2; // Insert note - owner_balance.insert(&mut note).emit(encode_and_encrypt_note(&mut context, outgoing_viewer, owner)); + owner_balance.insert(&mut note).emit( + encode_and_encrypt_note( + &mut context, + outgoing_viewer_keys.ovpk_m, + owner_keys.ivpk_m, + owner + ) + ); } // Nested/inner function to create and insert a note @@ -115,17 +139,32 @@ contract PendingNoteHashes { fn insert_note_extra_emit(amount: Field, owner: AztecAddress, outgoing_viewer: AztecAddress) { let mut owner_balance = storage.balances.at(owner); - let owner_npk_m_hash = get_public_keys(owner).npk_m.hash(); + let owner_keys = get_public_keys(owner); + let outgoing_viewer_keys = get_public_keys(outgoing_viewer); - let mut note = ValueNote::new(amount, owner_npk_m_hash); + let mut note = ValueNote::new(amount, owner_keys.npk_m.hash()); // Insert note let emission = owner_balance.insert(&mut note); - emission.emit(encode_and_encrypt_note(&mut context, outgoing_viewer, owner)); + emission.emit( + encode_and_encrypt_note( + &mut context, + outgoing_viewer_keys.ovpk_m, + owner_keys.ivpk_m, + owner + ) + ); // Emit note again - emission.emit(encode_and_encrypt_note(&mut context, outgoing_viewer, owner)); + emission.emit( + encode_and_encrypt_note( + &mut context, + outgoing_viewer_keys.ovpk_m, + owner_keys.ivpk_m, + owner + ) + ); } // Nested/inner function to get a note and confirm it matches the expected value @@ -335,12 +374,18 @@ contract PendingNoteHashes { let owner_keys = get_public_keys(owner); let owner_npk_m_hash = owner_keys.npk_m.hash(); - let owner_ivpk_m = owner_keys.ivpk_m; - let outgoing_viewer_ovpk_m = get_public_keys(outgoing_viewer).ovpk_m; + let outgoing_viewer_keys = get_public_keys(outgoing_viewer); let mut good_note = ValueNote::new(10, owner_npk_m_hash); // Insert good note with real log - owner_balance.insert(&mut good_note).emit(encode_and_encrypt_note(&mut context, outgoing_viewer, owner)); + owner_balance.insert(&mut good_note).emit( + encode_and_encrypt_note( + &mut context, + outgoing_viewer_keys.ovpk_m, + owner_keys.ivpk_m, + owner + ) + ); // We will emit a note log with an incorrect preimage to ensure the pxe throws // This note has not been inserted... @@ -349,7 +394,14 @@ contract PendingNoteHashes { let existing_note_header = good_note.get_header(); bad_note.set_header(existing_note_header); - NoteEmission::new(bad_note).emit(encode_and_encrypt_note_with_keys(&mut context, outgoing_viewer_ovpk_m, owner_ivpk_m, owner)); + NoteEmission::new(bad_note).emit( + encode_and_encrypt_note( + &mut context, + outgoing_viewer_keys.ovpk_m, + owner_keys.ivpk_m, + owner + ) + ); } #[contract_library_method] @@ -368,7 +420,7 @@ contract PendingNoteHashes { for i in 0..max_notes_per_call() { let mut note = ValueNote::new(i as Field, owner_npk_m_hash); - owner_balance.insert(&mut note).emit(encode_and_encrypt_note_with_keys(context, outgoing_viewer_ovpk_m, owner_ivpk_m, owner)); + owner_balance.insert(&mut note).emit(encode_and_encrypt_note(context, outgoing_viewer_ovpk_m, owner_ivpk_m, owner)); } } diff --git a/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr index da74e7c3104..7a2aba19720 100644 --- a/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr @@ -9,7 +9,7 @@ contract SchnorrAccount { use dep::std; use dep::aztec::prelude::{AztecAddress, PrivateContext, PrivateImmutable}; - use dep::aztec::encrypted_logs::encrypted_note_emission::encode_and_encrypt_note_with_keys; + use dep::aztec::encrypted_logs::encrypted_note_emission::encode_and_encrypt_note; use dep::authwit::{ entrypoint::{app::AppPayload, fee::FeePayload}, account::AccountActions, auth_witness::get_auth_witness, auth::{compute_authwit_nullifier, compute_authwit_message_hash} @@ -36,7 +36,7 @@ contract SchnorrAccount { // important. let mut pub_key_note = PublicKeyNote::new(signing_pub_key_x, signing_pub_key_y, this_keys.npk_m.hash()); - storage.signing_public_key.initialize(&mut pub_key_note).emit(encode_and_encrypt_note_with_keys(&mut context, this_keys.ovpk_m, this_keys.ivpk_m, this)); + storage.signing_public_key.initialize(&mut pub_key_note).emit(encode_and_encrypt_note(&mut context, this_keys.ovpk_m, this_keys.ivpk_m, this)); } // Note: If you globally change the entrypoint signature don't forget to update account_entrypoint.ts file diff --git a/noir-projects/noir-contracts/contracts/spam_contract/src/main.nr b/noir-projects/noir-contracts/contracts/spam_contract/src/main.nr index fae6a1bbad0..e6206501fee 100644 --- a/noir-projects/noir-contracts/contracts/spam_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/spam_contract/src/main.nr @@ -8,7 +8,7 @@ contract Spam { use dep::aztec::{ prelude::{Map, AztecAddress, PublicMutable}, - encrypted_logs::{encrypted_note_emission::encode_and_encrypt_note_with_keys_unconstrained}, + encrypted_logs::{encrypted_note_emission::encode_and_encrypt_note_unconstrained}, keys::getters::get_public_keys, protocol_types::{ hash::poseidon2_hash_with_separator, @@ -36,7 +36,7 @@ contract Spam { for _ in 0..MAX_NOTE_HASHES_PER_CALL { storage.balances.at(caller).add(caller_keys.npk_m, U128::from_integer(amount)).emit( - encode_and_encrypt_note_with_keys_unconstrained(&mut context, caller_keys.ovpk_m, caller_keys.ivpk_m, caller) + encode_and_encrypt_note_unconstrained(&mut context, caller_keys.ovpk_m, caller_keys.ivpk_m, caller) ); } diff --git a/noir-projects/noir-contracts/contracts/spam_contract/src/types/token_note.nr b/noir-projects/noir-contracts/contracts/spam_contract/src/types/token_note.nr index b14bc87f94c..3879f4b603a 100644 --- a/noir-projects/noir-contracts/contracts/spam_contract/src/types/token_note.nr +++ b/noir-projects/noir-contracts/contracts/spam_contract/src/types/token_note.nr @@ -1,8 +1,8 @@ use dep::aztec::{ prelude::{NoteHeader, NullifiableNote, PrivateContext}, protocol_types::{constants::GENERATOR_INDEX__NOTE_NULLIFIER, hash::poseidon2_hash_with_separator}, - note::utils::compute_note_hash_for_nullify, oracle::unsafe_rand::unsafe_rand, - keys::getters::get_nsk_app, macros::notes::note + note::utils::compute_note_hash_for_nullify, oracle::random::random, keys::getters::get_nsk_app, + macros::notes::note }; trait OwnedNote { @@ -55,7 +55,14 @@ impl Eq for TokenNote { impl OwnedNote for TokenNote { fn new(amount: U128, owner_npk_m_hash: Field) -> Self { - Self { amount, npk_m_hash: owner_npk_m_hash, randomness: unsafe_rand(), header: NoteHeader::empty() } + // We use the randomness to preserve the privacy of the note recipient by preventing brute-forcing, so a + // malicious sender could use non-random values to make the note less private. But they already know the full + // note pre-image anyway, and so the recipient already trusts them to not disclose this information. We can + // therefore assume that the sender will cooperate in the random value generation. + let randomness = unsafe { + random() + }; + Self { amount, npk_m_hash: owner_npk_m_hash, randomness, header: NoteHeader::empty() } } fn get_amount(self) -> U128 { diff --git a/noir-projects/noir-contracts/contracts/static_child_contract/src/main.nr b/noir-projects/noir-contracts/contracts/static_child_contract/src/main.nr index fbdcf745c57..0ec1b4bce79 100644 --- a/noir-projects/noir-contracts/contracts/static_child_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/static_child_contract/src/main.nr @@ -44,9 +44,12 @@ contract StaticChild { #[private] #[view] fn private_illegal_set_value(new_value: Field, owner: AztecAddress) -> Field { - let owner_npk_m_hash = get_public_keys(owner).npk_m.hash(); - let mut note = ValueNote::new(new_value, owner_npk_m_hash); - storage.a_private_value.insert(&mut note).emit(encode_and_encrypt_note(&mut context, context.msg_sender(), owner)); + let msg_sender_keys = get_public_keys(context.msg_sender()); + let owner_keys = get_public_keys(owner); + + let mut note = ValueNote::new(new_value, owner_keys.npk_m.hash()); + + storage.a_private_value.insert(&mut note).emit(encode_and_encrypt_note(&mut context, msg_sender_keys.ovpk_m, owner_keys.ivpk_m, owner)); new_value } @@ -57,9 +60,18 @@ contract StaticChild { owner: AztecAddress, outgoing_viewer: AztecAddress ) -> Field { - let owner_npk_m_hash = get_public_keys(owner).npk_m.hash(); - let mut note = ValueNote::new(new_value, owner_npk_m_hash); - storage.a_private_value.insert(&mut note).emit(encode_and_encrypt_note(&mut context, outgoing_viewer, owner)); + let owner_keys = get_public_keys(owner); + let outgoing_viewer_keys = get_public_keys(outgoing_viewer); + + let mut note = ValueNote::new(new_value, owner_keys.npk_m.hash()); + storage.a_private_value.insert(&mut note).emit( + encode_and_encrypt_note( + &mut context, + outgoing_viewer_keys.ovpk_m, + owner_keys.ivpk_m, + owner + ) + ); new_value } diff --git a/noir-projects/noir-contracts/contracts/test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test_contract/src/main.nr index f1298cc100d..3ca23d941c0 100644 --- a/noir-projects/noir-contracts/contracts/test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test_contract/src/main.nr @@ -7,42 +7,31 @@ use dep::aztec::macros::aztec; contract Test { use dep::aztec::prelude::{ - AztecAddress, EthAddress, FunctionSelector, NoteHeader, NoteGetterOptions, NoteViewerOptions, - PrivateContext, PrivateImmutable, PrivateSet, SharedImmutable + AztecAddress, EthAddress, FunctionSelector, NoteGetterOptions, NoteViewerOptions, + PrivateImmutable, PrivateSet }; use dep::aztec::encrypted_logs::encrypted_note_emission::encode_and_encrypt_note; - use dep::aztec::encrypted_logs::encrypted_event_emission::encode_and_encrypt_event_with_keys_with_randomness; + use dep::aztec::encrypted_logs::encrypted_event_emission::encode_and_encrypt_event_with_randomness_unconstrained; - use dep::aztec::protocol_types::{ - abis::private_circuit_public_inputs::PrivateCircuitPublicInputs, - constants::MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, traits::{Serialize, ToField, FromField}, - point::Point, scalar::Scalar, storage::map::derive_storage_slot_in_map - }; - - use dep::aztec::encrypted_logs::header::EncryptedLogHeader; - use dep::aztec::encrypted_logs::incoming_body::EncryptedLogIncomingBody; - use dep::aztec::encrypted_logs::outgoing_body::EncryptedLogOutgoingBody; + use dep::aztec::protocol_types::{constants::MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, traits::Serialize, point::Point}; use dep::aztec::note::constants::MAX_NOTES_PER_PAGE; use dep::aztec::keys::getters::get_public_keys; - use dep::aztec::state_vars::{shared_mutable::SharedMutablePrivateGetter}; - use dep::aztec::{ - context::inputs::private_context_inputs::PrivateContextInputs, hash::{pedersen_hash, compute_secret_hash, ArgsHasher}, keys::public_keys::IvpkM, note::{ lifecycle::{create_note, destroy_note_unsafe}, note_getter::{get_notes, view_notes}, note_getter_options::NoteStatus }, - deploy::deploy_contract as aztec_deploy_contract, - oracle::{encryption::aes128_encrypt, unsafe_rand::unsafe_rand}, utils::comparison::Comparator, + deploy::deploy_contract as aztec_deploy_contract, oracle::random::random, + utils::comparison::Comparator, macros::{storage::storage, events::event, functions::{private, public, internal}} }; use dep::token_portal_content_hash_lib::{get_mint_private_content_hash, get_mint_public_content_hash}; use dep::value_note::value_note::ValueNote; // TODO investigate why the macros require EmbeddedCurvePoint and EmbeddedCurveScalar - use std::embedded_curve_ops::{EmbeddedCurveScalar, EmbeddedCurvePoint, fixed_base_scalar_mul as derive_public_key}; + use std::embedded_curve_ops::{EmbeddedCurveScalar, EmbeddedCurvePoint}; use std::meta::derive; use crate::test_note::TestNote; @@ -105,10 +94,18 @@ contract Test { storage_slot != storage.example_constant.get_storage_slot(), "this storage slot is reserved for example_constant" ); - let owner_npk_m_hash = get_public_keys(owner).npk_m.hash(); + let outgoing_viewer_keys = get_public_keys(outgoing_viewer); + let owner_keys = get_public_keys(owner); - let mut note = ValueNote::new(value, owner_npk_m_hash); - create_note(&mut context, storage_slot, &mut note).emit(encode_and_encrypt_note(&mut context, outgoing_viewer, owner)); + let mut note = ValueNote::new(value, owner_keys.npk_m.hash()); + create_note(&mut context, storage_slot, &mut note).emit( + encode_and_encrypt_note( + &mut context, + outgoing_viewer_keys.ovpk_m, + owner_keys.ivpk_m, + owner + ) + ); } #[private] @@ -279,7 +276,7 @@ contract Test { let event = ExampleEvent { value0: fields[0], value1: fields[1], value2: fields[2], value3: fields[3], value4: fields[4] }; event.emit( - encode_and_encrypt_event_with_keys_with_randomness( + encode_and_encrypt_event_with_randomness_unconstrained( &mut context, // testing only - a secret random value is passed in here to salt / mask the address 5, @@ -297,9 +294,9 @@ contract Test { let otherEvent = ExampleEvent { value0: 1, value1: 2, value2: 3, value3: 4, value4: 5 }; otherEvent.emit( - encode_and_encrypt_event_with_keys_with_randomness( + encode_and_encrypt_event_with_randomness_unconstrained( &mut context, - // testing only - a randomness of 0 signals the kerels to not mask the address + // testing only - a randomness of 0 signals the kernels to not mask the address 0, outgoing_viewer_ovpk_m, owner_ivpk_m, @@ -315,10 +312,11 @@ contract Test { Test::at(context.this_address()).call_create_note(value, owner, outgoing_viewer, storage_slot).call(&mut context); storage_slot += 1; - let owner_npk_m_hash = get_public_keys(owner).npk_m.hash(); + let msg_sender_keys = get_public_keys(context.msg_sender()); + let owner_keys = get_public_keys(owner); - let mut note = ValueNote::new(value + 1, owner_npk_m_hash); - create_note(&mut context, storage_slot, &mut note).emit(encode_and_encrypt_note(&mut context, context.msg_sender(), owner)); + let mut note = ValueNote::new(value + 1, owner_keys.npk_m.hash()); + create_note(&mut context, storage_slot, &mut note).emit(encode_and_encrypt_note(&mut context, msg_sender_keys.ovpk_m, owner_keys.ivpk_m, owner)); storage_slot += 1; Test::at(context.this_address()).call_create_note(value + 2, owner, outgoing_viewer, storage_slot).call(&mut context); } @@ -398,44 +396,6 @@ contract Test { assert(context.version() == version, "Invalid version"); } - #[private] - fn encrypt(input: [u8; 64], iv: [u8; 16], key: [u8; 16]) -> [u8; 80] { - aes128_encrypt(input, iv, key) - } - - #[private] - fn encrypt_with_padding(input: [u8; 65], iv: [u8; 16], key: [u8; 16]) -> [u8; 80] { - aes128_encrypt(input, iv, key) - } - - #[private] - fn compute_note_header_ciphertext(secret: Scalar, ivpk: IvpkM) -> [u8; 48] { - EncryptedLogHeader::new(context.this_address()).compute_ciphertext(secret, ivpk) - } - - // 64 bytes + 32 * #fields + 16 = 112 bytes - #[private] - fn compute_incoming_log_body_ciphertext( - secret: Scalar, - ivpk: IvpkM, - storage_slot: Field, - value: Field - ) -> [u8; 112] { - let note = TestNote::new(value); - EncryptedLogIncomingBody::from_note(note, storage_slot).compute_ciphertext(secret, ivpk).as_array() - } - - #[private] - fn compute_outgoing_log_body_ciphertext( - eph_sk: Scalar, - recipient: AztecAddress, - recipient_ivpk: IvpkM, - ovsk_app: Scalar - ) -> [u8; 144] { - let eph_pk = derive_public_key(eph_sk); - EncryptedLogOutgoingBody::new(eph_sk, recipient, recipient_ivpk).compute_ciphertext(ovsk_app, eph_pk) - } - #[public] fn assert_public_global_vars( chain_id: Field, @@ -485,24 +445,6 @@ contract Test { constant.value } - // This function is used in the e2e_state_vars to test the SharedMutablePrivateGetter in isolation - #[private] - fn test_shared_mutable_private_getter( - contract_address_to_read: AztecAddress, - storage_slot_of_shared_mutable: Field - ) -> Field { - // It's a bit wonky because we need to know the delay for get_current_value_in_private to work correctly - let test: SharedMutablePrivateGetter = SharedMutablePrivateGetter::new( - &mut context, - contract_address_to_read, - storage_slot_of_shared_mutable - ); - - let ret = test.get_value_in_private(context.get_header()); - - ret.to_field() - } - #[private] fn test_nullifier_key_freshness(address: AztecAddress, public_nullifying_key: Point) { assert_eq(get_public_keys(address).npk_m.inner, public_nullifying_key); @@ -510,7 +452,7 @@ contract Test { // Purely exists for testing unconstrained fn get_random(kinda_seed: Field) -> pub Field { - kinda_seed * unsafe_rand() + kinda_seed * random() } pub struct DummyNote { diff --git a/noir-projects/noir-contracts/contracts/test_log_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test_log_contract/src/main.nr index d3c6e29746d..4c685a0a93c 100644 --- a/noir-projects/noir-contracts/contracts/test_log_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test_log_contract/src/main.nr @@ -4,10 +4,9 @@ use dep::aztec::macros::aztec; contract TestLog { use std::meta::derive; use dep::aztec::prelude::PrivateSet; - use dep::aztec::protocol_types::{scalar::Scalar, address::AztecAddress, traits::Serialize}; - use dep::aztec::keys::public_keys::IvpkM; + use dep::aztec::protocol_types::{address::AztecAddress, traits::Serialize}; + use dep::aztec::keys::getters::get_public_keys; use dep::value_note::value_note::ValueNote; - use dep::aztec::encrypted_logs::incoming_body::EncryptedLogIncomingBody; use dep::aztec::encrypted_logs::encrypted_event_emission::encode_and_encrypt_event_with_randomness; use dep::aztec::unencrypted_logs::unencrypted_event_emission::encode_event; use dep::aztec::macros::{storage::storage, events::event, functions::{private, public}}; @@ -36,30 +35,20 @@ contract TestLog { // EXAMPLE_EVENT_0_BYTES_LEN + 16 global EXAMPLE_EVENT_0_CIPHERTEXT_BYTES_LEN = 144; - #[private] - fn compute_incoming_log_body_ciphertext( - secret: Scalar, - ivpk: IvpkM, - randomness: Field, - event_type_id: Field, - preimage: [Field; 2] - ) -> [u8; EXAMPLE_EVENT_0_CIPHERTEXT_BYTES_LEN] { - EncryptedLogIncomingBody::from_event( - ExampleEvent0 { value0: preimage[0], value1: preimage[1] }, - randomness - ).compute_ciphertext(secret, ivpk).as_array() - } - #[private] fn emit_encrypted_events(other: AztecAddress, randomness: [Field; 2], preimages: [Field; 4]) { let event0 = ExampleEvent0 { value0: preimages[0], value1: preimages[1] }; + let other_keys = get_public_keys(other); + let msg_sender_keys = get_public_keys(context.msg_sender()); + event0.emit( encode_and_encrypt_event_with_randomness( &mut context, randomness[0], // outgoing is set to other, incoming is set to msg sender - other, + other_keys.ovpk_m, + msg_sender_keys.ivpk_m, context.msg_sender() ) ); @@ -70,7 +59,8 @@ contract TestLog { &mut context, randomness[0], // outgoing is set to msg sender, incoming is set to other - context.msg_sender(), + msg_sender_keys.ovpk_m, + other_keys.ivpk_m, other ) ); @@ -82,7 +72,8 @@ contract TestLog { &mut context, randomness[1], // outgoing is set to other, incoming is set to msg sender - other, + other_keys.ovpk_m, + msg_sender_keys.ivpk_m, context.msg_sender() ) ); diff --git a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr index 45cc7e76994..42ae2f7fd74 100644 --- a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/main.nr @@ -18,7 +18,8 @@ contract TokenBlacklist { prelude::{AztecAddress, Map, NoteGetterOptions, PrivateSet, PublicMutable, SharedMutable}, encrypted_logs::encrypted_note_emission::{encode_and_encrypt_note_unconstrained, encode_and_encrypt_note}, utils::comparison::Comparator, - macros::{storage::storage, functions::{private, public, initializer, view, internal}} + macros::{storage::storage, functions::{private, public, initializer, view, internal}}, + keys::getters::get_public_keys }; use dep::authwit::{auth::{assert_current_call_valid_authwit, assert_current_call_valid_authwit_public}}; @@ -182,8 +183,9 @@ contract TokenBlacklist { assert(notes.len() == 1, "note not popped"); // Add the token note to user's balances set - let caller = context.msg_sender(); - storage.balances.add(to, U128::from_integer(amount)).emit(encode_and_encrypt_note(&mut context, caller, to)); + let msg_sender_keys = get_public_keys(context.msg_sender()); + let to_keys = get_public_keys(to); + storage.balances.add(to, U128::from_integer(amount)).emit(encode_and_encrypt_note(&mut context, msg_sender_keys.ovpk_m, to_keys.ivpk_m, to)); } #[private] @@ -199,7 +201,8 @@ contract TokenBlacklist { assert(nonce == 0, "invalid nonce"); } - storage.balances.sub(from, U128::from_integer(amount)).emit(encode_and_encrypt_note(&mut context, from, from)); + let from_keys = get_public_keys(from); + storage.balances.sub(from, U128::from_integer(amount)).emit(encode_and_encrypt_note(&mut context, from_keys.ovpk_m, from_keys.ivpk_m, from)); TokenBlacklist::at(context.this_address())._increase_public_balance(to, amount).enqueue(&mut context); } @@ -218,9 +221,14 @@ contract TokenBlacklist { assert(nonce == 0, "invalid nonce"); } + let from_keys = get_public_keys(from); + let to_keys = get_public_keys(to); + let amount = U128::from_integer(amount); - storage.balances.sub(from, amount).emit(encode_and_encrypt_note_unconstrained(&mut context, from, from)); - storage.balances.add(to, amount).emit(encode_and_encrypt_note_unconstrained(&mut context, from, to)); + storage.balances.sub(from, amount).emit( + encode_and_encrypt_note_unconstrained(&mut context, from_keys.ovpk_m, from_keys.ivpk_m, from) + ); + storage.balances.add(to, amount).emit(encode_and_encrypt_note_unconstrained(&mut context, from_keys.ovpk_m, to_keys.ivpk_m, to)); } #[private] @@ -234,7 +242,8 @@ contract TokenBlacklist { assert(nonce == 0, "invalid nonce"); } - storage.balances.sub(from, U128::from_integer(amount)).emit(encode_and_encrypt_note(&mut context, from, from)); + let from_keys = get_public_keys(from); + storage.balances.sub(from, U128::from_integer(amount)).emit(encode_and_encrypt_note(&mut context, from_keys.ovpk_m, from_keys.ivpk_m, from)); TokenBlacklist::at(context.this_address())._reduce_total_supply(amount).enqueue(&mut context); } diff --git a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/token_note.nr b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/token_note.nr index 1dd1ed8aba7..8345b91b36b 100644 --- a/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/token_note.nr +++ b/noir-projects/noir-contracts/contracts/token_blacklist_contract/src/types/token_note.nr @@ -1,8 +1,8 @@ use dep::aztec::{ prelude::{NoteHeader, NullifiableNote, PrivateContext}, protocol_types::{constants::GENERATOR_INDEX__NOTE_NULLIFIER, hash::poseidon2_hash_with_separator}, - note::utils::compute_note_hash_for_nullify, oracle::unsafe_rand::unsafe_rand, - keys::getters::get_nsk_app, macros::notes::note + note::utils::compute_note_hash_for_nullify, oracle::random::random, keys::getters::get_nsk_app, + macros::notes::note }; trait OwnedNote { @@ -57,7 +57,14 @@ impl Eq for TokenNote { impl OwnedNote for TokenNote { fn new(amount: U128, owner_npk_m_hash: Field) -> Self { - Self { amount, npk_m_hash: owner_npk_m_hash, randomness: unsafe_rand(), header: NoteHeader::empty() } + // We use the randomness to preserve the privacy of the note recipient by preventing brute-forcing, so a + // malicious sender could use non-random values to make the note less private. But they already know the full + // note pre-image anyway, and so the recipient already trusts them to not disclose this information. We can + // therefore assume that the sender will cooperate in the random value generation. + let randomness = unsafe { + random() + }; + Self { amount, npk_m_hash: owner_npk_m_hash, randomness, header: NoteHeader::empty() } } fn get_amount(self) -> U128 { diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/main.nr b/noir-projects/noir-contracts/contracts/token_contract/src/main.nr index a5ec69962f3..54b9f2cd5c7 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/main.nr @@ -22,8 +22,8 @@ contract Token { context::{PrivateContext, PrivateCallInterface}, hash::compute_secret_hash, prelude::{NoteGetterOptions, Map, PublicMutable, SharedImmutable, PrivateSet, AztecAddress, FunctionSelector}, encrypted_logs::{ - encrypted_note_emission::{encode_and_encrypt_note_with_keys, encode_and_encrypt_note_with_keys_unconstrained}, - encrypted_event_emission::encode_and_encrypt_event_with_keys_unconstrained + encrypted_note_emission::{encode_and_encrypt_note, encode_and_encrypt_note_unconstrained}, + encrypted_event_emission::encode_and_encrypt_event_unconstrained }, keys::getters::get_public_keys, macros::{storage::storage, events::event, functions::{initializer, private, view, public}}, @@ -208,9 +208,7 @@ contract Token { fn privately_mint_private_note(amount: Field) { let caller = context.msg_sender(); let caller_keys = get_public_keys(caller); - storage.balances.at(caller).add(caller_keys.npk_m, U128::from_integer(amount)).emit( - encode_and_encrypt_note_with_keys(&mut context, caller_keys.ovpk_m, caller_keys.ivpk_m, caller) - ); + storage.balances.at(caller).add(caller_keys.npk_m, U128::from_integer(amount)).emit(encode_and_encrypt_note(&mut context, caller_keys.ovpk_m, caller_keys.ivpk_m, caller)); Token::at(context.this_address()).assert_minter_and_mint(context.msg_sender(), amount).enqueue(&mut context); } #[public] @@ -289,7 +287,7 @@ contract Token { let from = context.msg_sender(); let from_keys = get_public_keys(from); let to_keys = get_public_keys(to); - storage.balances.at(to).add(to_keys.npk_m, U128::from_integer(amount)).emit(encode_and_encrypt_note_with_keys(&mut context, from_keys.ovpk_m, to_keys.ivpk_m, to)); + storage.balances.at(to).add(to_keys.npk_m, U128::from_integer(amount)).emit(encode_and_encrypt_note(&mut context, from_keys.ovpk_m, to_keys.ivpk_m, to)); } // docs:end:redeem_shield // docs:start:unshield @@ -302,7 +300,7 @@ contract Token { } let from_keys = get_public_keys(from); - storage.balances.at(from).sub(from_keys.npk_m, U128::from_integer(amount)).emit(encode_and_encrypt_note_with_keys(&mut context, from_keys.ovpk_m, from_keys.ivpk_m, from)); + storage.balances.at(from).sub(from_keys.npk_m, U128::from_integer(amount)).emit(encode_and_encrypt_note(&mut context, from_keys.ovpk_m, from_keys.ivpk_m, from)); Token::at(context.this_address())._increase_public_balance(to, amount).enqueue(&mut context); } // docs:end:unshield @@ -329,18 +327,14 @@ contract Token { INITIAL_TRANSFER_CALL_MAX_NOTES ); storage.balances.at(from).add(from_keys.npk_m, change).emit( - encode_and_encrypt_note_with_keys_unconstrained(&mut context, from_keys.ovpk_m, from_keys.ivpk_m, from) - ); - storage.balances.at(to).add(to_keys.npk_m, amount).emit( - encode_and_encrypt_note_with_keys_unconstrained(&mut context, from_keys.ovpk_m, to_keys.ivpk_m, to) + encode_and_encrypt_note_unconstrained(&mut context, from_keys.ovpk_m, from_keys.ivpk_m, from) ); + storage.balances.at(to).add(to_keys.npk_m, amount).emit(encode_and_encrypt_note_unconstrained(&mut context, from_keys.ovpk_m, to_keys.ivpk_m, to)); // We don't constrain encryption of the note log in `transfer` (unlike in `transfer_from`) because the transfer // function is only designed to be used in situations where the event is not strictly necessary (e.g. payment to // another person where the payment is considered to be successful when the other party successfully decrypts a // note). - Transfer { from, to, amount: amount.to_field() }.emit( - encode_and_encrypt_event_with_keys_unconstrained(&mut context, from_keys.ovpk_m, to_keys.ivpk_m, to) - ); + Transfer { from, to, amount: amount.to_field() }.emit(encode_and_encrypt_event_unconstrained(&mut context, from_keys.ovpk_m, to_keys.ivpk_m, to)); } // docs:end:transfer #[contract_library_method] @@ -420,10 +414,10 @@ contract Token { let amount = U128::from_integer(amount); // docs:start:increase_private_balance // docs:start:encrypted - storage.balances.at(from).sub(from_keys.npk_m, amount).emit(encode_and_encrypt_note_with_keys(&mut context, from_keys.ovpk_m, from_keys.ivpk_m, from)); + storage.balances.at(from).sub(from_keys.npk_m, amount).emit(encode_and_encrypt_note(&mut context, from_keys.ovpk_m, from_keys.ivpk_m, from)); // docs:end:encrypted // docs:end:increase_private_balance - storage.balances.at(to).add(to_keys.npk_m, amount).emit(encode_and_encrypt_note_with_keys(&mut context, from_keys.ovpk_m, to_keys.ivpk_m, to)); + storage.balances.at(to).add(to_keys.npk_m, amount).emit(encode_and_encrypt_note(&mut context, from_keys.ovpk_m, to_keys.ivpk_m, to)); } // docs:end:transfer_from // docs:start:burn @@ -435,7 +429,7 @@ contract Token { assert(nonce == 0, "invalid nonce"); } let from_keys = get_public_keys(from); - storage.balances.at(from).sub(from_keys.npk_m, U128::from_integer(amount)).emit(encode_and_encrypt_note_with_keys(&mut context, from_keys.ovpk_m, from_keys.ivpk_m, from)); + storage.balances.at(from).sub(from_keys.npk_m, U128::from_integer(amount)).emit(encode_and_encrypt_note(&mut context, from_keys.ovpk_m, from_keys.ivpk_m, from)); Token::at(context.this_address())._reduce_total_supply(amount).enqueue(&mut context); } // docs:end:burn @@ -485,7 +479,7 @@ contract Token { INITIAL_TRANSFER_CALL_MAX_NOTES ); storage.balances.at(user).add(user_keys.npk_m, change).emit( - encode_and_encrypt_note_with_keys_unconstrained(&mut context, user_keys.ovpk_m, user_keys.ivpk_m, user) + encode_and_encrypt_note_unconstrained(&mut context, user_keys.ovpk_m, user_keys.ivpk_m, user) ); // 4. Now we get the note hiding points. let mut fee_payer_point = TokenNote::hiding_point().new( diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/test/burn.nr b/noir-projects/noir-contracts/contracts/token_contract/src/test/burn.nr index 99d71bf0bd9..be4f0eb788e 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/test/burn.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/test/burn.nr @@ -1,5 +1,5 @@ use crate::test::utils; -use dep::aztec::oracle::unsafe_rand::unsafe_rand; +use dep::aztec::oracle::random::random; use dep::authwit::cheatcodes as authwit_cheatcodes; use crate::Token; @@ -20,7 +20,7 @@ unconstrained fn burn_public_on_behalf_of_other() { let burn_amount = mint_amount / 10; // Burn on behalf of other - let burn_call_interface = Token::at(token_contract_address).burn_public(owner, burn_amount, unsafe_rand()); + let burn_call_interface = Token::at(token_contract_address).burn_public(owner, burn_amount, random()); authwit_cheatcodes::add_public_authwit_from_call_interface(owner, recipient, burn_call_interface); // Impersonate recipient to perform the call env.impersonate(recipient); @@ -46,7 +46,7 @@ unconstrained fn burn_public_failure_on_behalf_of_self_non_zero_nonce() { // Burn on behalf of self with non-zero nonce let burn_amount = mint_amount / 10; - let burn_call_interface = Token::at(token_contract_address).burn_public(owner, burn_amount, unsafe_rand()); + let burn_call_interface = Token::at(token_contract_address).burn_public(owner, burn_amount, random()); env.assert_public_call_fails(burn_call_interface); utils::check_public_balance(token_contract_address, owner, mint_amount); } @@ -57,14 +57,14 @@ unconstrained fn burn_public_failure_on_behalf_of_other_without_approval() { // Burn on behalf of other without approval let burn_amount = mint_amount / 10; - let burn_call_interface = Token::at(token_contract_address).burn_public(owner, burn_amount, unsafe_rand()); + let burn_call_interface = Token::at(token_contract_address).burn_public(owner, burn_amount, random()); // Impersonate recipient to perform the call env.impersonate(recipient); env.assert_public_call_fails(burn_call_interface); utils::check_public_balance(token_contract_address, owner, mint_amount); // Burn on behalf of other, wrong designated caller - let burn_call_interface = Token::at(token_contract_address).burn_public(owner, burn_amount, unsafe_rand()); + let burn_call_interface = Token::at(token_contract_address).burn_public(owner, burn_amount, random()); authwit_cheatcodes::add_public_authwit_from_call_interface(owner, owner, burn_call_interface); // Impersonate recipient to perform the call env.impersonate(recipient); @@ -78,7 +78,7 @@ unconstrained fn burn_public_failure_on_behalf_of_other_wrong_caller() { // Burn on behalf of other, wrong designated caller let burn_amount = mint_amount / 10; - let burn_call_interface = Token::at(token_contract_address).burn_public(owner, burn_amount, unsafe_rand()); + let burn_call_interface = Token::at(token_contract_address).burn_public(owner, burn_amount, random()); authwit_cheatcodes::add_public_authwit_from_call_interface(owner, owner, burn_call_interface); // Impersonate recipient to perform the call env.impersonate(recipient); @@ -103,7 +103,7 @@ unconstrained fn burn_private_on_behalf_of_other() { let burn_amount = mint_amount / 10; // Burn on behalf of other - let burn_call_interface = Token::at(token_contract_address).burn(owner, burn_amount, unsafe_rand()); + let burn_call_interface = Token::at(token_contract_address).burn(owner, burn_amount, random()); authwit_cheatcodes::add_private_authwit_from_call_interface(owner, recipient, burn_call_interface); // Impersonate recipient to perform the call env.impersonate(recipient); @@ -129,7 +129,7 @@ unconstrained fn burn_private_failure_on_behalf_of_self_non_zero_nonce() { // Burn more than balance let burn_amount = mint_amount / 10; - let burn_call_interface = Token::at(token_contract_address).burn(owner, burn_amount, unsafe_rand()); + let burn_call_interface = Token::at(token_contract_address).burn(owner, burn_amount, random()); env.call_private_void(burn_call_interface); // Private doesnt revert, so we cannot check balances here since notes have already been nullified. Test is done. } @@ -141,7 +141,7 @@ unconstrained fn burn_private_failure_on_behalf_of_other_more_than_balance() { // Burn more than balance let burn_amount = mint_amount * 10; // Burn on behalf of other - let burn_call_interface = Token::at(token_contract_address).burn(owner, burn_amount, unsafe_rand()); + let burn_call_interface = Token::at(token_contract_address).burn(owner, burn_amount, random()); authwit_cheatcodes::add_private_authwit_from_call_interface(owner, recipient, burn_call_interface); // Impersonate recipient to perform the call env.impersonate(recipient); @@ -156,7 +156,7 @@ unconstrained fn burn_private_failure_on_behalf_of_other_without_approval() { // Burn more than balance let burn_amount = mint_amount / 10; // Burn on behalf of other - let burn_call_interface = Token::at(token_contract_address).burn(owner, burn_amount, unsafe_rand()); + let burn_call_interface = Token::at(token_contract_address).burn(owner, burn_amount, random()); // Impersonate recipient to perform the call env.impersonate(recipient); env.call_private_void(burn_call_interface); @@ -170,7 +170,7 @@ unconstrained fn burn_private_failure_on_behalf_of_other_wrong_designated_caller // Burn more than balance let burn_amount = mint_amount / 10; // Burn on behalf of other - let burn_call_interface = Token::at(token_contract_address).burn(owner, burn_amount, unsafe_rand()); + let burn_call_interface = Token::at(token_contract_address).burn(owner, burn_amount, random()); authwit_cheatcodes::add_private_authwit_from_call_interface(owner, owner, burn_call_interface); // Impersonate recipient to perform the call env.impersonate(recipient); diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/test/minting.nr b/noir-projects/noir-contracts/contracts/token_contract/src/test/minting.nr index b8064eabf75..de65b5dbab7 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/test/minting.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/test/minting.nr @@ -1,5 +1,5 @@ use crate::test::utils; -use dep::aztec::{test::helpers::cheatcodes, oracle::unsafe_rand::unsafe_rand, hash::compute_secret_hash}; +use dep::aztec::{test::helpers::cheatcodes, oracle::random::random, hash::compute_secret_hash}; use crate::{types::transparent_note::TransparentNote, Token}; #[test] @@ -63,7 +63,7 @@ unconstrained fn mint_private_success() { let (env, token_contract_address, owner, _) = utils::setup(/* with_account_contracts */ false); let mint_amount = 10000; // Mint some tokens - let secret = unsafe_rand(); + let secret = random(); let secret_hash = compute_secret_hash(secret); let mint_private_call_interface = Token::at(token_contract_address).mint_private(mint_amount, secret_hash); env.call_public(mint_private_call_interface); @@ -94,7 +94,7 @@ unconstrained fn mint_private_failure_double_spend() { let (env, token_contract_address, owner, recipient) = utils::setup(/* with_account_contracts */ false); let mint_amount = 10000; // Mint some tokens - let secret = unsafe_rand(); + let secret = random(); let secret_hash = compute_secret_hash(secret); let mint_private_call_interface = Token::at(token_contract_address).mint_private(mint_amount, secret_hash); env.call_public(mint_private_call_interface); @@ -131,7 +131,7 @@ unconstrained fn mint_private_failure_non_minter() { // Try to mint some tokens impersonating recipient env.impersonate(recipient); - let secret = unsafe_rand(); + let secret = random(); let secret_hash = compute_secret_hash(secret); let mint_private_call_interface = Token::at(token_contract_address).mint_private(mint_amount, secret_hash); env.call_public(mint_private_call_interface); @@ -144,7 +144,7 @@ unconstrained fn mint_private_failure_overflow() { // Overflow recipient let mint_amount = 2.pow_32(128); - let secret = unsafe_rand(); + let secret = random(); let secret_hash = compute_secret_hash(secret); let mint_private_call_interface = Token::at(token_contract_address).mint_private(mint_amount, secret_hash); env.call_public(mint_private_call_interface); @@ -156,7 +156,7 @@ unconstrained fn mint_private_failure_overflow_recipient() { let (env, token_contract_address, owner, _) = utils::setup(/* with_account_contracts */ false); let mint_amount = 10000; // Mint some tokens - let secret = unsafe_rand(); + let secret = random(); let secret_hash = compute_secret_hash(secret); let mint_private_call_interface = Token::at(token_contract_address).mint_private(mint_amount, secret_hash); env.call_public(mint_private_call_interface); @@ -179,7 +179,7 @@ unconstrained fn mint_private_failure_overflow_recipient() { let mint_amount = 2.pow_32(128) - mint_amount; // Mint some tokens - let secret = unsafe_rand(); + let secret = random(); let secret_hash = compute_secret_hash(secret); let mint_private_call_interface = Token::at(token_contract_address).mint_private(mint_amount, secret_hash); env.call_public(mint_private_call_interface); @@ -191,8 +191,8 @@ unconstrained fn mint_private_failure_overflow_total_supply() { let (env, token_contract_address, owner, recipient) = utils::setup(/* with_account_contracts */ false); let mint_amount = 10000; // Mint some tokens - let secret_owner = unsafe_rand(); - let secret_recipient = unsafe_rand(); + let secret_owner = random(); + let secret_recipient = random(); let secret_hash_owner = compute_secret_hash(secret_owner); let secret_hash_recipient = compute_secret_hash(secret_recipient); @@ -232,7 +232,7 @@ unconstrained fn mint_private_failure_overflow_total_supply() { env.impersonate(owner); let mint_amount = 2.pow_32(128) - 2 * mint_amount; // Try to mint some tokens - let secret = unsafe_rand(); + let secret = random(); let secret_hash = compute_secret_hash(secret); let mint_private_call_interface = Token::at(token_contract_address).mint_private(mint_amount, secret_hash); env.call_public(mint_private_call_interface); diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/test/shielding.nr b/noir-projects/noir-contracts/contracts/token_contract/src/test/shielding.nr index 7e7eb3e5dc2..2f671cb9aa5 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/test/shielding.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/test/shielding.nr @@ -1,5 +1,5 @@ use crate::test::utils; -use dep::aztec::{oracle::unsafe_rand::unsafe_rand, hash::compute_secret_hash}; +use dep::aztec::{oracle::random::random, hash::compute_secret_hash}; use dep::authwit::cheatcodes as authwit_cheatcodes; use crate::{types::transparent_note::TransparentNote, Token}; @@ -7,7 +7,7 @@ use crate::{types::transparent_note::TransparentNote, Token}; unconstrained fn shielding_on_behalf_of_self() { // Setup without account contracts. We are not using authwits here, so dummy accounts are enough let (env, token_contract_address, owner, _, mint_amount) = utils::setup_and_mint(/* with_account_contracts */ false); - let secret = unsafe_rand(); + let secret = random(); let secret_hash = compute_secret_hash(secret); // Shield tokens let shield_amount = mint_amount / 10; @@ -33,7 +33,7 @@ unconstrained fn shielding_on_behalf_of_self() { #[test] unconstrained fn shielding_on_behalf_of_other() { let (env, token_contract_address, owner, recipient, mint_amount) = utils::setup_and_mint(/* with_account_contracts */ true); - let secret = unsafe_rand(); + let secret = random(); let secret_hash = compute_secret_hash(secret); // Shield tokens on behalf of owner @@ -67,7 +67,7 @@ unconstrained fn shielding_on_behalf_of_other() { unconstrained fn shielding_failure_on_behalf_of_self_more_than_balance() { // Setup without account contracts. We are not using authwits here, so dummy accounts are enough let (env, token_contract_address, owner, _, mint_amount) = utils::setup_and_mint(/* with_account_contracts */ true); - let secret = unsafe_rand(); + let secret = random(); let secret_hash = compute_secret_hash(secret); // Shield tokens let shield_amount = mint_amount + 1; @@ -83,11 +83,11 @@ unconstrained fn shielding_failure_on_behalf_of_self_more_than_balance() { unconstrained fn shielding_failure_on_behalf_of_self_invalid_nonce() { // Setup without account contracts. We are not using authwits here, so dummy accounts are enough let (env, token_contract_address, owner, _, mint_amount) = utils::setup_and_mint(/* with_account_contracts */ true); - let secret = unsafe_rand(); + let secret = random(); let secret_hash = compute_secret_hash(secret); // Shield tokens let shield_amount = mint_amount / 10; - let shield_call_interface = Token::at(token_contract_address).shield(owner, shield_amount, secret_hash, unsafe_rand()); + let shield_call_interface = Token::at(token_contract_address).shield(owner, shield_amount, secret_hash, random()); env.assert_public_call_fails(shield_call_interface); // Check balances @@ -99,7 +99,7 @@ unconstrained fn shielding_failure_on_behalf_of_self_invalid_nonce() { unconstrained fn shielding_failure_on_behalf_of_other_more_than_balance() { // Setup without account contracts. We are not using authwits here, so dummy accounts are enough let (env, token_contract_address, owner, recipient, mint_amount) = utils::setup_and_mint(/* with_account_contracts */ true); - let secret = unsafe_rand(); + let secret = random(); let secret_hash = compute_secret_hash(secret); // Shield tokens on behalf of owner let shield_amount = mint_amount + 1; @@ -119,7 +119,7 @@ unconstrained fn shielding_failure_on_behalf_of_other_more_than_balance() { unconstrained fn shielding_failure_on_behalf_of_other_wrong_caller() { // Setup without account contracts. We are not using authwits here, so dummy accounts are enough let (env, token_contract_address, owner, recipient, mint_amount) = utils::setup_and_mint(/* with_account_contracts */ true); - let secret = unsafe_rand(); + let secret = random(); let secret_hash = compute_secret_hash(secret); // Shield tokens on behalf of owner let shield_amount = mint_amount + 1; @@ -139,7 +139,7 @@ unconstrained fn shielding_failure_on_behalf_of_other_wrong_caller() { unconstrained fn shielding_failure_on_behalf_of_other_without_approval() { // Setup without account contracts. We are not using authwits here, so dummy accounts are enough let (env, token_contract_address, owner, recipient, mint_amount) = utils::setup_and_mint(/* with_account_contracts */ true); - let secret = unsafe_rand(); + let secret = random(); let secret_hash = compute_secret_hash(secret); // Shield tokens on behalf of owner let shield_amount = mint_amount + 1; @@ -153,4 +153,3 @@ unconstrained fn shielding_failure_on_behalf_of_other_without_approval() { utils::check_public_balance(token_contract_address, owner, mint_amount); utils::check_private_balance(token_contract_address, owner, mint_amount); } - diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/test/transfer_public.nr b/noir-projects/noir-contracts/contracts/token_contract/src/test/transfer_public.nr index 65b1cbf612b..13e389d6f31 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/test/transfer_public.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/test/transfer_public.nr @@ -1,5 +1,5 @@ use crate::test::utils; -use dep::aztec::oracle::unsafe_rand::unsafe_rand; +use dep::aztec::oracle::random::random; use dep::authwit::cheatcodes as authwit_cheatcodes; use crate::Token; @@ -69,7 +69,7 @@ unconstrained fn public_transfer_failure_on_behalf_of_self_non_zero_nonce() { let (env, token_contract_address, owner, recipient, mint_amount) = utils::setup_and_mint(/* with_account_contracts */ false); // Transfer tokens let transfer_amount = mint_amount / 10; - let public_transfer_call_interface = Token::at(token_contract_address).transfer_public(owner, recipient, transfer_amount, unsafe_rand()); + let public_transfer_call_interface = Token::at(token_contract_address).transfer_public(owner, recipient, transfer_amount, random()); // Try to transfer tokens env.call_public(public_transfer_call_interface); } diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/test/unshielding.nr b/noir-projects/noir-contracts/contracts/token_contract/src/test/unshielding.nr index 061cf29e686..50ce65ec2a3 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/test/unshielding.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/test/unshielding.nr @@ -1,5 +1,5 @@ use crate::test::utils; -use dep::aztec::oracle::unsafe_rand::unsafe_rand; +use dep::aztec::oracle::random::random; use dep::authwit::cheatcodes as authwit_cheatcodes; use crate::Token; @@ -46,7 +46,7 @@ unconstrained fn unshield_failure_on_behalf_of_self_non_zero_nonce() { let (env, token_contract_address, owner, _, mint_amount) = utils::setup_and_mint(/* with_account_contracts */ false); let unshield_amount = mint_amount + 1; - let unshield_call_interface = Token::at(token_contract_address).unshield(owner, owner, unshield_amount, unsafe_rand()); + let unshield_call_interface = Token::at(token_contract_address).unshield(owner, owner, unshield_amount, random()); env.call_private_void(unshield_call_interface); } diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/test/utils.nr b/noir-projects/noir-contracts/contracts/token_contract/src/test/utils.nr index 76ef268271d..89e3dc5ca36 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/test/utils.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/test/utils.nr @@ -2,7 +2,7 @@ use dep::aztec::{ hash::compute_secret_hash, prelude::AztecAddress, test::helpers::{cheatcodes, test_environment::TestEnvironment}, protocol_types::storage::map::derive_storage_slot_in_map, - oracle::{execution::{get_block_number, get_contract_address}, unsafe_rand::unsafe_rand, storage::storage_read} + oracle::{execution::{get_block_number, get_contract_address}, random::random, storage::storage_read} }; use crate::{types::transparent_note::TransparentNote, Token}; @@ -43,7 +43,7 @@ unconstrained pub fn setup_and_mint(with_account_contracts: bool) -> (&mut TestE let (env, token_contract_address, owner, recipient) = setup(with_account_contracts); let mint_amount = 10000; // Mint some tokens - let secret = unsafe_rand(); + let secret = random(); let secret_hash = compute_secret_hash(secret); let mint_private_call_interface = Token::at(token_contract_address).mint_private(mint_amount, secret_hash); env.call_public(mint_private_call_interface); diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/types/token_note.nr b/noir-projects/noir-contracts/contracts/token_contract/src/types/token_note.nr index f1133488ad3..8501b17c014 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/types/token_note.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/types/token_note.nr @@ -1,8 +1,8 @@ use dep::aztec::{ prelude::{NoteHeader, NullifiableNote, PrivateContext}, protocol_types::{constants::GENERATOR_INDEX__NOTE_NULLIFIER, hash::poseidon2_hash_with_separator}, - note::utils::compute_note_hash_for_nullify, oracle::unsafe_rand::unsafe_rand, - keys::getters::get_nsk_app, macros::notes::partial_note + note::utils::compute_note_hash_for_nullify, oracle::random::random, keys::getters::get_nsk_app, + macros::notes::partial_note }; trait OwnedNote { @@ -56,7 +56,14 @@ impl Eq for TokenNote { impl OwnedNote for TokenNote { fn new(amount: U128, owner_npk_m_hash: Field) -> Self { - Self { amount, npk_m_hash: owner_npk_m_hash, randomness: unsafe_rand(), header: NoteHeader::empty() } + // We use the randomness to preserve the privacy of the note recipient by preventing brute-forcing, so a + // malicious sender could use non-random values to make the note less private. But they already know the full + // note pre-image anyway, and so the recipient already trusts them to not disclose this information. We can + // therefore assume that the sender will cooperate in the random value generation. + let randomness = unsafe { + random() + }; + Self { amount, npk_m_hash: owner_npk_m_hash, randomness, header: NoteHeader::empty() } } fn get_amount(self) -> U128 { diff --git a/noir-projects/noir-protocol-circuits/.gitignore b/noir-projects/noir-protocol-circuits/.gitignore index 4c8c0b757be..d07185e4441 100644 --- a/noir-projects/noir-protocol-circuits/.gitignore +++ b/noir-projects/noir-protocol-circuits/.gitignore @@ -2,4 +2,5 @@ Prover.toml Verifier.toml target crates/autogenerated -/Nargo.toml \ No newline at end of file +/Nargo.toml +/private_kernel_reset_dimensions.json \ No newline at end of file diff --git a/noir-projects/noir-protocol-circuits/Nargo.template.toml b/noir-projects/noir-protocol-circuits/Nargo.template.toml index 4aa888cb7e7..7cb2f3c88ce 100644 --- a/noir-projects/noir-protocol-circuits/Nargo.template.toml +++ b/noir-projects/noir-protocol-circuits/Nargo.template.toml @@ -34,6 +34,6 @@ members = [ "crates/rollup-base-simulated", "crates/rollup-block-merge", "crates/rollup-block-root", - "crates/rollup-block-root-final", + "crates/rollup-block-root-empty", "crates/rollup-root", ] diff --git a/noir-projects/noir-protocol-circuits/bootstrap.sh b/noir-projects/noir-protocol-circuits/bootstrap.sh index ebc4e25f773..6435a258b43 100755 --- a/noir-projects/noir-protocol-circuits/bootstrap.sh +++ b/noir-projects/noir-protocol-circuits/bootstrap.sh @@ -16,7 +16,7 @@ if [ -n "$CMD" ]; then fi yarn -node ./generate_variants.js +node ./scripts/generate_variants.js echo "Compiling protocol circuits..." NARGO=${NARGO:-../../noir/noir-repo/target/release/nargo} diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/previous_kernel_validator.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/previous_kernel_validator.nr index a3a6f2f0882..5173f4f03b7 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/previous_kernel_validator.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/previous_kernel_validator.nr @@ -2,23 +2,30 @@ mod previous_kernel_validator_hints; use crate::components::previous_kernel_validator::previous_kernel_validator_hints::{generate_previous_kernel_validator_hints, PreviousKernelValidatorHints}; use dep::types::{ - abis::{kernel_circuit_public_inputs::PrivateKernelCircuitPublicInputs, log_hash::ScopedEncryptedLogHash}, + abis::{log_hash::ScopedEncryptedLogHash, private_kernel_data::PrivateKernelData}, address::AztecAddress, traits::is_empty, utils::arrays::array_length }; pub struct PreviousKernelValidator { - previous_kernel: PrivateKernelCircuitPublicInputs, + previous_kernel: PrivateKernelData, hints: PreviousKernelValidatorHints, } impl PreviousKernelValidator { - pub fn new(previous_kernel: PrivateKernelCircuitPublicInputs) -> Self { + pub fn new(previous_kernel: PrivateKernelData) -> Self { let hints = unsafe { - generate_previous_kernel_validator_hints(previous_kernel) + generate_previous_kernel_validator_hints(previous_kernel.public_inputs) }; PreviousKernelValidator { previous_kernel, hints } } + pub fn validate_proof(_self: Self, _allowed_indices: [u32; N]) { + if !dep::std::runtime::is_unconstrained() { + // TODO(#7410) currently stubbed out until tube vk handled + // self.previous_kernel.validate_in_vk_tree(allowed_indices); + } + } + pub fn validate_for_private_tail(self) { self.validate_common(); self.validate_empty_data(); @@ -39,53 +46,55 @@ impl PreviousKernelValidator { fn validate_empty_private_call_stack(self) { // Only need to check the first item as the kernel circuits always append items to the arrays properly. assert( - is_empty(self.previous_kernel.end.private_call_stack[0]), "Private call stack must be empty when executing the tail circuit" + is_empty(self.previous_kernel.public_inputs.end.private_call_stack[0]), "Private call stack must be empty when executing the tail circuit" ); } fn validate_empty_data(self) { assert( - is_empty(self.previous_kernel.end.public_call_requests[0]), "Public call stack must be empty when executing the tail circuit" + is_empty(self.previous_kernel.public_inputs.end.public_call_requests[0]), "Public call stack must be empty when executing the tail circuit" ); assert( - is_empty(self.previous_kernel.public_teardown_call_request), "Public teardown call request must be empty when executing the tail circuit" + is_empty(self.previous_kernel.public_inputs.public_teardown_call_request), "Public teardown call request must be empty when executing the tail circuit" ); - if self.previous_kernel.validation_requests.split_counter.is_some() { + if self.previous_kernel.public_inputs.validation_requests.split_counter.is_some() { // Even when min_revertible_side_effect_counter could be non-zero in a pure private tx. // The split counter must be 0 to ensure that all the transient data are squashed. assert_eq( - self.previous_kernel.validation_requests.split_counter.unwrap_unchecked(), 0, "split_counter must be 0 for pure private tx" + self.previous_kernel.public_inputs.validation_requests.split_counter.unwrap_unchecked(), 0, "split_counter must be 0 for pure private tx" ); } } fn validate_non_empty_data(self) { assert( - !is_empty(self.previous_kernel.end.public_call_requests[0]) - | !is_empty(self.previous_kernel.public_teardown_call_request), "Must have public calls when exporting public kernel data from the tail circuit" + !is_empty(self.previous_kernel.public_inputs.end.public_call_requests[0]) + | !is_empty(self.previous_kernel.public_inputs.public_teardown_call_request), "Must have public calls when exporting public kernel data from the tail circuit" ); assert( - self.previous_kernel.min_revertible_side_effect_counter != 0, "min_revertible_side_effect_counter must not be 0" + self.previous_kernel.public_inputs.min_revertible_side_effect_counter != 0, "min_revertible_side_effect_counter must not be 0" ); - if self.previous_kernel.validation_requests.split_counter.is_some() { + if self.previous_kernel.public_inputs.validation_requests.split_counter.is_some() { assert_eq( - self.previous_kernel.validation_requests.split_counter.unwrap_unchecked(), self.previous_kernel.min_revertible_side_effect_counter, "split_counter does not match min_revertible_side_effect_counter" + self.previous_kernel.public_inputs.validation_requests.split_counter.unwrap_unchecked(), self.previous_kernel.public_inputs.min_revertible_side_effect_counter, "split_counter does not match min_revertible_side_effect_counter" ); } } fn verify_empty_validation_requests(self) { assert( - is_empty(self.previous_kernel.validation_requests.note_hash_read_requests[0]), "Non empty note hash read requests" + is_empty(self.previous_kernel.public_inputs.validation_requests.note_hash_read_requests[0]), "Non empty note hash read requests" ); assert( - is_empty(self.previous_kernel.validation_requests.nullifier_read_requests[0]), "Non empty nullifier read requests" + is_empty(self.previous_kernel.public_inputs.validation_requests.nullifier_read_requests[0]), "Non empty nullifier read requests" ); assert( - is_empty(self.previous_kernel.validation_requests.scoped_key_validation_requests_and_generators[0]), "Non empty key validation requests" + is_empty( + self.previous_kernel.public_inputs.validation_requests.scoped_key_validation_requests_and_generators[0] + ), "Non empty key validation requests" ); } @@ -93,36 +102,36 @@ impl PreviousKernelValidator { // Check that the data are already siloed and/or sorted in the reset circuit. // Any unprocessed data added after the last reset with siloing was called should be caught here. - let num_note_hashes = array_length(self.previous_kernel.end.note_hashes); + let num_note_hashes = array_length(self.previous_kernel.public_inputs.end.note_hashes); if num_note_hashes != 0 { - let note_hash = self.previous_kernel.end.note_hashes[num_note_hashes - 1]; + let note_hash = self.previous_kernel.public_inputs.end.note_hashes[num_note_hashes - 1]; assert_eq( note_hash.contract_address, AztecAddress::zero(), "note hashes have not been siloed in a reset" ); } - let num_nullifiers = array_length(self.previous_kernel.end.nullifiers); - let nullifier = self.previous_kernel.end.nullifiers[num_nullifiers - 1]; // - 1 without checking because there's at least 1 nullifier. + let num_nullifiers = array_length(self.previous_kernel.public_inputs.end.nullifiers); + let nullifier = self.previous_kernel.public_inputs.end.nullifiers[num_nullifiers - 1]; // - 1 without checking because there's at least 1 nullifier. assert_eq( nullifier.contract_address, AztecAddress::zero(), "nullifiers have not been siloed in a reset" ); // Note logs are not siloed, but they are sorted and their note_hash_counter should've been set to 0 in the reset circuit. - let num_note_logs = array_length(self.previous_kernel.end.note_encrypted_logs_hashes); + let num_note_logs = array_length(self.previous_kernel.public_inputs.end.note_encrypted_logs_hashes); if num_note_logs != 0 { - let note_log = self.previous_kernel.end.note_encrypted_logs_hashes[num_note_logs - 1]; + let note_log = self.previous_kernel.public_inputs.end.note_encrypted_logs_hashes[num_note_logs - 1]; assert_eq(note_log.note_hash_counter, 0, "note logs have not been sorted in a reset"); } // We need to check the entire array because randomness can be 0 for encrypted logs if the app wants to reveal the actual contract address. assert( - self.previous_kernel.end.encrypted_logs_hashes.all(|h: ScopedEncryptedLogHash| h.log_hash.randomness == 0), "encrypted logs have not been siloed in a reset" + self.previous_kernel.public_inputs.end.encrypted_logs_hashes.all(|h: ScopedEncryptedLogHash| h.log_hash.randomness == 0), "encrypted logs have not been siloed in a reset" ); } fn validate_no_transient_data(self) { - let nullifiers = self.previous_kernel.end.nullifiers; - let note_hashes = self.previous_kernel.end.note_hashes; + let nullifiers = self.previous_kernel.public_inputs.end.nullifiers; + let note_hashes = self.previous_kernel.public_inputs.end.note_hashes; let note_hash_indexes_for_nullifiers = self.hints.note_hash_indexes_for_nullifiers; for i in 0..nullifiers.len() { let nullifier = nullifiers[i]; diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/reset_output_validator.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/reset_output_validator.nr index 9d2c6682f90..f0036c3dd03 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/reset_output_validator.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/reset_output_validator.nr @@ -63,17 +63,7 @@ impl< self.validation_request_processor.validate(self.output.validation_requests); - verify_squashed_transient_data( - self.previous_kernel.end.note_hashes, - self.previous_kernel.end.nullifiers, - self.previous_kernel.end.note_encrypted_logs_hashes, - self.hints.kept_note_hashes, - self.hints.kept_nullifiers, - self.hints.kept_note_encrypted_log_hashes, - self.transient_data_index_hints, - self.hints.transient_or_propagated_note_hash_indexes_for_logs, - self.output.validation_requests.split_counter.unwrap_unchecked() - ); + self.validate_transient_data(); self.validate_sorted_siloed_data(); } @@ -96,6 +86,29 @@ impl< assert_eq(self.output.end.private_call_stack, self.previous_kernel.end.private_call_stack); } + fn validate_transient_data(self) { + if NUM_TRANSIENT_DATA_INDEX_HINTS == 0 { + assert_eq( + self.hints.kept_note_hashes, self.previous_kernel.end.note_hashes, "mismatch kept note hashes" + ); + assert_eq( + self.hints.kept_nullifiers, self.previous_kernel.end.nullifiers, "mismatch kept nullifiers" + ); + } else { + verify_squashed_transient_data( + self.previous_kernel.end.note_hashes, + self.previous_kernel.end.nullifiers, + self.previous_kernel.end.note_encrypted_logs_hashes, + self.hints.kept_note_hashes, + self.hints.kept_nullifiers, + self.hints.kept_note_encrypted_log_hashes, + self.transient_data_index_hints, + self.hints.transient_or_propagated_note_hash_indexes_for_logs, + self.output.validation_requests.split_counter.unwrap_unchecked() + ); + } + } + fn validate_sorted_siloed_data(self) { // note_hashes // note_encrypted_logs_hashes diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_inner.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_inner.nr index f5e70ebe1d2..06d0690ea71 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_inner.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_inner.nr @@ -1,5 +1,6 @@ use crate::{ components::{ + previous_kernel_validator::PreviousKernelValidator, private_call_data_validator::PrivateCallDataValidator, private_kernel_circuit_output_validator::PrivateKernelCircuitOutputValidator, private_kernel_circuit_public_inputs_composer::PrivateKernelCircuitPublicInputsComposer @@ -10,21 +11,13 @@ use dep::types::{ kernel_circuit_public_inputs::{PrivateKernelCircuitPublicInputs, PrivateKernelCircuitPublicInputsArrayLengths}, private_kernel_data::PrivateKernelData, private_kernel::private_call_data::PrivateCallData }, - constants::{ - PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX, PRIVATE_KERNEL_RESET_FULL_INDEX, - PRIVATE_KERNEL_RESET_BIG_INDEX, PRIVATE_KERNEL_RESET_MEDIUM_INDEX, PRIVATE_KERNEL_RESET_SMALL_INDEX, - PRIVATE_KERNEL_RESET_TINY_INDEX -} + constants::{PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX, PRIVATE_KERNEL_RESET_INDEX} }; global ALLOWED_PREVIOUS_CIRCUITS = [ PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX, - PRIVATE_KERNEL_RESET_FULL_INDEX, - PRIVATE_KERNEL_RESET_BIG_INDEX, - PRIVATE_KERNEL_RESET_MEDIUM_INDEX, - PRIVATE_KERNEL_RESET_SMALL_INDEX, - PRIVATE_KERNEL_RESET_TINY_INDEX, + PRIVATE_KERNEL_RESET_INDEX, ]; pub struct PrivateKernelInnerCircuitPrivateInputs { @@ -47,6 +40,9 @@ impl PrivateKernelInnerCircuitPrivateInputs { }; // Validate inputs. + let previous_kernel_validator = PreviousKernelValidator::new(self.previous_kernel); + previous_kernel_validator.validate_proof(ALLOWED_PREVIOUS_CIRCUITS); + let private_call_data_validator = PrivateCallDataValidator::new(self.private_call); let previous_kernel_array_lengths = PrivateKernelCircuitPublicInputsArrayLengths::new(self.previous_kernel.public_inputs); let private_call_stack_size = previous_kernel_array_lengths.private_call_stack; @@ -54,10 +50,6 @@ impl PrivateKernelInnerCircuitPrivateInputs { private_call_data_validator.validate_against_call_request(call_request); private_call_data_validator.validate_against_previous_kernel(self.previous_kernel.public_inputs); private_call_data_validator.validate(output.end.note_hashes); - if !std::runtime::is_unconstrained() { - // TODO(#7410) currently stubbed out until tube vk handled - // self.previous_kernel.validate_in_vk_tree(ALLOWED_PREVIOUS_CIRCUITS); - } // Validate output. if dep::types::validate::should_validate_output() { diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_reset.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_reset.nr index 2a3532fe1e5..140c66bb34e 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_reset.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_reset.nr @@ -1,4 +1,5 @@ use crate::components::{ + previous_kernel_validator::PreviousKernelValidator, reset_output_composer::{ResetOutputComposer, ResetOutputHints}, reset_output_validator::ResetOutputValidator }; @@ -8,12 +9,14 @@ use dep::reset_kernel_lib::{ }; use dep::types::{ abis::private_kernel_data::PrivateKernelData, - constants::{PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX}, PrivateKernelCircuitPublicInputs + constants::{PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX, PRIVATE_KERNEL_RESET_INDEX}, + PrivateKernelCircuitPublicInputs }; global ALLOWED_PREVIOUS_CIRCUITS = [ PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX, + PRIVATE_KERNEL_RESET_INDEX ]; pub struct PrivateKernelResetHints { @@ -85,10 +88,8 @@ impl< }; // Validate inputs. - if !std::runtime::is_unconstrained() { - // TODO(#7410) currently stubbed out until tube vk handled - // self.previous_kernel.validate_in_vk_tree(ALLOWED_PREVIOUS_CIRCUITS); - } + let previous_kernel_validator = PreviousKernelValidator::new(self.previous_kernel); + previous_kernel_validator.validate_proof(ALLOWED_PREVIOUS_CIRCUITS); // Validate output. if dep::types::validate::should_validate_output() { diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail.nr index a64716f8c3c..ac5a26a9f0d 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail.nr @@ -4,21 +4,13 @@ use crate::components::{ }; use dep::types::{ abis::{private_kernel_data::PrivateKernelData, kernel_circuit_public_inputs::KernelCircuitPublicInputs}, - constants::{ - PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX, PRIVATE_KERNEL_RESET_FULL_INDEX, - PRIVATE_KERNEL_RESET_BIG_INDEX, PRIVATE_KERNEL_RESET_MEDIUM_INDEX, PRIVATE_KERNEL_RESET_SMALL_INDEX, - PRIVATE_KERNEL_RESET_TINY_INDEX -} + constants::{PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX, PRIVATE_KERNEL_RESET_INDEX} }; global ALLOWED_PREVIOUS_CIRCUITS = [ PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX, - PRIVATE_KERNEL_RESET_FULL_INDEX, - PRIVATE_KERNEL_RESET_BIG_INDEX, - PRIVATE_KERNEL_RESET_MEDIUM_INDEX, - PRIVATE_KERNEL_RESET_SMALL_INDEX, - PRIVATE_KERNEL_RESET_TINY_INDEX, + PRIVATE_KERNEL_RESET_INDEX, ]; pub struct PrivateKernelTailCircuitPrivateInputs { @@ -37,11 +29,9 @@ impl PrivateKernelTailCircuitPrivateInputs { }; // Validate inputs. - PreviousKernelValidator::new(self.previous_kernel.public_inputs).validate_for_private_tail(); - if !std::runtime::is_unconstrained() { - // TODO(#7410) currently stubbed out until tube vk handled - // self.previous_kernel.validate_in_vk_tree(ALLOWED_PREVIOUS_CIRCUITS); - } + let previous_kernel_validator = PreviousKernelValidator::new(self.previous_kernel); + previous_kernel_validator.validate_proof(ALLOWED_PREVIOUS_CIRCUITS); + previous_kernel_validator.validate_for_private_tail(); // Validate output. if dep::types::validate::should_validate_output() { diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail_to_public.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail_to_public.nr index 56b90114239..5b84c180672 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail_to_public.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail_to_public.nr @@ -5,21 +5,13 @@ use crate::components::{ }; use dep::types::{ abis::{private_kernel_data::PrivateKernelData, kernel_circuit_public_inputs::PublicKernelCircuitPublicInputs}, - constants::{ - PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX, PRIVATE_KERNEL_RESET_FULL_INDEX, - PRIVATE_KERNEL_RESET_BIG_INDEX, PRIVATE_KERNEL_RESET_MEDIUM_INDEX, PRIVATE_KERNEL_RESET_SMALL_INDEX, - PRIVATE_KERNEL_RESET_TINY_INDEX -} + constants::{PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX, PRIVATE_KERNEL_RESET_INDEX} }; global ALLOWED_PREVIOUS_CIRCUITS = [ PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX, - PRIVATE_KERNEL_RESET_FULL_INDEX, - PRIVATE_KERNEL_RESET_BIG_INDEX, - PRIVATE_KERNEL_RESET_MEDIUM_INDEX, - PRIVATE_KERNEL_RESET_SMALL_INDEX, - PRIVATE_KERNEL_RESET_TINY_INDEX, + PRIVATE_KERNEL_RESET_INDEX, ]; pub struct PrivateKernelTailToPublicCircuitPrivateInputs { @@ -38,11 +30,9 @@ impl PrivateKernelTailToPublicCircuitPrivateInputs { }; // Validate inputs. - PreviousKernelValidator::new(self.previous_kernel.public_inputs).validate_for_private_tail_to_public(); - if !std::runtime::is_unconstrained() { - // TODO(#7410) currently stubbed out until tube vk handled - // self.previous_kernel.validate_in_vk_tree(ALLOWED_PREVIOUS_CIRCUITS); - } + let previous_kernel_validator = PreviousKernelValidator::new(self.previous_kernel); + previous_kernel_validator.validate_proof(ALLOWED_PREVIOUS_CIRCUITS); + previous_kernel_validator.validate_for_private_tail_to_public(); // Validate output. if dep::types::validate::should_validate_output() { diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/previous_kernel_validator_builder/mod.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/previous_kernel_validator_builder/mod.nr index 4c3cd2c336d..4ecb38dc8be 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/previous_kernel_validator_builder/mod.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/previous_kernel_validator_builder/mod.nr @@ -15,7 +15,7 @@ impl PreviousKernelValidatorBuilder { } pub fn validate_for_private_tail(self) { - let previous_kernel = self.previous_kernel.to_private_kernel_circuit_public_inputs(); + let previous_kernel = self.previous_kernel.to_private_kernel_data(); PreviousKernelValidator::new(previous_kernel).validate_for_private_tail(); } } diff --git a/noir-projects/noir-protocol-circuits/crates/reset-kernel-lib/src/private_validation_request_processor.nr b/noir-projects/noir-protocol-circuits/crates/reset-kernel-lib/src/private_validation_request_processor.nr index 76dfd18db7b..be1925fd774 100644 --- a/noir-projects/noir-protocol-circuits/crates/reset-kernel-lib/src/private_validation_request_processor.nr +++ b/noir-projects/noir-protocol-circuits/crates/reset-kernel-lib/src/private_validation_request_processor.nr @@ -81,11 +81,17 @@ impl< ); // key_validation_requests - verify_reset_key_validation_requests( - self.validation_requests.scoped_key_validation_requests_and_generators, - self.key_validation_hints, - output.scoped_key_validation_requests_and_generators - ); + if KEY_VALIDATION_REQUESTS == 0 { + assert_eq( + output.scoped_key_validation_requests_and_generators, self.validation_requests.scoped_key_validation_requests_and_generators, "mismatch scoped_key_validation_requests_and_generators" + ); + } else { + verify_reset_key_validation_requests( + self.validation_requests.scoped_key_validation_requests_and_generators, + self.key_validation_hints, + output.scoped_key_validation_requests_and_generators + ); + } // split_counter assert_eq( diff --git a/noir-projects/noir-protocol-circuits/crates/reset-kernel-lib/src/reset/key_validation_hint.nr b/noir-projects/noir-protocol-circuits/crates/reset-kernel-lib/src/reset/key_validation_hint.nr index 78119974eea..06130872323 100644 --- a/noir-projects/noir-protocol-circuits/crates/reset-kernel-lib/src/reset/key_validation_hint.nr +++ b/noir-projects/noir-protocol-circuits/crates/reset-kernel-lib/src/reset/key_validation_hint.nr @@ -77,13 +77,13 @@ pub fn verify_reset_key_validation_requests pub BlockRootOrBlockMergePublicInputs { + inputs.empty_block_root_rollup_circuit() +} diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-block-root-final/src/main.nr b/noir-projects/noir-protocol-circuits/crates/rollup-block-root-final/src/main.nr deleted file mode 100644 index b23b532e957..00000000000 --- a/noir-projects/noir-protocol-circuits/crates/rollup-block-root-final/src/main.nr +++ /dev/null @@ -1,7 +0,0 @@ -use dep::rollup_lib::block_root::{BlockRootRollupInputs, BlockRootOrBlockMergePublicInputs}; - -// This is a non-recursive variant of the rollup-block-root. We use it so we can generate proofs that can be verified on L1, until we -// drop support for proving single blocks and move to epoch proving completely. -fn main(inputs: BlockRootRollupInputs) -> pub BlockRootOrBlockMergePublicInputs { - inputs.block_root_rollup_circuit() -} diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/block_root_or_block_merge_public_inputs.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/block_root_or_block_merge_public_inputs.nr index 7fede7a1c1b..231f83001ba 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/block_root_or_block_merge_public_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/block_root_or_block_merge_public_inputs.nr @@ -1,7 +1,7 @@ use dep::types::{ abis::{append_only_tree_snapshot::AppendOnlyTreeSnapshot, global_variables::GlobalVariables}, - constants::BLOCK_ROOT_OR_BLOCK_MERGE_PUBLIC_INPUTS_LENGTH, traits::{Empty, Serialize, Deserialize}, - utils::reader::Reader, address::EthAddress + constants::{BLOCK_ROOT_OR_BLOCK_MERGE_PUBLIC_INPUTS_LENGTH, FEE_RECIPIENT_LENGTH}, + traits::{Empty, Serialize, Deserialize}, utils::reader::Reader, address::EthAddress }; pub struct FeeRecipient { @@ -16,14 +16,14 @@ impl Empty for FeeRecipient { } } -impl Serialize<2> for FeeRecipient { - fn serialize(self) -> [Field; 2] { +impl Serialize for FeeRecipient { + fn serialize(self) -> [Field; FEE_RECIPIENT_LENGTH] { [self.recipient.to_field(), self.value] } } -impl Deserialize<2> for FeeRecipient { - fn deserialize(values: [Field; 2]) -> Self { +impl Deserialize for FeeRecipient { + fn deserialize(values: [Field; FEE_RECIPIENT_LENGTH]) -> Self { Self { recipient: EthAddress::from_field(values[0]), value: values[1] } } } @@ -49,6 +49,12 @@ pub struct BlockRootOrBlockMergePublicInputs { prover_id: Field, // TODO(#7346): Temporarily added prover_id while we verify block-root proofs on L1 } +impl BlockRootOrBlockMergePublicInputs { + fn is_padding(self) -> bool { + self.previous_archive == self.new_archive + } +} + impl Empty for BlockRootOrBlockMergePublicInputs { fn empty() -> Self { BlockRootOrBlockMergePublicInputs { diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/base_rollup_inputs.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/base_rollup_inputs.nr index 6ff7470d81d..d8750c9dbda 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/base_rollup_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/base_rollup_inputs.nr @@ -619,6 +619,12 @@ mod tests { inputs } + unconstrained fn new_with_previous_kernel(previous_vk_index: u32) -> Self { + let mut builder = BaseRollupInputsBuilder::new(); + builder.kernel_data = builder.kernel_data.in_vk_tree(previous_vk_index); + builder + } + fn build_fee_payer_fee_juice_balance_read_hint( self, start_public_data_tree: NonEmptyMerkleTree @@ -712,7 +718,7 @@ mod tests { ) } - fn build_inputs(mut self) -> BaseRollupInputs { + unconstrained fn build_inputs(mut self) -> BaseRollupInputs { let mut kernel_data = self.kernel_data.to_kernel_data(); let start_note_hash_tree = NonEmptyMerkleTree::new( @@ -830,7 +836,10 @@ mod tests { } fn execute(self) -> BaseOrMergeRollupPublicInputs { - self.build_inputs().base_rollup_circuit() + let inputs = unsafe { + self.build_inputs() + }; + inputs.base_rollup_circuit() } fn succeeds(self) { @@ -1424,24 +1433,27 @@ mod tests { #[test] fn valid_previous_kernel_empty() { - let mut builder = BaseRollupInputsBuilder::new(); - builder.kernel_data = builder.kernel_data.in_vk_tree(PRIVATE_KERNEL_EMPTY_INDEX); + let builder = unsafe { + BaseRollupInputsBuilder::new_with_previous_kernel(PRIVATE_KERNEL_EMPTY_INDEX) + }; let _res = builder.execute(); } #[test] fn valid_previous_kernel_tail() { - let mut builder = BaseRollupInputsBuilder::new(); - builder.kernel_data = builder.kernel_data.in_vk_tree(PRIVATE_KERNEL_TAIL_INDEX); + let builder = unsafe { + BaseRollupInputsBuilder::new_with_previous_kernel(PRIVATE_KERNEL_TAIL_INDEX) + }; let _res = builder.execute(); } #[test] fn valid_previous_kernel_public_tail() { - let mut builder = BaseRollupInputsBuilder::new(); - builder.kernel_data = builder.kernel_data.in_vk_tree(PUBLIC_KERNEL_TAIL_INDEX); + let builder = unsafe { + BaseRollupInputsBuilder::new_with_previous_kernel(PUBLIC_KERNEL_TAIL_INDEX) + }; let _res = builder.execute(); } diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/block_root_rollup_inputs.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/block_root_rollup_inputs.nr index c09efc21967..5124e5316ff 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/block_root_rollup_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/block_root_rollup_inputs.nr @@ -16,6 +16,7 @@ use types::{ merkle_tree::{append_only_tree, calculate_empty_tree_root}, state_reference::StateReference, traits::Empty }; +use types::debug_log::debug_log_format; global ALLOWED_PREVIOUS_CIRCUITS = [ BASE_ROLLUP_INDEX, @@ -35,6 +36,7 @@ pub struct BlockRootRollupInputs { start_l1_to_l2_message_tree_snapshot: AppendOnlyTreeSnapshot, // inputs required to add the block hash + // TODO: Remove in favor of left.constants.last_archive start_archive_snapshot: AppendOnlyTreeSnapshot, new_archive_sibling_path: [Field; ARCHIVE_HEIGHT], // Added previous_block_hash to be passed through to the final root, where it will be either: @@ -93,6 +95,24 @@ impl BlockRootRollupInputs { let total_fees = components::accumulate_fees(left, right); + // unsafe { + // debug_log_format("Assembling header in block root rollup", []); + // debug_log_format( + // "header.last_archive={}", + // left.constants.last_archive.serialize() + // ); + // debug_log_format( + // "header.content_commitment={}", + // content_commitment.serialize() + // ); + // debug_log_format("header.state={}", state.serialize()); + // debug_log_format( + // "header.global_variables={}", + // left.constants.global_variables.serialize() + // ); + // debug_log_format("header.total_fees={0}", [total_fees]); + // } + let header = Header { last_archive: left.constants.last_archive, content_commitment, diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/empty_block_root_rollup_inputs.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/empty_block_root_rollup_inputs.nr new file mode 100644 index 00000000000..ecff942e975 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/empty_block_root_rollup_inputs.nr @@ -0,0 +1,30 @@ +use crate::abis::block_root_or_block_merge_public_inputs::BlockRootOrBlockMergePublicInputs; +use types::{abis::{append_only_tree_snapshot::AppendOnlyTreeSnapshot, global_variables::GlobalVariables}}; +use crate::abis::block_root_or_block_merge_public_inputs::FeeRecipient; + +pub struct EmptyBlockRootRollupInputs { + archive: AppendOnlyTreeSnapshot, + block_hash: Field, + global_variables: GlobalVariables, + vk_tree_root: Field, + // TODO(#7346): Temporarily added prover_id while we verify block-root proofs on L1 + prover_id: Field, +} + +impl EmptyBlockRootRollupInputs { + pub fn empty_block_root_rollup_circuit(self) -> BlockRootOrBlockMergePublicInputs { + BlockRootOrBlockMergePublicInputs { + previous_archive: self.archive, + new_archive: self.archive, + previous_block_hash: self.block_hash, + end_block_hash: self.block_hash, + start_global_variables: self.global_variables, + end_global_variables: self.global_variables, + out_hash: 0, // out_hash is ignored when merging if the block proof is padding + fees: [FeeRecipient::empty(); 32], + vk_tree_root: self.vk_tree_root, + prover_id: self.prover_id + } + } +} + diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/mod.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/mod.nr index 71538bcb1f7..2c66ed17d6a 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/mod.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/mod.nr @@ -1,7 +1,9 @@ mod block_root_rollup_inputs; +mod empty_block_root_rollup_inputs; // Re-exports pub use block_root_rollup_inputs::BlockRootRollupInputs; +pub use empty_block_root_rollup_inputs::EmptyBlockRootRollupInputs; pub use crate::abis::block_root_or_block_merge_public_inputs::BlockRootOrBlockMergePublicInputs; mod tests { diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/components.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/components.nr index d787969abd2..85e3debb8d1 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/components.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/components.nr @@ -92,12 +92,22 @@ pub fn assert_prev_block_rollups_follow_on_from_each_other( assert( left.end_global_variables.version == right.start_global_variables.version, "input blocks have different chain version" ); - assert( - left.end_global_variables.block_number + 1 == right.start_global_variables.block_number, "input block numbers do not follow on from each other" - ); - assert( - left.end_global_variables.timestamp < right.start_global_variables.timestamp, "input block timestamps do not follow on from each other" - ); + + if right.is_padding() { + assert( + left.end_global_variables.block_number == right.start_global_variables.block_number, "input block numbers do not match" + ); + assert( + left.end_global_variables.timestamp == right.start_global_variables.timestamp, "input block timestamps do not match" + ); + } else { + assert( + left.end_global_variables.block_number + 1 == right.start_global_variables.block_number, "input block numbers do not follow on from each other" + ); + assert( + left.end_global_variables.timestamp < right.start_global_variables.timestamp, "input block timestamps do not follow on from each other" + ); + } } pub fn accumulate_fees(left: BaseOrMergeRollupPublicInputs, right: BaseOrMergeRollupPublicInputs) -> Field { @@ -134,12 +144,16 @@ pub fn compute_out_hash(previous_rollup_data: [PreviousRollupData; 2]) -> Field } // TODO(Miranda): combine fns? pub fn compute_blocks_out_hash(previous_rollup_data: [PreviousRollupBlockData; 2]) -> Field { - accumulate_sha256( - [ - previous_rollup_data[0].block_root_or_block_merge_public_inputs.out_hash, - previous_rollup_data[1].block_root_or_block_merge_public_inputs.out_hash - ] - ) + if previous_rollup_data[1].block_root_or_block_merge_public_inputs.is_padding() { + previous_rollup_data[0].block_root_or_block_merge_public_inputs.out_hash + } else { + accumulate_sha256( + [ + previous_rollup_data[0].block_root_or_block_merge_public_inputs.out_hash, + previous_rollup_data[1].block_root_or_block_merge_public_inputs.out_hash + ] + ) + } } pub fn compute_kernel_out_hash(l2_to_l1_msgs: [Field; MAX_L2_TO_L1_MSGS_PER_TX]) -> Field { diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/root/root_rollup_public_inputs.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/root/root_rollup_public_inputs.nr index 4a27117d79a..9b43483ab1a 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/root/root_rollup_public_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/root/root_rollup_public_inputs.nr @@ -1,6 +1,6 @@ use dep::types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot; use crate::abis::block_root_or_block_merge_public_inputs::FeeRecipient; -// TODO(#7346): Currently unused! Will be used when batch rollup circuits are integrated. + pub struct RootRollupPublicInputs { // Snapshot of archive tree before/after this rollup has been processed previous_archive: AppendOnlyTreeSnapshot, diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_kernel_data.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_kernel_data.nr index 2da1b406533..7b7f7ecc62d 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_kernel_data.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_kernel_data.nr @@ -1,26 +1,29 @@ use crate::{ - abis::kernel_circuit_public_inputs::PrivateKernelCircuitPublicInputs, constants::VK_TREE_HEIGHT, + abis::kernel_circuit_public_inputs::PrivateKernelCircuitPublicInputs, + constants::{PRIVATE_KERNEL_RESET_INDEX, VK_TREE_HEIGHT}, merkle_tree::membership::assert_check_membership, recursion::{verification_key::VerificationKey}, utils::arrays::find_index_hint }; pub struct PrivateKernelData { public_inputs: PrivateKernelCircuitPublicInputs, - vk: VerificationKey, - - // This index and path are meant to be those of a leaf within the tree of protocol circuits vks; not the tree - // of functions within the contract tree. vk_index: u32, vk_path: [Field; VK_TREE_HEIGHT], } impl PrivateKernelData { fn validate_in_vk_tree(self, allowed_indices: [u32; N]) { + let index_in_allowed_list = if self.vk_index >= PRIVATE_KERNEL_RESET_INDEX { + // Kernel circuits only need to include PRIVATE_KERNEL_RESET_INDEX in the list to allow all private kernel reset variants. + PRIVATE_KERNEL_RESET_INDEX + } else { + self.vk_index + }; let index_hint = unsafe { - find_index_hint(allowed_indices, |index: u32| index == self.vk_index) + find_index_hint(allowed_indices, |index: u32| index == index_in_allowed_list) }; - assert_eq(allowed_indices[index_hint], self.vk_index, "Invalid vk index"); + assert_eq(allowed_indices[index_hint], index_in_allowed_list, "Invalid vk index"); assert_check_membership( self.vk.hash, diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/address/aztec_address.nr b/noir-projects/noir-protocol-circuits/crates/types/src/address/aztec_address.nr index 06605d2c553..1303663ffeb 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/address/aztec_address.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/address/aztec_address.nr @@ -1,5 +1,5 @@ use crate::{ - crate::address::{partial_address::PartialAddress, public_keys_hash::PublicKeysHash}, + address::{partial_address::PartialAddress, public_keys_hash::PublicKeysHash}, constants::{AZTEC_ADDRESS_LENGTH, GENERATOR_INDEX__CONTRACT_ADDRESS_V1}, hash::poseidon2_hash_with_separator, traits::{Empty, FromField, ToField, Serialize, Deserialize}, utils diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/address/mod.nr b/noir-projects/noir-protocol-circuits/crates/types/src/address/mod.nr index 9c7a400ea9c..88b0236e421 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/address/mod.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/address/mod.nr @@ -9,15 +9,3 @@ pub use eth_address::EthAddress; pub use partial_address::PartialAddress; pub use public_keys_hash::PublicKeysHash; pub use salted_initialization_hash::SaltedInitializationHash; - -use crate::{constants::GENERATOR_INDEX__CONSTRUCTOR, hash::poseidon2_hash_with_separator}; - -pub fn compute_initialization_hash(selector: Field, args_hash: Field) -> Field { - poseidon2_hash_with_separator( - [ - selector, - args_hash - ], - GENERATOR_INDEX__CONSTRUCTOR - ) -} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr index f5cf45fbfc6..1ea5c99703a 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr @@ -43,7 +43,7 @@ global MAX_UNENCRYPTED_LOGS_PER_CALL: u32 = 4; // If modifying, update DEPLOYER_ // TREES RELATED CONSTANTS global ARCHIVE_HEIGHT: u32 = 16; -global VK_TREE_HEIGHT: u32 = 5; +global VK_TREE_HEIGHT: u32 = 6; global FUNCTION_TREE_HEIGHT: u32 = 5; global NOTE_HASH_TREE_HEIGHT: u32 = 32; global PUBLIC_DATA_TREE_HEIGHT: u32 = 40; @@ -97,29 +97,25 @@ global MAX_PUBLIC_DATA_HINTS: u32 = 128; global NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP: u32 = 16; // VK TREE CONSTANTS -global PRIVATE_KERNEL_INIT_INDEX: u32 = 0; -global PRIVATE_KERNEL_INNER_INDEX: u32 = 1; -global PRIVATE_KERNEL_RESET_FULL_INDEX: u32 = 2; -global PRIVATE_KERNEL_RESET_FULL_INNER_INDEX: u32 = 3; -global PRIVATE_KERNEL_RESET_BIG_INDEX: u32 = 4; -global PRIVATE_KERNEL_RESET_MEDIUM_INDEX: u32 = 5; -global PRIVATE_KERNEL_RESET_SMALL_INDEX: u32 = 6; -global PRIVATE_KERNEL_RESET_TINY_INDEX: u32 = 7; -global PRIVATE_KERNEL_TAIL_INDEX: u32 = 10; -global PRIVATE_KERNEL_TAIL_TO_PUBLIC_INDEX: u32 = 11; -global EMPTY_NESTED_INDEX: u32 = 12; -global PRIVATE_KERNEL_EMPTY_INDEX: u32 = 13; -global PUBLIC_KERNEL_INNER_INDEX: u32 = 15; // TODO(#7124): To be deprecated. -global PUBLIC_KERNEL_MERGE_INDEX: u32 = 16; -global PUBLIC_KERNEL_TAIL_INDEX: u32 = 17; -global BASE_PARITY_INDEX: u32 = 18; -global ROOT_PARITY_INDEX: u32 = 19; -global BASE_ROLLUP_INDEX: u32 = 20; -global MERGE_ROLLUP_INDEX: u32 = 21; -global BLOCK_ROOT_ROLLUP_INDEX: u32 = 22; -global BLOCK_MERGE_ROLLUP_INDEX: u32 = 23; -global ROOT_ROLLUP_INDEX: u32 = 24; -global BLOCK_ROOT_ROLLUP_FINAL_INDEX: u32 = 25; +global EMPTY_NESTED_INDEX: u32 = 0; +global PRIVATE_KERNEL_EMPTY_INDEX: u32 = 1; +global PRIVATE_KERNEL_INIT_INDEX: u32 = 2; +global PRIVATE_KERNEL_INNER_INDEX: u32 = 3; +global PRIVATE_KERNEL_TAIL_INDEX: u32 = 4; +global PRIVATE_KERNEL_TAIL_TO_PUBLIC_INDEX: u32 = 5; +global PUBLIC_KERNEL_MERGE_INDEX: u32 = 6; +global PUBLIC_KERNEL_TAIL_INDEX: u32 = 7; +global PUBLIC_KERNEL_INNER_INDEX: u32 = 8; // TODO(#7124): To be deprecated. +global BASE_PARITY_INDEX: u32 = 10; +global ROOT_PARITY_INDEX: u32 = 11; +global BASE_ROLLUP_INDEX: u32 = 12; +global MERGE_ROLLUP_INDEX: u32 = 13; +global BLOCK_ROOT_ROLLUP_INDEX: u32 = 14; +global BLOCK_MERGE_ROLLUP_INDEX: u32 = 15; +global ROOT_ROLLUP_INDEX: u32 = 16; +global BLOCK_ROOT_ROLLUP_EMPTY_INDEX: u32 = 17; +global PRIVATE_KERNEL_RESET_INDEX: u32 = 20; +// Important: Do not define indexes after the PRIVATE_KERNEL_RESET_INDEX. They are allocated for the variants of private kernel reset. // MISC CONSTANTS global FUNCTION_SELECTOR_NUM_BYTES: Field = 4; @@ -294,6 +290,9 @@ global BASE_OR_MERGE_PUBLIC_INPUTS_LENGTH: u32 = CONSTANT_ROLLUP_DATA_LENGTH + P // + 64 for 32 * FeeRecipient { recipient, value }, + 4 for previous_block_hash, end_block_hash, out_hash, vk_tree_root + 1 temporarily for prover_id global BLOCK_ROOT_OR_BLOCK_MERGE_PUBLIC_INPUTS_LENGTH: u32 = 2 * APPEND_ONLY_TREE_SNAPSHOT_LENGTH + 2 * GLOBAL_VARIABLES_LENGTH + 69; +global FEE_RECIPIENT_LENGTH: u32 = 2; +global ROOT_ROLLUP_PUBLIC_INPUTS_LENGTH: u32 = 2 * APPEND_ONLY_TREE_SNAPSHOT_LENGTH + 7 + 32 * FEE_RECIPIENT_LENGTH; + global GET_NOTES_ORACLE_RETURN_LENGTH: u32 = 674; global NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP: u32 = 32 * MAX_NOTE_HASHES_PER_TX; global NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP: u32 = 32 * MAX_NULLIFIERS_PER_TX; @@ -309,8 +308,8 @@ global NUM_MSGS_PER_BASE_PARITY: u32 = 4; global NUM_BASE_PARITY_PER_ROOT_PARITY: u32 = 4; // Lengths of the different types of proofs in fields -global RECURSIVE_PROOF_LENGTH: u32 = 439; -global NESTED_RECURSIVE_PROOF_LENGTH: u32 = 439; +global RECURSIVE_PROOF_LENGTH: u32= 463; +global NESTED_RECURSIVE_PROOF_LENGTH: u32= 463; global TUBE_PROOF_LENGTH: u32 = RECURSIVE_PROOF_LENGTH; // in the future these can differ global VERIFICATION_KEY_LENGTH_IN_FIELDS: u32 = 128; @@ -325,7 +324,8 @@ global AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS: u32 = 2 + 16 * 4; // To determine latest value, hover `COMPUTED_AVM_PROOF_LENGTH_IN_FIELDS` // in barretenberg/cpp/src/barretenberg/vm/avm/generated/flavor.hpp global AVM_PROOF_LENGTH_IN_FIELDS: u32 = 3822; -global AVM_PUBLIC_COLUMN_MAX_SIZE_LOG2 = 8; +global AVM_PUBLIC_COLUMN_MAX_SIZE : u32 = 1024; +global AVM_PUBLIC_INPUTS_FLATTENED_SIZE : u32 = 2 * AVM_PUBLIC_COLUMN_MAX_SIZE + PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH; /** * Enumerate the hash_indices which are used for pedersen hashing. * We start from 1 to avoid the default generators. The generator indices are listed diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/debug_log.nr b/noir-projects/noir-protocol-circuits/crates/types/src/debug_log.nr index bccbc9a2adf..e5045456b65 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/debug_log.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/debug_log.nr @@ -1,23 +1,26 @@ -// Utility function to console.log data in the acir simulator -// WARNING: sometimes when using debug logs the ACVM errors with: `thrown: "solver opcode resolution error: cannot solve opcode: expression has too many unknowns x155"` +/// Utility function to console.log data in the acir simulator. +/// Example: +/// debug_log("blah blah this is a debug string"); +pub fn debug_log(msg: str) { + debug_log_format(msg, []); +} -#[oracle(debugLog)] -unconstrained fn debug_log_oracle(_msg: str, args: [Field]) {} +/// Utility function to console.log data in the acir simulator. This variant receives a format string in which the +/// `${k}` tokens will be replaced with the k-eth value in the `args` array. +/// Examples: +/// debug_log_format("get_2(slot:{0}) =>\n\t0:{1}\n\t1:{2}", [storage_slot, note0_hash, note1_hash]); +/// debug_log_format("whole array: {}", [e1, e2, e3, e4]); +pub fn debug_log_format(msg: str, args: [Field; N]) { + // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call. + unsafe { + debug_log_oracle_wrapper(msg, args) + }; +} -/// NOTE: call this with a str msg of form -/// "some string with {0} and {1} ... {N}" -/// and an array of N field which will be formatted -/// into the string in the simulator. -/// Example: -/// debug_log_format("get_2(slot:{0}) =>\n\t0:{1}\n\t1:{2}", [storage_slot, note0_hash, note1_hash]); -/// debug_log_format("whole array: {}", [e1, e2, e3, e4]); -unconstrained pub fn debug_log_format(msg: str, args: [Field; N]) { +unconstrained pub fn debug_log_oracle_wrapper(msg: str, args: [Field; N]) { debug_log_oracle(msg, args.as_slice()); } -/// NOTE: call this with a str msg of length > 1 -/// Example: -/// `debug_log("blah blah this is a debug string");` -unconstrained pub fn debug_log(msg: str) { - debug_log_format(msg, []); -} +// WARNING: sometimes when using debug logs the ACVM errors with: `thrown: "solver opcode resolution error: cannot solve opcode: expression has too many unknowns x155"` +#[oracle(debugLog)] +unconstrained fn debug_log_oracle(_msg: str, args: [Field]) {} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/storage/map.nr b/noir-projects/noir-protocol-circuits/crates/types/src/storage/map.nr index 13a82bc58b5..3f20295d9bd 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/storage/map.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/storage/map.nr @@ -1,7 +1,7 @@ -use crate::{hash::pedersen_hash, traits::ToField}; +use crate::{hash::poseidon2_hash, traits::ToField}; pub fn derive_storage_slot_in_map(storage_slot: Field, key: K) -> Field where K: ToField { - pedersen_hash([storage_slot, key.to_field()], 0) + poseidon2_hash([storage_slot, key.to_field()]) } mod test { @@ -15,7 +15,7 @@ mod test { let slot = derive_storage_slot_in_map(map_slot, key); // The following value was generated by `map_slot.test.ts` - let slot_from_typescript = 0x2499880e2b1b831785c17286f99a0d5122fee784ce7b1c04e380c4a991da819a; + let slot_from_typescript = 0x15b9fe39449affd8b377461263e9d2b610b9ad40580553500b4e41d9cbd887ac; assert_eq(slot, slot_from_typescript); } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/vk_tree.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/vk_tree.nr index 75e24d3c28d..472dd5ae5ff 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/vk_tree.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixtures/vk_tree.nr @@ -1,20 +1,14 @@ use crate::constants::{ - VK_TREE_HEIGHT, PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX, - PRIVATE_KERNEL_RESET_FULL_INDEX, PRIVATE_KERNEL_RESET_BIG_INDEX, PRIVATE_KERNEL_RESET_MEDIUM_INDEX, - PRIVATE_KERNEL_RESET_SMALL_INDEX, PRIVATE_KERNEL_TAIL_INDEX, PRIVATE_KERNEL_TAIL_TO_PUBLIC_INDEX, - EMPTY_NESTED_INDEX, PRIVATE_KERNEL_EMPTY_INDEX, PUBLIC_KERNEL_INNER_INDEX, - PUBLIC_KERNEL_MERGE_INDEX, PUBLIC_KERNEL_TAIL_INDEX, BASE_PARITY_INDEX, ROOT_PARITY_INDEX, - BASE_ROLLUP_INDEX, MERGE_ROLLUP_INDEX, BLOCK_ROOT_ROLLUP_INDEX, BLOCK_MERGE_ROLLUP_INDEX, - ROOT_ROLLUP_INDEX, PRIVATE_KERNEL_RESET_TINY_INDEX, BLOCK_ROOT_ROLLUP_FINAL_INDEX + VK_TREE_HEIGHT, PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX, PRIVATE_KERNEL_RESET_INDEX, + PRIVATE_KERNEL_TAIL_INDEX, PRIVATE_KERNEL_TAIL_TO_PUBLIC_INDEX, EMPTY_NESTED_INDEX, + PRIVATE_KERNEL_EMPTY_INDEX, PUBLIC_KERNEL_INNER_INDEX, PUBLIC_KERNEL_MERGE_INDEX, + PUBLIC_KERNEL_TAIL_INDEX, BASE_PARITY_INDEX, ROOT_PARITY_INDEX, BASE_ROLLUP_INDEX, + MERGE_ROLLUP_INDEX, BLOCK_ROOT_ROLLUP_INDEX, BLOCK_MERGE_ROLLUP_INDEX, ROOT_ROLLUP_INDEX, + BLOCK_ROOT_ROLLUP_EMPTY_INDEX }; use crate::merkle_tree::merkle_tree::MerkleTree; -global VK_TREE_WIDTH: u32 = 32; - -#[test] -fn check_vk_tree_width() { - assert_eq(2.pow_32(VK_TREE_HEIGHT as Field), VK_TREE_WIDTH as Field, "Incorrect VK tree width"); -} +global VK_TREE_WIDTH: u32 = (1 as u8 << VK_TREE_HEIGHT as u8) as u32; pub fn get_vk_merkle_tree() -> MerkleTree { let mut leaves = [0; VK_TREE_WIDTH]; @@ -22,11 +16,6 @@ pub fn get_vk_merkle_tree() -> MerkleTree { // Fake VK hashes for testing purposes leaves[PRIVATE_KERNEL_INIT_INDEX] = 0; leaves[PRIVATE_KERNEL_INNER_INDEX] = 1; - leaves[PRIVATE_KERNEL_RESET_FULL_INDEX] = 2; - leaves[PRIVATE_KERNEL_RESET_BIG_INDEX] = 3; - leaves[PRIVATE_KERNEL_RESET_MEDIUM_INDEX] = 4; - leaves[PRIVATE_KERNEL_RESET_SMALL_INDEX] = 5; - leaves[PRIVATE_KERNEL_RESET_TINY_INDEX] = 6; leaves[PRIVATE_KERNEL_TAIL_INDEX] = 10; leaves[PRIVATE_KERNEL_TAIL_TO_PUBLIC_INDEX] = 11; leaves[EMPTY_NESTED_INDEX] = 12; @@ -41,7 +30,8 @@ pub fn get_vk_merkle_tree() -> MerkleTree { leaves[BLOCK_ROOT_ROLLUP_INDEX] = 22; leaves[BLOCK_MERGE_ROLLUP_INDEX] = 23; leaves[ROOT_ROLLUP_INDEX] = 24; - leaves[BLOCK_ROOT_ROLLUP_FINAL_INDEX] = 25; + leaves[BLOCK_ROOT_ROLLUP_EMPTY_INDEX] = 25; + leaves[PRIVATE_KERNEL_RESET_INDEX] = 26; MerkleTree::new(leaves) } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr b/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr index 8b287d4177a..60a3c6031b3 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr @@ -155,12 +155,6 @@ pub trait Serialize { } // docs:end:serialize -impl Serialize for [Field; N] { - fn serialize(self) -> [Field; N] { - self - } -} - impl Serialize for str { fn serialize(self) -> [Field; N] { let bytes = self.as_bytes(); @@ -179,8 +173,8 @@ pub trait Deserialize { } // docs:end:deserialize -impl Deserialize for [Field; N] { +impl Deserialize for str { fn deserialize(fields: [Field; N]) -> Self { - fields + str::from(fields.map(|value| value as u8)) } } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/type_serialization.nr b/noir-projects/noir-protocol-circuits/crates/types/src/type_serialization.nr index ac113fe2f79..59d9fad5628 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/type_serialization.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/type_serialization.nr @@ -20,7 +20,7 @@ impl Deserialize for bool { } impl Serialize for u8 { - fn serialize(self) -> [Field; U32_SERIALIZED_LEN] { + fn serialize(self) -> [Field; U8_SERIALIZED_LEN] { [self as Field] } } @@ -56,7 +56,7 @@ impl Deserialize for u64 { } impl Serialize for U128 { - fn serialize(self) -> [Field; 1] { + fn serialize(self) -> [Field; U128_SERIALIZED_LEN] { [self.to_integer()] } } @@ -68,7 +68,7 @@ impl Deserialize for U128 { } impl Serialize for Field { - fn serialize(self) -> [Field; U32_SERIALIZED_LEN] { + fn serialize(self) -> [Field; FIELD_SERIALIZED_LEN] { [self] } } @@ -78,3 +78,25 @@ impl Deserialize for Field { fields[0] } } + +impl Serialize for [T; N] where T: Serialize { + fn serialize(self) -> [Field; N * M] { + let mut result: [Field; N * M] = std::mem::zeroed(); + let mut serialized: [Field; M] = std::mem::zeroed(); + for i in 0..N { + serialized = self[i].serialize(); + for j in 0..M { + result[i * M + j] = serialized[j]; + } + } + result + } +} + +impl Deserialize for [T; N] where T: Deserialize { + fn deserialize(fields: [Field; N * M]) -> Self { + let mut reader = crate::utils::reader::Reader::new(fields); + let mut result: [T; N] = std::mem::zeroed(); + reader.read_struct_array::(Deserialize::deserialize, result) + } +} diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays.nr b/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays.nr index c69e6234ed1..718f83ef761 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays.nr @@ -93,9 +93,8 @@ pub fn array_length(array: [T; N]) -> u32 where T: Empty + Eq { length } -pub fn array_concat(array1: [T; N], array2: [T; M]) -> [T; S] { - assert_eq(N + M, S, "combined array length does not match return array length"); - let mut result = [array1[0]; S]; +pub fn array_concat(array1: [T; N], array2: [T; M]) -> [T; N + M] { + let mut result = [array1[0]; N + M]; for i in 1..N { result[i] = array1[i]; } @@ -228,13 +227,6 @@ fn test_array_concat() { assert_eq(concated, [1, 2, 3, 4, 5]); } -#[test(should_fail_with="combined array length does not match return array length")] -fn array_concat_fails_inconsistent_lengths() { - let array0 = [1, 2, 3]; - let array1 = [4, 5]; - let _concated: [Field; 4] = array_concat(array0, array1); -} - #[test] fn check_permutation_basic_test() { let original_array = [1, 2, 3]; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays/assert_combined_sorted_transformed_value_array/get_combined_order_hints.nr b/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays/assert_combined_sorted_transformed_value_array/get_combined_order_hints.nr index 7f593937cf6..ffaf1b6ed2e 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays/assert_combined_sorted_transformed_value_array/get_combined_order_hints.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays/assert_combined_sorted_transformed_value_array/get_combined_order_hints.nr @@ -3,7 +3,7 @@ use crate::{ utils::arrays::{array_length, sort_by_counter::compare_by_counter_empty_padded_asc, get_sorted_tuple::get_sorted_tuple} }; -pub(crate) struct CombinedOrderHint { +pub struct CombinedOrderHint { counter: u32, original_index: u32, } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/utils/field.nr b/noir-projects/noir-protocol-circuits/crates/types/src/utils/field.nr index d4115e5743d..954ef602f82 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/utils/field.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/utils/field.nr @@ -52,7 +52,9 @@ unconstrained fn bytes_field_test() { ]; let field = field_from_bytes(inputs, true); let return_bytes: [u8; 31] = field.to_be_bytes(); - assert_eq(inputs, return_bytes); + for i in 0..31 { + assert_eq(inputs[i], return_bytes[i]); + } // 32 bytes - we remove the final byte, and check it matches the field let inputs2 = [ 84, 62, 10, 102, 66, 255, 235, 128, 57, 41, 104, 97, 118, 90, 83, 64, 123, 186, 98, 189, 28, 151, 202, 67, 55, 77, 233, 80, 187, 224, 167, 158 @@ -60,7 +62,9 @@ unconstrained fn bytes_field_test() { let field2 = field_from_bytes_32_trunc(inputs2); let return_bytes2: [u8; 31] = field.to_be_bytes(); - assert_eq(return_bytes2, return_bytes); + for i in 0..31 { + assert_eq(return_bytes2[i], return_bytes[i]); + } assert_eq(field2, field); } diff --git a/noir-projects/noir-protocol-circuits/generate_variants.js b/noir-projects/noir-protocol-circuits/generate_variants.js deleted file mode 100644 index d236a3f76ce..00000000000 --- a/noir-projects/noir-protocol-circuits/generate_variants.js +++ /dev/null @@ -1,85 +0,0 @@ -const TOML = require("@iarna/toml"); -const fs = require("fs"); -const path = require("path"); - -const nargoTomlTemplate = TOML.parse( - fs.readFileSync("./Nargo.template.toml", "utf8") -); -const autogeneratedCircuitsPath = path.join(__dirname, "crates/autogenerated"); - -if (fs.existsSync(autogeneratedCircuitsPath)) { - fs.rmSync(autogeneratedCircuitsPath, { recursive: true }); -} -fs.mkdirSync(autogeneratedCircuitsPath); - -function generateResetVariants() { - const resetVariants = require("./reset_variants.json"); - - generateVariants("private-kernel-reset", resetVariants); - generateVariants("private-kernel-reset-simulated", resetVariants); -} - -function generateVariants(originalFolder, variantsArray) { - const originalCrateFolder = path.join(__dirname, "crates", originalFolder); - const originalNargoToml = TOML.parse( - fs.readFileSync(path.join(originalCrateFolder, "Nargo.toml"), "utf8") - ); - const originalName = originalNargoToml.package.name; - - for ({ tag, replacements } of variantsArray) { - const variantFolder = `${originalFolder}-${tag}`; - const variantNargoToml = structuredClone(originalNargoToml); - for ([depName, depDescriptor] of Object.entries( - variantNargoToml.dependencies - )) { - if (depDescriptor.path) { - depDescriptor.path = "../" + depDescriptor.path; - } - } - variantNargoToml.package.name = `${originalName}_${tag.replaceAll( - "-", - "_" - )}`; - - let mainDotNoirCode = fs.readFileSync( - path.join(originalCrateFolder, "src/main.nr"), - "utf8" - ); - - for ([variableName, variableValue] of Object.entries(replacements)) { - mainDotNoirCode = mainDotNoirCode.replace( - new RegExp(`^global\\s+${variableName}\\s=\\s.*;.*$`, "m"), - `global ${variableName}: u32 = ${variableValue};` - ); - } - - fs.mkdirSync(path.join(autogeneratedCircuitsPath, variantFolder, "src"), { - recursive: true, - }); - - fs.writeFileSync( - path.join(autogeneratedCircuitsPath, variantFolder, "src/main.nr"), - mainDotNoirCode - ); - - fs.writeFileSync( - path.join(autogeneratedCircuitsPath, variantFolder, "Nargo.toml"), - TOML.stringify(variantNargoToml) - ); - } -} - -generateResetVariants(); - -for (entry of fs.readdirSync(autogeneratedCircuitsPath)) { - nargoTomlTemplate.workspace.members.push( - path.relative(__dirname, path.join(autogeneratedCircuitsPath, entry)) - ); -} - -fs.writeFileSync( - "./Nargo.toml", - `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n${TOML.stringify( - nargoTomlTemplate - )}` -); diff --git a/noir-projects/noir-protocol-circuits/private_kernel_reset_config.json b/noir-projects/noir-protocol-circuits/private_kernel_reset_config.json new file mode 100644 index 00000000000..e8f1b6fdb12 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/private_kernel_reset_config.json @@ -0,0 +1,55 @@ +{ + "dimensions": { + "NOTE_HASH_PENDING_AMOUNT": { + "variants": [32], + "standalone": [64], + "cost": 100 + }, + "NOTE_HASH_SETTLED_AMOUNT": { + "variants": [4, 16], + "standalone": [64], + "cost": 3000 + }, + "NULLIFIER_PENDING_AMOUNT": { + "variants": [32], + "standalone": [64], + "cost": 100 + }, + "NULLIFIER_SETTLED_AMOUNT": { + "variants": [4, 16], + "standalone": [64], + "cost": 3000 + }, + "NULLIFIER_KEYS": { + "variants": [4], + "standalone": [64], + "cost": 2500 + }, + "TRANSIENT_DATA_AMOUNT": { + "variants": [4], + "standalone": [64], + "cost": 100 + }, + "NOTE_HASH_SILOING_AMOUNT": { + "variants": [4, 64], + "standalone": [], + "cost": 250 + }, + "NULLIFIER_SILOING_AMOUNT": { + "variants": [4, 64], + "standalone": [], + "cost": 150 + }, + "ENCRYPTED_LOG_SILOING_AMOUNT": { + "variants": [1, 8], + "standalone": [], + "cost": 150 + } + }, + "specialCases": [ + [4, 4, 4, 4, 4, 4, 4, 4, 1], + [16, 16, 16, 16, 16, 16, 16, 16, 2], + [32, 32, 32, 32, 32, 32, 32, 32, 4], + [64, 64, 64, 64, 64, 64, 64, 64, 8] + ] +} diff --git a/noir-projects/noir-protocol-circuits/reset_variants.json b/noir-projects/noir-protocol-circuits/reset_variants.json deleted file mode 100644 index c80e95b706e..00000000000 --- a/noir-projects/noir-protocol-circuits/reset_variants.json +++ /dev/null @@ -1,77 +0,0 @@ -[ - { - "tag": "full-inner", - "priority": 97, - "replacements": { - "NOTE_HASH_PENDING_AMOUNT": 64, - "NOTE_HASH_SETTLED_AMOUNT": 64, - "NULLIFIER_PENDING_AMOUNT": 64, - "NULLIFIER_SETTLED_AMOUNT": 64, - "NULLIFIER_KEYS": 64, - "TRANSIENT_DATA_AMOUNT": 64, - "NOTE_HASH_SILOING_AMOUNT": 0, - "NULLIFIER_SILOING_AMOUNT": 0, - "ENCRYPTED_LOG_SILOING_AMOUNT": 0 - } - }, - { - "tag": "big", - "priority": 98, - "replacements": { - "NOTE_HASH_PENDING_AMOUNT": 32, - "NOTE_HASH_SETTLED_AMOUNT": 32, - "NULLIFIER_PENDING_AMOUNT": 32, - "NULLIFIER_SETTLED_AMOUNT": 32, - "NULLIFIER_KEYS": 32, - "TRANSIENT_DATA_AMOUNT": 32, - "NOTE_HASH_SILOING_AMOUNT": 32, - "NULLIFIER_SILOING_AMOUNT": 32, - "ENCRYPTED_LOG_SILOING_AMOUNT": 8 - } - }, - { - "tag": "medium", - "priority": 99, - "replacements": { - "NOTE_HASH_PENDING_AMOUNT": 16, - "NOTE_HASH_SETTLED_AMOUNT": 16, - "NULLIFIER_PENDING_AMOUNT": 16, - "NULLIFIER_SETTLED_AMOUNT": 16, - "NULLIFIER_KEYS": 16, - "TRANSIENT_DATA_AMOUNT": 16, - "NOTE_HASH_SILOING_AMOUNT": 16, - "NULLIFIER_SILOING_AMOUNT": 16, - "ENCRYPTED_LOG_SILOING_AMOUNT": 4 - } - }, - { - "tag": "small", - "priority": 100, - "replacements": { - "NOTE_HASH_PENDING_AMOUNT": 8, - "NOTE_HASH_SETTLED_AMOUNT": 8, - "NULLIFIER_PENDING_AMOUNT": 8, - "NULLIFIER_SETTLED_AMOUNT": 8, - "NULLIFIER_KEYS": 8, - "TRANSIENT_DATA_AMOUNT": 8, - "NOTE_HASH_SILOING_AMOUNT": 8, - "NULLIFIER_SILOING_AMOUNT": 8, - "ENCRYPTED_LOG_SILOING_AMOUNT": 2 - } - }, - { - "tag": "tiny", - "priority": 101, - "replacements": { - "NOTE_HASH_PENDING_AMOUNT": 4, - "NOTE_HASH_SETTLED_AMOUNT": 4, - "NULLIFIER_PENDING_AMOUNT": 4, - "NULLIFIER_SETTLED_AMOUNT": 4, - "NULLIFIER_KEYS": 4, - "TRANSIENT_DATA_AMOUNT": 4, - "NOTE_HASH_SILOING_AMOUNT": 4, - "NULLIFIER_SILOING_AMOUNT": 4, - "ENCRYPTED_LOG_SILOING_AMOUNT": 1 - } - } -] diff --git a/noir-projects/noir-protocol-circuits/scripts/generate_variants.js b/noir-projects/noir-protocol-circuits/scripts/generate_variants.js new file mode 100644 index 00000000000..94b27106cf0 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/scripts/generate_variants.js @@ -0,0 +1,169 @@ +const TOML = require("@iarna/toml"); +const fs = require("fs"); +const path = require("path"); +const config = require("../private_kernel_reset_config.json"); + +const root = path.join(__dirname, "../"); +const sourceFolder = "private-kernel-reset"; +const sourceSimulatedFolder = "private-kernel-reset-simulated"; +const autogeneratedCircuitsFolder = "crates/autogenerated"; + +const dimensionNames = Object.keys(config.dimensions); + +const aliases = { + tiny: [4, 4, 4, 4, 4, 4, 4, 4, 1], + full: [64, 64, 64, 64, 64, 64, 64, 64, 8], +}; + +function getResetTag(dimensions) { + return dimensions.join("_"); +} + +function areValidDimensions(dimensions) { + return ( + dimensions.length === dimensionNames.length && + dimensions.every((v) => typeof v === "number") + ); +} + +function isFullDimensions(dimensions) { + return dimensions.every((v, i) => v === aliases.full[i]); +} + +function getDimensionsList(allowedVariants) { + if (allowedVariants.length) { + // allowedVariant can be a key in aliases, or a tag. + return allowedVariants + .map((name) => aliases[name] || allowedVariants.split("_").map((v) => +v)) + .filter(areValidDimensions); + } + + // Variants. + const dimensionsList = dimensionNames.reduce( + (acc, name) => + acc.flatMap((combination) => + config.dimensions[name].variants.map((v) => [...combination, v]) + ), + [[]] + ); + + // Standalone. + dimensionNames.forEach((name, i) => { + config.dimensions[name].standalone.forEach((val) => { + const dimensions = Array(dimensionNames.length).fill(0); + dimensions[i] = val; + dimensionsList.push(dimensions); + }); + }); + + // Special cases. + config.specialCases.forEach((dimensions) => dimensionsList.push(dimensions)); + + return dimensionsList; +} + +function generateDimensions(dimensionsList) { + const dimensionValuesStrings = dimensionsList.map( + (dimensions) => ` [${dimensions.join(", ")}]` + ); + + const fileContent = ["[", dimensionValuesStrings.join(",\n"), "]"].join("\n"); + + fs.writeFileSync( + path.join(root, "private_kernel_reset_dimensions.json"), + fileContent + ); +} + +function generateCircuits(dimensionsList, nargoToml, isSimulated) { + const originalFolder = !isSimulated ? sourceFolder : sourceSimulatedFolder; + const originalCratePath = path.join(root, "crates", originalFolder); + const originalNargoToml = TOML.parse( + fs.readFileSync(path.join(originalCratePath, "Nargo.toml"), "utf8") + ); + const originalName = originalNargoToml.package.name; + + for (const dimensions of dimensionsList) { + // The default private-kernel-reset(-simulated) has full dimensions. + if (isFullDimensions(dimensions)) { + continue; + } + + const variantNargoToml = structuredClone(originalNargoToml); + + const tag = getResetTag(dimensions); + variantNargoToml.package.name = `${originalName}_${tag}`; + + for ([depName, depDescriptor] of Object.entries( + variantNargoToml.dependencies + )) { + if (depDescriptor.path) { + depDescriptor.path = "../" + depDescriptor.path; + } + } + + let mainDotNoirCode = fs.readFileSync( + path.join(originalCratePath, "src/main.nr"), + "utf8" + ); + + for (let i = 0; i < dimensions.length; i++) { + const value = dimensions[i]; + const name = dimensionNames[i]; + mainDotNoirCode = mainDotNoirCode.replace( + new RegExp(`^global\\s+${name}\\s=\\s.*;.*$`, "m"), + `global ${name}: u32 = ${value};` + ); + } + + const variantFolder = path.join( + autogeneratedCircuitsFolder, + `${originalFolder}-${tag}` + ); + + fs.mkdirSync(path.join(variantFolder, "src"), { + recursive: true, + }); + + fs.writeFileSync(path.join(variantFolder, "src/main.nr"), mainDotNoirCode); + + fs.writeFileSync( + path.join(variantFolder, "Nargo.toml"), + TOML.stringify(variantNargoToml) + ); + + nargoToml.workspace.members.push(variantFolder); + } +} + +function main() { + const allowedVariants = process.argv.slice(2) || []; + + const nargoToml = TOML.parse( + fs.readFileSync("./Nargo.template.toml", "utf8") + ); + + const dimensionsList = getDimensionsList(allowedVariants); + + const autogeneratedCircuitsPath = path.join( + root, + autogeneratedCircuitsFolder + ); + if (fs.existsSync(autogeneratedCircuitsPath)) { + fs.rmSync(autogeneratedCircuitsPath, { recursive: true }); + } + fs.mkdirSync(autogeneratedCircuitsPath); + + generateDimensions(dimensionsList); + generateCircuits(dimensionsList, nargoToml, false); + generateCircuits(dimensionsList, nargoToml, true); + + const content = [ + "# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", + TOML.stringify(nargoToml), + ].join("\n"); + + fs.writeFileSync("./Nargo.toml", content); +} + +main(); diff --git a/noir/Earthfile b/noir/Earthfile index 2ad31a5ba23..84cb86c477c 100644 --- a/noir/Earthfile +++ b/noir/Earthfile @@ -1,10 +1,12 @@ VERSION 0.8 nargo-src: - FROM ../build-images/+from-registry - WORKDIR /usr/src - # Relevant source (TODO finer-grained 'tooling') + WORKDIR /usr/src/noir + COPY noir-repo/.github/scripts/*.sh noir-repo/.github/scripts/ + # First install wasm bindgen + RUN ./noir-repo/.github/scripts/wasm-bindgen-install.sh + # Relevant source COPY --dir \ noir-repo/acvm-repo \ noir-repo/compiler \ @@ -24,8 +26,9 @@ nargo-src: # we don't want Noir to rebuild everytime the parent repo changes # just only when it changes # the commit hash gets injected into version strings - ENV COMMIT_HASH=$(find . -type f -exec sha256sum {} ';' | sort | sha256sum | awk '{print $1}') - RUN echo $COMMIT_HASH > .content-hash + DO ../build-system/s3-cache-scripts/+WRITE_CONTENT_HASH --rebuild_patterns=".rebuild_patterns_native" + # We use our content hash as a fake commit hash, stripped of non-semver characters + ENV COMMIT_HASH=$(cat .content-hash | sed 's/[^a-zA-Z0-9.-]//g') # # borrow Nix's approach to build everything in 1970 ENV SOURCE_TIMESTAMP=1 @@ -33,13 +36,18 @@ nargo-src: nargo: FROM +nargo-src - RUN ./noir-repo/.github/scripts/wasm-bindgen-install.sh COPY ./scripts/bootstrap_native.sh ./scripts/bootstrap_native.sh + # Note: build is decoupled from barretenberg + LET rebuild_patterns=".rebuild_patterns_native" # build noir nargo & acvm, and make sure the big build and deps folders don't hit cache - RUN ./scripts/bootstrap_native.sh && rm -rf /usr/src/noir-repo/target/release/{build,deps} - SAVE ARTIFACT /usr/src/noir-repo/target/release/nargo nargo - SAVE ARTIFACT /usr/src/noir-repo/target/release/acvm acvm - SAVE IMAGE aztecprotocol/nargo + DO ../build-system/s3-cache-scripts/+WITH_CACHE \ + --prefix="noir-nargo" \ + --rebuild_patterns="$rebuild_patterns" \ + --command="./scripts/bootstrap_native.sh && rm -rf noir-repo/target/release/{build,deps}" \ + --build_artifacts="noir-repo/target/release/nargo noir-repo/target/release/acvm" + + SAVE ARTIFACT noir-repo/target/release/nargo nargo + SAVE ARTIFACT noir-repo/target/release/acvm acvm test: FROM +nargo-src @@ -48,12 +56,11 @@ test: # Some of the debugger tests are a little flaky wrt to timeouts so we allow a couple of retries. ENV NEXTEST_RETRIES=2 - RUN ./scripts/test_native.sh examples: FROM +nargo - ENV PATH="/usr/src/noir-repo/target/release:${PATH}" + ENV PATH="/usr/src/noir/noir-repo/target/release:${PATH}" COPY --dir noir-repo/examples noir-repo COPY ../barretenberg/cpp/+preset-clang-assert/bin/bb /usr/src/barretenberg/cpp/build/bin/bb @@ -71,7 +78,7 @@ examples: format: FROM +nargo - ENV PATH=$PATH:/usr/src/noir-repo/target/release + ENV PATH="/usr/src/noir/noir-repo/target/release:${PATH}" COPY ./noir-repo/test_programs ./noir-repo/test_programs COPY ./noir-repo/noir_stdlib ./noir-repo/noir_stdlib @@ -135,18 +142,22 @@ packages-deps: noir-repo packages: - FROM +packages-deps - - COPY ./scripts/bootstrap_packages.sh ./scripts/bootstrap_packages.sh - RUN ./scripts/bootstrap_packages.sh - SAVE ARTIFACT packages - SAVE IMAGE --cache-hint + FROM +packages-deps + COPY ./scripts/bootstrap_packages.sh ./scripts/bootstrap_packages.sh + ENV REBUILD_PATTERNS="../barretenberg/cpp/.rebuild_patterns .rebuild_patterns_packages" + # build noir nargo & acvm, and make sure the big build and deps folders don't hit cache + DO ../build-system/s3-cache-scripts/+WITH_CACHE \ + --prefix="noir-packages" \ + --rebuild_patterns="$REBUILD_PATTERNS" \ + --command="./scripts/bootstrap_packages.sh" \ + --build_artifacts="packages" + SAVE ARTIFACT packages packages-test-build: FROM +packages-deps - COPY +nargo/nargo /usr/src/noir/noir-repo/target/release/nargo - COPY +nargo/acvm /usr/src/noir/noir-repo/target/release/acvm + COPY +nargo/nargo noir-repo/target/release/nargo + COPY +nargo/acvm noir-repo/target/release/acvm ENV NARGO_BACKEND_PATH=/usr/src/barretenberg/ts/dest/node/main.js ENV PATH=$PATH:/usr/src/noir/noir-repo/target/release @@ -155,8 +166,6 @@ packages-test-build: RUN yarn --immutable WORKDIR /usr/src/noir/noir-repo - COPY --dir noir-repo/.github/scripts/wasm-bindgen-install.sh ./.github/scripts/wasm-bindgen-install.sh - RUN ./.github/scripts/wasm-bindgen-install.sh ENV SOURCE_DATE_EPOCH=$(date +%s) ENV GIT_DIRTY=false @@ -188,9 +197,11 @@ packages-test-node: packages-test-browser: FROM ../build-images/+base-slim-node - COPY --dir +packages-test-build/usr/src /usr WORKDIR /usr/src/noir/noir-repo + # cache playwright install + COPY noir-repo/.github/scripts/*.sh .github/scripts/ RUN ./.github/scripts/playwright-install.sh + COPY --dir +packages-test-build/usr/src /usr RUN yarn workspaces foreach \ --verbose \ --include integration-tests \ @@ -207,14 +218,14 @@ build-acir-tests: RUN rm -rf .earthly-staging && mkdir -p .earthly-staging RUN cp --parents $(git ls-files "noir-repo/test_programs/*.toml" "noir-repo/test_programs/*.nr" "noir-repo/test_programs/rebuild.sh") .earthly-staging FROM ../build-images/+from-registry - COPY +nargo/ /usr/src/noir-repo/target/release - ENV PATH="/usr/src/noir-repo/target/release:${PATH}" - WORKDIR /usr/src/noir-repo/test_programs - COPY .earthly-staging/noir-repo/test_programs /usr/src/noir-repo/test_programs/ - RUN /usr/src/noir-repo/target/release/nargo --version + COPY +nargo/ /usr/src/noir/noir-repo/target/release + ENV PATH="/usr/src/noir/noir-repo/target/release:${PATH}" + WORKDIR /usr/src/noir/noir-repo/test_programs + COPY .earthly-staging/noir-repo/test_programs /usr/src/noir/noir-repo/test_programs/ + RUN /usr/src/noir/noir-repo/target/release/nargo --version # TODO(#6225): We have trouble with concurrency and pass 'true' to build in serial, see #6225 for details RUN ./rebuild.sh - SAVE ARTIFACT /usr/src/noir-repo/test_programs/acir_artifacts/* + SAVE ARTIFACT /usr/src/noir/noir-repo/test_programs/acir_artifacts/* barretenberg-acir-benches-bb: FROM ubuntu:noble @@ -257,4 +268,4 @@ bench-publish-acir-bb: RUN mkdir -p ./log RUN docker run -v "$(pwd)/log":/log -e LOG_FILE=/log/bench-acir.jsonl --rm aztecprotocol/barretenberg-acir-benches:$AZTEC_DOCKER_TAG ./bench_acir_tests.sh - DO ../+UPLOAD_LOGS --PULL_REQUEST=$PULL_REQUEST --BRANCH=$BRANCH --COMMIT_HASH=$COMMIT_HASH \ No newline at end of file + DO ../+UPLOAD_LOGS --PULL_REQUEST=$PULL_REQUEST --BRANCH=$BRANCH --COMMIT_HASH=$COMMIT_HASH diff --git a/noir/noir-repo/.release-please-manifest.json b/noir/noir-repo/.release-please-manifest.json index 8be8ad41ac0..cbf7bdda17c 100644 --- a/noir/noir-repo/.release-please-manifest.json +++ b/noir/noir-repo/.release-please-manifest.json @@ -1,4 +1,4 @@ { - ".": "0.34.0", - "acvm-repo": "0.50.0" + ".": "0.35.0", + "acvm-repo": "0.51.0" } diff --git a/noir/noir-repo/CHANGELOG.md b/noir/noir-repo/CHANGELOG.md index 9779d7ab964..6aa552ce90e 100644 --- a/noir/noir-repo/CHANGELOG.md +++ b/noir/noir-repo/CHANGELOG.md @@ -1,5 +1,117 @@ # Changelog +## [0.35.0](https://github.com/noir-lang/noir/compare/v0.34.0...v0.35.0) (2024-10-03) + + +### ⚠ BREAKING CHANGES + +* Syncing TypeVariableKind with Kind ([#6094](https://github.com/noir-lang/noir/issues/6094)) +* remove sha256 opcode (https://github.com/AztecProtocol/aztec-packages/pull/4571) +* add support for u1 in the avm, ToRadix's radix arg is a memory addr (https://github.com/AztecProtocol/aztec-packages/pull/8570) +* Infer globals to be u32 when used in a type ([#6083](https://github.com/noir-lang/noir/issues/6083)) +* removing implicit numeric generics ([#5837](https://github.com/noir-lang/noir/issues/5837)) + +### Features + +* (LSP) if in runtime code, always suggest functions that return Quoted as macro calls ([#6098](https://github.com/noir-lang/noir/issues/6098)) ([4a160cb](https://github.com/noir-lang/noir/commit/4a160cb99cbd9928c034a7009f398974fc6fdb11)) +* (LSP) remove unused imports ([#6129](https://github.com/noir-lang/noir/issues/6129)) ([98bc460](https://github.com/noir-lang/noir/commit/98bc46002cdd8daff1baf0756ecc60dbdf420fd9)) +* (LSP) show global value on hover ([#6097](https://github.com/noir-lang/noir/issues/6097)) ([3d9d072](https://github.com/noir-lang/noir/commit/3d9d07210544c9d27051eb5e629585760f48cd1c)) +* (LSP) suggest $vars inside `quote { ... }` ([#6114](https://github.com/noir-lang/noir/issues/6114)) ([73245b3](https://github.com/noir-lang/noir/commit/73245b3aae0c65780a102ac6842f06df65e5fc35)) +* Add `Expr::as_constructor` ([#5980](https://github.com/noir-lang/noir/issues/5980)) ([76dea7b](https://github.com/noir-lang/noir/commit/76dea7b409baa98236f6433f17c2ce9206dd4ba3)) +* Add `Expr::as_for` and `Expr::as_for_range` ([#6039](https://github.com/noir-lang/noir/issues/6039)) ([abcae75](https://github.com/noir-lang/noir/commit/abcae750f022dd7c49cee616edddd7b1cc93f3b8)) +* Add `Expr::as_lambda` ([#6048](https://github.com/noir-lang/noir/issues/6048)) ([31130dc](https://github.com/noir-lang/noir/commit/31130dc7aec24a7a7b9f342df94b14f295eb2103)) +* Add a `comptime` string type for string handling at compile-time ([#6026](https://github.com/noir-lang/noir/issues/6026)) ([5d2984f](https://github.com/noir-lang/noir/commit/5d2984fce4f55e43cb418e40462d430227b71768)) +* Add support for u1 in the avm, ToRadix's radix arg is a memory addr (https://github.com/AztecProtocol/aztec-packages/pull/8570) ([e8bbce7](https://github.com/noir-lang/noir/commit/e8bbce71fde3fc7af410c30920c2a547389d8248)) +* Allow silencing an unused variable defined via `let` ([#6149](https://github.com/noir-lang/noir/issues/6149)) ([a2bc059](https://github.com/noir-lang/noir/commit/a2bc059f993d3e9ca06a2fe4857ef1c522c97286)) +* Allow visibility modifiers in struct definitions ([#6054](https://github.com/noir-lang/noir/issues/6054)) ([199be58](https://github.com/noir-lang/noir/commit/199be584a36d20660ada49473050c5191251d6c5)) +* Check unconstrained trait impl method matches ([#6057](https://github.com/noir-lang/noir/issues/6057)) ([aedc983](https://github.com/noir-lang/noir/commit/aedc9832240e55473c504fa2e6e3b3af618bda08)) +* Default to outputting witness with file named after package ([#6031](https://github.com/noir-lang/noir/issues/6031)) ([e74b4ae](https://github.com/noir-lang/noir/commit/e74b4ae3ebcf301eedc5d0059bcebd5dced75d72)) +* Detect unconstructed structs ([#6061](https://github.com/noir-lang/noir/issues/6061)) ([bcb438b](https://github.com/noir-lang/noir/commit/bcb438b0816fbe08344535545612d32b4730af79)) +* Do not double error on import with error ([#6131](https://github.com/noir-lang/noir/issues/6131)) ([9b26650](https://github.com/noir-lang/noir/commit/9b26650f4a45c220484fc187500c7307af9c88d7)) +* Expose `derived_generators` and `pedersen_commitment_with_separator` from the stdlib ([#6154](https://github.com/noir-lang/noir/issues/6154)) ([877b806](https://github.com/noir-lang/noir/commit/877b806ee02cb640472c6bb2b1ed7bc76b861a9b)) +* Faster LSP by caching file managers ([#6047](https://github.com/noir-lang/noir/issues/6047)) ([c48a4f8](https://github.com/noir-lang/noir/commit/c48a4f83063ff55574d5b4a6277950a9edbc6317)) +* Hoist constant allocation outside of loops ([#6158](https://github.com/noir-lang/noir/issues/6158)) ([180bfc9](https://github.com/noir-lang/noir/commit/180bfc99944cd42b3f44048213458d1399687cef)) +* Implement `to_be_radix` in the comptime interpreter ([#6043](https://github.com/noir-lang/noir/issues/6043)) ([1550278](https://github.com/noir-lang/noir/commit/1550278f1e96392967b477b9b12be3bb0eea8fd6)) +* Implement solver for mov_registers_to_registers ([#6089](https://github.com/noir-lang/noir/issues/6089)) ([4170c55](https://github.com/noir-lang/noir/commit/4170c55019bd27fd51be8a46637514dfe86de53c)) +* Implement type paths ([#6093](https://github.com/noir-lang/noir/issues/6093)) ([2174ffb](https://github.com/noir-lang/noir/commit/2174ffb92b5d88e7e0926c91f42bc7f849e8ddc1)) +* Let `Module::functions` and `Module::structs` return them in definition order ([#6178](https://github.com/noir-lang/noir/issues/6178)) ([dec9874](https://github.com/noir-lang/noir/commit/dec98747197442f6c2a15e6543c5d453dff4b967)) +* Let LSP suggest macro calls too ([#6090](https://github.com/noir-lang/noir/issues/6090)) ([26d275b](https://github.com/noir-lang/noir/commit/26d275b65fa339d877c90d5c6c13ac8ef47189e1)) +* Let LSP suggest trait impl methods as you are typing them ([#6029](https://github.com/noir-lang/noir/issues/6029)) ([dfed81b](https://github.com/noir-lang/noir/commit/dfed81b4b39b2f783d6e81a78ee27fba7032e01c)) +* LSP autocompletion for `TypePath` ([#6117](https://github.com/noir-lang/noir/issues/6117)) ([3f79d8f](https://github.com/noir-lang/noir/commit/3f79d8f04c5f90c6b21359a3d0960446ebf84b2d)) +* **metaprogramming:** Add `#[use_callers_scope]` ([#6050](https://github.com/noir-lang/noir/issues/6050)) ([8c34046](https://github.com/noir-lang/noir/commit/8c340461c3f7054839009c4b1ed5ac8a0dd55e09)) +* Optimize allocating immediate amounts of memory (https://github.com/AztecProtocol/aztec-packages/pull/8579) ([e8bbce7](https://github.com/noir-lang/noir/commit/e8bbce71fde3fc7af410c30920c2a547389d8248)) +* Optimize constraints in sha256 ([#6145](https://github.com/noir-lang/noir/issues/6145)) ([164d29e](https://github.com/noir-lang/noir/commit/164d29e4d1960d16fdeafe2cc8ea8144a769f7b2)) +* **perf:** Allow array set last uses optimization in return block of Brillig functions ([#6119](https://github.com/noir-lang/noir/issues/6119)) ([5598059](https://github.com/noir-lang/noir/commit/5598059576c6cbc72474aff4b18bc5e4bb9f08e1)) +* **perf:** Handle array set optimization across blocks for Brillig functions ([#6153](https://github.com/noir-lang/noir/issues/6153)) ([12cb80a](https://github.com/noir-lang/noir/commit/12cb80a214fd81eb7619413a6d0663369be38512)) +* **perf:** Optimize array set from get ([#6207](https://github.com/noir-lang/noir/issues/6207)) ([dfeb1c5](https://github.com/noir-lang/noir/commit/dfeb1c51c564ec345978a9a0efef3e4e96ab638a)) +* **perf:** Remove inc_rc instructions for arrays which are never mutably borrowed ([#6168](https://github.com/noir-lang/noir/issues/6168)) ([a195442](https://github.com/noir-lang/noir/commit/a19544247fffaf5d2fe0d6d45013f833576f7c61)) +* **perf:** Remove redundant inc rc without instructions between ([#6183](https://github.com/noir-lang/noir/issues/6183)) ([be9dcfe](https://github.com/noir-lang/noir/commit/be9dcfe56d808b1bd5ef552d41274705b2df7062)) +* **perf:** Remove unused loads in mem2reg and last stores per function ([#5925](https://github.com/noir-lang/noir/issues/5925)) ([19eef30](https://github.com/noir-lang/noir/commit/19eef30cdbd8a3a4671aabbbe66b5481a5dec3f7)) +* **perf:** Remove useless paired RC instructions within a block during DIE ([#6160](https://github.com/noir-lang/noir/issues/6160)) ([59c4118](https://github.com/noir-lang/noir/commit/59c41182faa19d1cb8c9be5c11d50636fc17dad7)) +* **perf:** Simplify the cfg after DIE ([#6184](https://github.com/noir-lang/noir/issues/6184)) ([a1b5046](https://github.com/noir-lang/noir/commit/a1b50466bfd8c44d50440e00ecb50e29425471e5)) +* Pretty print Quoted token stream ([#6111](https://github.com/noir-lang/noir/issues/6111)) ([cd81f85](https://github.com/noir-lang/noir/commit/cd81f85856a477e208533ebd0915b5901c1bb184)) +* Refactor SSA passes to run on individual functions ([#6072](https://github.com/noir-lang/noir/issues/6072)) ([85c502c](https://github.com/noir-lang/noir/commit/85c502c9fa69b151fdff1a97b5a97ad78cb599ab)) +* Remove aztec macros ([#6087](https://github.com/noir-lang/noir/issues/6087)) ([9d96207](https://github.com/noir-lang/noir/commit/9d962077630131840f0cb7c211f462b579b0b577)) +* Remove orphaned blocks from cfg to improve `simplify_cfg` pass. ([#6198](https://github.com/noir-lang/noir/issues/6198)) ([b4712c5](https://github.com/noir-lang/noir/commit/b4712c5ba50ef38789978522afcd251ffbcf8780)) +* Remove sha256 opcode (https://github.com/AztecProtocol/aztec-packages/pull/4571) ([e8bbce7](https://github.com/noir-lang/noir/commit/e8bbce71fde3fc7af410c30920c2a547389d8248)) +* Remove unnecessary branching in keccak impl ([#6133](https://github.com/noir-lang/noir/issues/6133)) ([9c69dce](https://github.com/noir-lang/noir/commit/9c69dce2250b6fc656af8d9c06d7fac34b35c73a)) +* Represent assertions more similarly to function calls ([#6103](https://github.com/noir-lang/noir/issues/6103)) ([3ecd0e2](https://github.com/noir-lang/noir/commit/3ecd0e29441d27bc77c49993495209a70be0d86e)) +* Show test output when running via LSP ([#6049](https://github.com/noir-lang/noir/issues/6049)) ([9fb010e](https://github.com/noir-lang/noir/commit/9fb010ef8a93cf25e4d361ee42aa8969e5a46bab)) +* Simplify sha256 implementation ([#6142](https://github.com/noir-lang/noir/issues/6142)) ([acdfbbc](https://github.com/noir-lang/noir/commit/acdfbbc4ecc9d213dc885a12952e29e188420dff)) +* Skip `remove_enable_side_effects` pass on brillig functions ([#6199](https://github.com/noir-lang/noir/issues/6199)) ([2303615](https://github.com/noir-lang/noir/commit/2303615815a2a60de8ac3dd53349f85201660917)) +* **ssa:** Simplify signed casts ([#6166](https://github.com/noir-lang/noir/issues/6166)) ([eec3a61](https://github.com/noir-lang/noir/commit/eec3a6152493e56866ec5338ff52f823c530778e)) +* Swap endianness in-place in keccak implementation ([#6128](https://github.com/noir-lang/noir/issues/6128)) ([e3cdebe](https://github.com/noir-lang/noir/commit/e3cdebe515e4dc4ee6e16e01bd8af25135939798)) +* Syncing TypeVariableKind with Kind ([#6094](https://github.com/noir-lang/noir/issues/6094)) ([6440e18](https://github.com/noir-lang/noir/commit/6440e183085160d77563b4e735ccaaf199e21693)) +* Visibility for globals ([#6161](https://github.com/noir-lang/noir/issues/6161)) ([103b54d](https://github.com/noir-lang/noir/commit/103b54db8a5a81ecf76381fe99320c1e1f606898)) +* Visibility for modules ([#6165](https://github.com/noir-lang/noir/issues/6165)) ([fcdbcb9](https://github.com/noir-lang/noir/commit/fcdbcb91afb18771cbb5ee48628e171845f22f5f)) +* Visibility for traits ([#6056](https://github.com/noir-lang/noir/issues/6056)) ([5bbd9ba](https://github.com/noir-lang/noir/commit/5bbd9ba9a6d6494fd16813b44036b78c871f6613)) +* Visibility for type aliases ([#6058](https://github.com/noir-lang/noir/issues/6058)) ([66d2a07](https://github.com/noir-lang/noir/commit/66d2a07f0fedb04422c218cbe8d6fb080efac994)) + + +### Bug Fixes + +* (LSP) make goto and hover work well for attributes ([#6152](https://github.com/noir-lang/noir/issues/6152)) ([c679bc6](https://github.com/noir-lang/noir/commit/c679bc6bbd291b6264820dd497b37279116a1cd2)) +* Allow macros to change types on each iteration of a comptime loop ([#6105](https://github.com/noir-lang/noir/issues/6105)) ([0864e7c](https://github.com/noir-lang/noir/commit/0864e7c945089cc06f8cc9e5c7d933c465d8c892)) +* Allow providing default implementations of unconstrained trait methods ([#6138](https://github.com/noir-lang/noir/issues/6138)) ([7679bbc](https://github.com/noir-lang/noir/commit/7679bbc10cb2fa480489fe1aad83fe77ec2af7e8)) +* Always parse all tokens from quoted token streams ([#6064](https://github.com/noir-lang/noir/issues/6064)) ([23ed74b](https://github.com/noir-lang/noir/commit/23ed74bc94ec4da8dbd35da0ae39b26c7ef601e5)) +* Be more lenient with semicolons on interned expressions ([#6062](https://github.com/noir-lang/noir/issues/6062)) ([052c4fe](https://github.com/noir-lang/noir/commit/052c4fe52a4df9d6492f9b0d6b449151b87b18d5)) +* Consider constants as used values to keep their rc ops ([#6122](https://github.com/noir-lang/noir/issues/6122)) ([1217005](https://github.com/noir-lang/noir/commit/12170056102ea15698aacc820876fee0bb7d0c68)) +* Correct stack trace order in comptime assertion failures ([#6066](https://github.com/noir-lang/noir/issues/6066)) ([04f1636](https://github.com/noir-lang/noir/commit/04f1636ca0ccd741c72fa98d6c26227ea9835b0c)) +* Databus panic for fns with empty params (https://github.com/AztecProtocol/aztec-packages/pull/8847) ([d252748](https://github.com/noir-lang/noir/commit/d2527482dafef694be2f389e5b4dbc813234da71)) +* Decode databus return values ([#6095](https://github.com/noir-lang/noir/issues/6095)) ([c40eb1f](https://github.com/noir-lang/noir/commit/c40eb1fd8a0ba63b2d122e42b47dfa9dca5bf7b0)) +* Disable side-effects for no_predicates functions ([#6027](https://github.com/noir-lang/noir/issues/6027)) ([fc74c55](https://github.com/noir-lang/noir/commit/fc74c55ffed892962413c6fe15af62e1d2e7b785)) +* Disambiguate field or int static trait method call ([#6112](https://github.com/noir-lang/noir/issues/6112)) ([5b27ea4](https://github.com/noir-lang/noir/commit/5b27ea4d8031318723cc2b97f76758d401a565a0)) +* Do not duplicate constant arrays in brillig ([#6155](https://github.com/noir-lang/noir/issues/6155)) ([68f3022](https://github.com/noir-lang/noir/commit/68f3022fcdaab6e379e43091b3242e6ea51cff26)) +* **docs:** Rename recursion.md to recursion.mdx ([#6195](https://github.com/noir-lang/noir/issues/6195)) ([054e48b](https://github.com/noir-lang/noir/commit/054e48b76e7b083feb500d30c54912f9db57c565)) +* Don't crash on untyped global used as array length ([#6076](https://github.com/noir-lang/noir/issues/6076)) ([426f295](https://github.com/noir-lang/noir/commit/426f2955cbe4f086581d05eea7d06c47e0491195)) +* Ensure to_bytes returns the canonical decomposition ([#6084](https://github.com/noir-lang/noir/issues/6084)) ([b280a79](https://github.com/noir-lang/noir/commit/b280a79cf8a4fd2a97200e5436e0ec7cb7134711)) +* Error on `&mut x` when `x` is not mutable ([#6037](https://github.com/noir-lang/noir/issues/6037)) ([57afc7d](https://github.com/noir-lang/noir/commit/57afc7ddd424220106af7b9c6e0715007f6ea8b8)) +* Fix canonicalization bug ([#6033](https://github.com/noir-lang/noir/issues/6033)) ([7397772](https://github.com/noir-lang/noir/commit/739777214863de4088162711953f26ca992b356e)) +* Fix comptime type formatting ([#6079](https://github.com/noir-lang/noir/issues/6079)) ([e678091](https://github.com/noir-lang/noir/commit/e67809165c277423e25110c3f1f8eff6e8daa0e4)) +* Handle multi-byte utf8 characters in formatter ([#6118](https://github.com/noir-lang/noir/issues/6118)) ([b1d0619](https://github.com/noir-lang/noir/commit/b1d061926376965805ef3ece3e32d94df81462a6)) +* Handle parenthesized expressions in array length ([#6132](https://github.com/noir-lang/noir/issues/6132)) ([9f0b397](https://github.com/noir-lang/noir/commit/9f0b3971ee41e78241cbea4e3f81bac4edd5897d)) +* Ignore compression of blocks after msg.len in sha256_var ([#6206](https://github.com/noir-lang/noir/issues/6206)) ([76eec71](https://github.com/noir-lang/noir/commit/76eec710ff73e5e45fdddcd41ae2cd74e879cfa5)) +* Infer globals to be u32 when used in a type ([#6083](https://github.com/noir-lang/noir/issues/6083)) ([78262c9](https://github.com/noir-lang/noir/commit/78262c96d5b116c77e50653f9059da60824db812)) +* Initialise databus using return values ([#6074](https://github.com/noir-lang/noir/issues/6074)) ([e17dfa5](https://github.com/noir-lang/noir/commit/e17dfa55719f0cfb1080dd25eeda7b70ed44b60d)) +* Let LSP suggest fields and methods in LValue chains ([#6051](https://github.com/noir-lang/noir/issues/6051)) ([5bf6567](https://github.com/noir-lang/noir/commit/5bf6567320629835ef6fa7765ca87e9b38ae4c9a)) +* Let token pretty printer handle `+=` and similar token sequences ([#6135](https://github.com/noir-lang/noir/issues/6135)) ([684b6cc](https://github.com/noir-lang/noir/commit/684b6cc7deb3ed7ecbb2cea4663e8e9a3ae075f0)) +* **mem2reg:** Remove possibility of underflow ([#6107](https://github.com/noir-lang/noir/issues/6107)) ([aea5cc7](https://github.com/noir-lang/noir/commit/aea5cc789ccf4a4d16b1d238d99474f37920b37e)) +* Parse a statement as an expression ([#6040](https://github.com/noir-lang/noir/issues/6040)) ([ab203e4](https://github.com/noir-lang/noir/commit/ab203e4ee902b9137519f9a4261ec368d22f0a25)) +* Pass radix directly to the blackbox ([#6164](https://github.com/noir-lang/noir/issues/6164)) ([82b89c4](https://github.com/noir-lang/noir/commit/82b89c421da80b719922416d574c1bbaa73d55b4)) +* Preserve generic kind on trait methods ([#6099](https://github.com/noir-lang/noir/issues/6099)) ([1df102a](https://github.com/noir-lang/noir/commit/1df102a1ee0eb39dcbada50e10b226c7f7be0f26)) +* Prevent check_can_mutate crashing on undefined variable ([#6044](https://github.com/noir-lang/noir/issues/6044)) ([b3accfc](https://github.com/noir-lang/noir/commit/b3accfc99249ccd198051ecb98cf7962af64a629)) +* Revert mistaken stack size change ([#6212](https://github.com/noir-lang/noir/issues/6212)) ([a37117a](https://github.com/noir-lang/noir/commit/a37117aca3340447d807c1cf3ca79ba573ceaf8b)) +* **ssa:** Check if result of array set is used in value of another array set ([#6197](https://github.com/noir-lang/noir/issues/6197)) ([594ec91](https://github.com/noir-lang/noir/commit/594ec91de55c4cf191d7cdc94a00bb16711cd430)) +* **ssa:** RC correctness issue ([#6134](https://github.com/noir-lang/noir/issues/6134)) ([5b1c896](https://github.com/noir-lang/noir/commit/5b1c896c605ed1047fc17a437e0b58792a778e2d)) +* Type variables by default should have Any kind ([#6203](https://github.com/noir-lang/noir/issues/6203)) ([268f2a0](https://github.com/noir-lang/noir/commit/268f2a0240c507646c65c932748d1bdf062d00b1)) +* Unify macro result type with actual type ([#6086](https://github.com/noir-lang/noir/issues/6086)) ([af52873](https://github.com/noir-lang/noir/commit/af52873dbec9ab980d17d9ba4336181c006a9a53)) +* Update databus in flattening ([#6063](https://github.com/noir-lang/noir/issues/6063)) ([e993da1](https://github.com/noir-lang/noir/commit/e993da1b01aa98deed2af7b5cba2da216fb036a0)) + + +### Miscellaneous Chores + +* Removing implicit numeric generics ([#5837](https://github.com/noir-lang/noir/issues/5837)) ([eda9043](https://github.com/noir-lang/noir/commit/eda904328b269b5926f8a82ab82e52a485903bbe)) + ## [0.34.0](https://github.com/noir-lang/noir/compare/v0.33.0...v0.34.0) (2024-09-13) diff --git a/noir/noir-repo/Cargo.lock b/noir/noir-repo/Cargo.lock index 4b56812e96d..a5544310617 100644 --- a/noir/noir-repo/Cargo.lock +++ b/noir/noir-repo/Cargo.lock @@ -4,7 +4,7 @@ version = 3 [[package]] name = "acir" -version = "0.50.0" +version = "0.51.0" dependencies = [ "acir_field", "base64 0.21.7", @@ -26,7 +26,7 @@ dependencies = [ [[package]] name = "acir_field" -version = "0.50.0" +version = "0.51.0" dependencies = [ "ark-bls12-381", "ark-bn254", @@ -40,7 +40,7 @@ dependencies = [ [[package]] name = "acvm" -version = "0.50.0" +version = "0.51.0" dependencies = [ "acir", "acvm_blackbox_solver", @@ -59,7 +59,7 @@ dependencies = [ [[package]] name = "acvm_blackbox_solver" -version = "0.50.0" +version = "0.51.0" dependencies = [ "acir", "blake2", @@ -97,7 +97,7 @@ dependencies = [ [[package]] name = "acvm_js" -version = "0.50.0" +version = "0.51.0" dependencies = [ "acvm", "bn254_blackbox_solver", @@ -589,7 +589,7 @@ dependencies = [ [[package]] name = "bn254_blackbox_solver" -version = "0.50.0" +version = "0.51.0" dependencies = [ "acir", "acvm_blackbox_solver", @@ -607,7 +607,7 @@ dependencies = [ [[package]] name = "brillig" -version = "0.50.0" +version = "0.51.0" dependencies = [ "acir_field", "serde", @@ -615,7 +615,7 @@ dependencies = [ [[package]] name = "brillig_vm" -version = "0.50.0" +version = "0.51.0" dependencies = [ "acir", "acvm_blackbox_solver", @@ -1552,7 +1552,7 @@ dependencies = [ [[package]] name = "fm" -version = "0.34.0" +version = "0.35.0" dependencies = [ "codespan-reporting", "iter-extended", @@ -2158,7 +2158,7 @@ dependencies = [ [[package]] name = "iter-extended" -version = "0.34.0" +version = "0.35.0" [[package]] name = "itertools" @@ -2536,7 +2536,7 @@ dependencies = [ [[package]] name = "nargo" -version = "0.34.0" +version = "0.35.0" dependencies = [ "acvm", "fm", @@ -2563,7 +2563,7 @@ dependencies = [ [[package]] name = "nargo_cli" -version = "0.34.0" +version = "0.35.0" dependencies = [ "acvm", "assert_cmd", @@ -2616,7 +2616,7 @@ dependencies = [ [[package]] name = "nargo_fmt" -version = "0.34.0" +version = "0.35.0" dependencies = [ "bytecount", "noirc_errors", @@ -2629,7 +2629,7 @@ dependencies = [ [[package]] name = "nargo_toml" -version = "0.34.0" +version = "0.35.0" dependencies = [ "dirs", "fm", @@ -2703,7 +2703,7 @@ dependencies = [ [[package]] name = "noir_debugger" -version = "0.34.0" +version = "0.35.0" dependencies = [ "acvm", "assert_cmd", @@ -2727,7 +2727,7 @@ dependencies = [ [[package]] name = "noir_fuzzer" -version = "0.34.0" +version = "0.35.0" dependencies = [ "acvm", "noirc_abi", @@ -2750,7 +2750,7 @@ dependencies = [ [[package]] name = "noir_lsp" -version = "0.34.0" +version = "0.35.0" dependencies = [ "acvm", "async-lsp", @@ -2780,7 +2780,7 @@ dependencies = [ [[package]] name = "noir_profiler" -version = "0.34.0" +version = "0.35.0" dependencies = [ "acir", "clap", @@ -2802,7 +2802,7 @@ dependencies = [ [[package]] name = "noir_wasm" -version = "0.34.0" +version = "0.35.0" dependencies = [ "acvm", "build-data", @@ -2826,7 +2826,7 @@ dependencies = [ [[package]] name = "noirc_abi" -version = "0.34.0" +version = "0.35.0" dependencies = [ "acvm", "iter-extended", @@ -2845,7 +2845,7 @@ dependencies = [ [[package]] name = "noirc_abi_wasm" -version = "0.34.0" +version = "0.35.0" dependencies = [ "acvm", "build-data", @@ -2862,11 +2862,11 @@ dependencies = [ [[package]] name = "noirc_arena" -version = "0.34.0" +version = "0.35.0" [[package]] name = "noirc_artifacts" -version = "0.34.0" +version = "0.35.0" dependencies = [ "acvm", "codespan-reporting", @@ -2881,7 +2881,7 @@ dependencies = [ [[package]] name = "noirc_driver" -version = "0.34.0" +version = "0.35.0" dependencies = [ "acvm", "build-data", @@ -2900,7 +2900,7 @@ dependencies = [ [[package]] name = "noirc_errors" -version = "0.34.0" +version = "0.35.0" dependencies = [ "acvm", "base64 0.21.7", @@ -2918,7 +2918,7 @@ dependencies = [ [[package]] name = "noirc_evaluator" -version = "0.34.0" +version = "0.35.0" dependencies = [ "acvm", "bn254_blackbox_solver", @@ -2941,7 +2941,7 @@ dependencies = [ [[package]] name = "noirc_frontend" -version = "0.34.0" +version = "0.35.0" dependencies = [ "acvm", "base64 0.21.7", @@ -2972,7 +2972,7 @@ dependencies = [ [[package]] name = "noirc_printable_type" -version = "0.34.0" +version = "0.35.0" dependencies = [ "acvm", "iter-extended", diff --git a/noir/noir-repo/Cargo.toml b/noir/noir-repo/Cargo.toml index a6cfa7de07f..6741fb8a98e 100644 --- a/noir/noir-repo/Cargo.toml +++ b/noir/noir-repo/Cargo.toml @@ -40,7 +40,7 @@ resolver = "2" [workspace.package] # x-release-please-start-version -version = "0.34.0" +version = "0.35.0" # x-release-please-end authors = ["The Noir Team "] edition = "2021" @@ -57,13 +57,13 @@ unused_qualifications = "warn" [workspace.dependencies] # ACVM workspace dependencies -acir_field = { version = "0.50.0", path = "acvm-repo/acir_field", default-features = false } -acir = { version = "0.50.0", path = "acvm-repo/acir", default-features = false } -acvm = { version = "0.50.0", path = "acvm-repo/acvm" } -brillig = { version = "0.50.0", path = "acvm-repo/brillig", default-features = false } -brillig_vm = { version = "0.50.0", path = "acvm-repo/brillig_vm", default-features = false } -acvm_blackbox_solver = { version = "0.50.0", path = "acvm-repo/blackbox_solver", default-features = false } -bn254_blackbox_solver = { version = "0.50.0", path = "acvm-repo/bn254_blackbox_solver", default-features = false } +acir_field = { version = "0.51.0", path = "acvm-repo/acir_field", default-features = false } +acir = { version = "0.51.0", path = "acvm-repo/acir", default-features = false } +acvm = { version = "0.51.0", path = "acvm-repo/acvm" } +brillig = { version = "0.51.0", path = "acvm-repo/brillig", default-features = false } +brillig_vm = { version = "0.51.0", path = "acvm-repo/brillig_vm", default-features = false } +acvm_blackbox_solver = { version = "0.51.0", path = "acvm-repo/blackbox_solver", default-features = false } +bn254_blackbox_solver = { version = "0.51.0", path = "acvm-repo/bn254_blackbox_solver", default-features = false } # Noir compiler workspace dependencies fm = { path = "compiler/fm" } diff --git a/noir/noir-repo/acvm-repo/CHANGELOG.md b/noir/noir-repo/acvm-repo/CHANGELOG.md index 8d47e10c45a..9541edb74a3 100644 --- a/noir/noir-repo/acvm-repo/CHANGELOG.md +++ b/noir/noir-repo/acvm-repo/CHANGELOG.md @@ -5,6 +5,92 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.51.0](https://github.com/noir-lang/noir/compare/v0.50.0...v0.51.0) (2024-10-03) + + +### ⚠ BREAKING CHANGES + +* remove sha256 opcode (https://github.com/AztecProtocol/aztec-packages/pull/4571) +* add support for u1 in the avm, ToRadix's radix arg is a memory addr (https://github.com/AztecProtocol/aztec-packages/pull/8570) +* Add Not instruction in brillig (https://github.com/AztecProtocol/aztec-packages/pull/8488) +* **avm:** variants for SET opcode (https://github.com/AztecProtocol/aztec-packages/pull/8441) +* **avm/brillig:** take addresses in calldatacopy (https://github.com/AztecProtocol/aztec-packages/pull/8388) +* constant inputs for blackbox (https://github.com/AztecProtocol/aztec-packages/pull/7222) + +### Features + +* (bb) 128-bit challenges (https://github.com/AztecProtocol/aztec-packages/pull/8406) ([3c3ed1e](https://github.com/noir-lang/noir/commit/3c3ed1e3d28946a02071c524dd128afe131bc3da)) +* **acir_gen:** Width aware ACIR gen addition ([#5493](https://github.com/noir-lang/noir/issues/5493)) ([85fa592](https://github.com/noir-lang/noir/commit/85fa592fdef3b8589ce03b232e1b51565837b540)) +* Add assertions for ACVM `FunctionInput` `bit_size` ([#5864](https://github.com/noir-lang/noir/issues/5864)) ([8712f4c](https://github.com/noir-lang/noir/commit/8712f4c20d23f3809bcfb03f2e3ba0e5ace20a1d)) +* Add Not instruction in brillig (https://github.com/AztecProtocol/aztec-packages/pull/8488) ([95e19ab](https://github.com/noir-lang/noir/commit/95e19ab9486ad054241b6e53e40e55bdba9dc7e5)) +* Add recursive aggregation object to proving/verification keys (https://github.com/AztecProtocol/aztec-packages/pull/6770) ([4ea25db](https://github.com/noir-lang/noir/commit/4ea25dbde87488e758139619a3ce4edf93c6ebd6)) +* Add reusable procedures to brillig generation (https://github.com/AztecProtocol/aztec-packages/pull/7981) ([5c4f19f](https://github.com/noir-lang/noir/commit/5c4f19f097dd3704522996330c961bf0a2db8d99)) +* Add support for u1 in the avm, ToRadix's radix arg is a memory addr (https://github.com/AztecProtocol/aztec-packages/pull/8570) ([e8bbce7](https://github.com/noir-lang/noir/commit/e8bbce71fde3fc7af410c30920c2a547389d8248)) +* Added indirect const instruction (https://github.com/AztecProtocol/aztec-packages/pull/8065) ([5c4f19f](https://github.com/noir-lang/noir/commit/5c4f19f097dd3704522996330c961bf0a2db8d99)) +* Adding aggregation to honk and rollup (https://github.com/AztecProtocol/aztec-packages/pull/7466) ([4ea25db](https://github.com/noir-lang/noir/commit/4ea25dbde87488e758139619a3ce4edf93c6ebd6)) +* Automate verify_honk_proof input generation (https://github.com/AztecProtocol/aztec-packages/pull/8092) ([5c4f19f](https://github.com/noir-lang/noir/commit/5c4f19f097dd3704522996330c961bf0a2db8d99)) +* **avm/brillig:** Take addresses in calldatacopy (https://github.com/AztecProtocol/aztec-packages/pull/8388) ([3c3ed1e](https://github.com/noir-lang/noir/commit/3c3ed1e3d28946a02071c524dd128afe131bc3da)) +* **avm:** Variants for SET opcode (https://github.com/AztecProtocol/aztec-packages/pull/8441) ([3c3ed1e](https://github.com/noir-lang/noir/commit/3c3ed1e3d28946a02071c524dd128afe131bc3da)) +* Avoid heap allocs when going to/from field (https://github.com/AztecProtocol/aztec-packages/pull/7547) ([daad75c](https://github.com/noir-lang/noir/commit/daad75c26d19ae707b90a7424b77dab9937e8575)) +* Change the layout of arrays and vectors to be a single pointer (https://github.com/AztecProtocol/aztec-packages/pull/8448) ([d4832ec](https://github.com/noir-lang/noir/commit/d4832ece9d3ad16544afea49cc7caf40501a2cc3)) +* Constant inputs for blackbox (https://github.com/AztecProtocol/aztec-packages/pull/7222) ([fb97bb9](https://github.com/noir-lang/noir/commit/fb97bb9b795c9d7af395b82fd6f0ea8111d59c11)) +* Hook up secondary calldata column in dsl (https://github.com/AztecProtocol/aztec-packages/pull/7759) ([4ea25db](https://github.com/noir-lang/noir/commit/4ea25dbde87488e758139619a3ce4edf93c6ebd6)) +* Integrate new proving systems in e2e (https://github.com/AztecProtocol/aztec-packages/pull/6971) ([daad75c](https://github.com/noir-lang/noir/commit/daad75c26d19ae707b90a7424b77dab9937e8575)) +* Make Brillig do integer arithmetic operations using u128 instead of Bigint (https://github.com/AztecProtocol/aztec-packages/pull/7518) ([daad75c](https://github.com/noir-lang/noir/commit/daad75c26d19ae707b90a7424b77dab9937e8575)) +* Make token transfer be recursive (https://github.com/AztecProtocol/aztec-packages/pull/7730) ([4ea25db](https://github.com/noir-lang/noir/commit/4ea25dbde87488e758139619a3ce4edf93c6ebd6)) +* New test programs for wasm benchmarking (https://github.com/AztecProtocol/aztec-packages/pull/8389) ([95e19ab](https://github.com/noir-lang/noir/commit/95e19ab9486ad054241b6e53e40e55bdba9dc7e5)) +* Note hashes as points (https://github.com/AztecProtocol/aztec-packages/pull/7618) ([4ea25db](https://github.com/noir-lang/noir/commit/4ea25dbde87488e758139619a3ce4edf93c6ebd6)) +* Optimize allocating immediate amounts of memory (https://github.com/AztecProtocol/aztec-packages/pull/8579) ([e8bbce7](https://github.com/noir-lang/noir/commit/e8bbce71fde3fc7af410c30920c2a547389d8248)) +* Optimize constant array handling in brillig_gen (https://github.com/AztecProtocol/aztec-packages/pull/7661) ([4ea25db](https://github.com/noir-lang/noir/commit/4ea25dbde87488e758139619a3ce4edf93c6ebd6)) +* Optimize to_radix (https://github.com/AztecProtocol/aztec-packages/pull/8073) ([5c4f19f](https://github.com/noir-lang/noir/commit/5c4f19f097dd3704522996330c961bf0a2db8d99)) +* Pass calldata ids to the backend (https://github.com/AztecProtocol/aztec-packages/pull/7875) ([4ea25db](https://github.com/noir-lang/noir/commit/4ea25dbde87488e758139619a3ce4edf93c6ebd6)) +* Poseidon2 gates for Ultra arithmetisation (https://github.com/AztecProtocol/aztec-packages/pull/7494) ([5c4f19f](https://github.com/noir-lang/noir/commit/5c4f19f097dd3704522996330c961bf0a2db8d99)) +* **profiler:** Add support for brillig functions in opcodes-flamegraph (https://github.com/AztecProtocol/aztec-packages/pull/7698) ([4ea25db](https://github.com/noir-lang/noir/commit/4ea25dbde87488e758139619a3ce4edf93c6ebd6)) +* Remove sha256 opcode (https://github.com/AztecProtocol/aztec-packages/pull/4571) ([e8bbce7](https://github.com/noir-lang/noir/commit/e8bbce71fde3fc7af410c30920c2a547389d8248)) +* Removing superfluous call to MSM (https://github.com/AztecProtocol/aztec-packages/pull/7708) ([4ea25db](https://github.com/noir-lang/noir/commit/4ea25dbde87488e758139619a3ce4edf93c6ebd6)) +* Report gates and VKs of private protocol circuits with megahonk (https://github.com/AztecProtocol/aztec-packages/pull/7722) ([4ea25db](https://github.com/noir-lang/noir/commit/4ea25dbde87488e758139619a3ce4edf93c6ebd6)) +* Simplify constant calls to `poseidon2_permutation`, `schnorr_verify` and `embedded_curve_add` ([#5140](https://github.com/noir-lang/noir/issues/5140)) ([2823ba7](https://github.com/noir-lang/noir/commit/2823ba7242db788ca1d7f6e7a48be2f1de62f278)) +* Small optimization in toradix (https://github.com/AztecProtocol/aztec-packages/pull/8040) ([5c4f19f](https://github.com/noir-lang/noir/commit/5c4f19f097dd3704522996330c961bf0a2db8d99)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/7392) ([fb97bb9](https://github.com/noir-lang/noir/commit/fb97bb9b795c9d7af395b82fd6f0ea8111d59c11)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/7400) ([fb97bb9](https://github.com/noir-lang/noir/commit/fb97bb9b795c9d7af395b82fd6f0ea8111d59c11)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/7432) ([daad75c](https://github.com/noir-lang/noir/commit/daad75c26d19ae707b90a7424b77dab9937e8575)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/7444) ([daad75c](https://github.com/noir-lang/noir/commit/daad75c26d19ae707b90a7424b77dab9937e8575)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/7454) ([daad75c](https://github.com/noir-lang/noir/commit/daad75c26d19ae707b90a7424b77dab9937e8575)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/7512) ([daad75c](https://github.com/noir-lang/noir/commit/daad75c26d19ae707b90a7424b77dab9937e8575)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/7577) ([daad75c](https://github.com/noir-lang/noir/commit/daad75c26d19ae707b90a7424b77dab9937e8575)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/7583) ([daad75c](https://github.com/noir-lang/noir/commit/daad75c26d19ae707b90a7424b77dab9937e8575)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/7743) ([4ea25db](https://github.com/noir-lang/noir/commit/4ea25dbde87488e758139619a3ce4edf93c6ebd6)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/7862) ([4ea25db](https://github.com/noir-lang/noir/commit/4ea25dbde87488e758139619a3ce4edf93c6ebd6)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/7945) ([4ea25db](https://github.com/noir-lang/noir/commit/4ea25dbde87488e758139619a3ce4edf93c6ebd6)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/7958) ([5c4f19f](https://github.com/noir-lang/noir/commit/5c4f19f097dd3704522996330c961bf0a2db8d99)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/8008) ([5c4f19f](https://github.com/noir-lang/noir/commit/5c4f19f097dd3704522996330c961bf0a2db8d99)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/8093) ([5c4f19f](https://github.com/noir-lang/noir/commit/5c4f19f097dd3704522996330c961bf0a2db8d99)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/8125) ([f0c2686](https://github.com/noir-lang/noir/commit/f0c268606a71381ab4504396695a0adb9b3258b6)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/8237) ([f0c2686](https://github.com/noir-lang/noir/commit/f0c268606a71381ab4504396695a0adb9b3258b6)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/8423) ([3c3ed1e](https://github.com/noir-lang/noir/commit/3c3ed1e3d28946a02071c524dd128afe131bc3da)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/8435) ([3c3ed1e](https://github.com/noir-lang/noir/commit/3c3ed1e3d28946a02071c524dd128afe131bc3da)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/8466) ([3c3ed1e](https://github.com/noir-lang/noir/commit/3c3ed1e3d28946a02071c524dd128afe131bc3da)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/8482) ([d4832ec](https://github.com/noir-lang/noir/commit/d4832ece9d3ad16544afea49cc7caf40501a2cc3)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/8512) ([95e19ab](https://github.com/noir-lang/noir/commit/95e19ab9486ad054241b6e53e40e55bdba9dc7e5)) +* Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/8526) ([95e19ab](https://github.com/noir-lang/noir/commit/95e19ab9486ad054241b6e53e40e55bdba9dc7e5)) +* TXE nr deployments, dependency cleanup for CLI (https://github.com/AztecProtocol/aztec-packages/pull/7548) ([4ea25db](https://github.com/noir-lang/noir/commit/4ea25dbde87488e758139619a3ce4edf93c6ebd6)) +* Typing return values of embedded_curve_ops (https://github.com/AztecProtocol/aztec-packages/pull/7413) ([daad75c](https://github.com/noir-lang/noir/commit/daad75c26d19ae707b90a7424b77dab9937e8575)) +* Unify all acir recursion constraints based on RecursionConstraint and proof_type (https://github.com/AztecProtocol/aztec-packages/pull/7993) ([5c4f19f](https://github.com/noir-lang/noir/commit/5c4f19f097dd3704522996330c961bf0a2db8d99)) + + +### Bug Fixes + +* Add trailing extra arguments for backend in gates_flamegraph (https://github.com/AztecProtocol/aztec-packages/pull/7472) ([daad75c](https://github.com/noir-lang/noir/commit/daad75c26d19ae707b90a7424b77dab9937e8575)) +* **debugger:** Update the debugger to handle the new Brillig debug metadata format ([#5706](https://github.com/noir-lang/noir/issues/5706)) ([a31f82e](https://github.com/noir-lang/noir/commit/a31f82e598def60d00c65b79b8c5411f8aa832aa)) +* Deflatten databus visibilities (https://github.com/AztecProtocol/aztec-packages/pull/7761) ([4ea25db](https://github.com/noir-lang/noir/commit/4ea25dbde87488e758139619a3ce4edf93c6ebd6)) +* Do not duplicate redundant Brillig debug metadata ([#5696](https://github.com/noir-lang/noir/issues/5696)) ([e4f7dbe](https://github.com/noir-lang/noir/commit/e4f7dbe63b55807b3ff0b4d6f47a8b7f847299fb)) +* Export brillig names in contract functions (https://github.com/AztecProtocol/aztec-packages/pull/8212) ([f0c2686](https://github.com/noir-lang/noir/commit/f0c268606a71381ab4504396695a0adb9b3258b6)) +* Handle multiple entry points for Brillig call stack resolution after metadata deduplication ([#5788](https://github.com/noir-lang/noir/issues/5788)) ([38fe9dd](https://github.com/noir-lang/noir/commit/38fe9dda111952fdb894df90a319c087382edfc9)) +* Move BigInt modulus checks to runtime in brillig ([#5374](https://github.com/noir-lang/noir/issues/5374)) ([741d339](https://github.com/noir-lang/noir/commit/741d33991f8e2918bf092c354ca56047e0274533)) +* Restrict keccak256_injective test input to 8 bits ([#5977](https://github.com/noir-lang/noir/issues/5977)) ([a1b1346](https://github.com/noir-lang/noir/commit/a1b1346bf7525c508fd390393c307475cc2345d7)) +* Revert "feat: Sync from noir (https://github.com/AztecProtocol/aztec-packages/pull/7512)" (https://github.com/AztecProtocol/aztec-packages/pull/7558) ([daad75c](https://github.com/noir-lang/noir/commit/daad75c26d19ae707b90a7424b77dab9937e8575)) +* Runtime brillig bigint id assignment ([#5369](https://github.com/noir-lang/noir/issues/5369)) ([a8928dd](https://github.com/noir-lang/noir/commit/a8928ddcffcae15babf7aa5aff0e462e4549552e)) + ## [0.50.0](https://github.com/noir-lang/noir/compare/v0.49.0...v0.50.0) (2024-09-13) diff --git a/noir/noir-repo/acvm-repo/acir/Cargo.toml b/noir/noir-repo/acvm-repo/acir/Cargo.toml index b707ae9ad79..69d0f273bb3 100644 --- a/noir/noir-repo/acvm-repo/acir/Cargo.toml +++ b/noir/noir-repo/acvm-repo/acir/Cargo.toml @@ -2,7 +2,7 @@ name = "acir" description = "ACIR is the IR that the VM processes, it is analogous to LLVM IR" # x-release-please-start-version -version = "0.50.0" +version = "0.51.0" # x-release-please-end authors.workspace = true edition.workspace = true diff --git a/noir/noir-repo/acvm-repo/acir_field/Cargo.toml b/noir/noir-repo/acvm-repo/acir_field/Cargo.toml index 168628b0d4a..4947d0b572a 100644 --- a/noir/noir-repo/acvm-repo/acir_field/Cargo.toml +++ b/noir/noir-repo/acvm-repo/acir_field/Cargo.toml @@ -2,7 +2,7 @@ name = "acir_field" description = "The field implementation being used by ACIR." # x-release-please-start-version -version = "0.50.0" +version = "0.51.0" # x-release-please-end authors.workspace = true edition.workspace = true diff --git a/noir/noir-repo/acvm-repo/acvm/Cargo.toml b/noir/noir-repo/acvm-repo/acvm/Cargo.toml index 29375a57a6e..b086e7ac197 100644 --- a/noir/noir-repo/acvm-repo/acvm/Cargo.toml +++ b/noir/noir-repo/acvm-repo/acvm/Cargo.toml @@ -2,7 +2,7 @@ name = "acvm" description = "The virtual machine that processes ACIR given a backend/proof system." # x-release-please-start-version -version = "0.50.0" +version = "0.51.0" # x-release-please-end authors.workspace = true edition.workspace = true diff --git a/noir/noir-repo/acvm-repo/acvm_js/Cargo.toml b/noir/noir-repo/acvm-repo/acvm_js/Cargo.toml index b5b55dbb91a..7ec7e5a282e 100644 --- a/noir/noir-repo/acvm-repo/acvm_js/Cargo.toml +++ b/noir/noir-repo/acvm-repo/acvm_js/Cargo.toml @@ -2,7 +2,7 @@ name = "acvm_js" description = "Typescript wrapper around the ACVM allowing execution of ACIR code" # x-release-please-start-version -version = "0.50.0" +version = "0.51.0" # x-release-please-end authors.workspace = true edition.workspace = true diff --git a/noir/noir-repo/acvm-repo/acvm_js/package.json b/noir/noir-repo/acvm-repo/acvm_js/package.json index 95b8a46456f..03197cc41f8 100644 --- a/noir/noir-repo/acvm-repo/acvm_js/package.json +++ b/noir/noir-repo/acvm-repo/acvm_js/package.json @@ -1,6 +1,6 @@ { "name": "@noir-lang/acvm_js", - "version": "0.50.0", + "version": "0.51.0", "publishConfig": { "access": "public" }, diff --git a/noir/noir-repo/acvm-repo/blackbox_solver/Cargo.toml b/noir/noir-repo/acvm-repo/blackbox_solver/Cargo.toml index b8b17db433c..51c782d9581 100644 --- a/noir/noir-repo/acvm-repo/blackbox_solver/Cargo.toml +++ b/noir/noir-repo/acvm-repo/blackbox_solver/Cargo.toml @@ -2,7 +2,7 @@ name = "acvm_blackbox_solver" description = "A solver for the blackbox functions found in ACIR and Brillig" # x-release-please-start-version -version = "0.50.0" +version = "0.51.0" # x-release-please-end authors.workspace = true edition.workspace = true diff --git a/noir/noir-repo/acvm-repo/bn254_blackbox_solver/Cargo.toml b/noir/noir-repo/acvm-repo/bn254_blackbox_solver/Cargo.toml index c892dc45fdd..bd63f51410a 100644 --- a/noir/noir-repo/acvm-repo/bn254_blackbox_solver/Cargo.toml +++ b/noir/noir-repo/acvm-repo/bn254_blackbox_solver/Cargo.toml @@ -2,7 +2,7 @@ name = "bn254_blackbox_solver" description = "Solvers for black box functions which are specific for the bn254 curve" # x-release-please-start-version -version = "0.50.0" +version = "0.51.0" # x-release-please-end authors.workspace = true edition.workspace = true diff --git a/noir/noir-repo/acvm-repo/brillig/Cargo.toml b/noir/noir-repo/acvm-repo/brillig/Cargo.toml index 0dec8fa2147..8fe66201a04 100644 --- a/noir/noir-repo/acvm-repo/brillig/Cargo.toml +++ b/noir/noir-repo/acvm-repo/brillig/Cargo.toml @@ -2,7 +2,7 @@ name = "brillig" description = "Brillig is the bytecode ACIR uses for non-determinism." # x-release-please-start-version -version = "0.50.0" +version = "0.51.0" # x-release-please-end authors.workspace = true edition.workspace = true diff --git a/noir/noir-repo/acvm-repo/brillig_vm/Cargo.toml b/noir/noir-repo/acvm-repo/brillig_vm/Cargo.toml index a5e1f7182b1..e82274d203d 100644 --- a/noir/noir-repo/acvm-repo/brillig_vm/Cargo.toml +++ b/noir/noir-repo/acvm-repo/brillig_vm/Cargo.toml @@ -2,7 +2,7 @@ name = "brillig_vm" description = "The virtual machine that processes Brillig bytecode, used to introduce non-determinism to the ACVM" # x-release-please-start-version -version = "0.50.0" +version = "0.51.0" # x-release-please-end authors.workspace = true edition.workspace = true diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/function_builder/data_bus.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/function_builder/data_bus.rs index 38895bb977e..3056fb5973d 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/function_builder/data_bus.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/function_builder/data_bus.rs @@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; use super::FunctionBuilder; -#[derive(Clone, Debug, Eq, PartialEq)] +#[derive(Clone, Copy, Debug, Eq, PartialEq)] pub(crate) enum DatabusVisibility { None, CallData(u32), @@ -214,34 +214,27 @@ impl FunctionBuilder { fn deflatten_databus_visibilities( &self, ssa_params: &[ValueId], - flattened_params_databus_visibility: Vec, + mut flattened_params_databus_visibility: Vec, ) -> Vec { - // To do so, create a vec the size of the flattened arguments where the items are the ssa param index they correspond to - let ssa_param_indices: Vec<_> = ssa_params + let ssa_param_sizes: Vec<_> = ssa_params .iter() - .enumerate() - .flat_map(|(ssa_param_index, ssa_param)| { - let flattened_size = - self.current_function.dfg[*ssa_param].get_type().flattened_size(); - std::iter::repeat(ssa_param_index).take(flattened_size) - }) + .map(|ssa_param| self.current_function.dfg[*ssa_param].get_type().flattened_size()) .collect(); let mut is_ssa_params_databus = Vec::with_capacity(ssa_params.len()); - assert!(flattened_params_databus_visibility.len() == ssa_param_indices.len()); - for (databus_visibility, ssa_index) in - flattened_params_databus_visibility.into_iter().zip(ssa_param_indices) - { - if let Some(previous_databus_visibility) = is_ssa_params_databus.get(ssa_index) { - assert!( - *previous_databus_visibility == databus_visibility, - "inconsistent databus visibility for ssa param" - ); - } else { - assert!(ssa_index == is_ssa_params_databus.len()); - is_ssa_params_databus.push(databus_visibility); - } + for size in ssa_param_sizes { + let visibilities: Vec = + flattened_params_databus_visibility.drain(0..size).collect(); + let visibility = visibilities.get(0).copied().unwrap_or(DatabusVisibility::None); + assert!( + visibilities.iter().all(|v| *v == visibility), + "inconsistent databus visibility for ssa param" + ); + is_ssa_params_databus.push(visibility); } + + assert_eq!(is_ssa_params_databus.len(), ssa_params.len()); + is_ssa_params_databus } } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/cfg.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/cfg.rs index b9166bf1d56..38e6efa5b9a 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/cfg.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/cfg.rs @@ -59,7 +59,7 @@ impl ControlFlowGraph { /// Clears out a given block's successors. This also removes the given block from /// being a predecessor of any of its previous successors. - fn invalidate_block_successors(&mut self, basic_block_id: BasicBlockId) { + pub(crate) fn invalidate_block_successors(&mut self, basic_block_id: BasicBlockId) { let node = self .data .get_mut(&basic_block_id) diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction.rs index e30707effed..676bb48c4d9 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction.rs @@ -630,9 +630,9 @@ impl Instruction { } } Instruction::ArraySet { array, index, value, .. } => { - let array = dfg.get_array_constant(*array); - let index = dfg.get_numeric_constant(*index); - if let (Some((array, element_type)), Some(index)) = (array, index) { + let array_const = dfg.get_array_constant(*array); + let index_const = dfg.get_numeric_constant(*index); + if let (Some((array, element_type)), Some(index)) = (array_const, index_const) { let index = index.try_to_u32().expect("Expected array index to fit in u32") as usize; @@ -641,7 +641,8 @@ impl Instruction { return SimplifiedTo(new_array); } } - None + + try_optimize_array_set_from_previous_get(dfg, *array, *index, *value) } Instruction::Truncate { value, bit_size, max_bit_size } => { if bit_size == max_bit_size { @@ -817,6 +818,27 @@ fn try_optimize_array_get_from_previous_set( SimplifyResult::None } +fn try_optimize_array_set_from_previous_get( + dfg: &DataFlowGraph, + array_id: ValueId, + target_index: ValueId, + target_value: ValueId, +) -> SimplifyResult { + match &dfg[target_value] { + Value::Instruction { instruction, .. } => match &dfg[*instruction] { + Instruction::ArrayGet { array, index } => { + if *array == array_id && *index == target_index { + SimplifyResult::SimplifiedTo(array_id) + } else { + SimplifyResult::None + } + } + _ => SimplifyResult::None, + }, + _ => SimplifyResult::None, + } +} + pub(crate) type ErrorType = HirType; pub(crate) fn error_selector_from_type(typ: &ErrorType) -> ErrorSelector { diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/array_set.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/array_set.rs index 267a2c105f2..b2fe137c8bc 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/array_set.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/array_set.rs @@ -1,8 +1,10 @@ +use std::mem; + use crate::ssa::{ ir::{ basic_block::BasicBlockId, dfg::DataFlowGraph, - function::Function, + function::{Function, RuntimeType}, instruction::{Instruction, InstructionId, TerminatorInstruction}, types::Type::{Array, Slice}, value::ValueId, @@ -31,87 +33,113 @@ impl Function { if !self.runtime().is_entry_point() { assert_eq!(reachable_blocks.len(), 1, "Expected there to be 1 block remaining in Acir function for array_set optimization"); } - let mut array_to_last_use = HashMap::default(); - let mut instructions_to_update = HashSet::default(); - let mut arrays_from_load = HashSet::default(); + + let mut context = Context::new(&self.dfg, matches!(self.runtime(), RuntimeType::Brillig)); for block in reachable_blocks.iter() { - analyze_last_uses( - &self.dfg, - *block, - &mut array_to_last_use, - &mut instructions_to_update, - &mut arrays_from_load, - ); + context.analyze_last_uses(*block); } + + let instructions_to_update = mem::take(&mut context.instructions_that_can_be_made_mutable); for block in reachable_blocks { make_mutable(&mut self.dfg, block, &instructions_to_update); } } } -/// Builds the set of ArraySet instructions that can be made mutable -/// because their input value is unused elsewhere afterward. -fn analyze_last_uses( - dfg: &DataFlowGraph, - block_id: BasicBlockId, - array_to_last_use: &mut HashMap, - instructions_that_can_be_made_mutable: &mut HashSet, - arrays_from_load: &mut HashSet, -) { - let block = &dfg[block_id]; +struct Context<'f> { + dfg: &'f DataFlowGraph, + is_brillig_runtime: bool, + array_to_last_use: HashMap, + instructions_that_can_be_made_mutable: HashSet, + arrays_from_load: HashSet, + inner_nested_arrays: HashMap, +} + +impl<'f> Context<'f> { + fn new(dfg: &'f DataFlowGraph, is_brillig_runtime: bool) -> Self { + Context { + dfg, + is_brillig_runtime, + array_to_last_use: HashMap::default(), + instructions_that_can_be_made_mutable: HashSet::default(), + arrays_from_load: HashSet::default(), + inner_nested_arrays: HashMap::default(), + } + } - for instruction_id in block.instructions() { - match &dfg[*instruction_id] { - Instruction::ArrayGet { array, .. } => { - let array = dfg.resolve(*array); + /// Builds the set of ArraySet instructions that can be made mutable + /// because their input value is unused elsewhere afterward. + fn analyze_last_uses(&mut self, block_id: BasicBlockId) { + let block = &self.dfg[block_id]; - if let Some(existing) = array_to_last_use.insert(array, *instruction_id) { - instructions_that_can_be_made_mutable.remove(&existing); - } - } - Instruction::ArraySet { array, .. } => { - let array = dfg.resolve(*array); + for instruction_id in block.instructions() { + match &self.dfg[*instruction_id] { + Instruction::ArrayGet { array, .. } => { + let array = self.dfg.resolve(*array); - if let Some(existing) = array_to_last_use.insert(array, *instruction_id) { - instructions_that_can_be_made_mutable.remove(&existing); - } - // If the array we are setting does not come from a load we can safely mark it mutable. - // If the array comes from a load we may potentially being mutating an array at a reference - // that is loaded from by other values. - let terminator = dfg[block_id].unwrap_terminator(); - // If we are in a return block we are not concerned about the array potentially being mutated again. - let is_return_block = matches!(terminator, TerminatorInstruction::Return { .. }); - // We also want to check that the array is not part of the terminator arguments, as this means it is used again. - let mut array_in_terminator = false; - terminator.for_each_value(|value| { - if value == array { - array_in_terminator = true; + if let Some(existing) = self.array_to_last_use.insert(array, *instruction_id) { + self.instructions_that_can_be_made_mutable.remove(&existing); } - }); - if (!arrays_from_load.contains(&array) || is_return_block) && !array_in_terminator { - instructions_that_can_be_made_mutable.insert(*instruction_id); } - } - Instruction::Call { arguments, .. } => { - for argument in arguments { - if matches!(dfg.type_of_value(*argument), Array { .. } | Slice { .. }) { - let argument = dfg.resolve(*argument); + Instruction::ArraySet { array, value, .. } => { + let array = self.dfg.resolve(*array); - if let Some(existing) = array_to_last_use.insert(argument, *instruction_id) + if let Some(existing) = self.array_to_last_use.insert(array, *instruction_id) { + self.instructions_that_can_be_made_mutable.remove(&existing); + } + if self.is_brillig_runtime { + let value = self.dfg.resolve(*value); + + if let Some(existing) = self.inner_nested_arrays.get(&value) { + self.instructions_that_can_be_made_mutable.remove(existing); + } + let result = self.dfg.instruction_results(*instruction_id)[0]; + self.inner_nested_arrays.insert(result, *instruction_id); + } + + // If the array we are setting does not come from a load we can safely mark it mutable. + // If the array comes from a load we may potentially being mutating an array at a reference + // that is loaded from by other values. + let terminator = self.dfg[block_id].unwrap_terminator(); + // If we are in a return block we are not concerned about the array potentially being mutated again. + let is_return_block = + matches!(terminator, TerminatorInstruction::Return { .. }); + // We also want to check that the array is not part of the terminator arguments, as this means it is used again. + let mut array_in_terminator = false; + terminator.for_each_value(|value| { + if value == array { + array_in_terminator = true; + } + }); + if (!self.arrays_from_load.contains(&array) || is_return_block) + && !array_in_terminator + { + self.instructions_that_can_be_made_mutable.insert(*instruction_id); + } + } + Instruction::Call { arguments, .. } => { + for argument in arguments { + if matches!(self.dfg.type_of_value(*argument), Array { .. } | Slice { .. }) { - instructions_that_can_be_made_mutable.remove(&existing); + let argument = self.dfg.resolve(*argument); + + if let Some(existing) = + self.array_to_last_use.insert(argument, *instruction_id) + { + self.instructions_that_can_be_made_mutable.remove(&existing); + } } } } - } - Instruction::Load { .. } => { - let result = dfg.instruction_results(*instruction_id)[0]; - if matches!(dfg.type_of_value(result), Array { .. } | Slice { .. }) { - arrays_from_load.insert(result); + Instruction::Load { .. } => { + let result = self.dfg.instruction_results(*instruction_id)[0]; + if matches!(self.dfg.type_of_value(result), Array { .. } | Slice { .. }) { + self.arrays_from_load.insert(result); + } } + _ => (), } - _ => (), } } } @@ -169,29 +197,31 @@ mod tests { // from and cloned in a loop. If the array is inadvertently marked mutable, and is cloned in a previous iteration // of the loop, its clone will also be altered. // - // acir(inline) fn main f0 { + // brillig fn main f0 { // b0(): - // v2 = allocate - // store [Field 0, Field 0, Field 0, Field 0, Field 0] at v2 // v3 = allocate - // store [Field 0, Field 0, Field 0, Field 0, Field 0] at v3 + // store [[Field 0, Field 0, Field 0, Field 0, Field 0], [Field 0, Field 0, Field 0, Field 0, Field 0]] at v3 + // v4 = allocate + // store [[Field 0, Field 0, Field 0, Field 0, Field 0], [Field 0, Field 0, Field 0, Field 0, Field 0]] at v4 // jmp b1(u32 0) - // b1(v5: u32): - // v7 = lt v5, u32 5 - // jmpif v7 then: b3, else: b2 + // b1(v6: u32): + // v8 = lt v6, u32 5 + // jmpif v8 then: b3, else: b2 // b3(): - // v8 = eq v5, u32 5 - // jmpif v8 then: b4, else: b5 + // v9 = eq v6, u32 5 + // jmpif v9 then: b4, else: b5 // b4(): - // v9 = load v2 - // store v9 at v3 + // v10 = load v3 + // store v10 at v4 // jmp b5() // b5(): - // v10 = load v2 - // v12 = array_set v10, index v5, value Field 20 - // store v12 at v2 - // v14 = add v5, u32 1 - // jmp b1(v14) + // v11 = load v3 + // v13 = array_get v11, index Field 0 + // v14 = array_set v13, index v6, value Field 20 + // v15 = array_set v11, index v6, value v14 + // store v15 at v3 + // v17 = add v6, u32 1 + // jmp b1(v17) // b2(): // return // } @@ -203,13 +233,16 @@ mod tests { let zero = builder.field_constant(0u128); let array_constant = builder.array_constant(vector![zero, zero, zero, zero, zero], array_type.clone()); + let nested_array_type = Type::Array(Arc::new(vec![array_type.clone()]), 2); + let nested_array_constant = builder + .array_constant(vector![array_constant, array_constant], nested_array_type.clone()); - let v2 = builder.insert_allocate(array_type.clone()); + let v3 = builder.insert_allocate(array_type.clone()); - builder.insert_store(v2, array_constant); + builder.insert_store(v3, nested_array_constant); - let v3 = builder.insert_allocate(array_type.clone()); - builder.insert_store(v3, array_constant); + let v4 = builder.insert_allocate(array_type.clone()); + builder.insert_store(v4, nested_array_constant); let b1 = builder.insert_block(); let zero_u32 = builder.numeric_constant(0u128, Type::unsigned(32)); @@ -219,35 +252,38 @@ mod tests { builder.switch_to_block(b1); let v5 = builder.add_block_parameter(b1, Type::unsigned(32)); let five = builder.numeric_constant(5u128, Type::unsigned(32)); - let v7 = builder.insert_binary(v5, BinaryOp::Lt, five); + let v8 = builder.insert_binary(v5, BinaryOp::Lt, five); let b2 = builder.insert_block(); let b3 = builder.insert_block(); let b4 = builder.insert_block(); let b5 = builder.insert_block(); - builder.terminate_with_jmpif(v7, b3, b2); + builder.terminate_with_jmpif(v8, b3, b2); // Loop body // b3 is the if statement conditional builder.switch_to_block(b3); let two = builder.numeric_constant(5u128, Type::unsigned(32)); - let v8 = builder.insert_binary(v5, BinaryOp::Eq, two); - builder.terminate_with_jmpif(v8, b4, b5); + let v9 = builder.insert_binary(v5, BinaryOp::Eq, two); + builder.terminate_with_jmpif(v9, b4, b5); // b4 is the rest of the loop after the if statement builder.switch_to_block(b4); - let v9 = builder.insert_load(v2, array_type.clone()); - builder.insert_store(v3, v9); + let v10 = builder.insert_load(v3, nested_array_type.clone()); + builder.insert_store(v4, v10); builder.terminate_with_jmp(b5, vec![]); builder.switch_to_block(b5); - let v10 = builder.insert_load(v2, array_type.clone()); + let v11 = builder.insert_load(v3, nested_array_type.clone()); let twenty = builder.field_constant(20u128); - let v12 = builder.insert_array_set(v10, v5, twenty); - builder.insert_store(v2, v12); + let v13 = builder.insert_array_get(v11, zero, array_type.clone()); + let v14 = builder.insert_array_set(v13, v5, twenty); + let v15 = builder.insert_array_set(v11, v5, v14); + + builder.insert_store(v3, v15); let one = builder.numeric_constant(1u128, Type::unsigned(32)); - let v14 = builder.insert_binary(v5, BinaryOp::Add, one); - builder.terminate_with_jmp(b1, vec![v14]); + let v17 = builder.insert_binary(v5, BinaryOp::Add, one); + builder.terminate_with_jmp(b1, vec![v17]); builder.switch_to_block(b2); builder.terminate_with_return(vec![]); @@ -265,7 +301,7 @@ mod tests { .filter(|instruction| matches!(&main.dfg[**instruction], Instruction::ArraySet { .. })) .collect::>(); - assert_eq!(array_set_instructions.len(), 1); + assert_eq!(array_set_instructions.len(), 2); if let Instruction::ArraySet { mutable, .. } = &main.dfg[*array_set_instructions[0]] { // The single array set should not be marked mutable assert!(!mutable); diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/remove_enable_side_effects.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/remove_enable_side_effects.rs index c611ab682bf..daae2cb08ce 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/remove_enable_side_effects.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/remove_enable_side_effects.rs @@ -16,7 +16,7 @@ use crate::ssa::{ ir::{ basic_block::BasicBlockId, dfg::DataFlowGraph, - function::Function, + function::{Function, RuntimeType}, instruction::{BinaryOp, Instruction, Intrinsic}, types::Type, value::Value, @@ -37,6 +37,11 @@ impl Ssa { impl Function { pub(crate) fn remove_enable_side_effects(&mut self) { + if matches!(self.runtime(), RuntimeType::Brillig) { + // Brillig functions do not make use of the `EnableSideEffects` instruction so are unaffected by this pass. + return; + } + let mut context = Context::default(); context.block_queue.push(self.entry_block()); diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/simplify_cfg.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/simplify_cfg.rs index b77bc8c72f3..46941775c5e 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/simplify_cfg.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/simplify_cfg.rs @@ -60,7 +60,6 @@ impl Function { check_for_constant_jmpif(self, block, &mut cfg); let mut predecessors = cfg.predecessors(block); - if predecessors.len() == 1 { let predecessor = predecessors.next().expect("Already checked length of predecessors"); @@ -99,14 +98,23 @@ fn check_for_constant_jmpif( }) = function.dfg[block].terminator() { if let Some(constant) = function.dfg.get_numeric_constant(*condition) { - let destination = - if constant.is_zero() { *else_destination } else { *then_destination }; + let (destination, unchosen_destination) = if constant.is_zero() { + (*else_destination, *then_destination) + } else { + (*then_destination, *else_destination) + }; let arguments = Vec::new(); let call_stack = call_stack.clone(); let jmp = TerminatorInstruction::Jmp { destination, arguments, call_stack }; function.dfg[block].set_terminator(jmp); cfg.recompute_block(function, block); + + // If `block` was the only predecessor to `unchosen_destination` then it's no long reachable through the CFG, + // we can then invalidate it successors as it's an invalid predecessor. + if cfg.predecessors(unchosen_destination).len() == 0 { + cfg.invalidate_block_successors(unchosen_destination); + } } } } diff --git a/noir/noir-repo/compiler/noirc_frontend/src/hir_def/types.rs b/noir/noir-repo/compiler/noirc_frontend/src/hir_def/types.rs index 8f20fe1c685..b8c98428bb0 100644 --- a/noir/noir-repo/compiler/noirc_frontend/src/hir_def/types.rs +++ b/noir/noir-repo/compiler/noirc_frontend/src/hir_def/types.rs @@ -881,7 +881,7 @@ impl Type { } pub fn type_variable(id: TypeVariableId) -> Type { - let var = TypeVariable::unbound(id, Kind::Normal); + let var = TypeVariable::unbound(id, Kind::Any); Type::TypeVariable(var) } diff --git a/noir/noir-repo/compiler/noirc_frontend/src/tests/turbofish.rs b/noir/noir-repo/compiler/noirc_frontend/src/tests/turbofish.rs index 43d536fd196..b1156b20eb0 100644 --- a/noir/noir-repo/compiler/noirc_frontend/src/tests/turbofish.rs +++ b/noir/noir-repo/compiler/noirc_frontend/src/tests/turbofish.rs @@ -196,3 +196,21 @@ fn turbofish_in_struct_pattern_generic_count_mismatch() { assert_eq!(*expected, 1); assert_eq!(*found, 2); } + +#[test] +fn numeric_turbofish() { + let src = r#" + struct Reader { + } + + impl Reader { + fn read(_self: Self) {} + } + + fn main() { + let reader: Reader<1234> = Reader {}; + let _ = reader.read::<1234>(); + } + "#; + assert_no_errors(src); +} diff --git a/noir/noir-repo/compiler/noirc_frontend/src/tests/unused_items.rs b/noir/noir-repo/compiler/noirc_frontend/src/tests/unused_items.rs index a4d379b6358..4d8e504b705 100644 --- a/noir/noir-repo/compiler/noirc_frontend/src/tests/unused_items.rs +++ b/noir/noir-repo/compiler/noirc_frontend/src/tests/unused_items.rs @@ -188,58 +188,6 @@ fn errors_on_unused_type_alias() { assert_eq!(item.item_type(), "type alias"); } -#[test] -fn errors_if_type_alias_aliases_more_private_type() { - let src = r#" - struct Foo {} - pub type Bar = Foo; - pub fn no_unused_warnings(_b: Bar) { - let _ = Foo {}; - } - fn main() {} - "#; - - let errors = get_program_errors(src); - assert_eq!(errors.len(), 1); - - let CompilationError::ResolverError(ResolverError::TypeIsMorePrivateThenItem { - typ, item, .. - }) = &errors[0].0 - else { - panic!("Expected an unused item error"); - }; - - assert_eq!(typ, "Foo"); - assert_eq!(item, "Bar"); -} - -#[test] -fn errors_if_type_alias_aliases_more_private_type_in_generic() { - let src = r#" - pub struct Generic { value: T } - struct Foo {} - pub type Bar = Generic; - pub fn no_unused_warnings(_b: Bar) { - let _ = Foo {}; - let _ = Generic { value: 1 }; - } - fn main() {} - "#; - - let errors = get_program_errors(src); - assert_eq!(errors.len(), 1); - - let CompilationError::ResolverError(ResolverError::TypeIsMorePrivateThenItem { - typ, item, .. - }) = &errors[0].0 - else { - panic!("Expected an unused item error"); - }; - - assert_eq!(typ, "Foo"); - assert_eq!(item, "Bar"); -} - #[test] fn warns_on_unused_global() { let src = r#" diff --git a/noir/noir-repo/compiler/noirc_frontend/src/tests/visibility.rs b/noir/noir-repo/compiler/noirc_frontend/src/tests/visibility.rs index e6c2680ea19..bca1c9af829 100644 --- a/noir/noir-repo/compiler/noirc_frontend/src/tests/visibility.rs +++ b/noir/noir-repo/compiler/noirc_frontend/src/tests/visibility.rs @@ -28,17 +28,14 @@ fn errors_once_on_unused_import_that_is_not_accessible() { )) )); } - #[test] fn errors_if_type_alias_aliases_more_private_type() { let src = r#" struct Foo {} pub type Bar = Foo; - pub fn no_unused_warnings(_b: Bar) { let _ = Foo {}; } - fn main() {} "#; @@ -60,15 +57,12 @@ fn errors_if_type_alias_aliases_more_private_type() { fn errors_if_type_alias_aliases_more_private_type_in_generic() { let src = r#" pub struct Generic { value: T } - struct Foo {} pub type Bar = Generic; - pub fn no_unused_warnings(_b: Bar) { let _ = Foo {}; let _ = Generic { value: 1 }; } - fn main() {} "#; diff --git a/noir/noir-repo/compiler/wasm/package.json b/noir/noir-repo/compiler/wasm/package.json index e20abe5f4ff..009f861c5b1 100644 --- a/noir/noir-repo/compiler/wasm/package.json +++ b/noir/noir-repo/compiler/wasm/package.json @@ -3,7 +3,7 @@ "contributors": [ "The Noir Team " ], - "version": "0.34.0", + "version": "0.35.0", "license": "(MIT OR Apache-2.0)", "main": "dist/main.js", "types": "./dist/types/src/index.d.cts", diff --git a/noir/noir-repo/docs/docs/explainers/explainer-recursion.md b/noir/noir-repo/docs/docs/explainers/explainer-recursion.md index 18846176ca7..df8529ef4e0 100644 --- a/noir/noir-repo/docs/docs/explainers/explainer-recursion.md +++ b/noir/noir-repo/docs/docs/explainers/explainer-recursion.md @@ -111,7 +111,7 @@ He might find it more efficient to generate a proof for that setup phase separat ## What params do I need -As you can see in the [recursion reference](noir/standard_library/recursion.md), a simple recursive proof requires: +As you can see in the [recursion reference](noir/standard_library/recursion.mdx), a simple recursive proof requires: - The proof to verify - The Verification Key of the circuit that generated the proof diff --git a/noir/noir-repo/docs/docs/how_to/how-to-recursion.md b/noir/noir-repo/docs/docs/how_to/how-to-recursion.md index 71f02fa5435..c8c4dc9f5b4 100644 --- a/noir/noir-repo/docs/docs/how_to/how-to-recursion.md +++ b/noir/noir-repo/docs/docs/how_to/how-to-recursion.md @@ -25,7 +25,7 @@ This guide shows you how to use recursive proofs in your NoirJS app. For the sak - You already have a NoirJS app. If you don't, please visit the [NoirJS tutorial](../tutorials/noirjs_app.md) and the [reference](../reference/NoirJS/noir_js/index.md). - You are familiar with what are recursive proofs and you have read the [recursion explainer](../explainers/explainer-recursion.md) -- You already built a recursive circuit following [the reference](../noir/standard_library/recursion.md), and understand how it works. +- You already built a recursive circuit following [the reference](../noir/standard_library/recursion.mdx), and understand how it works. It is also assumed that you're not using `noir_wasm` for compilation, and instead you've used [`nargo compile`](../reference/nargo_commands.md) to generate the `json` you're now importing into your project. However, the guide should work just the same if you're using `noir_wasm`. diff --git a/noir/noir-repo/docs/docs/noir/standard_library/black_box_fns.md b/noir/noir-repo/docs/docs/noir/standard_library/black_box_fns.md index d5694250f05..d6079ab182c 100644 --- a/noir/noir-repo/docs/docs/noir/standard_library/black_box_fns.md +++ b/noir/noir-repo/docs/docs/noir/standard_library/black_box_fns.md @@ -25,7 +25,7 @@ Here is a list of the current black box functions: - XOR - RANGE - [Keccak256](./cryptographic_primitives/hashes.mdx#keccak256) -- [Recursive proof verification](./recursion.md) +- [Recursive proof verification](./recursion.mdx) Most black box functions are included as part of the Noir standard library, however `AND`, `XOR` and `RANGE` are used as part of the Noir language syntax. For instance, using the bitwise operator `&` will invoke the `AND` black box function. diff --git a/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/ciphers.mdx b/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/ciphers.mdx index 0103791d2e4..d2ceb63175a 100644 --- a/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/ciphers.mdx +++ b/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/ciphers.mdx @@ -7,7 +7,7 @@ keywords: sidebar_position: 0 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; ## aes128 @@ -25,4 +25,4 @@ fn main() { ``` - \ No newline at end of file + \ No newline at end of file diff --git a/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx b/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx index 6787c9f46a1..d46bdc0729b 100644 --- a/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx +++ b/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx @@ -5,7 +5,7 @@ keywords: [cryptographic primitives, Noir project, ecdsa, secp256k1, secp256r1, sidebar_position: 3 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; Noir supports ECDSA signatures verification over the secp256k1 and secp256r1 curves. @@ -25,7 +25,7 @@ fn main(hashed_message : [u8;32], pub_key_x : [u8;32], pub_key_y : [u8;32], sign } ``` - + ## ecdsa_secp256k1::verify_signature_slice @@ -33,7 +33,7 @@ Verifier for ECDSA Secp256k1 signatures where the message is a slice. #include_code ecdsa_secp256k1_slice noir_stdlib/src/ecdsa_secp256k1.nr rust - + ## ecdsa_secp256r1::verify_signature @@ -51,7 +51,7 @@ fn main(hashed_message : [u8;32], pub_key_x : [u8;32], pub_key_y : [u8;32], sign } ``` - + ## ecdsa_secp256r1::verify_signature @@ -59,4 +59,4 @@ Verifier for ECDSA Secp256r1 signatures where the message is a slice. #include_code ecdsa_secp256r1_slice noir_stdlib/src/ecdsa_secp256r1.nr rust - + diff --git a/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/eddsa.mdx b/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/eddsa.mdx index 1ad42a5ac96..b283de693c8 100644 --- a/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/eddsa.mdx +++ b/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/eddsa.mdx @@ -5,7 +5,7 @@ keywords: [cryptographic primitives, Noir project, eddsa, signatures] sidebar_position: 5 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; ## eddsa::eddsa_poseidon_verify @@ -23,7 +23,7 @@ use std::hash::poseidon2::Poseidon2Hasher; eddsa_verify::(pub_key_a.x, pub_key_a.y, s_a, r8_a.x, r8_a.y, msg); ``` - + ## eddsa::eddsa_to_pub diff --git a/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx b/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx index f1122fc37d5..e10688857a6 100644 --- a/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx +++ b/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx @@ -5,7 +5,7 @@ keywords: [cryptographic primitives, Noir project, scalar multiplication] sidebar_position: 1 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; The following functions perform operations over the embedded curve whose coordinates are defined by the configured noir field. For the BN254 scalar field, this is BabyJubJub or Grumpkin. @@ -74,4 +74,4 @@ fn main() { } ``` - + diff --git a/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/hashes.mdx b/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/hashes.mdx index d2a8204bccb..c33ce34e4d1 100644 --- a/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/hashes.mdx +++ b/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/hashes.mdx @@ -8,7 +8,7 @@ keywords: sidebar_position: 0 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; ## sha256 @@ -28,7 +28,7 @@ fn main() { ``` - + ## blake2s @@ -45,7 +45,7 @@ fn main() { } ``` - + ## blake3 @@ -62,7 +62,7 @@ fn main() { } ``` - + ## pedersen_hash @@ -74,7 +74,7 @@ example: #include_code pedersen-hash test_programs/execution_success/pedersen_hash/src/main.nr rust - + ## pedersen_commitment @@ -86,7 +86,7 @@ example: #include_code pedersen-commitment test_programs/execution_success/pedersen_commitment/src/main.nr rust - + ## keccak256 @@ -100,7 +100,7 @@ example: #include_code keccak256 test_programs/execution_success/keccak256/src/main.nr rust - + ## poseidon diff --git a/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/schnorr.mdx b/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/schnorr.mdx index 2c9eb18cd34..286a0ac6c7d 100644 --- a/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/schnorr.mdx +++ b/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/schnorr.mdx @@ -5,7 +5,7 @@ keywords: [cryptographic primitives, Noir project, schnorr, signatures] sidebar_position: 2 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; ## schnorr::verify_signature @@ -34,7 +34,7 @@ const signature = Array.from( ... ``` - + ## schnorr::verify_signature_slice @@ -43,4 +43,4 @@ where the message is a slice. #include_code schnorr_verify_slice noir_stdlib/src/schnorr.nr rust - + diff --git a/noir/noir-repo/docs/docs/noir/standard_library/recursion.md b/noir/noir-repo/docs/docs/noir/standard_library/recursion.mdx similarity index 96% rename from noir/noir-repo/docs/docs/noir/standard_library/recursion.md rename to noir/noir-repo/docs/docs/noir/standard_library/recursion.mdx index 7f4dcebf084..60414a2fa51 100644 --- a/noir/noir-repo/docs/docs/noir/standard_library/recursion.md +++ b/noir/noir-repo/docs/docs/noir/standard_library/recursion.mdx @@ -4,7 +4,7 @@ description: Learn about how to write recursive proofs in Noir. keywords: [recursion, recursive proofs, verification_key, verify_proof] --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; Noir supports recursively verifying proofs, meaning you verify the proof of a Noir program in another Noir program. This enables creating proofs of arbitrary size by doing step-wise verification of smaller components of a large proof. @@ -35,7 +35,7 @@ By incorporating this attribute directly in the circuit's definition, tooling li pub fn verify_proof(verification_key: [Field], proof: [Field], public_inputs: [Field], key_hash: Field) {} ``` - + ## Example usage diff --git a/noir/noir-repo/docs/src/components/Notes/_blackbox.jsx b/noir/noir-repo/docs/src/components/Notes/_blackbox.jsx new file mode 100644 index 00000000000..ae3c5987cb6 --- /dev/null +++ b/noir/noir-repo/docs/src/components/Notes/_blackbox.jsx @@ -0,0 +1,12 @@ +import Link from '@docusaurus/Link'; + +export default function BlackBoxInfo({ to }) { + return ( +
+

+ This is a black box function. Read this section to learn more about black box functions in + Noir. +

+
+ ); +} diff --git a/noir/noir-repo/docs/src/components/Notes/_blackbox.mdx b/noir/noir-repo/docs/src/components/Notes/_blackbox.mdx deleted file mode 100644 index 514ca00a7e7..00000000000 --- a/noir/noir-repo/docs/src/components/Notes/_blackbox.mdx +++ /dev/null @@ -1,5 +0,0 @@ -:::info - -This is a black box function. Read [this section](/docs/noir/standard_library/black_box_fns) to learn more about black box functions in Noir. - -::: diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/explainers/explainer-recursion.md b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/explainers/explainer-recursion.md index 18846176ca7..df8529ef4e0 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/explainers/explainer-recursion.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/explainers/explainer-recursion.md @@ -111,7 +111,7 @@ He might find it more efficient to generate a proof for that setup phase separat ## What params do I need -As you can see in the [recursion reference](noir/standard_library/recursion.md), a simple recursive proof requires: +As you can see in the [recursion reference](noir/standard_library/recursion.mdx), a simple recursive proof requires: - The proof to verify - The Verification Key of the circuit that generated the proof diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/how_to/how-to-recursion.md b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/how_to/how-to-recursion.md index 71f02fa5435..c8c4dc9f5b4 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/how_to/how-to-recursion.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/how_to/how-to-recursion.md @@ -25,7 +25,7 @@ This guide shows you how to use recursive proofs in your NoirJS app. For the sak - You already have a NoirJS app. If you don't, please visit the [NoirJS tutorial](../tutorials/noirjs_app.md) and the [reference](../reference/NoirJS/noir_js/index.md). - You are familiar with what are recursive proofs and you have read the [recursion explainer](../explainers/explainer-recursion.md) -- You already built a recursive circuit following [the reference](../noir/standard_library/recursion.md), and understand how it works. +- You already built a recursive circuit following [the reference](../noir/standard_library/recursion.mdx), and understand how it works. It is also assumed that you're not using `noir_wasm` for compilation, and instead you've used [`nargo compile`](../reference/nargo_commands.md) to generate the `json` you're now importing into your project. However, the guide should work just the same if you're using `noir_wasm`. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/black_box_fns.md b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/black_box_fns.md index d5694250f05..d6079ab182c 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/black_box_fns.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/black_box_fns.md @@ -25,7 +25,7 @@ Here is a list of the current black box functions: - XOR - RANGE - [Keccak256](./cryptographic_primitives/hashes.mdx#keccak256) -- [Recursive proof verification](./recursion.md) +- [Recursive proof verification](./recursion.mdx) Most black box functions are included as part of the Noir standard library, however `AND`, `XOR` and `RANGE` are used as part of the Noir language syntax. For instance, using the bitwise operator `&` will invoke the `AND` black box function. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/ciphers.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/ciphers.mdx index d75e50d4b89..d6a5e1a79eb 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/ciphers.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/ciphers.mdx @@ -7,7 +7,7 @@ keywords: sidebar_position: 0 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; ## aes128 @@ -29,4 +29,4 @@ fn main() { ``` - \ No newline at end of file + \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx index 8520071e95f..4c22e70e8de 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx @@ -5,7 +5,7 @@ keywords: [cryptographic primitives, Noir project, ecdsa, secp256k1, secp256r1, sidebar_position: 3 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; Noir supports ECDSA signatures verification over the secp256k1 and secp256r1 curves. @@ -34,7 +34,7 @@ fn main(hashed_message : [u8;32], pub_key_x : [u8;32], pub_key_y : [u8;32], sign } ``` - + ## ecdsa_secp256k1::verify_signature_slice @@ -51,7 +51,7 @@ pub fn verify_signature_slice( > Source code: noir_stdlib/src/ecdsa_secp256k1.nr#L13-L20 - + ## ecdsa_secp256r1::verify_signature @@ -78,7 +78,7 @@ fn main(hashed_message : [u8;32], pub_key_x : [u8;32], pub_key_y : [u8;32], sign } ``` - + ## ecdsa_secp256r1::verify_signature @@ -95,4 +95,4 @@ pub fn verify_signature_slice( > Source code: noir_stdlib/src/ecdsa_secp256r1.nr#L13-L20 - + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/eddsa.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/eddsa.mdx index 1ad42a5ac96..ef4386052eb 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/eddsa.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/eddsa.mdx @@ -5,7 +5,7 @@ keywords: [cryptographic primitives, Noir project, eddsa, signatures] sidebar_position: 5 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; ## eddsa::eddsa_poseidon_verify @@ -23,7 +23,7 @@ use std::hash::poseidon2::Poseidon2Hasher; eddsa_verify::(pub_key_a.x, pub_key_a.y, s_a, r8_a.x, r8_a.y, msg); ``` - + ## eddsa::eddsa_to_pub diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx index 0230f6a8ab9..68d033e9d60 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx @@ -5,7 +5,7 @@ keywords: [cryptographic primitives, Noir project, scalar multiplication] sidebar_position: 1 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; The following functions perform operations over the embedded curve whose coordinates are defined by the configured noir field. For the BN254 scalar field, this is BabyJubJub or Grumpkin. @@ -95,4 +95,4 @@ fn main() { } ``` - + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/hashes.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/hashes.mdx index dadff87bb69..ddcfbb2175f 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/hashes.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/hashes.mdx @@ -8,7 +8,7 @@ keywords: sidebar_position: 0 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; ## sha256 @@ -36,7 +36,7 @@ fn main() { ``` - + ## blake2s @@ -57,7 +57,7 @@ fn main() { } ``` - + ## blake3 @@ -78,7 +78,7 @@ fn main() { } ``` - + ## pedersen_hash @@ -101,7 +101,7 @@ fn main(x: Field, y: Field, expected_hash: Field) { > Source code: test_programs/execution_success/pedersen_hash/src/main.nr#L1-L7 - + ## pedersen_commitment @@ -125,7 +125,7 @@ fn main(x: Field, y: Field, expected_commitment: std::embedded_curve_ops::Embedd > Source code: test_programs/execution_success/pedersen_commitment/src/main.nr#L1-L8 - + ## keccak256 @@ -164,7 +164,7 @@ fn main(x: Field, result: [u8; 32]) { > Source code: test_programs/execution_success/keccak256/src/main.nr#L1-L21 - + ## poseidon diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/schnorr.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/schnorr.mdx index a32138daaa6..00e7f257612 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/schnorr.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/cryptographic_primitives/schnorr.mdx @@ -5,7 +5,7 @@ keywords: [cryptographic primitives, Noir project, schnorr, signatures] sidebar_position: 2 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; ## schnorr::verify_signature @@ -43,7 +43,7 @@ const signature = Array.from( ... ``` - + ## schnorr::verify_signature_slice @@ -61,4 +61,4 @@ pub fn verify_signature_slice( > Source code: noir_stdlib/src/schnorr.nr#L13-L20 - + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/recursion.md b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/recursion.mdx similarity index 96% rename from noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/recursion.md rename to noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/recursion.mdx index 8cfb37fc52d..8fdb8e8f514 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/recursion.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.32.0/noir/standard_library/recursion.mdx @@ -4,7 +4,7 @@ description: Learn about how to write recursive proofs in Noir. keywords: [recursion, recursive proofs, verification_key, verify_proof] --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; Noir supports recursively verifying proofs, meaning you verify the proof of a Noir program in another Noir program. This enables creating proofs of arbitrary size by doing step-wise verification of smaller components of a large proof. @@ -35,7 +35,7 @@ By incorporating this attribute directly in the circuit's definition, tooling li pub fn verify_proof(verification_key: [Field], proof: [Field], public_inputs: [Field], key_hash: Field) {} ``` - + ## Example usage diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/explainers/explainer-recursion.md b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/explainers/explainer-recursion.md index 18846176ca7..df8529ef4e0 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/explainers/explainer-recursion.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/explainers/explainer-recursion.md @@ -111,7 +111,7 @@ He might find it more efficient to generate a proof for that setup phase separat ## What params do I need -As you can see in the [recursion reference](noir/standard_library/recursion.md), a simple recursive proof requires: +As you can see in the [recursion reference](noir/standard_library/recursion.mdx), a simple recursive proof requires: - The proof to verify - The Verification Key of the circuit that generated the proof diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/how_to/how-to-recursion.md b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/how_to/how-to-recursion.md index 71f02fa5435..c8c4dc9f5b4 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/how_to/how-to-recursion.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/how_to/how-to-recursion.md @@ -25,7 +25,7 @@ This guide shows you how to use recursive proofs in your NoirJS app. For the sak - You already have a NoirJS app. If you don't, please visit the [NoirJS tutorial](../tutorials/noirjs_app.md) and the [reference](../reference/NoirJS/noir_js/index.md). - You are familiar with what are recursive proofs and you have read the [recursion explainer](../explainers/explainer-recursion.md) -- You already built a recursive circuit following [the reference](../noir/standard_library/recursion.md), and understand how it works. +- You already built a recursive circuit following [the reference](../noir/standard_library/recursion.mdx), and understand how it works. It is also assumed that you're not using `noir_wasm` for compilation, and instead you've used [`nargo compile`](../reference/nargo_commands.md) to generate the `json` you're now importing into your project. However, the guide should work just the same if you're using `noir_wasm`. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/black_box_fns.md b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/black_box_fns.md index d5694250f05..d6079ab182c 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/black_box_fns.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/black_box_fns.md @@ -25,7 +25,7 @@ Here is a list of the current black box functions: - XOR - RANGE - [Keccak256](./cryptographic_primitives/hashes.mdx#keccak256) -- [Recursive proof verification](./recursion.md) +- [Recursive proof verification](./recursion.mdx) Most black box functions are included as part of the Noir standard library, however `AND`, `XOR` and `RANGE` are used as part of the Noir language syntax. For instance, using the bitwise operator `&` will invoke the `AND` black box function. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/ciphers.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/ciphers.mdx index d75e50d4b89..d6a5e1a79eb 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/ciphers.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/ciphers.mdx @@ -7,7 +7,7 @@ keywords: sidebar_position: 0 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; ## aes128 @@ -29,4 +29,4 @@ fn main() { ``` - \ No newline at end of file + \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx index 8520071e95f..4c22e70e8de 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx @@ -5,7 +5,7 @@ keywords: [cryptographic primitives, Noir project, ecdsa, secp256k1, secp256r1, sidebar_position: 3 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; Noir supports ECDSA signatures verification over the secp256k1 and secp256r1 curves. @@ -34,7 +34,7 @@ fn main(hashed_message : [u8;32], pub_key_x : [u8;32], pub_key_y : [u8;32], sign } ``` - + ## ecdsa_secp256k1::verify_signature_slice @@ -51,7 +51,7 @@ pub fn verify_signature_slice( > Source code: noir_stdlib/src/ecdsa_secp256k1.nr#L13-L20 - + ## ecdsa_secp256r1::verify_signature @@ -78,7 +78,7 @@ fn main(hashed_message : [u8;32], pub_key_x : [u8;32], pub_key_y : [u8;32], sign } ``` - + ## ecdsa_secp256r1::verify_signature @@ -95,4 +95,4 @@ pub fn verify_signature_slice( > Source code: noir_stdlib/src/ecdsa_secp256r1.nr#L13-L20 - + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/eddsa.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/eddsa.mdx index 1ad42a5ac96..b283de693c8 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/eddsa.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/eddsa.mdx @@ -5,7 +5,7 @@ keywords: [cryptographic primitives, Noir project, eddsa, signatures] sidebar_position: 5 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; ## eddsa::eddsa_poseidon_verify @@ -23,7 +23,7 @@ use std::hash::poseidon2::Poseidon2Hasher; eddsa_verify::(pub_key_a.x, pub_key_a.y, s_a, r8_a.x, r8_a.y, msg); ``` - + ## eddsa::eddsa_to_pub diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx index 719549bc418..69e0265c81a 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx @@ -5,7 +5,7 @@ keywords: [cryptographic primitives, Noir project, scalar multiplication] sidebar_position: 1 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; The following functions perform operations over the embedded curve whose coordinates are defined by the configured noir field. For the BN254 scalar field, this is BabyJubJub or Grumpkin. @@ -92,4 +92,4 @@ fn main() { } ``` - + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/hashes.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/hashes.mdx index 63a4a2afd53..797ff8cc22c 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/hashes.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/hashes.mdx @@ -8,7 +8,7 @@ keywords: sidebar_position: 0 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; ## sha256 @@ -36,7 +36,7 @@ fn main() { ``` - + ## blake2s @@ -57,7 +57,7 @@ fn main() { } ``` - + ## blake3 @@ -78,7 +78,7 @@ fn main() { } ``` - + ## pedersen_hash @@ -101,7 +101,7 @@ fn main(x: Field, y: Field, expected_hash: Field) { > Source code: test_programs/execution_success/pedersen_hash/src/main.nr#L1-L7 - + ## pedersen_commitment @@ -125,7 +125,7 @@ fn main(x: Field, y: Field, expected_commitment: std::embedded_curve_ops::Embedd > Source code: test_programs/execution_success/pedersen_commitment/src/main.nr#L1-L8 - + ## keccak256 @@ -164,7 +164,7 @@ fn main(x: Field, result: [u8; 32]) { > Source code: test_programs/execution_success/keccak256/src/main.nr#L1-L21 - + ## poseidon diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/schnorr.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/schnorr.mdx index a32138daaa6..00e7f257612 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/schnorr.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/cryptographic_primitives/schnorr.mdx @@ -5,7 +5,7 @@ keywords: [cryptographic primitives, Noir project, schnorr, signatures] sidebar_position: 2 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; ## schnorr::verify_signature @@ -43,7 +43,7 @@ const signature = Array.from( ... ``` - + ## schnorr::verify_signature_slice @@ -61,4 +61,4 @@ pub fn verify_signature_slice( > Source code: noir_stdlib/src/schnorr.nr#L13-L20 - + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/recursion.md b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/recursion.mdx similarity index 96% rename from noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/recursion.md rename to noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/recursion.mdx index 7f4dcebf084..60414a2fa51 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/recursion.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/recursion.mdx @@ -4,7 +4,7 @@ description: Learn about how to write recursive proofs in Noir. keywords: [recursion, recursive proofs, verification_key, verify_proof] --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; Noir supports recursively verifying proofs, meaning you verify the proof of a Noir program in another Noir program. This enables creating proofs of arbitrary size by doing step-wise verification of smaller components of a large proof. @@ -35,7 +35,7 @@ By incorporating this attribute directly in the circuit's definition, tooling li pub fn verify_proof(verification_key: [Field], proof: [Field], public_inputs: [Field], key_hash: Field) {} ``` - + ## Example usage diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/explainers/explainer-recursion.md b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/explainers/explainer-recursion.md index 18846176ca7..df8529ef4e0 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/explainers/explainer-recursion.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/explainers/explainer-recursion.md @@ -111,7 +111,7 @@ He might find it more efficient to generate a proof for that setup phase separat ## What params do I need -As you can see in the [recursion reference](noir/standard_library/recursion.md), a simple recursive proof requires: +As you can see in the [recursion reference](noir/standard_library/recursion.mdx), a simple recursive proof requires: - The proof to verify - The Verification Key of the circuit that generated the proof diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/how_to/how-to-recursion.md b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/how_to/how-to-recursion.md index 71f02fa5435..c8c4dc9f5b4 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/how_to/how-to-recursion.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/how_to/how-to-recursion.md @@ -25,7 +25,7 @@ This guide shows you how to use recursive proofs in your NoirJS app. For the sak - You already have a NoirJS app. If you don't, please visit the [NoirJS tutorial](../tutorials/noirjs_app.md) and the [reference](../reference/NoirJS/noir_js/index.md). - You are familiar with what are recursive proofs and you have read the [recursion explainer](../explainers/explainer-recursion.md) -- You already built a recursive circuit following [the reference](../noir/standard_library/recursion.md), and understand how it works. +- You already built a recursive circuit following [the reference](../noir/standard_library/recursion.mdx), and understand how it works. It is also assumed that you're not using `noir_wasm` for compilation, and instead you've used [`nargo compile`](../reference/nargo_commands.md) to generate the `json` you're now importing into your project. However, the guide should work just the same if you're using `noir_wasm`. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/black_box_fns.md b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/black_box_fns.md index d5694250f05..d6079ab182c 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/black_box_fns.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/black_box_fns.md @@ -25,7 +25,7 @@ Here is a list of the current black box functions: - XOR - RANGE - [Keccak256](./cryptographic_primitives/hashes.mdx#keccak256) -- [Recursive proof verification](./recursion.md) +- [Recursive proof verification](./recursion.mdx) Most black box functions are included as part of the Noir standard library, however `AND`, `XOR` and `RANGE` are used as part of the Noir language syntax. For instance, using the bitwise operator `&` will invoke the `AND` black box function. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/ciphers.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/ciphers.mdx index d75e50d4b89..d6a5e1a79eb 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/ciphers.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/ciphers.mdx @@ -7,7 +7,7 @@ keywords: sidebar_position: 0 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; ## aes128 @@ -29,4 +29,4 @@ fn main() { ``` - \ No newline at end of file + \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx index 8520071e95f..4c22e70e8de 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx @@ -5,7 +5,7 @@ keywords: [cryptographic primitives, Noir project, ecdsa, secp256k1, secp256r1, sidebar_position: 3 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; Noir supports ECDSA signatures verification over the secp256k1 and secp256r1 curves. @@ -34,7 +34,7 @@ fn main(hashed_message : [u8;32], pub_key_x : [u8;32], pub_key_y : [u8;32], sign } ``` - + ## ecdsa_secp256k1::verify_signature_slice @@ -51,7 +51,7 @@ pub fn verify_signature_slice( > Source code: noir_stdlib/src/ecdsa_secp256k1.nr#L13-L20 - + ## ecdsa_secp256r1::verify_signature @@ -78,7 +78,7 @@ fn main(hashed_message : [u8;32], pub_key_x : [u8;32], pub_key_y : [u8;32], sign } ``` - + ## ecdsa_secp256r1::verify_signature @@ -95,4 +95,4 @@ pub fn verify_signature_slice( > Source code: noir_stdlib/src/ecdsa_secp256r1.nr#L13-L20 - + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/eddsa.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/eddsa.mdx index 1ad42a5ac96..b283de693c8 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/eddsa.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/eddsa.mdx @@ -5,7 +5,7 @@ keywords: [cryptographic primitives, Noir project, eddsa, signatures] sidebar_position: 5 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; ## eddsa::eddsa_poseidon_verify @@ -23,7 +23,7 @@ use std::hash::poseidon2::Poseidon2Hasher; eddsa_verify::(pub_key_a.x, pub_key_a.y, s_a, r8_a.x, r8_a.y, msg); ``` - + ## eddsa::eddsa_to_pub diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx index 8ded020bf27..2da1e34f008 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx @@ -5,7 +5,7 @@ keywords: [cryptographic primitives, Noir project, scalar multiplication] sidebar_position: 1 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; The following functions perform operations over the embedded curve whose coordinates are defined by the configured noir field. For the BN254 scalar field, this is BabyJubJub or Grumpkin. @@ -92,4 +92,4 @@ fn main() { } ``` - + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/hashes.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/hashes.mdx index 2581690e034..d6640d26f25 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/hashes.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/hashes.mdx @@ -8,7 +8,7 @@ keywords: sidebar_position: 0 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; ## sha256 @@ -36,7 +36,7 @@ fn main() { ``` - + ## blake2s @@ -57,7 +57,7 @@ fn main() { } ``` - + ## blake3 @@ -78,7 +78,7 @@ fn main() { } ``` - + ## pedersen_hash @@ -101,7 +101,7 @@ fn main(x: Field, y: Field, expected_hash: Field) { > Source code: test_programs/execution_success/pedersen_hash/src/main.nr#L1-L7 - + ## pedersen_commitment @@ -125,7 +125,7 @@ fn main(x: Field, y: Field, expected_commitment: std::embedded_curve_ops::Embedd > Source code: test_programs/execution_success/pedersen_commitment/src/main.nr#L1-L8 - + ## keccak256 @@ -164,7 +164,7 @@ fn main(x: Field, result: [u8; 32]) { > Source code: test_programs/execution_success/keccak256/src/main.nr#L1-L21 - + ## poseidon diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/schnorr.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/schnorr.mdx index a32138daaa6..00e7f257612 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/schnorr.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/cryptographic_primitives/schnorr.mdx @@ -5,7 +5,7 @@ keywords: [cryptographic primitives, Noir project, schnorr, signatures] sidebar_position: 2 --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; ## schnorr::verify_signature @@ -43,7 +43,7 @@ const signature = Array.from( ... ``` - + ## schnorr::verify_signature_slice @@ -61,4 +61,4 @@ pub fn verify_signature_slice( > Source code: noir_stdlib/src/schnorr.nr#L13-L20 - + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/recursion.md b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/recursion.mdx similarity index 96% rename from noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/recursion.md rename to noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/recursion.mdx index 7f4dcebf084..60414a2fa51 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.33.0/noir/standard_library/recursion.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.34.0/noir/standard_library/recursion.mdx @@ -4,7 +4,7 @@ description: Learn about how to write recursive proofs in Noir. keywords: [recursion, recursive proofs, verification_key, verify_proof] --- -import BlackBoxInfo from '@site/src/components/Notes/_blackbox.mdx'; +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; Noir supports recursively verifying proofs, meaning you verify the proof of a Noir program in another Noir program. This enables creating proofs of arbitrary size by doing step-wise verification of smaller components of a large proof. @@ -35,7 +35,7 @@ By incorporating this attribute directly in the circuit's definition, tooling li pub fn verify_proof(verification_key: [Field], proof: [Field], public_inputs: [Field], key_hash: Field) {} ``` - + ## Example usage diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/explainers/cspell.json b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/explainers/cspell.json new file mode 100644 index 00000000000..c60b0a597b1 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/explainers/cspell.json @@ -0,0 +1,5 @@ +{ + "words": [ + "Cryptdoku" + ] +} diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/explainers/explainer-oracle.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/explainers/explainer-oracle.md new file mode 100644 index 00000000000..821e1f95c04 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/explainers/explainer-oracle.md @@ -0,0 +1,57 @@ +--- +title: Oracles +description: This guide provides an in-depth understanding of how Oracles work in Noir programming. Learn how to use outside calculations in your programs, constrain oracles, and understand their uses and limitations. +keywords: + - Noir Programming + - Oracles + - JSON-RPC + - Foreign Call Handlers + - Constrained Functions + - Blockchain Programming +sidebar_position: 1 +--- + +If you've seen "The Matrix" you may recall "The Oracle" as Gloria Foster smoking cigarettes and baking cookies. While she appears to "know things", she is actually providing a calculation of a pre-determined future. Noir Oracles are similar, in a way. They don't calculate the future (yet), but they allow you to use outside calculations in your programs. + +![matrix oracle prediction](@site/static/img/memes/matrix_oracle.jpeg) + +A Noir program is usually self-contained. You can pass certain inputs to it, and it will generate a deterministic output for those inputs. But what if you wanted to defer some calculation to an outside process or source? + +Oracles are functions that provide this feature. + +## Use cases + +An example usage for Oracles is proving something on-chain. For example, proving that the ETH-USDC quote was below a certain target at a certain block time. Or even making more complex proofs like proving the ownership of an NFT as an anonymous login method. + +Another interesting use case is to defer expensive calculations to be made outside of the Noir program, and then constraining the result; similar to the use of [unconstrained functions](../noir/concepts//unconstrained.md). + +In short, anything that can be constrained in a Noir program but needs to be fetched from an external source is a great candidate to be used in oracles. + +## Constraining oracles + +Just like in The Matrix, Oracles are powerful. But with great power, comes great responsibility. Just because you're using them in a Noir program doesn't mean they're true. Noir has no superpowers. If you want to prove that Portugal won the Euro Cup 2016, you're still relying on potentially untrusted information. + +To give a concrete example, Alice wants to login to the [NounsDAO](https://nouns.wtf/) forum with her username "noir_nouner" by proving she owns a noun without revealing her ethereum address. Her Noir program could have an oracle call like this: + +```rust +#[oracle(getNoun)] +unconstrained fn get_noun(address: Field) -> Field +``` + +This oracle could naively resolve with the number of Nouns she possesses. However, it is useless as a trusted source, as the oracle could resolve to anything Alice wants. In order to make this oracle call actually useful, Alice would need to constrain the response from the oracle, by proving her address and the noun count belongs to the state tree of the contract. + +In short, **Oracles don't prove anything. Your Noir program does.** + +:::danger + +If you don't constrain the return of your oracle, you could be clearly opening an attack vector on your Noir program. Make double-triple sure that the return of an oracle call is constrained! + +::: + +## How to use Oracles + +On CLI, Nargo resolves oracles by making JSON RPC calls, which means it would require an RPC node to be running. + +In JavaScript, NoirJS accepts and resolves arbitrary call handlers (that is, not limited to JSON) as long as they match the expected types the developer defines. Refer to [Foreign Call Handler](../reference/NoirJS/noir_js/type-aliases/ForeignCallHandler.md) to learn more about NoirJS's call handling. + +If you want to build using oracles, follow through to the [oracle guide](../how_to/how-to-oracles.md) for a simple example on how to do that. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/explainers/explainer-recursion.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/explainers/explainer-recursion.md new file mode 100644 index 00000000000..df8529ef4e0 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/explainers/explainer-recursion.md @@ -0,0 +1,176 @@ +--- +title: Recursive proofs +description: Explore the concept of recursive proofs in Zero-Knowledge programming. Understand how recursion works in Noir, a language for writing smart contracts on the EVM blockchain. Learn through practical examples like Alice and Bob's guessing game, Charlie's recursive merkle tree, and Daniel's reusable components. Discover how to use recursive proofs to optimize computational resources and improve efficiency. + +keywords: + [ + "Recursive Proofs", + "Zero-Knowledge Programming", + "Noir", + "EVM Blockchain", + "Smart Contracts", + "Recursion in Noir", + "Alice and Bob Guessing Game", + "Recursive Merkle Tree", + "Reusable Components", + "Optimizing Computational Resources", + "Improving Efficiency", + "Verification Key", + "Aggregation", + "Recursive zkSNARK schemes", + "PLONK", + "Proving and Verification Keys" + ] +sidebar_position: 1 +pagination_next: how_to/how-to-recursion +--- + +In programming, we tend to think of recursion as something calling itself. A classic example would be the calculation of the factorial of a number: + +```js +function factorial(n) { + if (n === 0 || n === 1) { + return 1; + } else { + return n * factorial(n - 1); + } +} +``` + +In this case, while `n` is not `1`, this function will keep calling itself until it hits the base case, bubbling up the result on the call stack: + +```md + Is `n` 1? <--------- + /\ / + / \ n = n -1 + / \ / + Yes No -------- +``` + +In Zero-Knowledge, recursion has some similarities. + +It is not a Noir function calling itself, but a proof being used as an input to another circuit. In short, you verify one proof *inside* another proof, returning the proof that both proofs are valid. + +This means that, given enough computational resources, you can prove the correctness of any arbitrary number of proofs in a single proof. This could be useful to design state channels (for which a common example would be [Bitcoin's Lightning Network](https://en.wikipedia.org/wiki/Lightning_Network)), to save on gas costs by settling one proof on-chain, or simply to make business logic less dependent on a consensus mechanism. + +## Examples + +Let us look at some of these examples + +### Alice and Bob - Guessing game + +Alice and Bob are friends, and they like guessing games. They want to play a guessing game online, but for that, they need a trusted third-party that knows both of their secrets and finishes the game once someone wins. + +So, they use zero-knowledge proofs. Alice tries to guess Bob's number, and Bob will generate a ZK proof stating whether she succeeded or failed. + +This ZK proof can go on a smart contract, revealing the winner and even giving prizes. However, this means every turn needs to be verified on-chain. This incurs some cost and waiting time that may simply make the game too expensive or time-consuming to be worth it. + +As a solution, Alice proposes the following: "what if Bob generates his proof, and instead of sending it on-chain, I verify it *within* my own proof before playing my own turn?". + +She can then generate a proof that she verified his proof, and so on. + +```md + Did you fail? <-------------------------- + / \ / + / \ n = n -1 + / \ / + Yes No / + | | / + | | / + | You win / + | / + | / +Generate proof of that / + + / + my own guess ---------------- +``` + +### Charlie - Recursive merkle tree + +Charlie is a concerned citizen, and wants to be sure his vote in an election is accounted for. He votes with a ZK proof, but he has no way of knowing that his ZK proof was included in the total vote count! + +If the vote collector puts all of the votes into a [Merkle tree](https://en.wikipedia.org/wiki/Merkle_tree), everyone can prove the verification of two proofs within one proof, as such: + +```md + abcd + __________|______________ + | | + ab cd + _____|_____ ______|______ + | | | | + alice bob charlie daniel +``` + +Doing this recursively allows us to arrive on a final proof `abcd` which if true, verifies the correctness of all the votes. + +### Daniel - Reusable components + +Daniel has a big circuit and a big headache. A part of his circuit is a setup phase that finishes with some assertions that need to be made. But that section alone takes most of the proving time, and is largely independent of the rest of the circuit. + +He might find it more efficient to generate a proof for that setup phase separately, and verify that proof recursively in the actual business logic section of his circuit. This will allow for parallelization of both proofs, which results in a considerable speedup. + +## What params do I need + +As you can see in the [recursion reference](noir/standard_library/recursion.mdx), a simple recursive proof requires: + +- The proof to verify +- The Verification Key of the circuit that generated the proof +- A hash of this verification key, as it's needed for some backends +- The public inputs for the proof + +:::info + +Recursive zkSNARK schemes do not necessarily "verify a proof" in the sense that you expect a true or false to be spit out by the verifier. Rather an aggregation object is built over the public inputs. + +So, taking the example of Alice and Bob and their guessing game: + +- Alice makes her guess. Her proof is *not* recursive: it doesn't verify any proof within it! It's just a standard `assert(x != y)` circuit +- Bob verifies Alice's proof and makes his own guess. In this circuit, he doesn't exactly *prove* the verification of Alice's proof. Instead, he *aggregates* his proof to Alice's proof. The actual verification is done when the full proof is verified, for example when using `nargo verify` or through the verifier smart contract. + +We can imagine recursive proofs a [relay race](https://en.wikipedia.org/wiki/Relay_race). The first runner doesn't have to receive the baton from anyone else, as he/she already starts with it. But when his/her turn is over, the next runner needs to receive it, run a bit more, and pass it along. Even though every runner could theoretically verify the baton mid-run (why not? 🏃🔍), only at the end of the race does the referee verify that the whole race is valid. + +::: + +## Some architecture + +As with everything in computer science, there's no one-size-fits all. But there are some patterns that could help understanding and implementing them. To give three examples: + +### Adding some logic to a proof verification + +This would be an approach for something like our guessing game, where proofs are sent back and forth and are verified by each opponent. This circuit would be divided in two sections: + +- A `recursive verification` section, which would be just the call to `std::verify_proof`, and that would be skipped on the first move (since there's no proof to verify) +- A `guessing` section, which is basically the logic part where the actual guessing happens + +In such a situation, and assuming Alice is first, she would skip the first part and try to guess Bob's number. Bob would then verify her proof on the first section of his run, and try to guess Alice's number on the second part, and so on. + +### Aggregating proofs + +In some one-way interaction situations, recursion would allow for aggregation of simple proofs that don't need to be immediately verified on-chain or elsewhere. + +To give a practical example, a barman wouldn't need to verify a "proof-of-age" on-chain every time he serves alcohol to a customer. Instead, the architecture would comprise two circuits: + +- A `main`, non-recursive circuit with some logic +- A `recursive` circuit meant to verify two proofs in one proof + +The customer's proofs would be intermediate, and made on their phones, and the barman could just verify them locally. He would then aggregate them into a final proof sent on-chain (or elsewhere) at the end of the day. + +### Recursively verifying different circuits + +Nothing prevents you from verifying different circuits in a recursive proof, for example: + +- A `circuit1` circuit +- A `circuit2` circuit +- A `recursive` circuit + +In this example, a regulator could verify that taxes were paid for a specific purchase by aggregating both a `payer` circuit (proving that a purchase was made and taxes were paid), and a `receipt` circuit (proving that the payment was received) + +## How fast is it + +At the time of writing, verifying recursive proofs is surprisingly fast. This is because most of the time is spent on generating the verification key that will be used to generate the next proof. So you are able to cache the verification key and reuse it later. + +Currently, Noir JS packages don't expose the functionality of loading proving and verification keys, but that feature exists in the underlying `bb.js` package. + +## How can I try it + +Learn more about using recursion in Nargo and NoirJS in the [how-to guide](../how_to/how-to-recursion.md) and see a full example in [noir-examples](https://github.com/noir-lang/noir-examples). diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/explainers/explainer-writing-noir.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/explainers/explainer-writing-noir.md new file mode 100644 index 00000000000..3ef6e014a2f --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/explainers/explainer-writing-noir.md @@ -0,0 +1,177 @@ +--- +title: Writing Performant Noir +description: Understand new considerations when writing Noir +keywords: [Noir, programming, rust] +tags: [Optimization] +sidebar_position: 0 +--- + + +This article intends to set you up with key concepts essential for writing more viable applications that use zero knowledge proofs, namely around efficient circuits. + +## Context - 'Efficient' is subjective + +When writing a web application for a performant computer with high-speed internet connection, writing efficient code sometimes is seen as an afterthought only if needed. Large multiplications running at the innermost of nested loops may not even be on a dev's radar. +When writing firmware for a battery-powered microcontroller, you think of cpu cycles as rations to keep within a product's power budget. + +> Code is written to create applications that perform specific tasks within specific constraints + +And these constraints differ depending on where the compiled code is execute. + +### The Ethereum Virtual Machine (EVM) + +In scenarios where extremely low gas costs are required for an Ethereum application to be viable/competitive, Ethereum smart contract developers get into what is colloquially known as: "*gas golfing*". Finding the lowest execution cost of their compiled code (EVM bytecode) to achieve a specific task. + +The equivalent optimization task when writing zk circuits is affectionately referred to as "*gate golfing*", finding the lowest gate representation of the compiled Noir code. + +### Coding for circuits - a paradigm shift + +In zero knowledge cryptography, code is compiled to "circuits" consisting of arithmetic gates, and gate count is the significant cost. Depending on the proving system this is linearly proportionate to proving time, and so from a product point this should be kept as low as possible. + +Whilst writing efficient code for web apps and Solidity has a few key differences, writing efficient circuits have a different set of considerations. It is a bit of a paradigm shift, like writing code for GPUs for the first time... + +For example, drawing a circle at (0, 0) of radius `r`: +- For a single CPU thread, +``` +for theta in 0..2*pi { + let x = r * cos(theta); + let y = r * sin(theta); + draw(x, y); +} // note: would do 0 - pi/2 and draw +ve/-ve x and y. +``` + +- For GPUs (simultaneous parallel calls with x, y across image), +``` +if (x^2 + y^2 = r^2) { + draw(x, y); +} +``` + +([Related](https://www.youtube.com/watch?v=-P28LKWTzrI)) + +Whilst this CPU -> GPU does not translate to circuits exactly, it is intended to exemplify the difference in intuition when coding for different machine capabilities/constraints. + +### Context Takeaway + +For those coming from a primarily web app background, this article will explain what you need to consider when writing circuits. Furthermore, for those experienced writing efficient machine code, prepare to shift what you think is efficient 😬 + +## Translating from Rust + +For some applications using Noir, existing code might be a convenient starting point to then proceed to optimize the gate count of. + +:::note +Many valuable functions and algorithms have been written in more established languages (C/C++), and converted to modern ones (like Rust). +::: + +Fortunately for Noir developers, when needing a particular function a Rust implementation can be readily compiled into Noir with some key changes. While the compiler does a decent amount of optimizations, it won't be able to change code that has been optimized for clock-cycles into code optimized for arithmetic gates. + +A few things to do when converting Rust code to Noir: +- `println!` is not a macro, use `println` function (same for `assert_eq`) +- No early `return` in function. Use constrain via assertion instead +- No passing by reference. Remove `&` operator to pass by value (copy) +- No boolean operators (`&&`, `||`). Use bitwise operators (`&`, `|`) with boolean values +- No type `usize`. Use types `u8`, `u32`, `u64`, ... +- `main` return must be public, `pub` +- No `const`, use `global` +- Noir's LSP is your friend, so error message should be informative enough to resolve syntax issues. + +## Writing efficient Noir for performant products + +The following points help refine our understanding over time. + +:::note +A Noir program makes a statement that can be verified. +::: + +It compiles to a structure that represents the calculation, and can assert results within the calculation at any stage (via the `constrain` keyword). + +A Noir program compiles to an Abstract Circuit Intermediate Representation which is: + - Conceptually a tree structure + - Leaves (inputs) are the `Field` type + - Nodes contain arithmetic operations to combine them (gates) + - The root is the final result (return value) + +:::tip +The command `nargo info` shows the programs circuit size, and is useful to compare the value of changes made. +You can dig deeper and use the `--print-acir` param to take a closer look at individual ACIR opcodes, and the proving backend to see its gate count (eg for barretenberg, `bb gates -b ./target/program.json`). +::: + +### Use the `Field` type + +Since the native type of values in circuits are `Field`s, using them for variables in Noir means less gates converting them under the hood. +Some things to be mindful of when using a Field type for a regular integer value: +- A variable of type `Field` can be cast `as` an integer type (eg `u8`, `u64`) + - Note: this retains only the bits of the integer type. Eg a Field value of 260 as a `u8` becomes 4 +- For Field types arithmetic operations meaningfully overflow/underflow, yet for integer types they are checked according to their size +- Comparisons and bitwise operations do not exist for `Field`s, cast to an appropriately sized integer type when you need to + +:::tip +Where possible, use `Field` type for values. Using smaller value types, and bit-packing strategies, will result in MORE gates +::: + + +### Use Arithmetic over non-arithmetic operations + +Since circuits are made of arithmetic gates, the cost of arithmetic operations tends to be one gate. Whereas for procedural code, they represent several clock cycles. + +Inversely, non-arithmetic operators are achieved with multiple gates, vs 1 clock cycle for procedural code. + +| (cost\op) | arithmetic
(`*`, `+`) | bit-wise ops
(eg `<`, `\|`, `>>`) | +| - | - | - | +| **cycles** | 10+ | 1 | +| **gates** | 1 | 10+ | + +Bit-wise operations (e.g. bit shifts `<<` and `>>`), albeit commonly used in general programming and especially for clock cycle optimizations, are on the contrary expensive in gates when performed within circuits. + +Translate away from bit shifts when writing constrained functions for the best performance. + +On the flip side, feel free to use bit shifts in unconstrained functions and tests if necessary, as they are executed outside of circuits and does not induce performance hits. + +### Use static over dynamic values + +Another general theme that manifests in different ways is that static reads are represented with less gates than dynamic ones. + +Reading from read-only memory (ROM) adds less gates than random-access memory (RAM), 2 vs ~3.25 due to the additional bounds checks. Arrays of fixed length (albeit used at a lower capacity), will generate less gates than dynamic storage. + +Related to this, if an index used to access an array is not known at compile time (ie unknown until run time), then ROM will be converted to RAM, expanding the gate count. + +:::tip +Use arrays and indices that are known at compile time where possible. +Using `assert_constant(i);` before an index, `i`, is used in an array will give a compile error if `i` is NOT known at compile time. +::: + +### Leverage unconstrained execution + +Constrained verification can leverage unconstrained execution, this is especially useful for operations that are represented by many gates. +Use an [unconstrained function](../noir/concepts/unconstrained.md) to perform gate-heavy calculations, then verify and constrain the result. + +Eg division generates more gates than multiplication, so calculating the quotient in an unconstrained function then constraining the product for the quotient and divisor (+ any remainder) equals the dividend will be more efficient. + +Use ` if is_unconstrained() { /`, to conditionally execute code if being called in an unconstrained vs constrained way. + +## Advanced + +Unless you're well into the depth of gate optimization, this advanced section can be ignored. + +### Combine arithmetic operations + +A Noir program can be honed further by combining arithmetic operators in a way that makes the most of each constraint of the backend proving system. This is in scenarios where the backend might not be doing this perfectly. + +Eg Barretenberg backend (current default for Noir) is a width-4 PLONKish constraint system +$ w_1*w_2*q_m + w_1*q_1 + w_2*q_2 + w_3*q_3 + w_4*q_4 + q_c = 0 $ + +Here we see there is one occurrence of witness 1 and 2 ($w_1$, $w_2$) being multiplied together, with addition to witnesses 1-4 ($w_1$ .. $w_4$) multiplied by 4 corresponding circuit constants ($q_1$ .. $q_4$) (plus a final circuit constant, $q_c$). + +Use `nargo info --print-acir`, to inspect the ACIR opcodes (and the proving system for gates), and it may present opportunities to amend the order of operations and reduce the number of constraints. + +#### Variable as witness vs expression + +If you've come this far and really know what you're doing at the equation level, a temporary lever (that will become unnecessary/useless over time) is: `std::as_witness`. This informs the compiler to save a variable as a witness not an expression. + +The compiler will mostly be correct and optimal, but this may help some near term edge cases that are yet to optimize. +Note: When used incorrectly it will create **less** efficient circuits (higher gate count). + +## References +- Guillaume's ["`Cryptdoku`" talk](https://www.youtube.com/watch?v=MrQyzuogxgg) (Jun'23) +- Tips from Tom, Jake and Zac. +- [Idiomatic Noir](https://www.vlayer.xyz/blog/idiomatic-noir-part-1-collections) blog post diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/_category_.json b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/_category_.json new file mode 100644 index 00000000000..5d694210bbf --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/_category_.json @@ -0,0 +1,5 @@ +{ + "position": 0, + "collapsible": true, + "collapsed": true +} diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/backend/_category_.json b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/backend/_category_.json new file mode 100644 index 00000000000..b82e92beb0c --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/backend/_category_.json @@ -0,0 +1,6 @@ +{ + "position": 1, + "label": "Install Proving Backend", + "collapsible": true, + "collapsed": true +} diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/backend/index.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/backend/index.md new file mode 100644 index 00000000000..7192d954877 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/backend/index.md @@ -0,0 +1,31 @@ +--- +title: Proving Backend Installation +description: Proving backends offer command line tools for proving and verifying Noir programs. This page describes how to install `bb` as an example. +keywords: [ + Proving + Backend + Barretenberg + bb + bbup + Installation + Terminal + Command + CLI + Version +] +pagination_next: getting_started/hello_noir/index +--- + +Proving backends each provide their own tools for working with Noir programs, providing functionality like proof generation, proof verification, and verifier smart contract generation. + +For the latest information on tooling provided by each proving backend, installation instructions, Noir version compatibility... you may refer to the proving backends' own documentation. + +You can find the full list of proving backends compatible with Noir in [Awesome Noir](https://github.com/noir-lang/awesome-noir/?tab=readme-ov-file#proving-backends). + +## Example: Installing `bb` + +`bb` is the CLI tool provided by the [Barretenberg proving backend](https://github.com/AztecProtocol/barretenberg) developed by Aztec Labs. + +You can find the instructions for installation in [`bb`'s documentation](https://github.com/AztecProtocol/aztec-packages/blob/master/barretenberg/cpp/src/barretenberg/bb/readme.md#installation). + +Once installed, we are ready to start working on [our first Noir program](../hello_noir/index.md). diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/hello_noir/_category_.json b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/hello_noir/_category_.json new file mode 100644 index 00000000000..976a2325de0 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/hello_noir/_category_.json @@ -0,0 +1,5 @@ +{ + "position": 2, + "collapsible": true, + "collapsed": true +} diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/hello_noir/index.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/hello_noir/index.md new file mode 100644 index 00000000000..6760e54aad1 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/hello_noir/index.md @@ -0,0 +1,157 @@ +--- +title: Creating a Project +description: + Learn how to create and verify your first Noir program using Nargo, a programming language for + zero-knowledge proofs. +keywords: + [ + Nargo, + Noir, + zero-knowledge proofs, + programming language, + create Noir program, + verify Noir program, + step-by-step guide, + ] +sidebar_position: 1 + +--- + +Now that we have installed Nargo and a proving backend, it is time to make our first hello world program! + +### 1. Create a new project directory + +Noir code can live anywhere on your computer. Let us create a _projects_ folder in the home +directory to house our first Noir program. + +Create the directory and change directory into it by running: + +```sh +mkdir ~/projects +cd ~/projects +``` + +## Nargo + +Nargo provides the ability to initiate and execute Noir projects. Read the [Nargo installation](../installation/index.md) section to learn more about Nargo and how to install it. + +### 2. Create a new Noir project + +Now that we are in the projects directory, create a new Nargo project by running: + +```sh +nargo new hello_world +``` + +`hello_world` can be any arbitrary project name, we are simply using `hello_world` for demonstration. + +In production, it is common practice to name the project folder, `circuits`, for clarity amongst other folders in the codebase (like: `contracts`, `scripts`, and `test`). + +A `hello_world` folder would be created. Similar to Rust, the folder houses _src/main.nr_ and +_Nargo.toml_ which contain the source code and environmental options of your Noir program +respectively. + +#### Intro to Noir Syntax + +Let us take a closer look at _main.nr_. The default _main.nr_ generated should look like this: + +```rust +fn main(x : Field, y : pub Field) { + assert(x != y); +} +``` + +The first line of the program specifies the program's inputs: + +```rust +x : Field, y : pub Field +``` + +Program inputs in Noir are private by default (e.g. `x`), but can be labeled public using the +keyword `pub` (e.g. `y`). To learn more about private and public values, check the +[Data Types](../../noir/concepts/data_types/index.md) section. + +The next line of the program specifies its body: + +```rust +assert(x != y); +``` + +The Noir syntax `assert` can be interpreted as something similar to constraints in other zk-contract languages. + +For more Noir syntax, check the [Language Concepts](../../noir/concepts/comments.md) chapter. + +### 3. Build in/output files + +Change directory into _hello_world_ and build in/output files for your Noir program by running: + +```sh +cd hello_world +nargo check +``` + +A _Prover.toml_ file will be generated in your project directory, to allow specifying input values to the program. + +### 4. Execute the Noir program + +Now that the project is set up, we can execute our Noir program. + +Fill in input values for execution in the _Prover.toml_ file. For example: + +```toml +x = "1" +y = "2" +``` + +Execute your Noir program: + +```sh +nargo execute witness-name +``` + +The witness corresponding to this execution will then be written to the file `./target/witness-name.gz`. + +The command also automatically compiles your Noir program if it was not already / was edited, which you may notice the compiled artifacts being written to the file `./target/hello_world.json`. + +## Proving Backend + +Proving backends provide the ability to generate and verify proofs of executing Noir programs, following Noir's tooling that compiles and executes the programs. Read the [proving backend installation](../backend/index.md) section to learn more about proving backends and how to install them. + +Barretenberg is used as an example here to demonstrate how proving and verifying could be implemented and used. Read the [`bb` installation](../backend/index.md#example-installing-bb) section for how to install Barretenberg's CLI tool; refer to [`bb`'s documentation](https://github.com/AztecProtocol/aztec-packages/blob/master/barretenberg/cpp/src/barretenberg/bb/readme.md) for full details about the tool. + +### 5. Prove an execution of the Noir program + +Using Barretenberg as an example, prove the valid execution of your Noir program running: + +```sh +bb prove -b ./target/hello_world.json -w ./target/witness-name.gz -o ./target/proof +``` + +The proof generated will then be written to the file `./target/proof`. + +:::tip +Since the params for `nargo` and `bb` often specify multiple filenames to read from or write to, remember to check each command is referring to the desired filenames. +Or for greater certainty, delete the target folder and go through each step again (compile, witness, prove, ...) to ensure files generated in past commands are being referenced in future ones. +::: + +### 6. Verify the execution proof + +Once a proof is generated, we can verify correct execution of our Noir program by verifying the proof file. + +Using Barretenberg as an example, compute the verification key for the Noir program by running: + +```sh +bb write_vk -b ./target/hello_world.json -o ./target/vk +``` + +And verify your proof by running: + +```sh +bb verify -k ./target/vk -p ./target/proof +``` + +If successful, the verification will complete in silence; if unsuccessful, the command will trigger logging of the corresponding error. + +Congratulations, you have now created and verified a proof for your very first Noir program! + +In the [next section](./project_breakdown.md), we will go into more detail on each step performed. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/hello_noir/project_breakdown.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/hello_noir/project_breakdown.md new file mode 100644 index 00000000000..96e653f6c08 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/hello_noir/project_breakdown.md @@ -0,0 +1,159 @@ +--- +title: Project Breakdown +description: + Learn about the anatomy of a Nargo project, including the purpose of the Prover TOML + file, and how to prove and verify your program. +keywords: + [Nargo, Nargo project, Prover.toml, proof verification, private asset transfer] +sidebar_position: 2 +--- + +This section breaks down our hello world program from the previous section. + +## Anatomy of a Nargo Project + +Upon creating a new project with `nargo new` and building the in/output files with `nargo check` +commands, you would get a minimal Nargo project of the following structure: + + - src + - Prover.toml + - Nargo.toml + +The source directory _src_ holds the source code for your Noir program. By default only a _main.nr_ +file will be generated within it. + +### Prover.toml + +_Prover.toml_ is used for specifying the input values for executing and proving the program. You can specify `toml` files with different names by using the `--prover-name` or `-p` flags, see the [Prover](#provertoml) section below. Optionally you may specify expected output values for prove-time checking as well. + +### Nargo.toml + +_Nargo.toml_ contains the environmental options of your project. It contains a "package" section and a "dependencies" section. + +Example Nargo.toml: + +```toml +[package] +name = "noir_starter" +type = "bin" +authors = ["Alice"] +compiler_version = "0.9.0" +description = "Getting started with Noir" +entry = "circuit/main.nr" +license = "MIT" + +[dependencies] +ecrecover = {tag = "v0.9.0", git = "https://github.com/colinnielsen/ecrecover-noir.git"} +``` + +Nargo.toml for a [workspace](../../noir/modules_packages_crates/workspaces.md) will look a bit different. For example: + +```toml +[workspace] +members = ["crates/a", "crates/b"] +default-member = "crates/a" +``` + +#### Package section + +The package section defines a number of fields including: + +- `name` (**required**) - the name of the package +- `type` (**required**) - can be "bin", "lib", or "contract" to specify whether its a binary, library or Aztec contract +- `authors` (optional) - authors of the project +- `compiler_version` - specifies the version of the compiler to use. This is enforced by the compiler and follow's [Rust's versioning](https://doc.rust-lang.org/cargo/reference/manifest.html#the-version-field), so a `compiler_version = 0.18.0` will enforce Nargo version 0.18.0, `compiler_version = ^0.18.0` will enforce anything above 0.18.0 but below 0.19.0, etc. For more information, see how [Rust handles these operators](https://docs.rs/semver/latest/semver/enum.Op.html) +- `description` (optional) +- `entry` (optional) - a relative filepath to use as the entry point into your package (overrides the default of `src/lib.nr` or `src/main.nr`) +- `backend` (optional) +- `license` (optional) +- `expression_width` (optional) - Sets the default backend expression width. This field will override the default backend expression width specified by the Noir compiler (currently set to width 4). + +#### Dependencies section + +This is where you will specify any dependencies for your project. See the [Dependencies page](../../noir/modules_packages_crates/dependencies.md) for more info. + +`./proofs/` and `./contract/` directories will not be immediately visible until you create a proof or +verifier contract respectively. + +### main.nr + +The _main.nr_ file contains a `main` method, this method is the entry point into your Noir program. + +In our sample program, _main.nr_ looks like this: + +```rust +fn main(x : Field, y : Field) { + assert(x != y); +} +``` + +The parameters `x` and `y` can be seen as the API for the program and must be supplied by the prover. Since neither `x` nor `y` is marked as public, the verifier does not supply any inputs, when verifying the proof. + +The prover supplies the values for `x` and `y` in the _Prover.toml_ file. + +As for the program body, `assert` ensures that the condition to be satisfied (e.g. `x != y`) is constrained by the proof of the execution of said program (i.e. if the condition was not met, the verifier would reject the proof as an invalid proof). + +### Prover.toml + +The _Prover.toml_ file is a file which the prover uses to supply the inputs to the Noir program (both private and public). + +In our hello world program the _Prover.toml_ file looks like this: + +```toml +x = "1" +y = "2" +``` + +When the command `nargo execute` is executed, nargo will execute the Noir program using the inputs specified in `Prover.toml`, aborting if it finds that these do not satisfy the constraints defined by `main`. In this example, `x` and `y` must satisfy the inequality constraint `assert(x != y)`. + +If an output name is specified such as `nargo execute foo`, the witness generated by this execution will be written to `./target/foo.gz`. This can then be used to generate a proof of the execution. + +#### Arrays of Structs + +The following code shows how to pass an array of structs to a Noir program to generate a proof. + +```rust +// main.nr +struct Foo { + bar: Field, + baz: Field, +} + +fn main(foos: [Foo; 3]) -> pub Field { + foos[2].bar + foos[2].baz +} +``` + +Prover.toml: + +```toml +[[foos]] # foos[0] +bar = 0 +baz = 0 + +[[foos]] # foos[1] +bar = 0 +baz = 0 + +[[foos]] # foos[2] +bar = 1 +baz = 2 +``` + +#### Custom toml files + +You can specify a `toml` file with a different name to use for execution by using the `--prover-name` or `-p` flags. + +This command looks for proof inputs in the default **Prover.toml** and generates the witness and saves it at `./target/foo.gz`: + +```bash +nargo execute foo +``` + +This command looks for proof inputs in the custom **OtherProver.toml** and generates the witness and saves it at `./target/bar.gz`: + +```bash +nargo execute -p OtherProver bar +``` + +Now that you understand the concepts, you'll probably want some editor feedback while you are writing more complex code. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/installation/_category_.json b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/installation/_category_.json new file mode 100644 index 00000000000..0c02fb5d4d7 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/installation/_category_.json @@ -0,0 +1,6 @@ +{ + "position": 0, + "label": "Install Nargo", + "collapsible": true, + "collapsed": true +} diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/installation/index.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/installation/index.md new file mode 100644 index 00000000000..53ea9c7891c --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/installation/index.md @@ -0,0 +1,46 @@ +--- +title: Nargo Installation +description: + nargo is a command line tool for interacting with Noir programs. This page is a quick guide on how to install Nargo through the most common and easy method, noirup +keywords: [ + Nargo + Noir + Rust + Cargo + Noirup + Installation + Terminal Commands + Version Check + Nightlies + Specific Versions + Branches + Noirup Repository +] +pagination_next: getting_started/hello_noir/index +--- + +`nargo` is a tool for working with Noir programs on the CLI, providing you with the ability to start new projects, compile, execute and test Noir programs from the terminal. + +The name is inspired by Rust's package manager `cargo`; and similar to Rust's `rustup`, Noir also has an easy installation script `noirup`. + +## Installing Noirup + +Open a terminal on your machine, and write: + +```bash +curl -L https://raw.githubusercontent.com/noir-lang/noirup/main/install | bash +``` + +Close the terminal, open another one, and run + +```bash +noirup +``` + +Done. That's it. You should have the latest version working. You can check with `nargo --version`. + +You can also install nightlies, specific versions +or branches. Check out the [noirup repository](https://github.com/noir-lang/noirup) for more +information. + +Now we're ready to start working on [our first Noir program!](../hello_noir/index.md) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/installation/other_install_methods.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/installation/other_install_methods.md new file mode 100644 index 00000000000..3634723562b --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/getting_started/installation/other_install_methods.md @@ -0,0 +1,102 @@ +--- +title: Alternative Installations +description: There are different ways to install Nargo, the one-stop shop and command-line tool for developing Noir programs. This guide explains how to specify which version to install when using noirup, and using WSL for windows. +keywords: [ + Installation + Nargo + Noirup + Binaries + Compiling from Source + WSL for Windows + macOS + Linux + Nix + Direnv + Uninstalling Nargo + ] +sidebar_position: 1 +--- + +## Encouraged Installation Method: Noirup + +Noirup is the endorsed method for installing Nargo, streamlining the process of fetching binaries or compiling from source. It supports a range of options to cater to your specific needs, from nightly builds and specific versions to compiling from various sources. + +### Installing Noirup + +First, ensure you have `noirup` installed: + +```sh +curl -L https://raw.githubusercontent.com/noir-lang/noirup/main/install | bash +``` + +### Fetching Binaries + +With `noirup`, you can easily switch between different Nargo versions, including nightly builds: + +- **Nightly Version**: Install the latest nightly build. + + ```sh + noirup --version nightly + ``` + +- **Specific Version**: Install a specific version of Nargo. + ```sh + noirup --version + ``` + +### Compiling from Source + +`noirup` also enables compiling Nargo from various sources: + +- **From a Specific Branch**: Install from the latest commit on a branch. + + ```sh + noirup --branch + ``` + +- **From a Fork**: Install from the main branch of a fork. + + ```sh + noirup --repo + ``` + +- **From a Specific Branch in a Fork**: Install from a specific branch in a fork. + + ```sh + noirup --repo --branch + ``` + +- **From a Specific Pull Request**: Install from a specific PR. + + ```sh + noirup --pr + ``` + +- **From a Specific Commit**: Install from a specific commit. + + ```sh + noirup -C + ``` + +- **From Local Source**: Compile and install from a local directory. + ```sh + noirup --path ./path/to/local/source + ``` + +## Installation on Windows + +The default backend for Noir (Barretenberg) doesn't provide Windows binaries at this time. For that reason, Noir cannot be installed natively. However, it is available by using Windows Subsystem for Linux (WSL). + +Step 1: Follow the instructions [here](https://learn.microsoft.com/en-us/windows/wsl/install) to install and run WSL. + +step 2: Follow the [Noirup instructions](#encouraged-installation-method-noirup). + +## Uninstalling Nargo + +If you installed Nargo with `noirup`, you can uninstall Nargo by removing the files in `~/.nargo`, `~/nargo`, and `~/noir_cache`. This ensures that all installed binaries, configurations, and cache related to Nargo are fully removed from your system. + +```bash +rm -r ~/.nargo +rm -r ~/nargo +rm -r ~/noir_cache +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/_category_.json b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/_category_.json new file mode 100644 index 00000000000..23b560f610b --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/_category_.json @@ -0,0 +1,5 @@ +{ + "position": 1, + "collapsible": true, + "collapsed": true +} diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/debugger/_category_.json b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/debugger/_category_.json new file mode 100644 index 00000000000..cc2cbb1c253 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/debugger/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Debugging", + "position": 5, + "collapsible": true, + "collapsed": true +} diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/debugger/debugging_with_the_repl.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/debugger/debugging_with_the_repl.md new file mode 100644 index 00000000000..09e5bae68ad --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/debugger/debugging_with_the_repl.md @@ -0,0 +1,164 @@ +--- +title: Using the REPL Debugger +description: + Step by step guide on how to debug your Noir circuits with the REPL Debugger. +keywords: + [ + Nargo, + Noir CLI, + Noir Debugger, + REPL, + ] +sidebar_position: 1 +--- + +#### Pre-requisites + +In order to use the REPL debugger, first you need to install recent enough versions of Nargo and vscode-noir. + +## Debugging a simple circuit + +Let's debug a simple circuit: + +```rust +fn main(x : Field, y : pub Field) { + assert(x != y); +} +``` + +To start the REPL debugger, using a terminal, go to a Noir circuit's home directory. Then: + +`$ nargo debug` + +You should be seeing this in your terminal: + +``` +[main] Starting debugger +At ~/noir-examples/recursion/circuits/main/src/main.nr:1:9 + 1 -> fn main(x : Field, y : pub Field) { + 2 assert(x != y); + 3 } +> +``` + +The debugger displays the current Noir code location, and it is now waiting for us to drive it. + +Let's first take a look at the available commands. For that we'll use the `help` command. + +``` +> help +Available commands: + + opcodes display ACIR opcodes + into step into to the next opcode + next step until a new source location is reached + out step until a new source location is reached + and the current stack frame is finished + break LOCATION:OpcodeLocation add a breakpoint at an opcode location + over step until a new source location is reached + without diving into function calls + restart restart the debugging session + delete LOCATION:OpcodeLocation delete breakpoint at an opcode location + witness show witness map + witness index:u32 display a single witness from the witness map + witness index:u32 value:String update a witness with the given value + memset index:usize value:String update a memory cell with the given + value + continue continue execution until the end of the + program + vars show variable values available at this point + in execution + stacktrace display the current stack trace + memory show memory (valid when executing unconstrained code) + step step to the next ACIR opcode + +Other commands: + + help Show this help message + quit Quit repl + +``` + +Some commands operate only for unconstrained functions, such as `memory` and `memset`. If you try to use them while execution is paused at an ACIR opcode, the debugger will simply inform you that you are not executing unconstrained code: + +``` +> memory +Unconstrained VM memory not available +> +``` + +Before continuing, we can take a look at the initial witness map: + +``` +> witness +_0 = 1 +_1 = 2 +> +``` + +Cool, since `x==1`, `y==2`, and we want to check that `x != y`, our circuit should succeed. At this point we could intervene and use the witness setter command to change one of the witnesses. Let's set `y=3`, then back to 2, so we don't affect the expected result: + +``` +> witness +_0 = 1 +_1 = 2 +> witness 1 3 +_1 = 3 +> witness +_0 = 1 +_1 = 3 +> witness 1 2 +_1 = 2 +> witness +_0 = 1 +_1 = 2 +> +``` + +Now we can inspect the current state of local variables. For that we use the `vars` command. + +``` +> vars +> +``` + +We currently have no vars in context, since we are at the entry point of the program. Let's use `next` to execute until the next point in the program. + +``` +> vars +> next +At ~/noir-examples/recursion/circuits/main/src/main.nr:1:20 + 1 -> fn main(x : Field, y : pub Field) { + 2 assert(x != y); + 3 } +> vars +x:Field = 0x01 +``` + +As a result of stepping, the variable `x`, whose initial value comes from the witness map, is now in context and returned by `vars`. + +``` +> next + 1 fn main(x : Field, y : pub Field) { + 2 -> assert(x != y); + 3 } +> vars +y:Field = 0x02 +x:Field = 0x01 +``` + +Stepping again we can finally see both variables and their values. And now we can see that the next assertion should succeed. + +Let's continue to the end: + +``` +> continue +(Continuing execution...) +Finished execution +> q +[main] Circuit witness successfully solved +``` + +Upon quitting the debugger after a solved circuit, the resulting circuit witness gets saved, equivalent to what would happen if we had run the same circuit with `nargo execute`. + +We just went through the basics of debugging using Noir REPL debugger. For a comprehensive reference, check out [the reference page](../../reference/debugger/debugger_repl.md). diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/debugger/debugging_with_vs_code.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/debugger/debugging_with_vs_code.md new file mode 100644 index 00000000000..a5858c1a5eb --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/debugger/debugging_with_vs_code.md @@ -0,0 +1,68 @@ +--- +title: Using the VS Code Debugger +description: + Step by step guide on how to debug your Noir circuits with the VS Code Debugger configuration and features. +keywords: + [ + Nargo, + Noir CLI, + Noir Debugger, + VS Code, + IDE, + ] +sidebar_position: 0 +--- + +This guide will show you how to use VS Code with the vscode-noir extension to debug a Noir project. + +#### Pre-requisites + +- Nargo +- vscode-noir +- A Noir project with a `Nargo.toml`, `Prover.toml` and at least one Noir (`.nr`) containing an entry point function (typically `main`). + +## Running the debugger + +The easiest way to start debugging is to open the file you want to debug, and press `F5`. This will cause the debugger to launch, using your `Prover.toml` file as input. + +You should see something like this: + +![Debugger launched](@site/static/img/debugger/1-started.png) + +Let's inspect the state of the program. For that, we open VS Code's _Debug pane_. Look for this icon: + +![Debug pane icon](@site/static/img/debugger/2-icon.png) + +You will now see two categories of variables: Locals and Witness Map. + +![Debug pane expanded](@site/static/img/debugger/3-debug-pane.png) + +1. **Locals**: variables of your program. At this point in execution this section is empty, but as we step through the code it will get populated by `x`, `result`, `digest`, etc. + +2. **Witness map**: these are initially populated from your project's `Prover.toml` file. In this example, they will be used to populate `x` and `result` at the beginning of the `main` function. + +Most of the time you will probably be focusing mostly on locals, as they represent the high level state of your program. + +You might be interested in inspecting the witness map in case you are trying to solve a really low level issue in the compiler or runtime itself, so this concerns mostly advanced or niche users. + +Let's step through the program, by using the debugger buttons or their corresponding keyboard shortcuts. + +![Debugger buttons](@site/static/img/debugger/4-debugger-buttons.png) + +Now we can see in the variables pane that there's values for `digest`, `result` and `x`. + +![Inspecting locals](@site/static/img/debugger/5-assert.png) + +We can also inspect the values of variables by directly hovering on them on the code. + +![Hover locals](@site/static/img/debugger/6-hover.png) + +Let's set a break point at the `keccak256` function, so we can continue execution up to the point when it's first invoked without having to go one step at a time. + +We just need to click the to the right of the line number 18. Once the breakpoint appears, we can click the `continue` button or use its corresponding keyboard shortcut (`F5` by default). + +![Breakpoint](@site/static/img/debugger/7-break.png) + +Now we are debugging the `keccak256` function, notice the _Call Stack pane_ at the lower right. This lets us inspect the current call stack of our process. + +That covers most of the current debugger functionalities. Check out [the reference](../../reference/debugger/debugger_vscode.md) for more details on how to configure the debugger. \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/how-to-oracles.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/how-to-oracles.md new file mode 100644 index 00000000000..2f69902062c --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/how-to-oracles.md @@ -0,0 +1,273 @@ +--- +title: How to use Oracles +description: Learn how to use oracles in your Noir program with examples in both Nargo and NoirJS. This guide also covers writing a JSON RPC server and providing custom foreign call handlers for NoirJS. +keywords: + - Noir Programming + - Oracles + - Nargo + - NoirJS + - JSON RPC Server + - Foreign Call Handlers +sidebar_position: 1 +--- + +This guide shows you how to use oracles in your Noir program. For the sake of clarity, it assumes that: + +- You have read the [explainer on Oracles](../explainers/explainer-oracle.md) and are comfortable with the concept. +- You have a Noir program to add oracles to. You can create one using the [vite-hardhat starter](https://github.com/noir-lang/noir-starter/tree/main/vite-hardhat) as a boilerplate. +- You understand the concept of a JSON-RPC server. Visit the [JSON-RPC website](https://www.jsonrpc.org/) if you need a refresher. +- You are comfortable with server-side JavaScript (e.g. Node.js, managing packages, etc.). + +For reference, you can find the snippets used in this tutorial on the [Aztec DevRel Repository](https://github.com/AztecProtocol/dev-rel/tree/main/code-snippets/how-to-oracles). + +## Rundown + +This guide has 3 major steps: + +1. How to modify our Noir program to make use of oracle calls as unconstrained functions +2. How to write a JSON RPC Server to resolve these oracle calls with Nargo +3. How to use them in Nargo and how to provide a custom resolver in NoirJS + +## Step 1 - Modify your Noir program + +An oracle is defined in a Noir program by defining two methods: + +- An unconstrained method - This tells the compiler that it is executing an [unconstrained functions](../noir/concepts//unconstrained.md). +- A decorated oracle method - This tells the compiler that this method is an RPC call. + +An example of an oracle that returns a `Field` would be: + +```rust +#[oracle(getSqrt)] +unconstrained fn sqrt(number: Field) -> Field { } + +unconstrained fn get_sqrt(number: Field) -> Field { + sqrt(number) +} +``` + +In this example, we're wrapping our oracle function in an unconstrained method, and decorating it with `oracle(getSqrt)`. We can then call the unconstrained function as we would call any other function: + +```rust +fn main(input: Field) { + let sqrt = get_sqrt(input); +} +``` + +In the next section, we will make this `getSqrt` (defined on the `sqrt` decorator) be a method of the RPC server Noir will use. + +:::danger + +As explained in the [Oracle Explainer](../explainers/explainer-oracle.md), this `main` function is unsafe unless you constrain its return value. For example: + +```rust +fn main(input: Field) { + let sqrt = get_sqrt(input); + assert(sqrt.pow_32(2) as u64 == input as u64); // <---- constrain the return of an oracle! +} +``` + +::: + +:::info + +Currently, oracles only work with single params or array params. For example: + +```rust +#[oracle(getSqrt)] +unconstrained fn sqrt([Field; 2]) -> [Field; 2] { } +``` + +::: + +## Step 2 - Write an RPC server + +Brillig will call *one* RPC server. Most likely you will have to write your own, and you can do it in whatever language you prefer. In this guide, we will do it in Javascript. + +Let's use the above example of an oracle that consumes an array with two `Field` and returns their square roots: + +```rust +#[oracle(getSqrt)] +unconstrained fn sqrt(input: [Field; 2]) -> [Field; 2] { } + +unconstrained fn get_sqrt(input: [Field; 2]) -> [Field; 2] { + sqrt(input) +} + +fn main(input: [Field; 2]) { + let sqrt = get_sqrt(input); + assert(sqrt[0].pow_32(2) as u64 == input[0] as u64); + assert(sqrt[1].pow_32(2) as u64 == input[1] as u64); +} +``` + +:::info + +Why square root? + +In general, computing square roots is computationally more expensive than multiplications, which takes a toll when speaking about ZK applications. In this case, instead of calculating the square root in Noir, we are using our oracle to offload that computation to be made in plain. In our circuit we can simply multiply the two values. + +::: + +Now, we should write the correspondent RPC server, starting with the [default JSON-RPC 2.0 boilerplate](https://www.npmjs.com/package/json-rpc-2.0#example): + +```js +import { JSONRPCServer } from "json-rpc-2.0"; +import express from "express"; +import bodyParser from "body-parser"; + +const app = express(); +app.use(bodyParser.json()); + +const server = new JSONRPCServer(); +app.post("/", (req, res) => { + const jsonRPCRequest = req.body; + server.receive(jsonRPCRequest).then((jsonRPCResponse) => { + if (jsonRPCResponse) { + res.json(jsonRPCResponse); + } else { + res.sendStatus(204); + } + }); +}); + +app.listen(5555); +``` + +Now, we will add our `getSqrt` method, as expected by the `#[oracle(getSqrt)]` decorator in our Noir code. It maps through the params array and returns their square roots: + +```js +server.addMethod("resolve_function_call", async (params) => { + if params.function !== "getSqrt" { + throw Error("Unexpected foreign call") + }; + const values = params.inputs[0].Array.map((field) => { + return `${Math.sqrt(parseInt(field, 16))}`; + }); + return { values: [{ Array: values }] }; +}); +``` + +If you're using Typescript, the following types may be helpful in understanding the expected return value and making sure they're easy to follow: + +```js +interface SingleForeignCallParam { + Single: string, +} + +interface ArrayForeignCallParam { + Array: string[], +} + +type ForeignCallParam = SingleForeignCallParam | ArrayForeignCallParam; + +interface ForeignCallResult { + values: ForeignCallParam[], +} +``` + +::: Multidimensional Arrays + +If the Oracle function is returning an array containing other arrays, such as `[['1','2],['3','4']]`, you need to provide the values in json as flattened values. In the previous example, it would be `['1', '2', '3', '4']`. In the noir program, the Oracle signature can use a nested type, the flattened values will be automatically converted to the nested type. + +::: + +## Step 3 - Usage with Nargo + +Using the [`nargo` CLI tool](../getting_started/installation/index.md), you can use oracles in the `nargo test` and `nargo execute` commands by passing a value to `--oracle-resolver`. For example: + +```bash +nargo test --oracle-resolver http://localhost:5555 +``` + +This tells `nargo` to use your RPC Server URL whenever it finds an oracle decorator. + +## Step 4 - Usage with NoirJS + +In a JS environment, an RPC server is not strictly necessary, as you may want to resolve your oracles without needing any JSON call at all. NoirJS simply expects that you pass a callback function when you generate proofs, and that callback function can be anything. + +For example, if your Noir program expects the host machine to provide CPU pseudo-randomness, you could simply pass it as the `foreignCallHandler`. You don't strictly need to create an RPC server to serve pseudo-randomness, as you may as well get it directly in your app: + +```js +const foreignCallHandler = (name, inputs) => crypto.randomBytes(16) // etc + +await noir.execute(inputs, foreignCallHandler) +``` + +As one can see, in NoirJS, the [`foreignCallHandler`](../reference/NoirJS/noir_js/type-aliases/ForeignCallHandler.md) function simply means "a callback function that returns a value of type [`ForeignCallOutput`](../reference/NoirJS/noir_js/type-aliases/ForeignCallOutput.md). It doesn't have to be an RPC call like in the case for Nargo. + +:::tip + +Does this mean you don't have to write an RPC server like in [Step #2](#step-2---write-an-rpc-server)? + +You don't technically have to, but then how would you run `nargo test`? To use both `Nargo` and `NoirJS` in your development flow, you will have to write a JSON RPC server. + +::: + +In this case, let's make `foreignCallHandler` call the JSON RPC Server we created in [Step #2](#step-2---write-an-rpc-server), by making it a JSON RPC Client. + +For example, using the same `getSqrt` program in [Step #1](#step-1---modify-your-noir-program) (comments in the code): + +```js +import { JSONRPCClient } from "json-rpc-2.0"; + +// declaring the JSONRPCClient +const client = new JSONRPCClient((jsonRPCRequest) => { +// hitting the same JSON RPC Server we coded above + return fetch("http://localhost:5555", { + method: "POST", + headers: { + "content-type": "application/json", + }, + body: JSON.stringify(jsonRPCRequest), + }).then((response) => { + if (response.status === 200) { + return response + .json() + .then((jsonRPCResponse) => client.receive(jsonRPCResponse)); + } else if (jsonRPCRequest.id !== undefined) { + return Promise.reject(new Error(response.statusText)); + } + }); +}); + +// declaring a function that takes the name of the foreign call (getSqrt) and the inputs +const foreignCallHandler = async (name, input) => { + // notice that the "inputs" parameter contains *all* the inputs + // in this case we make the RPC request with the first parameter "numbers", which would be input[0] + const oracleReturn = await client.request(name, [ + input[0].map((i) => i.toString("hex")), + ]); + return { values: oracleReturn }; +}; + +// the rest of your NoirJS code +const input = { input: [4, 16] }; +const { witness } = await noir.execute(numbers, foreignCallHandler); +``` + +:::tip + +If you're in a NoirJS environment running your RPC server together with a frontend app, you'll probably hit a familiar problem in full-stack development: requests being blocked by [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) policy. For development only, you can simply install and use the [`cors` npm package](https://www.npmjs.com/package/cors) to get around the problem: + +```bash +yarn add cors +``` + +and use it as a middleware: + +```js +import cors from "cors"; + +const app = express(); +app.use(cors()) +``` + +::: + +## Conclusion + +Hopefully by the end of this guide, you should be able to: + +- Write your own logic around Oracles and how to write a JSON RPC server to make them work with your Nargo commands. +- Provide custom foreign call handlers for NoirJS. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/how-to-recursion.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/how-to-recursion.md new file mode 100644 index 00000000000..c8c4dc9f5b4 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/how-to-recursion.md @@ -0,0 +1,180 @@ +--- +title: How to use recursion on NoirJS +description: Learn how to implement recursion with NoirJS, a powerful tool for creating smart contracts on the EVM blockchain. This guide assumes familiarity with NoirJS, solidity verifiers, and the Barretenberg proving backend. Discover how to generate both final and intermediate proofs using `noir_js` and `backend_barretenberg`. +keywords: + [ + "NoirJS", + "EVM blockchain", + "smart contracts", + "recursion", + "solidity verifiers", + "Barretenberg backend", + "noir_js", + "backend_barretenberg", + "intermediate proofs", + "final proofs", + "nargo compile", + "json import", + "recursive circuit", + "recursive app" + ] +sidebar_position: 1 +--- + +This guide shows you how to use recursive proofs in your NoirJS app. For the sake of clarity, it is assumed that: + +- You already have a NoirJS app. If you don't, please visit the [NoirJS tutorial](../tutorials/noirjs_app.md) and the [reference](../reference/NoirJS/noir_js/index.md). +- You are familiar with what are recursive proofs and you have read the [recursion explainer](../explainers/explainer-recursion.md) +- You already built a recursive circuit following [the reference](../noir/standard_library/recursion.mdx), and understand how it works. + +It is also assumed that you're not using `noir_wasm` for compilation, and instead you've used [`nargo compile`](../reference/nargo_commands.md) to generate the `json` you're now importing into your project. However, the guide should work just the same if you're using `noir_wasm`. + +:::info + +As you've read in the [explainer](../explainers/explainer-recursion.md), a recursive proof is an intermediate proof. This means that it doesn't necessarily generate the final step that makes it verifiable in a smart contract. However, it is easy to verify within another circuit. + +While "standard" usage of NoirJS packages abstracts final proofs, it currently lacks the necessary interface to abstract away intermediate proofs. This means that these proofs need to be created by using the backend directly. + +In short: + +- `noir_js` generates *only* final proofs +- `backend_barretenberg` generates both types of proofs + +::: + +In a standard recursive app, you're also dealing with at least two circuits. For the purpose of this guide, we will assume the following: + +- `main`: a circuit of type `assert(x != y)`, where `main` is marked with a `#[recursive]` attribute. This attribute states that the backend should generate proofs that are friendly for verification within another circuit. +- `recursive`: a circuit that verifies `main` + +For a full example of how recursive proofs work, please refer to the [noir-examples](https://github.com/noir-lang/noir-examples) repository. We will *not* be using it as a reference for this guide. + +## Step 1: Setup + +In a common NoirJS app, you need to instantiate a backend with something like `const backend = new Backend(circuit)`. Then you feed it to the `noir_js` interface. + +For recursion, this doesn't happen, and the only need for `noir_js` is only to `execute` a circuit and get its witness and return value. Everything else is not interfaced, so it needs to happen on the `backend` object. + +It is also recommended that you instantiate the backend with as many threads as possible, to allow for maximum concurrency: + +```js +const backend = new Backend(circuit, { threads: 8 }) +``` + +:::tip +You can use the [`os.cpus()`](https://nodejs.org/api/os.html#oscpus) object in `nodejs` or [`navigator.hardwareConcurrency`](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/hardwareConcurrency) on the browser to make the most out of those glorious cpu cores +::: + +## Step 2: Generating the witness and the proof for `main` + +After instantiating the backend, you should also instantiate `noir_js`. We will use it to execute the circuit and get the witness. + +```js +const noir = new Noir(circuit) +const { witness } = noir.execute(input) +``` + +With this witness, you are now able to generate the intermediate proof for the main circuit: + +```js +const { proof, publicInputs } = await backend.generateProof(witness) +``` + +:::warning + +Always keep in mind what is actually happening on your development process, otherwise you'll quickly become confused about what circuit we are actually running and why! + +In this case, you can imagine that Alice (running the `main` circuit) is proving something to Bob (running the `recursive` circuit), and Bob is verifying her proof within his proof. + +With this in mind, it becomes clear that our intermediate proof is the one *meant to be verified within another circuit*, so it must be Alice's. Actually, the only final proof in this theoretical scenario would be the last one, sent on-chain. + +::: + +## Step 3 - Verification and proof artifacts + +Optionally, you are able to verify the intermediate proof: + +```js +const verified = await backend.verifyProof({ proof, publicInputs }) +``` + +This can be useful to make sure our intermediate proof was correctly generated. But the real goal is to do it within another circuit. For that, we need to generate recursive proof artifacts that will be passed to the circuit that is verifying the proof we just generated. Instead of passing the proof and verification key as a byte array, we pass them as fields which makes it cheaper to verify in a circuit: + +```js +const { proofAsFields, vkAsFields, vkHash } = await backend.generateRecursiveProofArtifacts( { publicInputs, proof }, publicInputsCount) +``` + +This call takes the public inputs and the proof, but also the public inputs count. While this is easily retrievable by simply counting the `publicInputs` length, the backend interface doesn't currently abstract it away. + +:::info + +The `proofAsFields` has a constant size `[Field; 93]` and verification keys in Barretenberg are always `[Field; 114]`. + +::: + +:::warning + +One common mistake is to forget *who* makes this call. + +In a situation where Alice is generating the `main` proof, if she generates the proof artifacts and sends them to Bob, which gladly takes them as true, this would mean Alice could prove anything! + +Instead, Bob needs to make sure *he* extracts the proof artifacts, using his own instance of the `main` circuit backend. This way, Alice has to provide a valid proof for the correct `main` circuit. + +::: + +## Step 4 - Recursive proof generation + +With the artifacts, generating a recursive proof is no different from a normal proof. You simply use the `backend` (with the recursive circuit) to generate it: + +```js +const recursiveInputs = { + verification_key: vkAsFields, // array of length 114 + proof: proofAsFields, // array of length 93 + size of public inputs + publicInputs: [mainInput.y], // using the example above, where `y` is the only public input + key_hash: vkHash, +} + +const { witness, returnValue } = noir.execute(recursiveInputs) // we're executing the recursive circuit now! +const { proof, publicInputs } = backend.generateProof(witness) +const verified = backend.verifyProof({ proof, publicInputs }) +``` + +You can obviously chain this proof into another proof. In fact, if you're using recursive proofs, you're probably interested of using them this way! + +:::tip + +Managing circuits and "who does what" can be confusing. To make sure your naming is consistent, you can keep them in an object. For example: + +```js +const circuits = { + main: mainJSON, + recursive: recursiveJSON +} +const backends = { + main: new BarretenbergBackend(circuits.main), + recursive: new BarretenbergBackend(circuits.recursive) +} +const noir_programs = { + main: new Noir(circuits.main), + recursive: new Noir(circuits.recursive) +} +``` + +This allows you to neatly call exactly the method you want without conflicting names: + +```js +// Alice runs this 👇 +const { witness: mainWitness } = await noir_programs.main.execute(input) +const proof = await backends.main.generateProof(mainWitness) + +// Bob runs this 👇 +const verified = await backends.main.verifyProof(proof) +const { proofAsFields, vkAsFields, vkHash } = await backends.main.generateRecursiveProofArtifacts( + proof, + numPublicInputs, +); +const { witness: recursiveWitness } = await noir_programs.recursive.execute(recursiveInputs) +const recursiveProof = await backends.recursive.generateProof(recursiveWitness); +``` + +::: diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/how-to-solidity-verifier.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/how-to-solidity-verifier.md new file mode 100644 index 00000000000..a8169595b3d --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/how-to-solidity-verifier.md @@ -0,0 +1,259 @@ +--- +title: Generate a Solidity Verifier +description: + Learn how to run the verifier as a smart contract on the blockchain. Compile a Solidity verifier + contract for your Noir program and deploy it on any EVM blockchain acting as a verifier smart + contract. Read more to find out +keywords: + [ + solidity verifier, + smart contract, + blockchain, + compiler, + plonk_vk.sol, + EVM blockchain, + verifying Noir programs, + proving backend, + Barretenberg, + ] +sidebar_position: 0 +pagination_next: tutorials/noirjs_app +--- + +Noir has the ability to generate a verifier contract in Solidity, which can be deployed in many EVM-compatible blockchains such as Ethereum. + +This allows for a powerful feature set, as one can make use of the conciseness and the privacy provided by Noir in an immutable ledger. Applications can range from simple P2P guessing games, to complex private DeFi interactions. + +This guide shows you how to generate a Solidity Verifier and deploy it on the [Remix IDE](https://remix.ethereum.org/). It is assumed that: + +- You are comfortable with the Solidity programming language and understand how contracts are deployed on the Ethereum network +- You have Noir installed and you have a Noir program. If you don't, [get started](../getting_started/installation/index.md) with Nargo and the example Hello Noir circuit +- You are comfortable navigating RemixIDE. If you aren't or you need a refresher, you can find some video tutorials [here](https://www.youtube.com/channel/UCjTUPyFEr2xDGN6Cg8nKDaA) that could help you. + +## Rundown + +Generating a Solidity Verifier contract is actually a one-command process. However, compiling it and deploying it can have some caveats. Here's the rundown of this guide: + +1. How to generate a solidity smart contract +2. How to compile the smart contract in the RemixIDE +3. How to deploy it to a testnet + +## Step 1 - Generate a contract + +This is by far the most straightforward step. Just run: + +```sh +nargo compile +``` + +This will compile your source code into a Noir build artifact to be stored in the `./target` directory, you can then generate the smart contract using the commands: + +```sh +# Here we pass the path to the newly generated Noir artifact. +bb write_vk -b ./target/.json +bb contract +``` + +replacing `` with the name of your Noir project. A new `contract` folder would then be generated in your project directory, containing the Solidity +file `contract.sol`. It can be deployed to any EVM blockchain acting as a verifier smart contract. + +You can find more information about `bb` and the default Noir proving backend on [this page](../getting_started/hello_noir/index.md#proving-backend). + +:::info + +It is possible to generate verifier contracts of Noir programs for other smart contract platforms as long as the proving backend supplies an implementation. + +Barretenberg, the default proving backend for Nargo, supports generation of verifier contracts, for the time being these are only in Solidity. +::: + +## Step 2 - Compiling + +We will mostly skip the details of RemixIDE, as the UI can change from version to version. For now, we can just open +Remix and create a blank workspace. + +![Create Workspace](@site/static/img/how-tos/solidity_verifier_1.png) + +We will create a new file to contain the contract Nargo generated, and copy-paste its content. + +:::warning + +You'll likely see a warning advising you to not trust pasted code. While it is an important warning, it is irrelevant in the context of this guide and can be ignored. We will not be deploying anywhere near a mainnet. + +::: + +To compile our the verifier, we can navigate to the compilation tab: + +![Compilation Tab](@site/static/img/how-tos/solidity_verifier_2.png) + +Remix should automatically match a suitable compiler version. However, hitting the "Compile" button will most likely generate a "Stack too deep" error: + +![Stack too deep](@site/static/img/how-tos/solidity_verifier_3.png) + +This is due to the verify function needing to put many variables on the stack, but enabling the optimizer resolves the issue. To do this, let's open the "Advanced Configurations" tab and enable optimization. The default 200 runs will suffice. + +:::info + +This time we will see a warning about an unused function parameter. This is expected, as the `verify` function doesn't use the `_proof` parameter inside a solidity block, it is loaded from calldata and used in assembly. + +::: + +![Compilation success](@site/static/img/how-tos/solidity_verifier_4.png) + +## Step 3 - Deploying + +At this point we should have a compiled contract ready to deploy. If we navigate to the deploy section in Remix, we will see many different environments we can deploy to. The steps to deploy on each environment would be out-of-scope for this guide, so we will just use the default Remix VM. + +Looking closely, we will notice that our "Solidity Verifier" is actually three contracts working together: + +- An `UltraVerificationKey` library which simply stores the verification key for our circuit. +- An abstract contract `BaseUltraVerifier` containing most of the verifying logic. +- A main `UltraVerifier` contract that inherits from the Base and uses the Key contract. + +Remix will take care of the dependencies for us so we can simply deploy the UltraVerifier contract by selecting it and hitting "deploy": + +![Deploying UltraVerifier](@site/static/img/how-tos/solidity_verifier_5.png) + +A contract will show up in the "Deployed Contracts" section, where we can retrieve the Verification Key Hash. This is particularly useful for double-checking that the deployer contract is the correct one. + +:::note + +Why "UltraVerifier"? + +To be precise, the Noir compiler (`nargo`) doesn't generate the verifier contract directly. It compiles the Noir code into an intermediate language (ACIR), which is then executed by the backend. So it is the backend that returns the verifier smart contract, not Noir. + +In this case, the Barretenberg Backend uses the UltraPlonk proving system, hence the "UltraVerifier" name. + +::: + +## Step 4 - Verifying + +To verify a proof using the Solidity verifier contract, we call the `verify` function in this extended contract: + +```solidity +function verify(bytes calldata _proof, bytes32[] calldata _publicInputs) external view returns (bool) +``` + +When using the default example in the [Hello Noir](../getting_started/hello_noir/index.md) guide, the easiest way to confirm that the verifier contract is doing its job is by calling the `verify` function via remix with the required parameters. Note that the public inputs must be passed in separately to the rest of the proof so we must split the proof as returned from `bb`. + +First generate a proof with `bb` at the location `./proof` using the steps in [get started](../getting_started/hello_noir/index.md), this proof is in a binary format but we want to convert it into a hex string to pass into Remix, this can be done with the + +```bash +# This value must be changed to match the number of public inputs (including return values!) in your program. +NUM_PUBLIC_INPUTS=1 +PUBLIC_INPUT_BYTES=32*NUM_PUBLIC_INPUTS +HEX_PUBLIC_INPUTS=$(head -c $PUBLIC_INPUT_BYTES ./proof | od -An -v -t x1 | tr -d $' \n') +HEX_PROOF=$(tail -c +$(($PUBLIC_INPUT_BYTES + 1)) ./proof | od -An -v -t x1 | tr -d $' \n') + +echo "Public inputs:" +echo $HEX_PUBLIC_INPUTS + +echo "Proof:" +echo "0x$HEX_PROOF" +``` + +Remix expects that the public inputs will be split into an array of `bytes32` values so `HEX_PUBLIC_INPUTS` needs to be split up into 32 byte chunks which are prefixed with `0x` accordingly. + +A programmatic example of how the `verify` function is called can be seen in the example zk voting application [here](https://github.com/noir-lang/noir-examples/blob/33e598c257e2402ea3a6b68dd4c5ad492bce1b0a/foundry-voting/src/zkVote.sol#L35): + +```solidity +function castVote(bytes calldata proof, uint proposalId, uint vote, bytes32 nullifierHash) public returns (bool) { + // ... + bytes32[] memory publicInputs = new bytes32[](4); + publicInputs[0] = merkleRoot; + publicInputs[1] = bytes32(proposalId); + publicInputs[2] = bytes32(vote); + publicInputs[3] = nullifierHash; + require(verifier.verify(proof, publicInputs), "Invalid proof"); +``` + +:::info[Return Values] + +A circuit doesn't have the concept of a return value. Return values are just syntactic sugar in Noir. + +Under the hood, the return value is passed as an input to the circuit and is checked at the end of the circuit program. + +For example, if you have Noir program like this: + +```rust +fn main( + // Public inputs + pubkey_x: pub Field, + pubkey_y: pub Field, + // Private inputs + priv_key: Field, +) -> pub Field +``` + +the `verify` function will expect the public inputs array (second function parameter) to be of length 3, the two inputs and the return value. + +Passing only two inputs will result in an error such as `PUBLIC_INPUT_COUNT_INVALID(3, 2)`. + +In this case, the inputs parameter to `verify` would be an array ordered as `[pubkey_x, pubkey_y, return`. + +::: + +:::tip[Structs] + +You can pass structs to the verifier contract. They will be flattened so that the array of inputs is 1-dimensional array. + +For example, consider the following program: + +```rust +struct Type1 { + val1: Field, + val2: Field, +} + +struct Nested { + t1: Type1, + is_true: bool, +} + +fn main(x: pub Field, nested: pub Nested, y: pub Field) { + //... +} +``` + +The order of these inputs would be flattened to: `[x, nested.t1.val1, nested.t1.val2, nested.is_true, y]` + +::: + +The other function you can call is our entrypoint `verify` function, as defined above. + +:::tip + +It's worth noticing that the `verify` function is actually a `view` function. A `view` function does not alter the blockchain state, so it doesn't need to be distributed (i.e. it will run only on the executing node), and therefore doesn't cost any gas. + +This can be particularly useful in some situations. If Alice generated a proof and wants Bob to verify its correctness, Bob doesn't need to run Nargo, NoirJS, or any Noir specific infrastructure. He can simply make a call to the blockchain with the proof and verify it is correct without paying any gas. + +It would be incorrect to say that a Noir proof verification costs any gas at all. However, most of the time the result of `verify` is used to modify state (for example, to update a balance, a game state, etc). In that case the whole network needs to execute it, which does incur gas costs (calldata and execution, but not storage). + +::: + +## A Note on EVM chains + +Noir proof verification requires the ecMul, ecAdd and ecPairing precompiles. Not all EVM chains support EC Pairings, notably some of the ZK-EVMs. This means that you won't be able to use the verifier contract in all of them. You can find an incomplete list of which EVM chains support these precompiles [here](https://www.evmdiff.com/features?feature=precompiles). + +For example, chains like `zkSync ERA` and `Polygon zkEVM` do not currently support these precompiles, so proof verification via Solidity verifier contracts won't work. Here's a quick list of EVM chains that have been tested and are known to work: + +- Optimism +- Arbitrum +- Polygon PoS +- Scroll +- Celo +- BSC +- Blast L2 +- Avalanche C-Chain +- Mode +- Linea +- Moonbeam + +If you test any other chains, please open a PR on this page to update the list. See [this doc](https://github.com/noir-lang/noir-starter/tree/main/with-foundry#testing-on-chain) for more info about testing verifier contracts on different EVM chains. + +## What's next + +Now that you know how to call a Noir Solidity Verifier on a smart contract using Remix, you should be comfortable with using it with some programmatic frameworks, such as [hardhat](https://github.com/noir-lang/noir-starter/tree/main/vite-hardhat) and [foundry](https://github.com/noir-lang/noir-starter/tree/main/with-foundry). + +You can find other tools, examples, boilerplates and libraries in the [awesome-noir](https://github.com/noir-lang/awesome-noir) repository. + +You should also be ready to write and deploy your first NoirJS app and start generating proofs on websites, phones, and NodeJS environments! Head on to the [NoirJS tutorial](../tutorials/noirjs_app.md) to learn how to do that. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/merkle-proof.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/merkle-proof.mdx new file mode 100644 index 00000000000..0a128adb2de --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/merkle-proof.mdx @@ -0,0 +1,48 @@ +--- +title: Prove Merkle Tree Membership +description: + Learn how to use merkle membership proof in Noir to prove that a given leaf is a member of a + merkle tree with a specified root, at a given index. +keywords: + [merkle proof, merkle membership proof, Noir, rust, hash function, Pedersen, sha256, merkle tree] +sidebar_position: 4 +--- + +Let's walk through an example of a merkle membership proof in Noir that proves that a given leaf is +in a merkle tree. + +```rust + +fn main(message : [Field; 62], index : Field, hashpath : [Field; 40], root : Field) { + let leaf = std::hash::hash_to_field(message.as_slice()); + let merkle_root = std::merkle::compute_merkle_root(leaf, index, hashpath); + assert(merkle_root == root); +} + +``` + +The message is hashed using `hash_to_field`. The specific hash function that is being used is chosen +by the backend. The only requirement is that this hash function can heuristically be used as a +random oracle. If only collision resistance is needed, then one can call `std::hash::pedersen_hash` +instead. + +```rust +let leaf = std::hash::hash_to_field(message.as_slice()); +``` + +The leaf is then passed to a compute_merkle_root function with the root, index and hashpath. The returned root can then be asserted to be the same as the provided root. + +```rust +let merkle_root = std::merkle::compute_merkle_root(leaf, index, hashpath); +assert (merkle_root == root); +``` + +> **Note:** It is possible to re-implement the merkle tree implementation without standard library. +> However, for most usecases, it is enough. In general, the standard library will always opt to be +> as conservative as possible, while striking a balance with efficiency. + +An example, the merkle membership proof, only requires a hash function that has collision +resistance, hence a hash function like Pedersen is allowed, which in most cases is more efficient +than the even more conservative sha256. + +[View an example on the starter repo](https://github.com/noir-lang/noir-examples/blob/3ea09545cabfa464124ec2f3ea8e60c608abe6df/stealthdrop/circuits/src/main.nr#L20) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/using-devcontainers.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/using-devcontainers.mdx new file mode 100644 index 00000000000..727ec6ca667 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/how_to/using-devcontainers.mdx @@ -0,0 +1,110 @@ +--- +title: Developer Containers and Codespaces +description: "Learn how to set up a devcontainer in your GitHub repository for a seamless coding experience with Codespaces. Follow our easy 8-step guide to create your own Noir environment without installing Nargo locally." +keywords: ["Devcontainer", "Codespaces", "GitHub", "Noir Environment", "Docker Image", "Development Environment", "Remote Coding", "GitHub Codespaces", "Noir Programming", "Nargo", "VSCode Extensions", "Noirup"] +sidebar_position: 1 +--- + +Adding a developer container configuration file to your Noir project is one of the easiest way to unlock coding in browser. + +## What's a devcontainer after all? + +A [Developer Container](https://containers.dev/) (devcontainer for short) is a Docker image that comes preloaded with tools, extensions, and other tools you need to quickly get started or continue a project, without having to install Nargo locally. Think of it as a development environment in a box. + +There are many advantages to this: + +- It's platform and architecture agnostic +- You don't need to have an IDE installed, or Nargo, or use a terminal at all +- It's safer for using on a public machine or public network + +One of the best ways of using devcontainers is... not using your machine at all, for maximum control, performance, and ease of use. +Enter Codespaces. + +## Codespaces + +If a devcontainer is just a Docker image, then what stops you from provisioning a `p3dn.24xlarge` AWS EC2 instance with 92 vCPUs and 768 GiB RAM and using it to prove your 10-gate SNARK proof? + +Nothing! Except perhaps the 30-40$ per hour it will cost you. + +The problem is that provisioning takes time, and I bet you don't want to see the AWS console every time you want to code something real quick. + +Fortunately, there's an easy and free way to get a decent remote machine ready and loaded in less than 2 minutes: Codespaces. [Codespaces is a Github feature](https://github.com/features/codespaces) that allows you to code in a remote machine by using devcontainers, and it's pretty cool: + +- You can start coding Noir in less than a minute +- It uses the resources of a remote machine, so you can code on your grandma's phone if needed be +- It makes it easy to share work with your frens +- It's fully reusable, you can stop and restart whenever you need to + +:::info + +Don't take out your wallet just yet. Free GitHub accounts get about [15-60 hours of coding](https://github.com/features/codespaces) for free per month, depending on the size of your provisioned machine. + +::: + +## Tell me it's _actually_ easy + +It is! + +Github comes with a default codespace and you can use it to code your own devcontainer. That's exactly what we will be doing in this guide. + + + +8 simple steps: + +#### 1. Create a new repository on GitHub. + +#### 2. Click "Start coding with Codespaces". This will use the default image. + +#### 3. Create a folder called `.devcontainer` in the root of your repository. + +#### 4. Create a Dockerfile in that folder, and paste the following code: + +```docker +FROM --platform=linux/amd64 node:lts-bookworm-slim +SHELL ["/bin/bash", "-c"] +RUN apt update && apt install -y curl bash git tar gzip libc++-dev +RUN curl -L https://raw.githubusercontent.com/noir-lang/noirup/main/install | bash +ENV PATH="/root/.nargo/bin:$PATH" +RUN noirup +ENTRYPOINT ["nargo"] +``` +#### 5. Create a file called `devcontainer.json` in the same folder, and paste the following code: + +```json +{ + "name": "Noir on Codespaces", + "build": { + "context": ".", + "dockerfile": "Dockerfile" + }, + "customizations": { + "vscode": { + "extensions": ["noir-lang.vscode-noir"] + } + } +} +``` +#### 6. Commit and push your changes + +This will pull the new image and build it, so it could take a minute or so + +#### 8. Done! +Just wait for the build to finish, and there's your easy Noir environment. + + +Refer to [noir-starter](https://github.com/noir-lang/noir-starter/) as an example of how devcontainers can be used together with codespaces. + + + +## How do I use it? + +Using the codespace is obviously much easier than setting it up. +Just navigate to your repository and click "Code" -> "Open with Codespaces". It should take a few seconds to load, and you're ready to go. + +:::info + +If you really like the experience, you can add a badge to your readme, links to existing codespaces, and more. +Check out the [official docs](https://docs.github.com/en/codespaces/setting-up-your-project-for-codespaces/setting-up-your-repository/facilitating-quick-creation-and-resumption-of-codespaces) for more info. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/index.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/index.mdx new file mode 100644 index 00000000000..a6bd306f91d --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/index.mdx @@ -0,0 +1,67 @@ +--- +title: Noir Lang +hide_title: true +description: + Learn about the public alpha release of Noir, a domain specific language heavily influenced by Rust that compiles to + an intermediate language which can be compiled to an arithmetic circuit or a rank-1 constraint system. +keywords: + [Noir, + Domain Specific Language, + Rust, + Intermediate Language, + Arithmetic Circuit, + Rank-1 Constraint System, + Ethereum Developers, + Protocol Developers, + Blockchain Developers, + Proving System, + Smart Contract Language] +sidebar_position: 0 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Noir Logo + +Noir is an open-source Domain-Specific Language for safe and seamless construction of privacy-preserving Zero-Knowledge programs, requiring no previous knowledge on the underlying mathematics or cryptography. + +ZK programs are programs that can generate short proofs of statements without revealing all inputs to the statements. You can read more about Zero-Knowledge Proofs [here](https://dev.to/spalladino/a-beginners-intro-to-coding-zero-knowledge-proofs-c56). + +## What's new about Noir? + +Noir works differently from most ZK languages by taking a two-pronged path. First, it compiles the program to an adaptable intermediate language known as ACIR. From there, depending on a given project's needs, ACIR can be further compiled into an arithmetic circuit for integration with the proving backend. + +:::info + +Noir is backend agnostic, which means it makes no assumptions on which proving backend powers the ZK proof. Being the language that powers [Aztec Contracts](https://docs.aztec.network/developers/contracts/main), it defaults to Aztec's Barretenberg proving backend. + +However, the ACIR output can be transformed to be compatible with other PLONK-based backends, or into a [rank-1 constraint system](https://www.rareskills.io/post/rank-1-constraint-system) suitable for backends such as Arkwork's Marlin. + +::: + +## Who is Noir for? + +Noir can be used both in complex cloud-based backends and in user's smartphones, requiring no knowledge on the underlying math or cryptography. From authorization systems that keep a password in the user's device, to complex on-chain verification of recursive proofs, Noir is designed to abstract away complexity without any significant overhead. Here are some examples of situations where Noir can be used: + + + + Noir Logo + + Aztec Contracts leverage Noir to allow for the storage and execution of private information. Writing an Aztec Contract is as easy as writing Noir, and Aztec developers can easily interact with the network storage and execution through the [Aztec.nr](https://docs.aztec.network/developers/contracts/main) library. + + + Soliditry Verifier Example + Noir can auto-generate Solidity verifier contracts that verify Noir proofs. This allows for non-interactive verification of proofs containing private information in an immutable system. This feature powers a multitude of use-case scenarios, from P2P chess tournaments, to [Aztec Layer-2 Blockchain](https://docs.aztec.network/) + + + Aztec Labs developed NoirJS, an easy interface to generate and verify Noir proofs in a Javascript environment. This allows for Noir to be used in webpages, mobile apps, games, and any other environment supporting JS execution in a standalone manner. + + + + +## Libraries + +Noir is meant to be easy to extend by simply importing Noir libraries just like in Rust. +The [awesome-noir repo](https://github.com/noir-lang/awesome-noir#libraries) is a collection of libraries developed by the Noir community. +Writing a new library is easy and makes code be composable and easy to reuse. See the section on [dependencies](noir/modules_packages_crates/dependencies.md) for more information. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/migration_notes.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/migration_notes.md new file mode 100644 index 00000000000..6bd740024e5 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/migration_notes.md @@ -0,0 +1,105 @@ +--- +title: Migration notes +description: Read about migration notes from previous versions, which could solve problems while updating +keywords: [Noir, notes, migration, updating, upgrading] +--- + +Noir is in full-speed development. Things break fast, wild, and often. This page attempts to leave some notes on errors you might encounter when upgrading and how to resolve them until proper patches are built. + +### `backend encountered an error: libc++.so.1` + +Depending on your OS, you may encounter the following error when running `nargo prove` for the first time: + +```text +The backend encountered an error: "/home/codespace/.nargo/backends/acvm-backend-barretenberg/backend_binary: error while loading shared libraries: libc++.so.1: cannot open shared object file: No such file or directory\n" +``` + +Install the `libc++-dev` library with: + +```bash +sudo apt install libc++-dev +``` + +## ≥0.19 + +### Enforcing `compiler_version` + +From this version on, the compiler will check for the `compiler_version` field in `Nargo.toml`, and will error if it doesn't match the current Nargo version in use. + +To update, please make sure this field in `Nargo.toml` matches the output of `nargo --version`. + +## ≥0.14 + +The index of the [for loops](noir/concepts/control_flow.md#loops) is now of type `u64` instead of `Field`. An example refactor would be: + +```rust +for i in 0..10 { + let i = i as Field; +} +``` + +## ≥v0.11.0 and Nargo backend + +From this version onwards, Nargo starts managing backends through the `nargo backend` command. Upgrading to the versions per usual steps might lead to: + +### `backend encountered an error` + +This is likely due to the existing locally installed version of proving backend (e.g. barretenberg) is incompatible with the version of Nargo in use. + +To fix the issue: + +1. Uninstall the existing backend + +```bash +nargo backend uninstall acvm-backend-barretenberg +``` + +You may replace _acvm-backend-barretenberg_ with the name of your backend listed in `nargo backend ls` or in ~/.nargo/backends. + +2. Reinstall a compatible version of the proving backend. + +If you are using the default barretenberg backend, simply run: + +``` +nargo prove +``` + +with your Noir program. + +This will trigger the download and installation of the latest version of barretenberg compatible with your Nargo in use. + +### `backend encountered an error: illegal instruction` + +On certain Intel-based systems, an `illegal instruction` error may arise due to incompatibility of barretenberg with certain CPU instructions. + +To fix the issue: + +1. Uninstall the existing backend + +```bash +nargo backend uninstall acvm-backend-barretenberg +``` + +You may replace _acvm-backend-barretenberg_ with the name of your backend listed in `nargo backend ls` or in ~/.nargo/backends. + +2. Reinstall a compatible version of the proving backend. + +If you are using the default barretenberg backend, simply run: + +``` +nargo backend install acvm-backend-barretenberg https://github.com/noir-lang/barretenberg-js-binary/raw/master/run-bb.tar.gz +``` + +This downloads and installs a specific bb.js based version of barretenberg binary from GitHub. + +The gzipped file is running [this bash script](https://github.com/noir-lang/barretenberg-js-binary/blob/master/run-bb-js.sh), where we need to gzip it as the Nargo currently expect the backend to be zipped up. + +Then run: + +``` +DESIRED_BINARY_VERSION=0.8.1 nargo info +``` + +This overrides the bb native binary with a bb.js node application instead, which should be compatible with most if not all hardware. This does come with the drawback of being generally slower than native binary. + +0.8.1 indicates bb.js version 0.8.1, so if you change that it will update to a different version or the default version in the script if none was supplied. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/_category_.json b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/_category_.json new file mode 100644 index 00000000000..7da08f8a8c5 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Concepts", + "position": 0, + "collapsible": true, + "collapsed": true +} \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/assert.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/assert.md new file mode 100644 index 00000000000..2132de42072 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/assert.md @@ -0,0 +1,78 @@ +--- +title: Assert Function +description: + Learn about the `assert` and `static_assert` functions in Noir, which can be used to explicitly + constrain the predicate or comparison expression that follows to be true, and what happens if + the expression is false at runtime or compile-time, respectively. +keywords: [Noir programming language, assert statement, predicate expression, comparison expression] +sidebar_position: 4 +--- + +Noir includes a special `assert` function which will explicitly constrain the predicate/comparison +expression that follows to be true. If this expression is false at runtime, the program will fail to +be proven. Example: + +```rust +fn main(x : Field, y : Field) { + assert(x == y); +} +``` + +> Assertions only work for predicate operations, such as `==`. If there's any ambiguity on the operation, the program will fail to compile. For example, it is unclear if `assert(x + y)` would check for `x + y == 0` or simply would return `true`. + +You can optionally provide a message to be logged when the assertion fails: + +```rust +assert(x == y, "x and y are not equal"); +``` + +Aside string literals, the optional message can be a format string or any other type supported as input for Noir's [print](../standard_library/logging.md) functions. This feature lets you incorporate runtime variables into your failed assertion logs: + +```rust +assert(x == y, f"Expected x == y, but got {x} == {y}"); +``` + +Using a variable as an assertion message directly: + +```rust +struct myStruct { + myField: Field +} + +let s = myStruct { myField: y }; +assert(s.myField == x, s); +``` + +There is also a special `static_assert` function that behaves like `assert`, +but that runs at compile-time. + +```rust +fn main(xs: [Field; 3]) { + let x = 2 + 2; + let y = 4; + static_assert(x == y, "expected 2 + 2 to equal 4"); + + // This passes since the length of `xs` is known at compile-time + static_assert(xs.len() == 3, "expected the input to have 3 elements"); +} +``` + +This function fails when passed a dynamic (run-time) argument: + +```rust +fn main(x : Field, y : Field) { + // this fails because `x` is not known at compile-time + static_assert(x == 2, "expected x to be known at compile-time and equal to 2"); + + let mut example_slice = &[]; + if y == 4 { + example_slice = example_slice.push_back(0); + } + + // This fails because the length of `example_slice` is not known at + // compile-time + let error_message = "expected an empty slice, known at compile-time"; + static_assert(example_slice.len() == 0, error_message); +} +``` + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/comments.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/comments.md new file mode 100644 index 00000000000..b51a85f5c94 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/comments.md @@ -0,0 +1,33 @@ +--- +title: Comments +description: + Learn how to write comments in Noir programming language. A comment is a line of code that is + ignored by the compiler, but it can be read by programmers. Single-line and multi-line comments + are supported in Noir. +keywords: [Noir programming language, comments, single-line comments, multi-line comments] +sidebar_position: 10 +--- + +A comment is a line in your codebase which the compiler ignores, however it can be read by +programmers. + +Here is a single line comment: + +```rust +// This is a comment and is ignored +``` + +`//` is used to tell the compiler to ignore the rest of the line. + +Noir also supports multi-line block comments. Start a block comment with `/*` and end the block with `*/`. + +Noir does not natively support doc comments. You may be able to use [Rust doc comments](https://doc.rust-lang.org/reference/comments.html) in your code to leverage some Rust documentation build tools with Noir code. + +```rust +/* + This is a block comment describing a complex function. +*/ +fn main(x : Field, y : pub Field) { + assert(x != y); +} +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/comptime.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/comptime.md new file mode 100644 index 00000000000..50d7e686083 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/comptime.md @@ -0,0 +1,440 @@ +--- +title: Compile-time Code & Metaprogramming +description: Learn how to use metaprogramming in Noir to create macros or derive your own traits +keywords: [Noir, comptime, compile-time, metaprogramming, macros, quote, unquote] +sidebar_position: 15 +--- + +# Overview + +Metaprogramming in Noir is comprised of three parts: +1. `comptime` code +2. Quoting and unquoting +3. The metaprogramming API in `std::meta` + +Each of these are explained in more detail in the next sections but the wide picture is that +`comptime` allows us to write code which runs at compile-time. In this `comptime` code we +can quote and unquote snippets of the program, manipulate them, and insert them in other +parts of the program. Comptime functions which do this are said to be macros. Additionally, +there's a compile-time API of built-in types and functions provided by the compiler which allows +for greater analysis and modification of programs. + +--- + +# Comptime + +`comptime` is a new keyword in Noir which marks an item as executing or existing at compile-time. It can be used in several ways: + +- `comptime fn` to define functions which execute exclusively during compile-time. +- `comptime global` to define a global variable which is evaluated at compile-time. + - Unlike runtime globals, `comptime global`s can be mutable. +- `comptime { ... }` to execute a block of statements during compile-time. +- `comptime let` to define a variable whose value is evaluated at compile-time. +- `comptime for` to run a for loop at compile-time. Syntax sugar for `comptime { for .. }`. + +## Scoping + +Note that while in a `comptime` context, any runtime variables _local to the current function_ are never visible. + +## Evaluating + +Evaluation rules of `comptime` follows the normal unconstrained evaluation rules for other Noir code. There are a few things to note though: + +- Certain built-in functions may not be available, although more may be added over time. +- Evaluation order of global items is currently unspecified. For example, given the following two functions we can't guarantee +which `println` will execute first. The ordering of the two printouts will be arbitrary, but should be stable across multiple compilations with the same `nargo` version as long as the program is also unchanged. + +```rust +fn one() { + comptime { println("one"); } +} + +fn two() { + comptime { println("two"); } +} +``` + +- Since evaluation order is unspecified, care should be taken when using mutable globals so that they do not rely on a particular ordering. +For example, using globals to generate unique ids should be fine but relying on certain ids always being produced (especially after edits to the program) should be avoided. +- Although most ordering of globals is unspecified, two are: + - Dependencies of a crate will always be evaluated before the dependent crate. + - Any annotations on a function will be run before the function itself is resolved. This is to allow the annotation to modify the function if necessary. Note that if the + function itself was called at compile-time previously, it will already be resolved and cannot be modified. To prevent accidentally calling functions you wish to modify + at compile-time, it may be helpful to sort your `comptime` annotation functions into a different crate along with any dependencies they require. + +## Lowering + +When a `comptime` value is used in runtime code it must be lowered into a runtime value. This means replacing the expression with the literal that it evaluated to. For example, the code: + +```rust +struct Foo { array: [Field; 2], len: u32 } + +fn main() { + println(comptime { + let mut foo = std::mem::zeroed::(); + foo.array[0] = 4; + foo.len = 1; + foo + }); +} +``` + +will be converted to the following after `comptime` expressions are evaluated: + +```rust +struct Foo { array: [Field; 2], len: u32 } + +fn main() { + println(Foo { array: [4, 0], len: 1 }); +} +``` + +Not all types of values can be lowered. For example, `Type`s and `TypeDefinition`s (among other types) cannot be lowered at all. + +```rust +fn main() { + // There's nothing we could inline here to create a Type value at runtime + // let _ = get_type!(); +} + +comptime fn get_type() -> Type { ... } +``` + +--- + +# (Quasi) Quote + +Macros in Noir are `comptime` functions which return code as a value which is inserted into the call site when it is lowered there. +A code value in this case is of type `Quoted` and can be created by a `quote { ... }` expression. +More specifically, the code value `quote` creates is a token stream - a representation of source code as a series of words, numbers, string literals, or operators. +For example, the expression `quote { Hi "there reader"! }` would quote three tokens: the word "hi", the string "there reader", and an exclamation mark. +You'll note that snippets that would otherwise be invalid syntax can still be quoted. + +When a `Quoted` value is used in runtime code, it is lowered into a `quote { ... }` expression. Since this expression is only valid +in compile-time code however, we'd get an error if we tried this. Instead, we can use macro insertion to insert each token into the +program at that point, and parse it as an expression. To do this, we have to add a `!` after the function name returning the `Quoted` value. +If the value was created locally and there is no function returning it, `std::meta::unquote!(_)` can be used instead. +Calling such a function at compile-time without `!` will just return the `Quoted` value to be further manipulated. For example: + +```rust title="quote-example" showLineNumbers +comptime fn quote_one() -> Quoted { + quote { 1 } + } + + #[test] + fn returning_versus_macro_insertion() { + comptime + { + // let _a: Quoted = quote { 1 }; + let _a: Quoted = quote_one(); + + // let _b: Field = 1; + let _b: Field = quote_one!(); + + // Since integers default to fields, if we + // want a different type we have to explicitly cast + // let _c: i32 = 1 as i32; + let _c: i32 = quote_one!() as i32; + } + } +``` +> Source code: noir_stdlib/src/meta/mod.nr#L121-L142 + + +For those familiar with quoting from other languages (primarily lisps), Noir's `quote` is actually a _quasiquote_. +This means we can escape the quoting by using the unquote operator to splice values in the middle of quoted code. + +# Unquote + +The unquote operator `$` is usable within a `quote` expression. +It takes a variable as an argument, evaluates the variable, and splices the resulting value into the quoted token stream at that point. For example, + +```rust +comptime { + let x = 1 + 2; + let y = quote { $x + 4 }; +} +``` + +The value of `y` above will be the token stream containing `3`, `+`, and `4`. We can also use this to combine `Quoted` values into larger token streams: + +```rust +comptime { + let x = quote { 1 + 2 }; + let y = quote { $x + 4 }; +} +``` + +The value of `y` above is now the token stream containing five tokens: `1 + 2 + 4`. + +Note that to unquote something, a variable name _must_ follow the `$` operator in a token stream. +If it is an expression (even a parenthesized one), it will do nothing. Most likely a parse error will be given when the macro is later unquoted. + +Unquoting can also be avoided by escaping the `$` with a backslash: + +``` +comptime { + let x = quote { 1 + 2 }; + + // y contains the four tokens: `$x + 4` + let y = quote { \$x + 4 }; +} +``` + +--- + +# Annotations + +Annotations provide a way to run a `comptime` function on an item in the program. +When you use an annotation, the function with the same name will be called with that item as an argument: + +```rust +#[my_struct_annotation] +struct Foo {} + +comptime fn my_struct_annotation(s: StructDefinition) { + println("Called my_struct_annotation!"); +} + +#[my_function_annotation] +fn foo() {} + +comptime fn my_function_annotation(f: FunctionDefinition) { + println("Called my_function_annotation!"); +} +``` + +Anything returned from one of these functions will be inserted at top-level along with the original item. +Note that expressions are not valid at top-level so you'll get an error trying to return `3` or similar just as if you tried to write a program containing `3; struct Foo {}`. +You can insert other top-level items such as trait impls, structs, or functions this way though. +For example, this is the mechanism used to insert additional trait implementations into the program when deriving a trait impl from a struct: + +```rust title="derive-field-count-example" showLineNumbers +trait FieldCount { + fn field_count() -> u32; + } + + #[derive_field_count] + struct Bar { x: Field, y: [Field; 2] } + + comptime fn derive_field_count(s: StructDefinition) -> Quoted { + let typ = s.as_type(); + let field_count = s.fields().len(); + quote { + impl FieldCount for $typ { + fn field_count() -> u32 { + $field_count + } + } + } + } +``` +> Source code: noir_stdlib/src/meta/mod.nr#L144-L163 + + +## Calling annotations with additional arguments + +Arguments may optionally be given to annotations. +When this is done, these additional arguments are passed to the annotation function after the item argument. + +```rust title="annotation-arguments-example" showLineNumbers +#[assert_field_is_type(quote { i32 }.as_type())] + struct MyStruct { my_field: i32 } + + comptime fn assert_field_is_type(s: StructDefinition, typ: Type) { + // Assert the first field in `s` has type `typ` + let fields = s.fields(); + assert_eq(fields[0].1, typ); + } +``` +> Source code: noir_stdlib/src/meta/mod.nr#L165-L174 + + +We can also take any number of arguments by adding the `varargs` annotation: + +```rust title="annotation-varargs-example" showLineNumbers +#[assert_three_args(1, 2, 3)] + struct MyOtherStruct { my_other_field: u32 } + + #[varargs] + comptime fn assert_three_args(_s: StructDefinition, args: [Field]) { + assert_eq(args.len(), 3); + } +``` +> Source code: noir_stdlib/src/meta/mod.nr#L176-L184 + + +--- + +# Comptime API + +Although `comptime`, `quote`, and unquoting provide a flexible base for writing macros, +Noir's true metaprogramming ability comes from being able to interact with the compiler through a compile-time API. +This API can be accessed through built-in functions in `std::meta` as well as on methods of several `comptime` types. + +The following is an incomplete list of some `comptime` types along with some useful methods on them. + +- `Quoted`: A token stream +- `Type`: The type of a Noir type + - `fn implements(self, constraint: TraitConstraint) -> bool` + - Returns true if `self` implements the given trait constraint +- `Expr`: A syntactically valid expression. Can be used to recur on a program's parse tree to inspect how it is structured. + - Methods: + - `fn as_function_call(self) -> Option<(Expr, [Expr])>` + - If this is a function call expression, return `(function, arguments)` + - `fn as_block(self) -> Option<[Expr]>` + - If this is a block, return each statement in the block +- `FunctionDefinition`: A function definition + - Methods: + - `fn parameters(self) -> [(Quoted, Type)]` + - Returns a slice of `(name, type)` pairs for each parameter +- `StructDefinition`: A struct definition + - Methods: + - `fn as_type(self) -> Type` + - Returns this `StructDefinition` as a `Type`. Any generics are kept as-is + - `fn generics(self) -> [Quoted]` + - Return the name of each generic on this struct + - `fn fields(self) -> [(Quoted, Type)]` + - Return the name and type of each field +- `TraitConstraint`: A trait constraint such as `From` +- `TypedExpr`: A type-checked expression. +- `UnresolvedType`: A syntactic notation that refers to a Noir type that hasn't been resolved yet + +There are many more functions available by exploring the `std::meta` module and its submodules. +Using these methods is the key to writing powerful metaprogramming libraries. + +## `#[use_callers_scope]` + +Since certain functions such as `Quoted::as_type`, `Expression::as_type`, or `Quoted::as_trait_constraint` will attempt +to resolve their contents in a particular scope - it can be useful to change the scope they resolve in. By default +these functions will resolve in the current function's scope which is usually the attribute function they are called in. +If you're working on a library however, this may be a completely different module or crate to the item you're trying to +use the attribute on. If you want to be able to use `Quoted::as_type` to refer to types local to the caller's scope for +example, you can annotate your attribute function with `#[use_callers_scope]`. This will ensure your attribute, and any +closures it uses, can refer to anything in the caller's scope. `#[use_callers_scope]` also works recursively. So if both +your attribute function and a helper function it calls use it, then they can both refer to the same original caller. + +--- + +# Example: Derive + +Using all of the above, we can write a `derive` macro that behaves similarly to Rust's but is not built into the language. +From the user's perspective it will look like this: + +```rust +// Example usage +#[derive(Default, Eq, Ord)] +struct MyStruct { my_field: u32 } +``` + +To implement `derive` we'll have to create a `comptime` function that accepts +a variable amount of traits. + +```rust title="derive_example" showLineNumbers +// These are needed for the unconstrained hashmap we're using to store derive functions +use crate::collections::umap::UHashMap; +use crate::hash::BuildHasherDefault; +use crate::hash::poseidon2::Poseidon2Hasher; + +// A derive function is one that given a struct definition can +// create us a quoted trait impl from it. +pub type DeriveFunction = fn(StructDefinition) -> Quoted; + +// We'll keep a global HANDLERS map to keep track of the derive handler for each trait +comptime mut global HANDLERS: UHashMap> = UHashMap::default(); + +// Given a struct and a slice of traits to derive, create trait impls for each. +// This function is as simple as iterating over the slice, checking if we have a trait +// handler registered for the given trait, calling it, and appending the result. +#[varargs] +pub comptime fn derive(s: StructDefinition, traits: [TraitDefinition]) -> Quoted { + let mut result = quote {}; + + for trait_to_derive in traits { + let handler = unsafe { + HANDLERS.get(trait_to_derive) + }; + assert(handler.is_some(), f"No derive function registered for `{trait_to_derive}`"); + + let trait_impl = handler.unwrap()(s); + result = quote { $result $trait_impl }; + } + + result +} +``` +> Source code: noir_stdlib/src/meta/mod.nr#L31-L65 + + +Registering a derive function could be done as follows: + +```rust title="derive_via" showLineNumbers +// To register a handler for a trait, just add it to our handlers map +pub comptime fn derive_via(t: TraitDefinition, f: DeriveFunction) { + HANDLERS.insert(t, f); +} +``` +> Source code: noir_stdlib/src/meta/mod.nr#L67-L74 + + +```rust title="big-derive-usage-example" showLineNumbers +// Finally, to register a handler we call the above function as an annotation + // with our handler function. + #[derive_via(derive_do_nothing)] + trait DoNothing { + fn do_nothing(self); + } + + comptime fn derive_do_nothing(s: StructDefinition) -> Quoted { + // This is simplified since we don't handle generics or where clauses! + // In a real example we'd likely also need to introduce each of + // `s.generics()` as well as a trait constraint for each generic + // to ensure they also implement the trait. + let typ = s.as_type(); + quote { + impl DoNothing for $typ { + fn do_nothing(self) { + // Traits can't tell us what to do + println("something"); + } + } + } + } + + // Since `DoNothing` is a simple trait which: + // 1. Only has one method + // 2. Does not have any generics on the trait itself + // We can use `std::meta::make_trait_impl` to help us out. + // This helper function will generate our impl for us along with any + // necessary where clauses and still provides a flexible interface + // for us to work on each field on the struct. + comptime fn derive_do_nothing_alt(s: StructDefinition) -> Quoted { + let trait_name = quote { DoNothing }; + let method_signature = quote { fn do_nothing(self) }; + + // Call `do_nothing` recursively on each field in the struct + let for_each_field = |field_name| quote { self.$field_name.do_nothing(); }; + + // Some traits like Eq want to join each field expression with something like `&`. + // We don't need that here + let join_fields_with = quote {}; + + // The body function is a spot to insert any extra setup/teardown needed. + // We'll insert our println here. Since we recur on each field, we should see + // one println for the struct itself, followed by a println for every field (recursively). + let body = |body| quote { + println("something"); + $body + }; + crate::meta::make_trait_impl( + s, + trait_name, + method_signature, + for_each_field, + join_fields_with, + body + ) + } +``` +> Source code: noir_stdlib/src/meta/mod.nr#L186-L244 + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/control_flow.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/control_flow.md new file mode 100644 index 00000000000..045d3c3a5f5 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/control_flow.md @@ -0,0 +1,77 @@ +--- +title: Control Flow +description: + Learn how to use loops and if expressions in the Noir programming language. Discover the syntax + and examples for for loops and if-else statements. +keywords: [Noir programming language, loops, for loop, if-else statements, Rust syntax] +sidebar_position: 2 +--- + +## If Expressions + +Noir supports `if-else` statements. The syntax is most similar to Rust's where it is not required +for the statement's conditional to be surrounded by parentheses. + +```rust +let a = 0; +let mut x: u32 = 0; + +if a == 0 { + if a != 0 { + x = 6; + } else { + x = 2; + } +} else { + x = 5; + assert(x == 5); +} +assert(x == 2); +``` + +## Loops + +Noir has one kind of loop: the `for` loop. `for` loops allow you to repeat a block of code multiple +times. + +The following block of code between the braces is run 10 times. + +```rust +for i in 0..10 { + // do something +} +``` + +The index for loops is of type `u64`. + +### Break and Continue + +In unconstrained code, `break` and `continue` are also allowed in `for` loops. These are only allowed +in unconstrained code since normal constrained code requires that Noir knows exactly how many iterations +a loop may have. `break` and `continue` can be used like so: + +```rust +for i in 0 .. 10 { + println("Iteration start") + + if i == 2 { + continue; + } + + if i == 5 { + break; + } + + println(i); +} +println("Loop end") +``` + +When used, `break` will end the current loop early and jump to the statement after the for loop. In the example +above, the `break` will stop the loop and jump to the `println("Loop end")`. + +`continue` will stop the current iteration of the loop, and jump to the start of the next iteration. In the example +above, `continue` will jump to `println("Iteration start")` when used. Note that the loop continues as normal after this. +The iteration variable `i` is still increased by one as normal when `continue` is used. + +`break` and `continue` cannot currently be used to jump out of more than a single loop at a time. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_bus.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_bus.mdx new file mode 100644 index 00000000000..e55e58622ce --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_bus.mdx @@ -0,0 +1,23 @@ +--- +title: Data Bus +sidebar_position: 13 +--- +import Experimental from '@site/src/components/Notes/_experimental.mdx'; + + + +The data bus is an optimization that the backend can use to make recursion more efficient. +In order to use it, you must define some inputs of the program entry points (usually the `main()` +function) with the `call_data` modifier, and the return values with the `return_data` modifier. +These modifiers are incompatible with `pub` and `mut` modifiers. + +## Example + +```rust +fn main(mut x: u32, y: call_data u32, z: call_data [u32;4] ) -> return_data u32 { + let a = z[x]; + a+y +} +``` + +As a result, both call_data and return_data will be treated as private inputs and encapsulated into a read-only array each, for the backend to process. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/_category_.json b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/_category_.json new file mode 100644 index 00000000000..5d694210bbf --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/_category_.json @@ -0,0 +1,5 @@ +{ + "position": 0, + "collapsible": true, + "collapsed": true +} diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/arrays.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/arrays.md new file mode 100644 index 00000000000..bb68e60fe53 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/arrays.md @@ -0,0 +1,274 @@ +--- +title: Arrays +description: + Dive into the Array data type in Noir. Grasp its methods, practical examples, and best practices for efficiently using Arrays in your Noir code. +keywords: + [ + noir, + array type, + methods, + examples, + indexing, + ] +sidebar_position: 4 +--- + +An array is one way of grouping together values into one compound type. Array types can be inferred +or explicitly specified via the syntax `[; ]`: + +```rust +fn main(x : Field, y : Field) { + let my_arr = [x, y]; + let your_arr: [Field; 2] = [x, y]; +} +``` + +Here, both `my_arr` and `your_arr` are instantiated as an array containing two `Field` elements. + +Array elements can be accessed using indexing: + +```rust +fn main() { + let a = [1, 2, 3, 4, 5]; + + let first = a[0]; + let second = a[1]; +} +``` + +All elements in an array must be of the same type (i.e. homogeneous). That is, an array cannot group +a `Field` value and a `u8` value together for example. + +You can write mutable arrays, like: + +```rust +fn main() { + let mut arr = [1, 2, 3, 4, 5]; + assert(arr[0] == 1); + + arr[0] = 42; + assert(arr[0] == 42); +} +``` + +You can instantiate a new array of a fixed size with the same value repeated for each element. The following example instantiates an array of length 32 where each element is of type Field and has the value 0. + +```rust +let array: [Field; 32] = [0; 32]; +``` + +Like in Rust, arrays in Noir are a fixed size. However, if you wish to convert an array to a [slice](./slices.mdx), you can just call `as_slice` on your array: + +```rust +let array: [Field; 32] = [0; 32]; +let sl = array.as_slice() +``` + +You can define multidimensional arrays: + +```rust +let array : [[Field; 2]; 2]; +let element = array[0][0]; +``` + +However, multidimensional slices are not supported. For example, the following code will error at compile time: + +```rust +let slice : [[Field]] = &[]; +``` + +## Types + +You can create arrays of primitive types or structs. There is not yet support for nested arrays +(arrays of arrays) or arrays of structs that contain arrays. + +## Methods + +For convenience, the STD provides some ready-to-use, common methods for arrays. +Each of these functions are located within the generic impl `impl [T; N] {`. +So anywhere `self` appears, it refers to the variable `self: [T; N]`. + +### len + +Returns the length of an array + +```rust +fn len(self) -> Field +``` + +example + +```rust +fn main() { + let array = [42, 42]; + assert(array.len() == 2); +} +``` + +### sort + +Returns a new sorted array. The original array remains untouched. Notice that this function will +only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting +logic it uses internally is optimized specifically for these values. If you need a sort function to +sort any type, you should use the function `sort_via` described below. + +```rust +fn sort(self) -> [T; N] +``` + +example + +```rust +fn main() { + let arr = [42, 32]; + let sorted = arr.sort(); + assert(sorted == [32, 42]); +} +``` + +### sort_via + +Sorts the array with a custom comparison function. The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument. + +Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements. + +```rust +fn sort_via(self, ordering: fn(T, T) -> bool) -> [T; N] +``` + +example + +```rust +fn main() { + let arr = [42, 32] + let sorted_ascending = arr.sort_via(|a, b| a <= b); + assert(sorted_ascending == [32, 42]); // verifies + + let sorted_descending = arr.sort_via(|a, b| a >= b); + assert(sorted_descending == [32, 42]); // does not verify +} +``` + +### map + +Applies a function to each element of the array, returning a new array containing the mapped elements. + +```rust +fn map(self, f: fn(T) -> U) -> [U; N] +``` + +example + +```rust +let a = [1, 2, 3]; +let b = a.map(|a| a * 2); // b is now [2, 4, 6] +``` + +### fold + +Applies a function to each element of the array, returning the final accumulated value. The first +parameter is the initial value. + +```rust +fn fold(self, mut accumulator: U, f: fn(U, T) -> U) -> U +``` + +This is a left fold, so the given function will be applied to the accumulator and first element of +the array, then the second, and so on. For a given call the expected result would be equivalent to: + +```rust +let a1 = [1]; +let a2 = [1, 2]; +let a3 = [1, 2, 3]; + +let f = |a, b| a - b; +a1.fold(10, f) //=> f(10, 1) +a2.fold(10, f) //=> f(f(10, 1), 2) +a3.fold(10, f) //=> f(f(f(10, 1), 2), 3) +``` + +example: + +```rust + +fn main() { + let arr = [2, 2, 2, 2, 2]; + let folded = arr.fold(0, |a, b| a + b); + assert(folded == 10); +} + +``` + +### reduce + +Same as fold, but uses the first element as the starting element. + +```rust +fn reduce(self, f: fn(T, T) -> T) -> T +``` + +example: + +```rust +fn main() { + let arr = [2, 2, 2, 2, 2]; + let reduced = arr.reduce(|a, b| a + b); + assert(reduced == 10); +} +``` + +### all + +Returns true if all the elements satisfy the given predicate + +```rust +fn all(self, predicate: fn(T) -> bool) -> bool +``` + +example: + +```rust +fn main() { + let arr = [2, 2, 2, 2, 2]; + let all = arr.all(|a| a == 2); + assert(all); +} +``` + +### any + +Returns true if any of the elements satisfy the given predicate + +```rust +fn any(self, predicate: fn(T) -> bool) -> bool +``` + +example: + +```rust +fn main() { + let arr = [2, 2, 2, 2, 5]; + let any = arr.any(|a| a == 5); + assert(any); +} +``` + +### as_str_unchecked + +Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation - +the given array is interpreted as-is as a string. + +```rust +impl [u8; N] { + pub fn as_str_unchecked(self) -> str +} +``` + +example: + +```rust +fn main() { + let hi = [104, 105].as_str_unchecked(); + assert_eq(hi, "hi"); +} +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/booleans.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/booleans.md new file mode 100644 index 00000000000..2507af710e7 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/booleans.md @@ -0,0 +1,28 @@ +--- +title: Booleans +description: + Delve into the Boolean data type in Noir. Understand its methods, practical examples, and best practices for using Booleans in your Noir programs. +keywords: + [ + noir, + boolean type, + methods, + examples, + logical operations, + ] +sidebar_position: 2 +--- + + +The `bool` type in Noir has two possible values: `true` and `false`: + +```rust +fn main() { + let t = true; + let f: bool = false; +} +``` + +The boolean type is most commonly used in conditionals like `if` expressions and `assert` +statements. More about conditionals is covered in the [Control Flow](../control_flow.md) and +[Assert Function](../assert.md) sections. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/fields.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/fields.md new file mode 100644 index 00000000000..814b996facb --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/fields.md @@ -0,0 +1,240 @@ +--- +title: Fields +description: + Dive deep into the Field data type in Noir. Understand its methods, practical examples, and best practices to effectively use Fields in your Noir programs. +keywords: + [ + noir, + field type, + methods, + examples, + best practices, + ] +sidebar_position: 0 +--- + +The field type corresponds to the native field type of the proving backend. + +The size of a Noir field depends on the elliptic curve's finite field for the proving backend +adopted. For example, a field would be a 254-bit integer when paired with the default backend that +spans the Grumpkin curve. + +Fields support integer arithmetic and are often used as the default numeric type in Noir: + +```rust +fn main(x : Field, y : Field) { + let z = x + y; +} +``` + +`x`, `y` and `z` are all private fields in this example. Using the `let` keyword we defined a new +private value `z` constrained to be equal to `x + y`. + +If proving efficiency is of priority, fields should be used as a default for solving problems. +Smaller integer types (e.g. `u64`) incur extra range constraints. + +## Methods + +After declaring a Field, you can use these common methods on it: + +### to_le_bits + +Transforms the field into an array of bits, Little Endian. + +```rust title="to_le_bits" showLineNumbers +pub fn to_le_bits(self: Self) -> [u1; N] {} +``` +> Source code: noir_stdlib/src/field/mod.nr#L33-L35 + + +example: + +```rust title="to_le_bits_example" showLineNumbers +fn test_to_le_bits() { + let field = 2; + let bits: [u1; 8] = field.to_le_bits(); + assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]); + } +``` +> Source code: noir_stdlib/src/field/mod.nr#L255-L261 + + + +### to_be_bits + +Transforms the field into an array of bits, Big Endian. + +```rust title="to_be_bits" showLineNumbers +pub fn to_be_bits(self: Self) -> [u1; N] {} +``` +> Source code: noir_stdlib/src/field/mod.nr#L49-L51 + + +example: + +```rust title="to_be_bits_example" showLineNumbers +fn test_to_be_bits() { + let field = 2; + let bits: [u1; 8] = field.to_be_bits(); + assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]); + } +``` +> Source code: noir_stdlib/src/field/mod.nr#L246-L252 + + + +### to_le_bytes + +Transforms into an array of bytes, Little Endian + +```rust title="to_le_bytes" showLineNumbers +pub fn to_le_bytes(self: Self) -> [u8; N] { +``` +> Source code: noir_stdlib/src/field/mod.nr#L62-L64 + + +example: + +```rust title="to_le_bytes_example" showLineNumbers +fn test_to_le_bytes() { + let field = 2; + let bits: [u8; 8] = field.to_le_bytes(); + assert_eq(bits, [2, 0, 0, 0, 0, 0, 0, 0]); + assert_eq(Field::from_le_bytes::<8>(bits), field); + } +``` +> Source code: noir_stdlib/src/field/mod.nr#L274-L281 + + +### to_be_bytes + +Transforms into an array of bytes, Big Endian + +```rust title="to_be_bytes" showLineNumbers +pub fn to_be_bytes(self: Self) -> [u8; N] { +``` +> Source code: noir_stdlib/src/field/mod.nr#L95-L97 + + +example: + +```rust title="to_be_bytes_example" showLineNumbers +fn test_to_be_bytes() { + let field = 2; + let bits: [u8; 8] = field.to_be_bytes(); + assert_eq(bits, [0, 0, 0, 0, 0, 0, 0, 2]); + assert_eq(Field::from_be_bytes::<8>(bits), field); + } +``` +> Source code: noir_stdlib/src/field/mod.nr#L264-L271 + + + +### to_le_radix + +Decomposes into an array over the specified base, Little Endian + +```rust title="to_le_radix" showLineNumbers +pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] { + crate::assert_constant(radix); + self.__to_le_radix(radix) + } +``` +> Source code: noir_stdlib/src/field/mod.nr#L119-L124 + + + +example: + +```rust title="to_le_radix_example" showLineNumbers +fn test_to_le_radix() { + let field = 2; + let bits: [u8; 8] = field.to_le_radix(256); + assert_eq(bits, [2, 0, 0, 0, 0, 0, 0, 0]); + assert_eq(Field::from_le_bytes::<8>(bits), field); + } +``` +> Source code: noir_stdlib/src/field/mod.nr#L294-L301 + + + +### to_be_radix + +Decomposes into an array over the specified base, Big Endian + +```rust title="to_be_radix" showLineNumbers +pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] { + crate::assert_constant(radix); + self.__to_be_radix(radix) + } +``` +> Source code: noir_stdlib/src/field/mod.nr#L126-L131 + + +example: + +```rust title="to_be_radix_example" showLineNumbers +fn test_to_be_radix() { + let field = 2; + let bits: [u8; 8] = field.to_be_radix(256); + assert_eq(bits, [0, 0, 0, 0, 0, 0, 0, 2]); + assert_eq(Field::from_be_bytes::<8>(bits), field); + } +``` +> Source code: noir_stdlib/src/field/mod.nr#L284-L291 + + + +### pow_32 + +Returns the value to the power of the specified exponent + +```rust +fn pow_32(self, exponent: Field) -> Field +``` + +example: + +```rust +fn main() { + let field = 2 + let pow = field.pow_32(4); + assert(pow == 16); +} +``` + +### assert_max_bit_size + +Adds a constraint to specify that the field can be represented with `bit_size` number of bits + +```rust title="assert_max_bit_size" showLineNumbers +pub fn assert_max_bit_size(self, bit_size: u32) { +``` +> Source code: noir_stdlib/src/field/mod.nr#L10-L12 + + +example: + +```rust +fn main() { + let field = 2 + field.assert_max_bit_size(32); +} +``` + +### sgn0 + +Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x ∈ \{0, ..., p-1\} is even, otherwise sgn0(x mod p) = 1. + +```rust +fn sgn0(self) -> u1 +``` + + +### lt + +Returns true if the field is less than the other field + +```rust +pub fn lt(self, another: Field) -> bool +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/function_types.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/function_types.md new file mode 100644 index 00000000000..f6121af17e2 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/function_types.md @@ -0,0 +1,26 @@ +--- +title: Function types +sidebar_position: 10 +--- + +Noir supports higher-order functions. The syntax for a function type is as follows: + +```rust +fn(arg1_type, arg2_type, ...) -> return_type +``` + +Example: + +```rust +fn assert_returns_100(f: fn() -> Field) { // f takes no args and returns a Field + assert(f() == 100); +} + +fn main() { + assert_returns_100(|| 100); // ok + assert_returns_100(|| 150); // fails +} +``` + +A function type also has an optional capture environment - this is necessary to support closures. +See [Lambdas](../lambdas.md) for more details. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/index.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/index.md new file mode 100644 index 00000000000..11f51e2b65a --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/index.md @@ -0,0 +1,126 @@ +--- +title: Data Types +description: + Get a clear understanding of the two categories of Noir data types - primitive types and compound + types. Learn about their characteristics, differences, and how to use them in your Noir + programming. +keywords: + [ + noir, + data types, + primitive types, + compound types, + private types, + public types, + ] +--- + +Every value in Noir has a type, which determines which operations are valid for it. + +All values in Noir are fundamentally composed of `Field` elements. For a more approachable +developing experience, abstractions are added on top to introduce different data types in Noir. + +Noir has two category of data types: primitive types (e.g. `Field`, integers, `bool`) and compound +types that group primitive types (e.g. arrays, tuples, structs). Each value can either be private or +public. + +## Private & Public Types + +A **private value** is known only to the Prover, while a **public value** is known by both the +Prover and Verifier. Mark values as `private` when the value should only be known to the prover. All +primitive types (including individual fields of compound types) in Noir are private by default, and +can be marked public when certain values are intended to be revealed to the Verifier. + +> **Note:** For public values defined in Noir programs paired with smart contract verifiers, once +> the proofs are verified on-chain the values can be considered known to everyone that has access to +> that blockchain. + +Public data types are treated no differently to private types apart from the fact that their values +will be revealed in proofs generated. Simply changing the value of a public type will not change the +circuit (where the same goes for changing values of private types as well). + +_Private values_ are also referred to as _witnesses_ sometimes. + +> **Note:** The terms private and public when applied to a type (e.g. `pub Field`) have a different +> meaning than when applied to a function (e.g. `pub fn foo() {}`). +> +> The former is a visibility modifier for the Prover to interpret if a value should be made known to +> the Verifier, while the latter is a visibility modifier for the compiler to interpret if a +> function should be made accessible to external Noir programs like in other languages. + +### pub Modifier + +All data types in Noir are private by default. Types are explicitly declared as public using the +`pub` modifier: + +```rust +fn main(x : Field, y : pub Field) -> pub Field { + x + y +} +``` + +In this example, `x` is **private** while `y` and `x + y` (the return value) are **public**. Note +that visibility is handled **per variable**, so it is perfectly valid to have one input that is +private and another that is public. + +> **Note:** Public types can only be declared through parameters on `main`. + +## Type Aliases + +A type alias is a new name for an existing type. Type aliases are declared with the keyword `type`: + +```rust +type Id = u8; + +fn main() { + let id: Id = 1; + let zero: u8 = 0; + assert(zero + 1 == id); +} +``` + +Type aliases can also be used with [generics](../generics.md): + +```rust +type Id = Size; + +fn main() { + let id: Id = 1; + let zero: u32 = 0; + assert(zero + 1 == id); +} +``` + +Type aliases can even refer to other aliases. An error will be issued if they form a cycle: + +```rust +// Ok! +type A = B; +type B = Field; + +type Bad1 = Bad2; + +// error: Dependency cycle found +type Bad2 = Bad1; +// ^^^^^^^^^^^ 'Bad2' recursively depends on itself: Bad2 -> Bad1 -> Bad2 +``` + +By default, like functions, type aliases are private to the module the exist in. You can use `pub` +to make the type alias public or `pub(crate)` to make it public to just its crate: + +```rust +// This type alias is now public +pub type Id = u8; +``` + +## Wildcard Type +Noir can usually infer the type of the variable from the context, so specifying the type of a variable is only required when it cannot be inferred. However, specifying a complex type can be tedious, especially when it has multiple generic arguments. Often some of the generic types can be inferred from the context, and Noir only needs a hint to properly infer the other types. We can partially specify a variable's type by using `_` as a marker, indicating where we still want the compiler to infer the type. + +```rust +let a: [_; 4] = foo(b); +``` + + +### BigInt + +You can achieve BigInt functionality using the [Noir BigInt](https://github.com/shuklaayush/noir-bigint) library. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/integers.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/integers.md new file mode 100644 index 00000000000..a1d59bf3166 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/integers.md @@ -0,0 +1,156 @@ +--- +title: Integers +description: Explore the Integer data type in Noir. Learn about its methods, see real-world examples, and grasp how to efficiently use Integers in your Noir code. +keywords: [noir, integer types, methods, examples, arithmetic] +sidebar_position: 1 +--- + +An integer type is a range constrained field type. +The Noir frontend supports both unsigned and signed integer types. +The allowed sizes are 1, 8, 16, 32 and 64 bits. + +:::info + +When an integer is defined in Noir without a specific type, it will default to `Field`. + +The one exception is for loop indices which default to `u64` since comparisons on `Field`s are not possible. + +::: + +## Unsigned Integers + +An unsigned integer type is specified first with the letter `u` (indicating its unsigned nature) followed by its bit size (e.g. `8`): + +```rust +fn main() { + let x: u8 = 1; + let y: u8 = 1; + let z = x + y; + assert (z == 2); +} +``` + +The bit size determines the maximum value the integer type can store. For example, a `u8` variable can store a value in the range of 0 to 255 (i.e. $\\2^{8}-1\\$). + +## Signed Integers + +A signed integer type is specified first with the letter `i` (which stands for integer) followed by its bit size (e.g. `8`): + +```rust +fn main() { + let x: i8 = -1; + let y: i8 = -1; + let z = x + y; + assert (z == -2); +} +``` + +The bit size determines the maximum and minimum range of value the integer type can store. For example, an `i8` variable can store a value in the range of -128 to 127 (i.e. $\\-2^{7}\\$ to $\\2^{7}-1\\$). + +## 128 bits Unsigned Integers + +The built-in structure `U128` allows you to use 128-bit unsigned integers almost like a native integer type. However, there are some differences to keep in mind: +- You cannot cast between a native integer and `U128` +- There is a higher performance cost when using `U128`, compared to a native type. + +Conversion between unsigned integer types and U128 are done through the use of `from_integer` and `to_integer` functions. `from_integer` also accepts the `Field` type as input. + +```rust +fn main() { + let x = U128::from_integer(23); + let y = U128::from_hex("0x7"); + let z = x + y; + assert(z.to_integer() == 30); +} +``` + +`U128` is implemented with two 64 bits limbs, representing the low and high bits, which explains the performance cost. You should expect `U128` to be twice more costly for addition and four times more costly for multiplication. +You can construct a U128 from its limbs: +```rust +fn main(x: u64, y: u64) { + let x = U128::from_u64s_be(x,y); + assert(z.hi == x as Field); + assert(z.lo == y as Field); +} +``` + +Note that the limbs are stored as Field elements in order to avoid unnecessary conversions. +Apart from this, most operations will work as usual: + +```rust +fn main(x: U128, y: U128) { + // multiplication + let c = x * y; + // addition and subtraction + let c = c - x + y; + // division + let c = x / y; + // bit operation; + let c = x & y | y; + // bit shift + let c = x << y; + // comparisons; + let c = x < y; + let c = x == y; +} +``` + +## Overflows + +Computations that exceed the type boundaries will result in overflow errors. This happens with both signed and unsigned integers. For example, attempting to prove: + +```rust +fn main(x: u8, y: u8) { + let z = x + y; +} +``` + +With: + +```toml +x = "255" +y = "1" +``` + +Would result in: + +``` +$ nargo execute +error: Assertion failed: 'attempt to add with overflow' +┌─ ~/src/main.nr:9:13 +│ +│ let z = x + y; +│ ----- +│ += Call stack: + ... +``` + +A similar error would happen with signed integers: + +```rust +fn main() { + let x: i8 = -118; + let y: i8 = -11; + let z = x + y; +} +``` + +### Wrapping methods + +Although integer overflow is expected to error, some use-cases rely on wrapping. For these use-cases, the standard library provides `wrapping` variants of certain common operations: + +```rust +fn wrapping_add(x: T, y: T) -> T; +fn wrapping_sub(x: T, y: T) -> T; +fn wrapping_mul(x: T, y: T) -> T; +``` + +Example of how it is used: + +```rust + +fn main(x: u8, y: u8) -> pub u8 { + std::wrapping_add(x, y) +} +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/references.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/references.md new file mode 100644 index 00000000000..a5293d11cfb --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/references.md @@ -0,0 +1,23 @@ +--- +title: References +sidebar_position: 9 +--- + +Noir supports first-class references. References are a bit like pointers: they point to a specific address that can be followed to access the data stored at that address. You can use Rust-like syntax to use pointers in Noir: the `&` operator references the variable, the `*` operator dereferences it. + +Example: + +```rust +fn main() { + let mut x = 2; + + // you can reference x as &mut and pass it to multiplyBy2 + multiplyBy2(&mut x); +} + +// you can access &mut here +fn multiplyBy2(x: &mut Field) { + // and dereference it with * + *x = *x * 2; +} +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/slices.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/slices.mdx new file mode 100644 index 00000000000..cfee564a302 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/slices.mdx @@ -0,0 +1,358 @@ +--- +title: Slices +description: Explore the Slice data type in Noir. Understand its methods, see real-world examples, and learn how to effectively use Slices in your Noir programs. +keywords: [noir, slice type, methods, examples, subarrays] +sidebar_position: 5 +--- + +import Experimental from '@site/src/components/Notes/_experimental.mdx'; + + + +A slice is a dynamically-sized view into a sequence of elements. They can be resized at runtime, but because they don't own the data, they cannot be returned from a circuit. You can treat slices as arrays without a constrained size. + +```rust +fn main() -> pub u32 { + let mut slice: [Field] = &[0; 2]; + + let mut new_slice = slice.push_back(6); + new_slice.len() +} +``` + +To write a slice literal, use a preceding ampersand as in: `&[0; 2]` or +`&[1, 2, 3]`. + +It is important to note that slices are not references to arrays. In Noir, +`&[..]` is more similar to an immutable, growable vector. + +View the corresponding test file [here][test-file]. + +[test-file]: https://github.com/noir-lang/noir/blob/f387ec1475129732f72ba294877efdf6857135ac/crates/nargo_cli/tests/test_data_ssa_refactor/slices/src/main.nr + +## Methods + +For convenience, the STD provides some ready-to-use, common methods for slices: + +### push_back + +Pushes a new element to the end of the slice, returning a new slice with a length one greater than the original unmodified slice. + +```rust +fn push_back(_self: [T], _elem: T) -> [T] +``` + +example: + +```rust +fn main() -> pub Field { + let mut slice: [Field] = &[0; 2]; + + let mut new_slice = slice.push_back(6); + new_slice.len() +} +``` + +View the corresponding test file [here][test-file]. + +### push_front + +Returns a new array with the specified element inserted at index 0. The existing elements indexes are incremented by 1. + +```rust +fn push_front(_self: Self, _elem: T) -> Self +``` + +Example: + +```rust +let mut new_slice: [Field] = &[]; +new_slice = new_slice.push_front(20); +assert(new_slice[0] == 20); // returns true +``` + +View the corresponding test file [here][test-file]. + +### pop_front + +Returns a tuple of two items, the first element of the array and the rest of the array. + +```rust +fn pop_front(_self: Self) -> (T, Self) +``` + +Example: + +```rust +let (first_elem, rest_of_slice) = slice.pop_front(); +``` + +View the corresponding test file [here][test-file]. + +### pop_back + +Returns a tuple of two items, the beginning of the array with the last element omitted and the last element. + +```rust +fn pop_back(_self: Self) -> (Self, T) +``` + +Example: + +```rust +let (popped_slice, last_elem) = slice.pop_back(); +``` + +View the corresponding test file [here][test-file]. + +### append + +Loops over a slice and adds it to the end of another. + +```rust +fn append(mut self, other: Self) -> Self +``` + +Example: + +```rust +let append = &[1, 2].append(&[3, 4, 5]); +``` + +### insert + +Inserts an element at a specified index and shifts all following elements by 1. + +```rust +fn insert(_self: Self, _index: Field, _elem: T) -> Self +``` + +Example: + +```rust +new_slice = rest_of_slice.insert(2, 100); +assert(new_slice[2] == 100); +``` + +View the corresponding test file [here][test-file]. + +### remove + +Remove an element at a specified index, shifting all elements after it to the left, returning the altered slice and the removed element. + +```rust +fn remove(_self: Self, _index: Field) -> (Self, T) +``` + +Example: + +```rust +let (remove_slice, removed_elem) = slice.remove(3); +``` + +### len + +Returns the length of a slice + +```rust +fn len(self) -> Field +``` + +Example: + +```rust +fn main() { + let slice = &[42, 42]; + assert(slice.len() == 2); +} +``` + +### as_array + +Converts this slice into an array. + +Make sure to specify the size of the resulting array. +Panics if the resulting array length is different than the slice's length. + +```rust +fn as_array(self) -> [T; N] +``` + +Example: + +```rust +fn main() { + let slice = &[5, 6]; + + // Always specify the length of the resulting array! + let array: [Field; 2] = slice.as_array(); + + assert(array[0] == slice[0]); + assert(array[1] == slice[1]); +} +``` + +### map + +Applies a function to each element of the slice, returning a new slice containing the mapped elements. + +```rust +fn map(self, f: fn[Env](T) -> U) -> [U] +``` + +example + +```rust +let a = &[1, 2, 3]; +let b = a.map(|a| a * 2); // b is now &[2, 4, 6] +``` + +### fold + +Applies a function to each element of the slice, returning the final accumulated value. The first +parameter is the initial value. + +```rust +fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U +``` + +This is a left fold, so the given function will be applied to the accumulator and first element of +the slice, then the second, and so on. For a given call the expected result would be equivalent to: + +```rust +let a1 = &[1]; +let a2 = &[1, 2]; +let a3 = &[1, 2, 3]; + +let f = |a, b| a - b; +a1.fold(10, f) //=> f(10, 1) +a2.fold(10, f) //=> f(f(10, 1), 2) +a3.fold(10, f) //=> f(f(f(10, 1), 2), 3) +``` + +example: + +```rust + +fn main() { + let slice = &[2, 2, 2, 2, 2]; + let folded = slice.fold(0, |a, b| a + b); + assert(folded == 10); +} + +``` + +### reduce + +Same as fold, but uses the first element as the starting element. + +```rust +fn reduce(self, f: fn[Env](T, T) -> T) -> T +``` + +example: + +```rust +fn main() { + let slice = &[2, 2, 2, 2, 2]; + let reduced = slice.reduce(|a, b| a + b); + assert(reduced == 10); +} +``` + +### filter + +Returns a new slice containing only elements for which the given predicate returns true. + +```rust +fn filter(self, f: fn[Env](T) -> bool) -> Self +``` + +example: + +```rust +fn main() { + let slice = &[1, 2, 3, 4, 5]; + let odds = slice.filter(|x| x % 2 == 1); + assert_eq(odds, &[1, 3, 5]); +} +``` + +### join + +Flatten each element in the slice into one value, separated by `separator`. + +Note that although slices implement `Append`, `join` cannot be used on slice +elements since nested slices are prohibited. + +```rust +fn join(self, separator: T) -> T where T: Append +``` + +example: + +```rust +struct Accumulator { + total: Field, +} + +// "Append" two accumulators by adding them +impl Append for Accumulator { + fn empty() -> Self { + Self { total: 0 } + } + + fn append(self, other: Self) -> Self { + Self { total: self.total + other.total } + } +} + +fn main() { + let slice = &[1, 2, 3, 4, 5].map(|total| Accumulator { total }); + + let result = slice.join(Accumulator::empty()); + assert_eq(result, Accumulator { total: 15 }); + + // We can use a non-empty separator to insert additional elements to sum: + let separator = Accumulator { total: 10 }; + let result = slice.join(separator); + assert_eq(result, Accumulator { total: 55 }); +} +``` + +### all + +Returns true if all the elements satisfy the given predicate + +```rust +fn all(self, predicate: fn[Env](T) -> bool) -> bool +``` + +example: + +```rust +fn main() { + let slice = &[2, 2, 2, 2, 2]; + let all = slice.all(|a| a == 2); + assert(all); +} +``` + +### any + +Returns true if any of the elements satisfy the given predicate + +```rust +fn any(self, predicate: fn[Env](T) -> bool) -> bool +``` + +example: + +```rust +fn main() { + let slice = &[2, 2, 2, 2, 5]; + let any = slice.any(|a| a == 5); + assert(any); +} + +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/strings.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/strings.md new file mode 100644 index 00000000000..1fdee42425e --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/strings.md @@ -0,0 +1,79 @@ +--- +title: Strings +description: + Discover the String data type in Noir. Learn about its methods, see real-world examples, and understand how to effectively manipulate and use Strings in Noir. +keywords: + [ + noir, + string type, + methods, + examples, + concatenation, + ] +sidebar_position: 3 +--- + + +The string type is a fixed length value defined with `str`. + +You can use strings in `assert()` functions or print them with +`println()`. See more about [Logging](../../standard_library/logging.md). + +```rust + +fn main(message : pub str<11>, hex_as_string : str<4>) { + println(message); + assert(message == "hello world"); + assert(hex_as_string == "0x41"); +} +``` + +You can convert a `str` to a byte array by calling `as_bytes()` +or a vector by calling `as_bytes_vec()`. + +```rust +fn main() { + let message = "hello world"; + let message_bytes = message.as_bytes(); + let mut message_vec = message.as_bytes_vec(); + assert(message_bytes.len() == 11); + assert(message_bytes[0] == 104); + assert(message_bytes[0] == message_vec.get(0)); +} +``` + +## Escape characters + +You can use escape characters for your strings: + +| Escape Sequence | Description | +|-----------------|-----------------| +| `\r` | Carriage Return | +| `\n` | Newline | +| `\t` | Tab | +| `\0` | Null Character | +| `\"` | Double Quote | +| `\\` | Backslash | + +Example: + +```rust +let s = "Hello \"world" // prints "Hello "world" +let s = "hey \tyou"; // prints "hey you" +``` + +## Raw strings + +A raw string begins with the letter `r` and is optionally delimited by a number of hashes `#`. + +Escape characters are *not* processed within raw strings. All contents are interpreted literally. + +Example: + +```rust +let s = r"Hello world"; +let s = r#"Simon says "hello world""#; + +// Any number of hashes may be used (>= 1) as long as the string also terminates with the same number of hashes +let s = r#####"One "#, Two "##, Three "###, Four "####, Five will end the string."#####; +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/structs.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/structs.md new file mode 100644 index 00000000000..e529347f27d --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/structs.md @@ -0,0 +1,82 @@ +--- +title: Structs +description: + Explore the Struct data type in Noir. Learn about its methods, see real-world examples, and grasp how to effectively define and use Structs in your Noir programs. +keywords: + [ + noir, + struct type, + methods, + examples, + data structures, + ] +sidebar_position: 8 +--- + +A struct also allows for grouping multiple values of different types. Unlike tuples, we can also +name each field. + +> **Note:** The usage of _field_ here refers to each element of the struct and is unrelated to the +> field type of Noir. + +Defining a struct requires giving it a name and listing each field within as `: ` pairs: + +```rust +struct Animal { + hands: Field, + legs: Field, + eyes: u8, +} +``` + +An instance of a struct can then be created with actual values in `: ` pairs in any +order. Struct fields are accessible using their given names: + +```rust +fn main() { + let legs = 4; + + let dog = Animal { + eyes: 2, + hands: 0, + legs, + }; + + let zero = dog.hands; +} +``` + +Structs can also be destructured in a pattern, binding each field to a new variable: + +```rust +fn main() { + let Animal { hands, legs: feet, eyes } = get_octopus(); + + let ten = hands + feet + eyes as u8; +} + +fn get_octopus() -> Animal { + let octopus = Animal { + hands: 0, + legs: 8, + eyes: 2, + }; + + octopus +} +``` + +The new variables can be bound with names different from the original struct field names, as +showcased in the `legs --> feet` binding in the example above. + +By default, like functions, structs are private to the module the exist in. You can use `pub` +to make the struct public or `pub(crate)` to make it public to just its crate: + +```rust +// This struct is now public +pub struct Animal { + hands: Field, + legs: Field, + eyes: u8, +} +``` \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/tuples.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/tuples.md new file mode 100644 index 00000000000..2ec5c9c4113 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/data_types/tuples.md @@ -0,0 +1,48 @@ +--- +title: Tuples +description: + Dive into the Tuple data type in Noir. Understand its methods, practical examples, and best practices for efficiently using Tuples in your Noir code. +keywords: + [ + noir, + tuple type, + methods, + examples, + multi-value containers, + ] +sidebar_position: 7 +--- + +A tuple collects multiple values like an array, but with the added ability to collect values of +different types: + +```rust +fn main() { + let tup: (u8, u64, Field) = (255, 500, 1000); +} +``` + +One way to access tuple elements is via destructuring using pattern matching: + +```rust +fn main() { + let tup = (1, 2); + + let (one, two) = tup; + + let three = one + two; +} +``` + +Another way to access tuple elements is via direct member access, using a period (`.`) followed by +the index of the element we want to access. Index `0` corresponds to the first tuple element, `1` to +the second and so on: + +```rust +fn main() { + let tup = (5, 6, 7, 8); + + let five = tup.0; + let eight = tup.3; +} +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/functions.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/functions.md new file mode 100644 index 00000000000..f656cdfd97a --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/functions.md @@ -0,0 +1,226 @@ +--- +title: Functions +description: + Learn how to declare functions and methods in Noir, a programming language with Rust semantics. + This guide covers parameter declaration, return types, call expressions, and more. +keywords: [Noir, Rust, functions, methods, parameter declaration, return types, call expressions] +sidebar_position: 1 +--- + +Functions in Noir follow the same semantics of Rust, though Noir does not support early returns. + +To declare a function the `fn` keyword is used. + +```rust +fn foo() {} +``` + +By default, functions are visible only within the package they are defined. To make them visible outside of that package (for example, as part of a [library](../modules_packages_crates/crates_and_packages.md#libraries)), you should mark them as `pub`: + +```rust +pub fn foo() {} +``` + +You can also restrict the visibility of the function to only the crate it was defined in, by specifying `pub(crate)`: + +```rust +pub(crate) fn foo() {} //foo can only be called within its crate +``` + +All parameters in a function must have a type and all types are known at compile time. The parameter +is pre-pended with a colon and the parameter type. Multiple parameters are separated using a comma. + +```rust +fn foo(x : Field, y : Field){} +``` + +The return type of a function can be stated by using the `->` arrow notation. The function below +states that the foo function must return a `Field`. If the function returns no value, then the arrow +is omitted. + +```rust +fn foo(x : Field, y : Field) -> Field { + x + y +} +``` + +Note that a `return` keyword is unneeded in this case - the last expression in a function's body is +returned. + +## Main function + +If you're writing a binary, the `main` function is the starting point of your program. You can pass all types of expressions to it, as long as they have a fixed size at compile time: + +```rust +fn main(x : Field) // this is fine: passing a Field +fn main(x : [Field; 2]) // this is also fine: passing a Field with known size at compile-time +fn main(x : (Field, bool)) // 👌: passing a (Field, bool) tuple means size 2 +fn main(x : str<5>) // this is fine, as long as you pass a string of size 5 + +fn main(x : Vec) // can't compile, has variable size +fn main(x : [Field]) // can't compile, has variable size +fn main(....// i think you got it by now +``` + +Keep in mind [tests](../../tooling/testing.md) don't differentiate between `main` and any other function. The following snippet passes tests, but won't compile or prove: + +```rust +fn main(x : [Field]) { + assert(x[0] == 1); +} + +#[test] +fn test_one() { + main(&[1, 2]); +} +``` + +```bash +$ nargo test +[testing] Running 1 test functions +[testing] Testing test_one... ok +[testing] All tests passed + +$ nargo check +The application panicked (crashed). +Message: Cannot have variable sized arrays as a parameter to main +``` + +## Call Expressions + +Calling a function in Noir is executed by using the function name and passing in the necessary +arguments. + +Below we show how to call the `foo` function from the `main` function using a call expression: + +```rust +fn main(x : Field, y : Field) { + let z = foo(x); +} + +fn foo(x : Field) -> Field { + x + x +} +``` + +## Methods + +You can define methods in Noir on any struct type in scope. + +```rust +struct MyStruct { + foo: Field, + bar: Field, +} + +impl MyStruct { + fn new(foo: Field) -> MyStruct { + MyStruct { + foo, + bar: 2, + } + } + + fn sum(self) -> Field { + self.foo + self.bar + } +} + +fn main() { + let s = MyStruct::new(40); + assert(s.sum() == 42); +} +``` + +Methods are just syntactic sugar for functions, so if we wanted to we could also call `sum` as +follows: + +```rust +assert(MyStruct::sum(s) == 42); +``` + +It is also possible to specialize which method is chosen depending on the [generic](./generics.md) type that is used. In this example, the `foo` function returns different values depending on its type: + +```rust +struct Foo {} + +impl Foo { + fn foo(self) -> Field { 1 } +} + +impl Foo { + fn foo(self) -> Field { 2 } +} + +fn main() { + let f1: Foo = Foo{}; + let f2: Foo = Foo{}; + assert(f1.foo() + f2.foo() == 3); +} +``` + +Also note that impls with the same method name defined in them cannot overlap. For example, if we already have `foo` defined for `Foo` and `Foo` like we do above, we cannot also define `foo` in an `impl Foo` since it would be ambiguous which version of `foo` to choose. + +```rust +// Including this impl in the same project as the above snippet would +// cause an overlapping impls error +impl Foo { + fn foo(self) -> Field { 3 } +} +``` + +## Lambdas + +Lambdas are anonymous functions. They follow the syntax of Rust - `|arg1, arg2, ..., argN| return_expression`. + +```rust +let add_50 = |val| val + 50; +assert(add_50(100) == 150); +``` + +See [Lambdas](./lambdas.md) for more details. + +## Attributes + +Attributes are metadata that can be applied to a function, using the following syntax: `#[attribute(value)]`. + +Supported attributes include: + +- **builtin**: the function is implemented by the compiler, for efficiency purposes. +- **deprecated**: mark the function as _deprecated_. Calling the function will generate a warning: `warning: use of deprecated function` +- **field**: Used to enable conditional compilation of code depending on the field size. See below for more details +- **oracle**: mark the function as _oracle_; meaning it is an external unconstrained function, implemented in noir_js. See [Unconstrained](./unconstrained.md) and [NoirJS](../../reference/NoirJS/noir_js/index.md) for more details. +- **test**: mark the function as unit tests. See [Tests](../../tooling/testing.md) for more details + +### Field Attribute + +The field attribute defines which field the function is compatible for. The function is conditionally compiled, under the condition that the field attribute matches the Noir native field. +The field can be defined implicitly, by using the name of the elliptic curve usually associated to it - for instance bn254, bls12_381 - or explicitly by using the field (prime) order, in decimal or hexadecimal form. +As a result, it is possible to define multiple versions of a function with each version specialized for a different field attribute. This can be useful when a function requires different parameters depending on the underlying elliptic curve. + +Example: we define the function `foo()` three times below. Once for the default Noir bn254 curve, once for the field $\mathbb F_{23}$, which will normally never be used by Noir, and once again for the bls12_381 curve. + +```rust +#[field(bn254)] +fn foo() -> u32 { + 1 +} + +#[field(23)] +fn foo() -> u32 { + 2 +} + +// This commented code would not compile as foo would be defined twice because it is the same field as bn254 +// #[field(21888242871839275222246405745257275088548364400416034343698204186575808495617)] +// fn foo() -> u32 { +// 2 +// } + +#[field(bls12_381)] +fn foo() -> u32 { + 3 +} +``` + +If the field name is not known to Noir, it will discard the function. Field names are case insensitive. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/generics.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/generics.md new file mode 100644 index 00000000000..c180a0ce7e6 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/generics.md @@ -0,0 +1,251 @@ +--- +title: Generics +description: Learn how to use Generics in Noir +keywords: [Noir, Rust, generics, functions, structs] +sidebar_position: 7 +--- + +Generics allow you to use the same functions with multiple different concrete data types. You can +read more about the concept of generics in the Rust documentation +[here](https://doc.rust-lang.org/book/ch10-01-syntax.html). + +Here is a trivial example showing the identity function that supports any type. In Rust, it is +common to refer to the most general type as `T`. We follow the same convention in Noir. + +```rust +fn id(x: T) -> T { + x +} +``` + +## Numeric Generics + +If we want to be generic over array lengths (which are type-level integers), we can use numeric +generics. Using these looks similar to using regular generics, but introducing them into scope +requires declaring them with `let MyGenericName: IntegerType`. This can be done anywhere a normal +generic is declared. Instead of types, these generics resolve to integers at compile-time. +Here's an example of a struct that is generic over the size of the array it contains internally: + +```rust +struct BigInt { + limbs: [u32; N], +} + +impl BigInt { + // `N` is in scope of all methods in the impl + fn first(first: BigInt, second: BigInt) -> Self { + assert(first.limbs != second.limbs); + first + + fn second(first: BigInt, second: Self) -> Self { + assert(first.limbs != second.limbs); + second + } +} +``` + +## In Structs + +Generics are useful for specifying types in structs. For example, we can specify that a field in a +struct will be of a certain generic type. In this case `value` is of type `T`. + +```rust +struct RepeatedValue { + value: T, + count: Field, +} + +impl RepeatedValue { + fn print(self) { + for _i in 0 .. self.count { + println(self.value); + } + } +} + +fn main() { + let repeated = RepeatedValue { value: "Hello!", count: 2 }; + repeated.print(); +} +``` + +The `print` function will print `Hello!` an arbitrary number of times, twice in this case. + +## Calling functions on generic parameters + +Since a generic type `T` can represent any type, how can we call functions on the underlying type? +In other words, how can we go from "any type `T`" to "any type `T` that has certain methods available?" + +This is what [traits](../concepts/traits.md) are for in Noir. Here's an example of a function generic over +any type `T` that implements the `Eq` trait for equality: + +```rust +fn first_element_is_equal(array1: [T; N], array2: [T; N]) -> bool + where T: Eq +{ + if (array1.len() == 0) | (array2.len() == 0) { + true + } else { + array1[0] == array2[0] + } +} + +fn main() { + assert(first_element_is_equal([1, 2, 3], [1, 5, 6])); + + // We can use first_element_is_equal for arrays of any type + // as long as we have an Eq impl for the types we pass in + let array = [MyStruct::new(), MyStruct::new()]; + assert(array_eq(array, array, MyStruct::eq)); +} + +impl Eq for MyStruct { + fn eq(self, other: MyStruct) -> bool { + self.foo == other.foo + } +} +``` + +You can find more details on traits and trait implementations on the [traits page](../concepts/traits.md). + +## Manually Specifying Generics with the Turbofish Operator + +There are times when the compiler cannot reasonably infer what type should be used for a generic, or when the developer themselves may want to manually distinguish generic type parameters. This is where the `::<>` turbofish operator comes into play. + +The `::<>` operator can follow a variable or path and can be used to manually specify generic arguments within the angle brackets. +The name "turbofish" comes from that `::<>` looks like a little fish. + +Examples: +```rust +fn main() { + let mut slice = []; + slice = slice.push_back(1); + slice = slice.push_back(2); + // Without turbofish a type annotation would be needed on the left hand side + let array = slice.as_array::<2>(); +} +``` + + +```rust +trait MyTrait { + fn ten() -> Self; +} + +impl MyTrait for Field { + fn ten() -> Self { 10 } +} + +struct Foo { + inner: T +} + +impl Foo { + fn generic_method(_self: Self) -> U where U: MyTrait { + U::ten() + } +} + +fn example() { + let foo: Foo = Foo { inner: 1 }; + // Using a type other than `Field` here (e.g. u32) would fail as + // there is no matching impl for `u32: MyTrait`. + // + // Substituting the `10` on the left hand side of this assert + // with `10 as u32` would also fail with a type mismatch as we + // are expecting a `Field` from the right hand side. + assert(10 as u32 == foo.generic_method::()); +} +``` + +## Arithmetic Generics + +In addition to numeric generics, Noir also allows a limited form of arithmetic on generics. +When you have a numeric generic such as `N`, you can use the following operators on it in a +type position: `+`, `-`, `*`, `/`, and `%`. + +Note that type checking arithmetic generics is a best effort guess from the compiler and there +are many cases of types that are equal that the compiler may not see as such. For example, +we know that `T * (N + M)` should be equal to `T*N + T*M` but the compiler does not currently +apply the distributive law and thus sees these as different types. + +Even with this limitation though, the compiler can handle common cases decently well: + +```rust +trait Serialize { + fn serialize(self) -> [Field; N]; +} + +impl Serialize<1> for Field { + fn serialize(self) -> [Field; 1] { + [self] + } +} + +impl Serialize for [T; N] + where T: Serialize { .. } + +impl Serialize for (T, U) + where T: Serialize, U: Serialize { .. } + +fn main() { + let data = (1, [2, 3, 4]); + assert_eq(data.serialize().len(), 4); +} +``` + +Note that if there is any over or underflow the types will fail to unify: + +```rust title="underflow-example" showLineNumbers +fn pop(array: [Field; N]) -> [Field; N - 1] { + let mut result: [Field; N - 1] = std::mem::zeroed(); + for i in 0..N - 1 { + result[i] = array[i]; + } + result +} + +fn main() { + // error: Could not determine array length `(0 - 1)` + pop([]); +} +``` +> Source code: test_programs/compile_failure/arithmetic_generics_underflow/src/main.nr#L1-L14 + + +This also applies if there is underflow in an intermediate calculation: + +```rust title="intermediate-underflow-example" showLineNumbers +fn main() { + // From main it looks like there's nothing sketchy going on + seems_fine([]); +} + +// Since `seems_fine` says it can receive and return any length N +fn seems_fine(array: [Field; N]) -> [Field; N] { + // But inside `seems_fine` we pop from the array which + // requires the length to be greater than zero. + + // error: Could not determine array length `(0 - 1)` + push_zero(pop(array)) +} + +fn pop(array: [Field; N]) -> [Field; N - 1] { + let mut result: [Field; N - 1] = std::mem::zeroed(); + for i in 0..N - 1 { + result[i] = array[i]; + } + result +} + +fn push_zero(array: [Field; N]) -> [Field; N + 1] { + let mut result: [Field; N + 1] = std::mem::zeroed(); + for i in 0..N { + result[i] = array[i]; + } + // index N is already zeroed + result +} +``` +> Source code: test_programs/compile_failure/arithmetic_generics_intermediate_underflow/src/main.nr#L1-L32 + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/globals.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/globals.md new file mode 100644 index 00000000000..1145c55dfc7 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/globals.md @@ -0,0 +1,82 @@ +--- +title: Global Variables +description: + Learn about global variables in Noir. Discover how + to declare, modify, and use them in your programs. +keywords: [noir programming language, globals, global variables, constants] +sidebar_position: 8 +--- + +## Globals + + +Noir supports global variables. The global's type can be inferred by the compiler entirely: + +```rust +global N = 5; // Same as `global N: Field = 5` + +global TUPLE = (3, 2); + +fn main() { + assert(N == 5); + assert(N == TUPLE.0 + TUPLE.1); +} +``` + +:::info + +Globals can be defined as any expression, so long as they don't depend on themselves - otherwise there would be a dependency cycle! For example: + +```rust +global T = foo(T); // dependency error +``` + +::: + + +If they are initialized to a literal integer, globals can be used to specify an array's length: + +```rust +global N: u32 = 2; + +fn main(y : [Field; N]) { + assert(y[0] == y[1]) +} +``` + +A global from another module can be imported or referenced externally like any other name: + +```rust +global N = 20; + +fn main() { + assert(my_submodule::N != N); +} + +mod my_submodule { + global N: Field = 10; +} +``` + +When a global is used, Noir replaces the name with its definition on each occurrence. +This means globals defined using function calls will repeat the call each time they're used: + +```rust +global RESULT = foo(); + +fn foo() -> [Field; 100] { ... } +``` + +This is usually fine since Noir will generally optimize any function call that does not +refer to a program input into a constant. It should be kept in mind however, if the called +function performs side-effects like `println`, as these will still occur on each use. + +### Visibility + +By default, like functions, globals are private to the module the exist in. You can use `pub` +to make the global public or `pub(crate)` to make it public to just its crate: + +```rust +// This global is now public +pub global N = 5; +``` \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/lambdas.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/lambdas.md new file mode 100644 index 00000000000..be3c7e0b5ca --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/lambdas.md @@ -0,0 +1,81 @@ +--- +title: Lambdas +description: Learn how to use anonymous functions in Noir programming language. +keywords: [Noir programming language, lambda, closure, function, anonymous function] +sidebar_position: 9 +--- + +## Introduction + +Lambdas are anonymous functions. The syntax is `|arg1, arg2, ..., argN| return_expression`. + +```rust +let add_50 = |val| val + 50; +assert(add_50(100) == 150); +``` + +A block can be used as the body of a lambda, allowing you to declare local variables inside it: + +```rust +let cool = || { + let x = 100; + let y = 100; + x + y +} + +assert(cool() == 200); +``` + +## Closures + +Inside the body of a lambda, you can use variables defined in the enclosing function. Such lambdas are called **closures**. In this example `x` is defined inside `main` and is accessed from within the lambda: + +```rust +fn main() { + let x = 100; + let closure = || x + 150; + assert(closure() == 250); +} +``` + +## Passing closures to higher-order functions + +It may catch you by surprise that the following code fails to compile: + +```rust +fn foo(f: fn () -> Field) -> Field { + f() +} + +fn main() { + let (x, y) = (50, 50); + assert(foo(|| x + y) == 100); // error :( +} +``` + +The reason is that the closure's capture environment affects its type - we have a closure that captures two Fields and `foo` +expects a regular function as an argument - those are incompatible. +:::note + +Variables contained within the `||` are the closure's parameters, and the expression that follows it is the closure's body. The capture environment is comprised of any variables used in the closure's body that are not parameters. + +E.g. in |x| x + y, y would be a captured variable, but x would not be, since it is a parameter of the closure. + +::: +The syntax for the type of a closure is `fn[env](args) -> ret_type`, where `env` is the capture environment of the closure - +in this example that's `(Field, Field)`. + +The best solution in our case is to make `foo` generic over the environment type of its parameter, so that it can be called +with closures with any environment, as well as with regular functions: + +```rust +fn foo(f: fn[Env]() -> Field) -> Field { + f() +} + +fn main() { + let (x, y) = (50, 50); + assert(foo(|| x + y) == 100); // compiles fine + assert(foo(|| 60) == 60); // compiles fine +} +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/mutability.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/mutability.md new file mode 100644 index 00000000000..fdeef6a87c5 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/mutability.md @@ -0,0 +1,121 @@ +--- +title: Mutability +description: + Learn about mutable variables in Noir. Discover how + to declare, modify, and use them in your programs. +keywords: [noir programming language, mutability in noir, mutable variables] +sidebar_position: 8 +--- + +Variables in noir can be declared mutable via the `mut` keyword. Mutable variables can be reassigned +to via an assignment expression. + +```rust +let x = 2; +x = 3; // error: x must be mutable to be assigned to + +let mut y = 3; +let y = 4; // OK +``` + +The `mut` modifier can also apply to patterns: + +```rust +let (a, mut b) = (1, 2); +a = 11; // error: a must be mutable to be assigned to +b = 12; // OK + +let mut (c, d) = (3, 4); +c = 13; // OK +d = 14; // OK + +// etc. +let MyStruct { x: mut y } = MyStruct { x: a }; +// y is now in scope +``` + +Note that mutability in noir is local and everything is passed by value, so if a called function +mutates its parameters then the parent function will keep the old value of the parameters. + +```rust +fn main() -> pub Field { + let x = 3; + helper(x); + x // x is still 3 +} + +fn helper(mut x: i32) { + x = 4; +} +``` + +## Non-local mutability + +Non-local mutability can be achieved through the mutable reference type `&mut T`: + +```rust +fn set_to_zero(x: &mut Field) { + *x = 0; +} + +fn main() { + let mut y = 42; + set_to_zero(&mut y); + assert(*y == 0); +} +``` + +When creating a mutable reference, the original variable being referred to (`y` in this +example) must also be mutable. Since mutable references are a reference type, they must +be explicitly dereferenced via `*` to retrieve the underlying value. Note that this yields +a copy of the value, so mutating this copy will not change the original value behind the +reference: + +```rust +fn main() { + let mut x = 1; + let x_ref = &mut x; + + let mut y = *x_ref; + let y_ref = &mut y; + + x = 2; + *x_ref = 3; + + y = 4; + *y_ref = 5; + + assert(x == 3); + assert(*x_ref == 3); + assert(y == 5); + assert(*y_ref == 5); +} +``` + +Note that types in Noir are actually deeply immutable so the copy that occurs when +dereferencing is only a conceptual copy - no additional constraints will occur. + +Mutable references can also be stored within structs. Note that there is also +no lifetime parameter on these unlike rust. This is because the allocated memory +always lasts the entire program - as if it were an array of one element. + +```rust +struct Foo { + x: &mut Field +} + +impl Foo { + fn incr(mut self) { + *self.x += 1; + } +} + +fn main() { + let foo = Foo { x: &mut 0 }; + foo.incr(); + assert(*foo.x == 1); +} +``` + +In general, you should avoid non-local & shared mutability unless it is needed. Sticking +to only local mutability will improve readability and potentially improve compiler optimizations as well. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/ops.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/ops.md new file mode 100644 index 00000000000..c35c36c38a9 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/ops.md @@ -0,0 +1,98 @@ +--- +title: Logical Operations +description: + Learn about the supported arithmetic and logical operations in the Noir programming language. + Discover how to perform operations on private input types, integers, and booleans. +keywords: + [ + Noir programming language, + supported operations, + arithmetic operations, + logical operations, + predicate operators, + bitwise operations, + short-circuiting, + backend, + ] +sidebar_position: 3 +--- + +# Operations + +## Table of Supported Operations + +| Operation | Description | Requirements | +| :-------- | :------------------------------------------------------------: | -------------------------------------: | +| + | Adds two private input types together | Types must be private input | +| - | Subtracts two private input types together | Types must be private input | +| \* | Multiplies two private input types together | Types must be private input | +| / | Divides two private input types together | Types must be private input | +| ^ | XOR two private input types together | Types must be integer | +| & | AND two private input types together | Types must be integer | +| \| | OR two private input types together | Types must be integer | +| \<\< | Left shift an integer by another integer amount | Types must be integer, shift must be u8 | +| >> | Right shift an integer by another integer amount | Types must be integer, shift must be u8 | +| ! | Bitwise not of a value | Type must be integer or boolean | +| \< | returns a bool if one value is less than the other | Upper bound must have a known bit size | +| \<= | returns a bool if one value is less than or equal to the other | Upper bound must have a known bit size | +| > | returns a bool if one value is more than the other | Upper bound must have a known bit size | +| >= | returns a bool if one value is more than or equal to the other | Upper bound must have a known bit size | +| == | returns a bool if one value is equal to the other | Both types must not be constants | +| != | returns a bool if one value is not equal to the other | Both types must not be constants | + +### Predicate Operators + +`<,<=, !=, == , >, >=` are known as predicate/comparison operations because they compare two values. +This differs from the operations such as `+` where the operands are used in _computation_. + +### Bitwise Operations Example + +```rust +fn main(x : Field) { + let y = x as u32; + let z = y & y; +} +``` + +`z` is implicitly constrained to be the result of `y & y`. The `&` operand is used to denote bitwise +`&`. + +> `x & x` would not compile as `x` is a `Field` and not an integer type. + +### Logical Operators + +Noir has no support for the logical operators `||` and `&&`. This is because encoding the +short-circuiting that these operators require can be inefficient for Noir's backend. Instead you can +use the bitwise operators `|` and `&` which operate identically for booleans, just without the +short-circuiting. + +```rust +let my_val = 5; + +let mut flag = 1; +if (my_val > 6) | (my_val == 0) { + flag = 0; +} +assert(flag == 1); + +if (my_val != 10) & (my_val < 50) { + flag = 0; +} +assert(flag == 0); +``` + +### Shorthand operators + +Noir shorthand operators for most of the above operators, namely `+=, -=, *=, /=, %=, &=, |=, ^=, <<=`, and `>>=`. These allow for more concise syntax. For example: + +```rust +let mut i = 0; +i = i + 1; +``` + +could be written as: + +```rust +let mut i = 0; +i += 1; +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/oracles.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/oracles.mdx new file mode 100644 index 00000000000..77a2ac1550a --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/oracles.mdx @@ -0,0 +1,29 @@ +--- +title: Oracles +description: Dive into how Noir supports Oracles via RPC calls, and learn how to declare an Oracle in Noir with our comprehensive guide. +keywords: + - Noir + - Oracles + - RPC Calls + - Unconstrained Functions + - Programming + - Blockchain +sidebar_position: 6 +--- + +import Experimental from '@site/src/components/Notes/_experimental.mdx'; + + + +Noir has support for Oracles via RPC calls. This means Noir will make an RPC call and use the return value for proof generation. + +Since Oracles are not resolved by Noir, they are [`unconstrained` functions](./unconstrained.md) + +You can declare an Oracle through the `#[oracle()]` flag. Example: + +```rust +#[oracle(get_number_sequence)] +unconstrained fn get_number_sequence(_size: Field) -> [Field] {} +``` + +The timeout for when using an external RPC oracle resolver can be set with the `NARGO_FOREIGN_CALL_TIMEOUT` environment variable. This timeout is in units of milliseconds. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/shadowing.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/shadowing.md new file mode 100644 index 00000000000..5ce6130d201 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/shadowing.md @@ -0,0 +1,44 @@ +--- +title: Shadowing +sidebar_position: 12 +--- + +Noir allows for inheriting variables' values and re-declaring them with the same name similar to Rust, known as shadowing. + +For example, the following function is valid in Noir: + +```rust +fn main() { + let x = 5; + + { + let x = x * 2; + assert (x == 10); + } + + assert (x == 5); +} +``` + +In this example, a variable x is first defined with the value 5. + +The local scope that follows shadows the original x, i.e. creates a local mutable x based on the value of the original x. It is given a value of 2 times the original x. + +When we return to the main scope, x once again refers to just the original x, which stays at the value of 5. + +## Temporal mutability + +One way that shadowing is useful, in addition to ergonomics across scopes, is for temporarily mutating variables. + +```rust +fn main() { + let age = 30; + // age = age + 5; // Would error as `age` is immutable by default. + + let mut age = age + 5; // Temporarily mutates `age` with a new value. + + let age = age; // Locks `age`'s mutability again. + + assert (age == 35); +} +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/traits.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/traits.md new file mode 100644 index 00000000000..5d07e0c68f0 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/traits.md @@ -0,0 +1,475 @@ +--- +title: Traits +description: + Traits in Noir can be used to abstract out a common interface for functions across + several data types. +keywords: [noir programming language, traits, interfaces, generic, protocol] +sidebar_position: 14 +--- + +## Overview + +Traits in Noir are a useful abstraction similar to interfaces or protocols in other languages. Each trait defines +the interface of several methods contained within the trait. Types can then implement this trait by providing +implementations for these methods. For example in the program: + +```rust +struct Rectangle { + width: Field, + height: Field, +} + +impl Rectangle { + fn area(self) -> Field { + self.width * self.height + } +} + +fn log_area(r: Rectangle) { + println(r.area()); +} +``` + +We have a function `log_area` to log the area of a `Rectangle`. Now how should we change the program if we want this +function to work on `Triangle`s as well?: + +```rust +struct Triangle { + width: Field, + height: Field, +} + +impl Triangle { + fn area(self) -> Field { + self.width * self.height / 2 + } +} +``` + +Making `log_area` generic over all types `T` would be invalid since not all types have an `area` method. Instead, we can +introduce a new `Area` trait and make `log_area` generic over all types `T` that implement `Area`: + +```rust +trait Area { + fn area(self) -> Field; +} + +fn log_area(shape: T) where T: Area { + println(shape.area()); +} +``` + +We also need to explicitly implement `Area` for `Rectangle` and `Triangle`. We can do that by changing their existing +impls slightly. Note that the parameter types and return type of each of our `area` methods must match those defined +by the `Area` trait. + +```rust +impl Area for Rectangle { + fn area(self) -> Field { + self.width * self.height + } +} + +impl Area for Triangle { + fn area(self) -> Field { + self.width * self.height / 2 + } +} +``` + +Now we have a working program that is generic over any type of Shape that is used! Others can even use this program +as a library with their own types - such as `Circle` - as long as they also implement `Area` for these types. + +## Where Clauses + +As seen in `log_area` above, when we want to create a function or method that is generic over any type that implements +a trait, we can add a where clause to the generic function. + +```rust +fn log_area(shape: T) where T: Area { + println(shape.area()); +} +``` + +It is also possible to apply multiple trait constraints on the same variable at once by combining traits with the `+` +operator. Similarly, we can have multiple trait constraints by separating each with a comma: + +```rust +fn foo(elements: [T], thing: U) where + T: Default + Add + Eq, + U: Bar, +{ + let mut sum = T::default(); + + for element in elements { + sum += element; + } + + if sum == T::default() { + thing.bar(); + } +} +``` + +## Generic Implementations + +You can add generics to a trait implementation by adding the generic list after the `impl` keyword: + +```rust +trait Second { + fn second(self) -> Field; +} + +impl Second for (T, Field) { + fn second(self) -> Field { + self.1 + } +} +``` + +You can also implement a trait for every type this way: + +```rust +trait Debug { + fn debug(self); +} + +impl Debug for T { + fn debug(self) { + println(self); + } +} + +fn main() { + 1.debug(); +} +``` + +### Generic Trait Implementations With Where Clauses + +Where clauses can be placed on trait implementations themselves to restrict generics in a similar way. +For example, while `impl Foo for T` implements the trait `Foo` for every type, `impl Foo for T where T: Bar` +will implement `Foo` only for types that also implement `Bar`. This is often used for implementing generic types. +For example, here is the implementation for array equality: + +```rust +impl Eq for [T; let N: u32] where T: Eq { + // Test if two arrays have the same elements. + // Because both arrays must have length N, we know their lengths already match. + fn eq(self, other: Self) -> bool { + let mut result = true; + + for i in 0 .. self.len() { + // The T: Eq constraint is needed to call == on the array elements here + result &= self[i] == other[i]; + } + + result + } +} +``` + +Where clauses can also be placed on struct implementations. +For example, here is a method utilizing a generic type that implements the equality trait. + +```rust +struct Foo { + a: u32, + b: T, +} + +impl Foo where T: Eq { + fn eq(self, other: Self) -> bool { + (self.a == other.a) & self.b.eq(other.b) + } +} +``` + +## Generic Traits + +Traits themselves can also be generic by placing the generic arguments after the trait name. These generics are in +scope of every item within the trait. + +```rust +trait Into { + // Convert `self` to type `T` + fn into(self) -> T; +} +``` + +When implementing generic traits the generic arguments of the trait must be specified. This is also true anytime +when referencing a generic trait (e.g. in a `where` clause). + +```rust +struct MyStruct { + array: [Field; 2], +} + +impl Into<[Field; 2]> for MyStruct { + fn into(self) -> [Field; 2] { + self.array + } +} + +fn as_array(x: T) -> [Field; 2] + where T: Into<[Field; 2]> +{ + x.into() +} + +fn main() { + let array = [1, 2]; + let my_struct = MyStruct { array }; + + assert_eq(as_array(my_struct), array); +} +``` + +### Associated Types and Constants + +Traits also support associated types and constraints which can be thought of as additional generics that are referred to by name. + +Here's an example of a trait with an associated type `Foo` and a constant `Bar`: + +```rust +trait MyTrait { + type Foo; + + let Bar: u32; +} +``` + +Now when we're implementing `MyTrait` we also have to provide values for `Foo` and `Bar`: + +```rust +impl MyTrait for Field { + type Foo = i32; + + let Bar: u32 = 11; +} +``` + +Since associated constants can also be used in a type position, its values are limited to only other +expression kinds allowed in numeric generics. + +Note that currently all associated types and constants must be explicitly specified in a trait constraint. +If we leave out any, we'll get an error that we're missing one: + +```rust +// Error! Constraint is missing associated constant for `Bar` +fn foo(x: T) where T: MyTrait { + ... +} +``` + +Because all associated types and constants must be explicitly specified, they are essentially named generics, +although this is set to change in the future. Future versions of Noir will allow users to elide associated types +in trait constraints similar to Rust. When this is done, you may still refer to their value with the `::AssociatedType` +syntax: + +```rust +// Only valid in future versions of Noir: +fn foo(x: T) where T: MyTrait { + let _: ::Foo = ...; +} +``` + +The type as trait syntax is possible in Noir today but is less useful when each type must be explicitly specified anyway: + +```rust +fn foo(x: T) where T: MyTrait { + // Works, but could just use F directly + let _: >::Foo = ...; + + let _: F = ...; +} +``` + +## Trait Methods With No `self` + +A trait can contain any number of methods, each of which have access to the `Self` type which represents each type +that eventually implements the trait. Similarly, the `self` variable is available as well but is not required to be used. +For example, we can define a trait to create a default value for a type. This trait will need to return the `Self` type +but doesn't need to take any parameters: + +```rust +trait Default { + fn default() -> Self; +} +``` + +Implementing this trait can be done similarly to any other trait: + +```rust +impl Default for Field { + fn default() -> Field { + 0 + } +} + +struct MyType {} + +impl Default for MyType { + fn default() -> Field { + MyType {} + } +} +``` + +However, since there is no `self` parameter, we cannot call it via the method call syntax `object.method()`. +Instead, we'll need to refer to the function directly. This can be done either by referring to the +specific impl `MyType::default()` or referring to the trait itself `Default::default()`. In the later +case, type inference determines the impl that is selected. + +```rust +let my_struct = MyStruct::default(); + +let x: Field = Default::default(); +let result = x + Default::default(); +``` + +:::warning + +```rust +let _ = Default::default(); +``` + +If type inference cannot select which impl to use because of an ambiguous `Self` type, an impl will be +arbitrarily selected. This occurs most often when the result of a trait function call with no parameters +is unused. To avoid this, when calling a trait function with no `self` or `Self` parameters or return type, +always refer to it via the implementation type's namespace - e.g. `MyType::default()`. +This is set to change to an error in future Noir versions. + +::: + +## Default Method Implementations + +A trait can also have default implementations of its methods by giving a body to the desired functions. +Note that this body must be valid for all types that may implement the trait. As a result, the only +valid operations on `self` will be operations valid for any type or other operations on the trait itself. + +```rust +trait Numeric { + fn add(self, other: Self) -> Self; + + // Default implementation of double is (self + self) + fn double(self) -> Self { + self.add(self) + } +} +``` + +When implementing a trait with default functions, a type may choose to implement only the required functions: + +```rust +impl Numeric for Field { + fn add(self, other: Field) -> Field { + self + other + } +} +``` + +Or it may implement the optional methods as well: + +```rust +impl Numeric for u32 { + fn add(self, other: u32) -> u32 { + self + other + } + + fn double(self) -> u32 { + self * 2 + } +} +``` + +## Impl Specialization + +When implementing traits for a generic type it is possible to implement the trait for only a certain combination +of generics. This can be either as an optimization or because those specific generics are required to implement the trait. + +```rust +trait Sub { + fn sub(self, other: Self) -> Self; +} + +struct NonZero { + value: T, +} + +impl Sub for NonZero { + fn sub(self, other: Self) -> Self { + let value = self.value - other.value; + assert(value != 0); + NonZero { value } + } +} +``` + +## Overlapping Implementations + +Overlapping implementations are disallowed by Noir to ensure Noir's decision on which impl to select is never ambiguous. +This means if a trait `Foo` is already implemented +by a type `Bar` for all `T`, then we cannot also have a separate impl for `Bar` (or any other +type argument). Similarly, if there is an impl for all `T` such as `impl Debug for T`, we cannot create +any more impls to `Debug` for other types since it would be ambiguous which impl to choose for any given +method call. + +```rust +trait Trait {} + +// Previous impl defined here +impl Trait for (A, B) {} + +// error: Impl for type `(Field, Field)` overlaps with existing impl +impl Trait for (Field, Field) {} +``` + +## Trait Coherence + +Another restriction on trait implementations is coherence. This restriction ensures other crates cannot create +impls that may overlap with other impls, even if several unrelated crates are used as dependencies in the same +program. + +The coherence restriction is: to implement a trait, either the trait itself or the object type must be declared +in the crate the impl is in. + +In practice this often comes up when using types provided by libraries. If a library provides a type `Foo` that does +not implement a trait in the standard library such as `Default`, you may not `impl Default for Foo` in your own crate. +While restrictive, this prevents later issues or silent changes in the program if the `Foo` library later added its +own impl for `Default`. If you are a user of the `Foo` library in this scenario and need a trait not implemented by the +library your choices are to either submit a patch to the library or use the newtype pattern. + +### The Newtype Pattern + +The newtype pattern gets around the coherence restriction by creating a new wrapper type around the library type +that we cannot create `impl`s for. Since the new wrapper type is defined in our current crate, we can create +impls for any trait we need on it. + +```rust +struct Wrapper { + foo: some_library::Foo, +} + +impl Default for Wrapper { + fn default() -> Wrapper { + Wrapper { + foo: some_library::Foo::new(), + } + } +} +``` + +Since we have an impl for our own type, the behavior of this code will not change even if `some_library` is updated +to provide its own `impl Default for Foo`. The downside of this pattern is that it requires extra wrapping and +unwrapping of values when converting to and from the `Wrapper` and `Foo` types. + +### Visibility + +By default, like functions, traits are private to the module the exist in. You can use `pub` +to make the trait public or `pub(crate)` to make it public to just its crate: + +```rust +// This trait is now public +pub trait Trait {} +``` \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/unconstrained.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/unconstrained.md new file mode 100644 index 00000000000..b5221b8d2dd --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/concepts/unconstrained.md @@ -0,0 +1,104 @@ +--- +title: Unconstrained Functions +description: "Learn about what unconstrained functions in Noir are, how to use them and when you'd want to." + +keywords: [Noir programming language, unconstrained, open] +sidebar_position: 5 +--- + +Unconstrained functions are functions which do not constrain any of the included computation and allow for non-deterministic computation. + +## Why? + +Zero-knowledge (ZK) domain-specific languages (DSL) enable developers to generate ZK proofs from their programs by compiling code down to the constraints of an NP complete language (such as R1CS or PLONKish languages). However, the hard bounds of a constraint system can be very limiting to the functionality of a ZK DSL. + +Enabling a circuit language to perform unconstrained execution is a powerful tool. Said another way, unconstrained execution lets developers generate witnesses from code that does not generate any constraints. Being able to execute logic outside of a circuit is critical for both circuit performance and constructing proofs on information that is external to a circuit. + +Fetching information from somewhere external to a circuit can also be used to enable developers to improve circuit efficiency. + +A ZK DSL does not just prove computation, but proves that some computation was handled correctly. Thus, it is necessary that when we switch from performing some operation directly inside of a circuit to inside of an unconstrained environment that the appropriate constraints are still laid down elsewhere in the circuit. + +## Example + +An in depth example might help drive the point home. This example comes from the excellent [post](https://discord.com/channels/1113924620781883405/1124022445054111926/1128747641853972590) by Tom in the Noir Discord. + +Let's look at how we can optimize a function to turn a `u72` into an array of `u8`s. + +```rust +fn main(num: u72) -> pub [u8; 8] { + let mut out: [u8; 8] = [0; 8]; + for i in 0..8 { + out[i] = (num >> (56 - (i * 8)) as u72 & 0xff) as u8; + } + + out +} +``` + +``` +Total ACIR opcodes generated for language PLONKCSat { width: 3 }: 91 +Backend circuit size: 3619 +``` + +A lot of the operations in this function are optimized away by the compiler (all the bit-shifts turn into divisions by constants). However we can save a bunch of gates by casting to u8 a bit earlier. This automatically truncates the bit-shifted value to fit in a u8 which allows us to remove the AND against 0xff. This saves us ~480 gates in total. + +```rust +fn main(num: u72) -> pub [u8; 8] { + let mut out: [u8; 8] = [0; 8]; + for i in 0..8 { + out[i] = (num >> (56 - (i * 8)) as u8; + } + + out +} +``` + +``` +Total ACIR opcodes generated for language PLONKCSat { width: 3 }: 75 +Backend circuit size: 3143 +``` + +Those are some nice savings already but we can do better. This code is all constrained so we're proving every step of calculating out using num, but we don't actually care about how we calculate this, just that it's correct. This is where brillig comes in. + +It turns out that truncating a u72 into a u8 is hard to do inside a snark, each time we do as u8 we lay down 4 ACIR opcodes which get converted into multiple gates. It's actually much easier to calculate num from out than the other way around. All we need to do is multiply each element of out by a constant and add them all together, both relatively easy operations inside a snark. + +We can then run `u72_to_u8` as unconstrained brillig code in order to calculate out, then use that result in our constrained function and assert that if we were to do the reverse calculation we'd get back num. This looks a little like the below: + +```rust +fn main(num: u72) -> pub [u8; 8] { + let out = unsafe { + u72_to_u8(num) + }; + + let mut reconstructed_num: u72 = 0; + for i in 0..8 { + reconstructed_num += (out[i] as u72 << (56 - (8 * i))); + } + assert(num == reconstructed_num); + out +} + +unconstrained fn u72_to_u8(num: u72) -> [u8; 8] { + let mut out: [u8; 8] = [0; 8]; + for i in 0..8 { + out[i] = (num >> (56 - (i * 8))) as u8; + } + out +} +``` + +``` +Total ACIR opcodes generated for language PLONKCSat { width: 3 }: 78 +Backend circuit size: 2902 +``` + +This ends up taking off another ~250 gates from our circuit! We've ended up with more ACIR opcodes than before but they're easier for the backend to prove (resulting in fewer gates). + +Note that in order to invoke unconstrained functions we need to wrap them in an `unsafe` block, +to make it clear that the call is unconstrained. + +Generally we want to use brillig whenever there's something that's easy to verify but hard to compute within the circuit. For example, if you wanted to calculate a square root of a number it'll be a much better idea to calculate this in brillig and then assert that if you square the result you get back your number. + +## Break and Continue + +In addition to loops over runtime bounds, `break` and `continue` are also available in unconstrained code. See [break and continue](../concepts/control_flow.md#break-and-continue) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/modules_packages_crates/_category_.json b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/modules_packages_crates/_category_.json new file mode 100644 index 00000000000..1debcfe7675 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/modules_packages_crates/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Modules, Packages and Crates", + "position": 2, + "collapsible": true, + "collapsed": true +} diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/modules_packages_crates/crates_and_packages.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/modules_packages_crates/crates_and_packages.md new file mode 100644 index 00000000000..95ee9f52ab2 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/modules_packages_crates/crates_and_packages.md @@ -0,0 +1,43 @@ +--- +title: Crates and Packages +description: Learn how to use Crates and Packages in your Noir project +keywords: [Nargo, dependencies, package management, crates, package] +sidebar_position: 0 +--- + +## Crates + +A crate is the smallest amount of code that the Noir compiler considers at a time. +Crates can contain modules, and the modules may be defined in other files that get compiled with the crate, as we’ll see in the coming sections. + +### Crate Types + +A Noir crate can come in several forms: binaries, libraries or contracts. + +#### Binaries + +_Binary crates_ are programs which you can compile to an ACIR circuit which you can then create proofs against. Each must have a function called `main` that defines the ACIR circuit which is to be proved. + +#### Libraries + +_Library crates_ don't have a `main` function and they don't compile down to ACIR. Instead they define functionality intended to be shared with multiple projects, and eventually included in a binary crate. + +#### Contracts + +Contract crates are similar to binary crates in that they compile to ACIR which you can create proofs against. They are different in that they do not have a single `main` function, but are a collection of functions to be deployed to the [Aztec network](https://aztec.network). You can learn more about the technical details of Aztec in the [monorepo](https://github.com/AztecProtocol/aztec-packages) or contract [examples](https://github.com/AztecProtocol/aztec-packages/tree/master/noir-projects/noir-contracts/contracts). + +### Crate Root + +Every crate has a root, which is the source file that the compiler starts, this is also known as the root module. The Noir compiler does not enforce any conditions on the name of the file which is the crate root, however if you are compiling via Nargo the crate root must be called `lib.nr` or `main.nr` for library or binary crates respectively. + +## Packages + +A Nargo _package_ is a collection of one of more crates that provides a set of functionality. A package must include a Nargo.toml file. + +A package _must_ contain either a library or a binary crate, but not both. + +### Differences from Cargo Packages + +One notable difference between Rust's Cargo and Noir's Nargo is that while Cargo allows a package to contain an unlimited number of binary crates and a single library crate, Nargo currently only allows a package to contain a single crate. + +In future this restriction may be lifted to allow a Nargo package to contain both a binary and library crate or multiple binary crates. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/modules_packages_crates/dependencies.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/modules_packages_crates/dependencies.md new file mode 100644 index 00000000000..24e02de08fe --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/modules_packages_crates/dependencies.md @@ -0,0 +1,124 @@ +--- +title: Dependencies +description: + Learn how to specify and manage dependencies in Nargo, allowing you to upload packages to GitHub + and use them easily in your project. +keywords: [Nargo, dependencies, GitHub, package management, versioning] +sidebar_position: 1 +--- + +Nargo allows you to upload packages to GitHub and use them as dependencies. + +## Specifying a dependency + +Specifying a dependency requires a tag to a specific commit and the git url to the url containing +the package. + +Currently, there are no requirements on the tag contents. If requirements are added, it would follow +semver 2.0 guidelines. + +> Note: Without a `tag` , there would be no versioning and dependencies would change each time you +> compile your project. + +For example, to add the [ecrecover-noir library](https://github.com/colinnielsen/ecrecover-noir) to your project, add it to `Nargo.toml`: + +```toml +# Nargo.toml + +[dependencies] +ecrecover = {tag = "v0.8.0", git = "https://github.com/colinnielsen/ecrecover-noir"} +``` + +If the module is in a subdirectory, you can define a subdirectory in your git repository, for example: + +```toml +# Nargo.toml + +[dependencies] +easy_private_token_contract = {tag ="v0.1.0-alpha62", git = "https://github.com/AztecProtocol/aztec-packages", directory = "noir-contracts/contracts/easy_private_token_contract"} +``` + +## Specifying a local dependency + +You can also specify dependencies that are local to your machine. + +For example, this file structure has a library and binary crate + +```tree +├── binary_crate +│   ├── Nargo.toml +│   └── src +│   └── main.nr +└── lib_a + ├── Nargo.toml + └── src + └── lib.nr +``` + +Inside of the binary crate, you can specify: + +```toml +# Nargo.toml + +[dependencies] +lib_a = { path = "../lib_a" } +``` + +## Importing dependencies + +You can import a dependency to a Noir file using the following syntax. For example, to import the +ecrecover-noir library and local lib_a referenced above: + +```rust +use ecrecover; +use lib_a; +``` + +You can also import only the specific parts of dependency that you want to use, like so: + +```rust +use std::hash::sha256; +use std::scalar_mul::fixed_base_embedded_curve; +``` + +Lastly, as demonstrated in the +[elliptic curve example](../standard_library/cryptographic_primitives/ec_primitives.md#examples), you +can import multiple items in the same line by enclosing them in curly braces: + +```rust +use std::ec::tecurve::affine::{Curve, Point}; +``` + +We don't have a way to consume libraries from inside a [workspace](./workspaces.md) as external dependencies right now. + +Inside a workspace, these are consumed as `{ path = "../to_lib" }` dependencies in Nargo.toml. + +## Dependencies of Dependencies + +Note that when you import a dependency, you also get access to all of the dependencies of that package. + +For example, the [phy_vector](https://github.com/resurgencelabs/phy_vector) library imports an [fraction](https://github.com/resurgencelabs/fraction) library. If you're importing the phy_vector library, then you can access the functions in fractions library like so: + +```rust +use phy_vector; + +fn main(x : Field, y : pub Field) { + //... + let f = phy_vector::fraction::toFraction(true, 2, 1); + //... +} +``` + +## Available Libraries + +Noir does not currently have an official package manager. You can find a list of available Noir libraries in the [awesome-noir repo here](https://github.com/noir-lang/awesome-noir#libraries). + +Some libraries that are available today include: + +- [Standard Library](https://github.com/noir-lang/noir/tree/master/noir_stdlib) - the Noir Standard Library +- [Ethereum Storage Proof Verification](https://github.com/aragonzkresearch/noir-trie-proofs) - a library that contains the primitives necessary for RLP decoding (in the form of look-up table construction) and Ethereum state and storage proof verification (or verification of any trie proof involving 32-byte long keys) +- [BigInt](https://github.com/shuklaayush/noir-bigint) - a library that provides a custom BigUint56 data type, allowing for computations on large unsigned integers +- [ECrecover](https://github.com/colinnielsen/ecrecover-noir/tree/main) - a library to verify an ECDSA signature and return the source Ethereum address +- [Sparse Merkle Tree Verifier](https://github.com/vocdoni/smtverifier-noir/tree/main) - a library for verification of sparse Merkle trees +- [Signed Int](https://github.com/resurgencelabs/signed_int) - a library for accessing a custom Signed Integer data type, allowing access to negative numbers on Noir +- [Fraction](https://github.com/resurgencelabs/fraction) - a library for accessing fractional number data type in Noir, allowing results that aren't whole numbers diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/modules_packages_crates/modules.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/modules_packages_crates/modules.md new file mode 100644 index 00000000000..05399c38b4c --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/modules_packages_crates/modules.md @@ -0,0 +1,221 @@ +--- +title: Modules +description: + Learn how to organize your files using modules in Noir, following the same convention as Rust's + module system. Examples included. +keywords: [Noir, Rust, modules, organizing files, sub-modules] +sidebar_position: 2 +--- + +Noir's module system follows the same convention as the _newer_ version of Rust's module system. + +## Purpose of Modules + +Modules are used to organize files. Without modules all of your code would need to live in a single +file. In Noir, the compiler does not automatically scan all of your files to detect modules. This +must be done explicitly by the developer. + +## Examples + +### Importing a module in the crate root + +Filename : `src/main.nr` + +```rust +mod foo; + +fn main() { + foo::hello_world(); +} +``` + +Filename : `src/foo.nr` + +```rust +fn from_foo() {} +``` + +In the above snippet, the crate root is the `src/main.nr` file. The compiler sees the module +declaration `mod foo` which prompts it to look for a foo.nr file. + +Visually this module hierarchy looks like the following : + +``` +crate + ├── main + │ + └── foo + └── from_foo + +``` + +The module filename may also be the name of the module as a directory with the contents in a +file named `mod.nr` within that directory. The above example can alternatively be expressed like this: + +Filename : `src/main.nr` + +```rust +mod foo; + +fn main() { + foo::hello_world(); +} +``` + +Filename : `src/foo/mod.nr` + +```rust +fn from_foo() {} +``` + +Note that it's an error to have both files `src/foo.nr` and `src/foo/mod.nr` in the filesystem. + +### Importing a module throughout the tree + +All modules are accessible from the `crate::` namespace. + +``` +crate + ├── bar + ├── foo + └── main + +``` + +In the above snippet, if `bar` would like to use functions in `foo`, it can do so by `use crate::foo::function_name`. + +### Sub-modules + +Filename : `src/main.nr` + +```rust +mod foo; + +fn main() { + foo::from_foo(); +} +``` + +Filename : `src/foo.nr` + +```rust +mod bar; +fn from_foo() {} +``` + +Filename : `src/foo/bar.nr` + +```rust +fn from_bar() {} +``` + +In the above snippet, we have added an extra module to the module tree; `bar`. `bar` is a submodule +of `foo` hence we declare bar in `foo.nr` with `mod bar`. Since `foo` is not the crate root, the +compiler looks for the file associated with the `bar` module in `src/foo/bar.nr` + +Visually the module hierarchy looks as follows: + +``` +crate + ├── main + │ + └── foo + ├── from_foo + └── bar + └── from_bar +``` + +Similar to importing a module in the crate root, modules can be placed in a `mod.nr` file, like this: + +Filename : `src/main.nr` + +```rust +mod foo; + +fn main() { + foo::from_foo(); +} +``` + +Filename : `src/foo/mod.nr` + +```rust +mod bar; +fn from_foo() {} +``` + +Filename : `src/foo/bar/mod.nr` + +```rust +fn from_bar() {} +``` + +### Referencing a parent module + +Given a submodule, you can refer to its parent module using the `super` keyword. + +Filename : `src/main.nr` + +```rust +mod foo; + +fn main() { + foo::from_foo(); +} +``` + +Filename : `src/foo.nr` + +```rust +mod bar; + +fn from_foo() {} +``` + +Filename : `src/foo/bar.nr` + +```rust +// Same as bar::from_foo +use super::from_foo; + +fn from_bar() { + from_foo(); // invokes super::from_foo(), which is bar::from_foo() + super::from_foo(); // also invokes bar::from_foo() +} +``` + +### `use` visibility + +`use` declarations are private to the containing module, by default. However, like functions, +they can be marked as `pub` or `pub(crate)`. Such a use declaration serves to _re-export_ a name. +A public `use` declaration can therefore redirect some public name to a different target definition: +even a definition with a private canonical path, inside a different module. + +An example of re-exporting: + +```rust +mod some_module { + pub use foo::{bar, baz}; + mod foo { + pub fn bar() {} + pub fn baz() {} + } +} + +fn main() { + some_module::bar(); + some_module::baz(); +} +``` + +In this example, the module `some_module` re-exports two public names defined in `foo`. + +### Visibility + +By default, like functions, modules are private to the module (or crate) the exist in. You can use `pub` +to make the module public or `pub(crate)` to make it public to just its crate: + +```rust +// This module is now public and can be seen by other crates. +pub mod foo; +``` \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/modules_packages_crates/workspaces.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/modules_packages_crates/workspaces.md new file mode 100644 index 00000000000..513497f12bf --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/modules_packages_crates/workspaces.md @@ -0,0 +1,42 @@ +--- +title: Workspaces +sidebar_position: 3 +--- + +Workspaces are a feature of nargo that allow you to manage multiple related Noir packages in a single repository. A workspace is essentially a group of related projects that share common build output directories and configurations. + +Each Noir project (with it's own Nargo.toml file) can be thought of as a package. Each package is expected to contain exactly one "named circuit", being the "name" defined in Nargo.toml with the program logic defined in `./src/main.nr`. + +For a project with the following structure: + +```tree +├── crates +│ ├── a +│ │ ├── Nargo.toml +│ │ └── Prover.toml +│ │ └── src +│ │ └── main.nr +│ └── b +│ ├── Nargo.toml +│ └── Prover.toml +│ └── src +│ └── main.nr +│ +└── Nargo.toml +``` + +You can define a workspace in Nargo.toml like so: + +```toml +[workspace] +members = ["crates/a", "crates/b"] +default-member = "crates/a" +``` + +`members` indicates which packages are included in the workspace. As such, all member packages of a workspace will be processed when the `--workspace` flag is used with various commands or if a `default-member` is not specified. + +`default-member` indicates which package various commands process by default. + +Libraries can be defined in a workspace. Inside a workspace, these are consumed as `{ path = "../to_lib" }` dependencies in Nargo.toml. + +Inside a workspace, these are consumed as `{ path = "../to_lib" }` dependencies in Nargo.toml. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/_category_.json b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/_category_.json new file mode 100644 index 00000000000..af04c0933fd --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Standard Library", + "position": 1, + "collapsible": true, + "collapsed": true +} diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/bigint.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/bigint.md new file mode 100644 index 00000000000..b16fed4ed96 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/bigint.md @@ -0,0 +1,127 @@ +--- +title: Big Integers +description: How to use big integers from Noir standard library +keywords: + [ + Big Integer, + Noir programming language, + Noir libraries, + ] +--- + +The BigInt module in the standard library exposes some class of integers which do not fit (well) into a Noir native field. It implements modulo arithmetic, modulo a 'big' prime number. + +:::note + +The module can currently be considered as `Field`s with fixed modulo sizes used by a set of elliptic curves, in addition to just the native curve. [More work](https://github.com/noir-lang/noir/issues/510) is needed to achieve arbitrarily sized big integers. + +:::note + +`nargo` can be built with `--profile release-pedantic` to enable extra overflow checks which may affect `BigInt` results in some cases. +Consider the [`noir-bignum`](https://github.com/noir-lang/noir-bignum) library for an optimized alternative approach. + +::: + +Currently 6 classes of integers (i.e 'big' prime numbers) are available in the module, namely: + +- BN254 Fq: Bn254Fq +- BN254 Fr: Bn254Fr +- Secp256k1 Fq: Secpk1Fq +- Secp256k1 Fr: Secpk1Fr +- Secp256r1 Fr: Secpr1Fr +- Secp256r1 Fq: Secpr1Fq + +Where XXX Fq and XXX Fr denote respectively the order of the base and scalar field of the (usual) elliptic curve XXX. +For instance the big integer 'Secpk1Fq' in the standard library refers to integers modulo $2^{256}-2^{32}-977$. + +Feel free to explore the source code for the other primes: + +```rust title="big_int_definition" showLineNumbers +pub struct BigInt { + pointer: u32, + modulus: u32, +} +``` +> Source code: noir_stdlib/src/bigint.nr#L14-L19 + + +## Example usage + +A common use-case is when constructing a big integer from its bytes representation, and performing arithmetic operations on it: + +```rust title="big_int_example" showLineNumbers +fn big_int_example(x: u8, y: u8) { + let a = Secpk1Fq::from_le_bytes(&[x, y, 0, 45, 2]); + let b = Secpk1Fq::from_le_bytes(&[y, x, 9]); + let c = (a + b) * b / a; + let d = c.to_le_bytes(); + println(d[0]); +} +``` +> Source code: test_programs/execution_success/bigint/src/main.nr#L72-L80 + + +## Methods + +The available operations for each big integer are: + +### from_le_bytes + +Construct a big integer from its little-endian bytes representation. Example: + +```rust + // Construct a big integer from a slice of bytes + let a = Secpk1Fq::from_le_bytes(&[x, y, 0, 45, 2]); + // Construct a big integer from an array of 32 bytes + let a = Secpk1Fq::from_le_bytes_32([1;32]); + ``` + +Sure, here's the formatted version of the remaining methods: + +### to_le_bytes + +Return the little-endian bytes representation of a big integer. Example: + +```rust +let bytes = a.to_le_bytes(); +``` + +### add + +Add two big integers. Example: + +```rust +let sum = a + b; +``` + +### sub + +Subtract two big integers. Example: + +```rust +let difference = a - b; +``` + +### mul + +Multiply two big integers. Example: + +```rust +let product = a * b; +``` + +### div + +Divide two big integers. Note that division is field division and not euclidean division. Example: + +```rust +let quotient = a / b; +``` + +### eq + +Compare two big integers. Example: + +```rust +let are_equal = a == b; +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/black_box_fns.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/black_box_fns.md new file mode 100644 index 00000000000..d6079ab182c --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/black_box_fns.md @@ -0,0 +1,32 @@ +--- +title: Black Box Functions +description: Black box functions are functions in Noir that rely on backends implementing support for specialized constraints. +keywords: [noir, black box functions] +--- + +Black box functions are functions in Noir that rely on backends implementing support for specialized constraints. This makes certain zk-snark unfriendly computations cheaper than if they were implemented in Noir. + +The ACVM spec defines a set of blackbox functions which backends will be expected to implement. This allows backends to use optimized implementations of these constraints if they have them, however they may also fallback to less efficient naive implementations if not. + +## Function list + +Here is a list of the current black box functions: + +- [AES128](./cryptographic_primitives/ciphers.mdx#aes128) +- [SHA256](./cryptographic_primitives/hashes.mdx#sha256) +- [Schnorr signature verification](./cryptographic_primitives/schnorr.mdx) +- [Blake2s](./cryptographic_primitives/hashes.mdx#blake2s) +- [Blake3](./cryptographic_primitives/hashes.mdx#blake3) +- [Pedersen Hash](./cryptographic_primitives/hashes.mdx#pedersen_hash) +- [Pedersen Commitment](./cryptographic_primitives/hashes.mdx#pedersen_commitment) +- [ECDSA signature verification](./cryptographic_primitives/ecdsa_sig_verification.mdx) +- [Embedded curve operations (MSM, addition, ...)](./cryptographic_primitives/embedded_curve_ops.mdx) +- AND +- XOR +- RANGE +- [Keccak256](./cryptographic_primitives/hashes.mdx#keccak256) +- [Recursive proof verification](./recursion.mdx) + +Most black box functions are included as part of the Noir standard library, however `AND`, `XOR` and `RANGE` are used as part of the Noir language syntax. For instance, using the bitwise operator `&` will invoke the `AND` black box function. + +You can view the black box functions defined in the ACVM code [here](https://github.com/noir-lang/noir/blob/master/acvm-repo/acir/src/circuit/black_box_functions.rs). diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/bn254.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/bn254.md new file mode 100644 index 00000000000..3294f005dbb --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/bn254.md @@ -0,0 +1,46 @@ +--- +title: Bn254 Field Library +--- + +Noir provides a module in standard library with some optimized functions for bn254 Fr in `std::field::bn254`. + +## decompose + +```rust +fn decompose(x: Field) -> (Field, Field) {} +``` + +Decomposes a single field into two fields, low and high. The low field contains the lower 16 bytes of the input field and the high field contains the upper 16 bytes of the input field. Both field results are range checked to 128 bits. + + +## assert_gt + +```rust +fn assert_gt(a: Field, b: Field) {} +``` + +Asserts that a > b. This will generate less constraints than using `assert(gt(a, b))`. + +## assert_lt + +```rust +fn assert_lt(a: Field, b: Field) {} +``` + +Asserts that a < b. This will generate less constraints than using `assert(lt(a, b))`. + +## gt + +```rust +fn gt(a: Field, b: Field) -> bool {} +``` + +Returns true if a > b. + +## lt + +```rust +fn lt(a: Field, b: Field) -> bool {} +``` + +Returns true if a < b. \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/containers/boundedvec.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/containers/boundedvec.md new file mode 100644 index 00000000000..b20b49f863c --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/containers/boundedvec.md @@ -0,0 +1,419 @@ +--- +title: Bounded Vectors +keywords: [noir, vector, bounded vector, slice] +sidebar_position: 1 +--- + +A `BoundedVec` is a growable storage similar to a `Vec` except that it +is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented +via slices and thus is not subject to the same restrictions slices are (notably, nested +slices - and thus nested vectors as well - are disallowed). + +Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by +pushing an additional element is also more efficient - the length only needs to be increased +by one. + +For these reasons `BoundedVec` should generally be preferred over `Vec` when there +is a reasonable maximum bound that can be placed on the vector. + +Example: + +```rust +let mut vector: BoundedVec = BoundedVec::new(); +for i in 0..5 { + vector.push(i); +} +assert(vector.len() == 5); +assert(vector.max_len() == 10); +``` + +## Methods + +### new + +```rust +pub fn new() -> Self +``` + +Creates a new, empty vector of length zero. + +Since this container is backed by an array internally, it still needs an initial value +to give each element. To resolve this, each element is zeroed internally. This value +is guaranteed to be inaccessible unless `get_unchecked` is used. + +Example: + +```rust +let empty_vector: BoundedVec = BoundedVec::new(); +assert(empty_vector.len() == 0); +``` + +Note that whenever calling `new` the maximum length of the vector should always be specified +via a type signature: + +```rust title="new_example" showLineNumbers +fn good() -> BoundedVec { + // Ok! MaxLen is specified with a type annotation + let v1: BoundedVec = BoundedVec::new(); + let v2 = BoundedVec::new(); + + // Ok! MaxLen is known from the type of `good`'s return value + v2 +} + +fn bad() { + // Error: Type annotation needed + // The compiler can't infer `MaxLen` from this code. + let mut v3 = BoundedVec::new(); + v3.push(5); +} +``` +> Source code: test_programs/noir_test_success/bounded_vec/src/main.nr#L11-L27 + + +This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions +but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a constraint failure at runtime when the vec is pushed to. + +### get + +```rust +pub fn get(self, index: u64) -> T { +``` + +Retrieves an element from the vector at the given index, starting from zero. + +If the given index is equal to or greater than the length of the vector, this +will issue a constraint failure. + +Example: + +```rust +fn foo(v: BoundedVec) { + let first = v.get(0); + let last = v.get(v.len() - 1); + assert(first != last); +} +``` + +### get_unchecked + +```rust +pub fn get_unchecked(self, index: u64) -> T { +``` + +Retrieves an element from the vector at the given index, starting from zero, without +performing a bounds check. + +Since this function does not perform a bounds check on length before accessing the element, +it is unsafe! Use at your own risk! + +Example: + +```rust title="get_unchecked_example" showLineNumbers +fn sum_of_first_three(v: BoundedVec) -> u32 { + // Always ensure the length is larger than the largest + // index passed to get_unchecked + assert(v.len() > 2); + let first = v.get_unchecked(0); + let second = v.get_unchecked(1); + let third = v.get_unchecked(2); + first + second + third +} +``` +> Source code: test_programs/noir_test_success/bounded_vec/src/main.nr#L54-L64 + + +### set + +```rust +pub fn set(&mut self: Self, index: u64, value: T) { +``` + +Writes an element to the vector at the given index, starting from zero. + +If the given index is equal to or greater than the length of the vector, this will issue a constraint failure. + +Example: + +```rust +fn foo(v: BoundedVec) { + let first = v.get(0); + assert(first != 42); + v.set(0, 42); + let new_first = v.get(0); + assert(new_first == 42); +} +``` + +### set_unchecked + +```rust +pub fn set_unchecked(&mut self: Self, index: u64, value: T) -> T { +``` + +Writes an element to the vector at the given index, starting from zero, without performing a bounds check. + +Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk! + +Example: + +```rust title="set_unchecked_example" showLineNumbers +fn set_unchecked_example() { + let mut vec: BoundedVec = BoundedVec::new(); + vec.extend_from_array([1, 2]); + + // Here we're safely writing within the valid range of `vec` + // `vec` now has the value [42, 2] + vec.set_unchecked(0, 42); + + // We can then safely read this value back out of `vec`. + // Notice that we use the checked version of `get` which would prevent reading unsafe values. + assert_eq(vec.get(0), 42); + + // We've now written past the end of `vec`. + // As this index is still within the maximum potential length of `v`, + // it won't cause a constraint failure. + vec.set_unchecked(2, 42); + println(vec); + + // This will write past the end of the maximum potential length of `vec`, + // it will then trigger a constraint failure. + vec.set_unchecked(5, 42); + println(vec); +} +``` +> Source code: test_programs/noir_test_success/bounded_vec/src/main.nr#L67-L91 + + + +### push + +```rust +pub fn push(&mut self, elem: T) { +``` + +Pushes an element to the end of the vector. This increases the length +of the vector by one. + +Panics if the new length of the vector will be greater than the max length. + +Example: + +```rust title="bounded-vec-push-example" showLineNumbers +let mut v: BoundedVec = BoundedVec::new(); + + v.push(1); + v.push(2); + + // Panics with failed assertion "push out of bounds" + v.push(3); +``` +> Source code: test_programs/noir_test_success/bounded_vec/src/main.nr#L95-L103 + + +### pop + +```rust +pub fn pop(&mut self) -> T +``` + +Pops the element at the end of the vector. This will decrease the length +of the vector by one. + +Panics if the vector is empty. + +Example: + +```rust title="bounded-vec-pop-example" showLineNumbers +let mut v: BoundedVec = BoundedVec::new(); + v.push(1); + v.push(2); + + let two = v.pop(); + let one = v.pop(); + + assert(two == 2); + assert(one == 1); + // error: cannot pop from an empty vector + // let _ = v.pop(); +``` +> Source code: test_programs/noir_test_success/bounded_vec/src/main.nr#L108-L120 + + +### len + +```rust +pub fn len(self) -> u64 { +``` + +Returns the current length of this vector + +Example: + +```rust title="bounded-vec-len-example" showLineNumbers +let mut v: BoundedVec = BoundedVec::new(); + assert(v.len() == 0); + + v.push(100); + assert(v.len() == 1); + + v.push(200); + v.push(300); + v.push(400); + assert(v.len() == 4); + + let _ = v.pop(); + let _ = v.pop(); + assert(v.len() == 2); +``` +> Source code: test_programs/noir_test_success/bounded_vec/src/main.nr#L125-L140 + + +### max_len + +```rust +pub fn max_len(_self: BoundedVec) -> u64 { +``` + +Returns the maximum length of this vector. This is always +equal to the `MaxLen` parameter this vector was initialized with. + +Example: + +```rust title="bounded-vec-max-len-example" showLineNumbers +let mut v: BoundedVec = BoundedVec::new(); + + assert(v.max_len() == 5); + v.push(10); + assert(v.max_len() == 5); +``` +> Source code: test_programs/noir_test_success/bounded_vec/src/main.nr#L145-L151 + + +### storage + +```rust +pub fn storage(self) -> [T; MaxLen] { +``` + +Returns the internal array within this vector. +Since arrays in Noir are immutable, mutating the returned storage array will not mutate +the storage held internally by this vector. + +Note that uninitialized elements may be zeroed out! + +Example: + +```rust title="bounded-vec-storage-example" showLineNumbers +let mut v: BoundedVec = BoundedVec::new(); + + assert(v.storage() == [0, 0, 0, 0, 0]); + + v.push(57); + assert(v.storage() == [57, 0, 0, 0, 0]); +``` +> Source code: test_programs/noir_test_success/bounded_vec/src/main.nr#L156-L163 + + +### extend_from_array + +```rust +pub fn extend_from_array(&mut self, array: [T; Len]) +``` + +Pushes each element from the given array to this vector. + +Panics if pushing each element would cause the length of this vector +to exceed the maximum length. + +Example: + +```rust title="bounded-vec-extend-from-array-example" showLineNumbers +let mut vec: BoundedVec = BoundedVec::new(); + vec.extend_from_array([2, 4]); + + assert(vec.len == 2); + assert(vec.get(0) == 2); + assert(vec.get(1) == 4); +``` +> Source code: test_programs/noir_test_success/bounded_vec/src/main.nr#L168-L175 + + +### extend_from_bounded_vec + +```rust +pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) +``` + +Pushes each element from the other vector to this vector. The length of +the other vector is left unchanged. + +Panics if pushing each element would cause the length of this vector +to exceed the maximum length. + +Example: + +```rust title="bounded-vec-extend-from-bounded-vec-example" showLineNumbers +let mut v1: BoundedVec = BoundedVec::new(); + let mut v2: BoundedVec = BoundedVec::new(); + + v2.extend_from_array([1, 2, 3]); + v1.extend_from_bounded_vec(v2); + + assert(v1.storage() == [1, 2, 3, 0, 0]); + assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]); +``` +> Source code: test_programs/noir_test_success/bounded_vec/src/main.nr#L180-L189 + + +### from_array + +```rust +pub fn from_array(array: [T; Len]) -> Self +``` + +Creates a new vector, populating it with values derived from an array input. +The maximum length of the vector is determined based on the type signature. + +Example: +```rust +let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3]) +``` + +### map + +```rust +pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec +``` + +Creates a new vector of equal size by calling a closure on each element in this vector. + +Example: + +```rust title="bounded-vec-map-example" showLineNumbers +let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]); + let result = vec.map(|value| value * 2); +``` +> Source code: noir_stdlib/src/collections/bounded_vec.nr#L493-L496 + + +### any + +```rust +pub fn any(self, predicate: fn[Env](T) -> bool) -> bool +``` + +Returns true if the given predicate returns true for any element +in this vector. + +Example: + +```rust title="bounded-vec-any-example" showLineNumbers +let mut v: BoundedVec = BoundedVec::new(); + v.extend_from_array([2, 4, 6]); + + let all_even = !v.any(|elem: u32| elem % 2 != 0); + assert(all_even); +``` +> Source code: test_programs/noir_test_success/bounded_vec/src/main.nr#L256-L262 + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/containers/hashmap.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/containers/hashmap.md new file mode 100644 index 00000000000..39f1ae9b32c --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/containers/hashmap.md @@ -0,0 +1,594 @@ +--- +title: HashMap +keywords: [noir, map, hash, hashmap] +sidebar_position: 1 +--- + +`HashMap` is used to efficiently store and look up key-value pairs. + +`HashMap` is a bounded type which can store anywhere from zero to `MaxLen` total elements. +Note that due to hash collisions, the actual maximum number of elements stored by any particular +hashmap is likely lower than `MaxLen`. This is true even with cryptographic hash functions since +every hash value will be performed modulo `MaxLen`. + +Example: + +```rust +// Create a mapping from Fields to u32s with a maximum length of 12 +// using a poseidon2 hasher +use std::hash::poseidon2::Poseidon2Hasher; +let mut map: HashMap> = HashMap::default(); + +map.insert(1, 2); +map.insert(3, 4); + +let two = map.get(1).unwrap(); +``` + +## Methods + +### default + +```rust title="default" showLineNumbers +impl Default for HashMap +where + B: BuildHasher + Default, + H: Hasher + Default { + /// Constructs an empty HashMap. + /// + /// Example: + /// + /// ```noir + /// let hashmap: HashMap> = HashMap::default(); + /// assert(hashmap.is_empty()); + /// ``` + fn default() -> Self { +``` +> Source code: noir_stdlib/src/collections/map.nr#L694-L708 + + +Creates a fresh, empty HashMap. + +When using this function, always make sure to specify the maximum size of the hash map. + +This is the same `default` from the `Default` implementation given further below. It is +repeated here for convenience since it is the recommended way to create a hashmap. + +Example: + +```rust title="default_example" showLineNumbers +let hashmap: HashMap> = HashMap::default(); + assert(hashmap.is_empty()); +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L201-L204 + + +Because `HashMap` has so many generic arguments that are likely to be the same throughout +your program, it may be helpful to create a type alias: + +```rust title="type_alias" showLineNumbers +type MyMap = HashMap>; +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L195-L197 + + +### with_hasher + +```rust title="with_hasher" showLineNumbers +pub fn with_hasher(_build_hasher: B) -> Self + where + B: BuildHasher { +``` +> Source code: noir_stdlib/src/collections/map.nr#L103-L107 + + +Creates a hashmap with an existing `BuildHasher`. This can be used to ensure multiple +hashmaps are created with the same hasher instance. + +Example: + +```rust title="with_hasher_example" showLineNumbers +let my_hasher: BuildHasherDefault = Default::default(); + let hashmap: HashMap> = HashMap::with_hasher(my_hasher); + assert(hashmap.is_empty()); +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L206-L210 + + +### get + +```rust title="get" showLineNumbers +pub fn get( + self, + key: K + ) -> Option + where + K: Eq + Hash, + B: BuildHasher, + H: Hasher { +``` +> Source code: noir_stdlib/src/collections/map.nr#L470-L479 + + +Retrieves a value from the hashmap, returning `Option::none()` if it was not found. + +Example: + +```rust title="get_example" showLineNumbers +fn get_example(map: HashMap>) { + let x = map.get(12); + + if x.is_some() { + assert(x.unwrap() == 42); + } +} +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L298-L306 + + +### insert + +```rust title="insert" showLineNumbers +pub fn insert( + &mut self, + key: K, + value: V + ) + where + K: Eq + Hash, + B: BuildHasher, + H: Hasher { +``` +> Source code: noir_stdlib/src/collections/map.nr#L514-L524 + + +Inserts a new key-value pair into the map. If the key was already in the map, its +previous value will be overridden with the newly provided one. + +Example: + +```rust title="insert_example" showLineNumbers +let mut map: HashMap> = HashMap::default(); + map.insert(12, 42); + assert(map.len() == 1); +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L212-L216 + + +### remove + +```rust title="remove" showLineNumbers +pub fn remove( + &mut self, + key: K + ) + where + K: Eq + Hash, + B: BuildHasher, + H: Hasher { +``` +> Source code: noir_stdlib/src/collections/map.nr#L573-L582 + + +Removes the given key-value pair from the map. If the key was not already present +in the map, this does nothing. + +Example: + +```rust title="remove_example" showLineNumbers +map.remove(12); + assert(map.is_empty()); + + // If a key was not present in the map, remove does nothing + map.remove(12); + assert(map.is_empty()); +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L220-L227 + + +### is_empty + +```rust title="is_empty" showLineNumbers +pub fn is_empty(self) -> bool { +``` +> Source code: noir_stdlib/src/collections/map.nr#L168-L170 + + +True if the length of the hash map is empty. + +Example: + +```rust title="is_empty_example" showLineNumbers +assert(map.is_empty()); + + map.insert(1, 2); + assert(!map.is_empty()); + + map.remove(1); + assert(map.is_empty()); +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L229-L237 + + +### len + +```rust title="len" showLineNumbers +pub fn len(self) -> u32 { +``` +> Source code: noir_stdlib/src/collections/map.nr#L429-L431 + + +Returns the current length of this hash map. + +Example: + +```rust title="len_example" showLineNumbers +// This is equivalent to checking map.is_empty() + assert(map.len() == 0); + + map.insert(1, 2); + map.insert(3, 4); + map.insert(5, 6); + assert(map.len() == 3); + + // 3 was already present as a key in the hash map, so the length is unchanged + map.insert(3, 7); + assert(map.len() == 3); + + map.remove(1); + assert(map.len() == 2); +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L239-L254 + + +### capacity + +```rust title="capacity" showLineNumbers +pub fn capacity(_self: Self) -> u32 { +``` +> Source code: noir_stdlib/src/collections/map.nr#L451-L453 + + +Returns the maximum capacity of this hashmap. This is always equal to the capacity +specified in the hashmap's type. + +Unlike hashmaps in general purpose programming languages, hashmaps in Noir have a +static capacity that does not increase as the map grows larger. Thus, this capacity +is also the maximum possible element count that can be inserted into the hashmap. +Due to hash collisions (modulo the hashmap length), it is likely the actual maximum +element count will be lower than the full capacity. + +Example: + +```rust title="capacity_example" showLineNumbers +let empty_map: HashMap> = HashMap::default(); + assert(empty_map.len() == 0); + assert(empty_map.capacity() == 42); +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L256-L260 + + +### clear + +```rust title="clear" showLineNumbers +pub fn clear(&mut self) { +``` +> Source code: noir_stdlib/src/collections/map.nr#L122-L124 + + +Clears the hashmap, removing all key-value pairs from it. + +Example: + +```rust title="clear_example" showLineNumbers +assert(!map.is_empty()); + map.clear(); + assert(map.is_empty()); +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L262-L266 + + +### contains_key + +```rust title="contains_key" showLineNumbers +pub fn contains_key( + self, + key: K + ) -> bool + where + K: Hash + Eq, + B: BuildHasher, + H: Hasher { +``` +> Source code: noir_stdlib/src/collections/map.nr#L142-L151 + + +True if the hashmap contains the given key. Unlike `get`, this will not also return +the value associated with the key. + +Example: + +```rust title="contains_key_example" showLineNumbers +if map.contains_key(7) { + let value = map.get(7); + assert(value.is_some()); + } else { + println("No value for key 7!"); + } +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L268-L275 + + +### entries + +```rust title="entries" showLineNumbers +pub fn entries(self) -> BoundedVec<(K, V), N> { +``` +> Source code: noir_stdlib/src/collections/map.nr#L192-L194 + + +Returns a vector of each key-value pair present in the hashmap. + +The length of the returned vector is always equal to the length of the hashmap. + +Example: + +```rust title="entries_example" showLineNumbers +let entries = map.entries(); + + // The length of a hashmap may not be compile-time known, so we + // need to loop over its capacity instead + for i in 0..map.capacity() { + if i < entries.len() { + let (key, value) = entries.get(i); + println(f"{key} -> {value}"); + } + } +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L309-L320 + + +### keys + +```rust title="keys" showLineNumbers +pub fn keys(self) -> BoundedVec { +``` +> Source code: noir_stdlib/src/collections/map.nr#L228-L230 + + +Returns a vector of each key present in the hashmap. + +The length of the returned vector is always equal to the length of the hashmap. + +Example: + +```rust title="keys_example" showLineNumbers +let keys = map.keys(); + + for i in 0..keys.max_len() { + if i < keys.len() { + let key = keys.get_unchecked(i); + let value = map.get(key).unwrap_unchecked(); + println(f"{key} -> {value}"); + } + } +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L322-L332 + + +### values + +```rust title="values" showLineNumbers +pub fn values(self) -> BoundedVec { +``` +> Source code: noir_stdlib/src/collections/map.nr#L262-L264 + + +Returns a vector of each value present in the hashmap. + +The length of the returned vector is always equal to the length of the hashmap. + +Example: + +```rust title="values_example" showLineNumbers +let values = map.values(); + + for i in 0..values.max_len() { + if i < values.len() { + let value = values.get_unchecked(i); + println(f"Found value {value}"); + } + } +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L334-L343 + + +### iter_mut + +```rust title="iter_mut" showLineNumbers +pub fn iter_mut( + &mut self, + f: fn(K, V) -> (K, V) + ) + where + K: Eq + Hash, + B: BuildHasher, + H: Hasher { +``` +> Source code: noir_stdlib/src/collections/map.nr#L298-L307 + + +Iterates through each key-value pair of the HashMap, setting each key-value pair to the +result returned from the given function. + +Note that since keys can be mutated, the HashMap needs to be rebuilt as it is iterated +through. If this is not desired, use `iter_values_mut` if only values need to be mutated, +or `entries` if neither keys nor values need to be mutated. + +The iteration order is left unspecified. As a result, if two keys are mutated to become +equal, which of the two values that will be present for the key in the resulting map is also unspecified. + +Example: + +```rust title="iter_mut_example" showLineNumbers +// Add 1 to each key in the map, and double the value associated with that key. + map.iter_mut(|k, v| (k + 1, v * 2)); +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L347-L350 + + +### iter_keys_mut + +```rust title="iter_keys_mut" showLineNumbers +pub fn iter_keys_mut( + &mut self, + f: fn(K) -> K + ) + where + K: Eq + Hash, + B: BuildHasher, + H: Hasher { +``` +> Source code: noir_stdlib/src/collections/map.nr#L338-L347 + + +Iterates through the HashMap, mutating each key to the result returned from +the given function. + +Note that since keys can be mutated, the HashMap needs to be rebuilt as it is iterated +through. If only iteration is desired and the keys are not intended to be mutated, +prefer using `entries` instead. + +The iteration order is left unspecified. As a result, if two keys are mutated to become +equal, which of the two values that will be present for the key in the resulting map is also unspecified. + +Example: + +```rust title="iter_keys_mut_example" showLineNumbers +// Double each key, leaving the value associated with that key untouched + map.iter_keys_mut(|k| k * 2); +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L352-L355 + + +### iter_values_mut + +```rust title="iter_values_mut" showLineNumbers +pub fn iter_values_mut(&mut self, f: fn(V) -> V) { +``` +> Source code: noir_stdlib/src/collections/map.nr#L372-L374 + + +Iterates through the HashMap, applying the given function to each value and mutating the +value to equal the result. This function is more efficient than `iter_mut` and `iter_keys_mut` +because the keys are untouched and the underlying hashmap thus does not need to be reordered. + +Example: + +```rust title="iter_values_mut_example" showLineNumbers +// Halve each value + map.iter_values_mut(|v| v / 2); +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L357-L360 + + +### retain + +```rust title="retain" showLineNumbers +pub fn retain(&mut self, f: fn(K, V) -> bool) { +``` +> Source code: noir_stdlib/src/collections/map.nr#L393-L395 + + +Retains only the key-value pairs for which the given function returns true. +Any key-value pairs for which the function returns false will be removed from the map. + +Example: + +```rust title="retain_example" showLineNumbers +map.retain(|k, v| (k != 0) & (v != 0)); +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L280-L282 + + +## Trait Implementations + +### default + +```rust title="default" showLineNumbers +impl Default for HashMap +where + B: BuildHasher + Default, + H: Hasher + Default { + /// Constructs an empty HashMap. + /// + /// Example: + /// + /// ```noir + /// let hashmap: HashMap> = HashMap::default(); + /// assert(hashmap.is_empty()); + /// ``` + fn default() -> Self { +``` +> Source code: noir_stdlib/src/collections/map.nr#L694-L708 + + +Constructs an empty HashMap. + +Example: + +```rust title="default_example" showLineNumbers +let hashmap: HashMap> = HashMap::default(); + assert(hashmap.is_empty()); +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L201-L204 + + +### eq + +```rust title="eq" showLineNumbers +impl Eq for HashMap +where + K: Eq + Hash, + V: Eq, + B: BuildHasher, + H: Hasher { + /// Checks if two HashMaps are equal. + /// + /// Example: + /// + /// ```noir + /// let mut map1: HashMap> = HashMap::default(); + /// let mut map2: HashMap> = HashMap::default(); + /// + /// map1.insert(1, 2); + /// map1.insert(3, 4); + /// + /// map2.insert(3, 4); + /// map2.insert(1, 2); + /// + /// assert(map1 == map2); + /// ``` + fn eq(self, other: HashMap) -> bool { +``` +> Source code: noir_stdlib/src/collections/map.nr#L643-L667 + + +Checks if two HashMaps are equal. + +Example: + +```rust title="eq_example" showLineNumbers +let mut map1: HashMap> = HashMap::default(); + let mut map2: HashMap> = HashMap::default(); + + map1.insert(1, 2); + map1.insert(3, 4); + + map2.insert(3, 4); + map2.insert(1, 2); + + assert(map1 == map2); +``` +> Source code: test_programs/execution_success/hashmap/src/main.nr#L284-L295 + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/containers/index.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/containers/index.md new file mode 100644 index 00000000000..ea84c6d5c21 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/containers/index.md @@ -0,0 +1,5 @@ +--- +title: Containers +description: Container types provided by Noir's standard library for storing and retrieving data +keywords: [containers, data types, vec, hashmap] +--- diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/containers/vec.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/containers/vec.mdx new file mode 100644 index 00000000000..475011922f8 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/containers/vec.mdx @@ -0,0 +1,170 @@ +--- +title: Vectors +description: Delve into the Vec data type in Noir. Learn about its methods, practical examples, and best practices for using Vectors in your Noir code. +keywords: [noir, vector type, methods, examples, dynamic arrays] +sidebar_position: 6 +--- + +import Experimental from '@site/src/components/Notes/_experimental.mdx'; + + + +A vector is a collection type similar to Rust's `Vec` type. In Noir, it is a convenient way to use slices as mutable arrays. + +Example: + +```rust +let mut vector: Vec = Vec::new(); +for i in 0..5 { + vector.push(i); +} +assert(vector.len() == 5); +``` + +## Methods + +### new + +Creates a new, empty vector. + +```rust +pub fn new() -> Self +``` + +Example: + +```rust +let empty_vector: Vec = Vec::new(); +assert(empty_vector.len() == 0); +``` + +### from_slice + +Creates a vector containing each element from a given slice. Mutations to the resulting vector will not affect the original slice. + +```rust +pub fn from_slice(slice: [T]) -> Self +``` + +Example: + +```rust +let slice: [Field] = &[1, 2, 3]; +let vector_from_slice = Vec::from_slice(slice); +assert(vector_from_slice.len() == 3); +``` + +### len + +Returns the number of elements in the vector. + +```rust +pub fn len(self) -> Field +``` + +Example: + +```rust +let empty_vector: Vec = Vec::new(); +assert(empty_vector.len() == 0); +``` + +### get + +Retrieves an element from the vector at a given index. Panics if the index points beyond the vector's end. + +```rust +pub fn get(self, index: Field) -> T +``` + +Example: + +```rust +let vector: Vec = Vec::from_slice(&[10, 20, 30]); +assert(vector.get(1) == 20); +``` + +### set + +```rust +pub fn set(&mut self: Self, index: u64, value: T) { +``` + +Writes an element to the vector at the given index, starting from zero. + +Panics if the index points beyond the vector's end. + +Example: + +```rust +let vector: Vec = Vec::from_slice(&[10, 20, 30]); +assert(vector.get(1) == 20); +vector.set(1, 42); +assert(vector.get(1) == 42); +``` + +### push + +Adds a new element to the vector's end, returning a new vector with a length one greater than the original unmodified vector. + +```rust +pub fn push(&mut self, elem: T) +``` + +Example: + +```rust +let mut vector: Vec = Vec::new(); +vector.push(10); +assert(vector.len() == 1); +``` + +### pop + +Removes an element from the vector's end, returning a new vector with a length one less than the original vector, along with the removed element. Panics if the vector's length is zero. + +```rust +pub fn pop(&mut self) -> T +``` + +Example: + +```rust +let mut vector = Vec::from_slice(&[10, 20]); +let popped_elem = vector.pop(); +assert(popped_elem == 20); +assert(vector.len() == 1); +``` + +### insert + +Inserts an element at a specified index, shifting subsequent elements to the right. + +```rust +pub fn insert(&mut self, index: Field, elem: T) +``` + +Example: + +```rust +let mut vector = Vec::from_slice(&[10, 30]); +vector.insert(1, 20); +assert(vector.get(1) == 20); +``` + +### remove + +Removes an element at a specified index, shifting subsequent elements to the left, and returns the removed element. + +```rust +pub fn remove(&mut self, index: Field) -> T +``` + +Example: + +```rust +let mut vector = Vec::from_slice(&[10, 20, 30]); +let removed_elem = vector.remove(1); +assert(removed_elem == 20); +assert(vector.len() == 2); +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/_category_.json b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/_category_.json new file mode 100644 index 00000000000..5d694210bbf --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/_category_.json @@ -0,0 +1,5 @@ +{ + "position": 0, + "collapsible": true, + "collapsed": true +} diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/ciphers.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/ciphers.mdx new file mode 100644 index 00000000000..d6a5e1a79eb --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/ciphers.mdx @@ -0,0 +1,32 @@ +--- +title: Ciphers +description: + Learn about the implemented ciphers ready to use for any Noir project +keywords: + [ciphers, Noir project, aes128, encrypt] +sidebar_position: 0 +--- + +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; + +## aes128 + +Given a plaintext as an array of bytes, returns the corresponding aes128 ciphertext (CBC mode). Input padding is automatically performed using PKCS#7, so that the output length is `input.len() + (16 - input.len() % 16)`. + +```rust title="aes128" showLineNumbers +pub fn aes128_encrypt(input: [u8; N], iv: [u8; 16], key: [u8; 16]) -> [u8] {} +``` +> Source code: noir_stdlib/src/aes128.nr#L2-L4 + + +```rust +fn main() { + let input: [u8; 4] = [0, 12, 3, 15] // Random bytes, will be padded to 16 bytes. + let iv: [u8; 16] = [0; 16]; // Initialisation vector + let key: [u8; 16] = [0; 16] // AES key + let ciphertext = std::aes128::aes128_encrypt(inputs.as_bytes(), iv.as_bytes(), key.as_bytes()); // In this case, the output length will be 16 bytes. +} +``` + + + \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/ec_primitives.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/ec_primitives.md new file mode 100644 index 00000000000..f262d8160d6 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/ec_primitives.md @@ -0,0 +1,102 @@ +--- +title: Elliptic Curve Primitives +keywords: [cryptographic primitives, Noir project] +sidebar_position: 4 +--- + +Data structures and methods on them that allow you to carry out computations involving elliptic +curves over the (mathematical) field corresponding to `Field`. For the field currently at our +disposal, applications would involve a curve embedded in BN254, e.g. the +[Baby Jubjub curve](https://eips.ethereum.org/EIPS/eip-2494). + +## Data structures + +### Elliptic curve configurations + +(`std::ec::{tecurve,montcurve,swcurve}::{affine,curvegroup}::Curve`), i.e. the specific elliptic +curve you want to use, which would be specified using any one of the methods +`std::ec::{tecurve,montcurve,swcurve}::{affine,curvegroup}::new` which take the coefficients in the +defining equation together with a generator point as parameters. You can find more detail in the +comments in +[`noir_stdlib/src/ec/mod.nr`](https://github.com/noir-lang/noir/blob/master/noir_stdlib/src/ec/mod.nr), but +the gist of it is that the elliptic curves of interest are usually expressed in one of the standard +forms implemented here (Twisted Edwards, Montgomery and Short Weierstraß), and in addition to that, +you could choose to use `affine` coordinates (Cartesian coordinates - the usual (x,y) - possibly +together with a point at infinity) or `curvegroup` coordinates (some form of projective coordinates +requiring more coordinates but allowing for more efficient implementations of elliptic curve +operations). Conversions between all of these forms are provided, and under the hood these +conversions are done whenever an operation is more efficient in a different representation (or a +mixed coordinate representation is employed). + +### Points + +(`std::ec::{tecurve,montcurve,swcurve}::{affine,curvegroup}::Point`), i.e. points lying on the +elliptic curve. For a curve configuration `c` and a point `p`, it may be checked that `p` +does indeed lie on `c` by calling `c.contains(p1)`. + +## Methods + +(given a choice of curve representation, e.g. use `std::ec::tecurve::affine::Curve` and use +`std::ec::tecurve::affine::Point`) + +- The **zero element** is given by `Point::zero()`, and we can verify whether a point `p: Point` is + zero by calling `p.is_zero()`. +- **Equality**: Points `p1: Point` and `p2: Point` may be checked for equality by calling + `p1.eq(p2)`. +- **Addition**: For `c: Curve` and points `p1: Point` and `p2: Point` on the curve, adding these two + points is accomplished by calling `c.add(p1,p2)`. +- **Negation**: For a point `p: Point`, `p.negate()` is its negation. +- **Subtraction**: For `c` and `p1`, `p2` as above, subtracting `p2` from `p1` is accomplished by + calling `c.subtract(p1,p2)`. +- **Scalar multiplication**: For `c` as above, `p: Point` a point on the curve and `n: Field`, + scalar multiplication is given by `c.mul(n,p)`. If instead `n :: [u1; N]`, i.e. `n` is a bit + array, the `bit_mul` method may be used instead: `c.bit_mul(n,p)` +- **Multi-scalar multiplication**: For `c` as above and arrays `n: [Field; N]` and `p: [Point; N]`, + multi-scalar multiplication is given by `c.msm(n,p)`. +- **Coordinate representation conversions**: The `into_group` method converts a point or curve + configuration in the affine representation to one in the CurveGroup representation, and + `into_affine` goes in the other direction. +- **Curve representation conversions**: `tecurve` and `montcurve` curves and points are equivalent + and may be converted between one another by calling `into_montcurve` or `into_tecurve` on their + configurations or points. `swcurve` is more general and a curve c of one of the other two types + may be converted to this representation by calling `c.into_swcurve()`, whereas a point `p` lying + on the curve given by `c` may be mapped to its corresponding `swcurve` point by calling + `c.map_into_swcurve(p)`. +- **Map-to-curve methods**: The Elligator 2 method of mapping a field element `n: Field` into a + `tecurve` or `montcurve` with configuration `c` may be called as `c.elligator2_map(n)`. For all of + the curve configurations, the SWU map-to-curve method may be called as `c.swu_map(z,n)`, where + `z: Field` depends on `Field` and `c` and must be chosen by the user (the conditions it needs to + satisfy are specified in the comments + [here](https://github.com/noir-lang/noir/blob/master/noir_stdlib/src/ec/mod.nr)). + +## Examples + +The +[ec_baby_jubjub test](https://github.com/noir-lang/noir/blob/master/test_programs/compile_success_empty/ec_baby_jubjub/src/main.nr) +illustrates all of the above primitives on various forms of the Baby Jubjub curve. A couple of more +interesting examples in Noir would be: + +Public-key cryptography: Given an elliptic curve and a 'base point' on it, determine the public key +from the private key. This is a matter of using scalar multiplication. In the case of Baby Jubjub, +for example, this code would do: + +```rust +use std::ec::tecurve::affine::{Curve, Point}; + +fn bjj_pub_key(priv_key: Field) -> Point +{ + + let bjj = Curve::new(168700, 168696, G::new(995203441582195749578291179787384436505546430278305826713579947235728471134,5472060717959818805561601436314318772137091100104008585924551046643952123905)); + + let base_pt = Point::new(5299619240641551281634865583518297030282874472190772894086521144482721001553, 16950150798460657717958625567821834550301663161624707787222815936182638968203); + + bjj.mul(priv_key,base_pt) +} +``` + +This would come in handy in a Merkle proof. + +- EdDSA signature verification: This is a matter of combining these primitives with a suitable hash + function. See + [feat(stdlib): EdDSA sig verification noir#1136](https://github.com/noir-lang/noir/pull/1136) for + the case of Baby Jubjub and the Poseidon hash function. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx new file mode 100644 index 00000000000..12bf5ae8aaf --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/ecdsa_sig_verification.mdx @@ -0,0 +1,98 @@ +--- +title: ECDSA Signature Verification +description: Learn about the cryptographic primitives regarding ECDSA over the secp256k1 and secp256r1 curves +keywords: [cryptographic primitives, Noir project, ecdsa, secp256k1, secp256r1, signatures] +sidebar_position: 3 +--- + +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; + +Noir supports ECDSA signatures verification over the secp256k1 and secp256r1 curves. + +## ecdsa_secp256k1::verify_signature + +Verifier for ECDSA Secp256k1 signatures. +See ecdsa_secp256k1::verify_signature_slice for a version that accepts slices directly. + +```rust title="ecdsa_secp256k1" showLineNumbers +pub fn verify_signature( + public_key_x: [u8; 32], + public_key_y: [u8; 32], + signature: [u8; 64], + message_hash: [u8; N] +) -> bool +``` +> Source code: noir_stdlib/src/ecdsa_secp256k1.nr#L2-L9 + + +example: + +```rust +fn main(hashed_message : [u8;32], pub_key_x : [u8;32], pub_key_y : [u8;32], signature : [u8;64]) { + let valid_signature = std::ecdsa_secp256k1::verify_signature(pub_key_x, pub_key_y, signature, hashed_message); + assert(valid_signature); +} +``` + + + +## ecdsa_secp256k1::verify_signature_slice + +Verifier for ECDSA Secp256k1 signatures where the message is a slice. + +```rust title="ecdsa_secp256k1_slice" showLineNumbers +pub fn verify_signature_slice( + public_key_x: [u8; 32], + public_key_y: [u8; 32], + signature: [u8; 64], + message_hash: [u8] +) -> bool +``` +> Source code: noir_stdlib/src/ecdsa_secp256k1.nr#L13-L20 + + + + +## ecdsa_secp256r1::verify_signature + +Verifier for ECDSA Secp256r1 signatures. +See ecdsa_secp256r1::verify_signature_slice for a version that accepts slices directly. + +```rust title="ecdsa_secp256r1" showLineNumbers +pub fn verify_signature( + public_key_x: [u8; 32], + public_key_y: [u8; 32], + signature: [u8; 64], + message_hash: [u8; N] +) -> bool +``` +> Source code: noir_stdlib/src/ecdsa_secp256r1.nr#L2-L9 + + +example: + +```rust +fn main(hashed_message : [u8;32], pub_key_x : [u8;32], pub_key_y : [u8;32], signature : [u8;64]) { + let valid_signature = std::ecdsa_secp256r1::verify_signature(pub_key_x, pub_key_y, signature, hashed_message); + assert(valid_signature); +} +``` + + + +## ecdsa_secp256r1::verify_signature + +Verifier for ECDSA Secp256r1 signatures where the message is a slice. + +```rust title="ecdsa_secp256r1_slice" showLineNumbers +pub fn verify_signature_slice( + public_key_x: [u8; 32], + public_key_y: [u8; 32], + signature: [u8; 64], + message_hash: [u8] +) -> bool +``` +> Source code: noir_stdlib/src/ecdsa_secp256r1.nr#L13-L20 + + + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/eddsa.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/eddsa.mdx new file mode 100644 index 00000000000..b283de693c8 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/eddsa.mdx @@ -0,0 +1,37 @@ +--- +title: EdDSA Verification +description: Learn about the cryptographic primitives regarding EdDSA +keywords: [cryptographic primitives, Noir project, eddsa, signatures] +sidebar_position: 5 +--- + +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; + +## eddsa::eddsa_poseidon_verify + +Verifier for EdDSA signatures + +```rust +fn eddsa_poseidon_verify(public_key_x : Field, public_key_y : Field, signature_s: Field, signature_r8_x: Field, signature_r8_y: Field, message: Field) -> bool +``` + +It is also possible to specify the hash algorithm used for the signature by using the `eddsa_verify` function by passing a type implementing the Hasher trait with the turbofish operator. +For instance, if you want to use Poseidon2 instead, you can do the following: +```rust +use std::hash::poseidon2::Poseidon2Hasher; + +eddsa_verify::(pub_key_a.x, pub_key_a.y, s_a, r8_a.x, r8_a.y, msg); +``` + + + +## eddsa::eddsa_to_pub + +Private to public key conversion. + +Returns `(pub_key_x, pub_key_y)` + +```rust +fn eddsa_to_pub(secret : Field) -> (Field, Field) +``` + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx new file mode 100644 index 00000000000..9507f16322c --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/embedded_curve_ops.mdx @@ -0,0 +1,92 @@ +--- +title: Scalar multiplication +description: See how you can perform scalar multiplication in Noir +keywords: [cryptographic primitives, Noir project, scalar multiplication] +sidebar_position: 1 +--- + +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; + +The following functions perform operations over the embedded curve whose coordinates are defined by the configured noir field. +For the BN254 scalar field, this is BabyJubJub or Grumpkin. + +:::note +Suffixes `_low` and `_high` denote low and high limbs of a scalar. +::: + +## embedded_curve_ops::multi_scalar_mul + +Performs multi scalar multiplication over the embedded curve. +The function accepts arbitrary amount of point-scalar pairs on the input, it multiplies the individual pairs over +the curve and returns a sum of the resulting points. + +Points represented as x and y coordinates [x1, y1, x2, y2, ...], scalars as low and high limbs [low1, high1, low2, high2, ...]. + +```rust title="multi_scalar_mul" showLineNumbers +pub fn multi_scalar_mul( + points: [EmbeddedCurvePoint; N], + scalars: [EmbeddedCurveScalar; N] +) -> EmbeddedCurvePoint +``` +> Source code: noir_stdlib/src/embedded_curve_ops.nr#L103-L108 + + +example + +```rust +fn main(point_x: Field, point_y: Field, scalar_low: Field, scalar_high: Field) { + let point = std::embedded_curve_ops::multi_scalar_mul([point_x, point_y], [scalar_low, scalar_high]); + println(point); +} +``` + +## embedded_curve_ops::fixed_base_scalar_mul + +Performs fixed base scalar multiplication over the embedded curve (multiplies input scalar with a generator point). +The function accepts a single scalar on the input represented as 2 fields. + +```rust title="fixed_base_scalar_mul" showLineNumbers +pub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint +``` +> Source code: noir_stdlib/src/embedded_curve_ops.nr#L120-L122 + + +example + +```rust +fn main(scalar_low: Field, scalar_high: Field) { + let point = std::embedded_curve_ops::fixed_base_scalar_mul(scalar_low, scalar_high); + println(point); +} +``` + +## embedded_curve_ops::embedded_curve_add + +Adds two points on the embedded curve. +This function takes two `EmbeddedCurvePoint` structures as parameters, representing points on the curve, and returns a new `EmbeddedCurvePoint` structure that represents their sum. + +### Parameters: +- `point1` (`EmbeddedCurvePoint`): The first point to add. +- `point2` (`EmbeddedCurvePoint`): The second point to add. + +### Returns: +- `EmbeddedCurvePoint`: The resulting point after the addition of `point1` and `point2`. + +```rust title="embedded_curve_add" showLineNumbers +pub fn embedded_curve_add(point1: EmbeddedCurvePoint, point2: EmbeddedCurvePoint) -> EmbeddedCurvePoint { +``` +> Source code: noir_stdlib/src/embedded_curve_ops.nr#L132-L134 + + +example + +```rust +fn main() { + let point1 = EmbeddedCurvePoint { x: 1, y: 2 }; + let point2 = EmbeddedCurvePoint { x: 3, y: 4 }; + let result = std::embedded_curve_ops::embedded_curve_add(point1, point2); + println!("Resulting Point: ({}, {})", result.x, result.y); +} +``` + + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/hashes.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/hashes.mdx new file mode 100644 index 00000000000..33601bae22b --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/hashes.mdx @@ -0,0 +1,253 @@ +--- +title: Hash methods +description: + Learn about the cryptographic primitives ready to use for any Noir project, including sha256, + blake2s, pedersen, mimc_bn254 and mimc +keywords: + [cryptographic primitives, Noir project, sha256, blake2s, pedersen, mimc_bn254, mimc, hash] +sidebar_position: 0 +--- + +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; + +## sha256 + +Given an array of bytes, returns the resulting sha256 hash. +Specify a message_size to hash only the first `message_size` bytes of the input. + +```rust title="sha256" showLineNumbers +pub fn sha256(input: [u8; N]) -> [u8; 32] +``` +> Source code: noir_stdlib/src/hash/sha256.nr#L7-L9 + + +example: +```rust title="sha256_var" showLineNumbers +let digest = std::hash::sha256_var([x as u8], 1); +``` +> Source code: test_programs/execution_success/sha256/src/main.nr#L16-L18 + + +```rust +fn main() { + let x = [163, 117, 178, 149]; // some random bytes + let hash = std::sha256::sha256_var(x, 4); +} +``` + + + + +## blake2s + +Given an array of bytes, returns an array with the Blake2 hash + +```rust title="blake2s" showLineNumbers +pub fn blake2s(input: [u8; N]) -> [u8; 32] +``` +> Source code: noir_stdlib/src/hash/mod.nr#L18-L20 + + +example: + +```rust +fn main() { + let x = [163, 117, 178, 149]; // some random bytes + let hash = std::hash::blake2s(x); +} +``` + + + +## blake3 + +Given an array of bytes, returns an array with the Blake3 hash + +```rust title="blake3" showLineNumbers +pub fn blake3(input: [u8; N]) -> [u8; 32] +``` +> Source code: noir_stdlib/src/hash/mod.nr#L24-L26 + + +example: + +```rust +fn main() { + let x = [163, 117, 178, 149]; // some random bytes + let hash = std::hash::blake3(x); +} +``` + + + +## pedersen_hash + +Given an array of Fields, returns the Pedersen hash. + +```rust title="pedersen_hash" showLineNumbers +pub fn pedersen_hash(input: [Field; N]) -> Field +``` +> Source code: noir_stdlib/src/hash/mod.nr#L77-L79 + + +example: + +```rust title="pedersen-hash" showLineNumbers +fn main(x: Field, y: Field, expected_hash: Field) { + let hash = std::hash::pedersen_hash([x, y]); + assert_eq(hash, expected_hash); +} +``` +> Source code: test_programs/execution_success/pedersen_hash/src/main.nr#L1-L7 + + + + +## pedersen_commitment + +Given an array of Fields, returns the Pedersen commitment. + +```rust title="pedersen_commitment" showLineNumbers +pub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint { +``` +> Source code: noir_stdlib/src/hash/mod.nr#L29-L31 + + +example: + +```rust title="pedersen-commitment" showLineNumbers +fn main(x: Field, y: Field, expected_commitment: std::embedded_curve_ops::EmbeddedCurvePoint) { + let commitment = std::hash::pedersen_commitment([x, y]); + assert_eq(commitment.x, expected_commitment.x); + assert_eq(commitment.y, expected_commitment.y); +} +``` +> Source code: test_programs/execution_success/pedersen_commitment/src/main.nr#L1-L8 + + + + +## keccak256 + +Given an array of bytes (`u8`), returns the resulting keccak hash as an array of +32 bytes (`[u8; 32]`). Specify a message_size to hash only the first +`message_size` bytes of the input. + +```rust title="keccak256" showLineNumbers +pub fn keccak256(input: [u8; N], message_size: u32) -> [u8; 32] +``` +> Source code: noir_stdlib/src/hash/mod.nr#L125-L127 + + +example: + +```rust title="keccak256" showLineNumbers +fn main(x: Field, result: [u8; 32]) { + // We use the `as` keyword here to denote the fact that we want to take just the first byte from the x Field + // The padding is taken care of by the program + let digest = std::hash::keccak256([x as u8], 1); + assert(digest == result); + + //#1399: variable message size + let message_size = 4; + let hash_a = std::hash::keccak256([1, 2, 3, 4], message_size); + let hash_b = std::hash::keccak256([1, 2, 3, 4, 0, 0, 0, 0], message_size); + + assert(hash_a == hash_b); + + let message_size_big = 8; + let hash_c = std::hash::keccak256([1, 2, 3, 4, 0, 0, 0, 0], message_size_big); + + assert(hash_a != hash_c); +} +``` +> Source code: test_programs/execution_success/keccak256/src/main.nr#L1-L21 + + + + +## poseidon + +Given an array of Fields, returns a new Field with the Poseidon Hash. Mind that you need to specify +how many inputs are there to your Poseidon function. + +```rust +// example for hash_1, hash_2 accepts an array of length 2, etc +fn hash_1(input: [Field; 1]) -> Field +``` + +example: + +```rust title="poseidon" showLineNumbers +use std::hash::poseidon; + +fn main(x1: [Field; 2], y1: pub Field, x2: [Field; 4], y2: pub Field) { + let hash1 = poseidon::bn254::hash_2(x1); + assert(hash1 == y1); + + let hash2 = poseidon::bn254::hash_4(x2); + assert(hash2 == y2); +} +``` +> Source code: test_programs/execution_success/poseidon_bn254_hash/src/main.nr#L1-L11 + + +## poseidon 2 + +Given an array of Fields, returns a new Field with the Poseidon2 Hash. Contrary to the Poseidon +function, there is only one hash and you can specify a message_size to hash only the first +`message_size` bytes of the input, + +```rust +// example for hashing the first three elements of the input +Poseidon2::hash(input, 3); +``` + +example: + +```rust title="poseidon2" showLineNumbers +use std::hash::poseidon2; + +fn main(inputs: [Field; 4], expected_hash: Field) { + let hash = poseidon2::Poseidon2::hash(inputs, inputs.len()); + assert_eq(hash, expected_hash); +} +``` +> Source code: test_programs/execution_success/poseidon2/src/main.nr#L1-L8 + + +## mimc_bn254 and mimc + +`mimc_bn254` is `mimc`, but with hardcoded parameters for the BN254 curve. You can use it by +providing an array of Fields, and it returns a Field with the hash. You can use the `mimc` method if +you're willing to input your own constants: + +```rust +fn mimc(x: Field, k: Field, constants: [Field; N], exp : Field) -> Field +``` + +otherwise, use the `mimc_bn254` method: + +```rust +fn mimc_bn254(array: [Field; N]) -> Field +``` + +example: + +```rust + +fn main() { + let x = [163, 117, 178, 149]; // some random bytes + let hash = std::hash::mimc::mimc_bn254(x); +} +``` + +## hash_to_field + +```rust +fn hash_to_field(_input : [Field]) -> Field {} +``` + +Calculates the `blake2s` hash of the inputs and returns the hash modulo the field modulus to return +a value which can be represented as a `Field`. + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/index.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/index.md new file mode 100644 index 00000000000..650f30165d5 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/index.md @@ -0,0 +1,14 @@ +--- +title: Cryptographic Primitives +description: + Learn about the cryptographic primitives ready to use for any Noir project +keywords: + [ + cryptographic primitives, + Noir project, + ] +--- + +The Noir team is progressively adding new cryptographic primitives to the standard library. Reach out for news or if you would be interested in adding more of these calculations in Noir. + +Some methods are available thanks to the Aztec backend, not being performed using Noir. When using other backends, these methods may or may not be supplied. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/schnorr.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/schnorr.mdx new file mode 100644 index 00000000000..0058c0c0c98 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/cryptographic_primitives/schnorr.mdx @@ -0,0 +1,64 @@ +--- +title: Schnorr Signatures +description: Learn how you can verify Schnorr signatures using Noir +keywords: [cryptographic primitives, Noir project, schnorr, signatures] +sidebar_position: 2 +--- + +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; + +## schnorr::verify_signature + +Verifier for Schnorr signatures over the embedded curve (for BN254 it is Grumpkin). +See schnorr::verify_signature_slice for a version that works directly on slices. + +```rust title="schnorr_verify" showLineNumbers +pub fn verify_signature( + public_key_x: Field, + public_key_y: Field, + signature: [u8; 64], + message: [u8; N] +) -> bool +``` +> Source code: noir_stdlib/src/schnorr.nr#L4-L11 + + +where `_signature` can be generated like so using the npm package +[@noir-lang/barretenberg](https://www.npmjs.com/package/@noir-lang/barretenberg) + +```js +const { BarretenbergWasm } = require('@noir-lang/barretenberg/dest/wasm'); +const { Schnorr } = require('@noir-lang/barretenberg/dest/crypto/schnorr'); + +... + +const barretenberg = await BarretenbergWasm.new(); +const schnorr = new Schnorr(barretenberg); +const pubKey = schnorr.computePublicKey(privateKey); +const message = ... +const signature = Array.from( + schnorr.constructSignature(hash, privateKey).toBuffer() +); + +... +``` + + + +## schnorr::verify_signature_slice + +Verifier for Schnorr signatures over the embedded curve (for BN254 it is Grumpkin) +where the message is a slice. + +```rust title="schnorr_verify_slice" showLineNumbers +pub fn verify_signature_slice( + public_key_x: Field, + public_key_y: Field, + signature: [u8; 64], + message: [u8] +) -> bool +``` +> Source code: noir_stdlib/src/schnorr.nr#L15-L22 + + + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/fmtstr.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/fmtstr.md new file mode 100644 index 00000000000..65a7da9996d --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/fmtstr.md @@ -0,0 +1,17 @@ +--- +title: fmtstr +--- + +`fmtstr` is the type resulting from using format string (`f"..."`). + +## Methods + +### quoted_contents + +```rust title="quoted_contents" showLineNumbers +comptime fn quoted_contents(self) -> Quoted {} +``` +> Source code: noir_stdlib/src/meta/format_string.nr#L3-L5 + + +Returns the format string contents (that is, without the leading and trailing double quotes) as a `Quoted` value. \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/is_unconstrained.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/is_unconstrained.md new file mode 100644 index 00000000000..51bb1bda8f1 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/is_unconstrained.md @@ -0,0 +1,69 @@ +--- +title: Is Unconstrained Function +description: + The is_unconstrained function returns wether the context at that point of the program is unconstrained or not. +keywords: + [ + unconstrained + ] +--- + +It's very common for functions in circuits to take unconstrained hints of an expensive computation and then verify it. This is done by running the hint in an unconstrained context and then verifying the result in a constrained context. + +When a function is marked as unconstrained, any subsequent functions that it calls will also be run in an unconstrained context. However, if we are implementing a library function, other users might call it within an unconstrained context or a constrained one. Generally, in an unconstrained context we prefer just computing the result instead of taking a hint of it and verifying it, since that'd mean doing the same computation twice: + +```rust + +fn my_expensive_computation(){ + ... +} + +unconstrained fn my_expensive_computation_hint(){ + my_expensive_computation() +} + +pub fn external_interface(){ + my_expensive_computation_hint(); + // verify my_expensive_computation: If external_interface is called from unconstrained, this is redundant + ... +} + +``` + +In order to improve the performance in an unconstrained context you can use the function at `std::runtime::is_unconstrained() -> bool`: + + +```rust +use dep::std::runtime::is_unconstrained; + +fn my_expensive_computation(){ + ... +} + +unconstrained fn my_expensive_computation_hint(){ + my_expensive_computation() +} + +pub fn external_interface(){ + if is_unconstrained() { + my_expensive_computation(); + } else { + my_expensive_computation_hint(); + // verify my_expensive_computation + ... + } +} + +``` + +The is_unconstrained result is resolved at compile time, so in unconstrained contexts the compiler removes the else branch, and in constrained contexts the compiler removes the if branch, reducing the amount of compute necessary to run external_interface. + +Note that using `is_unconstrained` in a `comptime` context will also return `true`: + +``` +fn main() { + comptime { + assert(is_unconstrained()); + } +} +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/logging.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/logging.md new file mode 100644 index 00000000000..db75ef9f86f --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/logging.md @@ -0,0 +1,78 @@ +--- +title: Logging +description: + Learn how to use the println statement for debugging in Noir with this tutorial. Understand the + basics of logging in Noir and how to implement it in your code. +keywords: + [ + noir logging, + println statement, + print statement, + debugging in noir, + noir std library, + logging tutorial, + basic logging in noir, + noir logging implementation, + noir debugging techniques, + rust, + ] +--- + +The standard library provides two familiar statements you can use: `println` and `print`. Despite being a limited implementation of rust's `println!` and `print!` macros, these constructs can be useful for debugging. + +You can print the output of both statements in your Noir code by using the `nargo execute` command or the `--show-output` flag when using `nargo test` (provided there are print statements in your tests). + +It is recommended to use `nargo execute` if you want to debug failing constraints with `println` or `print` statements. This is due to every input in a test being a constant rather than a witness, so we issue an error during compilation while we only print during execution (which comes after compilation). Neither `println`, nor `print` are callable for failed constraints caught at compile time. + +Both `print` and `println` are generic functions which can work on integers, fields, strings, and even structs or expressions. Note however, that slices are currently unsupported. For example: + +```rust +struct Person { + age: Field, + height: Field, +} + +fn main(age: Field, height: Field) { + let person = Person { + age: age, + height: height, + }; + println(person); + println(age + height); + println("Hello world!"); +} +``` + +You can print different types in the same statement (including strings) with a type called `fmtstr`. It can be specified in the same way as a normal string, just prepended with an "f" character: + +```rust + let fmt_str = f"i: {i}, j: {j}"; + println(fmt_str); + + let s = myStruct { y: x, x: y }; + println(s); + + println(f"i: {i}, s: {s}"); + + println(x); + println([x, y]); + + let foo = fooStruct { my_struct: s, foo: 15 }; + println(f"s: {s}, foo: {foo}"); + + println(15); // prints 0x0f, implicit Field + println(-1 as u8); // prints 255 + println(-1 as i8); // prints -1 +``` + +Examples shown above are interchangeable between the two `print` statements: + +```rust +let person = Person { age : age, height : height }; + +println(person); +print(person); + +println("Hello world!"); // Prints with a newline at the end of the input +print("Hello world!"); // Prints the input and keeps cursor on the same line +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/merkle_trees.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/merkle_trees.md new file mode 100644 index 00000000000..6a9ebf72ada --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/merkle_trees.md @@ -0,0 +1,58 @@ +--- +title: Merkle Trees +description: Learn about Merkle Trees in Noir with this tutorial. Explore the basics of computing a merkle root using a proof, with examples. +keywords: + [ + Merkle trees in Noir, + Noir programming language, + check membership, + computing root from leaf, + Noir Merkle tree implementation, + Merkle tree tutorial, + Merkle tree code examples, + Noir libraries, + pedersen hash., + ] +--- + +## compute_merkle_root + +Returns the root of the tree from the provided leaf and its hash path, using a [Pedersen hash](./cryptographic_primitives/hashes.mdx#pedersen_hash). + +```rust +fn compute_merkle_root(leaf : Field, index : Field, hash_path: [Field]) -> Field +``` + +example: + +```rust +/** + // these values are for this example only + index = "0" + priv_key = "0x000000000000000000000000000000000000000000000000000000616c696365" + secret = "0x1929ea3ab8d9106a899386883d9428f8256cfedb3c4f6b66bf4aa4d28a79988f" + note_hash_path = [ + "0x1e61bdae0f027b1b2159e1f9d3f8d00fa668a952dddd822fda80dc745d6f65cc", + "0x0e4223f3925f98934393c74975142bd73079ab0621f4ee133cee050a3c194f1a", + "0x2fd7bb412155bf8693a3bd2a3e7581a679c95c68a052f835dddca85fa1569a40" + ] + */ +fn main(index: Field, priv_key: Field, secret: Field, note_hash_path: [Field; 3]) { + + let pubkey = std::scalar_mul::fixed_base_embedded_curve(priv_key); + let pubkey_x = pubkey[0]; + let pubkey_y = pubkey[1]; + let note_commitment = std::hash::pedersen(&[pubkey_x, pubkey_y, secret]); + + let root = std::merkle::compute_merkle_root(note_commitment[0], index, note_hash_path.as_slice()); + println(root); +} +``` + +To check merkle tree membership: + +1. Include a merkle root as a program input. +2. Compute the merkle root of a given leaf, index and hash path. +3. Assert the merkle roots are equal. + +For more info about merkle trees, see the Wikipedia [page](https://en.wikipedia.org/wiki/Merkle_tree). diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/ctstring.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/ctstring.md new file mode 100644 index 00000000000..0be9bbced4e --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/ctstring.md @@ -0,0 +1,100 @@ +--- +title: CtString +--- + +`std::meta::ctstring` contains methods on the built-in `CtString` type which is +a compile-time, dynamically-sized string type. Compared to `str` and `fmtstr`, +`CtString` is useful because its size does not need to be specified in its type. This +can be used for formatting items at compile-time or general string handling in `comptime` +code. + +Since `fmtstr`s can be converted into `CtString`s, you can make use of their formatting +abilities in CtStrings by formatting in `fmtstr`s then converting the result to a CtString +afterward. + +## Traits + +### AsCtString + +```rust title="as-ctstring" showLineNumbers +pub trait AsCtString { + comptime fn as_ctstring(self) -> CtString; +} +``` +> Source code: noir_stdlib/src/meta/ctstring.nr#L43-L47 + + +Converts an object into a compile-time string. + +Implementations: + +```rust +impl AsCtString for str { ... } +impl AsCtString for fmtstr { ... } +``` + +## Methods + +### new + +```rust title="new" showLineNumbers +comptime fn new() -> Self { +``` +> Source code: noir_stdlib/src/meta/ctstring.nr#L4-L6 + + +Creates an empty `CtString`. + +### append_str + +```rust title="append_str" showLineNumbers +comptime fn append_str(self, s: str) -> Self { +``` +> Source code: noir_stdlib/src/meta/ctstring.nr#L11-L13 + + +Returns a new CtString with the given str appended onto the end. + +### append_fmtstr + +```rust title="append_fmtstr" showLineNumbers +comptime fn append_fmtstr(self, s: fmtstr) -> Self { +``` +> Source code: noir_stdlib/src/meta/ctstring.nr#L17-L19 + + +Returns a new CtString with the given fmtstr appended onto the end. + +### as_quoted_str + +```rust title="as_quoted_str" showLineNumbers +comptime fn as_quoted_str(self) -> Quoted { +``` +> Source code: noir_stdlib/src/meta/ctstring.nr#L26-L28 + + +Returns a quoted string literal from this string's contents. + +There is no direct conversion from a `CtString` to a `str` since +the size would not be known. To get around this, this function can +be used in combination with macro insertion (`!`) to insert this string +literal at this function's call site. + +Example: + +```rust title="as_quoted_str_example" showLineNumbers +let my_ctstring = "foo bar".as_ctstring(); + let my_str = my_ctstring.as_quoted_str!(); + + assert_eq(crate::meta::type_of(my_str), quote { str<7> }.as_type()); +``` +> Source code: noir_stdlib/src/meta/ctstring.nr#L90-L95 + + +## Trait Implementations + +```rust +impl Eq for CtString +impl Hash for CtString +impl Append for CtString +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/expr.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/expr.md new file mode 100644 index 00000000000..1da32b0bc09 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/expr.md @@ -0,0 +1,378 @@ +--- +title: Expr +--- + +`std::meta::expr` contains methods on the built-in `Expr` type for quoted, syntactically valid expressions. + +## Methods + +### as_array + +```rust title="as_array" showLineNumbers +comptime fn as_array(self) -> Option<[Expr]> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L10-L12 + + +If this expression is an array, this returns a slice of each element in the array. + +### as_assert + +```rust title="as_assert" showLineNumbers +comptime fn as_assert(self) -> Option<(Expr, Option)> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L16-L18 + + +If this expression is an assert, this returns the assert expression and the optional message. + +### as_assert_eq + +```rust title="as_assert_eq" showLineNumbers +comptime fn as_assert_eq(self) -> Option<(Expr, Expr, Option)> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L23-L25 + + +If this expression is an assert_eq, this returns the left-hand-side and right-hand-side +expressions, together with the optional message. + +### as_assign + +```rust title="as_assign" showLineNumbers +comptime fn as_assign(self) -> Option<(Expr, Expr)> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L30-L32 + + +If this expression is an assignment, this returns a tuple with the left hand side +and right hand side in order. + +### as_binary_op + +```rust title="as_binary_op" showLineNumbers +comptime fn as_binary_op(self) -> Option<(Expr, BinaryOp, Expr)> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L37-L39 + + +If this expression is a binary operator operation ` `, +return the left-hand side, operator, and the right-hand side of the operation. + +### as_block + +```rust title="as_block" showLineNumbers +comptime fn as_block(self) -> Option<[Expr]> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L44-L46 + + +If this expression is a block `{ stmt1; stmt2; ...; stmtN }`, return +a slice containing each statement. + +### as_bool + +```rust title="as_bool" showLineNumbers +comptime fn as_bool(self) -> Option {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L50-L52 + + +If this expression is a boolean literal, return that literal. + +### as_cast + +```rust title="as_cast" showLineNumbers +#[builtin(expr_as_cast)] + comptime fn as_cast(self) -> Option<(Expr, UnresolvedType)> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L56-L59 + + +If this expression is a cast expression (`expr as type`), returns the casted +expression and the type to cast to. + +### as_comptime + +```rust title="as_comptime" showLineNumbers +comptime fn as_comptime(self) -> Option<[Expr]> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L64-L66 + + +If this expression is a `comptime { stmt1; stmt2; ...; stmtN }` block, +return each statement in the block. + +### as_constructor + +```rust title="as_constructor" showLineNumbers +comptime fn as_constructor(self) -> Option<(UnresolvedType, [(Quoted, Expr)])> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L71-L73 + + +If this expression is a constructor `Type { field1: expr1, ..., fieldN: exprN }`, +return the type and the fields. + +### as_for + +```rust title="as_for" showLineNumbers +comptime fn as_for(self) -> Option<(Quoted, Expr, Expr)> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L78-L80 + + +If this expression is a for statement over a single expression, return the identifier, +the expression and the for loop body. + +### as_for_range + +```rust title="as_for" showLineNumbers +comptime fn as_for(self) -> Option<(Quoted, Expr, Expr)> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L78-L80 + + +If this expression is a for statement over a range, return the identifier, +the range start, the range end and the for loop body. + +### as_function_call + +```rust title="as_function_call" showLineNumbers +comptime fn as_function_call(self) -> Option<(Expr, [Expr])> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L92-L94 + + +If this expression is a function call `foo(arg1, ..., argN)`, return +the function and a slice of each argument. + +### as_if + +```rust title="as_if" showLineNumbers +comptime fn as_if(self) -> Option<(Expr, Expr, Option)> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L100-L102 + + +If this expression is an `if condition { then_branch } else { else_branch }`, +return the condition, then branch, and else branch. If there is no else branch, +`None` is returned for that branch instead. + +### as_index + +```rust title="as_index" showLineNumbers +comptime fn as_index(self) -> Option<(Expr, Expr)> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L107-L109 + + +If this expression is an index into an array `array[index]`, return the +array and the index. + +### as_integer + +```rust title="as_integer" showLineNumbers +comptime fn as_integer(self) -> Option<(Field, bool)> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L114-L116 + + +If this expression is an integer literal, return the integer as a field +as well as whether the integer is negative (true) or not (false). + +### as_lambda + +```rust title="as_lambda" showLineNumbers +comptime fn as_lambda(self) -> Option<([(Expr, Option)], Option, Expr)> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L120-L122 + + +If this expression is a lambda, returns the parameters, return type and body. + +### as_let + +```rust title="as_let" showLineNumbers +comptime fn as_let(self) -> Option<(Expr, Option, Expr)> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L127-L129 + + +If this expression is a let statement, returns the let pattern as an `Expr`, +the optional type annotation, and the assigned expression. + +### as_member_access + +```rust title="as_member_access" showLineNumbers +comptime fn as_member_access(self) -> Option<(Expr, Quoted)> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L134-L136 + + +If this expression is a member access `foo.bar`, return the struct/tuple +expression and the field. The field will be represented as a quoted value. + +### as_method_call + +```rust title="as_method_call" showLineNumbers +comptime fn as_method_call(self) -> Option<(Expr, Quoted, [UnresolvedType], [Expr])> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L141-L143 + + +If this expression is a method call `foo.bar::(arg1, ..., argN)`, return +the receiver, method name, a slice of each generic argument, and a slice of each argument. + +### as_repeated_element_array + +```rust title="as_repeated_element_array" showLineNumbers +comptime fn as_repeated_element_array(self) -> Option<(Expr, Expr)> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L148-L150 + + +If this expression is a repeated element array `[elem; length]`, return +the repeated element and the length expressions. + +### as_repeated_element_slice + +```rust title="as_repeated_element_slice" showLineNumbers +comptime fn as_repeated_element_slice(self) -> Option<(Expr, Expr)> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L155-L157 + + +If this expression is a repeated element slice `[elem; length]`, return +the repeated element and the length expressions. + +### as_slice + +```rust title="as_slice" showLineNumbers +comptime fn as_slice(self) -> Option<[Expr]> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L162-L164 + + +If this expression is a slice literal `&[elem1, ..., elemN]`, +return each element of the slice. + +### as_tuple + +```rust title="as_tuple" showLineNumbers +comptime fn as_tuple(self) -> Option<[Expr]> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L169-L171 + + +If this expression is a tuple `(field1, ..., fieldN)`, +return each element of the tuple. + +### as_unary_op + +```rust title="as_unary_op" showLineNumbers +comptime fn as_unary_op(self) -> Option<(UnaryOp, Expr)> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L176-L178 + + +If this expression is a unary operation ` `, +return the unary operator as well as the right-hand side expression. + +### as_unsafe + +```rust title="as_unsafe" showLineNumbers +comptime fn as_unsafe(self) -> Option<[Expr]> {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L183-L185 + + +If this expression is an `unsafe { stmt1; ...; stmtN }` block, +return each statement inside in a slice. + +### has_semicolon + +```rust title="has_semicolon" showLineNumbers +comptime fn has_semicolon(self) -> bool {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L204-L206 + + +`true` if this expression is trailed by a semicolon. E.g. + +``` +comptime { + let expr1 = quote { 1 + 2 }.as_expr().unwrap(); + let expr2 = quote { 1 + 2; }.as_expr().unwrap(); + + assert(expr1.as_binary_op().is_some()); + assert(expr2.as_binary_op().is_some()); + + assert(!expr1.has_semicolon()); + assert(expr2.has_semicolon()); +} +``` + +### is_break + +```rust title="is_break" showLineNumbers +comptime fn is_break(self) -> bool {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L210-L212 + + +`true` if this expression is `break`. + +### is_continue + +```rust title="is_continue" showLineNumbers +comptime fn is_continue(self) -> bool {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L216-L218 + + +`true` if this expression is `continue`. + +### modify + +```rust title="modify" showLineNumbers +comptime fn modify(self, f: fn[Env](Expr) -> Option) -> Expr { +``` +> Source code: noir_stdlib/src/meta/expr.nr#L227-L229 + + +Applies a mapping function to this expression and to all of its sub-expressions. +`f` will be applied to each sub-expression first, then applied to the expression itself. + +This happens recursively for every expression within `self`. + +For example, calling `modify` on `(&[1], &[2, 3])` with an `f` that returns `Option::some` +for expressions that are integers, doubling them, would return `(&[2], &[4, 6])`. + +### quoted + +```rust title="quoted" showLineNumbers +comptime fn quoted(self) -> Quoted { +``` +> Source code: noir_stdlib/src/meta/expr.nr#L264-L266 + + +Returns this expression as a `Quoted` value. It's the same as `quote { $self }`. + +### resolve + +```rust title="resolve" showLineNumbers +comptime fn resolve(self, in_function: Option) -> TypedExpr {} +``` +> Source code: noir_stdlib/src/meta/expr.nr#L280-L282 + + +Resolves and type-checks this expression and returns the result as a `TypedExpr`. + +The `in_function` argument specifies where the expression is resolved: +- If it's `none`, the expression is resolved in the function where `resolve` was called +- If it's `some`, the expression is resolved in the given function + +If any names used by this expression are not in scope or if there are any type errors, +this will give compiler errors as if the expression was written directly into +the current `comptime` function. \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/function_def.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/function_def.md new file mode 100644 index 00000000000..e490af68f7f --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/function_def.md @@ -0,0 +1,166 @@ +--- +title: FunctionDefinition +--- + +`std::meta::function_def` contains methods on the built-in `FunctionDefinition` type representing +a function definition in the source program. + +## Methods + +### add_attribute + +```rust title="add_attribute" showLineNumbers +comptime fn add_attribute(self, attribute: str) {} +``` +> Source code: noir_stdlib/src/meta/function_def.nr#L3-L5 + + +Adds an attribute to the function. This is only valid +on functions in the current crate which have not yet been resolved. +This means any functions called at compile-time are invalid targets for this method. + +### body + +```rust title="body" showLineNumbers +comptime fn body(self) -> Expr {} +``` +> Source code: noir_stdlib/src/meta/function_def.nr#L8-L10 + + +Returns the body of the function as an expression. This is only valid +on functions in the current crate which have not yet been resolved. +This means any functions called at compile-time are invalid targets for this method. + +### has_named_attribute + +```rust title="has_named_attribute" showLineNumbers +comptime fn has_named_attribute(self, name: str) -> bool {} +``` +> Source code: noir_stdlib/src/meta/function_def.nr#L13-L15 + + +Returns true if this function has a custom attribute with the given name. + +### is_unconstrained + +```rust title="is_unconstrained" showLineNumbers +comptime fn is_unconstrained(self) -> bool {} +``` +> Source code: noir_stdlib/src/meta/function_def.nr#L18-L20 + + +Returns true if this function is unconstrained. + +### module + +```rust title="module" showLineNumbers +comptime fn module(self) -> Module {} +``` +> Source code: noir_stdlib/src/meta/function_def.nr#L23-L25 + + +Returns the module where the function is defined. + +### name + +```rust title="name" showLineNumbers +comptime fn name(self) -> Quoted {} +``` +> Source code: noir_stdlib/src/meta/function_def.nr#L28-L30 + + +Returns the name of the function. + +### parameters + +```rust title="parameters" showLineNumbers +comptime fn parameters(self) -> [(Quoted, Type)] {} +``` +> Source code: noir_stdlib/src/meta/function_def.nr#L33-L35 + + +Returns each parameter of the function as a tuple of (parameter pattern, parameter type). + +### return_type + +```rust title="return_type" showLineNumbers +comptime fn return_type(self) -> Type {} +``` +> Source code: noir_stdlib/src/meta/function_def.nr#L38-L40 + + +The return type of the function. + +### set_body + +```rust title="set_body" showLineNumbers +comptime fn set_body(self, body: Expr) {} +``` +> Source code: noir_stdlib/src/meta/function_def.nr#L43-L45 + + +Mutate the function body to a new expression. This is only valid +on functions in the current crate which have not yet been resolved. +This means any functions called at compile-time are invalid targets for this method. + +### set_parameters + +```rust title="set_parameters" showLineNumbers +comptime fn set_parameters(self, parameters: [(Quoted, Type)]) {} +``` +> Source code: noir_stdlib/src/meta/function_def.nr#L48-L50 + + +Mutates the function's parameters to a new set of parameters. This is only valid +on functions in the current crate which have not yet been resolved. +This means any functions called at compile-time are invalid targets for this method. + +Expects a slice of (parameter pattern, parameter type) for each parameter. Requires +each parameter pattern to be a syntactically valid parameter. + +### set_return_type + +```rust title="set_return_type" showLineNumbers +comptime fn set_return_type(self, return_type: Type) {} +``` +> Source code: noir_stdlib/src/meta/function_def.nr#L53-L55 + + +Mutates the function's return type to a new type. This is only valid +on functions in the current crate which have not yet been resolved. +This means any functions called at compile-time are invalid targets for this method. + +### set_return_public + +```rust title="set_return_public" showLineNumbers +comptime fn set_return_public(self, public: bool) {} +``` +> Source code: noir_stdlib/src/meta/function_def.nr#L58-L60 + + +Mutates the function's return visibility to public (if `true` is given) or private (if `false` is given). +This is only valid on functions in the current crate which have not yet been resolved. +This means any functions called at compile-time are invalid targets for this method. + +### set_unconstrained + +```rust title="set_unconstrained" showLineNumbers +comptime fn set_unconstrained(self, value: bool) {} +``` +> Source code: noir_stdlib/src/meta/function_def.nr#L63-L65 + + +Mutates the function to be unconstrained (if `true` is given) or not (if `false` is given). +This is only valid on functions in the current crate which have not yet been resolved. +This means any functions called at compile-time are invalid targets for this method. + +## Trait Implementations + +```rust +impl Eq for FunctionDefinition +impl Hash for FunctionDefinition +``` + +Note that each function is assigned a unique ID internally and this is what is used for +equality and hashing. So even functions with identical signatures and bodies may not +be equal in this sense if they were originally different items in the source program. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/index.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/index.md new file mode 100644 index 00000000000..f81c89e05ae --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/index.md @@ -0,0 +1,210 @@ +--- +title: Metaprogramming +description: Noir's Metaprogramming API +keywords: [metaprogramming, comptime, macros, macro, quote, unquote] +--- + +`std::meta` is the entry point for Noir's metaprogramming API. This consists of `comptime` functions +and types used for inspecting and modifying Noir programs. + +## Functions + +### type_of + +```rust title="type_of" showLineNumbers +pub comptime fn type_of(x: T) -> Type {} +``` +> Source code: noir_stdlib/src/meta/mod.nr#L27-L29 + + +Returns the type of a variable at compile-time. + +Example: +```rust +comptime { + let x: i32 = 1; + let x_type: Type = std::meta::type_of(x); + + assert_eq(x_type, quote { i32 }.as_type()); +} +``` + +### unquote + +```rust title="unquote" showLineNumbers +pub comptime fn unquote(code: Quoted) -> Quoted { +``` +> Source code: noir_stdlib/src/meta/mod.nr#L19-L21 + + +Unquotes the passed-in token stream where this function was called. + +Example: +```rust +comptime { + let code = quote { 1 + 2 }; + + // let x = 1 + 2; + let x = unquote!(code); +} +``` + +### derive + +```rust title="derive" showLineNumbers +#[varargs] +pub comptime fn derive(s: StructDefinition, traits: [TraitDefinition]) -> Quoted { +``` +> Source code: noir_stdlib/src/meta/mod.nr#L47-L50 + + +Attribute placed on struct definitions. + +Creates a trait impl for each trait passed in as an argument. +To do this, the trait must have a derive handler registered +with `derive_via` beforehand. The traits in the stdlib that +can be derived this way are `Eq`, `Ord`, `Default`, and `Hash`. + +Example: +```rust +#[derive(Eq, Default)] +struct Foo { + x: i32, + y: T, +} + +fn main() { + let foo1 = Foo::default(); + let foo2 = Foo { x: 0, y: &[0] }; + assert_eq(foo1, foo2); +} +``` + +### derive_via + +```rust title="derive_via_signature" showLineNumbers +pub comptime fn derive_via(t: TraitDefinition, f: DeriveFunction) { +``` +> Source code: noir_stdlib/src/meta/mod.nr#L69-L71 + + +Attribute placed on trait definitions. + +Registers a function to create impls for the given trait +when the trait is used in a `derive` call. Users may use +this to register their own functions to enable their traits +to be derived by `derive`. + +Because this function requires a function as an argument which +should produce a trait impl for any given struct, users may find +it helpful to use a function like `std::meta::make_trait_impl` to +help creating these impls. + +Example: +```rust +#[derive_via(derive_do_nothing)] +trait DoNothing { + fn do_nothing(self); +} + +comptime fn derive_do_nothing(s: StructDefinition) -> Quoted { + let typ = s.as_type(); + quote { + impl DoNothing for $typ { + fn do_nothing(self) { + println("Nothing"); + } + } + } +} +``` + +As another example, `derive_eq` in the stdlib is used to derive the `Eq` +trait for any struct. It makes use of `make_trait_impl` to do this: + +```rust title="derive_eq" showLineNumbers +comptime fn derive_eq(s: StructDefinition) -> Quoted { + let signature = quote { fn eq(_self: Self, _other: Self) -> bool }; + let for_each_field = |name| quote { (_self.$name == _other.$name) }; + let body = |fields| { + if s.fields().len() == 0 { + quote { true } + } else { + fields + } + }; + crate::meta::make_trait_impl(s, quote { Eq }, signature, for_each_field, quote { & }, body) +} +``` +> Source code: noir_stdlib/src/cmp.nr#L10-L23 + + +### make_trait_impl + +```rust title="make_trait_impl" showLineNumbers +pub comptime fn make_trait_impl( + s: StructDefinition, + trait_name: Quoted, + function_signature: Quoted, + for_each_field: fn[Env1](Quoted) -> Quoted, + join_fields_with: Quoted, + body: fn[Env2](Quoted) -> Quoted +) -> Quoted { +``` +> Source code: noir_stdlib/src/meta/mod.nr#L88-L97 + + +A helper function to more easily create trait impls while deriving traits. + +Note that this function only works for traits which: +1. Have only one method +2. Have no generics on the trait itself. + - E.g. Using this on a trait such as `trait Foo { ... }` will result in the + generated impl incorrectly missing the `T` generic. + +If your trait fits these criteria then `make_trait_impl` is likely the easiest +way to write your derive handler. The arguments are as follows: + +- `s`: The struct to make the impl for +- `trait_name`: The name of the trait to derive. E.g. `quote { Eq }`. +- `function_signature`: The signature of the trait method to derive. E.g. `fn eq(self, other: Self) -> bool`. +- `for_each_field`: An operation to be performed on each field. E.g. `|name| quote { (self.$name == other.$name) }`. +- `join_fields_with`: A separator to join each result of `for_each_field` with. + E.g. `quote { & }`. You can also use an empty `quote {}` for no separator. +- `body`: The result of the field operations are passed into this function for any final processing. + This is the place to insert any setup/teardown code the trait requires. If the trait doesn't require + any such code, you can return the body as-is: `|body| body`. + +Example deriving `Hash`: + +```rust title="derive_hash" showLineNumbers +comptime fn derive_hash(s: StructDefinition) -> Quoted { + let name = quote { Hash }; + let signature = quote { fn hash(_self: Self, _state: &mut H) where H: std::hash::Hasher }; + let for_each_field = |name| quote { _self.$name.hash(_state); }; + crate::meta::make_trait_impl(s, name, signature, for_each_field, quote {}, |fields| fields) +} +``` +> Source code: noir_stdlib/src/hash/mod.nr#L144-L151 + + +Example deriving `Ord`: + +```rust title="derive_ord" showLineNumbers +comptime fn derive_ord(s: StructDefinition) -> Quoted { + let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering }; + let for_each_field = |name| quote { + if result == std::cmp::Ordering::equal() { + result = _self.$name.cmp(_other.$name); + } + }; + let body = |fields| quote { + let mut result = std::cmp::Ordering::equal(); + $fields + result + }; + crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body) +} +``` +> Source code: noir_stdlib/src/cmp.nr#L181-L196 + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/module.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/module.md new file mode 100644 index 00000000000..efd3e61e125 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/module.md @@ -0,0 +1,82 @@ +--- +title: Module +--- + +`std::meta::module` contains methods on the built-in `Module` type which represents a module in the source program. +Note that this type represents a module generally, it isn't limited to only `mod my_submodule { ... }` +declarations in the source program. + +## Methods + +### add_item + +```rust title="add_item" showLineNumbers +comptime fn add_item(self, item: Quoted) {} +``` +> Source code: noir_stdlib/src/meta/module.nr#L3-L5 + + +Adds a top-level item (a function, a struct, a global, etc.) to the module. +Adding multiple items in one go is also valid if the `Quoted` value has multiple items in it. +Note that the items are type-checked as if they are inside the module they are being added to. + +### functions + +```rust title="functions" showLineNumbers +comptime fn functions(self) -> [FunctionDefinition] {} +``` +> Source code: noir_stdlib/src/meta/module.nr#L18-L20 + + +Returns each function defined in the module. + +### has_named_attribute + +```rust title="has_named_attribute" showLineNumbers +comptime fn has_named_attribute(self, name: str) -> bool {} +``` +> Source code: noir_stdlib/src/meta/module.nr#L8-L10 + + +Returns true if this module has a custom attribute with the given name. + +### is_contract + +```rust title="is_contract" showLineNumbers +comptime fn is_contract(self) -> bool {} +``` +> Source code: noir_stdlib/src/meta/module.nr#L13-L15 + + +`true` if this module is a contract module (was declared via `contract foo { ... }`). + +### name + +```rust title="name" showLineNumbers +comptime fn name(self) -> Quoted {} +``` +> Source code: noir_stdlib/src/meta/module.nr#L28-L30 + + +Returns the name of the module. + +### structs + +```rust title="structs" showLineNumbers +comptime fn structs(self) -> [StructDefinition] {} +``` +> Source code: noir_stdlib/src/meta/module.nr#L23-L25 + + +Returns each struct defined in the module. + +## Trait Implementations + +```rust +impl Eq for Module +impl Hash for Module +``` + +Note that each module is assigned a unique ID internally and this is what is used for +equality and hashing. So even modules with identical names and contents may not +be equal in this sense if they were originally different items in the source program. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/op.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/op.md new file mode 100644 index 00000000000..18d1f0768fd --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/op.md @@ -0,0 +1,244 @@ +--- +title: UnaryOp and BinaryOp +--- + +`std::meta::op` contains the `UnaryOp` and `BinaryOp` types as well as methods on them. +These types are used to represent a unary or binary operator respectively in Noir source code. + +## Types + +### UnaryOp + +Represents a unary operator. One of `-`, `!`, `&mut`, or `*`. + +### Methods + +#### is_minus + +```rust title="is_minus" showLineNumbers +pub fn is_minus(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L7-L9 + + +Returns `true` if this operator is `-`. + +#### is_not + +```rust title="is_not" showLineNumbers +pub fn is_not(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L13-L15 + + +`true` if this operator is `!` + +#### is_mutable_reference + +```rust title="is_mutable_reference" showLineNumbers +pub fn is_mutable_reference(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L19-L21 + + +`true` if this operator is `&mut` + +#### is_dereference + +```rust title="is_dereference" showLineNumbers +pub fn is_dereference(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L25-L27 + + +`true` if this operator is `*` + +#### quoted + +```rust title="unary_quoted" showLineNumbers +pub comptime fn quoted(self) -> Quoted { +``` +> Source code: noir_stdlib/src/meta/op.nr#L31-L33 + + +Returns this operator as a `Quoted` value. + +### Trait Implementations + +```rust +impl Eq for UnaryOp +impl Hash for UnaryOp +``` + +### BinaryOp + +Represents a binary operator. One of `+`, `-`, `*`, `/`, `%`, `==`, `!=`, `<`, `<=`, `>`, `>=`, `&`, `|`, `^`, `>>`, or `<<`. + +### Methods + +#### is_add + +```rust title="is_add" showLineNumbers +pub fn is_add(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L55-L57 + + +`true` if this operator is `+` + +#### is_subtract + +```rust title="is_subtract" showLineNumbers +pub fn is_subtract(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L61-L63 + + +`true` if this operator is `-` + +#### is_multiply + +```rust title="is_multiply" showLineNumbers +pub fn is_multiply(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L67-L69 + + +`true` if this operator is `*` + +#### is_divide + +```rust title="is_divide" showLineNumbers +pub fn is_divide(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L73-L75 + + +`true` if this operator is `/` + +#### is_modulo + +```rust title="is_modulo" showLineNumbers +pub fn is_modulo(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L145-L147 + + +`true` if this operator is `%` + +#### is_equal + +```rust title="is_equal" showLineNumbers +pub fn is_equal(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L79-L81 + + +`true` if this operator is `==` + +#### is_not_equal + +```rust title="is_not_equal" showLineNumbers +pub fn is_not_equal(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L85-L87 + + +`true` if this operator is `!=` + +#### is_less_than + +```rust title="is_less_than" showLineNumbers +pub fn is_less_than(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L91-L93 + + +`true` if this operator is `<` + +#### is_less_than_or_equal + +```rust title="is_less_than_or_equal" showLineNumbers +pub fn is_less_than_or_equal(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L97-L99 + + +`true` if this operator is `<=` + +#### is_greater_than + +```rust title="is_greater_than" showLineNumbers +pub fn is_greater_than(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L103-L105 + + +`true` if this operator is `>` + +#### is_greater_than_or_equal + +```rust title="is_greater_than_or_equal" showLineNumbers +pub fn is_greater_than_or_equal(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L109-L111 + + +`true` if this operator is `>=` + +#### is_and + +```rust title="is_and" showLineNumbers +pub fn is_and(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L115-L117 + + +`true` if this operator is `&` + +#### is_or + +```rust title="is_or" showLineNumbers +pub fn is_or(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L121-L123 + + +`true` if this operator is `|` + +#### is_shift_right + +```rust title="is_shift_right" showLineNumbers +pub fn is_shift_right(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L133-L135 + + +`true` if this operator is `>>` + +#### is_shift_left + +```rust title="is_shift_right" showLineNumbers +pub fn is_shift_right(self) -> bool { +``` +> Source code: noir_stdlib/src/meta/op.nr#L133-L135 + + +`true` if this operator is `<<` + +#### quoted + +```rust title="binary_quoted" showLineNumbers +pub comptime fn quoted(self) -> Quoted { +``` +> Source code: noir_stdlib/src/meta/op.nr#L151-L153 + + +Returns this operator as a `Quoted` value. + +### Trait Implementations + +```rust +impl Eq for BinaryOp +impl Hash for BinaryOp +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/quoted.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/quoted.md new file mode 100644 index 00000000000..cb779bca98f --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/quoted.md @@ -0,0 +1,138 @@ +--- +title: Quoted +--- + +`std::meta::quoted` contains methods on the built-in `Quoted` type which represents +quoted token streams and is the result of the `quote { ... }` expression. + +## Methods + +### as_expr + +```rust title="as_expr" showLineNumbers +comptime fn as_expr(self) -> Option {} +``` +> Source code: noir_stdlib/src/meta/quoted.nr#L6-L8 + + +Parses the quoted token stream as an expression. Returns `Option::none()` if +the expression failed to parse. + +Example: + +```rust title="as_expr_example" showLineNumbers +#[test] + fn test_expr_as_function_call() { + comptime + { + let expr = quote { foo(42) }.as_expr().unwrap(); + let (_function, args) = expr.as_function_call().unwrap(); + assert_eq(args.len(), 1); + assert_eq(args[0].as_integer().unwrap(), (42, false)); + } + } +``` +> Source code: test_programs/noir_test_success/comptime_expr/src/main.nr#L360-L371 + + +### as_module + +```rust title="as_module" showLineNumbers +comptime fn as_module(self) -> Option {} +``` +> Source code: noir_stdlib/src/meta/quoted.nr#L11-L13 + + +Interprets this token stream as a module path leading to the name of a module. +Returns `Option::none()` if the module isn't found or this token stream cannot be parsed as a path. + +Example: + +```rust title="as_module_example" showLineNumbers +mod baz { + pub mod qux {} +} + +#[test] +fn as_module_test() { + comptime + { + let my_mod = quote { baz::qux }.as_module().unwrap(); + assert_eq(my_mod.name(), quote { qux }); + } +} +``` +> Source code: test_programs/compile_success_empty/comptime_module/src/main.nr#L116-L129 + + +### as_trait_constraint + +```rust title="as_trait_constraint" showLineNumbers +comptime fn as_trait_constraint(self) -> TraitConstraint {} +``` +> Source code: noir_stdlib/src/meta/quoted.nr#L16-L18 + + +Interprets this token stream as a trait constraint (without an object type). +Note that this function panics instead of returning `Option::none()` if the token +stream does not parse and resolve to a valid trait constraint. + +Example: + +```rust title="implements_example" showLineNumbers +fn function_with_where(_x: T) where T: SomeTrait { + comptime + { + let t = quote { T }.as_type(); + let some_trait_i32 = quote { SomeTrait }.as_trait_constraint(); + assert(t.implements(some_trait_i32)); + + assert(t.get_trait_impl(some_trait_i32).is_none()); + } +} +``` +> Source code: test_programs/compile_success_empty/comptime_type/src/main.nr#L154-L165 + + +### as_type + +```rust title="as_type" showLineNumbers +comptime fn as_type(self) -> Type {} +``` +> Source code: noir_stdlib/src/meta/quoted.nr#L21-L23 + + +Interprets this token stream as a resolved type. Panics if the token +stream doesn't parse to a type or if the type isn't a valid type in scope. + +```rust title="implements_example" showLineNumbers +fn function_with_where(_x: T) where T: SomeTrait { + comptime + { + let t = quote { T }.as_type(); + let some_trait_i32 = quote { SomeTrait }.as_trait_constraint(); + assert(t.implements(some_trait_i32)); + + assert(t.get_trait_impl(some_trait_i32).is_none()); + } +} +``` +> Source code: test_programs/compile_success_empty/comptime_type/src/main.nr#L154-L165 + + +### tokens + +```rust title="tokens" showLineNumbers +comptime fn tokens(self) -> [Quoted] {} +``` +> Source code: noir_stdlib/src/meta/quoted.nr#L26-L28 + + +Returns a slice of the individual tokens that form this token stream. + +## Trait Implementations + +```rust +impl Eq for Quoted +impl Hash for Quoted +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/struct_def.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/struct_def.md new file mode 100644 index 00000000000..212c636d12a --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/struct_def.md @@ -0,0 +1,177 @@ +--- +title: StructDefinition +--- + +`std::meta::struct_def` contains methods on the built-in `StructDefinition` type. +This type corresponds to `struct Name { field1: Type1, ... }` items in the source program. + +## Methods + +### add_attribute + +```rust title="add_attribute" showLineNumbers +comptime fn add_attribute(self, attribute: str) {} +``` +> Source code: noir_stdlib/src/meta/struct_def.nr#L3-L5 + + +Adds an attribute to the struct. + +### add_generic + +```rust title="add_generic" showLineNumbers +comptime fn add_generic(self, generic_name: str) -> Type {} +``` +> Source code: noir_stdlib/src/meta/struct_def.nr#L8-L10 + + +Adds an generic to the struct. Returns the new generic type. +Errors if the given generic name isn't a single identifier or if +the struct already has a generic with the same name. + +This method should be used carefully, if there is existing code referring +to the struct type it may be checked before this function is called and +see the struct with the original number of generics. This method should +thus be preferred to use on code generated from other macros and structs +that are not used in function signatures. + +Example: + +```rust title="add-generic-example" showLineNumbers +comptime fn add_generic(s: StructDefinition) { + assert_eq(s.generics().len(), 0); + let new_generic = s.add_generic("T"); + + let generics = s.generics(); + assert_eq(generics.len(), 1); + assert_eq(generics[0], new_generic); + } +``` +> Source code: test_programs/compile_success_empty/comptime_struct_definition/src/main.nr#L38-L47 + + +### as_type + +```rust title="as_type" showLineNumbers +comptime fn as_type(self) -> Type {} +``` +> Source code: noir_stdlib/src/meta/struct_def.nr#L15-L17 + + +Returns this struct as a type in the source program. If this struct has +any generics, the generics are also included as-is. + +### generics + +```rust title="generics" showLineNumbers +comptime fn generics(self) -> [Type] {} +``` +> Source code: noir_stdlib/src/meta/struct_def.nr#L26-L28 + + +Returns each generic on this struct. + +Example: + +``` +#[example] +struct Foo { + bar: [T; 2], + baz: Baz, +} + +comptime fn example(foo: StructDefinition) { + assert_eq(foo.generics().len(), 2); + + // Fails because `T` isn't in scope + // let t = quote { T }.as_type(); + // assert_eq(foo.generics()[0], t); +} +``` + +### fields + +```rust title="fields" showLineNumbers +comptime fn fields(self) -> [(Quoted, Type)] {} +``` +> Source code: noir_stdlib/src/meta/struct_def.nr#L33-L35 + + +Returns each field of this struct as a pair of (field name, field type). + +### has_named_attribute + +```rust title="has_named_attribute" showLineNumbers +comptime fn has_named_attribute(self, name: str) -> bool {} +``` +> Source code: noir_stdlib/src/meta/struct_def.nr#L20-L22 + + +Returns true if this struct has a custom attribute with the given name. + +### module + +```rust title="module" showLineNumbers +comptime fn module(self) -> Module {} +``` +> Source code: noir_stdlib/src/meta/struct_def.nr#L38-L40 + + +Returns the module where the struct is defined. + +### name + +```rust title="name" showLineNumbers +comptime fn name(self) -> Quoted {} +``` +> Source code: noir_stdlib/src/meta/struct_def.nr#L43-L45 + + +Returns the name of this struct + +Note that the returned quoted value will be just the struct name, it will +not be the full path to the struct, nor will it include any generics. + +### set_fields + +```rust title="set_fields" showLineNumbers +comptime fn set_fields(self, new_fields: [(Quoted, Type)]) {} +``` +> Source code: noir_stdlib/src/meta/struct_def.nr#L52-L54 + + +Sets the fields of this struct to the given fields list where each element +is a pair of the field's name and the field's type. Expects each field name +to be a single identifier. Note that this will override any previous fields +on this struct. If those should be preserved, use `.fields()` to retrieve the +current fields on the struct type and append the new fields from there. + +Example: + +```rust +// Change this struct to: +// struct Foo { +// a: u32, +// b: i8, +// } +#[mangle_fields] +struct Foo { x: Field } + +comptime fn mangle_fields(s: StructDefinition) { + s.set_fields(&[ + (quote { a }, quote { u32 }.as_type()), + (quote { b }, quote { i8 }.as_type()), + ]); +} +``` + +## Trait Implementations + +```rust +impl Eq for StructDefinition +impl Hash for StructDefinition +``` + +Note that each struct is assigned a unique ID internally and this is what is used for +equality and hashing. So even structs with identical generics and fields may not +be equal in this sense if they were originally different items in the source program. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/trait_constraint.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/trait_constraint.md new file mode 100644 index 00000000000..3106f732b5a --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/trait_constraint.md @@ -0,0 +1,17 @@ +--- +title: TraitConstraint +--- + +`std::meta::trait_constraint` contains methods on the built-in `TraitConstraint` type which represents +a trait constraint that can be used to search for a trait implementation. This is similar +syntactically to just the trait itself, but can also contain generic arguments. E.g. `Eq`, `Default`, +`BuildHasher`. + +This type currently has no public methods but it can be used alongside `Type` in `implements` or `get_trait_impl`. + +## Trait Implementations + +```rust +impl Eq for TraitConstraint +impl Hash for TraitConstraint +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/trait_def.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/trait_def.md new file mode 100644 index 00000000000..a1f363d46ff --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/trait_def.md @@ -0,0 +1,26 @@ +--- +title: TraitDefinition +--- + +`std::meta::trait_def` contains methods on the built-in `TraitDefinition` type. This type +represents trait definitions such as `trait Foo { .. }` at the top-level of a program. + +## Methods + +### as_trait_constraint + +```rust title="as_trait_constraint" showLineNumbers +comptime fn as_trait_constraint(_self: Self) -> TraitConstraint {} +``` +> Source code: noir_stdlib/src/meta/trait_def.nr#L6-L8 + + +Converts this trait into a trait constraint. If there are any generics on this +trait, they will be kept as-is without instantiating or replacing them. + +## Trait Implementations + +```rust +impl Eq for TraitDefinition +impl Hash for TraitDefinition +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/trait_impl.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/trait_impl.md new file mode 100644 index 00000000000..66d31ed2560 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/trait_impl.md @@ -0,0 +1,60 @@ +--- +title: TraitImpl +--- + +`std::meta::trait_impl` contains methods on the built-in `TraitImpl` type which represents a trait +implementation such as `impl Foo for Bar { ... }`. + +## Methods + +### trait_generic_args + +```rust title="trait_generic_args" showLineNumbers +comptime fn trait_generic_args(self) -> [Type] {} +``` +> Source code: noir_stdlib/src/meta/trait_impl.nr#L3-L5 + + +Returns any generic arguments on the trait of this trait implementation, if any. + +```rs +impl Foo for Bar { ... } + +comptime { + let bar_type = quote { Bar }.as_type(); + let foo = quote { Foo }.as_trait_constraint(); + + let my_impl: TraitImpl = bar_type.get_trait_impl(foo).unwrap(); + + let generics = my_impl.trait_generic_args(); + assert_eq(generics.len(), 2); + + assert_eq(generics[0], quote { i32 }.as_type()); + assert_eq(generics[1], quote { Field }.as_type()); +} +``` + +### methods + +```rust title="methods" showLineNumbers +comptime fn methods(self) -> [FunctionDefinition] {} +``` +> Source code: noir_stdlib/src/meta/trait_impl.nr#L8-L10 + + +Returns each method in this trait impl. + +Example: + +```rs +comptime { + let i32_type = quote { i32 }.as_type(); + let eq = quote { Eq }.as_trait_constraint(); + + let impl_eq_for_i32: TraitImpl = i32_type.get_trait_impl(eq).unwrap(); + let methods = impl_eq_for_i32.methods(); + + assert_eq(methods.len(), 1); + assert_eq(methods[0].name(), quote { eq }); +} +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/typ.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/typ.md new file mode 100644 index 00000000000..6c9f4b8d087 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/typ.md @@ -0,0 +1,239 @@ +--- +title: Type +--- + +`std::meta::typ` contains methods on the built-in `Type` type used for representing +a type in the source program. + +## Functions + +```rust title="fresh_type_variable" showLineNumbers +pub comptime fn fresh_type_variable() -> Type {} +``` +> Source code: noir_stdlib/src/meta/typ.nr#L5-L7 + + +Creates and returns an unbound type variable. This is a special kind of type internal +to type checking which will type check with any other type. When it is type checked +against another type it will also be set to that type. For example, if `a` is a type +variable and we have the type equality `(a, i32) = (u8, i32)`, the compiler will set +`a` equal to `u8`. + +Unbound type variables will often be rendered as `_` while printing them. Bound type +variables will appear as the type they are bound to. + +This can be used in conjunction with functions which internally perform type checks +such as `Type::implements` or `Type::get_trait_impl` to potentially grab some of the types used. + +Note that calling `Type::implements` or `Type::get_trait_impl` on a type variable will always +fail. + +Example: + +```rust title="serialize-setup" showLineNumbers +trait Serialize {} + +impl Serialize<1> for Field {} + +impl Serialize for [T; N] + where T: Serialize {} + +impl Serialize for (T, U) + where T: Serialize, U: Serialize {} +``` +> Source code: test_programs/compile_success_empty/comptime_type/src/main.nr#L20-L30 + +```rust title="fresh-type-variable-example" showLineNumbers +let typevar1 = std::meta::typ::fresh_type_variable(); + let constraint = quote { Serialize<$typevar1> }.as_trait_constraint(); + let field_type = quote { Field }.as_type(); + + // Search for a trait impl (binding typevar1 to 1 when the impl is found): + assert(field_type.implements(constraint)); + + // typevar1 should be bound to the "1" generic now: + assert_eq(typevar1.as_constant().unwrap(), 1); + + // If we want to do the same with a different type, we need to + // create a new type variable now that `typevar1` is bound + let typevar2 = std::meta::typ::fresh_type_variable(); + let constraint = quote { Serialize<$typevar2> }.as_trait_constraint(); + let array_type = quote { [(Field, Field); 5] }.as_type(); + assert(array_type.implements(constraint)); + + // Now typevar2 should be bound to the serialized pair size 2 times the array length 5 + assert_eq(typevar2.as_constant().unwrap(), 10); +``` +> Source code: test_programs/compile_success_empty/comptime_type/src/main.nr#L130-L150 + + +## Methods + +### as_array + +```rust title="as_array" showLineNumbers +comptime fn as_array(self) -> Option<(Type, Type)> {} +``` +> Source code: noir_stdlib/src/meta/typ.nr#L11-L13 + + +If this type is an array, return a pair of (element type, size type). + +Example: + +```rust +comptime { + let array_type = quote { [Field; 3] }.as_type(); + let (field_type, three_type) = array_type.as_array().unwrap(); + + assert(field_type.is_field()); + assert_eq(three_type.as_constant().unwrap(), 3); +} +``` + +### as_constant + +```rust title="as_constant" showLineNumbers +comptime fn as_constant(self) -> Option {} +``` +> Source code: noir_stdlib/src/meta/typ.nr#L16-L18 + + +If this type is a constant integer (such as the `3` in the array type `[Field; 3]`), +return the numeric constant. + +### as_integer + +```rust title="as_integer" showLineNumbers +comptime fn as_integer(self) -> Option<(bool, u8)> {} +``` +> Source code: noir_stdlib/src/meta/typ.nr#L21-L23 + + +If this is an integer type, return a boolean which is `true` +if the type is signed, as well as the number of bits of this integer type. + +### as_slice + +```rust title="as_slice" showLineNumbers +comptime fn as_slice(self) -> Option {} +``` +> Source code: noir_stdlib/src/meta/typ.nr#L26-L28 + + +If this is a slice type, return the element type of the slice. + +### as_str + +```rust title="as_str" showLineNumbers +comptime fn as_str(self) -> Option {} +``` +> Source code: noir_stdlib/src/meta/typ.nr#L31-L33 + + +If this is a `str` type, returns the length `N` as a type. + +### as_struct + +```rust title="as_struct" showLineNumbers +comptime fn as_struct(self) -> Option<(StructDefinition, [Type])> {} +``` +> Source code: noir_stdlib/src/meta/typ.nr#L36-L38 + + +If this is a struct type, returns the struct in addition to +any generic arguments on this type. + +### as_tuple + +```rust title="as_tuple" showLineNumbers +comptime fn as_tuple(self) -> Option<[Type]> {} +``` +> Source code: noir_stdlib/src/meta/typ.nr#L41-L43 + + +If this is a tuple type, returns each element type of the tuple. + +### get_trait_impl + +```rust title="get_trait_impl" showLineNumbers +comptime fn get_trait_impl(self, constraint: TraitConstraint) -> Option {} +``` +> Source code: noir_stdlib/src/meta/typ.nr#L46-L48 + + +Retrieves the trait implementation that implements the given +trait constraint for this type. If the trait constraint is not +found, `None` is returned. Note that since the concrete trait implementation +for a trait constraint specified from a `where` clause is unknown, +this function will return `None` in these cases. If you only want to know +whether a type implements a trait, use `implements` instead. + +Example: + +```rust +comptime { + let field_type = quote { Field }.as_type(); + let default = quote { Default }.as_trait_constraint(); + + let the_impl: TraitImpl = field_type.get_trait_impl(default).unwrap(); + assert(the_impl.methods().len(), 1); +} +``` + +### implements + +```rust title="implements" showLineNumbers +comptime fn implements(self, constraint: TraitConstraint) -> bool {} +``` +> Source code: noir_stdlib/src/meta/typ.nr#L51-L53 + + +`true` if this type implements the given trait. Note that unlike +`get_trait_impl` this will also return true for any `where` constraints +in scope. + +Example: + +```rust +fn foo() where T: Default { + comptime { + let field_type = quote { Field }.as_type(); + let default = quote { Default }.as_trait_constraint(); + assert(field_type.implements(default)); + + let t = quote { T }.as_type(); + assert(t.implements(default)); + } +} +``` + +### is_bool + +```rust title="is_bool" showLineNumbers +comptime fn is_bool(self) -> bool {} +``` +> Source code: noir_stdlib/src/meta/typ.nr#L56-L58 + + +`true` if this type is `bool`. + +### is_field + +```rust title="is_field" showLineNumbers +comptime fn is_field(self) -> bool {} +``` +> Source code: noir_stdlib/src/meta/typ.nr#L61-L63 + + +`true` if this type is `Field`. + +## Trait Implementations + +```rust +impl Eq for Type +impl Hash for Type +``` +Note that this is syntactic equality, this is not the same as whether two types will type check +to be the same type. Unless type inference or generics are being used however, users should not +typically have to worry about this distinction unless `std::meta::typ::fresh_type_variable` is used. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/typed_expr.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/typed_expr.md new file mode 100644 index 00000000000..1ee71c8b064 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/typed_expr.md @@ -0,0 +1,27 @@ +--- +title: TypedExpr +--- + +`std::meta::typed_expr` contains methods on the built-in `TypedExpr` type for resolved and type-checked expressions. + +## Methods + +### get_type + +```rust title="as_function_definition" showLineNumbers +comptime fn as_function_definition(self) -> Option {} +``` +> Source code: noir_stdlib/src/meta/typed_expr.nr#L7-L9 + + +If this expression refers to a function definitions, returns it. Otherwise returns `Option::none()`. + +### get_type + +```rust title="get_type" showLineNumbers +comptime fn get_type(self) -> Option {} +``` +> Source code: noir_stdlib/src/meta/typed_expr.nr#L13-L15 + + +Returns the type of the expression, or `Option::none()` if there were errors when the expression was previously resolved. \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/unresolved_type.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/unresolved_type.md new file mode 100644 index 00000000000..d6f2b1494bb --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/meta/unresolved_type.md @@ -0,0 +1,17 @@ +--- +title: UnresolvedType +--- + +`std::meta::unresolved_type` contains methods on the built-in `UnresolvedType` type for the syntax of types. + +## Methods + +### is_field + +```rust title="is_field" showLineNumbers +comptime fn is_field(self) -> bool {} +``` +> Source code: noir_stdlib/src/meta/unresolved_type.nr#L3-L5 + + +Returns true if this type refers to the Field type. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/options.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/options.md new file mode 100644 index 00000000000..a1bd4e1de5f --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/options.md @@ -0,0 +1,101 @@ +--- +title: Option Type +--- + +The `Option` type is a way to express that a value might be present (`Some(T))` or absent (`None`). It's a safer way to handle potential absence of values, compared to using nulls in many other languages. + +```rust +struct Option { + None, + Some(T), +} +``` + +The `Option` type, already imported into your Noir program, can be used directly: + +```rust +fn main() { + let none = Option::none(); + let some = Option::some(3); +} +``` + +See [this test](https://github.com/noir-lang/noir/blob/5cbfb9c4a06c8865c98ff2b594464b037d821a5c/crates/nargo_cli/tests/test_data/option/src/main.nr) for a more comprehensive set of examples of each of the methods described below. + +## Methods + +### none + +Constructs a none value. + +### some + +Constructs a some wrapper around a given value. + +### is_none + +Returns true if the Option is None. + +### is_some + +Returns true of the Option is Some. + +### unwrap + +Asserts `self.is_some()` and returns the wrapped value. + +### unwrap_unchecked + +Returns the inner value without asserting `self.is_some()`. This method can be useful within an if condition when we already know that `option.is_some()`. If the option is None, there is no guarantee what value will be returned, only that it will be of type T for an `Option`. + +### unwrap_or + +Returns the wrapped value if `self.is_some()`. Otherwise, returns the given default value. + +### unwrap_or_else + +Returns the wrapped value if `self.is_some()`. Otherwise, calls the given function to return a default value. + +### expect + +Asserts `self.is_some()` with a provided custom message and returns the contained `Some` value. The custom message is expected to be a format string. + +### map + +If self is `Some(x)`, this returns `Some(f(x))`. Otherwise, this returns `None`. + +### map_or + +If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns the given default value. + +### map_or_else + +If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns `default()`. + +### and + +Returns None if self is None. Otherwise, this returns `other`. + +### and_then + +If self is None, this returns None. Otherwise, this calls the given function with the Some value contained within self, and returns the result of that call. In some languages this function is called `flat_map` or `bind`. + +### or + +If self is Some, return self. Otherwise, return `other`. + +### or_else + +If self is Some, return self. Otherwise, return `default()`. + +### xor + +If only one of the two Options is Some, return that option. Otherwise, if both options are Some or both are None, None is returned. + +### filter + +Returns `Some(x)` if self is `Some(x)` and `predicate(x)` is true. Otherwise, this returns `None`. + +### flatten + +Flattens an `Option>` into a `Option`. This returns `None` if the outer Option is None. Otherwise, this returns the inner Option. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/recursion.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/recursion.mdx new file mode 100644 index 00000000000..60414a2fa51 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/recursion.mdx @@ -0,0 +1,85 @@ +--- +title: Recursive Proofs +description: Learn about how to write recursive proofs in Noir. +keywords: [recursion, recursive proofs, verification_key, verify_proof] +--- + +import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; + +Noir supports recursively verifying proofs, meaning you verify the proof of a Noir program in another Noir program. This enables creating proofs of arbitrary size by doing step-wise verification of smaller components of a large proof. + +Read [the explainer on recursion](../../explainers/explainer-recursion.md) to know more about this function and the [guide on how to use it.](../../how_to/how-to-recursion.md) + +## The `#[recursive]` Attribute + +In Noir, the `#[recursive]` attribute is used to indicate that a circuit is designed for recursive proof generation. When applied, it informs the compiler and the tooling that the circuit should be compiled in a way that makes its proofs suitable for recursive verification. This attribute eliminates the need for manual flagging of recursion at the tooling level, streamlining the proof generation process for recursive circuits. + +### Example usage with `#[recursive]` + +```rust +#[recursive] +fn main(x: Field, y: pub Field) { + assert(x == y, "x and y are not equal"); +} + +// This marks the circuit as recursion-friendly and indicates that proofs generated from this circuit +// are intended for recursive verification. +``` + +By incorporating this attribute directly in the circuit's definition, tooling like Nargo and NoirJS can automatically execute recursive-specific duties for Noir programs (e.g. recursive-friendly proof artifact generation) without additional flags or configurations. + +## Verifying Recursive Proofs + +```rust +#[foreign(recursive_aggregation)] +pub fn verify_proof(verification_key: [Field], proof: [Field], public_inputs: [Field], key_hash: Field) {} +``` + + + +## Example usage + +```rust + +fn main( + verification_key : [Field; 114], + proof : [Field; 93], + public_inputs : [Field; 1], + key_hash : Field, + proof_b : [Field; 93], +) { + std::verify_proof( + verification_key, + proof, + public_inputs, + key_hash + ); + + std::verify_proof( + verification_key, + proof_b, + public_inputs, + key_hash + ); +} +``` + +You can see a full example of recursive proofs in [this example recursion demo repo](https://github.com/noir-lang/noir-examples/tree/master/recursion). + +## Parameters + +### `verification_key` + +The verification key for the zk program that is being verified. + +### `proof` + +The proof for the zk program that is being verified. + +### `public_inputs` + +These represent the public inputs of the proof we are verifying. + +### `key_hash` + +A key hash is used to check the validity of the verification key. The circuit implementing this opcode can use this hash to ensure that the key provided to the circuit matches the key produced by the circuit creator. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/traits.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/traits.md new file mode 100644 index 00000000000..74ed6276234 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/traits.md @@ -0,0 +1,625 @@ +--- +title: Traits +description: Noir's stdlib provides a few commonly used traits. +keywords: [traits, trait, interface, protocol, default, add, eq] +--- + +## `std::default` + +### `std::default::Default` + +```rust title="default-trait" showLineNumbers +pub trait Default { + fn default() -> Self; +} +``` +> Source code: noir_stdlib/src/default.nr#L4-L8 + + +Constructs a default value of a type. + +Implementations: +```rust +impl Default for Field { .. } + +impl Default for i8 { .. } +impl Default for i16 { .. } +impl Default for i32 { .. } +impl Default for i64 { .. } + +impl Default for u8 { .. } +impl Default for u16 { .. } +impl Default for u32 { .. } +impl Default for u64 { .. } + +impl Default for () { .. } +impl Default for bool { .. } + +impl Default for [T; N] + where T: Default { .. } + +impl Default for [T] { .. } + +impl Default for (A, B) + where A: Default, B: Default { .. } + +impl Default for (A, B, C) + where A: Default, B: Default, C: Default { .. } + +impl Default for (A, B, C, D) + where A: Default, B: Default, C: Default, D: Default { .. } + +impl Default for (A, B, C, D, E) + where A: Default, B: Default, C: Default, D: Default, E: Default { .. } +``` + +For primitive integer types, the return value of `default` is `0`. Container +types such as arrays are filled with default values of their element type, +except slices whose length is unknown and thus defaulted to zero. + +--- + +## `std::convert` + +### `std::convert::From` + +```rust title="from-trait" showLineNumbers +pub trait From { + fn from(input: T) -> Self; +} +``` +> Source code: noir_stdlib/src/convert.nr#L1-L5 + + +The `From` trait defines how to convert from a given type `T` to the type on which the trait is implemented. + +The Noir standard library provides a number of implementations of `From` between primitive types. +```rust title="from-impls" showLineNumbers +// Unsigned integers + +impl From for u32 { + fn from(value: u8) -> u32 { + value as u32 + } +} + +impl From for u64 { + fn from(value: u8) -> u64 { + value as u64 + } +} +impl From for u64 { + fn from(value: u32) -> u64 { + value as u64 + } +} + +impl From for Field { + fn from(value: u8) -> Field { + value as Field + } +} +impl From for Field { + fn from(value: u32) -> Field { + value as Field + } +} +impl From for Field { + fn from(value: u64) -> Field { + value as Field + } +} + +// Signed integers + +impl From for i32 { + fn from(value: i8) -> i32 { + value as i32 + } +} + +impl From for i64 { + fn from(value: i8) -> i64 { + value as i64 + } +} +impl From for i64 { + fn from(value: i32) -> i64 { + value as i64 + } +} + +// Booleans +impl From for u8 { + fn from(value: bool) -> u8 { + value as u8 + } +} +impl From for u32 { + fn from(value: bool) -> u32 { + value as u32 + } +} +impl From for u64 { + fn from(value: bool) -> u64 { + value as u64 + } +} +impl From for i8 { + fn from(value: bool) -> i8 { + value as i8 + } +} +impl From for i32 { + fn from(value: bool) -> i32 { + value as i32 + } +} +impl From for i64 { + fn from(value: bool) -> i64 { + value as i64 + } +} +impl From for Field { + fn from(value: bool) -> Field { + value as Field + } +} +``` +> Source code: noir_stdlib/src/convert.nr#L25-L116 + + +#### When to implement `From` + +As a general rule of thumb, `From` may be implemented in the [situations where it would be suitable in Rust](https://doc.rust-lang.org/std/convert/trait.From.html#when-to-implement-from): + +- The conversion is *infallible*: Noir does not provide an equivalent to Rust's `TryFrom`, if the conversion can fail then provide a named method instead. +- The conversion is *lossless*: semantically, it should not lose or discard information. For example, `u32: From` can losslessly convert any `u16` into a valid `u32` such that the original `u16` can be recovered. On the other hand, `u16: From` should not be implemented as `2**16` is a `u32` which cannot be losslessly converted into a `u16`. +- The conversion is *value-preserving*: the conceptual kind and meaning of the resulting value is the same, even though the Noir type and technical representation might be different. While it's possible to infallibly and losslessly convert a `u8` into a `str<2>` hex representation, `4u8` and `"04"` are too different for `str<2>: From` to be implemented. +- The conversion is *obvious*: it's the only reasonable conversion between the two types. If there's ambiguity on how to convert between them such that the same input could potentially map to two different values then a named method should be used. For instance rather than implementing `U128: From<[u8; 16]>`, the methods `U128::from_le_bytes` and `U128::from_be_bytes` are used as otherwise the endianness of the array would be ambiguous, resulting in two potential values of `U128` from the same byte array. + +One additional recommendation specific to Noir is: +- The conversion is *efficient*: it's relatively cheap to convert between the two types. Due to being a ZK DSL, it's more important to avoid unnecessary computation compared to Rust. If the implementation of `From` would encourage users to perform unnecessary conversion, resulting in additional proving time, then it may be preferable to expose functionality such that this conversion may be avoided. + +### `std::convert::Into` + +The `Into` trait is defined as the reciprocal of `From`. It should be easy to convince yourself that if we can convert to type `A` from type `B`, then it's possible to convert type `B` into type `A`. + +For this reason, implementing `From` on a type will automatically generate a matching `Into` implementation. One should always prefer implementing `From` over `Into` as implementing `Into` will not generate a matching `From` implementation. + +```rust title="into-trait" showLineNumbers +pub trait Into { + fn into(self) -> T; +} + +impl Into for U where T: From { + fn into(self) -> T { + T::from(self) + } +} +``` +> Source code: noir_stdlib/src/convert.nr#L13-L23 + + +`Into` is most useful when passing function arguments where the types don't quite match up with what the function expects. In this case, the compiler has enough type information to perform the necessary conversion by just appending `.into()` onto the arguments in question. + +--- + +## `std::cmp` + +### `std::cmp::Eq` + +```rust title="eq-trait" showLineNumbers +pub trait Eq { + fn eq(self, other: Self) -> bool; +} +``` +> Source code: noir_stdlib/src/cmp.nr#L4-L8 + + +Returns `true` if `self` is equal to `other`. Implementing this trait on a type +allows the type to be used with `==` and `!=`. + +Implementations: +```rust +impl Eq for Field { .. } + +impl Eq for i8 { .. } +impl Eq for i16 { .. } +impl Eq for i32 { .. } +impl Eq for i64 { .. } + +impl Eq for u8 { .. } +impl Eq for u16 { .. } +impl Eq for u32 { .. } +impl Eq for u64 { .. } + +impl Eq for () { .. } +impl Eq for bool { .. } + +impl Eq for [T; N] + where T: Eq { .. } + +impl Eq for [T] + where T: Eq { .. } + +impl Eq for (A, B) + where A: Eq, B: Eq { .. } + +impl Eq for (A, B, C) + where A: Eq, B: Eq, C: Eq { .. } + +impl Eq for (A, B, C, D) + where A: Eq, B: Eq, C: Eq, D: Eq { .. } + +impl Eq for (A, B, C, D, E) + where A: Eq, B: Eq, C: Eq, D: Eq, E: Eq { .. } +``` + +### `std::cmp::Ord` + +```rust title="ord-trait" showLineNumbers +pub trait Ord { + fn cmp(self, other: Self) -> Ordering; +} +``` +> Source code: noir_stdlib/src/cmp.nr#L175-L179 + + +`a.cmp(b)` compares two values returning `Ordering::less()` if `a < b`, +`Ordering::equal()` if `a == b`, or `Ordering::greater()` if `a > b`. +Implementing this trait on a type allows `<`, `<=`, `>`, and `>=` to be +used on values of the type. + +`std::cmp` also provides `max` and `min` functions for any type which implements the `Ord` trait. + +Implementations: + +```rust +impl Ord for u8 { .. } +impl Ord for u16 { .. } +impl Ord for u32 { .. } +impl Ord for u64 { .. } + +impl Ord for i8 { .. } +impl Ord for i16 { .. } +impl Ord for i32 { .. } + +impl Ord for i64 { .. } + +impl Ord for () { .. } +impl Ord for bool { .. } + +impl Ord for [T; N] + where T: Ord { .. } + +impl Ord for [T] + where T: Ord { .. } + +impl Ord for (A, B) + where A: Ord, B: Ord { .. } + +impl Ord for (A, B, C) + where A: Ord, B: Ord, C: Ord { .. } + +impl Ord for (A, B, C, D) + where A: Ord, B: Ord, C: Ord, D: Ord { .. } + +impl Ord for (A, B, C, D, E) + where A: Ord, B: Ord, C: Ord, D: Ord, E: Ord { .. } +``` + +--- + +## `std::ops` + +### `std::ops::Add`, `std::ops::Sub`, `std::ops::Mul`, and `std::ops::Div` + +These traits abstract over addition, subtraction, multiplication, and division respectively. +Implementing these traits for a given type will also allow that type to be used with the corresponding operator +for that trait (`+` for Add, etc) in addition to the normal method names. + +```rust title="add-trait" showLineNumbers +pub trait Add { + fn add(self, other: Self) -> Self; +} +``` +> Source code: noir_stdlib/src/ops/arith.nr#L1-L5 + +```rust title="sub-trait" showLineNumbers +pub trait Sub { + fn sub(self, other: Self) -> Self; +} +``` +> Source code: noir_stdlib/src/ops/arith.nr#L60-L64 + +```rust title="mul-trait" showLineNumbers +pub trait Mul { + fn mul(self, other: Self) -> Self; +} +``` +> Source code: noir_stdlib/src/ops/arith.nr#L119-L123 + +```rust title="div-trait" showLineNumbers +pub trait Div { + fn div(self, other: Self) -> Self; +} +``` +> Source code: noir_stdlib/src/ops/arith.nr#L178-L182 + + +The implementations block below is given for the `Add` trait, but the same types that implement +`Add` also implement `Sub`, `Mul`, and `Div`. + +Implementations: +```rust +impl Add for Field { .. } + +impl Add for i8 { .. } +impl Add for i16 { .. } +impl Add for i32 { .. } +impl Add for i64 { .. } + +impl Add for u8 { .. } +impl Add for u16 { .. } +impl Add for u32 { .. } +impl Add for u64 { .. } +``` + +### `std::ops::Rem` + +```rust title="rem-trait" showLineNumbers +pub trait Rem { + fn rem(self, other: Self) -> Self; +} +``` +> Source code: noir_stdlib/src/ops/arith.nr#L237-L241 + + +`Rem::rem(a, b)` is the remainder function returning the result of what is +left after dividing `a` and `b`. Implementing `Rem` allows the `%` operator +to be used with the implementation type. + +Unlike other numeric traits, `Rem` is not implemented for `Field`. + +Implementations: +```rust +impl Rem for u8 { fn rem(self, other: u8) -> u8 { self % other } } +impl Rem for u16 { fn rem(self, other: u16) -> u16 { self % other } } +impl Rem for u32 { fn rem(self, other: u32) -> u32 { self % other } } +impl Rem for u64 { fn rem(self, other: u64) -> u64 { self % other } } + +impl Rem for i8 { fn rem(self, other: i8) -> i8 { self % other } } +impl Rem for i16 { fn rem(self, other: i16) -> i16 { self % other } } +impl Rem for i32 { fn rem(self, other: i32) -> i32 { self % other } } +impl Rem for i64 { fn rem(self, other: i64) -> i64 { self % other } } +``` + +### `std::ops::Neg` + +```rust title="neg-trait" showLineNumbers +pub trait Neg { + fn neg(self) -> Self; +} +``` +> Source code: noir_stdlib/src/ops/arith.nr#L290-L294 + + +`Neg::neg` is equivalent to the unary negation operator `-`. + +Implementations: +```rust title="neg-trait-impls" showLineNumbers +impl Neg for Field { + fn neg(self) -> Field { + -self + } +} + +impl Neg for i8 { + fn neg(self) -> i8 { + -self + } +} +impl Neg for i16 { + fn neg(self) -> i16 { + -self + } +} +impl Neg for i32 { + fn neg(self) -> i32 { + -self + } +} +impl Neg for i64 { + fn neg(self) -> i64 { + -self + } +} +``` +> Source code: noir_stdlib/src/ops/arith.nr#L296-L323 + + +### `std::ops::Not` + +```rust title="not-trait" showLineNumbers +pub trait Not { + fn not(self: Self) -> Self; +} +``` +> Source code: noir_stdlib/src/ops/bit.nr#L1-L5 + + +`Not::not` is equivalent to the unary bitwise NOT operator `!`. + +Implementations: +```rust title="not-trait-impls" showLineNumbers +impl Not for bool { + fn not(self) -> bool { + !self + } +} + +impl Not for u64 { + fn not(self) -> u64 { + !self + } +} +impl Not for u32 { + fn not(self) -> u32 { + !self + } +} +impl Not for u16 { + fn not(self) -> u16 { + !self + } +} +impl Not for u8 { + fn not(self) -> u8 { + !self + } +} +impl Not for u1 { + fn not(self) -> u1 { + !self + } +} + +impl Not for i8 { + fn not(self) -> i8 { + !self + } +} +impl Not for i16 { + fn not(self) -> i16 { + !self + } +} +impl Not for i32 { + fn not(self) -> i32 { + !self + } +} +impl Not for i64 { + fn not(self) -> i64 { + !self + } +} +``` +> Source code: noir_stdlib/src/ops/bit.nr#L7-L60 + + +### `std::ops::{ BitOr, BitAnd, BitXor }` + +```rust title="bitor-trait" showLineNumbers +pub trait BitOr { + fn bitor(self, other: Self) -> Self; +} +``` +> Source code: noir_stdlib/src/ops/bit.nr#L62-L66 + +```rust title="bitand-trait" showLineNumbers +pub trait BitAnd { + fn bitand(self, other: Self) -> Self; +} +``` +> Source code: noir_stdlib/src/ops/bit.nr#L121-L125 + +```rust title="bitxor-trait" showLineNumbers +pub trait BitXor { + fn bitxor(self, other: Self) -> Self; +} +``` +> Source code: noir_stdlib/src/ops/bit.nr#L180-L184 + + +Traits for the bitwise operations `|`, `&`, and `^`. + +Implementing `BitOr`, `BitAnd` or `BitXor` for a type allows the `|`, `&`, or `^` operator respectively +to be used with the type. + +The implementations block below is given for the `BitOr` trait, but the same types that implement +`BitOr` also implement `BitAnd` and `BitXor`. + +Implementations: +```rust +impl BitOr for bool { fn bitor(self, other: bool) -> bool { self | other } } + +impl BitOr for u8 { fn bitor(self, other: u8) -> u8 { self | other } } +impl BitOr for u16 { fn bitor(self, other: u16) -> u16 { self | other } } +impl BitOr for u32 { fn bitor(self, other: u32) -> u32 { self | other } } +impl BitOr for u64 { fn bitor(self, other: u64) -> u64 { self | other } } + +impl BitOr for i8 { fn bitor(self, other: i8) -> i8 { self | other } } +impl BitOr for i16 { fn bitor(self, other: i16) -> i16 { self | other } } +impl BitOr for i32 { fn bitor(self, other: i32) -> i32 { self | other } } +impl BitOr for i64 { fn bitor(self, other: i64) -> i64 { self | other } } +``` + +### `std::ops::{ Shl, Shr }` + +```rust title="shl-trait" showLineNumbers +pub trait Shl { + fn shl(self, other: u8) -> Self; +} +``` +> Source code: noir_stdlib/src/ops/bit.nr#L239-L243 + +```rust title="shr-trait" showLineNumbers +pub trait Shr { + fn shr(self, other: u8) -> Self; +} +``` +> Source code: noir_stdlib/src/ops/bit.nr#L292-L296 + + +Traits for a bit shift left and bit shift right. + +Implementing `Shl` for a type allows the left shift operator (`<<`) to be used with the implementation type. +Similarly, implementing `Shr` allows the right shift operator (`>>`) to be used with the type. + +Note that bit shifting is not currently implemented for signed types. + +The implementations block below is given for the `Shl` trait, but the same types that implement +`Shl` also implement `Shr`. + +Implementations: +```rust +impl Shl for u8 { fn shl(self, other: u8) -> u8 { self << other } } +impl Shl for u16 { fn shl(self, other: u16) -> u16 { self << other } } +impl Shl for u32 { fn shl(self, other: u32) -> u32 { self << other } } +impl Shl for u64 { fn shl(self, other: u64) -> u64 { self << other } } +``` + +--- + +## `std::append` + +### `std::append::Append` + +`Append` can abstract over types that can be appended to - usually container types: + +```rust title="append-trait" showLineNumbers +pub trait Append { + fn empty() -> Self; + fn append(self, other: Self) -> Self; +} +``` +> Source code: noir_stdlib/src/append.nr#L9-L14 + + +`Append` requires two methods: + +- `empty`: Constructs an empty value of `Self`. +- `append`: Append two values together, returning the result. + +Additionally, it is expected that for any implementation: + +- `T::empty().append(x) == x` +- `x.append(T::empty()) == x` + +Implementations: +```rust +impl Append for [T] +impl Append for Quoted +``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/zeroed.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/zeroed.md new file mode 100644 index 00000000000..f450fecdd36 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/noir/standard_library/zeroed.md @@ -0,0 +1,26 @@ +--- +title: Zeroed Function +description: + The zeroed function returns a zeroed value of any type. +keywords: + [ + zeroed + ] +--- + +Implements `fn zeroed() -> T` to return a zeroed value of any type. This function is generally unsafe to use as the zeroed bit pattern is not guaranteed to be valid for all types. It can however, be useful in cases when the value is guaranteed not to be used such as in a BoundedVec library implementing a growable vector, up to a certain length, backed by an array. The array can be initialized with zeroed values which are guaranteed to be inaccessible until the vector is pushed to. Similarly, enumerations in noir can be implemented using this method by providing zeroed values for the unused variants. + +You can access the function at `std::unsafe::zeroed`. + +This function currently supports the following types: + +- Field +- Bool +- Uint +- Array +- Slice +- String +- Tuple +- Function + +Using it on other types could result in unexpected behavior. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/.nojekyll b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/.nojekyll new file mode 100644 index 00000000000..e2ac6616add --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/classes/BarretenbergBackend.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/classes/BarretenbergBackend.md new file mode 100644 index 00000000000..252d72a0b71 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/classes/BarretenbergBackend.md @@ -0,0 +1,138 @@ +# BarretenbergBackend + +## Implements + +- [`Backend`](../index.md#backend) +- [`Backend`](../index.md#backend) + +## Constructors + +### new BarretenbergBackend(acirCircuit, options) + +```ts +new BarretenbergBackend(acirCircuit, options): BarretenbergBackend +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `acirCircuit` | `CompiledCircuit` | +| `options` | [`BackendOptions`](../type-aliases/BackendOptions.md) | + +#### Returns + +[`BarretenbergBackend`](BarretenbergBackend.md) + +## Properties + +| Property | Type | Description | +| :------ | :------ | :------ | +| `backend` | `UltraPlonkBackend` | - | + +## Methods + +### destroy() + +```ts +destroy(): Promise +``` + +#### Returns + +`Promise`\<`void`\> + +*** + +### generateProof() + +```ts +generateProof(compressedWitness): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `compressedWitness` | `Uint8Array` | + +#### Returns + +`Promise`\<`ProofData`\> + +#### Description + +Generates a proof + +*** + +### generateRecursiveProofArtifacts() + +```ts +generateRecursiveProofArtifacts(proofData, numOfPublicInputs): Promise +``` + +Generates artifacts that will be passed to a circuit that will verify this proof. + +Instead of passing the proof and verification key as a byte array, we pass them +as fields which makes it cheaper to verify in a circuit. + +The proof that is passed here will have been created using a circuit +that has the #[recursive] attribute on its `main` method. + +The number of public inputs denotes how many public inputs are in the inner proof. + +#### Parameters + +| Parameter | Type | Default value | +| :------ | :------ | :------ | +| `proofData` | `ProofData` | `undefined` | +| `numOfPublicInputs` | `number` | `0` | + +#### Returns + +`Promise`\<`object`\> + +#### Example + +```typescript +const artifacts = await backend.generateRecursiveProofArtifacts(proof, numOfPublicInputs); +``` + +*** + +### getVerificationKey() + +```ts +getVerificationKey(): Promise +``` + +#### Returns + +`Promise`\<`Uint8Array`\> + +*** + +### verifyProof() + +```ts +verifyProof(proofData): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `proofData` | `ProofData` | + +#### Returns + +`Promise`\<`boolean`\> + +#### Description + +Verifies a proof + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/classes/BarretenbergVerifier.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/classes/BarretenbergVerifier.md new file mode 100644 index 00000000000..500276ea748 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/classes/BarretenbergVerifier.md @@ -0,0 +1,58 @@ +# BarretenbergVerifier + +## Constructors + +### new BarretenbergVerifier(options) + +```ts +new BarretenbergVerifier(options): BarretenbergVerifier +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `options` | [`BackendOptions`](../type-aliases/BackendOptions.md) | + +#### Returns + +[`BarretenbergVerifier`](BarretenbergVerifier.md) + +## Methods + +### destroy() + +```ts +destroy(): Promise +``` + +#### Returns + +`Promise`\<`void`\> + +*** + +### verifyProof() + +```ts +verifyProof(proofData, verificationKey): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `proofData` | `ProofData` | +| `verificationKey` | `Uint8Array` | + +#### Returns + +`Promise`\<`boolean`\> + +#### Description + +Verifies a proof + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/classes/UltraHonkBackend.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/classes/UltraHonkBackend.md new file mode 100644 index 00000000000..204aaa18db6 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/classes/UltraHonkBackend.md @@ -0,0 +1,114 @@ +# UltraHonkBackend + +## Implements + +- [`Backend`](../index.md#backend) +- [`Backend`](../index.md#backend) + +## Constructors + +### new UltraHonkBackend(acirCircuit, options) + +```ts +new UltraHonkBackend(acirCircuit, options): UltraHonkBackend +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `acirCircuit` | `CompiledCircuit` | +| `options` | [`BackendOptions`](../type-aliases/BackendOptions.md) | + +#### Returns + +[`UltraHonkBackend`](UltraHonkBackend.md) + +## Properties + +| Property | Type | Description | +| :------ | :------ | :------ | +| `backend` | `UltraHonkBackend` | - | + +## Methods + +### destroy() + +```ts +destroy(): Promise +``` + +#### Returns + +`Promise`\<`void`\> + +*** + +### generateProof() + +```ts +generateProof(compressedWitness): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `compressedWitness` | `Uint8Array` | + +#### Returns + +`Promise`\<`ProofData`\> + +*** + +### generateRecursiveProofArtifacts() + +```ts +generateRecursiveProofArtifacts(proofData, numOfPublicInputs): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `proofData` | `ProofData` | +| `numOfPublicInputs` | `number` | + +#### Returns + +`Promise`\<`object`\> + +*** + +### getVerificationKey() + +```ts +getVerificationKey(): Promise +``` + +#### Returns + +`Promise`\<`Uint8Array`\> + +*** + +### verifyProof() + +```ts +verifyProof(proofData): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `proofData` | `ProofData` | + +#### Returns + +`Promise`\<`boolean`\> + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/classes/UltraHonkVerifier.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/classes/UltraHonkVerifier.md new file mode 100644 index 00000000000..aee9460153f --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/classes/UltraHonkVerifier.md @@ -0,0 +1,58 @@ +# UltraHonkVerifier + +## Constructors + +### new UltraHonkVerifier(options) + +```ts +new UltraHonkVerifier(options): UltraHonkVerifier +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `options` | [`BackendOptions`](../type-aliases/BackendOptions.md) | + +#### Returns + +[`UltraHonkVerifier`](UltraHonkVerifier.md) + +## Methods + +### destroy() + +```ts +destroy(): Promise +``` + +#### Returns + +`Promise`\<`void`\> + +*** + +### verifyProof() + +```ts +verifyProof(proofData, verificationKey): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `proofData` | `ProofData` | +| `verificationKey` | `Uint8Array` | + +#### Returns + +`Promise`\<`boolean`\> + +#### Description + +Verifies a proof + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/index.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/index.md new file mode 100644 index 00000000000..4699e16dee6 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/index.md @@ -0,0 +1,42 @@ +# backend_barretenberg + +## Exports + +### Classes + +| Class | Description | +| :------ | :------ | +| [BarretenbergBackend](classes/BarretenbergBackend.md) | - | +| [BarretenbergVerifier](classes/BarretenbergVerifier.md) | - | +| [UltraHonkBackend](classes/UltraHonkBackend.md) | - | +| [UltraHonkVerifier](classes/UltraHonkVerifier.md) | - | + +### Type Aliases + +| Type alias | Description | +| :------ | :------ | +| [BackendOptions](type-aliases/BackendOptions.md) | - | + +## References + +### CompiledCircuit + +Renames and re-exports [Backend](index.md#backend) + +*** + +### ProofData + +Renames and re-exports [Backend](index.md#backend) + +## Variables + +### Backend + +```ts +Backend: any; +``` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/type-aliases/BackendOptions.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/type-aliases/BackendOptions.md new file mode 100644 index 00000000000..99ade2ce6f7 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/type-aliases/BackendOptions.md @@ -0,0 +1,18 @@ +# BackendOptions + +```ts +type BackendOptions: object; +``` + +## Type declaration + +| Member | Type | Description | +| :------ | :------ | :------ | +| `memory` | `object` | - | +| `memory.initial` | `number` | - | +| `memory.maximum` | `number` | - | +| `threads` | `number` | - | + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/typedoc-sidebar.cjs b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/typedoc-sidebar.cjs new file mode 100644 index 00000000000..8ecf05c0163 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/backend_barretenberg/typedoc-sidebar.cjs @@ -0,0 +1,4 @@ +// @ts-check +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const typedocSidebar = { items: [{"type":"category","label":"Classes","items":[{"type":"doc","id":"reference/NoirJS/backend_barretenberg/classes/BarretenbergBackend","label":"BarretenbergBackend"},{"type":"doc","id":"reference/NoirJS/backend_barretenberg/classes/BarretenbergVerifier","label":"BarretenbergVerifier"},{"type":"doc","id":"reference/NoirJS/backend_barretenberg/classes/UltraHonkBackend","label":"UltraHonkBackend"},{"type":"doc","id":"reference/NoirJS/backend_barretenberg/classes/UltraHonkVerifier","label":"UltraHonkVerifier"}]},{"type":"category","label":"Type Aliases","items":[{"type":"doc","id":"reference/NoirJS/backend_barretenberg/type-aliases/BackendOptions","label":"BackendOptions"}]}]}; +module.exports = typedocSidebar.items; \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/.nojekyll b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/.nojekyll new file mode 100644 index 00000000000..e2ac6616add --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/classes/Noir.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/classes/Noir.md new file mode 100644 index 00000000000..ead255bc504 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/classes/Noir.md @@ -0,0 +1,52 @@ +# Noir + +## Constructors + +### new Noir(circuit) + +```ts +new Noir(circuit): Noir +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `circuit` | `CompiledCircuit` | + +#### Returns + +[`Noir`](Noir.md) + +## Methods + +### execute() + +```ts +execute(inputs, foreignCallHandler?): Promise +``` + +#### Parameters + +| Parameter | Type | +| :------ | :------ | +| `inputs` | `InputMap` | +| `foreignCallHandler`? | [`ForeignCallHandler`](../type-aliases/ForeignCallHandler.md) | + +#### Returns + +`Promise`\<`object`\> + +#### Description + +Allows to execute a circuit to get its witness and return value. + +#### Example + +```typescript +async execute(inputs) +``` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/and.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/and.md new file mode 100644 index 00000000000..c783283e396 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/and.md @@ -0,0 +1,22 @@ +# and() + +```ts +and(lhs, rhs): string +``` + +Performs a bitwise AND operation between `lhs` and `rhs` + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `lhs` | `string` | | +| `rhs` | `string` | | + +## Returns + +`string` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/blake2s256.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/blake2s256.md new file mode 100644 index 00000000000..7882d0da8d5 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/blake2s256.md @@ -0,0 +1,21 @@ +# blake2s256() + +```ts +blake2s256(inputs): Uint8Array +``` + +Calculates the Blake2s256 hash of the input bytes + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `inputs` | `Uint8Array` | | + +## Returns + +`Uint8Array` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/ecdsa_secp256k1_verify.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/ecdsa_secp256k1_verify.md new file mode 100644 index 00000000000..5e3cd53e9d3 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/ecdsa_secp256k1_verify.md @@ -0,0 +1,28 @@ +# ecdsa\_secp256k1\_verify() + +```ts +ecdsa_secp256k1_verify( + hashed_msg, + public_key_x_bytes, + public_key_y_bytes, + signature): boolean +``` + +Verifies a ECDSA signature over the secp256k1 curve. + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `hashed_msg` | `Uint8Array` | | +| `public_key_x_bytes` | `Uint8Array` | | +| `public_key_y_bytes` | `Uint8Array` | | +| `signature` | `Uint8Array` | | + +## Returns + +`boolean` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/ecdsa_secp256r1_verify.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/ecdsa_secp256r1_verify.md new file mode 100644 index 00000000000..0b20ff68957 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/ecdsa_secp256r1_verify.md @@ -0,0 +1,28 @@ +# ecdsa\_secp256r1\_verify() + +```ts +ecdsa_secp256r1_verify( + hashed_msg, + public_key_x_bytes, + public_key_y_bytes, + signature): boolean +``` + +Verifies a ECDSA signature over the secp256r1 curve. + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `hashed_msg` | `Uint8Array` | | +| `public_key_x_bytes` | `Uint8Array` | | +| `public_key_y_bytes` | `Uint8Array` | | +| `signature` | `Uint8Array` | | + +## Returns + +`boolean` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/keccak256.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/keccak256.md new file mode 100644 index 00000000000..d10f155ce86 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/keccak256.md @@ -0,0 +1,21 @@ +# keccak256() + +```ts +keccak256(inputs): Uint8Array +``` + +Calculates the Keccak256 hash of the input bytes + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `inputs` | `Uint8Array` | | + +## Returns + +`Uint8Array` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/xor.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/xor.md new file mode 100644 index 00000000000..8d762b895d3 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/functions/xor.md @@ -0,0 +1,22 @@ +# xor() + +```ts +xor(lhs, rhs): string +``` + +Performs a bitwise XOR operation between `lhs` and `rhs` + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `lhs` | `string` | | +| `rhs` | `string` | | + +## Returns + +`string` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/index.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/index.md new file mode 100644 index 00000000000..b65a44865ee --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/index.md @@ -0,0 +1,48 @@ +# noir_js + +## Exports + +### Classes + +| Class | Description | +| :------ | :------ | +| [Noir](classes/Noir.md) | - | + +### Type Aliases + +| Type alias | Description | +| :------ | :------ | +| [ErrorWithPayload](type-aliases/ErrorWithPayload.md) | - | +| [ForeignCallHandler](type-aliases/ForeignCallHandler.md) | A callback which performs an foreign call and returns the response. | +| [ForeignCallInput](type-aliases/ForeignCallInput.md) | - | +| [ForeignCallOutput](type-aliases/ForeignCallOutput.md) | - | +| [WitnessMap](type-aliases/WitnessMap.md) | - | + +### Functions + +| Function | Description | +| :------ | :------ | +| [and](functions/and.md) | Performs a bitwise AND operation between `lhs` and `rhs` | +| [blake2s256](functions/blake2s256.md) | Calculates the Blake2s256 hash of the input bytes | +| [ecdsa\_secp256k1\_verify](functions/ecdsa_secp256k1_verify.md) | Verifies a ECDSA signature over the secp256k1 curve. | +| [ecdsa\_secp256r1\_verify](functions/ecdsa_secp256r1_verify.md) | Verifies a ECDSA signature over the secp256r1 curve. | +| [keccak256](functions/keccak256.md) | Calculates the Keccak256 hash of the input bytes | +| [xor](functions/xor.md) | Performs a bitwise XOR operation between `lhs` and `rhs` | + +## References + +### CompiledCircuit + +Renames and re-exports [InputMap](index.md#inputmap) + +## Variables + +### InputMap + +```ts +InputMap: any; +``` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/type-aliases/ErrorWithPayload.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/type-aliases/ErrorWithPayload.md new file mode 100644 index 00000000000..e8c2f4aef3d --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/type-aliases/ErrorWithPayload.md @@ -0,0 +1,15 @@ +# ErrorWithPayload + +```ts +type ErrorWithPayload: ExecutionError & object; +``` + +## Type declaration + +| Member | Type | Description | +| :------ | :------ | :------ | +| `decodedAssertionPayload` | `any` | - | + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/type-aliases/ForeignCallHandler.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/type-aliases/ForeignCallHandler.md new file mode 100644 index 00000000000..812b8b16481 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/type-aliases/ForeignCallHandler.md @@ -0,0 +1,24 @@ +# ForeignCallHandler + +```ts +type ForeignCallHandler: (name, inputs) => Promise; +``` + +A callback which performs an foreign call and returns the response. + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `name` | `string` | The identifier for the type of foreign call being performed. | +| `inputs` | [`ForeignCallInput`](ForeignCallInput.md)[] | An array of hex encoded inputs to the foreign call. | + +## Returns + +`Promise`\<[`ForeignCallOutput`](ForeignCallOutput.md)[]\> + +outputs - An array of hex encoded outputs containing the results of the foreign call. + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/type-aliases/ForeignCallInput.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/type-aliases/ForeignCallInput.md new file mode 100644 index 00000000000..dd95809186a --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/type-aliases/ForeignCallInput.md @@ -0,0 +1,9 @@ +# ForeignCallInput + +```ts +type ForeignCallInput: string[]; +``` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/type-aliases/ForeignCallOutput.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/type-aliases/ForeignCallOutput.md new file mode 100644 index 00000000000..b71fb78a946 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/type-aliases/ForeignCallOutput.md @@ -0,0 +1,9 @@ +# ForeignCallOutput + +```ts +type ForeignCallOutput: string | string[]; +``` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/type-aliases/WitnessMap.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/type-aliases/WitnessMap.md new file mode 100644 index 00000000000..258c46f9d0c --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/type-aliases/WitnessMap.md @@ -0,0 +1,9 @@ +# WitnessMap + +```ts +type WitnessMap: Map; +``` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/typedoc-sidebar.cjs b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/typedoc-sidebar.cjs new file mode 100644 index 00000000000..9c7fc4a353f --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_js/typedoc-sidebar.cjs @@ -0,0 +1,4 @@ +// @ts-check +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const typedocSidebar = { items: [{"type":"category","label":"Classes","items":[{"type":"doc","id":"reference/NoirJS/noir_js/classes/Noir","label":"Noir"}]},{"type":"category","label":"Type Aliases","items":[{"type":"doc","id":"reference/NoirJS/noir_js/type-aliases/ErrorWithPayload","label":"ErrorWithPayload"},{"type":"doc","id":"reference/NoirJS/noir_js/type-aliases/ForeignCallHandler","label":"ForeignCallHandler"},{"type":"doc","id":"reference/NoirJS/noir_js/type-aliases/ForeignCallInput","label":"ForeignCallInput"},{"type":"doc","id":"reference/NoirJS/noir_js/type-aliases/ForeignCallOutput","label":"ForeignCallOutput"},{"type":"doc","id":"reference/NoirJS/noir_js/type-aliases/WitnessMap","label":"WitnessMap"}]},{"type":"category","label":"Functions","items":[{"type":"doc","id":"reference/NoirJS/noir_js/functions/and","label":"and"},{"type":"doc","id":"reference/NoirJS/noir_js/functions/blake2s256","label":"blake2s256"},{"type":"doc","id":"reference/NoirJS/noir_js/functions/ecdsa_secp256k1_verify","label":"ecdsa_secp256k1_verify"},{"type":"doc","id":"reference/NoirJS/noir_js/functions/ecdsa_secp256r1_verify","label":"ecdsa_secp256r1_verify"},{"type":"doc","id":"reference/NoirJS/noir_js/functions/keccak256","label":"keccak256"},{"type":"doc","id":"reference/NoirJS/noir_js/functions/xor","label":"xor"}]}]}; +module.exports = typedocSidebar.items; \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/.nojekyll b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/.nojekyll new file mode 100644 index 00000000000..e2ac6616add --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/functions/compile.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/functions/compile.md new file mode 100644 index 00000000000..6faf763b37f --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/functions/compile.md @@ -0,0 +1,51 @@ +# compile() + +```ts +compile( + fileManager, + projectPath?, + logFn?, +debugLogFn?): Promise +``` + +Compiles a Noir project + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `fileManager` | `FileManager` | The file manager to use | +| `projectPath`? | `string` | The path to the project inside the file manager. Defaults to the root of the file manager | +| `logFn`? | `LogFn` | A logging function. If not provided, console.log will be used | +| `debugLogFn`? | `LogFn` | A debug logging function. If not provided, logFn will be used | + +## Returns + +`Promise`\<[`ProgramCompilationArtifacts`](../index.md#programcompilationartifacts)\> + +## Example + +```typescript +// Node.js + +import { compile_program, createFileManager } from '@noir-lang/noir_wasm'; + +const fm = createFileManager(myProjectPath); +const myCompiledCode = await compile_program(fm); +``` + +```typescript +// Browser + +import { compile_program, createFileManager } from '@noir-lang/noir_wasm'; + +const fm = createFileManager('/'); +for (const path of files) { + await fm.writeFile(path, await getFileAsStream(path)); +} +const myCompiledCode = await compile_program(fm); +``` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/functions/compile_contract.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/functions/compile_contract.md new file mode 100644 index 00000000000..7d0b39a43ef --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/functions/compile_contract.md @@ -0,0 +1,51 @@ +# compile\_contract() + +```ts +compile_contract( + fileManager, + projectPath?, + logFn?, +debugLogFn?): Promise +``` + +Compiles a Noir project + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `fileManager` | `FileManager` | The file manager to use | +| `projectPath`? | `string` | The path to the project inside the file manager. Defaults to the root of the file manager | +| `logFn`? | `LogFn` | A logging function. If not provided, console.log will be used | +| `debugLogFn`? | `LogFn` | A debug logging function. If not provided, logFn will be used | + +## Returns + +`Promise`\<[`ContractCompilationArtifacts`](../index.md#contractcompilationartifacts)\> + +## Example + +```typescript +// Node.js + +import { compile_contract, createFileManager } from '@noir-lang/noir_wasm'; + +const fm = createFileManager(myProjectPath); +const myCompiledCode = await compile_contract(fm); +``` + +```typescript +// Browser + +import { compile_contract, createFileManager } from '@noir-lang/noir_wasm'; + +const fm = createFileManager('/'); +for (const path of files) { + await fm.writeFile(path, await getFileAsStream(path)); +} +const myCompiledCode = await compile_contract(fm); +``` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/functions/createFileManager.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/functions/createFileManager.md new file mode 100644 index 00000000000..7e65c1d69c7 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/functions/createFileManager.md @@ -0,0 +1,21 @@ +# createFileManager() + +```ts +createFileManager(dataDir): FileManager +``` + +Creates a new FileManager instance based on fs in node and memfs in the browser (via webpack alias) + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `dataDir` | `string` | root of the file system | + +## Returns + +`FileManager` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/functions/inflateDebugSymbols.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/functions/inflateDebugSymbols.md new file mode 100644 index 00000000000..fcea9275341 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/functions/inflateDebugSymbols.md @@ -0,0 +1,21 @@ +# inflateDebugSymbols() + +```ts +inflateDebugSymbols(debugSymbols): any +``` + +Decompresses and decodes the debug symbols + +## Parameters + +| Parameter | Type | Description | +| :------ | :------ | :------ | +| `debugSymbols` | `string` | The base64 encoded debug symbols | + +## Returns + +`any` + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/index.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/index.md new file mode 100644 index 00000000000..b6e0f9d1bc0 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/index.md @@ -0,0 +1,49 @@ +# noir_wasm + +## Exports + +### Functions + +| Function | Description | +| :------ | :------ | +| [compile](functions/compile.md) | Compiles a Noir project | +| [compile\_contract](functions/compile_contract.md) | Compiles a Noir project | +| [createFileManager](functions/createFileManager.md) | Creates a new FileManager instance based on fs in node and memfs in the browser (via webpack alias) | +| [inflateDebugSymbols](functions/inflateDebugSymbols.md) | Decompresses and decodes the debug symbols | + +## References + +### compile\_program + +Renames and re-exports [compile](functions/compile.md) + +## Interfaces + +### ContractCompilationArtifacts + +The compilation artifacts of a given contract. + +#### Properties + +| Property | Type | Description | +| :------ | :------ | :------ | +| `contract` | `ContractArtifact` | The compiled contract. | +| `warnings` | `unknown`[] | Compilation warnings. | + +*** + +### ProgramCompilationArtifacts + +The compilation artifacts of a given program. + +#### Properties + +| Property | Type | Description | +| :------ | :------ | :------ | +| `name` | `string` | not part of the compilation output, injected later | +| `program` | `ProgramArtifact` | The compiled contract. | +| `warnings` | `unknown`[] | Compilation warnings. | + +*** + +Generated using [typedoc-plugin-markdown](https://www.npmjs.com/package/typedoc-plugin-markdown) and [TypeDoc](https://typedoc.org/) diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/typedoc-sidebar.cjs b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/typedoc-sidebar.cjs new file mode 100644 index 00000000000..e0870710349 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/NoirJS/noir_wasm/typedoc-sidebar.cjs @@ -0,0 +1,4 @@ +// @ts-check +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const typedocSidebar = { items: [{"type":"doc","id":"reference/NoirJS/noir_wasm/index","label":"API"},{"type":"category","label":"Functions","items":[{"type":"doc","id":"reference/NoirJS/noir_wasm/functions/compile","label":"compile"},{"type":"doc","id":"reference/NoirJS/noir_wasm/functions/compile_contract","label":"compile_contract"},{"type":"doc","id":"reference/NoirJS/noir_wasm/functions/createFileManager","label":"createFileManager"},{"type":"doc","id":"reference/NoirJS/noir_wasm/functions/inflateDebugSymbols","label":"inflateDebugSymbols"}]}]}; +module.exports = typedocSidebar.items; \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/_category_.json b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/_category_.json new file mode 100644 index 00000000000..5b6a20a609a --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/_category_.json @@ -0,0 +1,5 @@ +{ + "position": 4, + "collapsible": true, + "collapsed": true +} diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/debugger/_category_.json b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/debugger/_category_.json new file mode 100644 index 00000000000..27869205ad3 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/debugger/_category_.json @@ -0,0 +1,6 @@ +{ + "label": "Debugger", + "position": 1, + "collapsible": true, + "collapsed": true +} diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/debugger/debugger_known_limitations.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/debugger/debugger_known_limitations.md new file mode 100644 index 00000000000..936d416ac4b --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/debugger/debugger_known_limitations.md @@ -0,0 +1,59 @@ +--- +title: Known limitations +description: + An overview of known limitations of the current version of the Noir debugger +keywords: + [ + Nargo, + Noir Debugger, + VS Code, + ] +sidebar_position: 2 +--- + +# Debugger Known Limitations + +There are currently some limits to what the debugger can observe. + +## Mutable references + +The debugger is currently blind to any state mutated via a mutable reference. For example, in: + +``` +let mut x = 1; +let y = &mut x; +*y = 2; +``` + +The update on `x` will not be observed by the debugger. That means, when running `vars` from the debugger REPL, or inspecting the _local variables_ pane in the VS Code debugger, `x` will appear with value 1 despite having executed `*y = 2;`. + +## Variables of type function or mutable references are opaque + +When inspecting variables, any variable of type `Function` or `MutableReference` will render its value as `<>` or `<>`. + +## Debugger instrumentation affects resulting ACIR + +In order to make the state of local variables observable, the debugger compiles Noir circuits interleaving foreign calls that track any mutations to them. While this works (except in the cases described above) and doesn't introduce any behavior changes, it does as a side effect produce bigger bytecode. In particular, when running the command `opcodes` on the REPL debugger, you will notice Unconstrained VM blocks that look like this: + +``` +... +5 BRILLIG inputs=[Single(Expression { mul_terms: [], linear_combinations: [], q_c: 2 }), Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(2))], q_c: 0 })] + | outputs=[] + 5.0 | Mov { destination: RegisterIndex(2), source: RegisterIndex(0) } + 5.1 | Mov { destination: RegisterIndex(3), source: RegisterIndex(1) } + 5.2 | Const { destination: RegisterIndex(0), value: Value { inner: 0 } } + 5.3 | Const { destination: RegisterIndex(1), value: Value { inner: 0 } } + 5.4 | Mov { destination: RegisterIndex(2), source: RegisterIndex(2) } + 5.5 | Mov { destination: RegisterIndex(3), source: RegisterIndex(3) } + 5.6 | Call { location: 8 } + 5.7 | Stop + 5.8 | ForeignCall { function: "__debug_var_assign", destinations: [], inputs: [RegisterIndex(RegisterIndex(2)), RegisterIndex(RegisterIndex(3))] } +... +``` + +If you are interested in debugging/inspecting compiled ACIR without these synthetic changes, you can invoke the REPL debugger with the `--skip-instrumentation` flag or launch the VS Code debugger with the `skipConfiguration` property set to true in its launch configuration. You can find more details about those in the [Debugger REPL reference](debugger_repl.md) and the [VS Code Debugger reference](debugger_vscode.md). + +:::note +Skipping debugger instrumentation means you won't be able to inspect values of local variables. +::: + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/debugger/debugger_repl.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/debugger/debugger_repl.md new file mode 100644 index 00000000000..46e2011304e --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/debugger/debugger_repl.md @@ -0,0 +1,360 @@ +--- +title: REPL Debugger +description: + Noir Debugger REPL options and commands. +keywords: + [ + Nargo, + Noir CLI, + Noir Debugger, + REPL, + ] +sidebar_position: 1 +--- + +## Running the REPL debugger + +`nargo debug [OPTIONS] [WITNESS_NAME]` + +Runs the Noir REPL debugger. If a `WITNESS_NAME` is provided the debugger writes the resulting execution witness to a `WITNESS_NAME` file. + +### Options + +| Option | Description | +| --------------------- | ------------------------------------------------------------ | +| `-p, --prover-name ` | The name of the toml file which contains the inputs for the prover [default: Prover]| +| `--package ` | The name of the package to debug | +| `--print-acir` | Display the ACIR for compiled circuit | +| `--deny-warnings` | Treat all warnings as errors | +| `--silence-warnings` | Suppress warnings | +| `-h, --help` | Print help | + +None of these options are required. + +:::note +Since the debugger starts by compiling the target package, all Noir compiler options are also available. Check out the [compiler reference](../nargo_commands.md#nargo-compile) to learn more about the compiler options. +::: + +## REPL commands + +Once the debugger is running, it accepts the following commands. + +#### `help` (h) + +Displays the menu of available commands. + +``` +> help +Available commands: + + opcodes display ACIR opcodes + into step into to the next opcode + next step until a new source location is reached + out step until a new source location is reached + and the current stack frame is finished + break LOCATION:OpcodeLocation add a breakpoint at an opcode location + over step until a new source location is reached + without diving into function calls + restart restart the debugging session + delete LOCATION:OpcodeLocation delete breakpoint at an opcode location + witness show witness map + witness index:u32 display a single witness from the witness map + witness index:u32 value:String update a witness with the given value + memset index:usize value:String update a memory cell with the given + value + continue continue execution until the end of the + program + vars show variable values available at this point + in execution + stacktrace display the current stack trace + memory show memory (valid when executing unconstrained code) value + step step to the next ACIR opcode + +Other commands: + + help Show this help message + quit Quit repl + +``` + +### Stepping through programs + +#### `next` (n) + +Step until the next Noir source code location. While other commands, such as [`into`](#into-i) and [`step`](#step-s), allow for finer grained control of the program's execution at the opcode level, `next` is source code centric. For example: + +``` +3 ... +4 fn main(x: u32) { +5 assert(entry_point(x) == 2); +6 swap_entry_point(x, x + 1); +7 -> assert(deep_entry_point(x) == 4); +8 multiple_values_entry_point(x); +9 } +``` + + +Using `next` here would cause the debugger to jump to the definition of `deep_entry_point` (if available). + +If you want to step over `deep_entry_point` and go straight to line 8, use [the `over` command](#over) instead. + +#### `over` + +Step until the next source code location, without diving into function calls. For example: + +``` +3 ... +4 fn main(x: u32) { +5 assert(entry_point(x) == 2); +6 swap_entry_point(x, x + 1); +7 -> assert(deep_entry_point(x) == 4); +8 multiple_values_entry_point(x); +9 } +``` + + +Using `over` here would cause the debugger to execute until line 8 (`multiple_values_entry_point(x);`). + +If you want to step into `deep_entry_point` instead, use [the `next` command](#next-n). + +#### `out` + +Step until the end of the current function call. For example: + +``` + 3 ... + 4 fn main(x: u32) { + 5 assert(entry_point(x) == 2); + 6 swap_entry_point(x, x + 1); + 7 -> assert(deep_entry_point(x) == 4); + 8 multiple_values_entry_point(x); + 9 } + 10 + 11 unconstrained fn returns_multiple_values(x: u32) -> (u32, u32, u32, u32) { + 12 ... + ... + 55 + 56 unconstrained fn deep_entry_point(x: u32) -> u32 { + 57 -> level_1(x + 1) + 58 } + +``` + +Running `out` here will resume execution until line 8. + +#### `step` (s) + +Skips to the next ACIR code. A compiled Noir program is a sequence of ACIR opcodes. However, an unconstrained VM opcode denotes the start of an unconstrained code block, to be executed by the unconstrained VM. For example (redacted for brevity): + +``` +0 BLACKBOX::RANGE [(_0, num_bits: 32)] [ ] +1 -> BRILLIG inputs=[Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })] outputs=[Simple(Witness(1))] + 1.0 | Mov { destination: RegisterIndex(2), source: RegisterIndex(0) } + 1.1 | Const { destination: RegisterIndex(0), value: Value { inner: 0 } } + 1.2 | Const { destination: RegisterIndex(1), value: Value { inner: 0 } } + 1.3 | Mov { destination: RegisterIndex(2), source: RegisterIndex(2) } + 1.4 | Call { location: 7 } + ... + 1.43 | Return +2 EXPR [ (1, _1) -2 ] +``` + +The `->` here shows the debugger paused at an ACIR opcode: `BRILLIG`, at index 1, which denotes an unconstrained code block is about to start. + +Using the `step` command at this point would result in the debugger stopping at ACIR opcode 2, `EXPR`, skipping unconstrained computation steps. + +Use [the `into` command](#into-i) instead if you want to follow unconstrained computation step by step. + +#### `into` (i) + +Steps into the next opcode. A compiled Noir program is a sequence of ACIR opcodes. However, a BRILLIG opcode denotes the start of an unconstrained code block, to be executed by the unconstrained VM. For example (redacted for brevity): + +``` +0 BLACKBOX::RANGE [(_0, num_bits: 32)] [ ] +1 -> BRILLIG inputs=[Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })] outputs=[Simple(Witness(1))] + 1.0 | Mov { destination: RegisterIndex(2), source: RegisterIndex(0) } + 1.1 | Const { destination: RegisterIndex(0), value: Value { inner: 0 } } + 1.2 | Const { destination: RegisterIndex(1), value: Value { inner: 0 } } + 1.3 | Mov { destination: RegisterIndex(2), source: RegisterIndex(2) } + 1.4 | Call { location: 7 } + ... + 1.43 | Return +2 EXPR [ (1, _1) -2 ] +``` + +The `->` here shows the debugger paused at an ACIR opcode: `BRILLIG`, at index 1, which denotes an unconstrained code block is about to start. + +Using the `into` command at this point would result in the debugger stopping at opcode 1.0, `Mov ...`, allowing the debugger user to follow unconstrained computation step by step. + +Use [the `step` command](#step-s) instead if you want to skip to the next ACIR code directly. + +#### `continue` (c) + +Continues execution until the next breakpoint, or the end of the program. + +#### `restart` (res) + +Interrupts execution, and restarts a new debugging session from scratch. + +#### `opcodes` (o) + +Display the program's ACIR opcode sequence. For example: + +``` +0 BLACKBOX::RANGE [(_0, num_bits: 32)] [ ] +1 -> BRILLIG inputs=[Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })] outputs=[Simple(Witness(1))] + 1.0 | Mov { destination: RegisterIndex(2), source: RegisterIndex(0) } + 1.1 | Const { destination: RegisterIndex(0), value: Value { inner: 0 } } + 1.2 | Const { destination: RegisterIndex(1), value: Value { inner: 0 } } + 1.3 | Mov { destination: RegisterIndex(2), source: RegisterIndex(2) } + 1.4 | Call { location: 7 } + ... + 1.43 | Return +2 EXPR [ (1, _1) -2 ] +``` + +### Breakpoints + +#### `break [Opcode]` (or shorthand `b [Opcode]`) + +Sets a breakpoint on the specified opcode index. To get a list of the program opcode numbers, see [the `opcode` command](#opcodes-o). For example: + +``` +0 BLACKBOX::RANGE [(_0, num_bits: 32)] [ ] +1 -> BRILLIG inputs=[Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })] outputs=[Simple(Witness(1))] + 1.0 | Mov { destination: RegisterIndex(2), source: RegisterIndex(0) } + 1.1 | Const { destination: RegisterIndex(0), value: Value { inner: 0 } } + 1.2 | Const { destination: RegisterIndex(1), value: Value { inner: 0 } } + 1.3 | Mov { destination: RegisterIndex(2), source: RegisterIndex(2) } + 1.4 | Call { location: 7 } + ... + 1.43 | Return +2 EXPR [ (1, _1) -2 ] +``` + +In this example, issuing a `break 1.2` command adds break on opcode 1.2, as denoted by the `*` character: + +``` +0 BLACKBOX::RANGE [(_0, num_bits: 32)] [ ] +1 -> BRILLIG inputs=[Single(Expression { mul_terms: [], linear_combinations: [(1, Witness(0))], q_c: 0 })] outputs=[Simple(Witness(1))] + 1.0 | Mov { destination: RegisterIndex(2), source: RegisterIndex(0) } + 1.1 | Const { destination: RegisterIndex(0), value: Value { inner: 0 } } + 1.2 | * Const { destination: RegisterIndex(1), value: Value { inner: 0 } } + 1.3 | Mov { destination: RegisterIndex(2), source: RegisterIndex(2) } + 1.4 | Call { location: 7 } + ... + 1.43 | Return +2 EXPR [ (1, _1) -2 ] +``` + +Running [the `continue` command](#continue-c) at this point would cause the debugger to execute the program until opcode 1.2. + +#### `delete [Opcode]` (or shorthand `d [Opcode]`) + +Deletes a breakpoint at an opcode location. Usage is analogous to [the `break` command](#). + +### Variable inspection + +#### vars + +Show variable values available at this point in execution. + +:::note +The ability to inspect variable values from the debugger depends on compilation to be run in a special debug instrumentation mode. This instrumentation weaves variable tracing code with the original source code. + +So variable value inspection comes at the expense of making the resulting ACIR bytecode bigger and harder to understand and optimize. + +If you find this compromise unacceptable, you can run the debugger with the flag `--skip-debug-instrumentation`. This will compile your circuit without any additional debug information, so the resulting ACIR bytecode will be identical to the one produced by standard Noir compilation. However, if you opt for this, the `vars` command will not be available while debugging. +::: + + +### Stacktrace + +#### `stacktrace` + +Displays the current stack trace. + + +### Witness map + +#### `witness` (w) + +Show witness map. For example: + +``` +_0 = 0 +_1 = 2 +_2 = 1 +``` + +#### `witness [Witness Index]` + +Display a single witness from the witness map. For example: + +``` +> witness 1 +_1 = 2 +``` + +#### `witness [Witness Index] [New value]` + +Overwrite the given index with a new value. For example: + +``` +> witness 1 3 +_1 = 3 +``` + + +### Unconstrained VM memory + +#### `memory` + +Show unconstrained VM memory state. For example: + +``` +> memory +At opcode 1.13: Store { destination_pointer: RegisterIndex(0), source: RegisterIndex(3) } +... +> registers +0 = 0 +1 = 10 +2 = 0 +3 = 1 +4 = 1 +5 = 2³² +6 = 1 +> into +At opcode 1.14: Const { destination: RegisterIndex(5), value: Value { inner: 1 } } +... +> memory +0 = 1 +> +``` + +In the example above: we start with clean memory, then step through a `Store` opcode which stores the value of register 3 (1) into the memory address stored in register 0 (0). Thus now `memory` shows memory address 0 contains value 1. + +:::note +This command is only functional while the debugger is executing unconstrained code. +::: + +#### `memset [Memory address] [New value]` + +Update a memory cell with the given value. For example: + +``` +> memory +0 = 1 +> memset 0 2 +> memory +0 = 2 +> memset 1 4 +> memory +0 = 2 +1 = 4 +> +``` + +:::note +This command is only functional while the debugger is executing unconstrained code. +::: \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/debugger/debugger_vscode.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/debugger/debugger_vscode.md new file mode 100644 index 00000000000..c027332b3b0 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/debugger/debugger_vscode.md @@ -0,0 +1,82 @@ +--- +title: VS Code Debugger +description: + VS Code Debugger configuration and features. +keywords: + [ + Nargo, + Noir CLI, + Noir Debugger, + VS Code, + IDE, + ] +sidebar_position: 0 +--- + +# VS Code Noir Debugger Reference + +The Noir debugger enabled by the vscode-noir extension ships with default settings such that the most common scenario should run without any additional configuration steps. + +These defaults can nevertheless be overridden by defining a launch configuration file. This page provides a reference for the properties you can override via a launch configuration file, as well as documenting the Nargo `dap` command, which is a dependency of the VS Code Noir debugger. + + +## Creating and editing launch configuration files + +To create a launch configuration file from VS Code, open the _debug pane_, and click on _create a launch.json file_. + +![Creating a launch configuration file](@site/static/img/debugger/ref1-create-launch.png) + +A `launch.json` file will be created, populated with basic defaults. + +### Noir Debugger launch.json properties + +#### projectFolder + +_String, optional._ + +Absolute path to the Nargo project to debug. By default, it is dynamically determined by looking for the nearest `Nargo.toml` file to the active file at the moment of launching the debugger. + +#### proverName + +_String, optional._ + +Name of the prover input to use. Defaults to `Prover`, which looks for a file named `Prover.toml` at the `projectFolder`. + +#### generateAcir + +_Boolean, optional._ + +If true, generate ACIR opcodes instead of unconstrained opcodes which will be closer to release binaries but less convenient for debugging. Defaults to `false`. + +#### skipInstrumentation + +_Boolean, optional._ + +Skips variables debugging instrumentation of code, making debugging less convenient but the resulting binary smaller and closer to production. Defaults to `false`. + +:::note +Skipping instrumentation causes the debugger to be unable to inspect local variables. +::: + +## `nargo dap [OPTIONS]` + +When run without any option flags, it starts the Nargo Debug Adapter Protocol server, which acts as the debugging backend for the VS Code Noir Debugger. + +All option flags are related to preflight checks. The Debug Adapter Protocol specifies how errors are to be informed from a running DAP server, but it doesn't specify mechanisms to communicate server initialization errors between the DAP server and its client IDE. + +Thus `nargo dap` ships with a _preflight check_ mode. If flag `--preflight-check` and the rest of the `--preflight-*` flags are provided, Nargo will run the same initialization routine except it will not start the DAP server. + +`vscode-noir` will then run `nargo dap` in preflight check mode first before a debugging session starts. If the preflight check ends in error, vscode-noir will present stderr and stdout output from this process through its own Output pane in VS Code. This makes it possible for users to diagnose what pieces of configuration might be wrong or missing in case of initialization errors. + +If the preflight check succeeds, `vscode-noir` proceeds to start the DAP server normally but running `nargo dap` without any additional flags. + +### Options + +| Option | Description | +| --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | +| `--preflight-check` | If present, dap runs in preflight check mode. | +| `--preflight-project-folder ` | Absolute path to the project to debug for preflight check. | +| `--preflight-prover-name ` | Name of prover file to use for preflight check | +| `--preflight-generate-acir` | Optional. If present, compile in ACIR mode while running preflight check. | +| `--preflight-skip-instrumentation` | Optional. If present, compile without introducing debug instrumentation while running preflight check. | +| `-h, --help` | Print help. | diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/nargo_commands.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/nargo_commands.md new file mode 100644 index 00000000000..db1884afee2 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/nargo_commands.md @@ -0,0 +1,297 @@ +--- +title: Nargo +description: + Noir CLI Commands for Noir Prover and Verifier to create, execute, prove and verify programs, + generate Solidity verifier smart contract and compile into JSON file containing ACIR + representation and ABI of circuit. +keywords: + [ + Nargo, + Noir CLI, + Noir Prover, + Noir Verifier, + generate Solidity verifier, + compile JSON file, + ACIR representation, + ABI of circuit, + TypeScript, + ] +sidebar_position: 0 +--- + +# Command-Line Help for `nargo` + +This document contains the help content for the `nargo` command-line program. + +**Command Overview:** + +* [`nargo`↴](#nargo) +* [`nargo check`↴](#nargo-check) +* [`nargo fmt`↴](#nargo-fmt) +* [`nargo compile`↴](#nargo-compile) +* [`nargo new`↴](#nargo-new) +* [`nargo init`↴](#nargo-init) +* [`nargo execute`↴](#nargo-execute) +* [`nargo debug`↴](#nargo-debug) +* [`nargo test`↴](#nargo-test) +* [`nargo info`↴](#nargo-info) +* [`nargo lsp`↴](#nargo-lsp) + +## `nargo` + +Noir's package manager + +**Usage:** `nargo ` + +###### **Subcommands:** + +* `check` — Checks the constraint system for errors +* `fmt` — Format the Noir files in a workspace +* `compile` — Compile the program and its secret execution trace into ACIR format +* `new` — Create a Noir project in a new directory +* `init` — Create a Noir project in the current directory +* `execute` — Executes a circuit to calculate its return value +* `debug` — Executes a circuit in debug mode +* `test` — Run the tests for this program +* `info` — Provides detailed information on each of a program's function (represented by a single circuit) +* `lsp` — Starts the Noir LSP server + +###### **Options:** + + + + +## `nargo check` + +Checks the constraint system for errors + +**Usage:** `nargo check [OPTIONS]` + +###### **Options:** + +* `--package ` — The name of the package to check +* `--workspace` — Check all packages in the workspace +* `--overwrite` — Force overwrite of existing files +* `--expression-width ` — Specify the backend expression width that should be targeted +* `--bounded-codegen` — Generate ACIR with the target backend expression width. The default is to generate ACIR without a bound and split expressions after code generation. Activating this flag can sometimes provide optimizations for certain programs + + Default value: `false` +* `--force` — Force a full recompilation +* `--print-acir` — Display the ACIR for compiled circuit +* `--deny-warnings` — Treat all warnings as errors +* `--silence-warnings` — Suppress warnings +* `--debug-comptime-in-file ` — Enable printing results of comptime evaluation: provide a path suffix for the module to debug, e.g. "package_name/src/main.nr" +* `--skip-underconstrained-check` — Flag to turn off the compiler check for under constrained values. Warning: This can improve compilation speed but can also lead to correctness errors. This check should always be run on production code + + + +## `nargo fmt` + +Format the Noir files in a workspace + +**Usage:** `nargo fmt [OPTIONS]` + +###### **Options:** + +* `--check` — Run noirfmt in check mode + + + +## `nargo compile` + +Compile the program and its secret execution trace into ACIR format + +**Usage:** `nargo compile [OPTIONS]` + +###### **Options:** + +* `--package ` — The name of the package to compile +* `--workspace` — Compile all packages in the workspace +* `--expression-width ` — Specify the backend expression width that should be targeted +* `--bounded-codegen` — Generate ACIR with the target backend expression width. The default is to generate ACIR without a bound and split expressions after code generation. Activating this flag can sometimes provide optimizations for certain programs + + Default value: `false` +* `--force` — Force a full recompilation +* `--print-acir` — Display the ACIR for compiled circuit +* `--deny-warnings` — Treat all warnings as errors +* `--silence-warnings` — Suppress warnings +* `--debug-comptime-in-file ` — Enable printing results of comptime evaluation: provide a path suffix for the module to debug, e.g. "package_name/src/main.nr" +* `--skip-underconstrained-check` — Flag to turn off the compiler check for under constrained values. Warning: This can improve compilation speed but can also lead to correctness errors. This check should always be run on production code + + + +## `nargo new` + +Create a Noir project in a new directory + +**Usage:** `nargo new [OPTIONS] ` + +###### **Arguments:** + +* `` — The path to save the new project + +###### **Options:** + +* `--name ` — Name of the package [default: package directory name] +* `--lib` — Use a library template +* `--bin` — Use a binary template [default] +* `--contract` — Use a contract template + + + +## `nargo init` + +Create a Noir project in the current directory + +**Usage:** `nargo init [OPTIONS]` + +###### **Options:** + +* `--name ` — Name of the package [default: current directory name] +* `--lib` — Use a library template +* `--bin` — Use a binary template [default] +* `--contract` — Use a contract template + + + +## `nargo execute` + +Executes a circuit to calculate its return value + +**Usage:** `nargo execute [OPTIONS] [WITNESS_NAME]` + +###### **Arguments:** + +* `` — Write the execution witness to named file + +Defaults to the name of the package being executed. + +###### **Options:** + +* `-p`, `--prover-name ` — The name of the toml file which contains the inputs for the prover + + Default value: `Prover` +* `--package ` — The name of the package to execute +* `--workspace` — Execute all packages in the workspace +* `--expression-width ` — Specify the backend expression width that should be targeted +* `--bounded-codegen` — Generate ACIR with the target backend expression width. The default is to generate ACIR without a bound and split expressions after code generation. Activating this flag can sometimes provide optimizations for certain programs + + Default value: `false` +* `--force` — Force a full recompilation +* `--print-acir` — Display the ACIR for compiled circuit +* `--deny-warnings` — Treat all warnings as errors +* `--silence-warnings` — Suppress warnings +* `--debug-comptime-in-file ` — Enable printing results of comptime evaluation: provide a path suffix for the module to debug, e.g. "package_name/src/main.nr" +* `--skip-underconstrained-check` — Flag to turn off the compiler check for under constrained values. Warning: This can improve compilation speed but can also lead to correctness errors. This check should always be run on production code +* `--oracle-resolver ` — JSON RPC url to solve oracle calls + + + +## `nargo debug` + +Executes a circuit in debug mode + +**Usage:** `nargo debug [OPTIONS] [WITNESS_NAME]` + +###### **Arguments:** + +* `` — Write the execution witness to named file + +###### **Options:** + +* `-p`, `--prover-name ` — The name of the toml file which contains the inputs for the prover + + Default value: `Prover` +* `--package ` — The name of the package to execute +* `--expression-width ` — Specify the backend expression width that should be targeted +* `--bounded-codegen` — Generate ACIR with the target backend expression width. The default is to generate ACIR without a bound and split expressions after code generation. Activating this flag can sometimes provide optimizations for certain programs + + Default value: `false` +* `--force` — Force a full recompilation +* `--print-acir` — Display the ACIR for compiled circuit +* `--deny-warnings` — Treat all warnings as errors +* `--silence-warnings` — Suppress warnings +* `--debug-comptime-in-file ` — Enable printing results of comptime evaluation: provide a path suffix for the module to debug, e.g. "package_name/src/main.nr" +* `--skip-underconstrained-check` — Flag to turn off the compiler check for under constrained values. Warning: This can improve compilation speed but can also lead to correctness errors. This check should always be run on production code +* `--acir-mode` — Force ACIR output (disabling instrumentation) +* `--skip-instrumentation ` — Disable vars debug instrumentation (enabled by default) + + Possible values: `true`, `false` + + + + +## `nargo test` + +Run the tests for this program + +**Usage:** `nargo test [OPTIONS] [TEST_NAME]` + +###### **Arguments:** + +* `` — If given, only tests with names containing this string will be run + +###### **Options:** + +* `--show-output` — Display output of `println` statements +* `--exact` — Only run tests that match exactly +* `--package ` — The name of the package to test +* `--workspace` — Test all packages in the workspace +* `--expression-width ` — Specify the backend expression width that should be targeted +* `--bounded-codegen` — Generate ACIR with the target backend expression width. The default is to generate ACIR without a bound and split expressions after code generation. Activating this flag can sometimes provide optimizations for certain programs + + Default value: `false` +* `--force` — Force a full recompilation +* `--print-acir` — Display the ACIR for compiled circuit +* `--deny-warnings` — Treat all warnings as errors +* `--silence-warnings` — Suppress warnings +* `--debug-comptime-in-file ` — Enable printing results of comptime evaluation: provide a path suffix for the module to debug, e.g. "package_name/src/main.nr" +* `--skip-underconstrained-check` — Flag to turn off the compiler check for under constrained values. Warning: This can improve compilation speed but can also lead to correctness errors. This check should always be run on production code +* `--oracle-resolver ` — JSON RPC url to solve oracle calls + + + +## `nargo info` + +Provides detailed information on each of a program's function (represented by a single circuit) + +Current information provided per circuit: 1. The number of ACIR opcodes 2. Counts the final number gates in the circuit used by a backend + +**Usage:** `nargo info [OPTIONS]` + +###### **Options:** + +* `--package ` — The name of the package to detail +* `--workspace` — Detail all packages in the workspace +* `--expression-width ` — Specify the backend expression width that should be targeted +* `--bounded-codegen` — Generate ACIR with the target backend expression width. The default is to generate ACIR without a bound and split expressions after code generation. Activating this flag can sometimes provide optimizations for certain programs + + Default value: `false` +* `--force` — Force a full recompilation +* `--print-acir` — Display the ACIR for compiled circuit +* `--deny-warnings` — Treat all warnings as errors +* `--silence-warnings` — Suppress warnings +* `--debug-comptime-in-file ` — Enable printing results of comptime evaluation: provide a path suffix for the module to debug, e.g. "package_name/src/main.nr" +* `--skip-underconstrained-check` — Flag to turn off the compiler check for under constrained values. Warning: This can improve compilation speed but can also lead to correctness errors. This check should always be run on production code + + + +## `nargo lsp` + +Starts the Noir LSP server + +Starts an LSP server which allows IDEs such as VS Code to display diagnostics in Noir source. + +VS Code Noir Language Support: https://marketplace.visualstudio.com/items?itemName=noir-lang.vscode-noir + +**Usage:** `nargo lsp` + + + +
+ + + This document was generated automatically by + clap-markdown. + + diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/noir_codegen.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/noir_codegen.md new file mode 100644 index 00000000000..db8f07dc22e --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/reference/noir_codegen.md @@ -0,0 +1,114 @@ +--- +title: Noir Codegen for TypeScript +description: Learn how to use Noir codegen to generate TypeScript bindings +keywords: [Nargo, Noir, compile, TypeScript] +sidebar_position: 3 +--- + +When using TypeScript, it is extra work to interpret Noir program outputs in a type-safe way. Third party libraries may exist for popular Noir programs, but they are either hard to find or unmaintained. + +Now you can generate TypeScript bindings for your Noir programs in two steps: +1. Exporting Noir functions using `nargo export` +2. Using the TypeScript module `noir_codegen` to generate TypeScript binding + +**Note:** you can only export functions from a Noir *library* (not binary or contract program types). + +## Installation + +### Your TypeScript project + +If you don't already have a TypeScript project you can add the module with `yarn` (or `npm`), then initialize it: + +```bash +yarn add typescript -D +npx tsc --init +``` + +### Add TypeScript module - `noir_codegen` + +The following command will add the module to your project's devDependencies: + +```bash +yarn add @noir-lang/noir_codegen -D +``` + +### Nargo library +Make sure you have Nargo, v0.25.0 or greater, installed. If you don't, follow the [installation guide](../getting_started/installation/index.md). + +If you're in a new project, make a `circuits` folder and create a new Noir library: + +```bash +mkdir circuits && cd circuits +nargo new --lib myNoirLib +``` + +## Usage + +### Export ABI of specified functions + +First go to the `.nr` files in your Noir library, and add the `#[export]` macro to each function that you want to use in TypeScript. + +```rust +#[export] +fn your_function(... +``` + +From your Noir library (where `Nargo.toml` is), run the following command: + +```bash +nargo export +``` + +You will now have an `export` directory with a .json file per exported function. + +You can also specify the directory of Noir programs using `--program-dir`, for example: + +```bash +nargo export --program-dir=./circuits/myNoirLib +``` + +### Generate TypeScript bindings from exported functions + +To use the `noir-codegen` package we added to the TypeScript project: + +```bash +yarn noir-codegen ./export/your_function.json +``` + +This creates an `exports` directory with an `index.ts` file containing all exported functions. + +**Note:** adding `--out-dir` allows you to specify an output dir for your TypeScript bindings to go. Eg: + +```bash +yarn noir-codegen ./export/*.json --out-dir ./path/to/output/dir +``` + +## Example .nr function to .ts output + +Consider a Noir library with this function: + +```rust +#[export] +fn not_equal(x: Field, y: Field) -> bool { + x != y +} +``` + +After the export and codegen steps, you should have an `index.ts` like: + +```typescript +export type Field = string; + + +export const is_equal_circuit: CompiledCircuit = +{"abi":{"parameters":[{"name":"x","type":{"kind":"field"},"visibility":"private"},{"name":"y","type":{"kind":"field"},"visibility":"private"}],"return_type":{"abi_type":{"kind":"boolean"},"visibility":"private"}},"bytecode":"H4sIAAAAAAAA/7WUMQ7DIAxFQ0Krrr2JjSGYLVcpKrn/CaqqDQN12WK+hPBgmWd/wEyHbF1SS923uhOs3pfoChI+wKXMAXzIKyNj4PB0TFTYc0w5RUjoqeAeEu1wqK0F54RGkWvW44LPzExnlkbMEs4JNZmN8PxS42uHv82T8a3Jeyn2Ks+VLPcO558HmyLMCDOXAXXtpPt4R/Rt9T36ss6dS9HGPx/eG17nGegKBQAA"}; + +export async function is_equal(x: Field, y: Field, foreignCallHandler?: ForeignCallHandler): Promise { + const program = new Noir(is_equal_circuit); + const args: InputMap = { x, y }; + const { returnValue } = await program.execute(args, foreignCallHandler); + return returnValue as boolean; +} +``` + +Now the `is_equal()` function and relevant types are readily available for use in TypeScript. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/tooling/debugger.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/tooling/debugger.md new file mode 100644 index 00000000000..9b7565ba9ff --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/tooling/debugger.md @@ -0,0 +1,26 @@ +--- +title: Debugger +description: Learn about the Noir Debugger, in its REPL or VS Code versions. +keywords: [Nargo, VSCode, Visual Studio Code, REPL, Debugger] +sidebar_position: 2 +--- + +# Noir Debugger + +There are currently two ways of debugging Noir programs: + +1. From VS Code, via the [vscode-noir](https://github.com/noir-lang/vscode-noir) extension. You can install it via the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=noir-lang.vscode-noir). +2. Via the REPL debugger, which ships with Nargo. + +In order to use either version of the debugger, you will need to install recent enough versions of Noir, [Nargo](../getting_started/installation/index.md) and vscode-noir: + +- Noir & Nargo ≥0.28.0 +- Noir's VS Code extension ≥0.0.11 + +:::info +At the moment, the debugger supports debugging binary projects, but not contracts. +::: + +We cover the VS Code Noir debugger more in depth in [its VS Code debugger how-to guide](../how_to/debugger/debugging_with_vs_code.md) and [the reference](../reference/debugger/debugger_vscode.md). + +The REPL debugger is discussed at length in [the REPL debugger how-to guide](../how_to/debugger/debugging_with_the_repl.md) and [the reference](../reference/debugger/debugger_repl.md). diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/tooling/language_server.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/tooling/language_server.md new file mode 100644 index 00000000000..81e0356ef8a --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/tooling/language_server.md @@ -0,0 +1,43 @@ +--- +title: Language Server +description: Learn about the Noir Language Server, how to install the components, and configuration that may be required. +keywords: [Nargo, Language Server, LSP, VSCode, Visual Studio Code] +sidebar_position: 0 +--- + +This section helps you install and configure the Noir Language Server. + +The Language Server Protocol (LSP) has two components, the [Server](#language-server) and the [Client](#language-client). Below we describe each in the context of Noir. + +## Language Server + +The Server component is provided by the Nargo command line tool that you installed at the beginning of this guide. +As long as Nargo is installed and you've used it to run other commands in this guide, it should be good to go! + +If you'd like to verify that the `nargo lsp` command is available, you can run `nargo --help` and look for `lsp` in the list of commands. If you see it, you're using a version of Noir with LSP support. + +## Language Client + +The Client component is usually an editor plugin that launches the Server. It communicates LSP messages between the editor and the Server. For example, when you save a file, the Client will alert the Server, so it can try to compile the project and report any errors. + +Currently, Noir provides a Language Client for Visual Studio Code via the [vscode-noir](https://github.com/noir-lang/vscode-noir) extension. You can install it via the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=noir-lang.vscode-noir). + +> **Note:** Noir's Language Server Protocol support currently assumes users' VSCode workspace root to be the same as users' Noir project root (i.e. where Nargo.toml lies). +> +> If LSP features seem to be missing / malfunctioning, make sure you are opening your Noir project directly (instead of as a sub-folder) in your VSCode instance. + +When your language server is running correctly and the VSCode plugin is installed, you should see handy codelens buttons for compilation, measuring circuit size, execution, and tests: + +![Compile and Execute](@site/static/img/codelens_compile_execute.png) +![Run test](@site/static/img/codelens_run_test.png) + +You should also see your tests in the `testing` panel: + +![Testing panel](@site/static/img/codelens_testing_panel.png) + +### Configuration + +- **Noir: Enable LSP** - If checked, the extension will launch the Language Server via `nargo lsp` and communicate with it. +- **Noir: Nargo Flags** - Additional flags may be specified if you require them to be added when the extension calls `nargo lsp`. +- **Noir: Nargo Path** - An absolute path to a Nargo binary with the `lsp` command. This may be useful if Nargo is not within the `PATH` of your editor. +- **Noir > Trace: Server** - Setting this to `"messages"` or `"verbose"` will log LSP messages between the Client and Server. Useful for debugging. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/tooling/testing.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/tooling/testing.md new file mode 100644 index 00000000000..866677da567 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/tooling/testing.md @@ -0,0 +1,79 @@ +--- +title: Testing in Noir +description: Learn how to use Nargo to test your Noir program in a quick and easy way +keywords: [Nargo, testing, Noir, compile, test] +sidebar_position: 1 +--- + +You can test your Noir programs using Noir circuits. + +Nargo will automatically compile and run any functions which have the decorator `#[test]` on them if +you run `nargo test`. + +For example if you have a program like: + +```rust +fn add(x: u64, y: u64) -> u64 { + x + y +} +#[test] +fn test_add() { + assert(add(2,2) == 4); + assert(add(0,1) == 1); + assert(add(1,0) == 1); +} +``` + +Running `nargo test` will test that the `test_add` function can be executed while satisfying all +the constraints which allows you to test that add returns the expected values. Test functions can't +have any arguments currently. + +### Test fail + +You can write tests that are expected to fail by using the decorator `#[test(should_fail)]`. For example: + +```rust +fn add(x: u64, y: u64) -> u64 { + x + y +} +#[test(should_fail)] +fn test_add() { + assert(add(2,2) == 5); +} +``` + +You can be more specific and make it fail with a specific reason by using `should_fail_with = ""`: + +```rust +fn main(african_swallow_avg_speed : Field) { + assert(african_swallow_avg_speed == 65, "What is the airspeed velocity of an unladen swallow"); +} + +#[test] +fn test_king_arthur() { + main(65); +} + +#[test(should_fail_with = "What is the airspeed velocity of an unladen swallow")] +fn test_bridgekeeper() { + main(32); +} +``` + +The string given to `should_fail_with` doesn't need to exactly match the failure reason, it just needs to be a substring of it: + +```rust +fn main(african_swallow_avg_speed : Field) { + assert(african_swallow_avg_speed == 65, "What is the airspeed velocity of an unladen swallow"); +} + +#[test] +fn test_king_arthur() { + main(65); +} + +#[test(should_fail_with = "airspeed velocity")] +fn test_bridgekeeper() { + main(32); +} +``` \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.35.0/tutorials/noirjs_app.md b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/tutorials/noirjs_app.md new file mode 100644 index 00000000000..eac28168445 --- /dev/null +++ b/noir/noir-repo/docs/versioned_docs/version-v0.35.0/tutorials/noirjs_app.md @@ -0,0 +1,362 @@ +--- +title: Building a web app with NoirJS +description: Learn how to setup a new app that uses Noir to generate and verify zero-knowledge SNARK proofs in a typescript or javascript environment. +keywords: [how to, guide, javascript, typescript, noir, barretenberg, zero-knowledge, proofs, app] +sidebar_position: 0 +pagination_next: noir/concepts/data_types/index +--- + +NoirJS is a set of packages meant to work both in a browser and a server environment. In this tutorial, we will build a simple web app using them. From here, you should get an idea on how to proceed with your own Noir projects! + +You can find the complete app code for this guide [here](https://github.com/noir-lang/tiny-noirjs-app). + +## Setup + +:::note + +Feel free to use whatever versions, just keep in mind that Nargo and the NoirJS packages are meant to be in sync. For example, Nargo 0.31.x matches `noir_js@0.31.x`, etc. + +In this guide, we will be pinned to 0.31.0. + +::: + +Before we start, we want to make sure we have Node, Nargo and the Barretenberg proving system (`bb`) installed. + +We start by opening a terminal and executing `node --version`. If we don't get an output like `v20.10.0`, that means node is not installed. Let's do that by following the handy [nvm guide](https://github.com/nvm-sh/nvm?tab=readme-ov-file#install--update-script). + +As for `Nargo`, we can follow the [Nargo guide](../getting_started/installation/index.md) to install it. If you're lazy, just paste this on a terminal and run `noirup`: + +```sh +curl -L https://raw.githubusercontent.com/noir-lang/noirup/main/install | bash +``` + +Follow the instructions on [this page](https://github.com/AztecProtocol/aztec-packages/tree/master/barretenberg/cpp/src/barretenberg/bb#installation) to install `bb`. +Version 0.41.0 is compatible with `nargo` version 0.31.0, which you can install with `bbup -v 0.41.0` once `bbup` is installed. + +Easy enough. Onwards! + +## Our project + +ZK is a powerful technology. An app that doesn't reveal one of the inputs to _anyone_ is almost unbelievable, yet Noir makes it as easy as a single line of code. + +In fact, it's so simple that it comes nicely packaged in `nargo`. Let's do that! + +### Nargo + +Run: + +```bash +nargo new circuit +``` + +And... That's about it. Your program is ready to be compiled and run. + +To compile, let's `cd` into the `circuit` folder to enter our project, and call: + +```bash +nargo compile +``` + +This compiles our circuit into `json` format and add it to a new `target` folder. + +:::info + +At this point in the tutorial, your folder structure should look like this: + +```tree +. +└── circuit <---- our working directory + ├── Nargo.toml + ├── src + │ └── main.nr + └── target + └── circuit.json +``` + +::: + +### Node and Vite + +If you want to explore Nargo, feel free to go on a side-quest now and follow the steps in the +[getting started](../getting_started/hello_noir/index.md) guide. However, we want our app to run on the browser, so we need Vite. + +Vite is a powerful tool to generate static websites. While it provides all kinds of features, let's just go barebones with some good old vanilla JS. + +To do this this, go back to the previous folder (`cd ..`) and create a new vite project by running `npm create vite` and choosing "Vanilla" and "Javascript". + +A wild `vite-project` directory should now appear in your root folder! Let's not waste any time and dive right in: + +```bash +cd vite-project +``` + +### Setting Up Vite and Configuring the Project + +Before we proceed with any coding, let's get our environment tailored for Noir. We'll start by laying down the foundations with a `vite.config.js` file. This little piece of configuration is our secret sauce for making sure everything meshes well with the NoirJS libraries and other special setups we might need, like handling WebAssembly modules. Here’s how you get that going: + +#### Creating the vite.config.js + +In your freshly minted `vite-project` folder, create a new file named `vite.config.js` and open it in your code editor. Paste the following to set the stage: + +```javascript +import { defineConfig } from 'vite'; +import copy from 'rollup-plugin-copy'; +import fs from 'fs'; +import path from 'path'; + +const wasmContentTypePlugin = { + name: 'wasm-content-type-plugin', + configureServer(server) { + server.middlewares.use(async (req, res, next) => { + if (req.url.endsWith('.wasm')) { + res.setHeader('Content-Type', 'application/wasm'); + const newPath = req.url.replace('deps', 'dist'); + const targetPath = path.join(__dirname, newPath); + const wasmContent = fs.readFileSync(targetPath); + return res.end(wasmContent); + } + next(); + }); + }, +}; + +export default defineConfig(({ command }) => { + if (command === 'serve') { + return { + build: { + target: 'esnext', + rollupOptions: { + external: ['@aztec/bb.js'] + } + }, + optimizeDeps: { + esbuildOptions: { + target: 'esnext' + } + }, + plugins: [ + copy({ + targets: [{ src: 'node_modules/**/*.wasm', dest: 'node_modules/.vite/dist' }], + copySync: true, + hook: 'buildStart', + }), + command === 'serve' ? wasmContentTypePlugin : [], + ], + }; + } + + return {}; +}); +``` + +#### Install Dependencies + +Now that our stage is set, install the necessary NoirJS packages along with our other dependencies: + +```bash +npm install && npm install @noir-lang/backend_barretenberg@0.31.0 @noir-lang/noir_js@0.31.0 +npm install rollup-plugin-copy --save-dev +``` + +:::info + +At this point in the tutorial, your folder structure should look like this: + +```tree +. +└── circuit + └── ...etc... +└── vite-project <---- our working directory + └── ...etc... +``` + +::: + +#### Some cleanup + +`npx create vite` is amazing but it creates a bunch of files we don't really need for our simple example. Actually, let's just delete everything except for `vite.config.js`, `index.html`, `main.js` and `package.json`. I feel lighter already. + +![my heart is ready for you, noir.js](@site/static/img/memes/titanic.jpeg) + +## HTML + +Our app won't run like this, of course. We need some working HTML, at least. Let's open our broken-hearted `index.html` and replace everything with this code snippet: + +```html + + + + + + +

Noir app

+
+ + +
+
+

Logs

+

Proof

+
+ + +``` + +It _could_ be a beautiful UI... Depending on which universe you live in. + +## Some good old vanilla Javascript + +Our love for Noir needs undivided attention, so let's just open `main.js` and delete everything (this is where the romantic scenery becomes a bit creepy). + +Start by pasting in this boilerplate code: + +```js +function display(container, msg) { + const c = document.getElementById(container); + const p = document.createElement('p'); + p.textContent = msg; + c.appendChild(p); +} + +document.getElementById('submitGuess').addEventListener('click', async () => { + try { + // here's where love happens + } catch (err) { + display('logs', 'Oh 💔 Wrong guess'); + } +}); +``` + +The display function doesn't do much. We're simply manipulating our website to see stuff happening. For example, if the proof fails, it will simply log a broken heart 😢 + +:::info + +At this point in the tutorial, your folder structure should look like this: + +```tree +. +└── circuit + └── ...same as above +└── vite-project + ├── vite.config.js + ├── main.js + ├── package.json + └── index.html +``` + +You'll see other files and folders showing up (like `package-lock.json`, `node_modules`) but you shouldn't have to care about those. + +::: + +## Some NoirJS + +We're starting with the good stuff now. If you've compiled the circuit as described above, you should have a `json` file we want to import at the very top of our `main.js` file: + +```ts +import circuit from '../circuit/target/circuit.json'; +``` + +[Noir is backend-agnostic](../index.mdx#whats-new-about-noir). We write Noir, but we also need a proving backend. That's why we need to import and instantiate the two dependencies we installed above: `BarretenbergBackend` and `Noir`. Let's import them right below: + +```js +import { BarretenbergBackend, BarretenbergVerifier as Verifier } from '@noir-lang/backend_barretenberg'; +import { Noir } from '@noir-lang/noir_js'; +``` + +And instantiate them inside our try-catch block: + +```ts +// try { +const backend = new BarretenbergBackend(circuit); +const noir = new Noir(circuit); +// } +``` + +:::note + +For the remainder of the tutorial, everything will be happening inside the `try` block + +::: + +## Our app + +Now for the app itself. We're capturing whatever is in the input when people press the submit button. Just add this: + +```js +const x = parseInt(document.getElementById('guessInput').value); +const input = { x, y: 2 }; +``` + +Now we're ready to prove stuff! Let's feed some inputs to our circuit and calculate the proof: + +```js +await setup(); // let's squeeze our wasm inits here + +display('logs', 'Generating proof... ⌛'); +const { witness } = await noir.execute(input); +const proof = await backend.generateProof(witness); +display('logs', 'Generating proof... ✅'); +display('results', proof.proof); +``` + +You're probably eager to see stuff happening, so go and run your app now! + +From your terminal, run `npm run dev`. If it doesn't open a browser for you, just visit `localhost:5173`. You should now see the worst UI ever, with an ugly input. + +![Getting Started 0](@site/static/img/noir_getting_started_1.png) + +Now, our circuit says `fn main(x: Field, y: pub Field)`. This means only the `y` value is public, and it's hardcoded above: `input = { x, y: 2 }`. In other words, you won't need to send your secret`x` to the verifier! + +By inputting any number other than 2 in the input box and clicking "submit", you should get a valid proof. Otherwise the proof won't even generate correctly. By the way, if you're human, you shouldn't be able to understand anything on the "proof" box. That's OK. We like you, human ❤️. + +## Verifying + +Time to celebrate, yes! But we shouldn't trust machines so blindly. Let's add these lines to see our proof being verified: + +```js +display('logs', 'Verifying proof... ⌛'); +const isValid = await backend.verifyProof(proof); + +// or to cache and use the verification key: +// const verificationKey = await backend.getVerificationKey(); +// const verifier = new Verifier(); +// const isValid = await verifier.verifyProof(proof, verificationKey); + +if (isValid) display('logs', 'Verifying proof... ✅'); +``` + +You have successfully generated a client-side Noir web app! + +![coded app without math knowledge](@site/static/img/memes/flextape.jpeg) + +## Further Reading + +You can see how noirjs is used in a full stack Next.js hardhat application in the [noir-starter repo here](https://github.com/noir-lang/noir-starter/tree/main/vite-hardhat). The example shows how to calculate a proof in the browser and verify it with a deployed Solidity verifier contract from noirjs. + +You should also check out the more advanced examples in the [noir-examples repo](https://github.com/noir-lang/noir-examples), where you'll find reference usage for some cool apps. + +## UltraHonk Backend + +Barretenberg has recently exposed a new UltraHonk backend. We can use UltraHonk in NoirJS after version 0.33.0. Everything will be the same as the tutorial above, except that the class we need to import will change: +```js +import { UltraHonkBackend, UltraHonkVerifier as Verifier } from '@noir-lang/backend_barretenberg'; +``` +The backend will then be instantiated as such: +```js +const backend = new UltraHonkBackend(circuit); +``` +Then all the commands to prove and verify your circuit will be same. + +The only feature currently unsupported with UltraHonk are [recursive proofs](../explainers/explainer-recursion.md). \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_sidebars/version-v0.35.0-sidebars.json b/noir/noir-repo/docs/versioned_sidebars/version-v0.35.0-sidebars.json new file mode 100644 index 00000000000..b9ad026f69f --- /dev/null +++ b/noir/noir-repo/docs/versioned_sidebars/version-v0.35.0-sidebars.json @@ -0,0 +1,93 @@ +{ + "sidebar": [ + { + "type": "doc", + "id": "index" + }, + { + "type": "category", + "label": "Getting Started", + "items": [ + { + "type": "autogenerated", + "dirName": "getting_started" + } + ] + }, + { + "type": "category", + "label": "The Noir Language", + "items": [ + { + "type": "autogenerated", + "dirName": "noir" + } + ] + }, + { + "type": "html", + "value": "
", + "defaultStyle": true + }, + { + "type": "category", + "label": "How To Guides", + "items": [ + { + "type": "autogenerated", + "dirName": "how_to" + } + ] + }, + { + "type": "category", + "label": "Explainers", + "items": [ + { + "type": "autogenerated", + "dirName": "explainers" + } + ] + }, + { + "type": "category", + "label": "Tutorials", + "items": [ + { + "type": "autogenerated", + "dirName": "tutorials" + } + ] + }, + { + "type": "category", + "label": "Reference", + "items": [ + { + "type": "autogenerated", + "dirName": "reference" + } + ] + }, + { + "type": "category", + "label": "Tooling", + "items": [ + { + "type": "autogenerated", + "dirName": "tooling" + } + ] + }, + { + "type": "html", + "value": "
", + "defaultStyle": true + }, + { + "type": "doc", + "id": "migration_notes", + "label": "Migration notes" + } + ] +} diff --git a/noir/noir-repo/noir_stdlib/src/hash/mod.nr b/noir/noir-repo/noir_stdlib/src/hash/mod.nr index 1b37a07f6c9..e8c0ce81a16 100644 --- a/noir/noir-repo/noir_stdlib/src/hash/mod.nr +++ b/noir/noir-repo/noir_stdlib/src/hash/mod.nr @@ -33,7 +33,7 @@ pub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint } pub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field { - __pedersen_hash_with_separator(input, separator) + pedersen_hash_with_separator_noir(input, separator) } pub fn pedersen_commitment_with_separator(input: [Field; N], separator: u32) -> EmbeddedCurvePoint { @@ -78,7 +78,7 @@ fn pedersen_hash_with_separator_noir(input: [Field; N], separator: u pub fn pedersen_hash(input: [Field; N]) -> Field // docs:end:pedersen_hash { - __pedersen_hash_with_separator(input, 0) + pedersen_hash_with_separator_noir(input, 0) } #[foreign(pedersen_hash)] diff --git a/noir/noir-repo/noir_stdlib/src/hash/sha256.nr b/noir/noir-repo/noir_stdlib/src/hash/sha256.nr index 413c26d6f6b..081f7deb0fa 100644 --- a/noir/noir-repo/noir_stdlib/src/hash/sha256.nr +++ b/noir/noir-repo/noir_stdlib/src/hash/sha256.nr @@ -110,7 +110,7 @@ pub fn sha256_var(msg: [u8; N], message_size: u64) -> [u8; 32] { // If the block is filled, compress it. // An un-filled block is handled after this loop. - if msg_byte_ptr == BLOCK_SIZE { + if (msg_start < message_size) & (msg_byte_ptr == BLOCK_SIZE) { h = sha256_compression(msg_u8_to_u32(msg_block), h); } } @@ -335,4 +335,38 @@ mod tests { ]; assert_eq(sha256_var(input, input.len() as u64), result); } + + #[test] + fn same_msg_len_variable_padding() { + let input = [ + 29, 81, 165, 84, 243, 114, 101, 37, 242, 146, 127, 99, 69, 145, 39, 72, 213, 39, 253, 179, 218, 37, 217, 201, 172, 93, 198, 50, 249, 70, 15, 30, 162, 112, 187, 40, 140, 9, 236, 53, 32, 44, 38, 163, 113, 254, 192, 197, 44, 89, 71, 130, 169, 242, 17, 211, 214, 72, 19, 178, 186, 168, 147, 127, 99, 101, 252, 227, 8, 147, 150, 85, 97, 158, 17, 107, 218, 244, 82, 113, 247, 91, 208, 214, 60, 244, 87, 137, 173, 201, 130, 18, 66, 56, 198, 149, 207, 189, 175, 120, 123, 224, 177, 167, 251, 159, 143, 110, 68, 183, 189, 70, 126, 32, 35, 164, 44, 30, 44, 12, 65, 18, 62, 239, 242, 2, 248, 104, 2, 178, 64, 28, 126, 36, 137, 24, 14, 116, 91, 98, 90, 159, 218, 102, 45, 11, 110, 223, 245, 184, 52, 99, 59, 245, 136, 175, 3, 72, 164, 146, 145, 116, 22, 66, 24, 49, 193, 121, 3, 60, 37, 41, 97, 3, 190, 66, 195, 225, 63, 46, 3, 118, 4, 208, 15, 1, 40, 254, 235, 151, 123, 70, 180, 170, 44, 172, 90, 4, 254, 53, 239, 116, 246, 67, 56, 129, 61, 22, 169, 213, 65, 27, 216, 116, 162, 239, 214, 207, 126, 177, 20, 100, 25, 48, 143, 84, 215, 70, 197, 53, 65, 70, 86, 172, 61, 62, 9, 212, 167, 169, 133, 41, 126, 213, 196, 33, 192, 238, 0, 63, 246, 215, 58, 128, 110, 101, 92, 3, 170, 214, 130, 149, 52, 81, 125, 118, 233, 3, 118, 193, 104, 207, 120, 115, 77, 253, 191, 122, 0, 107, 164, 207, 113, 81, 169, 36, 201, 228, 74, 134, 131, 218, 178, 35, 30, 216, 101, 2, 103, 174, 87, 95, 50, 50, 215, 157, 5, 210, 188, 54, 211, 78, 45, 199, 96, 121, 241, 241, 176, 226, 194, 134, 130, 89, 217, 210, 186, 32, 140, 39, 91, 103, 212, 26, 87, 32, 72, 144, 228, 230, 117, 99, 188, 50, 15, 69, 79, 179, 50, 12, 106, 86, 218, 101, 73, 142, 243, 29, 250, 122, 228, 233, 29, 255, 22, 121, 114, 125, 103, 41, 250, 241, 179, 126, 158, 198, 116, 209, 65, 94, 98, 228, 175, 169, 96, 3, 9, 233, 133, 214, 55, 161, 164, 103, 80, 85, 24, 186, 64, 167, 92, 131, 53, 101, 202, 47, 25, 104, 118, 155, 14, 12, 12, 25, 116, 45, 221, 249, 28, 246, 212, 200, 157, 167, 169, 56, 197, 181, 4, 245, 146, 1, 140, 234, 191, 212, 228, 125, 87, 81, 86, 119, 30, 63, 129, 143, 32, 96 + ]; + + // Prepare inputs of different lengths + let mut input_511 = [0; 511]; + let mut input_512 = [0; 512]; // Next block + let mut input_575 = [0; 575]; + let mut input_576 = [0; 576]; // Next block + for i in 0..input.len() { + input_511[i] = input[i]; + input_512[i] = input[i]; + input_575[i] = input[i]; + input_576[i] = input[i]; + } + + // Compute hashes of all inputs (with same message length) + let fixed_length_hash = super::sha256(input); + let var_full_length_hash = sha256_var(input, input.len() as u64); + let var_length_hash_511 = sha256_var(input_511, input.len() as u64); + let var_length_hash_512 = sha256_var(input_512, input.len() as u64); + let var_length_hash_575 = sha256_var(input_575, input.len() as u64); + let var_length_hash_576 = sha256_var(input_576, input.len() as u64); + + // All of the above should have produced the same hash + assert_eq(var_full_length_hash, fixed_length_hash); + assert_eq(var_length_hash_511, fixed_length_hash); + assert_eq(var_length_hash_512, fixed_length_hash); + assert_eq(var_length_hash_575, fixed_length_hash); + assert_eq(var_length_hash_576, fixed_length_hash); + } } diff --git a/noir/noir-repo/test_programs/execution_success/aes128_encrypt/src/main.nr b/noir/noir-repo/test_programs/execution_success/aes128_encrypt/src/main.nr index b937c801860..31d907fea10 100644 --- a/noir/noir-repo/test_programs/execution_success/aes128_encrypt/src/main.nr +++ b/noir/noir-repo/test_programs/execution_success/aes128_encrypt/src/main.nr @@ -21,29 +21,20 @@ unconstrained fn decode_hex(s: str) -> [u8; M] { } unconstrained fn cipher(plaintext: [u8; 12], iv: [u8; 16], key: [u8; 16]) -> [u8; 16] { - let slice_res = std::aes128::aes128_encrypt(plaintext, iv, key); - let mut result = [0; 16]; - for i in 0..16 { - result[i] = slice_res[i]; - } - result + let result = std::aes128::aes128_encrypt(plaintext, iv, key); + result.as_array() } fn main(inputs: str<12>, iv: str<16>, key: str<16>, output: str<32>) { - let result = std::aes128::aes128_encrypt(inputs.as_bytes(), iv.as_bytes(), key.as_bytes()); + let result: [u8; 16] = std::aes128::aes128_encrypt(inputs.as_bytes(), iv.as_bytes(), key.as_bytes()).as_array(); let output_bytes: [u8; 16] = unsafe { - let output_bytes: [u8; 16] = decode_hex(output); - for i in 0..16 { - assert(result[i] == output_bytes[i]); - } - output_bytes + decode_hex(output) }; + assert(result == output_bytes); - unsafe { - let unconstrained_result = cipher(inputs.as_bytes(), iv.as_bytes(), key.as_bytes()); - for i in 0..16 { - assert(unconstrained_result[i] == output_bytes[i]); - } - } + let unconstrained_result = unsafe { + cipher(inputs.as_bytes(), iv.as_bytes(), key.as_bytes()) + }; + assert(unconstrained_result == output_bytes); } diff --git a/noir/noir-repo/test_programs/execution_success/databus_in_fn_with_empty_arr/Prover.toml b/noir/noir-repo/test_programs/execution_success/databus_in_fn_with_empty_arr/Prover.toml new file mode 100644 index 00000000000..e84e0dd7eec --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/databus_in_fn_with_empty_arr/Prover.toml @@ -0,0 +1,3 @@ +_empty = [] +value_1 = "1" +value_2 = "2" diff --git a/noir/noir-repo/test_programs/execution_success/databus_in_fn_with_empty_arr/src/main.nr b/noir/noir-repo/test_programs/execution_success/databus_in_fn_with_empty_arr/src/main.nr new file mode 100644 index 00000000000..85671978a33 --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/databus_in_fn_with_empty_arr/src/main.nr @@ -0,0 +1,3 @@ +fn main(_empty: [u32; 0], value_1: u32, value_2: call_data(0) u32) { + assert_eq(value_1 + 1, value_2); +} diff --git a/noir/noir-repo/test_programs/execution_success/sha256_var_padding_regression/Nargo.toml b/noir/noir-repo/test_programs/execution_success/sha256_var_padding_regression/Nargo.toml new file mode 100644 index 00000000000..a80677c585d --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/sha256_var_padding_regression/Nargo.toml @@ -0,0 +1,7 @@ +[package] +name = "sha256_var_padding_regression" +type = "bin" +authors = [""] +compiler_version = ">=0.34.0" + +[dependencies] \ No newline at end of file diff --git a/noir/noir-repo/test_programs/execution_success/sha256_var_padding_regression/Prover.toml b/noir/noir-repo/test_programs/execution_success/sha256_var_padding_regression/Prover.toml new file mode 100644 index 00000000000..7b20e870128 --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/sha256_var_padding_regression/Prover.toml @@ -0,0 +1,2 @@ +preimage = [29, 81, 165, 84, 243, 114, 101, 37, 242, 146, 127, 99, 69, 145, 39, 72, 213, 39, 253, 179, 218, 37, 217, 201, 172, 93, 198, 50, 249, 70, 15, 30, 162, 112, 187, 40, 140, 9, 236, 53, 32, 44, 38, 163, 113, 254, 192, 197, 44, 89, 71, 130, 169, 242, 17, 211, 214, 72, 19, 178, 186, 168, 147, 127, 99, 101, 252, 227, 8, 147, 150, 85, 97, 158, 17, 107, 218, 244, 82, 113, 247, 91, 208, 214, 60, 244, 87, 137, 173, 201, 130, 18, 66, 56, 198, 149, 207, 189, 175, 120, 123, 224, 177, 167, 251, 159, 143, 110, 68, 183, 189, 70, 126, 32, 35, 164, 44, 30, 44, 12, 65, 18, 62, 239, 242, 2, 248, 104, 2, 178, 64, 28, 126, 36, 137, 24, 14, 116, 91, 98, 90, 159, 218, 102, 45, 11, 110, 223, 245, 184, 52, 99, 59, 245, 136, 175, 3, 72, 164, 146, 145, 116, 22, 66, 24, 49, 193, 121, 3, 60, 37, 41, 97, 3, 190, 66, 195, 225, 63, 46, 3, 118, 4, 208, 15, 1, 40, 254, 235, 151, 123, 70, 180, 170, 44, 172, 90, 4, 254, 53, 239, 116, 246, 67, 56, 129, 61, 22, 169, 213, 65, 27, 216, 116, 162, 239, 214, 207, 126, 177, 20, 100, 25, 48, 143, 84, 215, 70, 197, 53, 65, 70, 86, 172, 61, 62, 9, 212, 167, 169, 133, 41, 126, 213, 196, 33, 192, 238, 0, 63, 246, 215, 58, 128, 110, 101, 92, 3, 170, 214, 130, 149, 52, 81, 125, 118, 233, 3, 118, 193, 104, 207, 120, 115, 77, 253, 191, 122, 0, 107, 164, 207, 113, 81, 169, 36, 201, 228, 74, 134, 131, 218, 178, 35, 30, 216, 101, 2, 103, 174, 87, 95, 50, 50, 215, 157, 5, 210, 188, 54, 211, 78, 45, 199, 96, 121, 241, 241, 176, 226, 194, 134, 130, 89, 217, 210, 186, 32, 140, 39, 91, 103, 212, 26, 87, 32, 72, 144, 228, 230, 117, 99, 188, 50, 15, 69, 79, 179, 50, 12, 106, 86, 218, 101, 73, 142, 243, 29, 250, 122, 228, 233, 29, 255, 22, 121, 114, 125, 103, 41, 250, 241, 179, 126, 158, 198, 116, 209, 65, 94, 98, 228, 175, 169, 96, 3, 9, 233, 133, 214, 55, 161, 164, 103, 80, 85, 24, 186, 64, 167, 92, 131, 53, 101, 202, 47, 25, 104, 118, 155, 14, 12, 12, 25, 116, 45, 221, 249, 28, 246, 212, 200, 157, 167, 169, 56, 197, 181, 4, 245, 146, 1, 140, 234, 191, 212, 228, 125, 87, 81, 86, 119, 30, 63, 129, 143, 32, 96] +result = [205, 74, 73, 134, 202, 93, 199, 152, 171, 244, 133, 193, 132, 40, 42, 9, 248, 11, 99, 200, 135, 58, 220, 227, 45, 253, 183, 241, 69, 69, 80, 219] \ No newline at end of file diff --git a/noir/noir-repo/test_programs/execution_success/sha256_var_padding_regression/src/main.nr b/noir/noir-repo/test_programs/execution_success/sha256_var_padding_regression/src/main.nr new file mode 100644 index 00000000000..13f87a0efc5 --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/sha256_var_padding_regression/src/main.nr @@ -0,0 +1,29 @@ +// Test to check sha256_var produces same results irrespective of number of padding bytes after message.length +// Ref: https://github.com/noir-lang/noir/issues/6163, https://gist.github.com/jp4g/d5953faae9eadb2909357474f7901e58 +fn main(preimage: [u8; 448], result: [u8; 32]) { + // Construct arrays of different lengths + let mut preimage_511 = [0; 511]; + let mut preimage_512 = [0; 512]; // Next block + let mut preimage_575 = [0; 575]; + let mut preimage_576 = [0; 576]; // Next block + for i in 0..preimage.len() { + preimage_511[i] = preimage[i]; + preimage_512[i] = preimage[i]; + preimage_575[i] = preimage[i]; + preimage_576[i] = preimage[i]; + } + let fixed_length_hash = std::hash::sha256::digest(preimage); + let var_full_length_hash = std::hash::sha256::sha256_var(preimage, preimage.len() as u64); + let var_length_hash_511 = std::hash::sha256::sha256_var(preimage_511, preimage.len() as u64); + let var_length_hash_512 = std::hash::sha256::sha256_var(preimage_512, preimage.len() as u64); + let var_length_hash_575 = std::hash::sha256::sha256_var(preimage_575, preimage.len() as u64); + let var_length_hash_576 = std::hash::sha256::sha256_var(preimage_576, preimage.len() as u64); + + // All of the above should have produced the same hash (result) + assert(fixed_length_hash == result); + assert(var_full_length_hash == result); + assert(var_length_hash_511 == result); + assert(var_length_hash_512 == result); + assert(var_length_hash_575 == result); + assert(var_length_hash_576 == result); +} diff --git a/noir/noir-repo/test_programs/noir_test_success/bounded_vec/src/main.nr b/noir/noir-repo/test_programs/noir_test_success/bounded_vec/src/main.nr index cb9879b1c9e..0ad5840ba32 100644 --- a/noir/noir-repo/test_programs/noir_test_success/bounded_vec/src/main.nr +++ b/noir/noir-repo/test_programs/noir_test_success/bounded_vec/src/main.nr @@ -20,7 +20,7 @@ fn good() -> BoundedVec { fn bad() { // Error: Type annotation needed - // The compiller can't infer `MaxLen` from this code. + // The compiler can't infer `MaxLen` from this code. let mut v3 = BoundedVec::new(); v3.push(5); } diff --git a/noir/noir-repo/tooling/nargo_fmt/src/visitor/item.rs b/noir/noir-repo/tooling/nargo_fmt/src/visitor/item.rs index 12ace814369..b71ea801752 100644 --- a/noir/noir-repo/tooling/nargo_fmt/src/visitor/item.rs +++ b/noir/noir-repo/tooling/nargo_fmt/src/visitor/item.rs @@ -276,6 +276,7 @@ impl super::FmtVisitor<'_> { self.push_rewrite(use_tree, span); self.last_position = span.end(); } + ItemKind::Struct(_) | ItemKind::Trait(_) | ItemKind::TypeAlias(_) diff --git a/noir/noir-repo/tooling/noir_codegen/package.json b/noir/noir-repo/tooling/noir_codegen/package.json index 75429cc4281..fc38dc4ec01 100644 --- a/noir/noir-repo/tooling/noir_codegen/package.json +++ b/noir/noir-repo/tooling/noir_codegen/package.json @@ -3,7 +3,7 @@ "contributors": [ "The Noir Team " ], - "version": "0.34.0", + "version": "0.35.0", "packageManager": "yarn@3.5.1", "license": "(MIT OR Apache-2.0)", "type": "module", diff --git a/noir/noir-repo/tooling/noir_js/package.json b/noir/noir-repo/tooling/noir_js/package.json index 55347ec9af5..705c3b3c3ee 100644 --- a/noir/noir-repo/tooling/noir_js/package.json +++ b/noir/noir-repo/tooling/noir_js/package.json @@ -3,7 +3,7 @@ "contributors": [ "The Noir Team " ], - "version": "0.34.0", + "version": "0.35.0", "packageManager": "yarn@3.5.1", "license": "(MIT OR Apache-2.0)", "type": "module", diff --git a/noir/noir-repo/tooling/noir_js_backend_barretenberg/package.json b/noir/noir-repo/tooling/noir_js_backend_barretenberg/package.json index 1c3864de482..42c15ae799e 100644 --- a/noir/noir-repo/tooling/noir_js_backend_barretenberg/package.json +++ b/noir/noir-repo/tooling/noir_js_backend_barretenberg/package.json @@ -3,7 +3,7 @@ "contributors": [ "The Noir Team " ], - "version": "0.34.0", + "version": "0.35.0", "packageManager": "yarn@3.5.1", "license": "(MIT OR Apache-2.0)", "type": "module", diff --git a/noir/noir-repo/tooling/noir_js_backend_barretenberg/src/backend.ts b/noir/noir-repo/tooling/noir_js_backend_barretenberg/src/backend.ts index 2569c7d868d..785b0c73421 100644 --- a/noir/noir-repo/tooling/noir_js_backend_barretenberg/src/backend.ts +++ b/noir/noir-repo/tooling/noir_js_backend_barretenberg/src/backend.ts @@ -96,6 +96,7 @@ export class UltraHonkBackend implements Backend, VerifierBackend { async generateProof(compressedWitness: Uint8Array): Promise { const proofWithPublicInputs = await this.backend.generateProof(gunzip(compressedWitness)); + const proofAsStrings = deflattenFields(proofWithPublicInputs.slice(4)); const numPublicInputs = Number(proofAsStrings[1]); @@ -121,7 +122,6 @@ export class UltraHonkBackend implements Backend, VerifierBackend { async verifyProof(proofData: ProofData): Promise { const proof = reconstructProofWithPublicInputsHonk(proofData); - return this.backend.verifyProof(proof); } diff --git a/noir/noir-repo/tooling/noir_js_types/package.json b/noir/noir-repo/tooling/noir_js_types/package.json index 21dd5beabeb..61cff4bc53d 100644 --- a/noir/noir-repo/tooling/noir_js_types/package.json +++ b/noir/noir-repo/tooling/noir_js_types/package.json @@ -4,7 +4,7 @@ "The Noir Team " ], "packageManager": "yarn@3.5.1", - "version": "0.34.0", + "version": "0.35.0", "license": "(MIT OR Apache-2.0)", "homepage": "https://noir-lang.org/", "repository": { diff --git a/noir/noir-repo/tooling/noirc_abi_wasm/package.json b/noir/noir-repo/tooling/noirc_abi_wasm/package.json index 021e80017aa..df2bb613751 100644 --- a/noir/noir-repo/tooling/noirc_abi_wasm/package.json +++ b/noir/noir-repo/tooling/noirc_abi_wasm/package.json @@ -3,7 +3,7 @@ "contributors": [ "The Noir Team " ], - "version": "0.34.0", + "version": "0.35.0", "license": "(MIT OR Apache-2.0)", "homepage": "https://noir-lang.org/", "repository": { diff --git a/scripts/ci/get_e2e_jobs.sh b/scripts/ci/get_e2e_jobs.sh index 18c54f39ea4..dbccca50fa2 100755 --- a/scripts/ci/get_e2e_jobs.sh +++ b/scripts/ci/get_e2e_jobs.sh @@ -24,7 +24,7 @@ allow_list=( "e2e-static-calls" "integration-l1-publisher" "e2e-cheat-codes" - "e2e-prover-with-padding" + "e2e-prover-fake-proofs" "e2e-lending-contract" ) diff --git a/scripts/ci/maybe_exit_spot.sh b/scripts/ci/maybe_exit_spot.sh index 0077a00c4e3..944f5b027a0 100644 --- a/scripts/ci/maybe_exit_spot.sh +++ b/scripts/ci/maybe_exit_spot.sh @@ -1,7 +1,7 @@ #!/bin/bash set -eux -MAX_WAIT_TIME=300 # Maximum wait time in seconds +MAX_WAIT_TIME=600 # Maximum wait time in seconds, 10 minutes WAIT_INTERVAL=10 # Interval between checks in seconds elapsed_time=0 diff --git a/scripts/earthly-ci b/scripts/earthly-ci index 205a1577b56..8d667fddc5d 100755 --- a/scripts/earthly-ci +++ b/scripts/earthly-ci @@ -33,7 +33,24 @@ function wipe_non_cache_docker_state { } EARTHLY_RUN_STATS_JSON="earthly-run-stats.json" -EARTHLY_ARGS="--logstream-debug-manifest-file $EARTHLY_RUN_STATS_JSON --secret AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-} --secret AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-} --secret AZTEC_BOT_COMMENTER_GITHUB_TOKEN=${AZTEC_BOT_GITHUB_TOKEN:-}" +# Run earthly with our necesary secrets initialized +# AWS credentials can be blank, however we will not use the S3 cache at all if so. + +EARTHLY_ARGS="" + +function run_earthly() { + # We abuse secrets with regular config that we don't want to alter the cache (see https://docs.earthly.dev/docs/guides/secrets) + # we do not run with minio in CI + earthly --logstream-debug-manifest-file $EARTHLY_RUN_STATS_JSON \ + --secret AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-} \ + --secret AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-} \ + --secret S3_BUILD_CACHE_MINIO_URL="" \ + --secret S3_BUILD_CACHE_UPLOAD="true" \ + --secret S3_BUILD_CACHE_DOWNLOAD="true" \ + --secret AZTEC_BOT_COMMENTER_GITHUB_TOKEN=${AZTEC_BOT_GITHUB_TOKEN:-} \ + $EARTHLY_ARGS \ + $@ +} function print_earthly_command_timings() { jq --version >/dev/null || return @@ -57,7 +74,7 @@ function print_earthly_command_timings() { # Handle earthly commands and retries while [ $ATTEMPT_COUNT -lt $MAX_ATTEMPTS ]; do - if earthly $EARTHLY_ARGS $@ 2>&1 | tee $OUTPUT_FILE >&2 ; then + if run_earthly $@ 2>&1 | tee $OUTPUT_FILE >&2 ; then print_earthly_command_timings || true exit 0 # Success, exit the script else @@ -94,6 +111,7 @@ while [ $ATTEMPT_COUNT -lt $MAX_ATTEMPTS ]; do || grep 'could not determine buildkit address - is Docker or Podman running?' $OUTPUT_FILE >/dev/null \ || grep 'please make sure the URL is valid, and Docker 18.09 or later is installed on the remote host' $OUTPUT_FILE >/dev/null \ || grep 'docker: failed to register layer' $OUTPUT_FILE >/dev/null \ + || grep 'docker: error during connect:' $OUTPUT_FILE >/dev/null \ || grep 'docker: unexpected EOF' $OUTPUT_FILE >/dev/null ; then wipe_non_cache_docker_state # wait for other docker restarts diff --git a/scripts/earthly-local b/scripts/earthly-local new file mode 100755 index 00000000000..50bf07187b6 --- /dev/null +++ b/scripts/earthly-local @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +# Run earthly with our necesary secrets initialized +# AWS credentials can be blank HOWEVER this will disable S3 caching. +export EARTHLY_ALLOW_PRIVILEGED=true + +set -eu + +function start_minio() { + if nc -z 127.0.0.1 12000 2>/dev/null >/dev/null ; then + # Already started + return + fi + mkdir -p ~/.minio/data + docker run -d -p 12000:9000 -p 12001:12001 -v ~/.minio/data:/data \ + quay.io/minio/minio server /data --console-address ":12001" + # make our cache bucket + AWS_ACCESS_KEY_ID="minioadmin" AWS_SECRET_ACCESS_KEY="minioadmin" aws --endpoint-url http://localhost:12000 s3 mb s3://aztec-ci-artifacts 2>/dev/null || true +} + +S3_BUILD_CACHE_UPLOAD=${S3_BUILD_CACHE_UPLOAD:-false} +S3_BUILD_CACHE_MINIO_URL="http://$(hostname -I | awk '{print $1}'):12000" + +# local file server for a quicker cache layer +start_minio + +if ! git diff-index --quiet HEAD --; then + echo "Warning: You have unstaged changes. Disabling S3 caching and local minio caching for earthly to not accidentally pollute cache (which uses git data)." >&2 + S3_BUILD_CACHE_UPLOAD=false + S3_BUILD_CACHE_DOWNLOAD=false + S3_BUILD_CACHE_MINIO_URL="" +elif [ ! -z "${AWS_ACCESS_KEY_ID:-}" ] ; then + S3_BUILD_CACHE_DOWNLOAD=true +else + S3_BUILD_CACHE_UPLOAD=false + S3_BUILD_CACHE_DOWNLOAD=false +fi + +earthly --secret AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-} \ + --secret AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-} \ + --secret S3_BUILD_CACHE_MINIO_URL="$S3_BUILD_CACHE_MINIO_URL" \ + --secret S3_BUILD_CACHE_UPLOAD="$S3_BUILD_CACHE_UPLOAD" \ + --secret S3_BUILD_CACHE_DOWNLOAD="$S3_BUILD_CACHE_DOWNLOAD" \ + --secret AZTEC_BOT_COMMENTER_GITHUB_TOKEN=${AZTEC_BOT_GITHUB_TOKEN:-} $@ diff --git a/scripts/run_on_tester b/scripts/run_on_tester index 1443ebc67c0..fda1b756998 100755 --- a/scripts/run_on_tester +++ b/scripts/run_on_tester @@ -22,4 +22,5 @@ ENV_VARS=" # Format the environment variables for the SSH command ENV_EXPORTS=$(printf 'export %s; ' $ENV_VARS) +echo "Running on tester at IP: $SPOT_IP" ssh -o ControlMaster=auto -o ControlPath=~/.ssh_mux_%h_%p_%r -o ControlPersist=30s -o TCPKeepAlive=no -o ServerAliveCountMax=5 -o ServerAliveInterval=30 -o StrictHostKeyChecking=no -i "$SPOT_KEY" ubuntu@"$SPOT_IP" "$ENV_EXPORTS $@" diff --git a/scripts/setup-earthly-local.sh b/scripts/setup-earthly-local.sh new file mode 100755 index 00000000000..ba4b775c753 --- /dev/null +++ b/scripts/setup-earthly-local.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +EARTHLY_SCRIPT_LOCATION="$(git rev-parse --show-toplevel)/scripts/earthly-local" +echo "alias earthly=\"$EARTHLY_SCRIPT_LOCATION\"" >> ~/.zshrc \ No newline at end of file diff --git a/spartan/aztec-network/templates/anvil.yaml b/spartan/aztec-network/templates/anvil.yaml index a45c52d58b5..bdaea56bdec 100644 --- a/spartan/aztec-network/templates/anvil.yaml +++ b/spartan/aztec-network/templates/anvil.yaml @@ -69,4 +69,25 @@ spec: targetPort: {{ .Values.ethereum.service.targetPort }} {{- if and (eq .Values.ethereum.service.type "NodePort") .Values.ethereum.service.nodePort }} nodePort: {{ .Values.ethereum.service.nodePort }} - {{- end }} \ No newline at end of file + {{- end }} +--- +{{if .Values.network.public }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "aztec-network.fullname" . }}-ethereum-lb + labels: + {{- include "aztec-network.labels" . | nindent 4 }} +spec: + type: LoadBalancer + selector: + {{- include "aztec-network.selectorLabels" . | nindent 4 }} + app: ethereum + ports: + - protocol: TCP + port: {{ .Values.ethereum.service.port }} + targetPort: {{ .Values.ethereum.service.targetPort }} + {{- if and (eq .Values.ethereum.service.type "NodePort") .Values.ethereum.service.nodePort }} + nodePort: {{ .Values.ethereum.service.nodePort }} + {{- end }} +{{ end }} \ No newline at end of file diff --git a/spartan/aztec-network/templates/boot-node.yaml b/spartan/aztec-network/templates/boot-node.yaml index 779d90ee86f..ec2b2f762ae 100644 --- a/spartan/aztec-network/templates/boot-node.yaml +++ b/spartan/aztec-network/templates/boot-node.yaml @@ -123,11 +123,19 @@ spec: resources: {{- toYaml .Values.bootNode.resources | nindent 12 }} volumes: - - name: shared-volume - emptyDir: {} - name: scripts configMap: name: {{ include "aztec-network.fullname" . }}-deploy-contracts-script + volumeClaimTemplates: + - metadata: + name: shared-volume + labels: + {{- include "aztec-network.labels" . | nindent 8 }} + spec: + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: {{ .Values.bootNode.storage }} --- apiVersion: v1 kind: Service @@ -136,7 +144,25 @@ metadata: labels: {{- include "aztec-network.labels" . | nindent 4 }} spec: - clusterIP: None + type: ClusterIP + selector: + {{- include "aztec-network.selectorLabels" . | nindent 4 }} + app: boot-node + ports: + - port: {{ .Values.bootNode.service.p2pPort }} + name: p2p + - port: {{ .Values.bootNode.service.nodePort }} + name: node +--- +{{if .Values.network.public }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "aztec-network.fullname" . }}-boot-node-lb + labels: + {{- include "aztec-network.labels" . | nindent 4 }} +spec: + type: LoadBalancer selector: {{- include "aztec-network.selectorLabels" . | nindent 4 }} app: boot-node @@ -144,4 +170,5 @@ spec: - port: {{ .Values.bootNode.service.p2pPort }} name: p2p - port: {{ .Values.bootNode.service.nodePort }} - name: node \ No newline at end of file + name: node +{{ end }} \ No newline at end of file diff --git a/spartan/aztec-network/templates/metrics.yaml b/spartan/aztec-network/templates/metrics.yaml index 8af3aa2f1ab..fc3d6d3ee15 100644 --- a/spartan/aztec-network/templates/metrics.yaml +++ b/spartan/aztec-network/templates/metrics.yaml @@ -1,4 +1,3 @@ ---- apiVersion: apps/v1 kind: Deployment metadata: @@ -17,6 +16,8 @@ spec: {{- include "aztec-network.selectorLabels" . | nindent 8 }} app: metrics spec: + securityContext: + fsGroup: {{ .Values.metrics.fileSystemUser }} # required for Grafana write access to storage volume containers: - name: otel-collector image: "{{ .Values.images.otelCollector.image }}" @@ -58,6 +59,8 @@ spec: subPath: grafana-sources.yaml - name: grafana-storage mountPath: /var/lib/grafana + securityContext: + runAsUser: {{ .Values.metrics.fileSystemUser }} # required for Grafana write access to storage volume - name: jaeger image: "{{ .Values.images.jaeger.image }}" @@ -68,8 +71,21 @@ spec: configMap: name: {{ include "aztec-network.fullname" . }}-metrics - name: grafana-storage - emptyDir: {} - + persistentVolumeClaim: + claimName: {{ include "aztec-network.fullname" . }}-grafana-pvc +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "aztec-network.fullname" . }}-grafana-pvc + labels: + app: {{ include "aztec-network.name" . }} +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .Values.metrics.storage }} --- apiVersion: v1 kind: Service @@ -78,7 +94,7 @@ metadata: labels: {{- include "aztec-network.labels" . | nindent 4 }} spec: - type: {{ .Values.metrics.service.type }} + type: {{if .Values.network.public }}"LoadBalancer"{{ else }}"ClusterIP"{{ end }} ports: - port: {{ .Values.metrics.ports.otlp }} targetPort: otlp diff --git a/spartan/aztec-network/templates/prover-node.yaml b/spartan/aztec-network/templates/prover-node.yaml index 13cb4762719..dfcb8b4bbb5 100644 --- a/spartan/aztec-network/templates/prover-node.yaml +++ b/spartan/aztec-network/templates/prover-node.yaml @@ -72,7 +72,7 @@ spec: - name: PROVER_PUBLISHER_PRIVATE_KEY value: "0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97" # get private proofs from the boot node - - name: TX_PROVIDER_NODE_URL + - name: PROVER_COORDINATION_NODE_URL value: {{ include "aztec-network.bootNodeUrl" . | quote }} # prover agent gets jobs from itself - name: AZTEC_NODE_URL @@ -82,12 +82,19 @@ spec: resources: {{- toYaml .Values.proverNode.resources | nindent 12 }} volumes: - - name: shared-volume - emptyDir: {} - name: scripts configMap: name: {{ include "aztec-network.fullname" . }}-configure-prover-env - + volumeClaimTemplates: + - metadata: + name: shared-volume + labels: + {{- include "aztec-network.labels" . | nindent 8 }} + spec: + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: {{ .Values.proverNode.storage }} --- apiVersion: v1 kind: ConfigMap @@ -106,10 +113,27 @@ metadata: labels: {{- include "aztec-network.labels" . | nindent 4 }} spec: - clusterIP: None + type: ClusterIP + selector: + {{- include "aztec-network.selectorLabels" . | nindent 4 }} + app: prover-node + ports: + - port: {{ .Values.proverNode.service.nodePort }} + name: node +--- +{{if .Values.network.public }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "aztec-network.fullname" . }}-prover-node-lb + labels: + {{- include "aztec-network.labels" . | nindent 4 }} +spec: + type: LoadBalancer selector: {{- include "aztec-network.selectorLabels" . | nindent 4 }} app: prover-node ports: - port: {{ .Values.proverNode.service.nodePort }} - name: node \ No newline at end of file + name: node +{{ end }} \ No newline at end of file diff --git a/spartan/aztec-network/templates/pxe.yaml b/spartan/aztec-network/templates/pxe.yaml index 709a0a190e3..3725960a0b4 100644 --- a/spartan/aztec-network/templates/pxe.yaml +++ b/spartan/aztec-network/templates/pxe.yaml @@ -1,3 +1,4 @@ +{{- if .Values.network.enableBots }} apiVersion: apps/v1 kind: Deployment metadata: @@ -65,7 +66,7 @@ metadata: labels: {{- include "aztec-network.labels" . | nindent 4 }} spec: - type: {{ .Values.pxe.service.type }} + type: ClusterIP selector: {{- include "aztec-network.selectorLabels" . | nindent 4 }} app: pxe @@ -75,4 +76,26 @@ spec: targetPort: {{ .Values.pxe.service.targetPort }} {{- if and (eq .Values.pxe.service.type "NodePort") .Values.pxe.service.nodePort }} nodePort: {{ .Values.pxe.service.nodePort }} - {{- end }} \ No newline at end of file + {{- end }} +--- +{{if .Values.network.public }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "aztec-network.fullname" . }}-pxe-lb + labels: + {{- include "aztec-network.labels" . | nindent 4 }} +spec: + type: LoadBalancer + selector: + {{- include "aztec-network.selectorLabels" . | nindent 4 }} + app: pxe + ports: + - protocol: TCP + port: {{ .Values.pxe.service.port }} + targetPort: {{ .Values.pxe.service.targetPort }} + {{- if and (eq .Values.pxe.service.type "NodePort") .Values.pxe.service.nodePort }} + nodePort: {{ .Values.pxe.service.nodePort }} + {{- end }} +{{ end }} +{{- end }} \ No newline at end of file diff --git a/spartan/aztec-network/templates/tests/run-tests.yaml b/spartan/aztec-network/templates/tests/run-tests.yaml deleted file mode 100644 index bc32cfd7b00..00000000000 --- a/spartan/aztec-network/templates/tests/run-tests.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: "{{ .Release.Name }}-test" - labels: {{- include "aztec-network.labels" . | nindent 4 }} - annotations: - "helm.sh/hook": test -spec: - restartPolicy: Never - containers: - - name: test - image: {{ .Values.images.test.image }} - args: - - {{ .Values.test }} - env: - - name: SCENARIO - value: {{ .Values.scenario }} - - name: PXE_URL - value: {{ include "aztec-network.pxeUrl" . | quote }} - - name: DEBUG - value: "aztec:*" - - name: LOG_LEVEL - value: "debug" - - name: LOG_JSON - value: "1" diff --git a/spartan/aztec-network/templates/transaction-bot.yaml b/spartan/aztec-network/templates/transaction-bot.yaml index e1d191271a4..798a28de571 100644 --- a/spartan/aztec-network/templates/transaction-bot.yaml +++ b/spartan/aztec-network/templates/transaction-bot.yaml @@ -1,3 +1,4 @@ +{{- if .Values.network.enableBots }} apiVersion: apps/v1 kind: Deployment metadata: @@ -99,4 +100,5 @@ spec: targetPort: {{ .Values.bot.service.targetPort }} {{- if and (eq .Values.bot.service.type "NodePort") .Values.bot.service.nodePort }} nodePort: {{ .Values.bot.service.nodePort }} - {{- end }} \ No newline at end of file + {{- end }} +{{- end }} \ No newline at end of file diff --git a/spartan/aztec-network/templates/validator.yaml b/spartan/aztec-network/templates/validator.yaml index d6de0f2d5f4..205a32a74cd 100644 --- a/spartan/aztec-network/templates/validator.yaml +++ b/spartan/aztec-network/templates/validator.yaml @@ -91,12 +91,19 @@ spec: resources: {{- toYaml .Values.validator.resources | nindent 12 }} volumes: - - name: shared-volume - emptyDir: {} - name: scripts configMap: name: {{ include "aztec-network.fullname" . }}-configure-validator-env - + volumeClaimTemplates: + - metadata: + name: shared-volume + labels: + {{- include "aztec-network.labels" . | nindent 8 }} + spec: + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: {{ .Values.validator.storage }} --- apiVersion: v1 kind: ConfigMap @@ -115,7 +122,25 @@ metadata: labels: {{- include "aztec-network.labels" . | nindent 4 }} spec: - clusterIP: None + type: ClusterIP + selector: + {{- include "aztec-network.selectorLabels" . | nindent 4 }} + app: validator + ports: + - port: {{ .Values.validator.service.p2pPort }} + name: p2p + - port: {{ .Values.validator.service.nodePort }} + name: node +--- +{{if .Values.network.public }} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "aztec-network.fullname" . }}-validator-lb + labels: + {{- include "aztec-network.labels" . | nindent 4 }} +spec: + type: LoadBalancer selector: {{- include "aztec-network.selectorLabels" . | nindent 4 }} app: validator @@ -123,4 +148,5 @@ spec: - port: {{ .Values.validator.service.p2pPort }} name: p2p - port: {{ .Values.validator.service.nodePort }} - name: node \ No newline at end of file + name: node +{{ end }} \ No newline at end of file diff --git a/spartan/aztec-network/values.yaml b/spartan/aztec-network/values.yaml index c422508b7ff..588eac5c34a 100644 --- a/spartan/aztec-network/values.yaml +++ b/spartan/aztec-network/values.yaml @@ -1,7 +1,8 @@ +network: + public: false + enableBots: true + images: - test: - image: aztecprotocol/end-to-end - pullPolicy: IfNotPresent aztec: image: aztecprotocol/aztec pullPolicy: IfNotPresent @@ -38,10 +39,17 @@ bootNode: disabled: true p2p: enabled: "true" - resources: {} + resources: + requests: + memory: "2Gi" + cpu: "200m" + limits: + memory: "4Gi" + cpu: "4" + storage: "8Gi" validator: - replicas: 0 + replicas: 1 service: p2pPort: 40400 nodePort: 8080 @@ -54,7 +62,14 @@ validator: disabled: false p2p: enabled: "true" - resources: {} + resources: + requests: + memory: "2Gi" + cpu: "200m" + limits: + memory: "28Gi" + cpu: "7" + storage: "8Gi" proverNode: replicas: 1 @@ -64,14 +79,20 @@ proverNode: debug: "aztec:*" realProofs: false proverAgentEnabled: true - resources: {} + resources: + requests: + memory: "2Gi" + cpu: "200m" + limits: + memory: "120Gi" + cpu: "15" + storage: "8Gi" pxe: logLevel: "debug" debug: "aztec:*" replicas: 1 service: - type: ClusterIP port: 8080 targetPort: 8080 readinessProbe: @@ -80,7 +101,13 @@ pxe: timeoutSeconds: 5 successThreshold: 1 failureThreshold: 3 - resources: {} + resources: + requests: + memory: "2Gi" + cpu: "200m" + limits: + memory: "4Gi" + cpu: "1" bot: logLevel: "debug" @@ -104,7 +131,13 @@ bot: timeoutSeconds: 5 successThreshold: 1 failureThreshold: 3 - resources: {} + resources: + requests: + memory: "2Gi" + cpu: "200m" + limits: + memory: "4Gi" + cpu: "1" ethereum: replicas: 1 @@ -126,11 +159,15 @@ ethereum: timeoutSeconds: 5 successThreshold: 1 failureThreshold: 3 - resources: {} + resources: + requests: + memory: "2Gi" + cpu: "200m" + limits: + memory: "4Gi" + cpu: "1" metrics: - service: - type: ClusterIP ports: otlp: 4316 metrics: 4315 @@ -143,6 +180,5 @@ metrics: timeoutSeconds: 5 successThreshold: 1 failureThreshold: 3 - -test: "sample" -scenario: "default" + storage: "8Gi" + fileSystemUser: 472 \ No newline at end of file diff --git a/spartan/aztec-network/values/48-validators.yaml b/spartan/aztec-network/values/48-validators.yaml new file mode 100644 index 00000000000..3dd5a2cadf3 --- /dev/null +++ b/spartan/aztec-network/values/48-validators.yaml @@ -0,0 +1,12 @@ +validator: + debug: "aztec:*,-aztec:avm_simulator:*,-aztec:libp2p_service" + replicas: 48 + resources: + requests: + memory: "512Mi" + validator: + disabled: false + +bootNode: + validator: + disabled: true diff --git a/spartan/scripts/forward_metrics_dashboard.sh b/spartan/scripts/forward_metrics_dashboard.sh new file mode 100755 index 00000000000..8619cbe5cc8 --- /dev/null +++ b/spartan/scripts/forward_metrics_dashboard.sh @@ -0,0 +1,4 @@ +#!/bin/bash +echo "Run this script after the metrics pods all come up. After running this script, port forward 5601 locally" +echo "Then navigate to https://localhost:5601 and login with user elastic password admin" +kubectl port-forward -n metrics service/metrics-eck-kibana-kb-http 5601:5601 \ No newline at end of file diff --git a/spartan/scripts/setup_local_k8s.sh b/spartan/scripts/setup_local_k8s.sh index 68d59939613..37eaadf85e5 100755 --- a/spartan/scripts/setup_local_k8s.sh +++ b/spartan/scripts/setup_local_k8s.sh @@ -30,4 +30,8 @@ if ! command -v helm &> /dev/null; then rm get_helm.sh fi -kind create cluster +if kind get clusters | grep -q "^kind$"; then + echo "Cluster 'kind' already exists. Skipping creation." +else + kind create cluster +fi \ No newline at end of file diff --git a/spartan/scripts/setup_metrics_dashboard.sh b/spartan/scripts/setup_metrics_dashboard.sh new file mode 100755 index 00000000000..3b618116883 --- /dev/null +++ b/spartan/scripts/setup_metrics_dashboard.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts +helm repo add elastic https://helm.elastic.co +helm repo update +helm dependency build "$(git rev-parse --show-toplevel)/spartan/metrics/" +kubectl create -f https://download.elastic.co/downloads/eck/2.14.0/crds.yaml 2>/dev/null +kubectl create secret generic elasticsearch-es-elastic-user --from-literal=elastic=admin -n metrics +kubectl apply -f https://download.elastic.co/downloads/eck/2.14.0/operator.yaml +helm upgrade --install metrics "$(git rev-parse --show-toplevel)/spartan/metrics/" --wait --namespace metrics --create-namespace --wait-for-jobs=true --timeout=30m \ No newline at end of file diff --git a/spartan/terraform/eks-cluster/main.tf b/spartan/terraform/eks-cluster/main.tf new file mode 100644 index 00000000000..09ef171443f --- /dev/null +++ b/spartan/terraform/eks-cluster/main.tf @@ -0,0 +1,114 @@ +terraform { + backend "s3" { + bucket = "aztec-terraform" + key = "spartan/terraform.tfstate" + region = "eu-west-2" + } + + required_providers { + aws = { + source = "hashicorp/aws" + version = "5.47.0" + } + } +} + +provider "aws" { + region = var.region +} + +# Filter out local zones, which are not currently supported +# with managed node groups +data "aws_availability_zones" "available" { + filter { + name = "opt-in-status" + values = ["opt-in-not-required"] + } +} + +module "vpc" { + source = "terraform-aws-modules/vpc/aws" + version = "5.8.1" + + name = var.cluster_name + cidr = "10.1.0.0/16" + + azs = slice(data.aws_availability_zones.available.names, 0, 3) + private_subnets = ["10.1.1.0/24", "10.1.2.0/24"] + public_subnets = ["10.1.3.0/24", "10.1.4.0/24"] + + enable_nat_gateway = true + single_nat_gateway = true + enable_dns_hostnames = true + enable_vpn_gateway = true + + public_subnet_tags = { + "kubernetes.io/role/elb" = 1 + } + + private_subnet_tags = { + "kubernetes.io/role/internal-elb" = 1 + } + + tags = { + Project = var.cluster_name + } +} + +# EKS Module +module "eks" { + source = "terraform-aws-modules/eks/aws" + version = "20.8.5" + + cluster_name = var.cluster_name + cluster_version = "1.31" + + cluster_endpoint_public_access = true + enable_cluster_creator_admin_permissions = true + + cluster_addons = { + aws-ebs-csi-driver = { + service_account_role_arn = module.irsa-ebs-csi.iam_role_arn + } + } + + # VPC and Subnets + vpc_id = module.vpc.vpc_id + subnet_ids = module.vpc.private_subnets + + # EKS Managed Node Group(s) + eks_managed_node_group_defaults = { + ami_type = "AL2_x86_64" + } + + eks_managed_node_groups = { + default = { + name = "node-group-1" + instance_types = ["m6a.2xlarge"] + + min_size = 1 + max_size = 2 + desired_size = 1 + } + } + + tags = { + Project = var.cluster_name + } +} + +# https://aws.amazon.com/blogs/containers/amazon-ebs-csi-driver-is-now-generally-available-in-amazon-eks-add-ons/ +data "aws_iam_policy" "ebs_csi_policy" { + arn = "arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy" +} + +module "irsa-ebs-csi" { + source = "terraform-aws-modules/iam/aws//modules/iam-assumable-role-with-oidc" + version = "5.39.0" + + create_role = true + role_name = "AmazonEKSTFEBSCSIRole-${module.eks.cluster_name}" + provider_url = module.eks.oidc_provider + role_policy_arns = [data.aws_iam_policy.ebs_csi_policy.arn] + oidc_fully_qualified_subjects = ["system:serviceaccount:kube-system:ebs-csi-controller-sa"] +} diff --git a/spartan/terraform/eks-cluster/outputs.tf b/spartan/terraform/eks-cluster/outputs.tf new file mode 100644 index 00000000000..8c14a52e237 --- /dev/null +++ b/spartan/terraform/eks-cluster/outputs.tf @@ -0,0 +1,19 @@ +output "cluster_endpoint" { + description = "Endpoint for EKS control plane" + value = module.eks.cluster_endpoint +} + +output "cluster_security_group_id" { + description = "Security group ids attached to the cluster control plane" + value = module.eks.cluster_security_group_id +} + +output "region" { + description = "AWS region" + value = var.region +} + +output "cluster_name" { + description = "Kubernetes Cluster Name" + value = module.eks.cluster_name +} \ No newline at end of file diff --git a/spartan/terraform/eks-cluster/variables.tf b/spartan/terraform/eks-cluster/variables.tf new file mode 100644 index 00000000000..abe47f8fe82 --- /dev/null +++ b/spartan/terraform/eks-cluster/variables.tf @@ -0,0 +1,10 @@ +variable "region" { + description = "AWS region" + type = string + default = "us-east-1" +} + +variable "cluster_name" { + type = string + default = "spartan" +} \ No newline at end of file diff --git a/spartan/terraform/main.tf b/spartan/terraform/main.tf deleted file mode 100644 index 8174abc71be..00000000000 --- a/spartan/terraform/main.tf +++ /dev/null @@ -1,125 +0,0 @@ -# Configure the AWS Provider -provider "aws" { - region = "us-east-2" # Change this to your preferred region -} - -# Create VPC for EKS -resource "aws_vpc" "spartan_vpc" { - cidr_block = "10.0.0.0/16" - - tags = { - Name = "spartan-vpc" - } -} - -# Create an internet gateway -resource "aws_internet_gateway" "spartan_igw" { - vpc_id = aws_vpc.spartan_vpc.id - - tags = { - Name = "spartan-igw" - } -} - -# Create a subnet -resource "aws_subnet" "spartan_subnet" { - vpc_id = aws_vpc.spartan_vpc.id - cidr_block = "10.0.1.0/24" - availability_zone = "us-east-2a" # Change this to match your region - - tags = { - Name = "spartan-subnet" - } -} - -# Create EKS Cluster -resource "aws_eks_cluster" "spartan_cluster" { - name = "spartan-cluster" - role_arn = aws_iam_role.spartan_cluster_role.arn - - vpc_config { - subnet_ids = [aws_subnet.spartan_subnet.id] - } - - depends_on = [aws_iam_role_policy_attachment.spartan_cluster_policy] -} - -# Create IAM role for EKS Cluster -resource "aws_iam_role" "spartan_cluster_role" { - name = "spartan-cluster-role" - - assume_role_policy = jsonencode({ - Version = "2012-10-17" - Statement = [ - { - Action = "sts:AssumeRole" - Effect = "Allow" - Principal = { - Service = "eks.amazonaws.com" - } - } - ] - }) -} - -# Attach necessary policies to the EKS Cluster role -resource "aws_iam_role_policy_attachment" "spartan_cluster_policy" { - policy_arn = "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy" - role = aws_iam_role.spartan_cluster_role.name -} - -# Create EKS Node Group -resource "aws_eks_node_group" "spartan_node_group" { - cluster_name = aws_eks_cluster.spartan_cluster.name - node_group_name = "spartan-node-group" - node_role_arn = aws_iam_role.spartan_node_role.arn - subnet_ids = [aws_subnet.spartan_subnet.id] - - scaling_config { - desired_size = 1 - max_size = 1 - min_size = 1 - } - - instance_types = ["t4g.2xlarge"] - - depends_on = [ - aws_iam_role_policy_attachment.spartan_worker_node_policy, - aws_iam_role_policy_attachment.spartan_cni_policy, - aws_iam_role_policy_attachment.spartan_ecr_policy, - ] -} - -# Create IAM role for EKS Node Group -resource "aws_iam_role" "spartan_node_role" { - name = "spartan-node-role" - - assume_role_policy = jsonencode({ - Version = "2012-10-17" - Statement = [ - { - Action = "sts:AssumeRole" - Effect = "Allow" - Principal = { - Service = "ec2.amazonaws.com" - } - } - ] - }) -} - -# Attach necessary policies to the EKS Node role -resource "aws_iam_role_policy_attachment" "spartan_worker_node_policy" { - policy_arn = "arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy" - role = aws_iam_role.spartan_node_role.name -} - -resource "aws_iam_role_policy_attachment" "spartan_cni_policy" { - policy_arn = "arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy" - role = aws_iam_role.spartan_node_role.name -} - -resource "aws_iam_role_policy_attachment" "spartan_ecr_policy" { - policy_arn = "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly" - role = aws_iam_role.spartan_node_role.name -} \ No newline at end of file diff --git a/yarn-project/.gitignore b/yarn-project/.gitignore index 2f96163d2ef..a6182305e1e 100644 --- a/yarn-project/.gitignore +++ b/yarn-project/.gitignore @@ -17,7 +17,6 @@ aztec-faucet/data* aztec-node/data* aztec/log circuits.js/fixtures/*.json -circuits.js/src/structs/kernel/private_kernel_reset_circuit_private_inputs_variants.ts docs/dist end-to-end/addresses.json end-to-end/flame_graph @@ -39,6 +38,7 @@ builder/src/target builder/src/crs builder/src/types noir-protocol-circuits-types/artifacts +noir-protocol-circuits-types/src/private_kernel_reset_data.ts noir-protocol-circuits-types/src/types/ ivc-integration/artifacts ivc-integration/src/types/ diff --git a/yarn-project/.prettierignore b/yarn-project/.prettierignore index 68e0d4e77dd..9a8465b7bdb 100644 --- a/yarn-project/.prettierignore +++ b/yarn-project/.prettierignore @@ -7,4 +7,4 @@ boxes/*/src/artifacts/*.json boxes/*/src/artifacts/*.ts boxes/*/src/contracts/target/*.json *.md -end-to-end/src/fixtures/dumps/block_result.json +end-to-end/src/fixtures/dumps/*.json diff --git a/yarn-project/Earthfile b/yarn-project/Earthfile index 17600ddb1c0..9ec2babca55 100644 --- a/yarn-project/Earthfile +++ b/yarn-project/Earthfile @@ -214,6 +214,7 @@ end-to-end-base: ENV CHROME_BIN="/usr/bin/chromium" ENV PATH=/opt/foundry/bin:$PATH ENV HARDWARE_CONCURRENCY="" + ENV FAKE_PROOFS="" ENV BB_WORKING_DIRECTORY=/usr/src/bb ENV BB_BINARY_PATH=/usr/src/barretenberg/cpp/build/bin/bb ENV ACVM_WORKING_DIRECTORY=/usr/src/acvm @@ -282,3 +283,9 @@ prover-client-test: ARG test ARG debug="" RUN cd prover-client && DEBUG=$debug yarn test $test + +publish-npm: + FROM +build + ARG DIST_TAG="latest" + ARG VERSION + RUN --secret NPM_TOKEN ./.github/scripts/publish_npm.sh $DIST_TAG $VERSION diff --git a/yarn-project/archiver/package.json b/yarn-project/archiver/package.json index c1571c1429c..4afb656f15c 100644 --- a/yarn-project/archiver/package.json +++ b/yarn-project/archiver/package.json @@ -4,7 +4,8 @@ "type": "module", "exports": { ".": "./dest/index.js", - "./data-retrieval": "./dest/archiver/data_retrieval.js" + "./data-retrieval": "./dest/archiver/data_retrieval.js", + "./test": "./dest/test/index.js" }, "typedocOptions": { "entryPoints": [ diff --git a/yarn-project/archiver/src/archiver/archiver.test.ts b/yarn-project/archiver/src/archiver/archiver.test.ts index 0ec87a3b780..e99853a95f4 100644 --- a/yarn-project/archiver/src/archiver/archiver.test.ts +++ b/yarn-project/archiver/src/archiver/archiver.test.ts @@ -30,10 +30,13 @@ import { MemoryArchiverStore } from './memory_archiver_store/memory_archiver_sto interface MockRollupContractRead { archiveAt: (args: readonly [bigint]) => Promise<`0x${string}`>; - getProvenBlockNumber: () => Promise; status: (args: readonly [bigint]) => Promise<[bigint, `0x${string}`, bigint, `0x${string}`, `0x${string}`]>; } +interface MockInboxContractRead { + totalMessagesInserted: () => Promise; +} + describe('Archiver', () => { const rollupAddress = EthAddress.ZERO; const inboxAddress = EthAddress.ZERO; @@ -46,6 +49,7 @@ describe('Archiver', () => { let now: number; let rollupRead: MockProxy; + let inboxRead: MockProxy; let archiver: Archiver; let blocks: L2Block[]; @@ -74,11 +78,15 @@ describe('Archiver', () => { blocks = blockNumbers.map(x => L2Block.random(x, 4, x, x + 1, 2, 2)); - rollupRead = mock({ - archiveAt: (args: readonly [bigint]) => Promise.resolve(blocks[Number(args[0] - 1n)].archive.root.toString()), - }); + rollupRead = mock(); + rollupRead.archiveAt.mockImplementation((args: readonly [bigint]) => + Promise.resolve(blocks[Number(args[0] - 1n)].archive.root.toString()), + ); ((archiver as any).rollup as any).read = rollupRead; + + inboxRead = mock(); + ((archiver as any).inbox as any).read = inboxRead; }); afterEach(async () => { @@ -96,15 +104,21 @@ describe('Archiver', () => { rollupRead.status .mockResolvedValueOnce([0n, GENESIS_ROOT, 1n, blocks[0].archive.root.toString(), GENESIS_ROOT]) - .mockResolvedValue([0n, GENESIS_ROOT, 3n, blocks[2].archive.root.toString(), blocks[0].archive.root.toString()]); + .mockResolvedValue([ + 1n, + blocks[0].archive.root.toString(), + 3n, + blocks[2].archive.root.toString(), + blocks[0].archive.root.toString(), + ]); + + inboxRead.totalMessagesInserted.mockResolvedValueOnce(2n).mockResolvedValueOnce(6n); mockGetLogs({ messageSent: [makeMessageSentEvent(98n, 1n, 0n), makeMessageSentEvent(99n, 1n, 1n)], L2BlockProposed: [makeL2BlockProposedEvent(101n, 1n, blocks[0].archive.root.toString())], }); - rollupRead.getProvenBlockNumber.mockResolvedValueOnce(1n); - mockGetLogs({ messageSent: [ makeMessageSentEvent(2504n, 2n, 0n), @@ -205,6 +219,8 @@ describe('Archiver', () => { rollupRead.status.mockResolvedValue([0n, GENESIS_ROOT, 2n, blocks[1].archive.root.toString(), GENESIS_ROOT]); + inboxRead.totalMessagesInserted.mockResolvedValueOnce(2n).mockResolvedValueOnce(2n); + mockGetLogs({ messageSent: [makeMessageSentEvent(66n, 1n, 0n), makeMessageSentEvent(68n, 1n, 1n)], L2BlockProposed: [ @@ -228,7 +244,7 @@ describe('Archiver', () => { expect(loggerSpy).toHaveBeenCalledWith(errorMessage); }, 10_000); - it('skip event search if not blocks found', async () => { + it('skip event search if no changes found', async () => { const loggerSpy = jest.spyOn((archiver as any).log, 'verbose'); let latestBlockNum = await archiver.getBlockNumber(); @@ -243,11 +259,65 @@ describe('Archiver', () => { .mockResolvedValueOnce([0n, GENESIS_ROOT, 0n, GENESIS_ROOT, GENESIS_ROOT]) .mockResolvedValueOnce([0n, GENESIS_ROOT, 2n, blocks[1].archive.root.toString(), GENESIS_ROOT]); - // This can look slightly odd, but we will need to do an empty request for the messages, and will entirely skip - // a call to the proposed blocks because of changes with status. + inboxRead.totalMessagesInserted.mockResolvedValueOnce(0n).mockResolvedValueOnce(2n); + mockGetLogs({ - messageSent: [], + messageSent: [makeMessageSentEvent(66n, 1n, 0n), makeMessageSentEvent(68n, 1n, 1n)], + L2BlockProposed: [ + makeL2BlockProposedEvent(70n, 1n, blocks[0].archive.root.toString()), + makeL2BlockProposedEvent(80n, 2n, blocks[1].archive.root.toString()), + ], }); + + rollupTxs.forEach(tx => publicClient.getTransaction.mockResolvedValueOnce(tx)); + + await archiver.start(false); + + while ((await archiver.getBlockNumber()) !== numL2BlocksInTest) { + await sleep(100); + } + + latestBlockNum = await archiver.getBlockNumber(); + expect(latestBlockNum).toEqual(numL2BlocksInTest); + + // For some reason, this is 1-indexed. + expect(loggerSpy).toHaveBeenNthCalledWith( + 1, + `Retrieved no new L1 -> L2 messages between L1 blocks ${1n} and ${50}.`, + ); + expect(loggerSpy).toHaveBeenNthCalledWith(2, `No blocks to retrieve from ${1n} to ${50n}`); + }, 10_000); + + it('Handle L2 reorg', async () => { + const loggerSpy = jest.spyOn((archiver as any).log, 'verbose'); + + let latestBlockNum = await archiver.getBlockNumber(); + expect(latestBlockNum).toEqual(0); + + const numL2BlocksInTest = 2; + + const rollupTxs = blocks.map(makeRollupTx); + + publicClient.getBlockNumber.mockResolvedValueOnce(50n).mockResolvedValueOnce(100n).mockResolvedValueOnce(150n); + + // We will return status at first to have an empty round, then as if we have 2 pending blocks, and finally + // Just a single pending block returning a "failure" for the expected pending block + rollupRead.status + .mockResolvedValueOnce([0n, GENESIS_ROOT, 0n, GENESIS_ROOT, GENESIS_ROOT]) + .mockResolvedValueOnce([0n, GENESIS_ROOT, 2n, blocks[1].archive.root.toString(), GENESIS_ROOT]) + .mockResolvedValueOnce([0n, GENESIS_ROOT, 1n, blocks[0].archive.root.toString(), Fr.ZERO.toString()]); + + rollupRead.archiveAt + .mockResolvedValueOnce(blocks[0].archive.root.toString()) + .mockResolvedValueOnce(blocks[1].archive.root.toString()) + .mockResolvedValueOnce(Fr.ZERO.toString()); + + inboxRead.totalMessagesInserted + .mockResolvedValueOnce(0n) + .mockResolvedValueOnce(2n) + .mockResolvedValueOnce(2n) + .mockResolvedValueOnce(2n); + mockGetLogs({ messageSent: [makeMessageSentEvent(66n, 1n, 0n), makeMessageSentEvent(68n, 1n, 1n)], L2BlockProposed: [ @@ -273,6 +343,26 @@ describe('Archiver', () => { `Retrieved no new L1 -> L2 messages between L1 blocks ${1n} and ${50}.`, ); expect(loggerSpy).toHaveBeenNthCalledWith(2, `No blocks to retrieve from ${1n} to ${50n}`); + + // Lets take a look to see if we can find re-org stuff! + await sleep(1000); + + expect(loggerSpy).toHaveBeenNthCalledWith(6, `L2 prune have occurred, unwind state`); + expect(loggerSpy).toHaveBeenNthCalledWith(7, `Unwinding 1 block from block 2`); + + // Should also see the block number be reduced + latestBlockNum = await archiver.getBlockNumber(); + expect(latestBlockNum).toEqual(numL2BlocksInTest - 1); + + const txHash = blocks[1].body.txEffects[0].txHash; + expect(await archiver.getTxEffect(txHash)).resolves.toBeUndefined; + expect(await archiver.getBlock(2)).resolves.toBeUndefined; + + [LogType.NOTEENCRYPTED, LogType.ENCRYPTED, LogType.UNENCRYPTED].forEach(async t => { + expect(await archiver.getLogs(2, 1, t)).toEqual([]); + }); + + // The random blocks don't include contract instances nor classes we we cannot look for those here. }, 10_000); // logs should be created in order of how archiver syncs. diff --git a/yarn-project/archiver/src/archiver/archiver.ts b/yarn-project/archiver/src/archiver/archiver.ts index 6a3bd3c57d7..cccef6420c9 100644 --- a/yarn-project/archiver/src/archiver/archiver.ts +++ b/yarn-project/archiver/src/archiver/archiver.ts @@ -18,6 +18,7 @@ import { ContractClassRegisteredEvent, ContractInstanceDeployedEvent, type FunctionSelector, + type Header, PrivateFunctionBroadcastedEvent, UnconstrainedFunctionBroadcastedEvent, isValidPrivateFunctionMembershipProof, @@ -57,8 +58,14 @@ import { import { type ArchiverDataStore, type ArchiverL1SynchPoint } from './archiver_store.js'; import { type ArchiverConfig } from './config.js'; import { retrieveBlockFromRollup, retrieveL1ToL2Messages } from './data_retrieval.js'; +import { + getEpochNumberAtTimestamp, + getSlotAtTimestamp, + getSlotRangeForEpoch, + getTimestampRangeForEpoch, +} from './epoch_helpers.js'; import { ArchiverInstrumentation } from './instrumentation.js'; -import { type DataRetrieval, type SingletonDataRetrieval } from './structs/data_retrieval.js'; +import { type DataRetrieval } from './structs/data_retrieval.js'; import { type L1Published } from './structs/published.js'; /** @@ -82,6 +89,9 @@ export class Archiver implements ArchiveSource { private store: ArchiverStoreHelper; + public l1BlockNumber: bigint | undefined; + public l1Timestamp: bigint | undefined; + /** * Creates a new instance of the Archiver. * @param publicClient - A client for interacting with the Ethereum node. @@ -98,9 +108,9 @@ export class Archiver implements ArchiveSource { readonly inboxAddress: EthAddress, private readonly registryAddress: EthAddress, readonly dataStore: ArchiverDataStore, - private readonly pollingIntervalMs = 10_000, + private readonly pollingIntervalMs: number, private readonly instrumentation: ArchiverInstrumentation, - private readonly l1StartBlock: bigint = 0n, + private readonly l1constants: L1RollupConstants = EmptyL1RollupConstants, private readonly log: DebugLogger = createDebugLogger('aztec:archiver'), ) { this.store = new ArchiverStoreHelper(dataStore); @@ -144,7 +154,10 @@ export class Archiver implements ArchiveSource { client: publicClient, }); - const l1StartBlock = await rollup.read.L1_BLOCK_AT_GENESIS(); + const [l1StartBlock, l1GenesisTime] = await Promise.all([ + rollup.read.L1_BLOCK_AT_GENESIS(), + rollup.read.GENESIS_TIME(), + ] as const); const archiver = new Archiver( publicClient, @@ -152,9 +165,9 @@ export class Archiver implements ArchiveSource { config.l1Contracts.inboxAddress, config.l1Contracts.registryAddress, archiverStore, - config.archiverPollingIntervalMS, + config.archiverPollingIntervalMS ?? 10_000, new ArchiverInstrumentation(telemetry), - BigInt(l1StartBlock), + { l1StartBlock, l1GenesisTime }, ); await archiver.start(blockUntilSynced); return archiver; @@ -206,11 +219,8 @@ export class Archiver implements ArchiveSource { * * This code does not handle reorgs. */ - const { - blocksSynchedTo = this.l1StartBlock, - messagesSynchedTo = this.l1StartBlock, - provenLogsSynchedTo = this.l1StartBlock, - } = await this.store.getSynchPoint(); + const { l1StartBlock } = this.l1constants; + const { blocksSynchedTo = l1StartBlock, messagesSynchedTo = l1StartBlock } = await this.store.getSynchPoint(); const currentL1BlockNumber = await this.publicClient.getBlockNumber(); // ********** Ensuring Consistency of data pulled from L1 ********** @@ -232,14 +242,17 @@ export class Archiver implements ArchiveSource { * in future but for the time being it should give us the guarantees that we need */ - await this.updateLastProvenL2Block(provenLogsSynchedTo, currentL1BlockNumber); - // ********** Events that are processed per L1 block ********** - await this.handleL1ToL2Messages(blockUntilSynced, messagesSynchedTo, currentL1BlockNumber); // ********** Events that are processed per L2 block ********** await this.handleL2blocks(blockUntilSynced, blocksSynchedTo, currentL1BlockNumber); + + // Store latest l1 block number and timestamp seen. Used for epoch and slots calculations. + if (!this.l1BlockNumber || this.l1BlockNumber < currentL1BlockNumber) { + this.l1Timestamp = await this.publicClient.getBlock({ blockNumber: currentL1BlockNumber }).then(b => b.timestamp); + this.l1BlockNumber = currentL1BlockNumber; + } } private async handleL1ToL2Messages( @@ -251,14 +264,10 @@ export class Archiver implements ArchiveSource { return; } - const retrievedL1ToL2Messages = await retrieveL1ToL2Messages( - this.inbox, - blockUntilSynced, - messagesSynchedTo + 1n, - currentL1BlockNumber, - ); + const localTotalMessageCount = await this.store.getTotalL1ToL2MessageCount(); + const destinationTotalMessageCount = await this.inbox.read.totalMessagesInserted(); - if (retrievedL1ToL2Messages.retrievedData.length === 0) { + if (localTotalMessageCount === destinationTotalMessageCount) { await this.store.setMessageSynchedL1BlockNumber(currentL1BlockNumber); this.log.verbose( `Retrieved no new L1 -> L2 messages between L1 blocks ${messagesSynchedTo + 1n} and ${currentL1BlockNumber}.`, @@ -266,6 +275,13 @@ export class Archiver implements ArchiveSource { return; } + const retrievedL1ToL2Messages = await retrieveL1ToL2Messages( + this.inbox, + blockUntilSynced, + messagesSynchedTo + 1n, + currentL1BlockNumber, + ); + await this.store.addL1ToL2Messages(retrievedL1ToL2Messages); this.log.verbose( @@ -275,46 +291,90 @@ export class Archiver implements ArchiveSource { ); } - private async updateLastProvenL2Block(provenSynchedTo: bigint, currentL1BlockNumber: bigint) { - if (currentL1BlockNumber <= provenSynchedTo) { - return; - } - - const provenBlockNumber = await this.rollup.read.getProvenBlockNumber(); - if (provenBlockNumber) { - await this.store.setProvenL2BlockNumber({ - retrievedData: Number(provenBlockNumber), - lastProcessedL1BlockNumber: currentL1BlockNumber, - }); - } - } - private async handleL2blocks(blockUntilSynced: boolean, blocksSynchedTo: bigint, currentL1BlockNumber: bigint) { if (currentL1BlockNumber <= blocksSynchedTo) { return; } - const lastBlock = await this.getBlock(-1); - - const [, , pendingBlockNumber, pendingArchive, archiveOfMyBlock] = await this.rollup.read.status([ - BigInt(lastBlock?.number ?? 0), - ]); - - const noBlocksButInitial = lastBlock === undefined && pendingBlockNumber == 0n; - const noBlockSinceLast = - lastBlock && - pendingBlockNumber === BigInt(lastBlock.number) && - pendingArchive === lastBlock.archive.root.toString(); + const localPendingBlockNumber = BigInt(await this.getBlockNumber()); + const [ + provenBlockNumber, + provenArchive, + pendingBlockNumber, + pendingArchive, + archiveForLocalPendingBlockNumber, + provenEpochNumber, + ] = await this.rollup.read.status([localPendingBlockNumber]); + + const updateProvenBlock = async () => { + const localBlockForDestinationProvenBlockNumber = await this.getBlock(Number(provenBlockNumber)); + if ( + localBlockForDestinationProvenBlockNumber && + provenArchive === localBlockForDestinationProvenBlockNumber.archive.root.toString() + ) { + this.log.info(`Updating the proven block number to ${provenBlockNumber} and epoch to ${provenEpochNumber}`); + await this.store.setProvenL2BlockNumber(Number(provenBlockNumber)); + // if we are here then we must have a valid proven epoch number + await this.store.setProvenL2EpochNumber(Number(provenEpochNumber)); + } + }; - if (noBlocksButInitial || noBlockSinceLast) { + // This is an edge case that we only hit if there are no proposed blocks. + // If we have 0 blocks locally and there are no blocks onchain there is nothing to do. + const noBlocks = localPendingBlockNumber === 0n && pendingBlockNumber === 0n; + if (noBlocks) { await this.store.setBlockSynchedL1BlockNumber(currentL1BlockNumber); this.log.verbose(`No blocks to retrieve from ${blocksSynchedTo + 1n} to ${currentL1BlockNumber}`); return; } - if (lastBlock && archiveOfMyBlock !== lastBlock.archive.root.toString()) { - // @todo Either `prune` have been called, or L1 have re-orged deep enough to remove a block. - // Issue#8620 and Issue#8621 + await updateProvenBlock(); + + // Related to the L2 reorgs of the pending chain. We are only interested in actually addressing a reorg if there + // are any state that could be impacted by it. If we have no blocks, there is no impact. + if (localPendingBlockNumber > 0) { + const localPendingBlock = await this.getBlock(Number(localPendingBlockNumber)); + if (localPendingBlock === undefined) { + throw new Error(`Missing block ${localPendingBlockNumber}`); + } + + const noBlockSinceLast = localPendingBlock && pendingArchive === localPendingBlock.archive.root.toString(); + if (noBlockSinceLast) { + await this.store.setBlockSynchedL1BlockNumber(currentL1BlockNumber); + this.log.verbose(`No blocks to retrieve from ${blocksSynchedTo + 1n} to ${currentL1BlockNumber}`); + return; + } + + const localPendingBlockInChain = archiveForLocalPendingBlockNumber === localPendingBlock.archive.root.toString(); + if (!localPendingBlockInChain) { + // If our local pending block tip is not in the chain on L1 a "prune" must have happened + // or the L1 have reorged. + // In any case, we have to figure out how far into the past the action will take us. + // For simplicity here, we will simply rewind until we end in a block that is also on the chain on L1. + this.log.verbose(`L2 prune have occurred, unwind state`); + + let tipAfterUnwind = localPendingBlockNumber; + while (true) { + const candidateBlock = await this.getBlock(Number(tipAfterUnwind)); + if (candidateBlock === undefined) { + break; + } + + const archiveAtContract = await this.rollup.read.archiveAt([BigInt(candidateBlock.number)]); + + if (archiveAtContract === candidateBlock.archive.root.toString()) { + break; + } + tipAfterUnwind--; + } + + const blocksToUnwind = localPendingBlockNumber - tipAfterUnwind; + this.log.verbose( + `Unwinding ${blocksToUnwind} block${blocksToUnwind > 1n ? 's' : ''} from block ${localPendingBlockNumber}`, + ); + + await this.store.unwindBlocks(Number(localPendingBlockNumber), Number(blocksToUnwind)); + } } this.log.debug(`Retrieving blocks from ${blocksSynchedTo + 1n} to ${currentL1BlockNumber}`); @@ -328,7 +388,8 @@ export class Archiver implements ArchiveSource { ); if (retrievedBlocks.length === 0) { - await this.store.setBlockSynchedL1BlockNumber(currentL1BlockNumber); + // We are not calling `setBlockSynchedL1BlockNumber` because it may cause sync issues if based off infura. + // See further details in earlier comments. this.log.verbose(`Retrieved no new blocks from ${blocksSynchedTo + 1n} to ${currentL1BlockNumber}`); return; } @@ -349,6 +410,8 @@ export class Archiver implements ArchiveSource { const timer = new Timer(); await this.store.addBlocks(retrievedBlocks); + // Important that we update AFTER inserting the blocks. + await updateProvenBlock(); this.instrumentation.processNewBlocks( timer.ms() / retrievedBlocks.length, retrievedBlocks.map(b => b.data), @@ -377,6 +440,68 @@ export class Archiver implements ArchiveSource { return Promise.resolve(this.registryAddress); } + public getL1BlockNumber(): bigint { + const l1BlockNumber = this.l1BlockNumber; + if (!l1BlockNumber) { + throw new Error('L1 block number not yet available. Complete an initial sync first.'); + } + return l1BlockNumber; + } + + public getL1Timestamp(): bigint { + const l1Timestamp = this.l1Timestamp; + if (!l1Timestamp) { + throw new Error('L1 timestamp not yet available. Complete an initial sync first.'); + } + return l1Timestamp; + } + + public getL2SlotNumber(): Promise { + return Promise.resolve(getSlotAtTimestamp(this.getL1Timestamp(), this.l1constants)); + } + + public getL2EpochNumber(): Promise { + return Promise.resolve(getEpochNumberAtTimestamp(this.getL1Timestamp(), this.l1constants)); + } + + public async getBlocksForEpoch(epochNumber: bigint): Promise { + const [start, end] = getSlotRangeForEpoch(epochNumber); + const blocks: L2Block[] = []; + + // Walk the list of blocks backwards and filter by slots matching the requested epoch. + // We'll typically ask for blocks for a very recent epoch, so we shouldn't need an index here. + let block = await this.getBlock(await this.store.getSynchedL2BlockNumber()); + const slot = (b: L2Block) => b.header.globalVariables.slotNumber.toBigInt(); + while (block && slot(block) >= start) { + if (slot(block) <= end) { + blocks.push(block); + } + block = await this.getBlock(block.number - 1); + } + + return blocks; + } + + public async isEpochComplete(epochNumber: bigint): Promise { + // The epoch is complete if the current L2 block is the last one in the epoch (or later) + const header = await this.getBlockHeader('latest'); + const slot = header?.globalVariables.slotNumber.toBigInt(); + const [_startSlot, endSlot] = getSlotRangeForEpoch(epochNumber); + if (slot && slot >= endSlot) { + return true; + } + + // If not, the epoch may also be complete if the L2 slot has passed without a block + // We compute this based on the timestamp for the given epoch and the timestamp of the last L1 block + const l1Timestamp = this.getL1Timestamp(); + const [_startTimestamp, endTimestamp] = getTimestampRangeForEpoch(epochNumber, this.l1constants); + + // For this computation, we throw in a few extra seconds just for good measure, + // since we know the next L1 block won't be mined within this range + const leeway = 3n; + return l1Timestamp + leeway >= endTimestamp; + } + /** * Gets up to `limit` amount of L2 blocks starting from `from`. * @param from - Number of the first block to return (inclusive). @@ -393,7 +518,7 @@ export class Archiver implements ArchiveSource { /** * Gets an l2 block. - * @param number - The block number to return (inclusive). + * @param number - The block number to return. * @returns The requested L2 block. */ public async getBlock(number: number): Promise { @@ -401,10 +526,21 @@ export class Archiver implements ArchiveSource { if (number < 0) { number = await this.store.getSynchedL2BlockNumber(); } + if (number == 0) { + return undefined; + } const blocks = await this.store.getBlocks(number, 1); return blocks.length === 0 ? undefined : blocks[0].data; } + public async getBlockHeader(number: number | 'latest'): Promise
{ + if (number === 'latest') { + number = await this.store.getSynchedL2BlockNumber(); + } + const headers = await this.store.getBlockHeaders(number, 1); + return headers.length === 0 ? undefined : headers[0]; + } + public getTxEffect(txHash: TxHash): Promise { return this.store.getTxEffect(txHash); } @@ -470,9 +606,13 @@ export class Archiver implements ArchiveSource { return this.store.getProvenL2BlockNumber(); } + public getProvenL2EpochNumber(): Promise { + return this.store.getProvenL2EpochNumber(); + } + /** Forcefully updates the last proven block number. Use for testing. */ - public setProvenBlockNumber(block: SingletonDataRetrieval): Promise { - return this.store.setProvenL2BlockNumber(block); + public setProvenBlockNumber(blockNumber: number): Promise { + return this.store.setProvenL2BlockNumber(blockNumber); } public getContractClass(id: Fr): Promise { @@ -515,6 +655,11 @@ export class Archiver implements ArchiveSource { } } +enum Operation { + Store, + Delete, +} + /** * A helper class that we use to deal with some of the logic needed when adding blocks. * @@ -522,7 +667,17 @@ export class Archiver implements ArchiveSource { * store would need to include otherwise while exposing fewer functions and logic directly to the archiver. */ class ArchiverStoreHelper - implements Omit + implements + Omit< + ArchiverDataStore, + | 'addLogs' + | 'deleteLogs' + | 'addContractClasses' + | 'deleteContractClasses' + | 'addContractInstances' + | 'deleteContractInstances' + | 'addFunctions' + > { #log = createDebugLogger('aztec:archiver:block-helper'); @@ -532,13 +687,17 @@ class ArchiverStoreHelper * Extracts and stores contract classes out of ContractClassRegistered events emitted by the class registerer contract. * @param allLogs - All logs emitted in a bunch of blocks. */ - async #storeRegisteredContractClasses(allLogs: UnencryptedL2Log[], blockNum: number) { + async #updateRegisteredContractClasses(allLogs: UnencryptedL2Log[], blockNum: number, operation: Operation) { const contractClasses = ContractClassRegisteredEvent.fromLogs(allLogs, ClassRegistererAddress).map(e => e.toContractClassPublic(), ); if (contractClasses.length > 0) { contractClasses.forEach(c => this.#log.verbose(`Registering contract class ${c.id.toString()}`)); - return await this.store.addContractClasses(contractClasses, blockNum); + if (operation == Operation.Store) { + return await this.store.addContractClasses(contractClasses, blockNum); + } else if (operation == Operation.Delete) { + return await this.store.deleteContractClasses(contractClasses, blockNum); + } } return true; } @@ -547,15 +706,31 @@ class ArchiverStoreHelper * Extracts and stores contract instances out of ContractInstanceDeployed events emitted by the canonical deployer contract. * @param allLogs - All logs emitted in a bunch of blocks. */ - async #storeDeployedContractInstances(allLogs: UnencryptedL2Log[], blockNum: number) { + async #updateDeployedContractInstances(allLogs: UnencryptedL2Log[], blockNum: number, operation: Operation) { const contractInstances = ContractInstanceDeployedEvent.fromLogs(allLogs).map(e => e.toContractInstance()); if (contractInstances.length > 0) { - contractInstances.forEach(c => this.#log.verbose(`Storing contract instance at ${c.address.toString()}`)); - return await this.store.addContractInstances(contractInstances, blockNum); + contractInstances.forEach(c => + this.#log.verbose(`${Operation[operation]} contract instance at ${c.address.toString()}`), + ); + if (operation == Operation.Store) { + return await this.store.addContractInstances(contractInstances, blockNum); + } else if (operation == Operation.Delete) { + return await this.store.deleteContractInstances(contractInstances, blockNum); + } } return true; } + /** + * Stores the functions that was broadcasted individually + * + * @dev Beware that there is not a delete variant of this, since they are added to contract classes + * and will be deleted as part of the class if needed. + * + * @param allLogs - The logs from the block + * @param _blockNum - The block number + * @returns + */ async #storeBroadcastedIndividualFunctions(allLogs: UnencryptedL2Log[], _blockNum: number) { // Filter out private and unconstrained function broadcast events const privateFnEvents = PrivateFunctionBroadcastedEvent.fromLogs(allLogs, ClassRegistererAddress); @@ -610,8 +785,8 @@ class ArchiverStoreHelper return ( await Promise.all([ - this.#storeRegisteredContractClasses(blockLogs, block.data.number), - this.#storeDeployedContractInstances(blockLogs, block.data.number), + this.#updateRegisteredContractClasses(blockLogs, block.data.number, Operation.Store), + this.#updateDeployedContractInstances(blockLogs, block.data.number, Operation.Store), this.#storeBroadcastedIndividualFunctions(blockLogs, block.data.number), ]) ).every(Boolean); @@ -621,14 +796,40 @@ class ArchiverStoreHelper ].every(Boolean); } + async unwindBlocks(from: number, blocksToUnwind: number): Promise { + const last = await this.getSynchedL2BlockNumber(); + if (from != last) { + throw new Error(`Can only remove from the tip`); + } + + // from - blocksToUnwind = the new head, so + 1 for what we need to remove + const blocks = await this.getBlocks(from - blocksToUnwind + 1, blocksToUnwind); + + return [ + // Unroll all logs emitted during the retrieved blocks and extract any contract classes and instances from them + ...(await Promise.all( + blocks.map(async block => { + const blockLogs = block.data.body.txEffects + .flatMap(txEffect => (txEffect ? [txEffect.unencryptedLogs] : [])) + .flatMap(txLog => txLog.unrollLogs()); + await this.#updateRegisteredContractClasses(blockLogs, block.data.number, Operation.Delete); + await this.#updateDeployedContractInstances(blockLogs, block.data.number, Operation.Delete); + }), + )), + this.store.deleteLogs(blocks.map(b => b.data)), + this.store.unwindBlocks(from, blocksToUnwind), + ].every(Boolean); + } + getBlocks(from: number, limit: number): Promise[]> { return this.store.getBlocks(from, limit); } - + getBlockHeaders(from: number, limit: number): Promise { + return this.store.getBlockHeaders(from, limit); + } getTxEffect(txHash: TxHash): Promise { return this.store.getTxEffect(txHash); } - getSettledTxReceipt(txHash: TxHash): Promise { return this.store.getSettledTxReceipt(txHash); } @@ -657,9 +858,15 @@ class ArchiverStoreHelper getProvenL2BlockNumber(): Promise { return this.store.getProvenL2BlockNumber(); } - setProvenL2BlockNumber(l2BlockNumber: SingletonDataRetrieval): Promise { + getProvenL2EpochNumber(): Promise { + return this.store.getProvenL2EpochNumber(); + } + setProvenL2BlockNumber(l2BlockNumber: number): Promise { return this.store.setProvenL2BlockNumber(l2BlockNumber); } + setProvenL2EpochNumber(l2EpochNumber: number): Promise { + return this.store.setProvenL2EpochNumber(l2EpochNumber); + } setBlockSynchedL1BlockNumber(l1BlockNumber: bigint): Promise { return this.store.setBlockSynchedL1BlockNumber(l1BlockNumber); } @@ -684,4 +891,17 @@ class ArchiverStoreHelper getContractArtifact(address: AztecAddress): Promise { return this.store.getContractArtifact(address); } + getTotalL1ToL2MessageCount(): Promise { + return this.store.getTotalL1ToL2MessageCount(); + } } + +type L1RollupConstants = { + l1StartBlock: bigint; + l1GenesisTime: bigint; +}; + +const EmptyL1RollupConstants: L1RollupConstants = { + l1StartBlock: 0n, + l1GenesisTime: 0n, +}; diff --git a/yarn-project/archiver/src/archiver/archiver_store.ts b/yarn-project/archiver/src/archiver/archiver_store.ts index 1f37181746d..af04befb3cc 100644 --- a/yarn-project/archiver/src/archiver/archiver_store.ts +++ b/yarn-project/archiver/src/archiver/archiver_store.ts @@ -10,7 +10,7 @@ import { type TxHash, type TxReceipt, } from '@aztec/circuit-types'; -import { type Fr } from '@aztec/circuits.js'; +import { type Fr, type Header } from '@aztec/circuits.js'; import { type ContractArtifact } from '@aztec/foundation/abi'; import { type AztecAddress } from '@aztec/foundation/aztec-address'; import { @@ -20,7 +20,7 @@ import { type UnconstrainedFunctionWithMembershipProof, } from '@aztec/types/contracts'; -import { type DataRetrieval, type SingletonDataRetrieval } from './structs/data_retrieval.js'; +import { type DataRetrieval } from './structs/data_retrieval.js'; import { type L1Published } from './structs/published.js'; /** @@ -47,6 +47,15 @@ export interface ArchiverDataStore { */ addBlocks(blocks: L1Published[]): Promise; + /** + * Unwinds blocks from the database + * @param from - The tip of the chain, passed for verification purposes, + * ensuring that we don't end up deleting something we did not intend + * @param blocksToUnwind - The number of blocks we are to unwind + * @returns True if the operation is successful + */ + unwindBlocks(from: number, blocksToUnwind: number): Promise; + /** * Gets up to `limit` amount of L2 blocks starting from `from`. * @param from - Number of the first block to return (inclusive). @@ -55,6 +64,14 @@ export interface ArchiverDataStore { */ getBlocks(from: number, limit: number): Promise[]>; + /** + * Gets up to `limit` amount of L2 block headers starting from `from`. + * @param from - Number of the first block to return (inclusive). + * @param limit - The number of blocks to return. + * @returns The requested L2 block headers. + */ + getBlockHeaders(from: number, limit: number): Promise; + /** * Gets a tx effect. * @param txHash - The txHash of the tx corresponding to the tx effect. @@ -75,6 +92,7 @@ export interface ArchiverDataStore { * @returns True if the operation is successful. */ addLogs(blocks: L2Block[]): Promise; + deleteLogs(blocks: L2Block[]): Promise; /** * Append L1 to L2 messages to the store. @@ -98,6 +116,12 @@ export interface ArchiverDataStore { */ getL1ToL2MessageIndex(l1ToL2Message: Fr, startIndex: bigint): Promise; + /** + * Get the total number of L1 to L2 messages + * @returns The number of L1 to L2 messages in the store + */ + getTotalL1ToL2MessageCount(): Promise; + /** * Gets up to `limit` amount of logs starting from `from`. * @param from - Number of the L2 block to which corresponds the first logs to be returned. @@ -130,11 +154,23 @@ export interface ArchiverDataStore { */ getProvenL2BlockNumber(): Promise; + /** + * Gets the number of the latest proven L2 epoch. + * @returns The number of the latest proven L2 epoch. + */ + getProvenL2EpochNumber(): Promise; + /** * Stores the number of the latest proven L2 block processed. * @param l2BlockNumber - The number of the latest proven L2 block processed. */ - setProvenL2BlockNumber(l2BlockNumber: SingletonDataRetrieval): Promise; + setProvenL2BlockNumber(l2BlockNumber: number): Promise; + + /** + * Stores the number of the latest proven L2 epoch. + * @param l2EpochNumber - The number of the latest proven L2 epoch. + */ + setProvenL2EpochNumber(l2EpochNumber: number): Promise; /** * Stores the l1 block number that blocks have been synched until @@ -161,6 +197,8 @@ export interface ArchiverDataStore { */ addContractClasses(data: ContractClassPublic[], blockNumber: number): Promise; + deleteContractClasses(data: ContractClassPublic[], blockNumber: number): Promise; + /** * Returns a contract class given its id, or undefined if not exists. * @param id - Id of the contract class. @@ -174,6 +212,7 @@ export interface ArchiverDataStore { * @returns True if the operation is successful. */ addContractInstances(data: ContractInstanceWithAddress[], blockNumber: number): Promise; + deleteContractInstances(data: ContractInstanceWithAddress[], blockNumber: number): Promise; /** * Adds private functions to a contract class. diff --git a/yarn-project/archiver/src/archiver/archiver_store_test_suite.ts b/yarn-project/archiver/src/archiver/archiver_store_test_suite.ts index 89a71f46351..f68b0a7c784 100644 --- a/yarn-project/archiver/src/archiver/archiver_store_test_suite.ts +++ b/yarn-project/archiver/src/archiver/archiver_store_test_suite.ts @@ -52,6 +52,20 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch }); }); + describe('unwindBlocks', () => { + it('unwinding blocks will remove blocks from the chain', async () => { + await store.addBlocks(blocks); + const blockNumber = await store.getSynchedL2BlockNumber(); + + expect(await store.getBlocks(blockNumber, 1)).toEqual([blocks[blocks.length - 1]]); + + await store.unwindBlocks(blockNumber, 1); + + expect(await store.getSynchedL2BlockNumber()).toBe(blockNumber - 1); + expect(await store.getBlocks(blockNumber, 1)).toEqual([]); + }); + }); + describe('getBlocks', () => { beforeEach(async () => { await store.addBlocks(blocks); @@ -69,8 +83,8 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch await expect(store.getBlocks(1, 0)).rejects.toThrow('Invalid limit: 0'); }); - it('resets `from` to the first block if it is out of range', async () => { - await expect(store.getBlocks(INITIAL_L2_BLOCK_NUM - 100, 1)).resolves.toEqual(blocks.slice(0, 1)); + it('throws an error if `from` it is out of range', async () => { + await expect(store.getBlocks(INITIAL_L2_BLOCK_NUM - 100, 1)).rejects.toThrow('Invalid start: -99'); }); }); @@ -90,7 +104,6 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch await expect(store.getSynchPoint()).resolves.toEqual({ blocksSynchedTo: undefined, messagesSynchedTo: undefined, - provenLogsSynchedTo: undefined, } satisfies ArchiverL1SynchPoint); }); @@ -99,7 +112,6 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch await expect(store.getSynchPoint()).resolves.toEqual({ blocksSynchedTo: 19n, messagesSynchedTo: undefined, - provenLogsSynchedTo: undefined, } satisfies ArchiverL1SynchPoint); }); @@ -111,16 +123,6 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch await expect(store.getSynchPoint()).resolves.toEqual({ blocksSynchedTo: undefined, messagesSynchedTo: 1n, - provenLogsSynchedTo: undefined, - } satisfies ArchiverL1SynchPoint); - }); - - it('returns the L1 block number that most recently logged a proven block', async () => { - await store.setProvenL2BlockNumber({ lastProcessedL1BlockNumber: 3n, retrievedData: 5 }); - await expect(store.getSynchPoint()).resolves.toEqual({ - blocksSynchedTo: undefined, - messagesSynchedTo: undefined, - provenLogsSynchedTo: 3n, } satisfies ArchiverL1SynchPoint); }); }); @@ -132,12 +134,32 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch }); }); + describe('deleteLogs', () => { + it('deletes encrypted & unencrypted logs', async () => { + const block = blocks[0].data; + await store.addBlocks([blocks[0]]); + await expect(store.addLogs([block])).resolves.toEqual(true); + + expect((await store.getLogs(1, 1, LogType.NOTEENCRYPTED))[0]).toEqual(block.body.noteEncryptedLogs); + expect((await store.getLogs(1, 1, LogType.ENCRYPTED))[0]).toEqual(block.body.encryptedLogs); + expect((await store.getLogs(1, 1, LogType.UNENCRYPTED))[0]).toEqual(block.body.unencryptedLogs); + + // This one is a pain for memory as we would never want to just delete memory in the middle. + await store.deleteLogs([block]); + + expect((await store.getLogs(1, 1, LogType.NOTEENCRYPTED))[0]).toEqual(undefined); + expect((await store.getLogs(1, 1, LogType.ENCRYPTED))[0]).toEqual(undefined); + expect((await store.getLogs(1, 1, LogType.UNENCRYPTED))[0]).toEqual(undefined); + }); + }); + describe.each([ ['note_encrypted', LogType.NOTEENCRYPTED], ['encrypted', LogType.ENCRYPTED], ['unencrypted', LogType.UNENCRYPTED], ])('getLogs (%s)', (_, logType) => { beforeEach(async () => { + await store.addBlocks(blocks); await store.addLogs(blocks.map(b => b.data)); }); @@ -179,6 +201,24 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch it('returns undefined if tx is not found', async () => { await expect(store.getTxEffect(new TxHash(Fr.random().toBuffer()))).resolves.toBeUndefined(); }); + + it.each([ + () => blocks[0].data.body.txEffects[0], + () => blocks[9].data.body.txEffects[3], + () => blocks[3].data.body.txEffects[1], + () => blocks[5].data.body.txEffects[2], + () => blocks[1].data.body.txEffects[0], + ])('tries to retrieves a previously stored transaction after deleted', async getExpectedTx => { + await store.unwindBlocks(blocks.length, blocks.length); + + const expectedTx = getExpectedTx(); + const actualTx = await store.getTxEffect(expectedTx.txHash); + expect(actualTx).toEqual(undefined); + }); + + it('returns undefined if tx is not found', async () => { + await expect(store.getTxEffect(new TxHash(Fr.random().toBuffer()))).resolves.toBeUndefined(); + }); }); describe('L1 to L2 Messages', () => { @@ -249,6 +289,11 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch it('returns undefined if contract instance is not found', async () => { await expect(store.getContractInstance(AztecAddress.random())).resolves.toBeUndefined(); }); + + it('returns undefined if previously stored contract instances was deleted', async () => { + await store.deleteContractInstances([contractInstance], blockNum); + await expect(store.getContractInstance(contractInstance.address)).resolves.toBeUndefined(); + }); }); describe('contractClasses', () => { @@ -264,6 +309,17 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch await expect(store.getContractClass(contractClass.id)).resolves.toMatchObject(contractClass); }); + it('returns undefined if the initial deployed contract class was deleted', async () => { + await store.deleteContractClasses([contractClass], blockNum); + await expect(store.getContractClass(contractClass.id)).resolves.toBeUndefined(); + }); + + it('returns contract class if later "deployment" class was deleted', async () => { + await store.addContractClasses([contractClass], blockNum + 1); + await store.deleteContractClasses([contractClass], blockNum + 1); + await expect(store.getContractClass(contractClass.id)).resolves.toMatchObject(contractClass); + }); + it('returns undefined if contract class is not found', async () => { await expect(store.getContractClass(Fr.random())).resolves.toBeUndefined(); }); @@ -316,6 +372,24 @@ export function describeArchiverDataStore(testName: string, getStore: () => Arch await store.addLogs(blocks.map(b => b.data)); }); + it('no logs returned if deleted ("txHash" filter param is respected variant)', async () => { + // get random tx + const targetBlockIndex = randomInt(numBlocks); + const targetTxIndex = randomInt(txsPerBlock); + const targetTxHash = blocks[targetBlockIndex].data.body.txEffects[targetTxIndex].txHash; + + await Promise.all([ + store.unwindBlocks(blocks.length, blocks.length), + store.deleteLogs(blocks.map(b => b.data)), + ]); + + const response = await store.getUnencryptedLogs({ txHash: targetTxHash }); + const logs = response.logs; + + expect(response.maxLogsHit).toBeFalsy(); + expect(logs.length).toEqual(0); + }); + it('"txHash" filter param is respected', async () => { // get random tx const targetBlockIndex = randomInt(numBlocks); diff --git a/yarn-project/archiver/src/archiver/data_retrieval.ts b/yarn-project/archiver/src/archiver/data_retrieval.ts index 1e79352fc81..fd11701b11d 100644 --- a/yarn-project/archiver/src/archiver/data_retrieval.ts +++ b/yarn-project/archiver/src/archiver/data_retrieval.ts @@ -134,7 +134,9 @@ async function getBlockFromRollupTx( data, }); - if (!(functionName === 'propose')) { + const allowedMethods = ['propose', 'proposeAndClaim']; + + if (!allowedMethods.includes(functionName)) { throw new Error(`Unexpected method called ${functionName}`); } const [headerHex, archiveRootHex, , , , bodyHex] = args! as readonly [Hex, Hex, Hex, Hex[], ViemSignature[], Hex]; @@ -237,7 +239,7 @@ export async function retrieveL2ProofsFromRollup( const lastProcessedL1BlockNumber = logs.length > 0 ? logs.at(-1)!.l1BlockNumber : searchStartBlock - 1n; for (const { txHash, proverId, l2BlockNumber } of logs) { - const proofData = await getBlockProofFromSubmitProofTx(publicClient, txHash, l2BlockNumber, proverId); + const proofData = await getProofFromSubmitProofTx(publicClient, txHash, proverId); retrievedData.push({ proof: proofData.proof, proverId: proofData.proverId, l2BlockNumber, txHash }); } return { @@ -247,7 +249,6 @@ export async function retrieveL2ProofsFromRollup( } export type SubmitBlockProof = { - header: Header; archiveRoot: Fr; proverId: Fr; aggregationObject: Buffer; @@ -263,39 +264,37 @@ export type SubmitBlockProof = { * @param l2BlockNum - L2 block number. * @returns L2 block metadata (header and archive) from the calldata, deserialized */ -export async function getBlockProofFromSubmitProofTx( +export async function getProofFromSubmitProofTx( publicClient: PublicClient, txHash: `0x${string}`, - l2BlockNum: bigint, expectedProverId: Fr, ): Promise { const { input: data } = await publicClient.getTransaction({ hash: txHash }); - const { functionName, args } = decodeFunctionData({ - abi: RollupAbi, - data, - }); - - if (!(functionName === 'submitBlockRootProof')) { - throw new Error(`Unexpected method called ${functionName}`); + const { functionName, args } = decodeFunctionData({ abi: RollupAbi, data }); + + let proverId: Fr; + let archiveRoot: Fr; + let aggregationObject: Buffer; + let proof: Proof; + + if (functionName === 'submitEpochRootProof') { + const [_epochSize, nestedArgs, _fees, aggregationObjectHex, proofHex] = args!; + aggregationObject = Buffer.from(hexToBytes(aggregationObjectHex)); + proverId = Fr.fromString(nestedArgs[6]); + archiveRoot = Fr.fromString(nestedArgs[1]); + proof = Proof.fromBuffer(Buffer.from(hexToBytes(proofHex))); + } else { + throw new Error(`Unexpected proof method called ${functionName}`); } - const [headerHex, archiveHex, proverIdHex, aggregationObjectHex, proofHex] = args!; - - const header = Header.fromBuffer(Buffer.from(hexToBytes(headerHex))); - const proverId = Fr.fromString(proverIdHex); - const blockNumberFromHeader = header.globalVariables.blockNumber.toBigInt(); - if (blockNumberFromHeader !== l2BlockNum) { - throw new Error(`Block number mismatch: expected ${l2BlockNum} but got ${blockNumberFromHeader}`); - } if (!proverId.equals(expectedProverId)) { throw new Error(`Prover ID mismatch: expected ${expectedProverId} but got ${proverId}`); } return { - header, proverId, - aggregationObject: Buffer.from(hexToBytes(aggregationObjectHex)), - archiveRoot: Fr.fromString(archiveHex), - proof: Proof.fromBuffer(Buffer.from(hexToBytes(proofHex))), + aggregationObject, + archiveRoot, + proof, }; } diff --git a/yarn-project/archiver/src/archiver/epoch_helpers.ts b/yarn-project/archiver/src/archiver/epoch_helpers.ts new file mode 100644 index 00000000000..2612329dd06 --- /dev/null +++ b/yarn-project/archiver/src/archiver/epoch_helpers.ts @@ -0,0 +1,26 @@ +import { AZTEC_EPOCH_DURATION, AZTEC_SLOT_DURATION } from '@aztec/circuits.js'; + +/** Returns the slot number for a given timestamp. */ +export function getSlotAtTimestamp(ts: bigint, constants: { l1GenesisTime: bigint }) { + return ts < constants.l1GenesisTime ? 0n : (ts - constants.l1GenesisTime) / BigInt(AZTEC_SLOT_DURATION); +} + +/** Returns the epoch number for a given timestamp. */ +export function getEpochNumberAtTimestamp(ts: bigint, constants: { l1GenesisTime: bigint }) { + return getSlotAtTimestamp(ts, constants) / BigInt(AZTEC_EPOCH_DURATION); +} + +/** Returns the range of slots (inclusive) for a given epoch number. */ +export function getSlotRangeForEpoch(epochNumber: bigint) { + const startSlot = epochNumber * BigInt(AZTEC_EPOCH_DURATION); + return [startSlot, startSlot + BigInt(AZTEC_EPOCH_DURATION) - 1n]; +} + +/** Returns the range of L1 timestamps (inclusive) for a given epoch number. */ +export function getTimestampRangeForEpoch(epochNumber: bigint, constants: { l1GenesisTime: bigint }) { + const [startSlot, endSlot] = getSlotRangeForEpoch(epochNumber); + return [ + constants.l1GenesisTime + startSlot * BigInt(AZTEC_SLOT_DURATION), + constants.l1GenesisTime + endSlot * BigInt(AZTEC_SLOT_DURATION), + ]; +} diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/block_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/block_store.ts index 024df9f1065..a4a3ba3281c 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/block_store.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/block_store.ts @@ -26,6 +26,12 @@ export class BlockStore { /** Stores L1 block number in which the last processed L2 block was included */ #lastSynchedL1Block: AztecSingleton; + /** Stores l2 block number of the last proven block */ + #lastProvenL2Block: AztecSingleton; + + /** Stores l2 epoch number of the last proven epoch */ + #lastProvenL2Epoch: AztecSingleton; + /** Index mapping transaction hash (as a string) to its location in a block */ #txIndex: AztecMap; @@ -40,6 +46,8 @@ export class BlockStore { this.#txIndex = db.openMap('archiver_tx_index'); this.#contractIndex = db.openMap('archiver_contract_index'); this.#lastSynchedL1Block = db.openSingleton('archiver_last_synched_l1_block'); + this.#lastProvenL2Block = db.openSingleton('archiver_last_proven_l2_block'); + this.#lastProvenL2Epoch = db.openSingleton('archiver_last_proven_l2_epoch'); } /** @@ -73,6 +81,38 @@ export class BlockStore { }); } + /** + * Unwinds blocks from the database + * @param from - The tip of the chain, passed for verification purposes, + * ensuring that we don't end up deleting something we did not intend + * @param blocksToUnwind - The number of blocks we are to unwind + * @returns True if the operation is successful + */ + unwindBlocks(from: number, blocksToUnwind: number) { + return this.db.transaction(() => { + const last = this.getSynchedL2BlockNumber(); + if (from != last) { + throw new Error(`Can only remove from the tip`); + } + + for (let i = 0; i < blocksToUnwind; i++) { + const blockNumber = from - i; + const block = this.getBlock(blockNumber); + + if (block === undefined) { + throw new Error(`Cannot remove block ${blockNumber} from the store, we don't have it`); + } + void this.#blocks.delete(block.data.number); + block.data.body.txEffects.forEach(tx => { + void this.#txIndex.delete(tx.txHash.toString()); + }); + void this.#blockBodies.delete(block.data.body.getTxsEffectsHash().toString('hex')); + } + + return true; + }); + } + /** * Gets up to `limit` amount of L2 blocks starting from `from`. * @param start - Number of the first block to return (inclusive). @@ -99,6 +139,18 @@ export class BlockStore { return this.getBlockFromBlockStorage(blockStorage); } + /** + * Gets the headers for a sequence of L2 blocks. + * @param start - Number of the first block to return (inclusive). + * @param limit - The number of blocks to return. + * @returns The requested L2 block headers + */ + *getBlockHeaders(start: number, limit: number): IterableIterator
{ + for (const blockStorage of this.#blocks.values(this.#computeBlockRange(start, limit))) { + yield Header.fromBuffer(blockStorage.header); + } + } + private getBlockFromBlockStorage(blockStorage: BlockStorage) { const header = Header.fromBuffer(blockStorage.header); const archive = AppendOnlyTreeSnapshot.fromBuffer(blockStorage.archive); @@ -109,7 +161,7 @@ export class BlockStore { } const body = Body.fromBuffer(blockBodyBuffer); - const l2Block = L2Block.fromFields({ header, archive, body }); + const l2Block = new L2Block(archive, header, body); return { data: l2Block, l1: blockStorage.l1 }; } @@ -191,13 +243,29 @@ export class BlockStore { void this.#lastSynchedL1Block.set(l1BlockNumber); } + getProvenL2BlockNumber(): number { + return this.#lastProvenL2Block.get() ?? 0; + } + + setProvenL2BlockNumber(blockNumber: number) { + void this.#lastProvenL2Block.set(blockNumber); + } + + getProvenL2EpochNumber(): number | undefined { + return this.#lastProvenL2Epoch.get(); + } + + setProvenL2EpochNumber(epochNumber: number) { + void this.#lastProvenL2Epoch.set(epochNumber); + } + #computeBlockRange(start: number, limit: number): Required, 'start' | 'end'>> { if (limit < 1) { throw new Error(`Invalid limit: ${limit}`); } if (start < INITIAL_L2_BLOCK_NUM) { - start = INITIAL_L2_BLOCK_NUM; + throw new Error(`Invalid start: ${start}`); } const end = start + limit; diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_class_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_class_store.ts index 8c14213d37e..df0b7c80b9b 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_class_store.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_class_store.ts @@ -3,6 +3,7 @@ import { BufferReader, numToUInt8, serializeToBuffer } from '@aztec/foundation/s import { type AztecKVStore, type AztecMap } from '@aztec/kv-store'; import { type ContractClassPublic, + type ContractClassPublicWithBlockNumber, type ExecutablePrivateFunctionWithMembershipProof, type UnconstrainedFunctionWithMembershipProof, } from '@aztec/types/contracts'; @@ -17,8 +18,18 @@ export class ContractClassStore { this.#contractClasses = db.openMap('archiver_contract_classes'); } - addContractClass(contractClass: ContractClassPublic): Promise { - return this.#contractClasses.set(contractClass.id.toString(), serializeContractClassPublic(contractClass)); + async addContractClass(contractClass: ContractClassPublic, blockNumber: number): Promise { + await this.#contractClasses.setIfNotExists( + contractClass.id.toString(), + serializeContractClassPublic({ ...contractClass, l2BlockNumber: blockNumber }), + ); + } + + async deleteContractClasses(contractClass: ContractClassPublic, blockNumber: number): Promise { + const restoredContractClass = this.#contractClasses.get(contractClass.id.toString()); + if (restoredContractClass && deserializeContractClassPublic(restoredContractClass).l2BlockNumber >= blockNumber) { + await this.#contractClasses.delete(contractClass.id.toString()); + } } getContractClass(id: Fr): ContractClassPublic | undefined { @@ -44,7 +55,7 @@ export class ContractClassStore { const existingClass = deserializeContractClassPublic(existingClassBuffer); const { privateFunctions: existingPrivateFns, unconstrainedFunctions: existingUnconstrainedFns } = existingClass; - const updatedClass: Omit = { + const updatedClass: Omit = { ...existingClass, privateFunctions: [ ...existingPrivateFns, @@ -63,8 +74,9 @@ export class ContractClassStore { } } -function serializeContractClassPublic(contractClass: Omit): Buffer { +function serializeContractClassPublic(contractClass: Omit): Buffer { return serializeToBuffer( + contractClass.l2BlockNumber, numToUInt8(contractClass.version), contractClass.artifactHash, contractClass.publicFunctions.length, @@ -108,9 +120,10 @@ function serializeUnconstrainedFunction(fn: UnconstrainedFunctionWithMembershipP ); } -function deserializeContractClassPublic(buffer: Buffer): Omit { +function deserializeContractClassPublic(buffer: Buffer): Omit { const reader = BufferReader.asReader(buffer); return { + l2BlockNumber: reader.readNumber(), version: reader.readUInt8() as 1, artifactHash: reader.readObject(Fr), publicFunctions: reader.readVector({ diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_instance_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_instance_store.ts index 0c8b8597b65..9aa40c56271 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_instance_store.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_instance_store.ts @@ -19,6 +19,10 @@ export class ContractInstanceStore { ); } + deleteContractInstance(contractInstance: ContractInstanceWithAddress): Promise { + return this.#contractInstances.delete(contractInstance.address.toString()); + } + getContractInstance(address: AztecAddress): ContractInstanceWithAddress | undefined { const contractInstance = this.#contractInstances.get(address.toString()); return contractInstance && SerializableContractInstance.fromBuffer(contractInstance).withAddress(address); diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts index 944acd694b1..37a2d7d11f4 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts @@ -10,7 +10,7 @@ import { type TxHash, type TxReceipt, } from '@aztec/circuit-types'; -import { type Fr } from '@aztec/circuits.js'; +import { type Fr, type Header } from '@aztec/circuits.js'; import { type ContractArtifact } from '@aztec/foundation/abi'; import { type AztecAddress } from '@aztec/foundation/aztec-address'; import { createDebugLogger } from '@aztec/foundation/log'; @@ -23,7 +23,7 @@ import { } from '@aztec/types/contracts'; import { type ArchiverDataStore, type ArchiverL1SynchPoint } from '../archiver_store.js'; -import { type DataRetrieval, type SingletonDataRetrieval } from '../structs/data_retrieval.js'; +import { type DataRetrieval } from '../structs/data_retrieval.js'; import { type L1Published } from '../structs/published.js'; import { BlockStore } from './block_store.js'; import { ContractArtifactsStore } from './contract_artifacts_store.js'; @@ -31,14 +31,12 @@ import { ContractClassStore } from './contract_class_store.js'; import { ContractInstanceStore } from './contract_instance_store.js'; import { LogStore } from './log_store.js'; import { MessageStore } from './message_store.js'; -import { ProvenStore } from './proven_store.js'; /** * LMDB implementation of the ArchiverDataStore interface. */ export class KVArchiverDataStore implements ArchiverDataStore { #blockStore: BlockStore; - #provenStore: ProvenStore; #logStore: LogStore; #messageStore: MessageStore; #contractClassStore: ContractClassStore; @@ -49,7 +47,6 @@ export class KVArchiverDataStore implements ArchiverDataStore { constructor(db: AztecKVStore, logsMaxPageSize: number = 1000) { this.#blockStore = new BlockStore(db); - this.#provenStore = new ProvenStore(db); this.#logStore = new LogStore(db, this.#blockStore, logsMaxPageSize); this.#messageStore = new MessageStore(db); this.#contractClassStore = new ContractClassStore(db); @@ -77,8 +74,14 @@ export class KVArchiverDataStore implements ArchiverDataStore { return Promise.resolve(this.#contractInstanceStore.getContractInstance(address)); } - async addContractClasses(data: ContractClassPublic[], _blockNumber: number): Promise { - return (await Promise.all(data.map(c => this.#contractClassStore.addContractClass(c)))).every(Boolean); + async addContractClasses(data: ContractClassPublic[], blockNumber: number): Promise { + return (await Promise.all(data.map(c => this.#contractClassStore.addContractClass(c, blockNumber)))).every(Boolean); + } + + async deleteContractClasses(data: ContractClassPublic[], blockNumber: number): Promise { + return (await Promise.all(data.map(c => this.#contractClassStore.deleteContractClasses(c, blockNumber)))).every( + Boolean, + ); } addFunctions( @@ -93,6 +96,10 @@ export class KVArchiverDataStore implements ArchiverDataStore { return (await Promise.all(data.map(c => this.#contractInstanceStore.addContractInstance(c)))).every(Boolean); } + async deleteContractInstances(data: ContractInstanceWithAddress[], _blockNumber: number): Promise { + return (await Promise.all(data.map(c => this.#contractInstanceStore.deleteContractInstance(c)))).every(Boolean); + } + /** * Append new blocks to the store's list. * @param blocks - The L2 blocks to be added to the store and the last processed L1 block. @@ -102,6 +109,17 @@ export class KVArchiverDataStore implements ArchiverDataStore { return this.#blockStore.addBlocks(blocks); } + /** + * Unwinds blocks from the database + * @param from - The tip of the chain, passed for verification purposes, + * ensuring that we don't end up deleting something we did not intend + * @param blocksToUnwind - The number of blocks we are to unwind + * @returns True if the operation is successful + */ + unwindBlocks(from: number, blocksToUnwind: number): Promise { + return this.#blockStore.unwindBlocks(from, blocksToUnwind); + } + /** * Gets up to `limit` amount of L2 blocks starting from `from`. * @@ -118,6 +136,22 @@ export class KVArchiverDataStore implements ArchiverDataStore { } } + /** + * Gets up to `limit` amount of L2 blocks headers starting from `from`. + * + * @param start - Number of the first block to return (inclusive). + * @param limit - The number of blocks to return. + * @returns The requested L2 blocks + */ + getBlockHeaders(start: number, limit: number): Promise { + try { + return Promise.resolve(Array.from(this.#blockStore.getBlockHeaders(start, limit))); + } catch (err) { + // this function is sync so if any errors are thrown we need to make sure they're passed on as rejected Promises + return Promise.reject(err); + } + } + /** * Gets a tx effect. * @param txHash - The txHash of the tx corresponding to the tx effect. @@ -145,6 +179,14 @@ export class KVArchiverDataStore implements ArchiverDataStore { return this.#logStore.addLogs(blocks); } + deleteLogs(blocks: L2Block[]): Promise { + return this.#logStore.deleteLogs(blocks); + } + + getTotalL1ToL2MessageCount(): Promise { + return Promise.resolve(this.#messageStore.getTotalL1ToL2MessageCount()); + } + /** * Append L1 to L2 messages to the store. * @param messages - The L1 to L2 messages to be added to the store and the last processed L1 block. @@ -218,11 +260,21 @@ export class KVArchiverDataStore implements ArchiverDataStore { } getProvenL2BlockNumber(): Promise { - return Promise.resolve(this.#provenStore.getProvenL2BlockNumber()); + return Promise.resolve(this.#blockStore.getProvenL2BlockNumber()); + } + + getProvenL2EpochNumber(): Promise { + return Promise.resolve(this.#blockStore.getProvenL2EpochNumber()); } - async setProvenL2BlockNumber(blockNumber: SingletonDataRetrieval) { - await this.#provenStore.setProvenL2BlockNumber(blockNumber); + setProvenL2BlockNumber(blockNumber: number) { + this.#blockStore.setProvenL2BlockNumber(blockNumber); + return Promise.resolve(); + } + + setProvenL2EpochNumber(epochNumber: number) { + this.#blockStore.setProvenL2EpochNumber(epochNumber); + return Promise.resolve(); } setBlockSynchedL1BlockNumber(l1BlockNumber: bigint) { @@ -242,7 +294,6 @@ export class KVArchiverDataStore implements ArchiverDataStore { return Promise.resolve({ blocksSynchedTo: this.#blockStore.getSynchedL1BlockNumber(), messagesSynchedTo: this.#messageStore.getSynchedL1BlockNumber(), - provenLogsSynchedTo: this.#provenStore.getSynchedL1BlockNumber(), }); } } diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/log_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/log_store.ts index f5fa9836c33..58fbe849a02 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/log_store.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/log_store.ts @@ -44,17 +44,21 @@ export class LogStore { addLogs(blocks: L2Block[]): Promise { return this.db.transaction(() => { blocks.forEach(block => { - if (block.body.noteEncryptedLogs) { - void this.#noteEncryptedLogs.set(block.number, block.body.noteEncryptedLogs.toBuffer()); - } + void this.#noteEncryptedLogs.set(block.number, block.body.noteEncryptedLogs.toBuffer()); + void this.#encryptedLogs.set(block.number, block.body.encryptedLogs.toBuffer()); + void this.#unencryptedLogs.set(block.number, block.body.unencryptedLogs.toBuffer()); + }); - if (block.body.encryptedLogs) { - void this.#encryptedLogs.set(block.number, block.body.encryptedLogs.toBuffer()); - } + return true; + }); + } - if (block.body.unencryptedLogs) { - void this.#unencryptedLogs.set(block.number, block.body.unencryptedLogs.toBuffer()); - } + deleteLogs(blocks: L2Block[]): Promise { + return this.db.transaction(() => { + blocks.forEach(block => { + void this.#noteEncryptedLogs.delete(block.number); + void this.#encryptedLogs.delete(block.number); + void this.#unencryptedLogs.delete(block.number); }); return true; diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/message_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/message_store.ts index 23a13a9ca32..3372785e6e4 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/message_store.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/message_store.ts @@ -17,6 +17,7 @@ export class MessageStore { #l1ToL2Messages: AztecMap; #l1ToL2MessageIndices: AztecMap; // We store array of bigints here because there can be duplicate messages #lastSynchedL1Block: AztecSingleton; + #totalMessageCount: AztecSingleton; #log = createDebugLogger('aztec:archiver:message_store'); @@ -26,6 +27,11 @@ export class MessageStore { this.#l1ToL2Messages = db.openMap('archiver_l1_to_l2_messages'); this.#l1ToL2MessageIndices = db.openMap('archiver_l1_to_l2_message_indices'); this.#lastSynchedL1Block = db.openSingleton('archiver_last_l1_block_new_messages'); + this.#totalMessageCount = db.openSingleton('archiver_l1_to_l2_message_count'); + } + + getTotalL1ToL2MessageCount(): bigint { + return this.#totalMessageCount.get() ?? 0n; } /** @@ -70,6 +76,9 @@ export class MessageStore { void this.#l1ToL2MessageIndices.set(message.leaf.toString(), indices); } + const lastTotalMessageCount = this.getTotalL1ToL2MessageCount(); + void this.#totalMessageCount.set(lastTotalMessageCount + BigInt(messages.retrievedData.length)); + return true; }); } diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/proven_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/proven_store.ts deleted file mode 100644 index d94b75b7ada..00000000000 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/proven_store.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { type AztecKVStore, type AztecSingleton } from '@aztec/kv-store'; - -import { type SingletonDataRetrieval } from '../structs/data_retrieval.js'; - -export class ProvenStore { - /** Stores L1 block number in which the last processed L2 block was included */ - #lastSynchedL1Block: AztecSingleton; - - /** Stores last proven L2 block number */ - #lastProvenL2Block: AztecSingleton; - - constructor(private db: AztecKVStore) { - this.#lastSynchedL1Block = db.openSingleton('archiver_last_l1_block_proven_logs'); - this.#lastProvenL2Block = db.openSingleton('archiver_last_proven_l2_block'); - } - - /** - * Gets the most recent L1 block processed. - */ - getSynchedL1BlockNumber(): bigint | undefined { - return this.#lastSynchedL1Block.get(); - } - - getProvenL2BlockNumber(): number { - return this.#lastProvenL2Block.get() ?? 0; - } - - async setProvenL2BlockNumber(blockNumber: SingletonDataRetrieval) { - await this.db.transaction(() => { - void this.#lastProvenL2Block.set(blockNumber.retrievedData); - void this.#lastSynchedL1Block.set(blockNumber.lastProcessedL1BlockNumber); - }); - } -} diff --git a/yarn-project/archiver/src/archiver/memory_archiver_store/l1_to_l2_message_store.ts b/yarn-project/archiver/src/archiver/memory_archiver_store/l1_to_l2_message_store.ts index a922e62067e..52f887056ac 100644 --- a/yarn-project/archiver/src/archiver/memory_archiver_store/l1_to_l2_message_store.ts +++ b/yarn-project/archiver/src/archiver/memory_archiver_store/l1_to_l2_message_store.ts @@ -19,6 +19,10 @@ export class L1ToL2MessageStore { constructor() {} + getTotalL1ToL2MessageCount(): bigint { + return BigInt(this.store.size); + } + addMessage(message: InboxLeaf) { if (message.index >= this.#l1ToL2MessagesSubtreeSize) { throw new Error(`Message index ${message.index} out of subtree range`); diff --git a/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts b/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts index 775503ae2d9..6bb14927baa 100644 --- a/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts +++ b/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts @@ -15,18 +15,19 @@ import { TxReceipt, type UnencryptedL2BlockL2Logs, } from '@aztec/circuit-types'; -import { Fr, INITIAL_L2_BLOCK_NUM } from '@aztec/circuits.js'; +import { Fr, type Header, INITIAL_L2_BLOCK_NUM } from '@aztec/circuits.js'; import { type ContractArtifact } from '@aztec/foundation/abi'; import { type AztecAddress } from '@aztec/foundation/aztec-address'; import { type ContractClassPublic, + type ContractClassPublicWithBlockNumber, type ContractInstanceWithAddress, type ExecutablePrivateFunctionWithMembershipProof, type UnconstrainedFunctionWithMembershipProof, } from '@aztec/types/contracts'; import { type ArchiverDataStore, type ArchiverL1SynchPoint } from '../archiver_store.js'; -import { type DataRetrieval, type SingletonDataRetrieval } from '../structs/data_retrieval.js'; +import { type DataRetrieval } from '../structs/data_retrieval.js'; import { type L1Published } from '../structs/published.js'; import { L1ToL2MessageStore } from './l1_to_l2_message_store.js'; @@ -44,23 +45,11 @@ export class MemoryArchiverStore implements ArchiverDataStore { */ private txEffects: TxEffect[] = []; - /** - * An array containing all the encrypted logs that have been fetched so far. - * Note: Index in the "outer" array equals to (corresponding L2 block's number - INITIAL_L2_BLOCK_NUM). - */ - private noteEncryptedLogsPerBlock: EncryptedNoteL2BlockL2Logs[] = []; + private noteEncryptedLogsPerBlock: Map = new Map(); - /** - * An array containing all the encrypted logs that have been fetched so far. - * Note: Index in the "outer" array equals to (corresponding L2 block's number - INITIAL_L2_BLOCK_NUM). - */ - private encryptedLogsPerBlock: EncryptedL2BlockL2Logs[] = []; + private encryptedLogsPerBlock: Map = new Map(); - /** - * An array containing all the unencrypted logs that have been fetched so far. - * Note: Index in the "outer" array equals to (corresponding L2 block's number - INITIAL_L2_BLOCK_NUM). - */ - private unencryptedLogsPerBlock: UnencryptedL2BlockL2Logs[] = []; + private unencryptedLogsPerBlock: Map = new Map(); /** * Contains all L1 to L2 messages. @@ -69,7 +58,7 @@ export class MemoryArchiverStore implements ArchiverDataStore { private contractArtifacts: Map = new Map(); - private contractClasses: Map = new Map(); + private contractClasses: Map = new Map(); private privateFunctions: Map = new Map(); @@ -79,9 +68,9 @@ export class MemoryArchiverStore implements ArchiverDataStore { private lastL1BlockNewBlocks: bigint | undefined = undefined; private lastL1BlockNewMessages: bigint | undefined = undefined; - private lastL1BlockNewProvenLogs: bigint | undefined = undefined; private lastProvenL2BlockNumber: number = 0; + private lastProvenL2EpochNumber: number = 0; constructor( /** The max number of logs that can be obtained in 1 "getUnencryptedLogs" call. */ @@ -129,9 +118,24 @@ export class MemoryArchiverStore implements ArchiverDataStore { return Promise.resolve(true); } - public addContractClasses(data: ContractClassPublic[], _blockNumber: number): Promise { + public addContractClasses(data: ContractClassPublic[], blockNumber: number): Promise { for (const contractClass of data) { - this.contractClasses.set(contractClass.id.toString(), contractClass); + if (!this.contractClasses.has(contractClass.id.toString())) { + this.contractClasses.set(contractClass.id.toString(), { + ...contractClass, + l2BlockNumber: blockNumber, + }); + } + } + return Promise.resolve(true); + } + + public deleteContractClasses(data: ContractClassPublic[], blockNumber: number): Promise { + for (const contractClass of data) { + const restored = this.contractClasses.get(contractClass.id.toString()); + if (restored && restored.l2BlockNumber >= blockNumber) { + this.contractClasses.delete(contractClass.id.toString()); + } } return Promise.resolve(true); } @@ -143,6 +147,13 @@ export class MemoryArchiverStore implements ArchiverDataStore { return Promise.resolve(true); } + public deleteContractInstances(data: ContractInstanceWithAddress[], _blockNumber: number): Promise { + for (const contractInstance of data) { + this.contractInstances.delete(contractInstance.address.toString()); + } + return Promise.resolve(true); + } + /** * Append new blocks to the store's list. * @param blocks - The L2 blocks to be added to the store and the last processed L1 block. @@ -160,6 +171,31 @@ export class MemoryArchiverStore implements ArchiverDataStore { return Promise.resolve(true); } + /** + * Unwinds blocks from the database + * @param from - The tip of the chain, passed for verification purposes, + * ensuring that we don't end up deleting something we did not intend + * @param blocksToUnwind - The number of blocks we are to unwind + * @returns True if the operation is successful + */ + public async unwindBlocks(from: number, blocksToUnwind: number): Promise { + const last = await this.getSynchedL2BlockNumber(); + if (from != last) { + throw new Error(`Can only remove the tip`); + } + + const stopAt = from - blocksToUnwind; + while ((await this.getSynchedL2BlockNumber()) > stopAt) { + const block = this.l2Blocks.pop(); + if (block == undefined) { + break; + } + block.data.body.txEffects.forEach(() => this.txEffects.pop()); + } + + return Promise.resolve(true); + } + /** * Append new logs to the store's list. * @param block - The block for which to add the logs. @@ -167,22 +203,27 @@ export class MemoryArchiverStore implements ArchiverDataStore { */ addLogs(blocks: L2Block[]): Promise { blocks.forEach(block => { - if (block.body.noteEncryptedLogs) { - this.noteEncryptedLogsPerBlock[block.number - INITIAL_L2_BLOCK_NUM] = block.body.noteEncryptedLogs; - } - - if (block.body.encryptedLogs) { - this.encryptedLogsPerBlock[block.number - INITIAL_L2_BLOCK_NUM] = block.body.encryptedLogs; - } + this.noteEncryptedLogsPerBlock.set(block.number, block.body.noteEncryptedLogs); + this.encryptedLogsPerBlock.set(block.number, block.body.encryptedLogs); + this.unencryptedLogsPerBlock.set(block.number, block.body.unencryptedLogs); + }); + return Promise.resolve(true); + } - if (block.body.unencryptedLogs) { - this.unencryptedLogsPerBlock[block.number - INITIAL_L2_BLOCK_NUM] = block.body.unencryptedLogs; - } + deleteLogs(blocks: L2Block[]): Promise { + blocks.forEach(block => { + this.encryptedLogsPerBlock.delete(block.number); + this.noteEncryptedLogsPerBlock.delete(block.number); + this.unencryptedLogsPerBlock.delete(block.number); }); return Promise.resolve(true); } + getTotalL1ToL2MessageCount(): Promise { + return Promise.resolve(this.l1ToL2Messages.getTotalL1ToL2MessageCount()); + } + /** * Append L1 to L2 messages to the store. * @param messages - The L1 to L2 messages to be added to the store and the last processed L1 block. @@ -221,12 +262,15 @@ export class MemoryArchiverStore implements ArchiverDataStore { * @remarks When "from" is smaller than genesis block number, blocks from the beginning are returned. */ public getBlocks(from: number, limit: number): Promise[]> { - // Return an empty array if we are outside of range if (limit < 1) { return Promise.reject(new Error(`Invalid limit: ${limit}`)); } - const fromIndex = Math.max(from - INITIAL_L2_BLOCK_NUM, 0); + if (from < INITIAL_L2_BLOCK_NUM) { + return Promise.reject(new Error(`Invalid start: ${from}`)); + } + + const fromIndex = from - INITIAL_L2_BLOCK_NUM; if (fromIndex >= this.l2Blocks.length) { return Promise.resolve([]); } @@ -235,6 +279,11 @@ export class MemoryArchiverStore implements ArchiverDataStore { return Promise.resolve(this.l2Blocks.slice(fromIndex, toIndex)); } + public async getBlockHeaders(from: number, limit: number): Promise { + const blocks = await this.getBlocks(from, limit); + return blocks.map(block => block.data.header); + } + /** * Gets a tx effect. * @param txHash - The txHash of the tx effect. @@ -292,9 +341,14 @@ export class MemoryArchiverStore implements ArchiverDataStore { logType: TLogType, ): Promise>[]> { if (from < INITIAL_L2_BLOCK_NUM || limit < 1) { - throw new Error(`Invalid limit: ${limit}`); + return Promise.resolve([]); } - const logs = (() => { + + if (from > this.l2Blocks.length) { + return Promise.resolve([]); + } + + const logMap = (() => { switch (logType) { case LogType.ENCRYPTED: return this.encryptedLogsPerBlock; @@ -304,14 +358,24 @@ export class MemoryArchiverStore implements ArchiverDataStore { default: return this.unencryptedLogsPerBlock; } - })() as L2BlockL2Logs>[]; + })() as Map>>; - if (from > logs.length) { - return Promise.resolve([]); - } - const startIndex = from - INITIAL_L2_BLOCK_NUM; + const startIndex = from; const endIndex = startIndex + limit; - return Promise.resolve(logs.slice(startIndex, endIndex)); + const upper = Math.min(endIndex, this.l2Blocks.length + INITIAL_L2_BLOCK_NUM); + + const l = []; + for (let i = startIndex; i < upper; i++) { + const log = logMap.get(i); + if (log) { + l.push(log); + } else { + // I hate typescript sometimes + l.push(undefined as unknown as L2BlockL2Logs>); + } + } + + return Promise.resolve(l); } /** @@ -322,37 +386,37 @@ export class MemoryArchiverStore implements ArchiverDataStore { */ getUnencryptedLogs(filter: LogFilter): Promise { let txHash: TxHash | undefined; - let fromBlockIndex = 0; - let toBlockIndex = this.unencryptedLogsPerBlock.length; + let fromBlock = 0; + let toBlock = this.l2Blocks.length + INITIAL_L2_BLOCK_NUM; let txIndexInBlock = 0; let logIndexInTx = 0; if (filter.afterLog) { // Continuation parameter is set --> tx hash is ignored if (filter.fromBlock == undefined || filter.fromBlock <= filter.afterLog.blockNumber) { - fromBlockIndex = filter.afterLog.blockNumber - INITIAL_L2_BLOCK_NUM; + fromBlock = filter.afterLog.blockNumber; txIndexInBlock = filter.afterLog.txIndex; logIndexInTx = filter.afterLog.logIndex + 1; // We want to start from the next log } else { - fromBlockIndex = filter.fromBlock - INITIAL_L2_BLOCK_NUM; + fromBlock = filter.fromBlock; } } else { txHash = filter.txHash; if (filter.fromBlock !== undefined) { - fromBlockIndex = filter.fromBlock - INITIAL_L2_BLOCK_NUM; + fromBlock = filter.fromBlock; } } if (filter.toBlock !== undefined) { - toBlockIndex = filter.toBlock - INITIAL_L2_BLOCK_NUM; + toBlock = filter.toBlock; } // Ensure the indices are within block array bounds - fromBlockIndex = Math.max(fromBlockIndex, 0); - toBlockIndex = Math.min(toBlockIndex, this.unencryptedLogsPerBlock.length); + fromBlock = Math.max(fromBlock, INITIAL_L2_BLOCK_NUM); + toBlock = Math.min(toBlock, this.l2Blocks.length + INITIAL_L2_BLOCK_NUM); - if (fromBlockIndex > this.unencryptedLogsPerBlock.length || toBlockIndex < fromBlockIndex || toBlockIndex <= 0) { + if (fromBlock > this.l2Blocks.length || toBlock < fromBlock || toBlock <= 0) { return Promise.resolve({ logs: [], maxLogsHit: false, @@ -363,27 +427,30 @@ export class MemoryArchiverStore implements ArchiverDataStore { const logs: ExtendedUnencryptedL2Log[] = []; - for (; fromBlockIndex < toBlockIndex; fromBlockIndex++) { - const block = this.l2Blocks[fromBlockIndex]; - const blockLogs = this.unencryptedLogsPerBlock[fromBlockIndex]; - for (; txIndexInBlock < blockLogs.txLogs.length; txIndexInBlock++) { - const txLogs = blockLogs.txLogs[txIndexInBlock].unrollLogs(); - for (; logIndexInTx < txLogs.length; logIndexInTx++) { - const log = txLogs[logIndexInTx]; - if ( - (!txHash || block.data.body.txEffects[txIndexInBlock].txHash.equals(txHash)) && - (!contractAddress || log.contractAddress.equals(contractAddress)) - ) { - logs.push(new ExtendedUnencryptedL2Log(new LogId(block.data.number, txIndexInBlock, logIndexInTx), log)); - if (logs.length === this.maxLogs) { - return Promise.resolve({ - logs, - maxLogsHit: true, - }); + for (; fromBlock < toBlock; fromBlock++) { + const block = this.l2Blocks[fromBlock - INITIAL_L2_BLOCK_NUM]; + const blockLogs = this.unencryptedLogsPerBlock.get(fromBlock); + + if (blockLogs) { + for (; txIndexInBlock < blockLogs.txLogs.length; txIndexInBlock++) { + const txLogs = blockLogs.txLogs[txIndexInBlock].unrollLogs(); + for (; logIndexInTx < txLogs.length; logIndexInTx++) { + const log = txLogs[logIndexInTx]; + if ( + (!txHash || block.data.body.txEffects[txIndexInBlock].txHash.equals(txHash)) && + (!contractAddress || log.contractAddress.equals(contractAddress)) + ) { + logs.push(new ExtendedUnencryptedL2Log(new LogId(block.data.number, txIndexInBlock, logIndexInTx), log)); + if (logs.length === this.maxLogs) { + return Promise.resolve({ + logs, + maxLogsHit: true, + }); + } } } + logIndexInTx = 0; } - logIndexInTx = 0; } txIndexInBlock = 0; } @@ -409,9 +476,17 @@ export class MemoryArchiverStore implements ArchiverDataStore { return Promise.resolve(this.lastProvenL2BlockNumber); } - public setProvenL2BlockNumber(l2BlockNumber: SingletonDataRetrieval): Promise { - this.lastProvenL2BlockNumber = l2BlockNumber.retrievedData; - this.lastL1BlockNewProvenLogs = l2BlockNumber.lastProcessedL1BlockNumber; + public getProvenL2EpochNumber(): Promise { + return Promise.resolve(this.lastProvenL2EpochNumber); + } + + public setProvenL2BlockNumber(l2BlockNumber: number): Promise { + this.lastProvenL2BlockNumber = l2BlockNumber; + return Promise.resolve(); + } + + public setProvenL2EpochNumber(l2EpochNumber: number): Promise { + this.lastProvenL2EpochNumber = l2EpochNumber; return Promise.resolve(); } @@ -429,7 +504,6 @@ export class MemoryArchiverStore implements ArchiverDataStore { return Promise.resolve({ blocksSynchedTo: this.lastL1BlockNewBlocks, messagesSynchedTo: this.lastL1BlockNewMessages, - provenLogsSynchedTo: this.lastL1BlockNewProvenLogs, }); } diff --git a/yarn-project/archiver/src/test/index.ts b/yarn-project/archiver/src/test/index.ts new file mode 100644 index 00000000000..5ff05e2acb4 --- /dev/null +++ b/yarn-project/archiver/src/test/index.ts @@ -0,0 +1 @@ +export * from './mock_l2_block_source.js'; diff --git a/yarn-project/p2p/src/client/mocks.ts b/yarn-project/archiver/src/test/mock_l2_block_source.ts similarity index 76% rename from yarn-project/p2p/src/client/mocks.ts rename to yarn-project/archiver/src/test/mock_l2_block_source.ts index 599769a9d30..4206f29c4fe 100644 --- a/yarn-project/p2p/src/client/mocks.ts +++ b/yarn-project/archiver/src/test/mock_l2_block_source.ts @@ -1,5 +1,7 @@ import { L2Block, type L2BlockSource, type TxEffect, type TxHash, TxReceipt, TxStatus } from '@aztec/circuit-types'; -import { EthAddress } from '@aztec/circuits.js'; +import { EthAddress, type Header } from '@aztec/circuits.js'; + +import { getSlotRangeForEpoch } from '../archiver/epoch_helpers.js'; /** * A mocked implementation of L2BlockSource to be used in p2p tests. @@ -7,6 +9,7 @@ import { EthAddress } from '@aztec/circuits.js'; export class MockBlockSource implements L2BlockSource { private l2Blocks: L2Block[] = []; private txEffects: TxEffect[] = []; + private provenEpochNumber: number = 0; constructor(numBlocks = 100, private provenBlockNumber?: number) { this.addBlocks(numBlocks); @@ -25,6 +28,10 @@ export class MockBlockSource implements L2BlockSource { this.provenBlockNumber = provenBlockNumber; } + public setProvenEpochNumber(provenEpochNumber: number) { + this.provenEpochNumber = provenEpochNumber; + } + /** * Method to fetch the rollup contract address at the base-layer. * @returns The rollup address. @@ -53,6 +60,10 @@ export class MockBlockSource implements L2BlockSource { return this.provenBlockNumber ?? (await this.getBlockNumber()); } + public getProvenL2EpochNumber(): Promise { + return Promise.resolve(this.provenEpochNumber); + } + /** * Gets an l2 block. * @param number - The block number to return (inclusive). @@ -76,6 +87,19 @@ export class MockBlockSource implements L2BlockSource { ); } + getBlockHeader(number: number | 'latest'): Promise
{ + return Promise.resolve(this.l2Blocks.at(typeof number === 'number' ? number : -1)?.header); + } + + getBlocksForEpoch(epochNumber: bigint): Promise { + const [start, end] = getSlotRangeForEpoch(epochNumber); + const blocks = this.l2Blocks.filter(b => { + const slot = b.header.globalVariables.slotNumber.toBigInt(); + return slot >= start && slot <= end; + }); + return Promise.resolve(blocks); + } + /** * Gets a tx effect. * @param txHash - The hash of a transaction which resulted in the returned tx effect. @@ -111,6 +135,18 @@ export class MockBlockSource implements L2BlockSource { return Promise.resolve(undefined); } + getL2EpochNumber(): Promise { + throw new Error('Method not implemented.'); + } + + getL2SlotNumber(): Promise { + throw new Error('Method not implemented.'); + } + + isEpochComplete(_epochNumber: bigint): Promise { + throw new Error('Method not implemented.'); + } + /** * Starts the block source. In this mock implementation, this is a noop. * @returns A promise that signals the initialization of the l2 block source on completion. diff --git a/yarn-project/aztec-faucet/src/bin/index.ts b/yarn-project/aztec-faucet/src/bin/index.ts index 15058725657..456c067e4ed 100644 --- a/yarn-project/aztec-faucet/src/bin/index.ts +++ b/yarn-project/aztec-faucet/src/bin/index.ts @@ -2,7 +2,7 @@ import { NULL_KEY, createEthereumChain } from '@aztec/ethereum'; import { EthAddress } from '@aztec/foundation/eth-address'; import { createDebugLogger } from '@aztec/foundation/log'; -import { PortalERC20Abi } from '@aztec/l1-artifacts'; +import { TestERC20Abi } from '@aztec/l1-artifacts'; import http from 'http'; import Koa from 'koa'; @@ -182,7 +182,7 @@ async function transferAsset(assetName: AssetName, address: string) { try { const contract = getContract({ - abi: PortalERC20Abi, + abi: TestERC20Abi, address: assetAddress, client: walletClient, }); diff --git a/yarn-project/aztec-node/src/aztec-node/server.ts b/yarn-project/aztec-node/src/aztec-node/server.ts index c8a34e7a1ab..83860d56b89 100644 --- a/yarn-project/aztec-node/src/aztec-node/server.ts +++ b/yarn-project/aztec-node/src/aztec-node/server.ts @@ -3,6 +3,7 @@ import { BBCircuitVerifier, TestCircuitVerifier } from '@aztec/bb-prover'; import { type AztecNode, type ClientProtocolCircuitVerifier, + type EpochProofQuote, type FromLogType, type GetUnencryptedLogsResponse, type L1ToL2MessageSource, @@ -58,7 +59,6 @@ import { AggregateTxValidator, DataTxValidator, DoubleSpendTxValidator, - InMemoryAttestationPool, MetadataTxValidator, type P2P, TxProofValidator, @@ -121,6 +121,14 @@ export class AztecNodeService implements AztecNode { this.log.info(message); } + addEpochProofQuote(quote: EpochProofQuote): Promise { + return Promise.resolve(this.p2pClient.broadcastEpochProofQuote(quote)); + } + + getEpochProofQuotes(epoch: bigint): Promise { + return this.p2pClient.getEpochProofQuotes(epoch); + } + /** * initializes the Aztec Node, wait for component to sync. * @param config - The configuration to be used by the aztec node. @@ -151,14 +159,7 @@ export class AztecNodeService implements AztecNode { const proofVerifier = config.realProofs ? await BBCircuitVerifier.new(config) : new TestCircuitVerifier(); // create the tx pool and the p2p client, which will need the l2 block source - const p2pClient = await createP2PClient( - config, - new InMemoryAttestationPool(), - archiver, - proofVerifier, - worldStateSynchronizer, - telemetry, - ); + const p2pClient = await createP2PClient(config, archiver, proofVerifier, worldStateSynchronizer, telemetry); // start both and wait for them to sync from the block source await Promise.all([p2pClient.start(), worldStateSynchronizer.start()]); @@ -229,8 +230,8 @@ export class AztecNodeService implements AztecNode { * Method to determine if the node is ready to accept transactions. * @returns - Flag indicating the readiness for tx submission. */ - public async isReady() { - return (await this.p2pClient.isReady()) ?? false; + public isReady() { + return Promise.resolve(this.p2pClient.isReady() ?? false); } /** diff --git a/yarn-project/aztec.js/src/index.ts b/yarn-project/aztec.js/src/index.ts index dba2233180c..b7505e7058a 100644 --- a/yarn-project/aztec.js/src/index.ts +++ b/yarn-project/aztec.js/src/index.ts @@ -99,9 +99,6 @@ export { Comparator, CompleteAddress, EncryptedL2BlockL2Logs, - EncryptedLogHeader, - EncryptedNoteLogIncomingBody, - EncryptedLogOutgoingBody, EventType, ExtendedNote, UniqueNote, @@ -133,9 +130,12 @@ export { createAztecNodeClient, merkleTreeIds, mockTx, - TaggedLog, + mockEpochProofQuote, + EncryptedLogPayload, L1NotePayload, L1EventPayload, + EpochProofQuote, + EpochProofQuotePayload, } from '@aztec/circuit-types'; export { NodeInfo } from '@aztec/types/interfaces'; diff --git a/yarn-project/aztec.js/src/rpc_clients/node/index.ts b/yarn-project/aztec.js/src/rpc_clients/node/index.ts index c7a23bc9ee9..9029ac67383 100644 --- a/yarn-project/aztec.js/src/rpc_clients/node/index.ts +++ b/yarn-project/aztec.js/src/rpc_clients/node/index.ts @@ -1,6 +1,6 @@ import { type PXE } from '@aztec/circuit-types'; import { type DebugLogger } from '@aztec/foundation/log'; -import { NoRetryError } from '@aztec/foundation/retry'; +import { NoRetryError, makeBackoff, retry } from '@aztec/foundation/retry'; import axios, { type AxiosError, type AxiosResponse } from 'axios'; @@ -12,10 +12,9 @@ import { createPXEClient } from '../pxe_client.js'; * @param rpcMethod - The RPC method to call. * @param body - The body of the request. * @param useApiEndpoints - Whether to use the API endpoints or inject the method in the body. - * @param _noRetry - Whether to retry on non-server errors. * @returns The response data. */ -async function axiosFetch(host: string, rpcMethod: string, body: any, useApiEndpoints: boolean, _noRetry = true) { +async function axiosFetch(host: string, rpcMethod: string, body: any, useApiEndpoints: boolean) { let resp: AxiosResponse; if (useApiEndpoints) { resp = await axios @@ -62,8 +61,18 @@ async function axiosFetch(host: string, rpcMethod: string, body: any, useApiEndp * @param _logger - Debug logger to warn version incompatibilities. * @returns A PXE client. */ -export function createCompatibleClient(rpcUrl: string, _logger: DebugLogger): Promise { +export function createCompatibleClient(rpcUrl: string, logger: DebugLogger): Promise { // Use axios due to timeout issues with fetch when proving TXs. - const pxe = createPXEClient(rpcUrl, axiosFetch); + const fetch = async (host: string, rpcMethod: string, body: any, useApiEndpoints: boolean) => { + return await retry( + () => axiosFetch(host, rpcMethod, body, useApiEndpoints), + `JsonRpcClient request ${rpcMethod} to ${host}`, + makeBackoff([1, 2, 3]), + logger, + false, + ); + }; + const pxe = createPXEClient(rpcUrl, fetch); + return Promise.resolve(pxe); } diff --git a/yarn-project/aztec.js/src/utils/cheat_codes.ts b/yarn-project/aztec.js/src/utils/cheat_codes.ts index f37e256ff7b..e955cf858c6 100644 --- a/yarn-project/aztec.js/src/utils/cheat_codes.ts +++ b/yarn-project/aztec.js/src/utils/cheat_codes.ts @@ -1,31 +1,46 @@ -import { type Note, type PXE } from '@aztec/circuit-types'; -import { type AztecAddress, type EthAddress, Fr } from '@aztec/circuits.js'; +import { type EpochProofClaim, type Note, type PXE } from '@aztec/circuit-types'; +import { AZTEC_EPOCH_DURATION, AZTEC_SLOT_DURATION, type AztecAddress, EthAddress, Fr } from '@aztec/circuits.js'; import { deriveStorageSlotInMap } from '@aztec/circuits.js/hash'; +import { type L1ContractAddresses } from '@aztec/ethereum'; import { toBigIntBE, toHex } from '@aztec/foundation/bigint-buffer'; import { keccak256 } from '@aztec/foundation/crypto'; import { createDebugLogger } from '@aztec/foundation/log'; +import { RollupAbi } from '@aztec/l1-artifacts'; import fs from 'fs'; +import { + type GetContractReturnType, + type Hex, + type PublicClient, + type WalletClient, + createWalletClient, + getContract, + http, + publicActions, +} from 'viem'; +import { foundry } from 'viem/chains'; /** * A class that provides utility functions for interacting with the chain. */ export class CheatCodes { constructor( - /** - * The cheat codes for ethereum (L1). - */ + /** Cheat codes for L1.*/ public eth: EthCheatCodes, - /** - * The cheat codes for aztec. - */ + /** Cheat codes for Aztec L2. */ public aztec: AztecCheatCodes, + /** Cheat codes for the Aztec Rollup contract on L1. */ + public rollup: RollupCheatCodes, ) {} - static create(rpcUrl: string, pxe: PXE): CheatCodes { + static async create(rpcUrl: string, pxe: PXE): Promise { const ethCheatCodes = new EthCheatCodes(rpcUrl); const aztecCheatCodes = new AztecCheatCodes(pxe, ethCheatCodes); - return new CheatCodes(ethCheatCodes, aztecCheatCodes); + const rollupCheatCodes = new RollupCheatCodes( + ethCheatCodes, + await pxe.getNodeInfo().then(n => n.l1ContractAddresses), + ); + return new CheatCodes(ethCheatCodes, aztecCheatCodes, rollupCheatCodes); } } @@ -227,7 +242,7 @@ export class EthCheatCodes { * Send transactions impersonating an externally owned account or contract. * @param who - The address to impersonate */ - public async startImpersonating(who: EthAddress): Promise { + public async startImpersonating(who: EthAddress | Hex): Promise { const res = await this.rpcCall('hardhat_impersonateAccount', [who.toString()]); if (res.error) { throw new Error(`Error impersonating ${who}: ${res.error.message}`); @@ -239,7 +254,7 @@ export class EthCheatCodes { * Stop impersonating an account that you are currently impersonating. * @param who - The address to stop impersonating */ - public async stopImpersonating(who: EthAddress): Promise { + public async stopImpersonating(who: EthAddress | Hex): Promise { const res = await this.rpcCall('hardhat_stopImpersonatingAccount', [who.toString()]); if (res.error) { throw new Error(`Error when stopping the impersonation of ${who}: ${res.error.message}`); @@ -271,6 +286,96 @@ export class EthCheatCodes { } } +/** Cheat codes for the L1 rollup contract. */ +export class RollupCheatCodes { + private client: WalletClient & PublicClient; + private rollup: GetContractReturnType; + + private logger = createDebugLogger('aztec:js:cheat_codes'); + + constructor(private ethCheatCodes: EthCheatCodes, private addresses: Pick) { + this.client = createWalletClient({ chain: foundry, transport: http(ethCheatCodes.rpcUrl) }).extend(publicActions); + this.rollup = getContract({ + abi: RollupAbi, + address: addresses.rollupAddress.toString(), + client: this.client, + }); + } + + /** Returns the current slot */ + public async getSlot() { + const ts = BigInt((await this.client.getBlock()).timestamp); + return await this.rollup.read.getSlotAt([ts]); + } + + /** Returns the current epoch */ + public async getEpoch() { + const slotNumber = await this.getSlot(); + return await this.rollup.read.getEpochAtSlot([slotNumber]); + } + + /** Warps time in L1 until the next epoch */ + public async advanceToNextEpoch() { + const slot = await this.getSlot(); + const slotsUntilNextEpoch = BigInt(AZTEC_EPOCH_DURATION) - (slot % BigInt(AZTEC_EPOCH_DURATION)) + 1n; + const timeToNextEpoch = slotsUntilNextEpoch * BigInt(AZTEC_SLOT_DURATION); + const l1Timestamp = BigInt((await this.client.getBlock()).timestamp); + await this.ethCheatCodes.warp(Number(l1Timestamp + timeToNextEpoch)); + this.logger.verbose(`Advanced to next epoch`); + } + + /** Returns the current proof claim (if any) */ + public async getProofClaim(): Promise { + // REFACTOR: This code is duplicated from l1-publisher + const [epochToProve, basisPointFee, bondAmount, bondProviderHex, proposerClaimantHex] = + await this.rollup.read.proofClaim(); + + const bondProvider = EthAddress.fromString(bondProviderHex); + const proposerClaimant = EthAddress.fromString(proposerClaimantHex); + + if (bondProvider.isZero() && proposerClaimant.isZero() && epochToProve === 0n) { + return undefined; + } + + return { + epochToProve, + basisPointFee, + bondAmount, + bondProvider, + proposerClaimant, + }; + } + + /** + * Marks the specified block (or latest if none) as proven + * @param maybeBlockNumber - The block number to mark as proven (defaults to latest pending) + */ + public async markAsProven(maybeBlockNumber?: number | bigint) { + const blockNumber = maybeBlockNumber + ? BigInt(maybeBlockNumber) + : await this.rollup.read.tips().then(([pending]) => pending); + + await this.asOwner(async account => { + // TODO: Figure out proper typing for viem + await this.rollup.write.setAssumeProvenThroughBlockNumber([blockNumber], { account } as any); + this.logger.verbose(`Marked ${blockNumber} as proven`); + }); + } + + /** + * Executes an action impersonated as the owner of the Rollup contract. + * @param action - The action to execute + */ + public async asOwner( + action: (owner: Hex, rollup: GetContractReturnType) => Promise, + ) { + const owner = await this.rollup.read.owner(); + await this.ethCheatCodes.startImpersonating(owner); + await action(owner, this.rollup); + await this.ethCheatCodes.stopImpersonating(owner); + } +} + /** * A class that provides utility functions for interacting with the aztec chain. */ diff --git a/yarn-project/aztec/docker-compose.yml b/yarn-project/aztec/docker-compose.yml index c6074ecff61..2d554c946c9 100644 --- a/yarn-project/aztec/docker-compose.yml +++ b/yarn-project/aztec/docker-compose.yml @@ -1,7 +1,7 @@ version: '3' services: ethereum: - image: aztecprotocol/foundry-nightly-de33b6af53005037b463318d2628b5cfcaf3991:latest + image: aztecprotocol/foundry-nightly-25f24e677a6a32a62512ad4f561995589ac2c7dc:latest entrypoint: > sh -c ' if [ -n "$FORK_BLOCK_NUMBER" ] && [ -n "$FORK_URL" ]; then diff --git a/yarn-project/aztec/src/cli/cmds/start_prover_node.ts b/yarn-project/aztec/src/cli/cmds/start_prover_node.ts index e1e95a9a1f8..8f89b64fda3 100644 --- a/yarn-project/aztec/src/cli/cmds/start_prover_node.ts +++ b/yarn-project/aztec/src/cli/cmds/start_prover_node.ts @@ -63,7 +63,7 @@ export const startProverNode = async ( // Load l1 contract addresses from aztec node if not set. const isRollupAddressSet = proverConfig.l1Contracts?.rollupAddress && !proverConfig.l1Contracts.rollupAddress.isZero(); - const nodeUrl = proverConfig.nodeUrl ?? proverConfig.txProviderNodeUrl; + const nodeUrl = proverConfig.nodeUrl ?? proverConfig.proverCoordinationNodeUrl; if (nodeUrl && !isRollupAddressSet) { userLog(`Loading L1 contract addresses from aztec node at ${nodeUrl}`); proverConfig.l1Contracts = await createAztecNodeClient(nodeUrl).getL1ContractAddresses(); @@ -84,7 +84,7 @@ export const startProverNode = async ( signalHandlers.push(proverNode.stop); // Automatically start proving unproven blocks - proverNode.start(); + await proverNode.start(); return services; }; diff --git a/yarn-project/aztec/src/sandbox.ts b/yarn-project/aztec/src/sandbox.ts index 30c38f5b3a7..9e508647a4b 100644 --- a/yarn-project/aztec/src/sandbox.ts +++ b/yarn-project/aztec/src/sandbox.ts @@ -20,12 +20,12 @@ import { InboxBytecode, OutboxAbi, OutboxBytecode, - PortalERC20Abi, - PortalERC20Bytecode, RegistryAbi, RegistryBytecode, RollupAbi, RollupBytecode, + TestERC20Abi, + TestERC20Bytecode, } from '@aztec/l1-artifacts'; import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types'; import { FeeJuiceAddress } from '@aztec/protocol-contracts/fee-juice'; @@ -108,8 +108,8 @@ export async function deployContractsToL1( contractBytecode: RollupBytecode, }, feeJuice: { - contractAbi: PortalERC20Abi, - contractBytecode: PortalERC20Bytecode, + contractAbi: TestERC20Abi, + contractBytecode: TestERC20Bytecode, }, feeJuicePortal: { contractAbi: FeeJuicePortalAbi, @@ -162,7 +162,9 @@ export async function createSandbox(config: Partial = {}) { let watcher: AnvilTestWatcher | undefined = undefined; if (!aztecNodeConfig.p2pEnabled) { - const l1ContractAddresses = await deployContractsToL1(aztecNodeConfig, hdAccount); + const l1ContractAddresses = await deployContractsToL1(aztecNodeConfig, hdAccount, undefined, { + assumeProvenThroughBlockNumber: Number.MAX_SAFE_INTEGER, + }); const chain = aztecNodeConfig.l1RpcUrl ? createEthereumChain(aztecNodeConfig.l1RpcUrl, aztecNodeConfig.l1ChainId) diff --git a/yarn-project/bb-prover/src/honk.ts b/yarn-project/bb-prover/src/honk.ts index 93c72cae6e8..eb9e13236f2 100644 --- a/yarn-project/bb-prover/src/honk.ts +++ b/yarn-project/bb-prover/src/honk.ts @@ -2,20 +2,17 @@ import { type ProtocolArtifact } from '@aztec/noir-protocol-circuits-types'; export type UltraHonkFlavor = 'ultra_honk' | 'ultra_keccak_honk'; -const UltraKeccakHonkCircuits = [ - 'BlockRootRollupFinalArtifact', - 'RootRollupArtifact', -] as const satisfies ProtocolArtifact[]; -type UltraKeccakHonkCircuits = (typeof UltraKeccakHonkCircuits)[number]; -type UltraHonkCircuits = Exclude; +const UltraKeccakHonkCircuits = ['RootRollupArtifact'] as const satisfies ProtocolArtifact[]; +export type UltraKeccakHonkProtocolArtifact = (typeof UltraKeccakHonkCircuits)[number]; +export type UltraHonkProtocolArtifact = Exclude; -export function getUltraHonkFlavorForCircuit(artifact: UltraKeccakHonkCircuits): 'ultra_keccak_honk'; -export function getUltraHonkFlavorForCircuit(artifact: UltraHonkCircuits): 'ultra_honk'; +export function getUltraHonkFlavorForCircuit(artifact: UltraKeccakHonkProtocolArtifact): 'ultra_keccak_honk'; +export function getUltraHonkFlavorForCircuit(artifact: UltraHonkProtocolArtifact): 'ultra_honk'; export function getUltraHonkFlavorForCircuit(artifact: ProtocolArtifact): UltraHonkFlavor; export function getUltraHonkFlavorForCircuit(artifact: ProtocolArtifact): UltraHonkFlavor { return isUltraKeccakHonkCircuit(artifact) ? 'ultra_keccak_honk' : 'ultra_honk'; } -function isUltraKeccakHonkCircuit(artifact: ProtocolArtifact): artifact is UltraKeccakHonkCircuits { - return UltraKeccakHonkCircuits.includes(artifact as UltraKeccakHonkCircuits); +function isUltraKeccakHonkCircuit(artifact: ProtocolArtifact): artifact is UltraKeccakHonkProtocolArtifact { + return UltraKeccakHonkCircuits.includes(artifact as UltraKeccakHonkProtocolArtifact); } diff --git a/yarn-project/bb-prover/src/index.ts b/yarn-project/bb-prover/src/index.ts index e8914146199..0ea93e76263 100644 --- a/yarn-project/bb-prover/src/index.ts +++ b/yarn-project/bb-prover/src/index.ts @@ -3,5 +3,6 @@ export * from './test/index.js'; export * from './verifier/index.js'; export * from './config.js'; export * from './bb/execute.js'; +export * from './honk.js'; export { type ClientProtocolCircuitVerifier } from '@aztec/circuit-types'; diff --git a/yarn-project/bb-prover/src/prover/bb_private_kernel_prover.ts b/yarn-project/bb-prover/src/prover/bb_private_kernel_prover.ts index 52b26ba4535..ee9e8f03e4c 100644 --- a/yarn-project/bb-prover/src/prover/bb_private_kernel_prover.ts +++ b/yarn-project/bb-prover/src/prover/bb_private_kernel_prover.ts @@ -8,11 +8,10 @@ import { AGGREGATION_OBJECT_LENGTH, ClientIvcProof, Fr, - type PrivateCircuitPublicInputs, type PrivateKernelCircuitPublicInputs, type PrivateKernelInitCircuitPrivateInputs, type PrivateKernelInnerCircuitPrivateInputs, - type PrivateKernelResetCircuitPrivateInputsVariants, + type PrivateKernelResetCircuitPrivateInputs, type PrivateKernelTailCircuitPrivateInputs, type PrivateKernelTailCircuitPublicInputs, Proof, @@ -20,14 +19,13 @@ import { type VerificationKeyAsFields, type VerificationKeyData, } from '@aztec/circuits.js'; -import { siloNoteHash } from '@aztec/circuits.js/hash'; import { runInDirectory } from '@aztec/foundation/fs'; import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log'; import { Timer } from '@aztec/foundation/timer'; import { ClientCircuitArtifacts, + ClientCircuitVks, type ClientProtocolArtifact, - PrivateResetTagToArtifactName, ProtocolCircuitVks, convertPrivateKernelInitInputsToWitnessMap, convertPrivateKernelInitOutputsFromWitnessMap, @@ -39,6 +37,7 @@ import { convertPrivateKernelTailInputsToWitnessMap, convertPrivateKernelTailOutputsFromWitnessMap, convertPrivateKernelTailToPublicInputsToWitnessMap, + getPrivateKernelResetArtifactName, } from '@aztec/noir-protocol-circuits-types'; import { WASMSimulator } from '@aztec/simulator'; import { type NoirCompiledCircuit } from '@aztec/types/noir'; @@ -130,12 +129,6 @@ export class BBNativePrivateKernelProver implements PrivateKernelProver { return await this.runInDirectory(operation); } - public getSiloedCommitments(publicInputs: PrivateCircuitPublicInputs) { - const contractAddress = publicInputs.callContext.storageContractAddress; - - return Promise.resolve(publicInputs.noteHashes.map(commitment => siloNoteHash(contractAddress, commitment.value))); - } - public async simulateProofInit( inputs: PrivateKernelInitCircuitPrivateInputs, ): Promise> { @@ -159,13 +152,15 @@ export class BBNativePrivateKernelProver implements PrivateKernelProver { } public async simulateProofReset( - inputs: PrivateKernelResetCircuitPrivateInputsVariants, + inputs: PrivateKernelResetCircuitPrivateInputs, ): Promise> { + const variantInputs = inputs.trimToSizes(); + const artifactName = getPrivateKernelResetArtifactName(inputs.dimensions); return await this.simulate( - inputs, - PrivateResetTagToArtifactName[inputs.sizeTag], - convertPrivateKernelResetInputsToWitnessMap, - output => convertPrivateKernelResetOutputsFromWitnessMap(output, inputs.sizeTag), + variantInputs, + artifactName, + variantInputs => convertPrivateKernelResetInputsToWitnessMap(variantInputs, artifactName), + output => convertPrivateKernelResetOutputsFromWitnessMap(output, artifactName), ); } @@ -283,14 +278,14 @@ export class BBNativePrivateKernelProver implements PrivateKernelProver { outputSize: output.toBuffer().length, } satisfies CircuitWitnessGenerationStats); - // TODO(#7410) we dont need to generate vk's for these circuits, they are in the vk tree - const { verificationKey } = await this.runInDirectory(dir => - this.computeVerificationKey(dir, Buffer.from(compiledCircuit.bytecode, 'base64'), circuitType), - ); + const verificationKey = ClientCircuitVks[circuitType].keyAsFields; + const bytecode = Buffer.from(compiledCircuit.bytecode, 'base64'); + const kernelOutput: PrivateKernelSimulateOutput = { publicInputs: output, verificationKey, outputWitness, + bytecode, }; return kernelOutput; } diff --git a/yarn-project/bb-prover/src/prover/bb_prover.ts b/yarn-project/bb-prover/src/prover/bb_prover.ts index 5aff5612630..b99dff1748d 100644 --- a/yarn-project/bb-prover/src/prover/bb_prover.ts +++ b/yarn-project/bb-prover/src/prover/bb_prover.ts @@ -16,6 +16,7 @@ import { type BlockMergeRollupInputs, type BlockRootOrBlockMergePublicInputs, type BlockRootRollupInputs, + type EmptyBlockRootRollupInputs, EmptyNestedCircuitInputs, EmptyNestedData, Fr, @@ -57,6 +58,8 @@ import { convertBlockMergeRollupOutputsFromWitnessMap, convertBlockRootRollupInputsToWitnessMap, convertBlockRootRollupOutputsFromWitnessMap, + convertEmptyBlockRootRollupInputsToWitnessMap, + convertEmptyBlockRootRollupOutputsFromWitnessMap, convertMergeRollupInputsToWitnessMap, convertMergeRollupOutputsFromWitnessMap, convertPrivateKernelEmptyInputsToWitnessMap, @@ -381,29 +384,26 @@ export class BBNativeRollupProver implements ServerCircuitProver { } /** - * Simulates the block root rollup circuit from its inputs. - * Returns a non-recursive proof to verify on L1. - * @dev TODO(palla/prover): This is a temporary workaround to get the proof to L1 with the old block flow. + * Simulates the empty block root rollup circuit from its inputs. * @param input - Inputs to the circuit. * @returns The public inputs as outputs of the simulation. */ - public async getBlockRootRollupFinalProof( - input: BlockRootRollupInputs, + public async getEmptyBlockRootRollupProof( + input: EmptyBlockRootRollupInputs, ): Promise> { - const { circuitOutput, proof } = await this.createProof( + const { circuitOutput, proof } = await this.createRecursiveProof( input, - 'BlockRootRollupFinalArtifact', - convertBlockRootRollupInputsToWitnessMap, - convertBlockRootRollupOutputsFromWitnessMap, + 'EmptyBlockRootRollupArtifact', + RECURSIVE_PROOF_LENGTH, + convertEmptyBlockRootRollupInputsToWitnessMap, + convertEmptyBlockRootRollupOutputsFromWitnessMap, ); - const recursiveProof = makeRecursiveProofFromBinary(proof, NESTED_RECURSIVE_PROOF_LENGTH); - - const verificationKey = await this.getVerificationKeyDataForCircuit('BlockRootRollupFinalArtifact'); + const verificationKey = await this.getVerificationKeyDataForCircuit('EmptyBlockRootRollupArtifact'); - await this.verifyProof('BlockRootRollupFinalArtifact', proof); + await this.verifyProof('EmptyBlockRootRollupArtifact', proof.binaryProof); - return makePublicInputsAndRecursiveProof(circuitOutput, recursiveProof, verificationKey); + return makePublicInputsAndRecursiveProof(circuitOutput, proof, verificationKey); } /** diff --git a/yarn-project/bb-prover/src/stats.ts b/yarn-project/bb-prover/src/stats.ts index 92bd1b38e65..c5dc96bd38c 100644 --- a/yarn-project/bb-prover/src/stats.ts +++ b/yarn-project/bb-prover/src/stats.ts @@ -15,6 +15,8 @@ export function mapProtocolArtifactNameToCircuitName( return 'merge-rollup'; case 'BlockRootRollupArtifact': return 'block-root-rollup'; + case 'EmptyBlockRootRollupArtifact': + return 'empty-block-root-rollup'; case 'BlockMergeRollupArtifact': return 'block-merge-rollup'; case 'RootRollupArtifact': @@ -33,26 +35,14 @@ export function mapProtocolArtifactNameToCircuitName( return 'private-kernel-tail'; case 'PrivateKernelTailToPublicArtifact': return 'private-kernel-tail-to-public'; - case 'PrivateKernelResetFullArtifact': - return 'private-kernel-reset-full'; - case 'PrivateKernelResetFullInnerArtifact': - return 'private-kernel-reset-full-inner'; - case 'PrivateKernelResetBigArtifact': - return 'private-kernel-reset-big'; - case 'PrivateKernelResetMediumArtifact': - return 'private-kernel-reset-medium'; - case 'PrivateKernelResetSmallArtifact': - return 'private-kernel-reset-small'; - case 'PrivateKernelResetTinyArtifact': - return 'private-kernel-reset-tiny'; case 'EmptyNestedArtifact': return 'empty-nested'; case 'PrivateKernelEmptyArtifact': return 'private-kernel-empty'; - case 'BlockRootRollupFinalArtifact': - return 'block-root-rollup-final'; default: { - const _foo: never = artifact; + if (artifact.startsWith('PrivateKernelReset')) { + return 'private-kernel-reset'; + } throw new Error(`Unknown circuit type: ${artifact}`); } } diff --git a/yarn-project/bb-prover/src/test/test_circuit_prover.ts b/yarn-project/bb-prover/src/test/test_circuit_prover.ts index 6ccfb948d92..7dcb8825088 100644 --- a/yarn-project/bb-prover/src/test/test_circuit_prover.ts +++ b/yarn-project/bb-prover/src/test/test_circuit_prover.ts @@ -13,6 +13,7 @@ import { type BlockMergeRollupInputs, type BlockRootOrBlockMergePublicInputs, type BlockRootRollupInputs, + type EmptyBlockRootRollupInputs, EmptyNestedData, type KernelCircuitPublicInputs, type MergeRollupInputs, @@ -52,6 +53,8 @@ import { convertBlockMergeRollupOutputsFromWitnessMap, convertBlockRootRollupInputsToWitnessMap, convertBlockRootRollupOutputsFromWitnessMap, + convertEmptyBlockRootRollupInputsToWitnessMap, + convertEmptyBlockRootRollupOutputsFromWitnessMap, convertMergeRollupInputsToWitnessMap, convertMergeRollupOutputsFromWitnessMap, convertPrivateKernelEmptyInputsToWitnessMap, @@ -347,10 +350,39 @@ export class TestCircuitProver implements ServerCircuitProver { ); } - public getBlockRootRollupFinalProof( - input: BlockRootRollupInputs, + /** + * Simulates the empty block root rollup circuit from its inputs. + * @param input - Inputs to the circuit. + * @returns The public inputs as outputs of the simulation. + */ + @trackSpan('TestCircuitProver.getEmptyBlockRootRollupProof') + public async getEmptyBlockRootRollupProof( + input: EmptyBlockRootRollupInputs, ): Promise> { - return this.getBlockRootRollupProof(input); + const timer = new Timer(); + const witnessMap = convertEmptyBlockRootRollupInputsToWitnessMap(input); + + // use WASM here as it is faster for small circuits + const witness = await this.wasmSimulator.simulateCircuit( + witnessMap, + SimulatedServerCircuitArtifacts.EmptyBlockRootRollupArtifact, + ); + + const result = convertEmptyBlockRootRollupOutputsFromWitnessMap(witness); + + this.instrumentation.recordDuration('simulationDuration', 'empty-block-root-rollup', timer); + emitCircuitSimulationStats( + 'empty-block-root-rollup', + timer.ms(), + input.toBuffer().length, + result.toBuffer().length, + this.logger, + ); + return makePublicInputsAndRecursiveProof( + result, + makeEmptyRecursiveProof(NESTED_RECURSIVE_PROOF_LENGTH), + ProtocolCircuitVks['EmptyBlockRootRollupArtifact'], + ); } /** diff --git a/yarn-project/bb-prover/src/verifier/bb_verifier.ts b/yarn-project/bb-prover/src/verifier/bb_verifier.ts index 55b16f1b846..394b582c17f 100644 --- a/yarn-project/bb-prover/src/verifier/bb_verifier.ts +++ b/yarn-project/bb-prover/src/verifier/bb_verifier.ts @@ -22,7 +22,7 @@ import { verifyProof, } from '../bb/execute.js'; import { type BBConfig } from '../config.js'; -import { getUltraHonkFlavorForCircuit } from '../honk.js'; +import { type UltraKeccakHonkProtocolArtifact, getUltraHonkFlavorForCircuit } from '../honk.js'; import { mapProtocolArtifactNameToCircuitName } from '../stats.js'; import { extractVkData } from '../verification_key/verification_key_data.js'; @@ -127,7 +127,7 @@ export class BBCircuitVerifier implements ClientProtocolCircuitVerifier { await runInDirectory(this.config.bbWorkingDirectory, operation, this.config.bbSkipCleanup); } - public async generateSolidityContract(circuit: ProtocolArtifact, contractName: string) { + public async generateSolidityContract(circuit: UltraKeccakHonkProtocolArtifact, contractName: string) { const result = await generateContractForCircuit( this.config.bbBinaryPath, this.config.bbWorkingDirectory, diff --git a/yarn-project/circuit-types/src/aztec_node/rpc/aztec_node_client.ts b/yarn-project/circuit-types/src/aztec_node/rpc/aztec_node_client.ts index 73c2da7cab0..e38f04f9f9e 100644 --- a/yarn-project/circuit-types/src/aztec_node/rpc/aztec_node_client.ts +++ b/yarn-project/circuit-types/src/aztec_node/rpc/aztec_node_client.ts @@ -31,19 +31,19 @@ export function createAztecNodeClient(url: string, fetch = defaultFetch): AztecN url, { AztecAddress, + Buffer32, EthAddress, + EventSelector, ExtendedUnencryptedL2Log, Fr, - EventSelector, FunctionSelector, Header, L2Block, - TxEffect, LogId, - TxHash, - Buffer32, PublicDataWitness, SiblingPath, + TxEffect, + TxHash, }, { EncryptedNoteL2BlockL2Logs, diff --git a/yarn-project/circuit-types/src/index.ts b/yarn-project/circuit-types/src/index.ts index 187539e9736..12c74f0c8f8 100644 --- a/yarn-project/circuit-types/src/index.ts +++ b/yarn-project/circuit-types/src/index.ts @@ -3,6 +3,7 @@ export * from './auth_witness.js'; export * from './aztec_node/rpc/index.js'; export * from './body.js'; export * from './function_call.js'; +export * from './global_variable_builder.js'; export * from './interfaces/index.js'; export * from './l2_block.js'; export * from './l2_block_downloader/index.js'; @@ -12,7 +13,9 @@ export * from './merkle_tree_id.js'; export * from './messaging/index.js'; export * from './mocks.js'; export * from './notes/index.js'; +export * from './p2p/index.js'; export * from './packed_values.js'; +export * from './prover_coordination/index.js'; export * from './public_data_witness.js'; export * from './public_data_write.js'; export * from './public_execution_request.js'; @@ -21,5 +24,3 @@ export * from './simulation_error.js'; export * from './tx/index.js'; export * from './tx_effect.js'; export * from './tx_execution_request.js'; -export * from './p2p/index.js'; -export * from './global_variable_builder.js'; diff --git a/yarn-project/circuit-types/src/interfaces/aztec-node.ts b/yarn-project/circuit-types/src/interfaces/aztec-node.ts index 16c64a1ac42..822c2dad05d 100644 --- a/yarn-project/circuit-types/src/interfaces/aztec-node.ts +++ b/yarn-project/circuit-types/src/interfaces/aztec-node.ts @@ -1,44 +1,40 @@ -import { - type ARCHIVE_HEIGHT, - type Header, - type L1_TO_L2_MSG_TREE_HEIGHT, - type NOTE_HASH_TREE_HEIGHT, - type NULLIFIER_TREE_HEIGHT, - type PUBLIC_DATA_TREE_HEIGHT, +import type { + ARCHIVE_HEIGHT, + Header, + L1_TO_L2_MSG_TREE_HEIGHT, + NOTE_HASH_TREE_HEIGHT, + NULLIFIER_TREE_HEIGHT, + PUBLIC_DATA_TREE_HEIGHT, } from '@aztec/circuits.js'; -import { type L1ContractAddresses } from '@aztec/ethereum'; -import { type ContractArtifact } from '@aztec/foundation/abi'; -import { type AztecAddress } from '@aztec/foundation/aztec-address'; -import { type Fr } from '@aztec/foundation/fields'; -import { - type ContractClassPublic, - type ContractInstanceWithAddress, - type ProtocolContractAddresses, +import type { L1ContractAddresses } from '@aztec/ethereum'; +import type { ContractArtifact } from '@aztec/foundation/abi'; +import type { AztecAddress } from '@aztec/foundation/aztec-address'; +import type { Fr } from '@aztec/foundation/fields'; +import type { + ContractClassPublic, + ContractInstanceWithAddress, + ProtocolContractAddresses, } from '@aztec/types/contracts'; -import { type L2Block } from '../l2_block.js'; -import { - type FromLogType, - type GetUnencryptedLogsResponse, - type L2BlockL2Logs, - type LogFilter, - type LogType, -} from '../logs/index.js'; -import { type MerkleTreeId } from '../merkle_tree_id.js'; -import { type PublicDataWitness } from '../public_data_witness.js'; -import { type SiblingPath } from '../sibling_path/index.js'; -import { type PublicSimulationOutput, type Tx, type TxHash, type TxReceipt } from '../tx/index.js'; -import { type TxEffect } from '../tx_effect.js'; -import { type SequencerConfig } from './configs.js'; -import { type L2BlockNumber } from './l2_block_number.js'; -import { type NullifierMembershipWitness } from './nullifier_tree.js'; -import { type ProverConfig } from './prover-client.js'; +import type { L2Block } from '../l2_block.js'; +import type { FromLogType, GetUnencryptedLogsResponse, L2BlockL2Logs, LogFilter, LogType } from '../logs/index.js'; +import type { MerkleTreeId } from '../merkle_tree_id.js'; +import type { EpochProofQuote } from '../prover_coordination/epoch_proof_quote.js'; +import type { PublicDataWitness } from '../public_data_witness.js'; +import type { SiblingPath } from '../sibling_path/index.js'; +import type { PublicSimulationOutput, Tx, TxHash, TxReceipt } from '../tx/index.js'; +import type { TxEffect } from '../tx_effect.js'; +import type { SequencerConfig } from './configs.js'; +import type { L2BlockNumber } from './l2_block_number.js'; +import type { NullifierMembershipWitness } from './nullifier_tree.js'; +import type { ProverConfig } from './prover-client.js'; +import { type ProverCoordination } from './prover-coordination.js'; /** * The aztec node. * We will probably implement the additional interfaces by means other than Aztec Node as it's currently a privacy leak */ -export interface AztecNode { +export interface AztecNode extends ProverCoordination { /** * Find the index of the given leaf in the given tree. * @param blockNumber - The block number at which to get the data or 'latest' for latest data @@ -356,4 +352,16 @@ export interface AztecNode { * Returns the ENR of this node for peer discovery, if available. */ getEncodedEnr(): Promise; + + /** + * Receives a quote for an epoch proof and stores it in its EpochProofQuotePool + * @param quote - The quote to store + */ + addEpochProofQuote(quote: EpochProofQuote): Promise; + + /** + * Returns the received quotes for a given epoch + * @param epoch - The epoch for which to get the quotes + */ + getEpochProofQuotes(epoch: bigint): Promise; } diff --git a/yarn-project/circuit-types/src/interfaces/block-builder.ts b/yarn-project/circuit-types/src/interfaces/block-builder.ts new file mode 100644 index 00000000000..3be4a1f07e5 --- /dev/null +++ b/yarn-project/circuit-types/src/interfaces/block-builder.ts @@ -0,0 +1,28 @@ +import { type Fr, type GlobalVariables } from '@aztec/circuits.js'; + +import { type L2Block } from '../l2_block.js'; +import { type ProcessedTx } from '../tx/processed_tx.js'; +import { type ProcessedTxHandler } from './processed-tx-handler.js'; + +/** The interface to a block builder. Generates an L2 block out of a set of processed txs. */ +export interface BlockBuilder extends ProcessedTxHandler { + /** + * Prepares to build a new block. Updates the L1 to L2 message tree. + * @param numTxs - The complete size of the block. + * @param globalVariables - The global variables for this block. + * @param l1ToL2Messages - The set of L1 to L2 messages to be included in this block. + */ + startNewBlock(numTxs: number, globalVariables: GlobalVariables, l1ToL2Messages: Fr[]): Promise; + + /** + * Adds a processed tx to the block. Updates world state with the effects from this tx. + * @param tx - The transaction to be added. + */ + addNewTx(tx: ProcessedTx): Promise; + + /** + * Pads the block with empty txs if it hasn't reached the declared number of txs. + * Assembles the block and updates the archive tree. + */ + setBlockCompleted(): Promise; +} diff --git a/yarn-project/circuit-types/src/interfaces/block-prover.ts b/yarn-project/circuit-types/src/interfaces/block-prover.ts deleted file mode 100644 index 8ef43b17733..00000000000 --- a/yarn-project/circuit-types/src/interfaces/block-prover.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { type Fr, type GlobalVariables, type Proof } from '@aztec/circuits.js'; - -import { type L2Block } from '../l2_block.js'; -import { type ProcessedTx } from '../tx/processed_tx.js'; - -export enum PROVING_STATUS { - SUCCESS, - FAILURE, -} - -export type ProvingSuccess = { - status: PROVING_STATUS.SUCCESS; -}; - -export type ProvingFailure = { - status: PROVING_STATUS.FAILURE; - reason: string; -}; - -export type ProvingResult = ProvingSuccess | ProvingFailure; - -export type ProvingTicket = { - provingPromise: Promise; -}; - -export type SimulationBlockResult = { - block: L2Block; -}; - -export type ProvingBlockResult = SimulationBlockResult & { - proof: Proof; - aggregationObject: Fr[]; -}; - -/** Receives processed txs as part of block simulation or proving. */ -export interface ProcessedTxHandler { - /** - * Add a processed transaction to the current block. - * @param tx - The transaction to be added. - */ - addNewTx(tx: ProcessedTx): Promise; -} - -/** The interface to a block simulator. Generates an L2 block out of a set of processed txs by calling into the Aztec circuits. */ -export interface BlockSimulator extends ProcessedTxHandler { - /** - * Prepares to build a new block. - * @param numTxs - The complete size of the block, must be a power of 2 - * @param globalVariables - The global variables for this block - * @param l1ToL2Messages - The set of L1 to L2 messages to be included in this block - */ - startNewBlock(numTxs: number, globalVariables: GlobalVariables, l1ToL2Messages: Fr[]): Promise; - - /** Cancels the block currently being processed. Processes already in progress built may continue but further proofs should not be started. */ - cancel(): void; - - /** Performs the final archive tree insertion for this block and returns the L2Block. */ - finaliseBlock(): Promise; - - /** - * Mark the block as having all the transactions it is going to contain. - * Will pad the block to its complete size with empty transactions and prove all the way to the root rollup. - */ - setBlockCompleted(): Promise; -} - -/** The interface to a block prover. Generates a root rollup proof out of a set of processed txs by recursively proving Aztec circuits. */ -export interface BlockProver extends BlockSimulator { - /** Returns an identifier for the prover or zero if not set. */ - getProverId(): Fr; - - /** Performs the final archive tree insertion for this block and returns the L2Block. */ - finaliseBlock(): Promise; -} - -export interface EpochProver extends BlockProver { - startNewEpoch(epochNumber: number, totalNumBlocks: number): ProvingTicket; -} diff --git a/yarn-project/circuit-types/src/interfaces/epoch-prover.ts b/yarn-project/circuit-types/src/interfaces/epoch-prover.ts new file mode 100644 index 00000000000..36f5e911b2d --- /dev/null +++ b/yarn-project/circuit-types/src/interfaces/epoch-prover.ts @@ -0,0 +1,41 @@ +import { type Fr, type Proof, type RootRollupPublicInputs } from '@aztec/circuits.js'; + +import { type L2Block } from '../l2_block.js'; +import { type BlockBuilder } from './block-builder.js'; + +/** + * Coordinates the proving of an entire epoch. + * + * Expected usage: + * ``` + * startNewEpoch + * foreach block { + * addNewBlock + * foreach tx { + * addTx + * } + * setBlockCompleted + * } + * finaliseEpoch + * ``` + */ +export interface EpochProver extends BlockBuilder { + /** + * Starts a new epoch. Must be the first method to be called. + * @param epochNumber - The epoch number. + * @param totalNumBlocks - The total number of blocks expected in the epoch (must be at least one). + **/ + startNewEpoch(epochNumber: number, totalNumBlocks: number): void; + + /** Pads the epoch with empty block roots if needed and blocks until proven. Throws if proving has failed. */ + finaliseEpoch(): Promise<{ publicInputs: RootRollupPublicInputs; proof: Proof }>; + + /** Cancels all proving jobs. */ + cancel(): void; + + /** Returns an identifier for the prover or zero if not set. */ + getProverId(): Fr; + + /** Returns the block assembled at a given index (zero-based) within the epoch. */ + getBlock(index: number): L2Block; +} diff --git a/yarn-project/circuit-types/src/interfaces/index.ts b/yarn-project/circuit-types/src/interfaces/index.ts index 1ef99ee52db..89287fa7289 100644 --- a/yarn-project/circuit-types/src/interfaces/index.ts +++ b/yarn-project/circuit-types/src/interfaces/index.ts @@ -1,14 +1,16 @@ export * from './aztec-node.js'; -export * from './l2_block_number.js'; -export * from './pxe.js'; -export * from './sync-status.js'; +export * from './block-builder.js'; export * from './configs.js'; +export * from './epoch-prover.js'; +export * from './l2_block_number.js'; +export * from './merkle_tree_operations.js'; export * from './nullifier_tree.js'; +export * from './private_kernel_prover.js'; +export * from './processed-tx-handler.js'; export * from './prover-client.js'; +export * from './prover-coordination.js'; export * from './proving-job.js'; -export * from './block-prover.js'; +export * from './pxe.js'; export * from './server_circuit_prover.js'; -export * from './private_kernel_prover.js'; -export * from './tx-provider.js'; -export * from './merkle_tree_operations.js'; +export * from './sync-status.js'; export * from './world_state.js'; diff --git a/yarn-project/circuit-types/src/interfaces/private_kernel_prover.ts b/yarn-project/circuit-types/src/interfaces/private_kernel_prover.ts index 282984690d7..d1fb7cd6b21 100644 --- a/yarn-project/circuit-types/src/interfaces/private_kernel_prover.ts +++ b/yarn-project/circuit-types/src/interfaces/private_kernel_prover.ts @@ -1,15 +1,13 @@ import { type ClientIvcProof, - type PrivateCircuitPublicInputs, type PrivateKernelCircuitPublicInputs, type PrivateKernelInitCircuitPrivateInputs, type PrivateKernelInnerCircuitPrivateInputs, - type PrivateKernelResetCircuitPrivateInputsVariants, + type PrivateKernelResetCircuitPrivateInputs, type PrivateKernelTailCircuitPrivateInputs, type PrivateKernelTailCircuitPublicInputs, type VerificationKeyAsFields, } from '@aztec/circuits.js'; -import { type Fr } from '@aztec/foundation/fields'; import { type WitnessMap } from '@noir-lang/acvm_js'; @@ -28,6 +26,8 @@ export type PrivateKernelSimulateOutput = { verificationKey: VerificationKeyAsFields; outputWitness: WitnessMap; + + bytecode: Buffer; }; /** @@ -42,14 +42,6 @@ export type AppCircuitSimulateOutput = { * siloed commitments necessary for maintaining transaction privacy and security on the network. */ export interface PrivateKernelProver { - /** - * Computes the siloed commitments for a given set of public inputs. - * - * @param publicInputs - The public inputs containing the contract address and new note hashes to be used in generating siloed note hashes. - * @returns An array of Fr (finite field) elements representing the siloed commitments. - */ - getSiloedCommitments(publicInputs: PrivateCircuitPublicInputs): Promise; - /** * Creates a proof output for a given signed transaction request and private call data for the first iteration. * @@ -77,7 +69,7 @@ export interface PrivateKernelProver { * @returns A Promise resolving to a ProofOutput object containing public inputs and the kernel proof. */ simulateProofReset( - privateKernelInputsReset: PrivateKernelResetCircuitPrivateInputsVariants, + privateKernelInputsReset: PrivateKernelResetCircuitPrivateInputs, ): Promise>; /** diff --git a/yarn-project/circuit-types/src/interfaces/processed-tx-handler.ts b/yarn-project/circuit-types/src/interfaces/processed-tx-handler.ts new file mode 100644 index 00000000000..2793b35bbef --- /dev/null +++ b/yarn-project/circuit-types/src/interfaces/processed-tx-handler.ts @@ -0,0 +1,10 @@ +import { type ProcessedTx } from '../tx/processed_tx.js'; + +/** Receives processed txs as part of block simulation or proving. */ +export interface ProcessedTxHandler { + /** + * Handles a processed txs. + * @param tx - The transaction to be handled. + */ + addNewTx(tx: ProcessedTx): Promise; +} diff --git a/yarn-project/circuit-types/src/interfaces/prover-client.ts b/yarn-project/circuit-types/src/interfaces/prover-client.ts index 7e8aa848f4f..8f3d9bb7a69 100644 --- a/yarn-project/circuit-types/src/interfaces/prover-client.ts +++ b/yarn-project/circuit-types/src/interfaces/prover-client.ts @@ -2,7 +2,7 @@ import { type TxHash } from '@aztec/circuit-types'; import { Fr } from '@aztec/circuits.js'; import { type ConfigMappingsType, booleanConfigHelper, numberConfigHelper } from '@aztec/foundation/config'; -import { type BlockProver } from './block-prover.js'; +import { type EpochProver } from './epoch-prover.js'; import { type MerkleTreeOperations } from './merkle_tree_operations.js'; import { type ProvingJobSource } from './proving-job.js'; @@ -84,10 +84,9 @@ function parseProverId(str: string) { /** * The interface to the prover client. * Provides the ability to generate proofs and build rollups. - * TODO(palla/prover-node): Rename this interface */ -export interface ProverClient { - createBlockProver(db: MerkleTreeOperations): BlockProver; +export interface EpochProverManager { + createEpochProver(db: MerkleTreeOperations): EpochProver; start(): Promise; diff --git a/yarn-project/circuit-types/src/interfaces/prover-coordination.ts b/yarn-project/circuit-types/src/interfaces/prover-coordination.ts new file mode 100644 index 00000000000..01918a34d39 --- /dev/null +++ b/yarn-project/circuit-types/src/interfaces/prover-coordination.ts @@ -0,0 +1,19 @@ +import { type EpochProofQuote } from '../prover_coordination/index.js'; +import { type Tx } from '../tx/tx.js'; +import { type TxHash } from '../tx/tx_hash.js'; + +/** Provides basic operations for ProverNodes to interact with other nodes in the network. */ +export interface ProverCoordination { + /** + * Returns a transaction given its hash if available. + * @param txHash - The hash of the transaction, used as an ID. + * @returns The transaction, if found, 'undefined' otherwise. + */ + getTxByHash(txHash: TxHash): Promise; + + /** + * Receives a quote for an epoch proof and stores it in its EpochProofQuotePool + * @param quote - The quote to store + */ + addEpochProofQuote(quote: EpochProofQuote): Promise; +} diff --git a/yarn-project/circuit-types/src/interfaces/proving-job.ts b/yarn-project/circuit-types/src/interfaces/proving-job.ts index c805b4cb80e..42ac7ae3dda 100644 --- a/yarn-project/circuit-types/src/interfaces/proving-job.ts +++ b/yarn-project/circuit-types/src/interfaces/proving-job.ts @@ -7,6 +7,7 @@ import { type BlockMergeRollupInputs, type BlockRootOrBlockMergePublicInputs, type BlockRootRollupInputs, + type EmptyBlockRootRollupInputs, type KernelCircuitPublicInputs, type MergeRollupInputs, type NESTED_RECURSIVE_PROOF_LENGTH, @@ -75,8 +76,8 @@ export enum ProvingRequestType { BASE_ROLLUP, MERGE_ROLLUP, + EMPTY_BLOCK_ROOT_ROLLUP, BLOCK_ROOT_ROLLUP, - BLOCK_ROOT_ROLLUP_FINAL, BLOCK_MERGE_ROLLUP, ROOT_ROLLUP, @@ -102,10 +103,10 @@ export function mapProvingRequestTypeToCircuitName(type: ProvingRequestType): Ci return 'base-rollup'; case ProvingRequestType.MERGE_ROLLUP: return 'merge-rollup'; + case ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP: + return 'empty-block-root-rollup'; case ProvingRequestType.BLOCK_ROOT_ROLLUP: return 'block-root-rollup'; - case ProvingRequestType.BLOCK_ROOT_ROLLUP_FINAL: - return 'block-root-rollup-final'; case ProvingRequestType.BLOCK_MERGE_ROLLUP: return 'block-merge-rollup'; case ProvingRequestType.ROOT_ROLLUP: @@ -165,8 +166,8 @@ export type ProvingRequest = inputs: BlockRootRollupInputs; } | { - type: ProvingRequestType.BLOCK_ROOT_ROLLUP_FINAL; - inputs: BlockRootRollupInputs; + type: ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP; + inputs: EmptyBlockRootRollupInputs; } | { type: ProvingRequestType.BLOCK_MERGE_ROLLUP; @@ -195,8 +196,8 @@ export type ProvingRequestPublicInputs = { [ProvingRequestType.BASE_ROLLUP]: PublicInputsAndRecursiveProof; [ProvingRequestType.MERGE_ROLLUP]: PublicInputsAndRecursiveProof; + [ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP]: PublicInputsAndRecursiveProof; [ProvingRequestType.BLOCK_ROOT_ROLLUP]: PublicInputsAndRecursiveProof; - [ProvingRequestType.BLOCK_ROOT_ROLLUP_FINAL]: PublicInputsAndRecursiveProof; [ProvingRequestType.BLOCK_MERGE_ROLLUP]: PublicInputsAndRecursiveProof; [ProvingRequestType.ROOT_ROLLUP]: PublicInputsAndRecursiveProof; diff --git a/yarn-project/circuit-types/src/interfaces/server_circuit_prover.ts b/yarn-project/circuit-types/src/interfaces/server_circuit_prover.ts index 741b05e25f5..e59595a1784 100644 --- a/yarn-project/circuit-types/src/interfaces/server_circuit_prover.ts +++ b/yarn-project/circuit-types/src/interfaces/server_circuit_prover.ts @@ -12,6 +12,7 @@ import { type BlockMergeRollupInputs, type BlockRootOrBlockMergePublicInputs, type BlockRootRollupInputs, + type EmptyBlockRootRollupInputs, type KernelCircuitPublicInputs, type MergeRollupInputs, type NESTED_RECURSIVE_PROOF_LENGTH, @@ -99,8 +100,8 @@ export interface ServerCircuitProver { * Creates a proof for the given input. * @param input - Input to the circuit. */ - getBlockRootRollupFinalProof( - input: BlockRootRollupInputs, + getEmptyBlockRootRollupProof( + input: EmptyBlockRootRollupInputs, signal?: AbortSignal, epochNumber?: number, ): Promise>; diff --git a/yarn-project/circuit-types/src/interfaces/tx-provider.ts b/yarn-project/circuit-types/src/interfaces/tx-provider.ts deleted file mode 100644 index 872f9ce0282..00000000000 --- a/yarn-project/circuit-types/src/interfaces/tx-provider.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { type Tx } from '../tx/tx.js'; -import { type TxHash } from '../tx/tx_hash.js'; - -/** Provider for transaction objects given their hash. */ -export interface TxProvider { - /** - * Returns a transaction given its hash if available. - * @param txHash - The hash of the transaction, used as an ID. - * @returns The transaction, if found, 'undefined' otherwise. - */ - getTxByHash(txHash: TxHash): Promise; -} diff --git a/yarn-project/circuit-types/src/l2_block.ts b/yarn-project/circuit-types/src/l2_block.ts index 0fa89491bae..092b3fdf2de 100644 --- a/yarn-project/circuit-types/src/l2_block.ts +++ b/yarn-project/circuit-types/src/l2_block.ts @@ -19,21 +19,6 @@ export class L2Block { public body: Body, ) {} - /** - * Constructs a new instance from named fields. - * @param fields - Fields to pass to the constructor. - * @returns A new instance. - */ - static fromFields(fields: { - /** Snapshot of archive tree after the block is applied. */ - archive: AppendOnlyTreeSnapshot; - /** L2 block header. */ - header: Header; - body: Body; - }) { - return new this(fields.archive, fields.header, fields.body); - } - /** * Deserializes a block from a buffer * @returns A deserialized L2 block. @@ -44,11 +29,7 @@ export class L2Block { const archive = reader.readObject(AppendOnlyTreeSnapshot); const body = reader.readObject(Body); - return L2Block.fromFields({ - archive, - header, - body, - }); + return new L2Block(archive, header, body); } /** @@ -107,11 +88,11 @@ export class L2Block { const txsEffectsHash = body.getTxsEffectsHash(); - return L2Block.fromFields({ - archive: makeAppendOnlyTreeSnapshot(l2BlockNum + 1), - header: makeHeader(0, l2BlockNum, slotNumber ?? l2BlockNum, txsEffectsHash, inHash), + return new L2Block( + makeAppendOnlyTreeSnapshot(l2BlockNum + 1), + makeHeader(0, l2BlockNum, slotNumber ?? l2BlockNum, txsEffectsHash, inHash), body, - }); + ); } /** @@ -119,11 +100,7 @@ export class L2Block { * @returns The L2 block. */ static empty(): L2Block { - return L2Block.fromFields({ - archive: AppendOnlyTreeSnapshot.zero(), - header: Header.empty(), - body: Body.empty(), - }); + return new L2Block(AppendOnlyTreeSnapshot.zero(), Header.empty(), Body.empty()); } get number(): number { diff --git a/yarn-project/circuit-types/src/l2_block_source.ts b/yarn-project/circuit-types/src/l2_block_source.ts index 45727f2156f..0d9fc597839 100644 --- a/yarn-project/circuit-types/src/l2_block_source.ts +++ b/yarn-project/circuit-types/src/l2_block_source.ts @@ -1,4 +1,4 @@ -import { type EthAddress } from '@aztec/circuits.js'; +import { type EthAddress, type Header } from '@aztec/circuits.js'; import { type L2Block } from './l2_block.js'; import { type TxHash } from './tx/tx_hash.js'; @@ -33,6 +33,12 @@ export interface L2BlockSource { */ getProvenBlockNumber(): Promise; + /** + * Gets the number of the latest L2 proven epoch seen by the block source implementation. + * @returns The number of the latest L2 proven epoch seen by the block source implementation. + */ + getProvenL2EpochNumber(): Promise; + /** * Gets an l2 block. If a negative number is passed, the block returned is the most recent. * @param number - The block number to return (inclusive). @@ -40,6 +46,13 @@ export interface L2BlockSource { */ getBlock(number: number): Promise; + /** + * Gets an l2 block header. + * @param number - The block number to return or 'latest' for the most recent one. + * @returns The requested L2 block header. + */ + getBlockHeader(number: number | 'latest'): Promise
; + /** * Gets up to `limit` amount of L2 blocks starting from `from`. * @param from - Number of the first block to return (inclusive). @@ -63,6 +76,29 @@ export interface L2BlockSource { */ getSettledTxReceipt(txHash: TxHash): Promise; + /** + * Returns the current L2 slot number based on the current L1 timestamp. + */ + getL2SlotNumber(): Promise; + + /** + * Returns the current L2 epoch number based on the current L1 timestamp. + */ + getL2EpochNumber(): Promise; + + /** + * Returns all blocks for a given epoch. + * @dev Use this method only with recent epochs, since it walks the block list backwards. + * @param epochNumber - The epoch number to return blocks for. + */ + getBlocksForEpoch(epochNumber: bigint): Promise; + + /** + * Returns whether the given epoch is completed on L1, based on the current L1 and L2 block numbers. + * @param epochNumber - The epoch number to check. + */ + isEpochComplete(epochNumber: bigint): Promise; + /** * Starts the L2 block source. * @param blockUntilSynced - If true, blocks until the data source has fully synced. diff --git a/yarn-project/circuit-types/src/logs/encrypted_l2_note_log.ts b/yarn-project/circuit-types/src/logs/encrypted_l2_note_log.ts index 3cc334a028b..3202155a858 100644 --- a/yarn-project/circuit-types/src/logs/encrypted_l2_note_log.ts +++ b/yarn-project/circuit-types/src/logs/encrypted_l2_note_log.ts @@ -61,15 +61,9 @@ export class EncryptedL2NoteLog { * @returns A random log. */ public static random(): EncryptedL2NoteLog { - const numPublicValues = 0; const randomEphPubKey = Point.random(); const randomLogContent = randomBytes(144 - Point.COMPRESSED_SIZE_IN_BYTES); - const data = Buffer.concat([ - Buffer.alloc(1, numPublicValues), - Fr.random().toBuffer(), - randomLogContent, - randomEphPubKey.toCompressedBuffer(), - ]); + const data = Buffer.concat([Fr.random().toBuffer(), randomLogContent, randomEphPubKey.toCompressedBuffer()]); return new EncryptedL2NoteLog(data); } diff --git a/yarn-project/circuit-types/src/logs/l1_payload/browserify-cipher.d.ts b/yarn-project/circuit-types/src/logs/l1_payload/browserify-cipher.d.ts deleted file mode 100644 index 5d393110202..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/browserify-cipher.d.ts +++ /dev/null @@ -1,78 +0,0 @@ -declare module 'browserify-cipher' { - import { type Cipher } from 'crypto'; - - /** - * Type representing supported cipher algorithms for encryption and decryption. - */ - type CipherTypes = 'aes-128-cbc'; - - /** - * Represents the options for cipher operations. - * Provides optional configuration settings to customize cipher behavior during encryption and decryption processes. - */ - interface CipherOptions { - /** - * Initialization vector used for encryption/decryption process. - */ - iv?: Buffer; - } - - /** - * Create a Cipher instance using the specified algorithm, key, and optional options. - * The function supports a limited set of algorithms defined by CipherTypes, such as 'aes-128-cbc'. - * The 'key' parameter must be a Buffer containing the secret key for encryption. - * The optional 'options' parameter can include an initialization vector (iv) as a Buffer. - * Throws an error if the specified algorithm is not supported or the provided key/iv are invalid. - * - * @param algorithm - The encryption algorithm to be used, as defined in CipherTypes. - * @param key - A Buffer containing the secret key for encryption. - * @param options - Optional configuration object with properties like 'iv' for initialization vector. - * @returns A Cipher instance configured with the specified algorithm, key, and options. - */ - function createCipher(algorithm: CipherTypes, key: Buffer, options?: CipherOptions): Cipher; - /** - * Create a Cipher instance with an explicit initialization vector (IV) for the specified algorithm and key. - * The 'algorithm' should be one of the supported cipher types, such as 'aes-128-cbc'. - * The 'key' and 'iv' must be provided as Buffers. The IV length should match the block size of the chosen algorithm. - * Throws an error if the provided algorithm is not supported, or the key or IV lengths are invalid. - * - * @param algorithm - The cipher algorithm to be used, such as 'aes-128-cbc'. - * @param key - A Buffer containing the encryption key. - * @param iv - A Buffer containing the initialization vector. - * @returns A Cipher instance initialized with the specified algorithm, key, and IV. - */ - function createCipheriv(algorithm: CipherTypes, key: Buffer, iv: Buffer): Cipher; - /** - * Create a Decipher object for the given algorithm and key, which can be used to decrypt data. - * The 'algorithm' must be one of the supported cipher types (e.g., 'aes-128-cbc'). - * The 'key' should be a Buffer containing the secret key for decryption. - * An optional 'options' object can be provided to specify additional properties such as IV (initialization vector). - * Throws an error if the inputs are invalid or the specified algorithm is not supported. - * - * @param algorithm - The cipher type to be used for decryption. - * @param key - A Buffer containing the secret key for decryption. - * @param options - An optional CipherOptions object with additional properties. - * @returns A Decipher object that can be used to decrypt data. - */ - function createDecipher(algorithm: CipherTypes, key: Buffer, options?: CipherOptions): Cipher; - /** - * Create a decipher object using the specified algorithm, key, and initialization vector (iv). - * The function allows for creating a custom decryption stream with the specific algorithm - * and provided parameters. It is useful for decrypting data that was encrypted with a custom - * initialization vector. Throws an error if the algorithm is not supported or invalid parameters are provided. - * - * @param algorithm - The encryption algorithm to be used, e.g., 'aes-128-cbc'. - * @param key - The encryption key in the form of a Buffer. - * @param iv - The initialization vector as a Buffer. - * @returns A Decipher object which can be used to decrypt data. - */ - function createDecipheriv(algorithm: CipherTypes, key: Buffer, iv: Buffer): Cipher; - /** - * Retrieves the list of supported cipher algorithms. - * This function returns an array of strings containing the names of all currently available - * cipher algorithms that can be used for encryption and decryption operations. - * - * @returns An array of strings representing the supported cipher algorithms. - */ - function getCiphers(): CipherTypes[]; -} diff --git a/yarn-project/circuit-types/src/logs/l1_payload/encrypt_buffer.test.ts b/yarn-project/circuit-types/src/logs/l1_payload/encrypt_buffer.test.ts deleted file mode 100644 index ab318001fa2..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/encrypt_buffer.test.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Fq, GrumpkinScalar } from '@aztec/circuits.js'; -import { Grumpkin } from '@aztec/circuits.js/barretenberg'; -import { randomBytes } from '@aztec/foundation/crypto'; -import { updateInlineTestData } from '@aztec/foundation/testing'; - -import { decryptBuffer, encryptBuffer } from './encrypt_buffer.js'; -import { deriveAESSecret } from './encryption_utils.js'; - -describe('encrypt buffer', () => { - let grumpkin: Grumpkin; - - beforeAll(() => { - grumpkin = new Grumpkin(); - }); - - it('derive shared secret', () => { - // The following 2 are arbitrary fixed values - fixed in order to test a match with Noir - const ownerSecretKey = new Fq(0x23b3127c127b1f29a7adff5cccf8fb06649e7ca01d9de27b21624098b897babdn); - const ephSecretKey = new Fq(0x1fdd0dd8c99b21af8e00d2d130bdc263b36dadcbea84ac5ec9293a0660deca01n); - - const ownerPubKey = grumpkin.mul(Grumpkin.generator, ownerSecretKey); - const ephPubKey = grumpkin.mul(Grumpkin.generator, ephSecretKey); - - const secretBySender = deriveAESSecret(ephSecretKey, ownerPubKey); - const secretByReceiver = deriveAESSecret(ownerSecretKey, ephPubKey); - expect(secretBySender.toString('hex')).toEqual(secretByReceiver.toString('hex')); - - const byteArrayString = `[${secretBySender - .toString('hex') - .match(/.{1,2}/g)! - .map(byte => parseInt(byte, 16))}]`; - // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data - updateInlineTestData( - 'noir-projects/aztec-nr/aztec/src/keys/point_to_symmetric_key.nr', - 'key_from_typescript', - byteArrayString, - ); - }); - - it('convert to and from encrypted buffer', () => { - const data = randomBytes(253); - const ownerSecretKey = GrumpkinScalar.random(); - const ownerPubKey = grumpkin.mul(Grumpkin.generator, ownerSecretKey); - const ephSecretKey = GrumpkinScalar.random(); - const encrypted = encryptBuffer(data, ephSecretKey, ownerPubKey); - const decrypted = decryptBuffer(encrypted, ownerSecretKey); - expect(decrypted).not.toBeUndefined(); - expect(decrypted).toEqual(data); - }); - - it('decrypting gibberish returns undefined', () => { - const data = randomBytes(253); - const ownerSecretKey = GrumpkinScalar.random(); - const ephSecretKey = GrumpkinScalar.random(); - const ownerPubKey = grumpkin.mul(Grumpkin.generator, ownerSecretKey); - const encrypted = encryptBuffer(data, ephSecretKey, ownerPubKey); - - // Introduce gibberish. - const gibberish = Buffer.concat([randomBytes(8), encrypted.subarray(8)]); - - const decrypted = decryptBuffer(gibberish, ownerSecretKey); - expect(decrypted).toBeUndefined(); - }); -}); diff --git a/yarn-project/circuit-types/src/logs/l1_payload/encrypt_buffer.ts b/yarn-project/circuit-types/src/logs/l1_payload/encrypt_buffer.ts deleted file mode 100644 index 10afdcf9deb..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/encrypt_buffer.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { type GrumpkinScalar, type PublicKey } from '@aztec/circuits.js'; -import { Grumpkin } from '@aztec/circuits.js/barretenberg'; -import { Point } from '@aztec/foundation/fields'; - -import { createCipheriv, createDecipheriv } from 'browserify-cipher'; - -import { deriveAESSecret } from './encryption_utils.js'; - -/** - * Encrypt a given data buffer using the owner's public key and an ephemeral private key. - * The encrypted data includes the original data, AES secret derived from ECDH shared secret, - * and the ephemeral public key. The encryption is done using the 'aes-128-cbc' algorithm - * with the provided curve instance for elliptic curve operations. - * - * @param data - The data buffer to be encrypted. - * @param ephSecretKey - The ephemeral secret key.. - * @param incomingViewingPublicKey - The note owner's incoming viewing public key. - * @returns A Buffer containing the encrypted data and the ephemeral public key. - */ -export function encryptBuffer(data: Buffer, ephSecretKey: GrumpkinScalar, incomingViewingPublicKey: PublicKey): Buffer { - const aesSecret = deriveAESSecret(ephSecretKey, incomingViewingPublicKey); - const aesKey = aesSecret.subarray(0, 16); - const iv = aesSecret.subarray(16, 32); - const cipher = createCipheriv('aes-128-cbc', aesKey, iv); - const plaintext = Buffer.concat([iv.subarray(0, 8), data]); - const curve = new Grumpkin(); - const ephPubKey = curve.mul(curve.generator(), ephSecretKey); - - // We encrypt eth pub key without the isInfinite flag because infinite point is not a valid pub key - return Buffer.concat([cipher.update(plaintext), cipher.final(), ephPubKey.toCompressedBuffer()]); -} - -/** - * Decrypts the given encrypted data buffer using the provided secret key. - * @param data - The encrypted data buffer to be decrypted. - * @param incomingViewingSecretKey - The secret key used for decryption. - * @returns The decrypted plaintext as a Buffer or undefined if decryption fails. - */ -export function decryptBuffer(data: Buffer, incomingViewingSecretKey: GrumpkinScalar): Buffer | undefined { - // Extract the ephemeral public key from the end of the data - const ephPubKey = Point.fromCompressedBuffer(data.subarray(-Point.COMPRESSED_SIZE_IN_BYTES)); - // Derive the AES secret key using the secret key and the ephemeral public key - const aesSecret = deriveAESSecret(incomingViewingSecretKey, ephPubKey); - const aesKey = aesSecret.subarray(0, 16); - const iv = aesSecret.subarray(16, 32); - const cipher = createDecipheriv('aes-128-cbc', aesKey, iv); - try { - const plaintext = Buffer.concat([cipher.update(data.subarray(0, -Point.COMPRESSED_SIZE_IN_BYTES)), cipher.final()]); - if (plaintext.subarray(0, 8).equals(iv.subarray(0, 8))) { - return plaintext.subarray(8); - } - } catch (e) { - return; - } -} diff --git a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_header.test.ts b/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_header.test.ts deleted file mode 100644 index 93df3fee728..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_header.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { AztecAddress, GrumpkinScalar } from '@aztec/circuits.js'; -import { Grumpkin } from '@aztec/circuits.js/barretenberg'; -import { updateInlineTestData } from '@aztec/foundation/testing'; - -import { EncryptedLogHeader } from './encrypted_log_header.js'; - -describe('encrypt log header', () => { - let grumpkin: Grumpkin; - - beforeAll(() => { - grumpkin = new Grumpkin(); - }); - - it('encrypt and decrypt a log header', () => { - const ephSecretKey = GrumpkinScalar.random(); - const viewingSecretKey = GrumpkinScalar.random(); - - const ephPubKey = grumpkin.mul(Grumpkin.generator, ephSecretKey); - const viewingPubKey = grumpkin.mul(Grumpkin.generator, viewingSecretKey); - - const header = new EncryptedLogHeader(AztecAddress.random()); - - const encrypted = header.computeCiphertext(ephSecretKey, viewingPubKey); - - const recreated = EncryptedLogHeader.fromCiphertext(encrypted, viewingSecretKey, ephPubKey); - - expect(recreated.toBuffer()).toEqual(header.toBuffer()); - }); - - it('encrypt a log header, generate input for noir test', () => { - // The following 2 are arbitrary fixed values - fixed in order to test a match with Noir - const viewingSecretKey = new GrumpkinScalar(0x23b3127c127b1f29a7adff5cccf8fb06649e7ca01d9de27b21624098b897babdn); - const ephSecretKey = new GrumpkinScalar(0x1fdd0dd8c99b21af8e00d2d130bdc263b36dadcbea84ac5ec9293a0660deca01n); - - const viewingPubKey = grumpkin.mul(Grumpkin.generator, viewingSecretKey); - - const header = new EncryptedLogHeader(AztecAddress.fromBigInt(BigInt('0xdeadbeef'))); - - const encrypted = header.computeCiphertext(ephSecretKey, viewingPubKey); - - const byteArrayString = `[${encrypted - .toString('hex') - .match(/.{1,2}/g)! - .map(byte => parseInt(byte, 16))}]`; - - // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data - updateInlineTestData( - 'noir-projects/aztec-nr/aztec/src/encrypted_logs/header.nr', - 'expected_header_ciphertext_from_typescript', - byteArrayString, - ); - }); -}); diff --git a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_header.ts b/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_header.ts deleted file mode 100644 index a66e5d99167..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_header.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { AztecAddress, type GrumpkinScalar, type PublicKey } from '@aztec/circuits.js'; -import { Aes128 } from '@aztec/circuits.js/barretenberg'; - -import { deriveAESSecret } from './encryption_utils.js'; - -/** - * An encrypted log header, containing the address of the log along with utility - * functions to compute and decrypt its ciphertext. - * - * Using AES-128-CBC for encryption. - * Can be used for both incoming and outgoing logs. - * - */ -export class EncryptedLogHeader { - constructor(public readonly address: AztecAddress) {} - - /** - * Serializes the log header to a buffer - * - * @returns The serialized log header - */ - public toBuffer(): Buffer { - return this.address.toBuffer(); - } - - public static fromBuffer(buf: Buffer): EncryptedLogHeader { - return new EncryptedLogHeader(AztecAddress.fromBuffer(buf)); - } - - /** - * Computes the ciphertext of the encrypted log header - * - * @param secret - An ephemeral secret key - * @param publicKey - The incoming or outgoing viewing key of the "recipient" of this log - * @returns The ciphertext of the encrypted log header - */ - public computeCiphertext(secret: GrumpkinScalar, publicKey: PublicKey) { - const aesSecret = deriveAESSecret(secret, publicKey); - const key = aesSecret.subarray(0, 16); - const iv = aesSecret.subarray(16, 32); - - const aes128 = new Aes128(); - const buffer = this.toBuffer(); - return aes128.encryptBufferCBC(buffer, iv, key); - } - - /** - * - * @param ciphertext - The ciphertext buffer - * @param secret - The private key matching the public key used in encryption - * @param publicKey - The public key generated with the ephemeral secret key used in encryption - * e.g., eph_sk * G - * @returns - */ - public static fromCiphertext( - ciphertext: Buffer | bigint[], - secret: GrumpkinScalar, - publicKey: PublicKey, - ): EncryptedLogHeader { - const input = Buffer.isBuffer(ciphertext) ? ciphertext : Buffer.from(ciphertext.map((x: bigint) => Number(x))); - - const aesSecret = deriveAESSecret(secret, publicKey); - const key = aesSecret.subarray(0, 16); - const iv = aesSecret.subarray(16, 32); - - const aes128 = new Aes128(); - const buffer = aes128.decryptBufferCBC(input, iv, key); - return EncryptedLogHeader.fromBuffer(buffer); - } -} diff --git a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/encrypted_event_log_incoming_body.test.ts b/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/encrypted_event_log_incoming_body.test.ts deleted file mode 100644 index fe3e6b752b0..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/encrypted_event_log_incoming_body.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Fr, FunctionSelector, GrumpkinScalar } from '@aztec/circuits.js'; -import { Grumpkin } from '@aztec/circuits.js/barretenberg'; -import { updateInlineTestData } from '@aztec/foundation/testing'; - -import { Event } from '../payload.js'; -import { EncryptedEventLogIncomingBody } from './encrypted_event_log_incoming_body.js'; - -describe('encrypt log incoming body', () => { - let grumpkin: Grumpkin; - - beforeAll(() => { - grumpkin = new Grumpkin(); - }); - - it('encrypt and decrypt an event log incoming body', () => { - const ephSecretKey = GrumpkinScalar.random(); - const viewingSecretKey = GrumpkinScalar.random(); - - const ephPubKey = grumpkin.mul(Grumpkin.generator, ephSecretKey); - const viewingPubKey = grumpkin.mul(Grumpkin.generator, viewingSecretKey); - - const event = Event.random(); - const randomness = Fr.random(); - const eventTypeId = Fr.random(); - - const body = new EncryptedEventLogIncomingBody(randomness, eventTypeId, event); - - const encrypted = body.computeCiphertext(ephSecretKey, viewingPubKey); - - const recreated = EncryptedEventLogIncomingBody.fromCiphertext(encrypted, viewingSecretKey, ephPubKey); - - expect(recreated.toBuffer()).toEqual(body.toBuffer()); - }); - - it('encrypt an event log incoming body, generate input for noir test', () => { - // The following 2 are arbitrary fixed values - fixed in order to test a match with Noir - const ephSecretKey = new GrumpkinScalar(0x23b3127c127b1f29a7adff5cccf8fb06649e7ca01d9de27b21624098b897babdn); - const viewingSecretKey = new GrumpkinScalar(0x1fdd0dd8c99b21af8e00d2d130bdc263b36dadcbea84ac5ec9293a0660deca01n); - - const viewingPubKey = grumpkin.mul(Grumpkin.generator, viewingSecretKey); - - const event = new Event([new Fr(1), new Fr(2), new Fr(3)]); - const eventTypeId = FunctionSelector.fromSignature('TestEvent(Field,Field,Field)').toField(); - const randomness = new Fr(2); - - const body = new EncryptedEventLogIncomingBody(randomness, eventTypeId, event); - - const encrypted = body.computeCiphertext(ephSecretKey, viewingPubKey); - - const byteArrayString = `[${encrypted - .toString('hex') - .match(/.{1,2}/g)! - .map(byte => parseInt(byte, 16))}]`; - - // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data - updateInlineTestData( - 'noir-projects/aztec-nr/aztec/src/encrypted_logs/incoming_body.nr', - 'event_body_ciphertext_from_typescript', - byteArrayString, - ); - }); -}); diff --git a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/encrypted_event_log_incoming_body.ts b/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/encrypted_event_log_incoming_body.ts deleted file mode 100644 index 549d454ae11..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/encrypted_event_log_incoming_body.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Fr, type GrumpkinScalar, type PublicKey } from '@aztec/circuits.js'; -import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; - -import { Event } from '../payload.js'; -import { EncryptedLogIncomingBody } from './encrypted_log_incoming_body.js'; - -export class EncryptedEventLogIncomingBody extends EncryptedLogIncomingBody { - constructor(public randomness: Fr, public eventTypeId: Fr, public event: Event) { - super(); - } - - /** - * Serializes the log body to a buffer WITHOUT the length of the event buffer - * - * @returns The serialized log body - */ - public toBuffer(): Buffer { - const eventBufferWithoutLength = this.event.toBuffer().subarray(4); - return serializeToBuffer(this.randomness, this.eventTypeId, eventBufferWithoutLength); - } - - /** - * Deserialized the log body from a buffer WITHOUT the length of the event buffer - * - * @param buf - The buffer to deserialize - * @returns The deserialized log body - */ - public static fromBuffer(buf: Buffer): EncryptedEventLogIncomingBody { - const reader = BufferReader.asReader(buf); - const randomness = Fr.fromBuffer(reader); - const eventTypeId = Fr.fromBuffer(reader); - - // 2 Fields (randomness and event type id) are not included in the event buffer - const fieldsInEvent = reader.getLength() / 32 - 2; - const event = new Event(reader.readArray(fieldsInEvent, Fr)); - - return new EncryptedEventLogIncomingBody(randomness, eventTypeId, event); - } - - /** - * Decrypts a log body - * - * @param ciphertext - The ciphertext buffer - * @param ivskOrEphSk - The private key matching the public key used in encryption (the viewing secret key or ephemeral secret key) - * @param ephPkOrIvpk - The public key generated with the ephemeral secret key used in encryption - * - * The "odd" input stems from ivsk * ephPk == ivpk * ephSk producing the same value. - * This is used to allow for the same decryption function to be used by both the sender and the recipient. - * - * @returns The decrypted log body - */ - public static fromCiphertext( - ciphertext: Buffer | bigint[], - ivskOrEphSk: GrumpkinScalar, - ephPkOrIvpk: PublicKey, - ): EncryptedEventLogIncomingBody { - const buffer = super.fromCiphertextToBuffer(ciphertext, ivskOrEphSk, ephPkOrIvpk); - return EncryptedEventLogIncomingBody.fromBuffer(buffer); - } -} diff --git a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/encrypted_log_incoming_body.ts b/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/encrypted_log_incoming_body.ts deleted file mode 100644 index 587530882c0..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/encrypted_log_incoming_body.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { type GrumpkinScalar, type PublicKey } from '@aztec/circuits.js'; -import { Aes128 } from '@aztec/circuits.js/barretenberg'; - -import { deriveAESSecret } from '../encryption_utils.js'; - -export abstract class EncryptedLogIncomingBody { - public abstract toBuffer(): Buffer; - - /** - * Decrypts a log body - * - * @param ciphertext - The ciphertext buffer - * @param ivskOrEphSk - The private key matching the public key used in encryption (the viewing secret key or ephemeral secret key) - * @param ephPkOrIvpk - The public key generated with the ephemeral secret key used in encryption - * - * The "odd" input stems from ivsk * ephPk == ivpk * ephSk producing the same value. - * This is used to allow for the same decryption function to be used by both the sender and the recipient. - * - * @returns The decrypted log body as a buffer - */ - protected static fromCiphertextToBuffer( - ciphertext: Buffer | bigint[], - ivskOrEphSk: GrumpkinScalar, - ephPkOrIvpk: PublicKey, - ): Buffer { - const input = Buffer.isBuffer(ciphertext) ? ciphertext : Buffer.from(ciphertext.map((x: bigint) => Number(x))); - - const aesSecret = deriveAESSecret(ivskOrEphSk, ephPkOrIvpk); - const key = aesSecret.subarray(0, 16); - const iv = aesSecret.subarray(16, 32); - - const buffer = new Aes128().decryptBufferCBC(input, iv, key); - return buffer; - } - - /** - * Encrypts a log body - * - * @param ephSk - The ephemeral secret key - * @param ivpk - The application scoped incoming viewing key for the recipient of this log - * - * @returns The ciphertext of the encrypted log body - */ - public computeCiphertext(ephSk: GrumpkinScalar, ivpk: PublicKey) { - const aesSecret = deriveAESSecret(ephSk, ivpk); - const key = aesSecret.subarray(0, 16); - const iv = aesSecret.subarray(16, 32); - - const aes128 = new Aes128(); - const buffer = this.toBuffer(); - - return aes128.encryptBufferCBC(buffer, iv, key); - } -} diff --git a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/encrypted_note_log_incoming_body.test.ts b/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/encrypted_note_log_incoming_body.test.ts deleted file mode 100644 index 47a33fada1d..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/encrypted_note_log_incoming_body.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Fr, GrumpkinScalar } from '@aztec/circuits.js'; -import { Grumpkin } from '@aztec/circuits.js/barretenberg'; -import { NoteSelector } from '@aztec/foundation/abi'; -import { updateInlineTestData } from '@aztec/foundation/testing'; - -import { Note } from '../payload.js'; -import { EncryptedNoteLogIncomingBody } from './encrypted_note_log_incoming_body.js'; - -describe('encrypt log incoming body', () => { - let grumpkin: Grumpkin; - - beforeAll(() => { - grumpkin = new Grumpkin(); - }); - - it('encrypt and decrypt a note log incoming body', () => { - const ephSecretKey = GrumpkinScalar.random(); - const viewingSecretKey = GrumpkinScalar.random(); - - const ephPubKey = grumpkin.mul(Grumpkin.generator, ephSecretKey); - const viewingPubKey = grumpkin.mul(Grumpkin.generator, viewingSecretKey); - - const note = Note.random(); - const storageSlot = Fr.random(); - const noteTypeId = NoteSelector.random(); - - const body = new EncryptedNoteLogIncomingBody(storageSlot, noteTypeId, note); - - const encrypted = body.computeCiphertext(ephSecretKey, viewingPubKey); - - const recreated = EncryptedNoteLogIncomingBody.fromCiphertext(encrypted, viewingSecretKey, ephPubKey); - - expect(recreated.toBuffer()).toEqual(body.toBuffer()); - }); - - it('encrypt a note log incoming body, generate input for noir test', () => { - // All the values in this test were arbitrarily set and copied over to `incoming_body.nr` - const ephSecretKey = new GrumpkinScalar(0x23b3127c127b1f29a7adff5cccf8fb06649e7ca01d9de27b21624098b897babdn); - const viewingSecretKey = new GrumpkinScalar(0x1fdd0dd8c99b21af8e00d2d130bdc263b36dadcbea84ac5ec9293a0660deca01n); - - const viewingPubKey = grumpkin.mul(Grumpkin.generator, viewingSecretKey); - - const note = new Note([new Fr(1), new Fr(2), new Fr(3)]); - const noteTypeId = new NoteSelector(1); - const storageSlot = new Fr(2); - - const body = new EncryptedNoteLogIncomingBody(storageSlot, noteTypeId, note); - - const encrypted = body.computeCiphertext(ephSecretKey, viewingPubKey); - - const byteArrayString = `[${encrypted - .toString('hex') - .match(/.{1,2}/g)! - .map(byte => parseInt(byte, 16))}]`; - - // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data - updateInlineTestData( - 'noir-projects/aztec-nr/aztec/src/encrypted_logs/incoming_body.nr', - 'note_body_ciphertext_from_typescript', - byteArrayString, - ); - }); -}); diff --git a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/encrypted_note_log_incoming_body.ts b/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/encrypted_note_log_incoming_body.ts deleted file mode 100644 index 344b84105ee..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/encrypted_note_log_incoming_body.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Fr, type GrumpkinScalar, type PublicKey } from '@aztec/circuits.js'; -import { NoteSelector } from '@aztec/foundation/abi'; -import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; - -import { Note } from '../payload.js'; -import { EncryptedLogIncomingBody } from './encrypted_log_incoming_body.js'; - -export class EncryptedNoteLogIncomingBody extends EncryptedLogIncomingBody { - constructor(public storageSlot: Fr, public noteTypeId: NoteSelector, public note: Note) { - super(); - } - - /** - * Serializes the log body to a buffer WITHOUT the length of the note buffer - * - * @returns The serialized log body - */ - public toBuffer(): Buffer { - const noteBufferWithoutLength = this.note.toBuffer().subarray(4); - // Note: We serialize note type to field first because that's how it's done in Noir - return serializeToBuffer(this.storageSlot, this.noteTypeId.toField(), noteBufferWithoutLength); - } - - /** - * Deserialized the log body from a buffer WITHOUT the length of the note buffer - * - * @param buf - The buffer to deserialize - * @returns The deserialized log body - */ - public static fromBuffer(buf: Buffer): EncryptedNoteLogIncomingBody { - const reader = BufferReader.asReader(buf); - const storageSlot = Fr.fromBuffer(reader); - const noteTypeId = NoteSelector.fromField(Fr.fromBuffer(reader)); - - // 2 Fields (storage slot and note type id) are not included in the note buffer - const fieldsInNote = reader.getLength() / 32 - 2; - const note = new Note(reader.readArray(fieldsInNote, Fr)); - - return new EncryptedNoteLogIncomingBody(storageSlot, noteTypeId, note); - } - - /** - * Decrypts a log body - * - * @param ciphertext - The ciphertext buffer - * @param ivskOrEphSk - The private key matching the public key used in encryption (the viewing secret key or ephemeral secret key) - * @param ephPkOrIvpk - The public key generated with the ephemeral secret key used in encryption - * - * The "odd" input stems from ivsk * ephPk == ivpk * ephSk producing the same value. - * This is used to allow for the same decryption function to be used by both the sender and the recipient. - * - * @returns The decrypted log body - */ - public static fromCiphertext( - ciphertext: Buffer | bigint[], - ivskOrEphSk: GrumpkinScalar, - ephPkOrIvpk: PublicKey, - ): EncryptedNoteLogIncomingBody { - const buffer = super.fromCiphertextToBuffer(ciphertext, ivskOrEphSk, ephPkOrIvpk); - return EncryptedNoteLogIncomingBody.fromBuffer(buffer); - } -} diff --git a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/index.ts b/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/index.ts deleted file mode 100644 index 6a8e480e25f..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_incoming_body/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './encrypted_event_log_incoming_body.js'; -export * from './encrypted_note_log_incoming_body.js'; -export * from './encrypted_log_incoming_body.js'; diff --git a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_outgoing_body.test.ts b/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_outgoing_body.test.ts deleted file mode 100644 index 35b89c559e0..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_outgoing_body.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { AztecAddress, GrumpkinScalar } from '@aztec/circuits.js'; -import { Grumpkin } from '@aztec/circuits.js/barretenberg'; -import { updateInlineTestData } from '@aztec/foundation/testing'; - -import { EncryptedLogOutgoingBody } from './encrypted_log_outgoing_body.js'; - -describe('encrypt log outgoing body', () => { - let grumpkin: Grumpkin; - - beforeAll(() => { - grumpkin = new Grumpkin(); - }); - - it('encrypt and decrypt a log outgoing body', () => { - const ephSk = GrumpkinScalar.random(); - const recipientIvsk = GrumpkinScalar.random(); - const senderOvskApp = GrumpkinScalar.random(); - - const ephPk = grumpkin.mul(Grumpkin.generator, ephSk); - const recipientIvpk = grumpkin.mul(Grumpkin.generator, recipientIvsk); - - const recipientAddress = AztecAddress.random(); - - const body = new EncryptedLogOutgoingBody(ephSk, recipientAddress, recipientIvpk); - - const encrypted = body.computeCiphertext(senderOvskApp, ephPk); - - const recreated = EncryptedLogOutgoingBody.fromCiphertext(encrypted, senderOvskApp, ephPk); - - expect(recreated.toBuffer()).toEqual(body.toBuffer()); - }); - - it('encrypt a log outgoing body, generate input for noir test', () => { - const ephSk = new GrumpkinScalar(0x0f096b423017226a18461115fa8d34bbd0d302ee245dfaf2807e604eec4715fen); - const recipientIvsk = new GrumpkinScalar(0x0f4d97c25d578f9348251a71ca17ae314828f8f95676ebb481df163f87fd4022n); - const senderOvskApp = new GrumpkinScalar(0x089c6887cb1446d86c64e81afc78048b74d2e28c6bc5176ac02cf7c7d36a444en); - - const ephPk = grumpkin.mul(Grumpkin.generator, ephSk); - const recipientIvpk = grumpkin.mul(Grumpkin.generator, recipientIvsk); - - const recipientAddress = AztecAddress.fromBigInt(BigInt('0xdeadbeef')); - - const body = new EncryptedLogOutgoingBody(ephSk, recipientAddress, recipientIvpk); - - const encrypted = body.computeCiphertext(senderOvskApp, ephPk); - - const recreated = EncryptedLogOutgoingBody.fromCiphertext(encrypted, senderOvskApp, ephPk); - - expect(recreated.toBuffer()).toEqual(body.toBuffer()); - - const byteArrayString = `[${encrypted - .toString('hex') - .match(/.{1,2}/g)! - .map(byte => parseInt(byte, 16))}]`; - - // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data - updateInlineTestData( - 'noir-projects/aztec-nr/aztec/src/encrypted_logs/outgoing_body.nr', - 'outgoing_body_ciphertext_from_typescript', - byteArrayString, - ); - }); -}); diff --git a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_outgoing_body.ts b/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_outgoing_body.ts deleted file mode 100644 index 69507f1a9c2..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_outgoing_body.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { AztecAddress, Fr, GeneratorIndex, GrumpkinScalar, Point, type PublicKey } from '@aztec/circuits.js'; -import { Aes128 } from '@aztec/circuits.js/barretenberg'; -import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto'; -import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; - -export class EncryptedLogOutgoingBody { - constructor(public ephSk: GrumpkinScalar, public recipient: AztecAddress, public recipientIvpk: PublicKey) {} - - /** - * Serializes the log body - * - * @returns The serialized log body - */ - public toBuffer(): Buffer { - // The serialization of Fq is [high, low] check `outgoing_body.nr` - const ephSkBytes = serializeToBuffer([this.ephSk.hi, this.ephSk.lo]); - return serializeToBuffer(ephSkBytes, this.recipient, this.recipientIvpk.toCompressedBuffer()); - } - - /** - * Deserialized the log body from a buffer - * - * @param buf - The buffer to deserialize - * @returns The deserialized log body - */ - public static fromBuffer(buf: Buffer): EncryptedLogOutgoingBody { - const reader = BufferReader.asReader(buf); - const high = reader.readObject(Fr); - const low = reader.readObject(Fr); - const ephSk = GrumpkinScalar.fromHighLow(high, low); - const recipient = reader.readObject(AztecAddress); - const recipientIvpk = Point.fromCompressedBuffer(reader.readBytes(Point.COMPRESSED_SIZE_IN_BYTES)); // PublicKey = Point - - return new EncryptedLogOutgoingBody(ephSk, recipient, recipientIvpk); - } - - /** - * Encrypts a log body - * - * @param ovskApp - The app siloed outgoing viewing secret key - * @param ephPk - The ephemeral public key - * - * @returns The ciphertext of the encrypted log body - */ - public computeCiphertext(ovskApp: GrumpkinScalar, ephPk: PublicKey) { - // We could use `ephSk` and compute `ephPk` from it. - // We mainly provide it to keep the same api and potentially slight optimization as we can reuse it. - - const aesSecret = EncryptedLogOutgoingBody.derivePoseidonAESSecret(ovskApp, ephPk); - - const key = aesSecret.subarray(0, 16); - const iv = aesSecret.subarray(16, 32); - - const aes128 = new Aes128(); - const buffer = this.toBuffer(); - - return aes128.encryptBufferCBC(buffer, iv, key); - } - - /** - * Decrypts a log body - * - * @param ciphertext - The ciphertext buffer - * @param ovskApp - The app siloed outgoing viewing secret key - * @param ephPk - The ephemeral public key - * - * @returns The decrypted log body - */ - public static fromCiphertext( - ciphertext: Buffer | bigint[], - ovskApp: GrumpkinScalar, - ephPk: PublicKey, - ): EncryptedLogOutgoingBody { - const input = Buffer.isBuffer(ciphertext) ? ciphertext : Buffer.from(ciphertext.map((x: bigint) => Number(x))); - - const aesSecret = EncryptedLogOutgoingBody.derivePoseidonAESSecret(ovskApp, ephPk); - const key = aesSecret.subarray(0, 16); - const iv = aesSecret.subarray(16, 32); - - const aes128 = new Aes128(); - const buffer = aes128.decryptBufferCBC(input, iv, key); - - return EncryptedLogOutgoingBody.fromBuffer(buffer); - } - - /** - * Derives an AES symmetric key from the app siloed outgoing viewing secret key - * and the ephemeral public key using poseidon. - * - * @param ovskApp - The app siloed outgoing viewing secret key - * @param ephPk - The ephemeral public key - * @returns The derived AES symmetric key - */ - private static derivePoseidonAESSecret(ovskApp: GrumpkinScalar, ephPk: PublicKey) { - // For performance reasons, we do NOT use the usual `deriveAESSecret` function here and instead we compute it using - // poseidon. Note that we can afford to use poseidon here instead of deriving shared secret using Diffie-Hellman - // because for outgoing we are encrypting for ourselves and hence we don't need to perform a key exchange. - return poseidon2HashWithSeparator( - [ovskApp.hi, ovskApp.lo, ephPk.x, ephPk.y], - GeneratorIndex.SYMMETRIC_KEY, - ).toBuffer(); - } -} diff --git a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_payload.test.ts b/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_payload.test.ts new file mode 100644 index 00000000000..2c17b670f58 --- /dev/null +++ b/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_payload.test.ts @@ -0,0 +1,92 @@ +import { AztecAddress, KeyValidationRequest, computeOvskApp, derivePublicKeyFromSecretKey } from '@aztec/circuits.js'; +import { randomBytes } from '@aztec/foundation/crypto'; +import { Fr, GrumpkinScalar } from '@aztec/foundation/fields'; +import { updateInlineTestData } from '@aztec/foundation/testing'; + +import { EncryptedLogPayload } from './encrypted_log_payload.js'; + +// placeholder value until tagging is implemented +const PLACEHOLDER_TAG = new Fr(33); + +describe('EncryptedLogPayload', () => { + describe('encrypt and decrypt a full log', () => { + let ovskM: GrumpkinScalar; + let ivskM: GrumpkinScalar; + + let original: EncryptedLogPayload; + let encrypted: Buffer; + + beforeAll(() => { + const incomingBodyPlaintext = randomBytes(128); + const contract = AztecAddress.random(); + original = new EncryptedLogPayload(PLACEHOLDER_TAG, PLACEHOLDER_TAG, contract, incomingBodyPlaintext); + + ovskM = GrumpkinScalar.random(); + ivskM = GrumpkinScalar.random(); + + const ovKeys = getKeyValidationRequest(ovskM, contract); + + const ephSk = GrumpkinScalar.random(); + + const recipientAddress = AztecAddress.random(); + const ivpk = derivePublicKeyFromSecretKey(ivskM); + + encrypted = original.encrypt(ephSk, recipientAddress, ivpk, ovKeys); + }); + + it('decrypt a log as incoming', () => { + const recreated = EncryptedLogPayload.decryptAsIncoming(encrypted, ivskM); + + expect(recreated?.toBuffer()).toEqual(original.toBuffer()); + }); + + it('decrypt a log as outgoing', () => { + const recreated = EncryptedLogPayload.decryptAsOutgoing(encrypted, ovskM); + + expect(recreated?.toBuffer()).toEqual(original.toBuffer()); + }); + }); + + it('encrypted tagged log matches Noir', () => { + // All the values in this test were arbitrarily set and copied over to `payload.nr` + const contract = AztecAddress.fromString('0x10f48cd9eff7ae5b209c557c70de2e657ee79166868676b787e9417e19260e04'); + const plaintext = Buffer.from( + '00000001301640ceea758391b2e161c92c0513f129020f4125256afdae2646ce31099f5c10f48cd9eff7ae5b209c557c70de2e657ee79166868676b787e9417e19260e040fe46be583b71f4ab5b70c2657ff1d05cccf1d292a9369628d1a194f944e659900001027', + 'hex', + ); + const log = new EncryptedLogPayload(new Fr(0), new Fr(0), contract, plaintext); + + const ovskM = new GrumpkinScalar(0x06b76394ac57b8a18ceb08b14ed15b5b778d5c506b4cfb7edc203324eab27c05n); + const ivskM = new GrumpkinScalar(0x03fd94b1101e834e829cda4f227043f60490b5c7b3073875f5bfbe5028ed05ccn); + const ovKeys = getKeyValidationRequest(ovskM, contract); + const ephSk = new GrumpkinScalar(0x1358d15019d4639393d62b97e1588c095957ce74a1c32d6ec7d62fe6705d9538n); + + const recipientAddress = AztecAddress.fromString( + '0x10ee41ee4b62703b16f61e03cb0d88c4b306a9eb4a6ceeb2aff13428541689a2', + ); + + const ivpk = derivePublicKeyFromSecretKey(ivskM); + + const encrypted = log.encrypt(ephSk, recipientAddress, ivpk, ovKeys).toString('hex'); + + expect(encrypted).toMatchInlineSnapshot( + `"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d460c0e434d846ec1ea286e4090eb56376ff27bddc1aacae1d856549f701fa77e4f33ba2f47fdac6370f13bc5f16bbae857bbe6ab3ee4ea2a339192eef22a47ce0df4426fc314cb6294ccf291b79c1d8d362cdcc223e51020ccd3318e7052ca74f1fe922ad914bd46e4b6abcd681b63ab1c5bf4151e82f00548ae7c61c59df8c117c14c2e8d9046d32d43a7da818c68be296ef9d1446a87a450eb3f6550200d2663915b0bad97e7f7419975e5a740efb67eeb5304a90808a004ebfc156054a1459191d7fea175f6c64159b3c25a13790cca7250c30e3c80698e64565a6c9ddb16ac1479c3199fec02464b2a252202119514b02012cc387579220f03587b40444ae93f3b83dec2c0a76ed90a804981ac3d2b0c62a5cbbf9aa19604ef5f303c9f21de8e6649c1ec91c5a0d8fe71f319f4fbc0de230772652398977018205e8a47a05b4483d9758c139325c5c0152bacefefcd0f6e4c1ad32a75040f8791f7254954a495fa2300cd69b28f686264fac19a88afb16de1cffc93fafabd759365e684"`, + ); + + const byteArrayString = `[${encrypted.match(/.{1,2}/g)!.map(byte => parseInt(byte, 16))}]`; + + // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data + updateInlineTestData( + 'noir-projects/aztec-nr/aztec/src/encrypted_logs/payload.nr', + 'encrypted_log_from_typescript', + byteArrayString, + ); + }); + + const getKeyValidationRequest = (ovskM: GrumpkinScalar, app: AztecAddress) => { + const ovskApp = computeOvskApp(ovskM, app); + const ovpkM = derivePublicKeyFromSecretKey(ovskM); + + return new KeyValidationRequest(ovpkM, ovskApp); + }; +}); diff --git a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_payload.ts b/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_payload.ts new file mode 100644 index 00000000000..4deecd47968 --- /dev/null +++ b/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_payload.ts @@ -0,0 +1,210 @@ +import { + AztecAddress, + Fr, + GrumpkinScalar, + type KeyValidationRequest, + NotOnCurveError, + Point, + type PublicKey, + computeOvskApp, + derivePublicKeyFromSecretKey, +} from '@aztec/circuits.js'; +import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; + +import { decrypt, encrypt } from './encryption_util.js'; +import { derivePoseidonAESSecret } from './shared_secret_derivation.js'; + +// Both the incoming and the outgoing header are 48 bytes../shared_secret_derivation.js +// 32 bytes for the address, and 16 bytes padding to follow PKCS#7 +const HEADER_SIZE = 48; + +// The outgoing body is constant size of 144 bytes. +// 128 bytes for the secret key, address and public key, and 16 bytes padding to follow PKCS#7 +const OUTGOING_BODY_SIZE = 144; + +/** + * Encrypted log payload with a tag used for retrieval by clients. + */ +export class EncryptedLogPayload { + constructor( + public readonly incomingTag: Fr, + public readonly outgoingTag: Fr, + public readonly contractAddress: AztecAddress, + public readonly incomingBodyPlaintext: Buffer, + ) {} + + public encrypt( + ephSk: GrumpkinScalar, + recipient: AztecAddress, + ivpk: PublicKey, + ovKeys: KeyValidationRequest, + ): Buffer { + if (ivpk.isZero()) { + throw new Error(`Attempting to encrypt an event log with a zero ivpk.`); + } + + const ephPk = derivePublicKeyFromSecretKey(ephSk); + const incomingHeaderCiphertext = encrypt(this.contractAddress.toBuffer(), ephSk, ivpk); + const outgoingHeaderCiphertext = encrypt(this.contractAddress.toBuffer(), ephSk, ovKeys.pkM); + + if (incomingHeaderCiphertext.length !== HEADER_SIZE) { + throw new Error(`Invalid incoming header size: ${incomingHeaderCiphertext.length}`); + } + if (outgoingHeaderCiphertext.length !== HEADER_SIZE) { + throw new Error(`Invalid outgoing header size: ${outgoingHeaderCiphertext.length}`); + } + + const incomingBodyCiphertext = encrypt(this.incomingBodyPlaintext, ephSk, ivpk); + // The serialization of Fq is [high, low] check `outgoing_body.nr` + const outgoingBodyPlaintext = serializeToBuffer(ephSk.hi, ephSk.lo, recipient, ivpk.toCompressedBuffer()); + const outgoingBodyCiphertext = encrypt( + outgoingBodyPlaintext, + ovKeys.skAppAsGrumpkinScalar, + ephPk, + derivePoseidonAESSecret, + ); + + if (outgoingBodyCiphertext.length !== OUTGOING_BODY_SIZE) { + throw new Error(`Invalid outgoing body size: ${outgoingBodyCiphertext.length}`); + } + + return serializeToBuffer( + this.incomingTag, + this.outgoingTag, + ephPk.toCompressedBuffer(), + incomingHeaderCiphertext, + outgoingHeaderCiphertext, + outgoingBodyCiphertext, + incomingBodyCiphertext, + ); + } + + /** + * Decrypts a ciphertext as an incoming log. + * + * This is executable by the recipient of the note, and uses the ivsk to decrypt the payload. + * The outgoing parts of the log are ignored entirely. + * + * Produces the same output as `decryptAsOutgoing`. + * + * @param ciphertext - The ciphertext for the log + * @param ivsk - The incoming viewing secret key, used to decrypt the logs + * @returns The decrypted log payload + */ + public static decryptAsIncoming( + ciphertext: Buffer | BufferReader, + ivsk: GrumpkinScalar, + ): EncryptedLogPayload | undefined { + const reader = BufferReader.asReader(ciphertext); + + try { + const incomingTag = reader.readObject(Fr); + const outgoingTag = reader.readObject(Fr); + + const ephPk = Point.fromCompressedBuffer(reader.readBytes(Point.COMPRESSED_SIZE_IN_BYTES)); + + const incomingHeader = decrypt(reader.readBytes(HEADER_SIZE), ivsk, ephPk); + + // Skipping the outgoing header and body + reader.readBytes(HEADER_SIZE); + reader.readBytes(OUTGOING_BODY_SIZE); + + // The incoming can be of variable size, so we read until the end + const incomingBodyPlaintext = decrypt(reader.readToEnd(), ivsk, ephPk); + + return new EncryptedLogPayload( + incomingTag, + outgoingTag, + AztecAddress.fromBuffer(incomingHeader), + incomingBodyPlaintext, + ); + } catch (e: any) { + // Following error messages are expected to occur when decryption fails + if ( + !(e instanceof NotOnCurveError) && + !e.message.endsWith('is greater or equal to field modulus.') && + !e.message.startsWith('Invalid AztecAddress length') && + !e.message.startsWith('Selector must fit in') && + !e.message.startsWith('Attempted to read beyond buffer length') + ) { + // If we encounter an unexpected error, we rethrow it + throw e; + } + return; + } + } + + /** + * Decrypts a ciphertext as an outgoing log. + * + * This is executable by the sender of the event, and uses the ovsk to decrypt the payload. + * The outgoing parts are decrypted to retrieve information that allows the sender to + * decrypt the incoming log, and learn about the event contents. + * + * Produces the same output as `decryptAsIncoming`. + * + * @param ciphertext - The ciphertext for the log + * @param ovsk - The outgoing viewing secret key, used to decrypt the logs + * @returns The decrypted log payload + */ + public static decryptAsOutgoing( + ciphertext: Buffer | BufferReader, + ovsk: GrumpkinScalar, + ): EncryptedLogPayload | undefined { + const reader = BufferReader.asReader(ciphertext); + + try { + const incomingTag = reader.readObject(Fr); + const outgoingTag = reader.readObject(Fr); + + const ephPk = Point.fromCompressedBuffer(reader.readBytes(Point.COMPRESSED_SIZE_IN_BYTES)); + + // We skip the incoming header + reader.readBytes(HEADER_SIZE); + + const outgoingHeader = decrypt(reader.readBytes(HEADER_SIZE), ovsk, ephPk); + const contractAddress = AztecAddress.fromBuffer(outgoingHeader); + + const ovskApp = computeOvskApp(ovsk, contractAddress); + + let ephSk: GrumpkinScalar; + let recipientIvpk: PublicKey; + { + const outgoingBody = decrypt(reader.readBytes(OUTGOING_BODY_SIZE), ovskApp, ephPk, derivePoseidonAESSecret); + const obReader = BufferReader.asReader(outgoingBody); + + // From outgoing body we extract ephSk, recipient and recipientIvpk + ephSk = GrumpkinScalar.fromHighLow(obReader.readObject(Fr), obReader.readObject(Fr)); + const _recipient = obReader.readObject(AztecAddress); + recipientIvpk = Point.fromCompressedBuffer(obReader.readBytes(Point.COMPRESSED_SIZE_IN_BYTES)); + } + + // Now we decrypt the incoming body using the ephSk and recipientIvpk + const incomingBody = decrypt(reader.readToEnd(), ephSk, recipientIvpk); + + return new EncryptedLogPayload(incomingTag, outgoingTag, contractAddress, incomingBody); + } catch (e: any) { + // Following error messages are expected to occur when decryption fails + if ( + !(e instanceof NotOnCurveError) && + !e.message.endsWith('is greater or equal to field modulus.') && + !e.message.startsWith('Invalid AztecAddress length') && + !e.message.startsWith('Selector must fit in') && + !e.message.startsWith('Attempted to read beyond buffer length') + ) { + // If we encounter an unexpected error, we rethrow it + throw e; + } + return; + } + } + + public toBuffer() { + return serializeToBuffer( + this.incomingTag, + this.outgoingTag, + this.contractAddress.toBuffer(), + this.incomingBodyPlaintext, + ); + } +} diff --git a/yarn-project/circuit-types/src/logs/l1_payload/encryption_util.ts b/yarn-project/circuit-types/src/logs/l1_payload/encryption_util.ts new file mode 100644 index 00000000000..ed10ad06ff0 --- /dev/null +++ b/yarn-project/circuit-types/src/logs/l1_payload/encryption_util.ts @@ -0,0 +1,49 @@ +import { type GrumpkinScalar, type PublicKey } from '@aztec/circuits.js'; +import { Aes128 } from '@aztec/circuits.js/barretenberg'; + +import { deriveDiffieHellmanAESSecret } from './shared_secret_derivation.js'; + +/** + * Encrypts the plaintext using the secret key and public key + * + * @param plaintext - The plaintext buffer + * @param secret - The secret key used to derive the AES secret + * @param publicKey - Public key used to derived the AES secret + * @param deriveSecret - Function to derive the AES secret from the ephemeral secret key and public key + * @returns The ciphertext + */ +export function encrypt( + plaintext: Buffer, + secret: GrumpkinScalar, + publicKey: PublicKey, + deriveSecret: (secret: GrumpkinScalar, publicKey: PublicKey) => Buffer = deriveDiffieHellmanAESSecret, +): Buffer { + const aesSecret = deriveSecret(secret, publicKey); + const key = aesSecret.subarray(0, 16); + const iv = aesSecret.subarray(16, 32); + + const aes128 = new Aes128(); + return aes128.encryptBufferCBC(plaintext, iv, key); +} + +/** + * Decrypts the ciphertext using the secret key and public key + * @param ciphertext - The ciphertext buffer + * @param secret - The secret key used to derive the AES secret + * @param publicKey - The public key used to derive the AES secret + * @param deriveSecret - Function to derive the AES secret from the ephemeral secret key and public key + * @returns + */ +export function decrypt( + ciphertext: Buffer, + secret: GrumpkinScalar, + publicKey: PublicKey, + deriveSecret: (secret: GrumpkinScalar, publicKey: PublicKey) => Buffer = deriveDiffieHellmanAESSecret, +): Buffer { + const aesSecret = deriveSecret(secret, publicKey); + const key = aesSecret.subarray(0, 16); + const iv = aesSecret.subarray(16, 32); + + const aes128 = new Aes128(); + return aes128.decryptBufferCBC(ciphertext, iv, key); +} diff --git a/yarn-project/circuit-types/src/logs/l1_payload/index.ts b/yarn-project/circuit-types/src/logs/l1_payload/index.ts index a8fe71dbc5d..da47398610e 100644 --- a/yarn-project/circuit-types/src/logs/l1_payload/index.ts +++ b/yarn-project/circuit-types/src/logs/l1_payload/index.ts @@ -1,8 +1,4 @@ -export * from './encrypt_buffer.js'; -export * from './payload.js'; -export * from './l1_event_payload.js'; +export * from './encrypted_log_payload.js'; export * from './l1_note_payload.js'; -export * from './tagged_log.js'; -export * from './encrypted_log_incoming_body/index.js'; -export * from './encrypted_log_header.js'; -export * from './encrypted_log_outgoing_body.js'; +export * from './l1_event_payload.js'; +export * from './payload.js'; diff --git a/yarn-project/circuit-types/src/logs/l1_payload/l1_event_payload.test.ts b/yarn-project/circuit-types/src/logs/l1_payload/l1_event_payload.test.ts deleted file mode 100644 index e92dfb757f8..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/l1_event_payload.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { AztecAddress, KeyValidationRequest, computeOvskApp, derivePublicKeyFromSecretKey } from '@aztec/circuits.js'; -import { EventSelector } from '@aztec/foundation/abi'; -import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto'; -import { Fr, GrumpkinScalar } from '@aztec/foundation/fields'; - -import { EncryptedL2Log } from '../encrypted_l2_log.js'; -import { L1EventPayload } from './l1_event_payload.js'; -import { Event } from './payload.js'; - -describe('L1 Event Payload', () => { - it('convert to and from buffer', () => { - const payload = L1EventPayload.random(); - const buf = payload.toBuffer(); - expect(L1EventPayload.fromBuffer(buf)).toEqual(payload); - }); - - describe('encrypt and decrypt a full log', () => { - let ovskM: GrumpkinScalar; - let ivskM: GrumpkinScalar; - - let payload: L1EventPayload; - let encrypted: Buffer; - let encryptedL2Log: EncryptedL2Log; - let maskedContractAddress: AztecAddress; - let contractAddress: AztecAddress; - let randomness: Fr; - - beforeAll(() => { - contractAddress = AztecAddress.random(); - randomness = Fr.random(); - maskedContractAddress = poseidon2HashWithSeparator([contractAddress, randomness], 0); - - payload = new L1EventPayload(Event.random(), contractAddress, randomness, EventSelector.random()); - - ovskM = GrumpkinScalar.random(); - ivskM = GrumpkinScalar.random(); - - const ovKeys = getKeyValidationRequest(ovskM, payload.contractAddress); - - const ephSk = GrumpkinScalar.random(); - - const recipientAddress = AztecAddress.random(); - const ivpk = derivePublicKeyFromSecretKey(ivskM); - - encrypted = payload.encrypt(ephSk, recipientAddress, ivpk, ovKeys); - const tag = Fr.random().toBuffer(); - encryptedL2Log = new EncryptedL2Log(Buffer.concat([tag, tag, encrypted]), maskedContractAddress); - }); - - it('decrypt a log as incoming', () => { - const recreated = L1EventPayload.decryptAsIncoming(encryptedL2Log, ivskM); - - expect(recreated.toBuffer()).toEqual(payload.toBuffer()); - }); - - it('decrypt a log as outgoing', () => { - const recreated = L1EventPayload.decryptAsOutgoing(encryptedL2Log, ovskM); - - expect(recreated.toBuffer()).toEqual(payload.toBuffer()); - }); - }); - - const getKeyValidationRequest = (ovskM: GrumpkinScalar, app: AztecAddress) => { - const ovskApp = computeOvskApp(ovskM, app); - const ovpkM = derivePublicKeyFromSecretKey(ovskM); - return new KeyValidationRequest(ovpkM, ovskApp); - }; -}); diff --git a/yarn-project/circuit-types/src/logs/l1_payload/l1_event_payload.ts b/yarn-project/circuit-types/src/logs/l1_payload/l1_event_payload.ts index 09586a355fe..429695236a0 100644 --- a/yarn-project/circuit-types/src/logs/l1_payload/l1_event_payload.ts +++ b/yarn-project/circuit-types/src/logs/l1_payload/l1_event_payload.ts @@ -1,24 +1,24 @@ -import { AztecAddress, type GrumpkinScalar, type KeyValidationRequest, type PublicKey } from '@aztec/circuits.js'; +import { AztecAddress } from '@aztec/circuits.js'; import { EventSelector } from '@aztec/foundation/abi'; -import { Fr } from '@aztec/foundation/fields'; +import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto'; +import { type Fq, Fr } from '@aztec/foundation/fields'; import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; import { type EncryptedL2Log } from '../encrypted_l2_log.js'; -import { EncryptedEventLogIncomingBody } from './encrypted_log_incoming_body/index.js'; -import { L1Payload } from './l1_payload.js'; +import { EncryptedLogPayload } from './encrypted_log_payload.js'; import { Event } from './payload.js'; /** * A class which wraps event data which is pushed on L1. */ -export class L1EventPayload extends L1Payload { +export class L1EventPayload { constructor( /** - * An encrypted event as emitted from Noir contract. + * A event as emitted from Noir contract. Can be used along with private key to compute nullifier. */ public event: Event, /** - * Address of the contract that emitted this event log. + * Address of the contract this tx is interacting with. */ public contractAddress: AztecAddress, /** @@ -26,25 +26,59 @@ export class L1EventPayload extends L1Payload { */ public randomness: Fr, /** - * Type identifier for the underlying event. + * Type identifier for the underlying event, required to determine how to compute its hash and nullifier. */ public eventTypeId: EventSelector, - ) { - super(); + ) {} + + static #fromIncomingBodyPlaintextAndContractAddress( + plaintext: Buffer, + contractAddress: AztecAddress, + maskedContractAddress: Fr, + ): L1EventPayload | undefined { + let payload: L1EventPayload; + try { + const reader = BufferReader.asReader(plaintext); + const fields = reader.readArray(plaintext.length / Fr.SIZE_IN_BYTES, Fr); + + const randomness = fields[0]; + const eventTypeId = EventSelector.fromField(fields[1]); + + const event = new Event(fields.slice(2)); + + payload = new L1EventPayload(event, contractAddress, randomness, eventTypeId); + } catch (e) { + return undefined; + } + + ensureMatchedMaskedContractAddress(contractAddress, payload.randomness, maskedContractAddress); + + return payload; } - /** - * Deserializes the L1EventPayload object from a Buffer. - * @param buffer - Buffer or BufferReader object to deserialize. - * @returns An instance of L1EventPayload. - */ - static fromBuffer(buffer: Buffer | BufferReader): L1EventPayload { - const reader = BufferReader.asReader(buffer); - return new L1EventPayload( - reader.readObject(Event), - reader.readObject(AztecAddress), - Fr.fromBuffer(reader), - reader.readObject(EventSelector), + static decryptAsIncoming(log: EncryptedL2Log, sk: Fq): L1EventPayload | undefined { + const decryptedLog = EncryptedLogPayload.decryptAsIncoming(log.data, sk); + if (!decryptedLog) { + return undefined; + } + + return this.#fromIncomingBodyPlaintextAndContractAddress( + decryptedLog.incomingBodyPlaintext, + decryptedLog.contractAddress, + log.maskedContractAddress, + ); + } + + static decryptAsOutgoing(log: EncryptedL2Log, sk: Fq): L1EventPayload | undefined { + const decryptedLog = EncryptedLogPayload.decryptAsOutgoing(log.data, sk); + if (!decryptedLog) { + return undefined; + } + + return this.#fromIncomingBodyPlaintextAndContractAddress( + decryptedLog.incomingBodyPlaintext, + decryptedLog.contractAddress, + log.maskedContractAddress, ); } @@ -52,96 +86,34 @@ export class L1EventPayload extends L1Payload { * Serializes the L1EventPayload object into a Buffer. * @returns Buffer representation of the L1EventPayload object. */ - toBuffer() { - return serializeToBuffer([this.event, this.contractAddress, this.randomness, this.eventTypeId]); + toIncomingBodyPlaintext() { + const fields = [this.randomness, this.eventTypeId.toField(), ...this.event.items]; + return serializeToBuffer(fields); } /** * Create a random L1EventPayload object (useful for testing purposes). + * @param contract - The address of a contract the event was emitted from. * @returns A random L1EventPayload object. */ - static random() { - return new L1EventPayload(Event.random(), AztecAddress.random(), Fr.random(), EventSelector.random()); + static random(contract = AztecAddress.random()) { + return new L1EventPayload(Event.random(), contract, Fr.random(), EventSelector.random()); } - public encrypt(ephSk: GrumpkinScalar, recipient: AztecAddress, ivpk: PublicKey, ovKeys: KeyValidationRequest) { - return super._encrypt( - this.contractAddress, - ephSk, - recipient, - ivpk, - ovKeys, - new EncryptedEventLogIncomingBody(this.randomness, this.eventTypeId.toField(), this.event), + public equals(other: L1EventPayload) { + return ( + this.event.equals(other.event) && + this.contractAddress.equals(other.contractAddress) && + this.randomness.equals(other.randomness) && + this.eventTypeId.equals(other.eventTypeId) ); } +} - /** - * Decrypts a ciphertext as an incoming log. - * - * This is executable by the recipient of the event, and uses the ivsk to decrypt the payload. - * The outgoing parts of the log are ignored entirely. - * - * Produces the same output as `decryptAsOutgoing`. - * - * @param encryptedLog - The encrypted log. This encrypted log is assumed to always have tags. - * @param ivsk - The incoming viewing secret key, used to decrypt the logs - * @returns The decrypted log payload - * @remarks The encrypted log is assumed to always have tags. - */ - public static decryptAsIncoming(encryptedLog: EncryptedL2Log, ivsk: GrumpkinScalar) { - const reader = BufferReader.asReader(encryptedLog.data); - - // We skip the tags - Fr.fromBuffer(reader); - Fr.fromBuffer(reader); - - const [address, incomingBody] = super._decryptAsIncoming( - reader.readToEnd(), - ivsk, - EncryptedEventLogIncomingBody.fromCiphertext, - ); - - // We instantiate selector before checking the address because instantiating the selector validates that - // the selector is valid (and that's the preferred way of detecting decryption failure). - const selector = EventSelector.fromField(incomingBody.eventTypeId); - - this.ensureMatchedMaskedContractAddress(address, incomingBody.randomness, encryptedLog.maskedContractAddress); - - return new L1EventPayload(incomingBody.event, address, incomingBody.randomness, selector); - } - - /** - * Decrypts a ciphertext as an outgoing log. - * - * This is executable by the sender of the event, and uses the ovsk to decrypt the payload. - * The outgoing parts are decrypted to retrieve information that allows the sender to - * decrypt the incoming log, and learn about the event contents. - * - * Produces the same output as `decryptAsIncoming`. - * - * @param ciphertext - The ciphertext for the log - * @param ovsk - The outgoing viewing secret key, used to decrypt the logs - * @returns The decrypted log payload - */ - public static decryptAsOutgoing(encryptedLog: EncryptedL2Log, ovsk: GrumpkinScalar) { - const reader = BufferReader.asReader(encryptedLog.data); - - // Skip the tags - Fr.fromBuffer(reader); - Fr.fromBuffer(reader); - - const [address, incomingBody] = super._decryptAsOutgoing( - reader.readToEnd(), - ovsk, - EncryptedEventLogIncomingBody.fromCiphertext, +function ensureMatchedMaskedContractAddress(contractAddress: AztecAddress, randomness: Fr, maskedContractAddress: Fr) { + if (!poseidon2HashWithSeparator([contractAddress, randomness], 0).equals(maskedContractAddress)) { + throw new Error( + 'The provided masked contract address does not match with the incoming address from header and randomness from body', ); - - // We instantiate selector before checking the address because instantiating the selector validates that - // the selector is valid (and that's the preferred way of detecting decryption failure). - const selector = EventSelector.fromField(incomingBody.eventTypeId); - - this.ensureMatchedMaskedContractAddress(address, incomingBody.randomness, encryptedLog.maskedContractAddress); - - return new L1EventPayload(incomingBody.event, address, incomingBody.randomness, selector); } } diff --git a/yarn-project/circuit-types/src/logs/l1_payload/l1_note_payload.test.ts b/yarn-project/circuit-types/src/logs/l1_payload/l1_note_payload.test.ts deleted file mode 100644 index 5a0bddc2081..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/l1_note_payload.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { AztecAddress, KeyValidationRequest, computeOvskApp, derivePublicKeyFromSecretKey } from '@aztec/circuits.js'; -import { GrumpkinScalar } from '@aztec/foundation/fields'; - -import { L1NotePayload } from './l1_note_payload.js'; - -describe('L1 Note Payload', () => { - it('convert to and from buffer', () => { - const payload = L1NotePayload.random(); - const buf = payload.toBuffer(); - expect(L1NotePayload.fromBuffer(buf)).toEqual(payload); - }); - - describe('encrypt and decrypt a full log', () => { - let ovskM: GrumpkinScalar; - let ivskM: GrumpkinScalar; - - let payload: L1NotePayload; - let encrypted: Buffer; - - beforeAll(() => { - payload = L1NotePayload.random(); - - ovskM = GrumpkinScalar.random(); - ivskM = GrumpkinScalar.random(); - - const ovKeys = getKeyValidationRequest(ovskM, payload.contractAddress); - - const ephSk = GrumpkinScalar.random(); - - const recipientAddress = AztecAddress.random(); - const ivpk = derivePublicKeyFromSecretKey(ivskM); - - encrypted = payload.encrypt(ephSk, recipientAddress, ivpk, ovKeys); - }); - - it('decrypt a log as incoming', () => { - const recreated = L1NotePayload.decryptAsIncoming(encrypted, ivskM); - - expect(recreated.toBuffer()).toEqual(payload.toBuffer()); - }); - - it('decrypt a log as outgoing', () => { - const recreated = L1NotePayload.decryptAsOutgoing(encrypted, ovskM); - - expect(recreated.toBuffer()).toEqual(payload.toBuffer()); - }); - }); - - const getKeyValidationRequest = (ovskM: GrumpkinScalar, app: AztecAddress) => { - const ovskApp = computeOvskApp(ovskM, app); - const ovpkM = derivePublicKeyFromSecretKey(ovskM); - return new KeyValidationRequest(ovpkM, ovskApp); - }; -}); diff --git a/yarn-project/circuit-types/src/logs/l1_payload/l1_note_payload.ts b/yarn-project/circuit-types/src/logs/l1_payload/l1_note_payload.ts index 29d53578dd5..c3f20cc0b10 100644 --- a/yarn-project/circuit-types/src/logs/l1_payload/l1_note_payload.ts +++ b/yarn-project/circuit-types/src/logs/l1_payload/l1_note_payload.ts @@ -1,10 +1,10 @@ -import { AztecAddress, type GrumpkinScalar, type KeyValidationRequest, type PublicKey } from '@aztec/circuits.js'; +import { AztecAddress } from '@aztec/circuits.js'; import { NoteSelector } from '@aztec/foundation/abi'; -import { Fr } from '@aztec/foundation/fields'; +import { type Fq, Fr } from '@aztec/foundation/fields'; import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; -import { EncryptedNoteLogIncomingBody } from './encrypted_log_incoming_body/index.js'; -import { L1Payload } from './l1_payload.js'; +import { type EncryptedL2NoteLog } from '../encrypted_l2_note_log.js'; +import { EncryptedLogPayload } from './encrypted_log_payload.js'; import { Note } from './payload.js'; /** @@ -12,7 +12,7 @@ import { Note } from './payload.js'; * @remarks This data is required to compute a nullifier/to spend a note. Along with that this class contains * the necessary functionality to encrypt and decrypt the data. */ -export class L1NotePayload extends L1Payload { +export class L1NotePayload { constructor( /** * A note as emitted from Noir contract. Can be used along with private key to compute nullifier. @@ -30,22 +30,48 @@ export class L1NotePayload extends L1Payload { * Type identifier for the underlying note, required to determine how to compute its hash and nullifier. */ public noteTypeId: NoteSelector, - ) { - super(); + ) {} + + static fromIncomingBodyPlaintextAndContractAddress( + plaintext: Buffer, + contractAddress: AztecAddress, + ): L1NotePayload | undefined { + try { + const reader = BufferReader.asReader(plaintext); + const fields = reader.readArray(plaintext.length / Fr.SIZE_IN_BYTES, Fr); + + const storageSlot = fields[0]; + const noteTypeId = NoteSelector.fromField(fields[1]); + + const note = new Note(fields.slice(2)); + + return new L1NotePayload(note, contractAddress, storageSlot, noteTypeId); + } catch (e) { + return undefined; + } } - /** - * Deserializes the L1NotePayload object from a Buffer. - * @param buffer - Buffer or BufferReader object to deserialize. - * @returns An instance of L1NotePayload. - */ - static fromBuffer(buffer: Buffer | BufferReader): L1NotePayload { - const reader = BufferReader.asReader(buffer); - return new L1NotePayload( - reader.readObject(Note), - reader.readObject(AztecAddress), - Fr.fromBuffer(reader), - reader.readObject(NoteSelector), + static decryptAsIncoming(log: EncryptedL2NoteLog, sk: Fq): L1NotePayload | undefined { + const decryptedLog = EncryptedLogPayload.decryptAsIncoming(log.data, sk); + if (!decryptedLog) { + return undefined; + } + + return this.fromIncomingBodyPlaintextAndContractAddress( + decryptedLog.incomingBodyPlaintext, + decryptedLog.contractAddress, + ); + } + + static decryptAsOutgoing(log: EncryptedL2NoteLog, sk: Fq): L1NotePayload | undefined { + const decryptedLog = EncryptedLogPayload.decryptAsOutgoing(log.data, sk); + if (!decryptedLog) { + return undefined; + } + + return this.fromIncomingBodyPlaintextAndContractAddress( + decryptedLog.incomingBodyPlaintext, + decryptedLog.contractAddress, ); } @@ -53,8 +79,9 @@ export class L1NotePayload extends L1Payload { * Serializes the L1NotePayload object into a Buffer. * @returns Buffer representation of the L1NotePayload object. */ - toBuffer() { - return serializeToBuffer([this.note, this.contractAddress, this.storageSlot, this.noteTypeId]); + toIncomingBodyPlaintext() { + const fields = [this.storageSlot, this.noteTypeId.toField(), ...this.note.items]; + return serializeToBuffer(fields); } /** @@ -66,77 +93,6 @@ export class L1NotePayload extends L1Payload { return new L1NotePayload(Note.random(), contract, Fr.random(), NoteSelector.random()); } - public encrypt(ephSk: GrumpkinScalar, recipient: AztecAddress, ivpk: PublicKey, ovKeys: KeyValidationRequest) { - // TODO(#8558): numPublicValues could occupy just a single bit if we store info about partial fields - // in the ABI - // We always set the value to 0 here as we don't need partial notes encryption support in TS - const numPublicValues = 0; - const encryptedPayload = super._encrypt( - this.contractAddress, - ephSk, - recipient, - ivpk, - ovKeys, - new EncryptedNoteLogIncomingBody(this.storageSlot, this.noteTypeId, this.note), - ); - return Buffer.concat([Buffer.alloc(1, numPublicValues), encryptedPayload]); - } - - /** - * Extracts public values and decrypts a ciphertext as an incoming log. - * - * This is executable by the recipient of the note, and uses the ivsk to decrypt the payload. - * The outgoing parts of the log are ignored entirely. - * - * Produces the same output as `decryptAsOutgoing`. - * - * @param content - Content of the log. Contains ciphertext and public values. - * @param ivsk - The incoming viewing secret key, used to decrypt the logs - * @returns The decrypted log payload - */ - public static decryptAsIncoming(content: Buffer | bigint[], ivsk: GrumpkinScalar) { - const [ciphertext, publicValues] = this.#getCiphertextAndPublicValues(content); - - const [address, incomingBody] = super._decryptAsIncoming( - ciphertext, - ivsk, - EncryptedNoteLogIncomingBody.fromCiphertext, - ); - - // Partial fields are expected to be at the end of the note - const note = new Note([...incomingBody.note.items, ...publicValues]); - - return new L1NotePayload(note, address, incomingBody.storageSlot, incomingBody.noteTypeId); - } - - /** - * Extracts public values and decrypts a ciphertext as an outgoing log. - * - * This is executable by the sender of the note, and uses the ovsk to decrypt the payload. - * The outgoing parts are decrypted to retrieve information that allows the sender to - * decrypt the incoming log, and learn about the note contents. - * - * Produces the same output as `decryptAsIncoming`. - * - * @param content - Content of the log. Contains ciphertext and public values. - * @param ovsk - The outgoing viewing secret key, used to decrypt the logs - * @returns The decrypted log payload - */ - public static decryptAsOutgoing(content: Buffer | bigint[], ovsk: GrumpkinScalar) { - const [ciphertext, publicValues] = this.#getCiphertextAndPublicValues(content); - - const [address, incomingBody] = super._decryptAsOutgoing( - ciphertext, - ovsk, - EncryptedNoteLogIncomingBody.fromCiphertext, - ); - - // Partial fields are expected to be at the end of the note - const note = new Note([...incomingBody.note.items, ...publicValues]); - - return new L1NotePayload(note, address, incomingBody.storageSlot, incomingBody.noteTypeId); - } - public equals(other: L1NotePayload) { return ( this.note.equals(other.note) && @@ -145,34 +101,4 @@ export class L1NotePayload extends L1Payload { this.noteTypeId.equals(other.noteTypeId) ); } - - /** - * Extracts the ciphertext and the public values from the log content. - * Input byte layout: - * +-----------------------------------+ - * | Byte | Description | - * |------|----------------------------| - * | 0 | num_pub_vals | - * |------|----------------------------| - * | 1 to | Ciphertext | - * | N | (N = total_length - 1 | - * | | - num_pub_vals * 32) | - * |------|----------------------------| - * | N+1 | Public values | - * | to | (num_pub_vals * 32 bytes) | - * | end | | - * +-----------------------------------+ - */ - static #getCiphertextAndPublicValues(content: Buffer | bigint[]): [Buffer, Fr[]] { - const input = Buffer.isBuffer(content) ? content : Buffer.from(content.map((x: bigint) => Number(x))); - - const reader = BufferReader.asReader(input); - const numPublicValues = reader.readUInt8(); - const ciphertextLength = reader.getLength() - numPublicValues * Fr.SIZE_IN_BYTES - 1; - - const ciphertext = reader.readBytes(ciphertextLength); - const publicValues = reader.readArray(numPublicValues, Fr); - - return [ciphertext, publicValues]; - } } diff --git a/yarn-project/circuit-types/src/logs/l1_payload/l1_payload.ts b/yarn-project/circuit-types/src/logs/l1_payload/l1_payload.ts deleted file mode 100644 index d8e12624c63..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/l1_payload.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { - type AztecAddress, - type GrumpkinScalar, - type KeyValidationRequest, - type PublicKey, - computeOvskApp, - derivePublicKeyFromSecretKey, -} from '@aztec/circuits.js'; -import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto'; -import { type Fr, Point } from '@aztec/foundation/fields'; -import { BufferReader } from '@aztec/foundation/serialize'; - -import { EncryptedLogHeader } from './encrypted_log_header.js'; -import { type EncryptedLogIncomingBody } from './encrypted_log_incoming_body/index.js'; -import { EncryptedLogOutgoingBody } from './encrypted_log_outgoing_body.js'; - -// Both the incoming and the outgoing header are 48 bytes. -// 32 bytes for the address, and 16 bytes padding to follow PKCS#7 -const HEADER_SIZE = 48; - -// The outgoing body is constant size of 144 bytes. -// 128 bytes for the secret key, address and public key, and 16 bytes padding to follow PKCS#7 -const OUTGOING_BODY_SIZE = 144; -/** - * A class which wraps event data which is pushed on L1. - */ -export abstract class L1Payload { - /** - * Serializes the L1EventPayload object into a Buffer. - * @returns Buffer representation of the L1EventPayload object. - */ - abstract toBuffer(): Buffer; - - /** - * Encrypts an event payload for a given recipient and sender. - * Creates an incoming log the recipient using the recipient's ivsk, and - * an outgoing log for the sender using the sender's ovsk. - * - * @param ephSk - An ephemeral secret key used for the encryption - * @param recipient - The recipient address, retrievable by the sender for his logs - * @param ivpk - The incoming viewing public key of the recipient - * @param ovKeys - The outgoing viewing keys of the sender - * @returns A buffer containing the encrypted log payload - * @throws If the ivpk is zero. - */ - protected _encrypt( - contractAddress: AztecAddress, - ephSk: GrumpkinScalar, - recipient: AztecAddress, - ivpk: PublicKey, - ovKeys: KeyValidationRequest, - incomingBody: T, - ) { - if (ivpk.isZero()) { - throw new Error(`Attempting to encrypt an event log with a zero ivpk.`); - } - - const ephPk = derivePublicKeyFromSecretKey(ephSk); - - const header = new EncryptedLogHeader(contractAddress); - - const incomingHeaderCiphertext = header.computeCiphertext(ephSk, ivpk); - const outgoingHeaderCiphertext = header.computeCiphertext(ephSk, ovKeys.pkM); - - const incomingBodyCiphertext = incomingBody.computeCiphertext(ephSk, ivpk); - - const outgoingBodyCiphertext = new EncryptedLogOutgoingBody(ephSk, recipient, ivpk).computeCiphertext( - ovKeys.skAppAsGrumpkinScalar, - ephPk, - ); - - return Buffer.concat([ - ephPk.toCompressedBuffer(), - incomingHeaderCiphertext, - outgoingHeaderCiphertext, - outgoingBodyCiphertext, - incomingBodyCiphertext, - ]); - } - - /** - * Decrypts a ciphertext as an incoming log. - * - * This is executable by the recipient of the event, and uses the ivsk to decrypt the payload. - * The outgoing parts of the log are ignored entirely. - * - * Produces the same output as `decryptAsOutgoing`. - * - * @param encryptedLog - The encrypted log. This encrypted log is assumed to always have tags. - * @param ivsk - The incoming viewing secret key, used to decrypt the logs - * @returns The decrypted log payload - */ - protected static _decryptAsIncoming( - data: Buffer, - ivsk: GrumpkinScalar, - fromCiphertext: (incomingBodySlice: Buffer, ivsk: GrumpkinScalar, ephPk: Point) => T, - ): [AztecAddress, T] { - const reader = BufferReader.asReader(data); - - const ephPk = Point.fromCompressedBuffer(reader.readBytes(Point.COMPRESSED_SIZE_IN_BYTES)); - - const incomingHeader = EncryptedLogHeader.fromCiphertext(reader.readBytes(HEADER_SIZE), ivsk, ephPk); - - // Skipping the outgoing header and body - reader.readBytes(HEADER_SIZE); - reader.readBytes(OUTGOING_BODY_SIZE); - - // The incoming can be of variable size, so we read until the end - const incomingBodySlice = reader.readToEnd(); - - const incomingBody = fromCiphertext(incomingBodySlice, ivsk, ephPk); - - return [incomingHeader.address, incomingBody]; - } - - /** - * Decrypts a ciphertext as an outgoing log. - * - * This is executable by the sender of the event, and uses the ovsk to decrypt the payload. - * The outgoing parts are decrypted to retrieve information that allows the sender to - * decrypt the incoming log, and learn about the event contents. - * - * Produces the same output as `decryptAsIncoming`. - * - * @param ciphertext - The ciphertext for the log - * @param ovsk - The outgoing viewing secret key, used to decrypt the logs - * @returns The decrypted log payload - */ - protected static _decryptAsOutgoing( - data: Buffer, - ovsk: GrumpkinScalar, - fromCiphertext: (incomingBodySlice: Buffer, ivsk: GrumpkinScalar, ephPk: Point) => T, - ): [AztecAddress, T] { - const reader = BufferReader.asReader(data); - - const ephPk = Point.fromCompressedBuffer(reader.readBytes(Point.COMPRESSED_SIZE_IN_BYTES)); - - reader.readBytes(HEADER_SIZE); - - const outgoingHeader = EncryptedLogHeader.fromCiphertext(reader.readBytes(HEADER_SIZE), ovsk, ephPk); - - const ovskApp = computeOvskApp(ovsk, outgoingHeader.address); - const outgoingBody = EncryptedLogOutgoingBody.fromCiphertext(reader.readBytes(OUTGOING_BODY_SIZE), ovskApp, ephPk); - - // The incoming can be of variable size, so we read until the end - const incomingBodySlice = reader.readToEnd(); - - const incomingBody = fromCiphertext(incomingBodySlice, outgoingBody.ephSk, outgoingBody.recipientIvpk); - - return [outgoingHeader.address, incomingBody]; - } - - protected static ensureMatchedMaskedContractAddress( - contractAddress: AztecAddress, - randomness: Fr, - maskedContractAddress: Fr, - ) { - if (!poseidon2HashWithSeparator([contractAddress, randomness], 0).equals(maskedContractAddress)) { - throw new Error( - 'The provided masked contract address does not match with the incoming address from header and randomness from body', - ); - } - } -} diff --git a/yarn-project/circuit-types/src/logs/l1_payload/encryption_utils.ts b/yarn-project/circuit-types/src/logs/l1_payload/shared_secret_derivation.ts similarity index 57% rename from yarn-project/circuit-types/src/logs/l1_payload/encryption_utils.ts rename to yarn-project/circuit-types/src/logs/l1_payload/shared_secret_derivation.ts index 0367f87cb4c..e9e3ea5caff 100644 --- a/yarn-project/circuit-types/src/logs/l1_payload/encryption_utils.ts +++ b/yarn-project/circuit-types/src/logs/l1_payload/shared_secret_derivation.ts @@ -1,6 +1,6 @@ import { GeneratorIndex, type GrumpkinScalar, type PublicKey } from '@aztec/circuits.js'; import { Grumpkin } from '@aztec/circuits.js/barretenberg'; -import { sha256 } from '@aztec/foundation/crypto'; +import { poseidon2HashWithSeparator, sha256 } from '@aztec/foundation/crypto'; import { numToUInt8 } from '@aztec/foundation/serialize'; /** @@ -16,7 +16,7 @@ import { numToUInt8 } from '@aztec/foundation/serialize'; * TODO(#5726): This function is called point_to_symmetric_key in Noir. I don't like that name much since point is not * the only input of the function. Unify naming once we have a better name. */ -export function deriveAESSecret(secretKey: GrumpkinScalar, publicKey: PublicKey): Buffer { +export function deriveDiffieHellmanAESSecret(secretKey: GrumpkinScalar, publicKey: PublicKey): Buffer { if (publicKey.isZero()) { throw new Error( `Attempting to derive AES secret with a zero public key. You have probably passed a zero public key in your Noir code somewhere thinking that the note won't broadcasted... but it was.`, @@ -28,3 +28,21 @@ export function deriveAESSecret(secretKey: GrumpkinScalar, publicKey: PublicKey) const hash = sha256(secretBuffer); return hash; } + +/** + * Derives an AES symmetric key from the app siloed outgoing viewing secret key + * and the ephemeral public key using poseidon. + * + * @param ovskApp - The app siloed outgoing viewing secret key + * @param ephPk - The ephemeral public key + * @returns The derived AES symmetric key + */ +export function derivePoseidonAESSecret(ovskApp: GrumpkinScalar, ephPk: PublicKey) { + // For performance reasons, we do NOT use the usual `deriveAESSecret` function here and instead we compute it using + // poseidon. Note that we can afford to use poseidon here instead of deriving shared secret using Diffie-Hellman + // because for outgoing we are encrypting for ourselves and hence we don't need to perform a key exchange. + return poseidon2HashWithSeparator( + [ovskApp.hi, ovskApp.lo, ephPk.x, ephPk.y], + GeneratorIndex.SYMMETRIC_KEY, + ).toBuffer(); +} diff --git a/yarn-project/circuit-types/src/logs/l1_payload/tagged_log.test.ts b/yarn-project/circuit-types/src/logs/l1_payload/tagged_log.test.ts deleted file mode 100644 index b97d84705d2..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/tagged_log.test.ts +++ /dev/null @@ -1,224 +0,0 @@ -import { AztecAddress, KeyValidationRequest, computeOvskApp, derivePublicKeyFromSecretKey } from '@aztec/circuits.js'; -import { EventSelector, NoteSelector } from '@aztec/foundation/abi'; -import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto'; -import { Fr, GrumpkinScalar } from '@aztec/foundation/fields'; -import { updateInlineTestData } from '@aztec/foundation/testing'; - -import { EncryptedL2Log } from '../encrypted_l2_log.js'; -import { L1EventPayload } from './l1_event_payload.js'; -import { L1NotePayload } from './l1_note_payload.js'; -import { Event, Note } from './payload.js'; -import { TaggedLog } from './tagged_log.js'; - -describe('L1 Note Payload', () => { - it('convert to and from buffer', () => { - const payload = L1NotePayload.random(); - const taggedLog = new TaggedLog(payload); - const buf = taggedLog.toBuffer(); - expect(TaggedLog.fromBuffer(buf).payload).toEqual(taggedLog.payload); - }); - - describe('encrypt and decrypt a full log', () => { - let ovskM: GrumpkinScalar; - let ivskM: GrumpkinScalar; - - let taggedLog: TaggedLog; - let encrypted: Buffer; - - beforeAll(() => { - const payload = L1NotePayload.random(); - - ovskM = GrumpkinScalar.random(); - ivskM = GrumpkinScalar.random(); - - const ovKeys = getKeyValidationRequest(ovskM, payload.contractAddress); - - const ephSk = GrumpkinScalar.random(); - - const recipientAddress = AztecAddress.random(); - const ivpk = derivePublicKeyFromSecretKey(ivskM); - - taggedLog = new TaggedLog(payload); - - encrypted = taggedLog.encrypt(ephSk, recipientAddress, ivpk, ovKeys); - }); - - it('decrypt a log as incoming', () => { - const recreated = TaggedLog.decryptAsIncoming(encrypted, ivskM); - - expect(recreated?.toBuffer()).toEqual(taggedLog.toBuffer()); - }); - - it('decrypt a log as outgoing', () => { - const recreated = TaggedLog.decryptAsOutgoing(encrypted, ovskM); - - expect(recreated?.toBuffer()).toEqual(taggedLog.toBuffer()); - }); - }); - - it('encrypted tagged log matches Noir', () => { - // All the values in this test were arbitrarily set and copied over to `payload.nr` - const contract = AztecAddress.fromString('0x10f48cd9eff7ae5b209c557c70de2e657ee79166868676b787e9417e19260e04'); - const storageSlot = new Fr(0x0fe46be583b71f4ab5b70c2657ff1d05cccf1d292a9369628d1a194f944e6599n); - const noteValue = new Fr(0x301640ceea758391b2e161c92c0513f129020f4125256afdae2646ce31099f5cn); - const noteTypeId = new NoteSelector(4135); // note type id of mock_note.nr - - const payload = new L1NotePayload(new Note([noteValue]), contract, storageSlot, noteTypeId); - - const ovskM = new GrumpkinScalar(0x06b76394ac57b8a18ceb08b14ed15b5b778d5c506b4cfb7edc203324eab27c05n); - const ivskM = new GrumpkinScalar(0x03fd94b1101e834e829cda4f227043f60490b5c7b3073875f5bfbe5028ed05ccn); - - const ovKeys = getKeyValidationRequest(ovskM, payload.contractAddress); - - const ephSk = new GrumpkinScalar(0x1358d15019d4639393d62b97e1588c095957ce74a1c32d6ec7d62fe6705d9538n); - - const recipientAddress = AztecAddress.fromString( - '0x10ee41ee4b62703b16f61e03cb0d88c4b306a9eb4a6ceeb2aff13428541689a2', - ); - - const ivpk = derivePublicKeyFromSecretKey(ivskM); - - const taggedLog = new TaggedLog(payload, new Fr(0), new Fr(0)); - - const encrypted = taggedLog.encrypt(ephSk, recipientAddress, ivpk, ovKeys).toString('hex'); - - expect(encrypted).toMatchInlineSnapshot( - `"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d460c0e434d846ec1ea286e4090eb56376ff27bddc1aacae1d856549f701fa77e4f33ba2f47fdac6370f13bc5f16bbae857bbe6ab3ee4ea2a339192eef22a47ce0df4426fc314cb6294ccf291b79c1d8d362cdcc223e51020ccd3318e7052ca74f1fe922ad914bd46e4b6abcd681b63ab1c5bf4151e82f00548ae7c61c59df8c117c14c2e8d9046d32d43a7da818c68be296ef9d1446a87a450eb3f6550200d2663915b0bad97e7f7419975e5a740efb67eeb5304a90808a004ebfc156054a1459191d7fea175f6c64159b3c25a13790cca7250c30e3c80698e64565a6c9ddb16ac1479c3199fec02464b2a252202119514b02012cc387579220f03587b40444ae93f3b83dec2c0a76ed90a804981accd67d43c978d0a97de97b42b5b94c96ea50aee2086eb63d8c8b61f169c12d1deacefc1d456633e46b62daff15bcab3e1ec5f474297e1cb35d8556682060819b4563a8cc66966b12a5e73f7919318e727491b0adb8273bc4a7205b1c753b76a57cceee7482df027ae196235bb9c9ff426"`, - ); - - const byteArrayString = `[${encrypted.match(/.{1,2}/g)!.map(byte => parseInt(byte, 16))}]`; - - // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data - updateInlineTestData( - 'noir-projects/aztec-nr/aztec/src/encrypted_logs/payload.nr', - 'encrypted_note_log_from_typescript', - byteArrayString, - ); - }); - - it('encrypted tagged log of finalized partial note matches Noir', () => { - const numPublicValues = 2; - - // All the values in this test were arbitrarily set and copied over to `payload.nr` - const contract = AztecAddress.fromString('0x10f48cd9eff7ae5b209c557c70de2e657ee79166868676b787e9417e19260e04'); - const storageSlot = new Fr(0x0fe46be583b71f4ab5b70c2657ff1d05cccf1d292a9369628d1a194f944e6599n); - const noteValue = new Fr(0x301640ceea758391b2e161c92c0513f129020f4125256afdae2646ce31099f5cn); - const notePublicValue1 = new Fr(0x14172339287e8d281545c177313f02b6aa2fedfd628cfd8b7f11a136fd0d6557n); - const notePublicValue2 = new Fr(0x0834d81e3f73c7e2809b08ae38600ffc76a2554473eeab6de7bff4b33a84feacn); - const noteTypeId = new NoteSelector(4135); // note type id of mock_note.nr - - const payload = new L1NotePayload(new Note([noteValue]), contract, storageSlot, noteTypeId); - - const ovskM = new GrumpkinScalar(0x06b76394ac57b8a18ceb08b14ed15b5b778d5c506b4cfb7edc203324eab27c05n); - const ivskM = new GrumpkinScalar(0x03fd94b1101e834e829cda4f227043f60490b5c7b3073875f5bfbe5028ed05ccn); - - const ovKeys = getKeyValidationRequest(ovskM, payload.contractAddress); - - const ephSk = new GrumpkinScalar(0x1358d15019d4639393d62b97e1588c095957ce74a1c32d6ec7d62fe6705d9538n); - - const recipientAddress = AztecAddress.fromString( - '0x10ee41ee4b62703b16f61e03cb0d88c4b306a9eb4a6ceeb2aff13428541689a2', - ); - - const ivpk = derivePublicKeyFromSecretKey(ivskM); - - const taggedLog = new TaggedLog(payload, new Fr(0), new Fr(0)); - - // We manually update the log because modifying encrypt func to support public values would just polute the code - // because it is never used in prod --> the encrypt functionality is only evner used without the public values. - const encryptedBuf = taggedLog.encrypt(ephSk, recipientAddress, ivpk, ovKeys); - - // We update the encrypted buffer with the public values - encryptedBuf[64] = numPublicValues; - const encryptedBufWithPublicValues = Buffer.concat([ - encryptedBuf, - notePublicValue1.toBuffer(), - notePublicValue2.toBuffer(), - ]); - - const encrypted = encryptedBufWithPublicValues.toString('hex'); - - expect(encrypted).toMatchInlineSnapshot( - `"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028d460c0e434d846ec1ea286e4090eb56376ff27bddc1aacae1d856549f701fa77e4f33ba2f47fdac6370f13bc5f16bbae857bbe6ab3ee4ea2a339192eef22a47ce0df4426fc314cb6294ccf291b79c1d8d362cdcc223e51020ccd3318e7052ca74f1fe922ad914bd46e4b6abcd681b63ab1c5bf4151e82f00548ae7c61c59df8c117c14c2e8d9046d32d43a7da818c68be296ef9d1446a87a450eb3f6550200d2663915b0bad97e7f7419975e5a740efb67eeb5304a90808a004ebfc156054a1459191d7fea175f6c64159b3c25a13790cca7250c30e3c80698e64565a6c9ddb16ac1479c3199fec02464b2a252202119514b02012cc387579220f03587b40444ae93f3b83dec2c0a76ed90a804981accd67d43c978d0a97de97b42b5b94c96ea50aee2086eb63d8c8b61f169c12d1deacefc1d456633e46b62daff15bcab3e1ec5f474297e1cb35d8556682060819b4563a8cc66966b12a5e73f7919318e727491b0adb8273bc4a7205b1c753b76a57cceee7482df027ae196235bb9c9ff42614172339287e8d281545c177313f02b6aa2fedfd628cfd8b7f11a136fd0d65570834d81e3f73c7e2809b08ae38600ffc76a2554473eeab6de7bff4b33a84feac"`, - ); - - const byteArrayString = `[${encrypted.match(/.{1,2}/g)!.map(byte => parseInt(byte, 16))}]`; - - // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data - updateInlineTestData( - 'noir-projects/aztec-nr/aztec/src/encrypted_logs/payload.nr', - 'encrypted_note_log_of_finalized_partial_from_typescript', - byteArrayString, - ); - }); - - const getKeyValidationRequest = (ovskM: GrumpkinScalar, app: AztecAddress) => { - const ovskApp = computeOvskApp(ovskM, app); - const ovpkM = derivePublicKeyFromSecretKey(ovskM); - - return new KeyValidationRequest(ovpkM, ovskApp); - }; -}); - -describe('L1 Event Payload', () => { - it('convert to and from buffer', () => { - const payload = L1EventPayload.random(); - const taggedLog = new TaggedLog(payload); - const buf = taggedLog.toBuffer(); - expect(TaggedLog.fromBuffer(buf, L1EventPayload).payload).toEqual(taggedLog.payload); - }); - - describe('encrypt and decrypt a full log', () => { - let ovskM: GrumpkinScalar; - let ivskM: GrumpkinScalar; - - let taggedLog: TaggedLog; - let encrypted: Buffer; - let maskedContractAddress: AztecAddress; - let contractAddress: AztecAddress; - let randomness: Fr; - let encryptedL2Log: EncryptedL2Log; - - beforeAll(() => { - contractAddress = AztecAddress.random(); - randomness = Fr.random(); - maskedContractAddress = poseidon2HashWithSeparator([contractAddress, randomness], 0); - - const payload = new L1EventPayload(Event.random(), contractAddress, randomness, EventSelector.random()); - - ovskM = GrumpkinScalar.random(); - ivskM = GrumpkinScalar.random(); - - const ovKeys = getKeyValidationRequest(ovskM, payload.contractAddress); - - const ephSk = GrumpkinScalar.random(); - - const recipientAddress = AztecAddress.random(); - const ivpk = derivePublicKeyFromSecretKey(ivskM); - - taggedLog = new TaggedLog(payload); - - encrypted = taggedLog.encrypt(ephSk, recipientAddress, ivpk, ovKeys); - encryptedL2Log = new EncryptedL2Log(encrypted, maskedContractAddress); - }); - - it('decrypt a log as incoming', () => { - const recreated = TaggedLog.decryptAsIncoming(encryptedL2Log, ivskM, L1EventPayload); - - expect(recreated?.toBuffer()).toEqual(taggedLog.toBuffer()); - }); - - it('decrypt a log as outgoing', () => { - const recreated = TaggedLog.decryptAsOutgoing(encryptedL2Log, ovskM, L1EventPayload); - - expect(recreated?.toBuffer()).toEqual(taggedLog.toBuffer()); - }); - }); - - const getKeyValidationRequest = (ovskM: GrumpkinScalar, app: AztecAddress) => { - const ovskApp = computeOvskApp(ovskM, app); - const ovpkM = derivePublicKeyFromSecretKey(ovskM); - - return new KeyValidationRequest(ovpkM, ovskApp); - }; -}); diff --git a/yarn-project/circuit-types/src/logs/l1_payload/tagged_log.ts b/yarn-project/circuit-types/src/logs/l1_payload/tagged_log.ts deleted file mode 100644 index 70568c08ad6..00000000000 --- a/yarn-project/circuit-types/src/logs/l1_payload/tagged_log.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { AztecAddress, type GrumpkinScalar, type KeyValidationRequest, type PublicKey } from '@aztec/circuits.js'; -import { Fr, NotOnCurveError } from '@aztec/foundation/fields'; -import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; - -import { type EncryptedL2Log } from '../encrypted_l2_log.js'; -import { L1EventPayload } from './l1_event_payload.js'; -import { L1NotePayload } from './l1_note_payload.js'; - -// placeholder value until tagging is implemented -const PLACEHOLDER_TAG = new Fr(33); - -/** - * Encrypted log payload with a tag used for retrieval by clients. - */ -export class TaggedLog { - constructor(public payload: Payload, public incomingTag = PLACEHOLDER_TAG, public outgoingTag = PLACEHOLDER_TAG) {} - - /** - * Deserializes the TaggedLog object from a Buffer. - * @param buffer - Buffer or BufferReader object to deserialize. - * @returns An instance of TaggedLog. - */ - static fromBuffer(buffer: Buffer | BufferReader, payloadType: typeof L1EventPayload): TaggedLog; - static fromBuffer(buffer: Buffer | BufferReader, payloadType?: typeof L1NotePayload): TaggedLog; - static fromBuffer( - buffer: Buffer | BufferReader, - payloadType: typeof L1NotePayload | typeof L1EventPayload = L1NotePayload, - ) { - const reader = BufferReader.asReader(buffer); - const incomingTag = Fr.fromBuffer(reader); - const outgoingTag = Fr.fromBuffer(reader); - const payload = - payloadType === L1NotePayload ? L1NotePayload.fromBuffer(reader) : L1EventPayload.fromBuffer(reader); - - return new TaggedLog(payload, incomingTag, outgoingTag); - } - - /** - * Serializes the TaggedLog object into a Buffer. - * @returns Buffer representation of the TaggedLog object (unencrypted). - */ - public toBuffer(): Buffer { - return serializeToBuffer(this.incomingTag, this.outgoingTag, this.payload); - } - - static random(payloadType?: typeof L1NotePayload, contract?: AztecAddress): TaggedLog; - static random(payloadType: typeof L1EventPayload): TaggedLog; - static random( - payloadType: typeof L1NotePayload | typeof L1EventPayload = L1NotePayload, - contract = AztecAddress.random(), - ): TaggedLog { - return payloadType === L1NotePayload - ? new TaggedLog(L1NotePayload.random(contract)) - : new TaggedLog(L1EventPayload.random()); - } - - public encrypt( - ephSk: GrumpkinScalar, - recipient: AztecAddress, - ivpk: PublicKey, - ovKeys: KeyValidationRequest, - ): Buffer { - return serializeToBuffer(this.incomingTag, this.outgoingTag, this.payload.encrypt(ephSk, recipient, ivpk, ovKeys)); - } - - static decryptAsIncoming( - encryptedLog: EncryptedL2Log, - ivsk: GrumpkinScalar, - payloadType: typeof L1EventPayload, - ): TaggedLog | undefined; - static decryptAsIncoming( - data: Buffer | bigint[], - ivsk: GrumpkinScalar, - payloadType?: typeof L1NotePayload, - ): TaggedLog | undefined; - static decryptAsIncoming( - data: Buffer | bigint[] | EncryptedL2Log, - ivsk: GrumpkinScalar, - payloadType: typeof L1NotePayload | typeof L1EventPayload = L1NotePayload, - ): TaggedLog | undefined { - try { - if (payloadType === L1EventPayload) { - const reader = BufferReader.asReader((data as EncryptedL2Log).data); - const incomingTag = Fr.fromBuffer(reader); - const outgoingTag = Fr.fromBuffer(reader); - // We must pass the entire encrypted log in. The tags are not stripped here from the original data - const payload = L1EventPayload.decryptAsIncoming(data as EncryptedL2Log, ivsk); - return new TaggedLog(payload, incomingTag, outgoingTag); - } else { - const input = Buffer.isBuffer(data) ? data : Buffer.from((data as bigint[]).map((x: bigint) => Number(x))); - const reader = BufferReader.asReader(input); - const incomingTag = Fr.fromBuffer(reader); - const outgoingTag = Fr.fromBuffer(reader); - const payload = L1NotePayload.decryptAsIncoming(reader.readToEnd(), ivsk); - return new TaggedLog(payload, incomingTag, outgoingTag); - } - } catch (e: any) { - // Following error messages are expected to occur when decryption fails - if ( - !(e instanceof NotOnCurveError) && - !e.message.endsWith('is greater or equal to field modulus.') && - !e.message.startsWith('Invalid AztecAddress length') && - !e.message.startsWith('Selector must fit in') && - !e.message.startsWith('Attempted to read beyond buffer length') - ) { - // If we encounter an unexpected error, we rethrow it - throw e; - } - return; - } - } - - static decryptAsOutgoing( - encryptedLog: EncryptedL2Log, - ivsk: GrumpkinScalar, - payloadType: typeof L1EventPayload, - ): TaggedLog | undefined; - static decryptAsOutgoing( - data: Buffer | bigint[], - ivsk: GrumpkinScalar, - payloadType?: typeof L1NotePayload, - ): TaggedLog | undefined; - static decryptAsOutgoing( - data: Buffer | bigint[] | EncryptedL2Log, - ovsk: GrumpkinScalar, - payloadType: typeof L1NotePayload | typeof L1EventPayload = L1NotePayload, - ) { - try { - if (payloadType === L1EventPayload) { - const reader = BufferReader.asReader((data as EncryptedL2Log).data); - const incomingTag = Fr.fromBuffer(reader); - const outgoingTag = Fr.fromBuffer(reader); - const payload = L1EventPayload.decryptAsOutgoing(data as EncryptedL2Log, ovsk); - return new TaggedLog(payload, incomingTag, outgoingTag); - } else { - const input = Buffer.isBuffer(data) ? data : Buffer.from((data as bigint[]).map((x: bigint) => Number(x))); - const reader = BufferReader.asReader(input); - const incomingTag = Fr.fromBuffer(reader); - const outgoingTag = Fr.fromBuffer(reader); - const payload = L1NotePayload.decryptAsOutgoing(reader.readToEnd(), ovsk); - return new TaggedLog(payload, incomingTag, outgoingTag); - } - } catch (e: any) { - // Following error messages are expected to occur when decryption fails - if ( - !(e instanceof NotOnCurveError) && - !e.message.endsWith('is greater or equal to field modulus.') && - !e.message.startsWith('Invalid AztecAddress length') && - !e.message.startsWith('Selector must fit in') && - !e.message.startsWith('Attempted to read beyond buffer length') - ) { - // If we encounter an unexpected error, we rethrow it - throw e; - } - return; - } - } -} diff --git a/yarn-project/circuit-types/src/mocks.ts b/yarn-project/circuit-types/src/mocks.ts index db9c3bc9f87..5c86312a170 100644 --- a/yarn-project/circuit-types/src/mocks.ts +++ b/yarn-project/circuit-types/src/mocks.ts @@ -2,6 +2,7 @@ import { AztecAddress, CallContext, ClientIvcProof, + EthAddress, GasSettings, LogHash, MAX_ENCRYPTED_LOGS_PER_TX, @@ -27,12 +28,15 @@ import { import { type ContractArtifact, NoteSelector } from '@aztec/foundation/abi'; import { makeTuple } from '@aztec/foundation/array'; import { padArrayEnd, times } from '@aztec/foundation/collection'; -import { randomBytes } from '@aztec/foundation/crypto'; +import { randomBigInt, randomBytes, randomInt } from '@aztec/foundation/crypto'; +import { Signature } from '@aztec/foundation/eth-signature'; import { Fr } from '@aztec/foundation/fields'; import { type ContractInstanceWithAddress, SerializableContractInstance } from '@aztec/types/contracts'; import { EncryptedNoteTxL2Logs, EncryptedTxL2Logs, Note, UnencryptedTxL2Logs } from './logs/index.js'; import { ExtendedNote, UniqueNote } from './notes/index.js'; +import { EpochProofQuote } from './prover_coordination/epoch_proof_quote.js'; +import { EpochProofQuotePayload } from './prover_coordination/epoch_proof_quote_payload.js'; import { PublicExecutionRequest } from './public_execution_request.js'; import { NestedProcessReturnValues, PublicSimulationOutput, SimulatedTx, Tx, TxHash } from './tx/index.js'; @@ -223,6 +227,24 @@ export const mockSimulatedTx = (seed = 1, hasLogs = true) => { return new SimulatedTx(tx, dec, output); }; +export const mockEpochProofQuote = ( + epochToProve: bigint, + validUntilSlot?: bigint, + bondAmount?: bigint, + proverAddress?: EthAddress, + basisPointFee?: number, +) => { + const quotePayload: EpochProofQuotePayload = new EpochProofQuotePayload( + epochToProve, + validUntilSlot ?? randomBigInt(10000n), + bondAmount ?? randomBigInt(10000n) + 1000n, + proverAddress ?? EthAddress.random(), + basisPointFee ?? randomInt(100), + ); + const sig: Signature = Signature.empty(); + return new EpochProofQuote(quotePayload, sig); +}; + export const randomContractArtifact = (): ContractArtifact => ({ name: randomBytes(4).toString('hex'), functions: [], diff --git a/yarn-project/circuit-types/src/prover_coordination/epoch_proof_claim.ts b/yarn-project/circuit-types/src/prover_coordination/epoch_proof_claim.ts new file mode 100644 index 00000000000..3c41f0b00df --- /dev/null +++ b/yarn-project/circuit-types/src/prover_coordination/epoch_proof_claim.ts @@ -0,0 +1,9 @@ +import { type EthAddress } from '@aztec/circuits.js'; + +export type EpochProofClaim = { + epochToProve: bigint; + basisPointFee: bigint; + bondAmount: bigint; + bondProvider: EthAddress; + proposerClaimant: EthAddress; +}; diff --git a/yarn-project/circuit-types/src/prover_coordination/epoch_proof_quote.test.ts b/yarn-project/circuit-types/src/prover_coordination/epoch_proof_quote.test.ts index c62995559ef..104188a2350 100644 --- a/yarn-project/circuit-types/src/prover_coordination/epoch_proof_quote.test.ts +++ b/yarn-project/circuit-types/src/prover_coordination/epoch_proof_quote.test.ts @@ -1,24 +1,17 @@ import { EthAddress } from '@aztec/circuits.js'; -import { Secp256k1Signer } from '@aztec/foundation/crypto'; -import { EpochProofQuote } from './epoch_proof_quote.js'; import { EpochProofQuotePayload } from './epoch_proof_quote_payload.js'; describe('epoch proof quote', () => { it('should serialize / deserialize', () => { - const signer = Secp256k1Signer.random(); - const payload = EpochProofQuotePayload.fromFields({ + const payload = EpochProofQuotePayload.from({ basisPointFee: 5000, bondAmount: 1000000000000000000n, epochToProve: 42n, - rollupAddress: EthAddress.random(), + prover: EthAddress.random(), validUntilSlot: 100n, }); - const quote = EpochProofQuote.new(payload, signer); - - expect(EpochProofQuote.fromBuffer(quote.toBuffer())).toEqual(quote); - - expect(quote.senderAddress).toEqual(signer.address); + expect(EpochProofQuotePayload.fromBuffer(payload.toBuffer())).toEqual(payload); }); }); diff --git a/yarn-project/circuit-types/src/prover_coordination/epoch_proof_quote.ts b/yarn-project/circuit-types/src/prover_coordination/epoch_proof_quote.ts index d5c2f40e296..7bfd6070bd2 100644 --- a/yarn-project/circuit-types/src/prover_coordination/epoch_proof_quote.ts +++ b/yarn-project/circuit-types/src/prover_coordination/epoch_proof_quote.ts @@ -1,20 +1,16 @@ -import { type EthAddress } from '@aztec/circuits.js'; import { Buffer32 } from '@aztec/foundation/buffer'; -import { type Secp256k1Signer, recoverAddress } from '@aztec/foundation/crypto'; +import { type Secp256k1Signer } from '@aztec/foundation/crypto'; import { Signature } from '@aztec/foundation/eth-signature'; import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; import { type FieldsOf } from '@aztec/foundation/types'; import { Gossipable } from '../p2p/gossipable.js'; -import { getHashedSignaturePayloadEthSignedMessage } from '../p2p/signature_utils.js'; import { TopicType, createTopicString } from '../p2p/topic_type.js'; import { EpochProofQuotePayload } from './epoch_proof_quote_payload.js'; export class EpochProofQuote extends Gossipable { static override p2pTopic: string = createTopicString(TopicType.epoch_proof_quote); - private sender: EthAddress | undefined; - constructor(public readonly payload: EpochProofQuotePayload, public readonly signature: Signature) { super(); } @@ -36,20 +32,29 @@ export class EpochProofQuote extends Gossipable { return new EpochProofQuote(reader.readObject(EpochProofQuotePayload), reader.readObject(Signature)); } - static new(payload: EpochProofQuotePayload, signer: Secp256k1Signer): EpochProofQuote { - const digest = getHashedSignaturePayloadEthSignedMessage(payload); + // TODO: https://github.com/AztecProtocol/aztec-packages/issues/8911 + /** + * Creates a new quote with a signature. + * The digest provided must match what the rollup contract will produce i.e. `_hashTypedDataV4(EpochProofQuoteLib.hash(quote))` + * + * @param digest the digest of the payload that should be signed + * @param payload the actual quote + * @param signer the signer + * @returns a quote with an accompanying signature + */ + static new(digest: Buffer32, payload: EpochProofQuotePayload, signer: Secp256k1Signer): EpochProofQuote { + if (!payload.prover.equals(signer.address)) { + throw new Error(`Quote prover does not match signer. Prover [${payload.prover}], Signer [${signer.address}]`); + } const signature = signer.sign(digest); - return new EpochProofQuote(payload, signature); + const quote = new EpochProofQuote(payload, signature); + return quote; } - get senderAddress(): EthAddress { - if (!this.sender) { - const hashed = getHashedSignaturePayloadEthSignedMessage(this.payload); - - // Cache the sender for later use - this.sender = recoverAddress(hashed, this.signature); - } - - return this.sender; + toViemArgs() { + return { + quote: this.payload.toViemArgs(), + signature: this.signature.toViemSignature(), + }; } } diff --git a/yarn-project/circuit-types/src/prover_coordination/epoch_proof_quote_payload.ts b/yarn-project/circuit-types/src/prover_coordination/epoch_proof_quote_payload.ts index bd0c92fcdc7..9555df73920 100644 --- a/yarn-project/circuit-types/src/prover_coordination/epoch_proof_quote_payload.ts +++ b/yarn-project/circuit-types/src/prover_coordination/epoch_proof_quote_payload.ts @@ -2,16 +2,14 @@ import { EthAddress } from '@aztec/circuits.js'; import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; import { type FieldsOf } from '@aztec/foundation/types'; -import { encodeAbiParameters, parseAbiParameters } from 'viem'; +import { inspect } from 'util'; -import { type Signable } from '../p2p/signature_utils.js'; - -export class EpochProofQuotePayload implements Signable { +export class EpochProofQuotePayload { constructor( public readonly epochToProve: bigint, public readonly validUntilSlot: bigint, public readonly bondAmount: bigint, - public readonly rollupAddress: EthAddress, + public readonly prover: EthAddress, public readonly basisPointFee: number, ) {} @@ -20,7 +18,7 @@ export class EpochProofQuotePayload implements Signable { fields.epochToProve, fields.validUntilSlot, fields.bondAmount, - fields.rollupAddress, + fields.prover, fields.basisPointFee, ] as const; } @@ -40,27 +38,33 @@ export class EpochProofQuotePayload implements Signable { ); } - static fromFields(fields: FieldsOf): EpochProofQuotePayload { + static from(fields: FieldsOf): EpochProofQuotePayload { return new EpochProofQuotePayload( fields.epochToProve, fields.validUntilSlot, fields.bondAmount, - fields.rollupAddress, + fields.prover, fields.basisPointFee, ); } - getPayloadToSign(): Buffer { - const abi = parseAbiParameters('uint256, uint256, uint256, address, uint32'); - const encodedData = encodeAbiParameters(abi, [ - this.epochToProve, - this.validUntilSlot, - this.bondAmount, - this.rollupAddress.toString(), - this.basisPointFee, - ] as const); + toViemArgs(): { + epochToProve: bigint; + validUntilSlot: bigint; + bondAmount: bigint; + prover: `0x${string}`; + basisPointFee: number; + } { + return { + epochToProve: this.epochToProve, + validUntilSlot: this.validUntilSlot, + bondAmount: this.bondAmount, + prover: this.prover.toString(), + basisPointFee: this.basisPointFee, + }; + } - // NOTE: trim the first two bytes to get rid of the `0x` prefix - return Buffer.from(encodedData.slice(2), 'hex'); + [inspect.custom](): string { + return `EpochProofQuotePayload { epochToProve: ${this.epochToProve}, validUntilSlot: ${this.validUntilSlot}, bondAmount: ${this.bondAmount}, prover: ${this.prover}, basisPointFee: ${this.basisPointFee} }`; } } diff --git a/yarn-project/circuit-types/src/prover_coordination/index.ts b/yarn-project/circuit-types/src/prover_coordination/index.ts new file mode 100644 index 00000000000..33b8a68050b --- /dev/null +++ b/yarn-project/circuit-types/src/prover_coordination/index.ts @@ -0,0 +1,3 @@ +export * from './epoch_proof_quote.js'; +export * from './epoch_proof_quote_payload.js'; +export * from './epoch_proof_claim.js'; diff --git a/yarn-project/circuit-types/src/stats/stats.ts b/yarn-project/circuit-types/src/stats/stats.ts index 30dcb9f460a..ac2c0ed60a9 100644 --- a/yarn-project/circuit-types/src/stats/stats.ts +++ b/yarn-project/circuit-types/src/stats/stats.ts @@ -77,17 +77,12 @@ export type CircuitName = | 'base-rollup' | 'merge-rollup' | 'block-root-rollup' - | 'block-root-rollup-final' + | 'empty-block-root-rollup' | 'block-merge-rollup' | 'root-rollup' | 'private-kernel-init' | 'private-kernel-inner' - | 'private-kernel-reset-full' - | 'private-kernel-reset-full-inner' - | 'private-kernel-reset-big' - | 'private-kernel-reset-medium' - | 'private-kernel-reset-small' - | 'private-kernel-reset-tiny' + | 'private-kernel-reset' | 'private-kernel-tail' | 'private-kernel-tail-to-public' | 'app-circuit' diff --git a/yarn-project/circuits.js/package.json b/yarn-project/circuits.js/package.json index 524b4a62210..82ea912b59f 100644 --- a/yarn-project/circuits.js/package.json +++ b/yarn-project/circuits.js/package.json @@ -30,8 +30,7 @@ }, "scripts": { "build": "yarn clean && yarn generate && tsc -b", - "generate": "./scripts/copy-contracts.sh && yarn generate:reset-variants", - "generate:reset-variants": "node --no-warnings --loader ts-node/esm src/scripts/generate_reset_variants.ts && prettier -w src/structs/kernel/private_kernel_reset_circuit_private_inputs_variants.ts", + "generate": "./scripts/copy-contracts.sh", "build:dev": "tsc -b --watch", "clean": "rm -rf ./dest .tsbuildinfo", "formatting": "run -T prettier --check ./src && run -T eslint ./src", diff --git a/yarn-project/circuits.js/src/constants.gen.ts b/yarn-project/circuits.js/src/constants.gen.ts index 2737fa9c6c5..04a59f94ae4 100644 --- a/yarn-project/circuits.js/src/constants.gen.ts +++ b/yarn-project/circuits.js/src/constants.gen.ts @@ -18,7 +18,7 @@ export const MAX_NOTE_ENCRYPTED_LOGS_PER_CALL = 16; export const MAX_ENCRYPTED_LOGS_PER_CALL = 4; export const MAX_UNENCRYPTED_LOGS_PER_CALL = 4; export const ARCHIVE_HEIGHT = 16; -export const VK_TREE_HEIGHT = 5; +export const VK_TREE_HEIGHT = 6; export const FUNCTION_TREE_HEIGHT = 5; export const NOTE_HASH_TREE_HEIGHT = 32; export const PUBLIC_DATA_TREE_HEIGHT = 40; @@ -57,29 +57,24 @@ export const MAX_ENCRYPTED_LOGS_PER_TX = 8; export const MAX_UNENCRYPTED_LOGS_PER_TX = 8; export const MAX_PUBLIC_DATA_HINTS = 128; export const NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP = 16; -export const PRIVATE_KERNEL_INIT_INDEX = 0; -export const PRIVATE_KERNEL_INNER_INDEX = 1; -export const PRIVATE_KERNEL_RESET_FULL_INDEX = 2; -export const PRIVATE_KERNEL_RESET_FULL_INNER_INDEX = 3; -export const PRIVATE_KERNEL_RESET_BIG_INDEX = 4; -export const PRIVATE_KERNEL_RESET_MEDIUM_INDEX = 5; -export const PRIVATE_KERNEL_RESET_SMALL_INDEX = 6; -export const PRIVATE_KERNEL_RESET_TINY_INDEX = 7; -export const PRIVATE_KERNEL_TAIL_INDEX = 10; -export const PRIVATE_KERNEL_TAIL_TO_PUBLIC_INDEX = 11; -export const EMPTY_NESTED_INDEX = 12; -export const PRIVATE_KERNEL_EMPTY_INDEX = 13; -export const PUBLIC_KERNEL_INNER_INDEX = 15; -export const PUBLIC_KERNEL_MERGE_INDEX = 16; -export const PUBLIC_KERNEL_TAIL_INDEX = 17; -export const BASE_PARITY_INDEX = 18; -export const ROOT_PARITY_INDEX = 19; -export const BASE_ROLLUP_INDEX = 20; -export const MERGE_ROLLUP_INDEX = 21; -export const BLOCK_ROOT_ROLLUP_INDEX = 22; -export const BLOCK_MERGE_ROLLUP_INDEX = 23; -export const ROOT_ROLLUP_INDEX = 24; -export const BLOCK_ROOT_ROLLUP_FINAL_INDEX = 25; +export const EMPTY_NESTED_INDEX = 0; +export const PRIVATE_KERNEL_EMPTY_INDEX = 1; +export const PRIVATE_KERNEL_INIT_INDEX = 2; +export const PRIVATE_KERNEL_INNER_INDEX = 3; +export const PRIVATE_KERNEL_TAIL_INDEX = 4; +export const PRIVATE_KERNEL_TAIL_TO_PUBLIC_INDEX = 5; +export const PUBLIC_KERNEL_MERGE_INDEX = 6; +export const PUBLIC_KERNEL_TAIL_INDEX = 7; +export const PUBLIC_KERNEL_INNER_INDEX = 8; +export const BASE_PARITY_INDEX = 10; +export const ROOT_PARITY_INDEX = 11; +export const BASE_ROLLUP_INDEX = 12; +export const MERGE_ROLLUP_INDEX = 13; +export const BLOCK_ROOT_ROLLUP_INDEX = 14; +export const BLOCK_MERGE_ROLLUP_INDEX = 15; +export const ROOT_ROLLUP_INDEX = 16; +export const BLOCK_ROOT_ROLLUP_EMPTY_INDEX = 17; +export const PRIVATE_KERNEL_RESET_INDEX = 20; export const FUNCTION_SELECTOR_NUM_BYTES = 4; export const INITIALIZATION_SLOT_SEPARATOR = 1000000000; export const INITIAL_L2_BLOCK_NUM = 1; @@ -197,6 +192,8 @@ export const KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 663; export const CONSTANT_ROLLUP_DATA_LENGTH = 12; export const BASE_OR_MERGE_PUBLIC_INPUTS_LENGTH = 29; export const BLOCK_ROOT_OR_BLOCK_MERGE_PUBLIC_INPUTS_LENGTH = 91; +export const FEE_RECIPIENT_LENGTH = 2; +export const ROOT_ROLLUP_PUBLIC_INPUTS_LENGTH = 75; export const GET_NOTES_ORACLE_RETURN_LENGTH = 674; export const NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP = 2048; export const NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP = 2048; @@ -208,13 +205,14 @@ export const L2_TO_L1_MSGS_NUM_BYTES_PER_BASE_ROLLUP = 256; export const LOGS_HASHES_NUM_BYTES_PER_BASE_ROLLUP = 64; export const NUM_MSGS_PER_BASE_PARITY = 4; export const NUM_BASE_PARITY_PER_ROOT_PARITY = 4; -export const RECURSIVE_PROOF_LENGTH = 439; -export const NESTED_RECURSIVE_PROOF_LENGTH = 439; -export const TUBE_PROOF_LENGTH = 439; +export const RECURSIVE_PROOF_LENGTH = 463; +export const NESTED_RECURSIVE_PROOF_LENGTH = 463; +export const TUBE_PROOF_LENGTH = 463; export const VERIFICATION_KEY_LENGTH_IN_FIELDS = 128; export const AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS = 66; export const AVM_PROOF_LENGTH_IN_FIELDS = 3822; -export const AVM_PUBLIC_COLUMN_MAX_SIZE_LOG2 = 8; +export const AVM_PUBLIC_COLUMN_MAX_SIZE = 1024; +export const AVM_PUBLIC_INPUTS_FLATTENED_SIZE = 2739; export const MEM_TAG_U1 = 1; export const MEM_TAG_U8 = 2; export const MEM_TAG_U16 = 3; diff --git a/yarn-project/circuits.js/src/hash/map_slot.test.ts b/yarn-project/circuits.js/src/hash/map_slot.test.ts index e43047d4b2d..f21df688f33 100644 --- a/yarn-project/circuits.js/src/hash/map_slot.test.ts +++ b/yarn-project/circuits.js/src/hash/map_slot.test.ts @@ -12,7 +12,7 @@ describe('Map slot', () => { const slot = deriveStorageSlotInMap(mapSlot, key); expect(slot.toString()).toMatchInlineSnapshot( - `"0x2499880e2b1b831785c17286f99a0d5122fee784ce7b1c04e380c4a991da819a"`, + `"0x15b9fe39449affd8b377461263e9d2b610b9ad40580553500b4e41d9cbd887ac"`, ); // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data diff --git a/yarn-project/circuits.js/src/hash/map_slot.ts b/yarn-project/circuits.js/src/hash/map_slot.ts index d14b85b0ea9..8ffed794039 100644 --- a/yarn-project/circuits.js/src/hash/map_slot.ts +++ b/yarn-project/circuits.js/src/hash/map_slot.ts @@ -1,4 +1,4 @@ -import { pedersenHash } from '@aztec/foundation/crypto'; +import { poseidon2Hash } from '@aztec/foundation/crypto'; import { type Fr } from '@aztec/foundation/fields'; /** @@ -14,5 +14,5 @@ export function deriveStorageSlotInMap( toField: () => Fr; }, ): Fr { - return pedersenHash([mapSlot, key.toField()]); + return poseidon2Hash([mapSlot, key.toField()]); } diff --git a/yarn-project/circuits.js/src/hints/build_note_hash_read_request_hints.test.ts b/yarn-project/circuits.js/src/hints/build_note_hash_read_request_hints.test.ts index 8117be97c14..ef0a049e2a2 100644 --- a/yarn-project/circuits.js/src/hints/build_note_hash_read_request_hints.test.ts +++ b/yarn-project/circuits.js/src/hints/build_note_hash_read_request_hints.test.ts @@ -75,17 +75,13 @@ describe('buildNoteHashReadRequestHints', () => { }; const buildHints = async () => - ( - await buildNoteHashReadRequestHints( - oracle, - noteHashReadRequests, - noteHashes, - noteHashLeafIndexMap, - MAX_NOTE_HASH_READ_REQUESTS_PER_TX, - MAX_NOTE_HASH_READ_REQUESTS_PER_TX, - futureNoteHashes, - ) - ).hints; + await buildNoteHashReadRequestHints( + oracle, + noteHashReadRequests, + noteHashes, + noteHashLeafIndexMap, + futureNoteHashes, + ); beforeEach(() => { noteHashReadRequests = makeTuple(MAX_NOTE_HASH_READ_REQUESTS_PER_TX, ScopedReadRequest.empty); diff --git a/yarn-project/circuits.js/src/hints/build_note_hash_read_request_hints.ts b/yarn-project/circuits.js/src/hints/build_note_hash_read_request_hints.ts index 8ab5853ab58..7a749b9a9b8 100644 --- a/yarn-project/circuits.js/src/hints/build_note_hash_read_request_hints.ts +++ b/yarn-project/circuits.js/src/hints/build_note_hash_read_request_hints.ts @@ -2,13 +2,16 @@ import { type Tuple } from '@aztec/foundation/serialize'; import { type MAX_NOTE_HASHES_PER_TX, - type MAX_NOTE_HASH_READ_REQUESTS_PER_TX, + MAX_NOTE_HASH_READ_REQUESTS_PER_TX, type NOTE_HASH_TREE_HEIGHT, } from '../constants.gen.js'; import { siloNoteHash } from '../hash/index.js'; import { type MembershipWitness, NoteHashReadRequestHintsBuilder, + PendingReadHint, + ReadRequestResetStates, + ReadRequestState, type ScopedNoteHash, type ScopedReadRequest, } from '../structs/index.js'; @@ -23,20 +26,12 @@ export function isValidNoteHashReadRequest(readRequest: ScopedReadRequest, noteH ); } -export async function buildNoteHashReadRequestHints( - oracle: { - getNoteHashMembershipWitness(leafIndex: bigint): Promise>; - }, +export function getNoteHashReadRequestResetStates( noteHashReadRequests: Tuple, noteHashes: Tuple, - noteHashLeafIndexMap: Map, - sizePending: PENDING, - sizeSettled: SETTLED, futureNoteHashes: ScopedNoteHash[], -) { - const builder = new NoteHashReadRequestHintsBuilder(sizePending, sizeSettled); - - const numReadRequests = countAccumulatedItems(noteHashReadRequests); +): ReadRequestResetStates { + const resetStates = ReadRequestResetStates.empty(MAX_NOTE_HASH_READ_REQUESTS_PER_TX); const noteHashMap: Map = new Map(); getNonEmptyItems(noteHashes).forEach((noteHash, index) => { @@ -48,23 +43,50 @@ export async function buildNoteHashReadRequestHints isValidNoteHashReadRequest(readRequest, n.noteHash)); if (pendingNoteHash !== undefined) { - builder.addPendingReadRequest(i, pendingNoteHash.index); + resetStates.states[i] = ReadRequestState.PENDING; + resetStates.pendingReadHints.push(new PendingReadHint(i, pendingNoteHash.index)); } else if ( !futureNoteHashMap .get(readRequest) .find(futureNoteHash => isValidNoteHashReadRequest(readRequest, futureNoteHash)) ) { - const siloedValue = siloNoteHash(readRequest.contractAddress, value); + resetStates.states[i] = ReadRequestState.SETTLED; + } + } + + return resetStates; +} + +export async function buildNoteHashReadRequestHintsFromResetStates( + oracle: { + getNoteHashMembershipWitness(leafIndex: bigint): Promise>; + }, + noteHashReadRequests: Tuple, + noteHashes: Tuple, + resetStates: ReadRequestResetStates, + noteHashLeafIndexMap: Map, + maxPending: PENDING = MAX_NOTE_HASH_READ_REQUESTS_PER_TX as PENDING, + maxSettled: SETTLED = MAX_NOTE_HASH_READ_REQUESTS_PER_TX as SETTLED, +) { + const builder = new NoteHashReadRequestHintsBuilder(maxPending, maxSettled); + + resetStates.pendingReadHints.forEach(hint => { + builder.addPendingReadRequest(hint.readRequestIndex, hint.pendingValueIndex); + }); + + for (let i = 0; i < resetStates.states.length; i++) { + if (resetStates.states[i] === ReadRequestState.SETTLED) { + const readRequest = noteHashReadRequests[i]; + const siloedValue = siloNoteHash(readRequest.contractAddress, readRequest.value); const leafIndex = noteHashLeafIndexMap.get(siloedValue.toBigInt()); if (leafIndex === undefined) { throw new Error('Read request is reading an unknown note hash.'); @@ -73,5 +95,37 @@ export async function buildNoteHashReadRequestHints = new Map(); + getNonEmptyItems(noteHashes).forEach((noteHash, index) => { + const value = noteHash.value.toBigInt(); + const arr = noteHashMap.get(value) ?? []; + arr.push({ noteHash, index }); + noteHashMap.set(value, arr); + }); + return builder.toHints(); } + +export async function buildNoteHashReadRequestHints( + oracle: { + getNoteHashMembershipWitness(leafIndex: bigint): Promise>; + }, + noteHashReadRequests: Tuple, + noteHashes: Tuple, + noteHashLeafIndexMap: Map, + futureNoteHashes: ScopedNoteHash[], + maxPending: PENDING = MAX_NOTE_HASH_READ_REQUESTS_PER_TX as PENDING, + maxSettled: SETTLED = MAX_NOTE_HASH_READ_REQUESTS_PER_TX as SETTLED, +) { + const resetStates = getNoteHashReadRequestResetStates(noteHashReadRequests, noteHashes, futureNoteHashes); + return await buildNoteHashReadRequestHintsFromResetStates( + oracle, + noteHashReadRequests, + noteHashes, + resetStates, + noteHashLeafIndexMap, + maxPending, + maxSettled, + ); +} diff --git a/yarn-project/circuits.js/src/hints/build_nullifier_read_request_hints.test.ts b/yarn-project/circuits.js/src/hints/build_nullifier_read_request_hints.test.ts index 4561ed2ef42..a852769051e 100644 --- a/yarn-project/circuits.js/src/hints/build_nullifier_read_request_hints.test.ts +++ b/yarn-project/circuits.js/src/hints/build_nullifier_read_request_hints.test.ts @@ -80,16 +80,7 @@ describe('buildNullifierReadRequestHints', () => { }; const buildHints = async () => - ( - await buildNullifierReadRequestHints( - oracle, - nullifierReadRequests, - nullifiers, - MAX_NULLIFIER_READ_REQUESTS_PER_TX, - MAX_NULLIFIER_READ_REQUESTS_PER_TX, - futureNullifiers, - ) - ).hints; + await buildNullifierReadRequestHints(oracle, nullifierReadRequests, nullifiers, futureNullifiers); beforeEach(() => { nullifierReadRequests = makeTuple(MAX_NULLIFIER_READ_REQUESTS_PER_TX, ScopedReadRequest.empty); diff --git a/yarn-project/circuits.js/src/hints/build_nullifier_read_request_hints.ts b/yarn-project/circuits.js/src/hints/build_nullifier_read_request_hints.ts index d9e9672045e..751eac3d9b7 100644 --- a/yarn-project/circuits.js/src/hints/build_nullifier_read_request_hints.ts +++ b/yarn-project/circuits.js/src/hints/build_nullifier_read_request_hints.ts @@ -14,7 +14,10 @@ import { type MembershipWitness, Nullifier, NullifierReadRequestHintsBuilder, + PendingReadHint, ReadRequest, + ReadRequestResetStates, + ReadRequestState, type ScopedNullifier, ScopedReadRequest, } from '../structs/index.js'; @@ -34,20 +37,12 @@ interface NullifierMembershipWitnessWithPreimage { leafPreimage: IndexedTreeLeafPreimage; } -export async function buildNullifierReadRequestHints( - oracle: { - getNullifierMembershipWitness(nullifier: Fr): Promise; - }, +export function getNullifierReadRequestResetStates( nullifierReadRequests: Tuple, nullifiers: Tuple, - sizePending: PENDING, - sizeSettled: SETTLED, futureNullifiers: ScopedNullifier[], - siloed = false, -) { - const builder = new NullifierReadRequestHintsBuilder(sizePending, sizeSettled); - - const numReadRequests = countAccumulatedItems(nullifierReadRequests); +): ReadRequestResetStates { + const resetStates = ReadRequestResetStates.empty(MAX_NULLIFIER_READ_REQUESTS_PER_TX); const nullifierMap: Map = new Map(); getNonEmptyItems(nullifiers).forEach((nullifier, index) => { @@ -59,6 +54,8 @@ export async function buildNullifierReadRequestHints isValidNullifierReadRequest(readRequest, nullifier)); if (pendingNullifier !== undefined) { - builder.addPendingReadRequest(i, pendingNullifier.index); + resetStates.states[i] = ReadRequestState.PENDING; + resetStates.pendingReadHints.push(new PendingReadHint(i, pendingNullifier.index)); } else if ( !futureNullifiersMap .get(readRequest) .some(futureNullifier => isValidNullifierReadRequest(readRequest, futureNullifier)) ) { + resetStates.states[i] = ReadRequestState.SETTLED; + } + } + + return resetStates; +} + +export async function buildNullifierReadRequestHintsFromResetStates( + oracle: { + getNullifierMembershipWitness(nullifier: Fr): Promise; + }, + nullifierReadRequests: Tuple, + resetStates: ReadRequestResetStates, + maxPending: PENDING = MAX_NULLIFIER_READ_REQUESTS_PER_TX as PENDING, + maxSettled: SETTLED = MAX_NULLIFIER_READ_REQUESTS_PER_TX as SETTLED, + siloed = false, +) { + const builder = new NullifierReadRequestHintsBuilder(maxPending, maxSettled); + + resetStates.pendingReadHints.forEach(hint => { + builder.addPendingReadRequest(hint.readRequestIndex, hint.pendingValueIndex); + }); + + for (let i = 0; i < resetStates.states.length; i++) { + if (resetStates.states[i] === ReadRequestState.SETTLED) { + const readRequest = nullifierReadRequests[i]; const siloedValue = siloed ? readRequest.value : siloNullifier(readRequest.contractAddress, readRequest.value); const membershipWitnessWithPreimage = await oracle.getNullifierMembershipWitness(siloedValue); builder.addSettledReadRequest( @@ -81,17 +105,40 @@ export async function buildNullifierReadRequestHints( + oracle: { + getNullifierMembershipWitness(nullifier: Fr): Promise; + }, + nullifierReadRequests: Tuple, + nullifiers: Tuple, + futureNullifiers: ScopedNullifier[], + maxPending: PENDING = MAX_NULLIFIER_READ_REQUESTS_PER_TX as PENDING, + maxSettled: SETTLED = MAX_NULLIFIER_READ_REQUESTS_PER_TX as SETTLED, + siloed = false, +) { + const resetStates = getNullifierReadRequestResetStates(nullifierReadRequests, nullifiers, futureNullifiers); + return await buildNullifierReadRequestHintsFromResetStates( + oracle, + nullifierReadRequests, + resetStates, + maxPending, + maxSettled, + siloed, + ); +} + export function buildSiloedNullifierReadRequestHints( oracle: { getNullifierMembershipWitness(nullifier: Fr): Promise; }, nullifierReadRequests: Tuple, nullifiers: Tuple, - sizePending: PENDING, - sizeSettled: SETTLED, + maxPending: PENDING = MAX_NULLIFIER_READ_REQUESTS_PER_TX as PENDING, + maxSettled: SETTLED = MAX_NULLIFIER_READ_REQUESTS_PER_TX as SETTLED, ) { // Nullifiers outputted from public kernels are already siloed while read requests are not. // Siloing the read request values and set the contract addresses to zero to find the matching nullifier contexts. @@ -107,13 +154,5 @@ export function buildSiloedNullifierReadRequestHints; - return buildNullifierReadRequestHints( - oracle, - siloedReadRequests, - scopedNullifiers, - sizePending, - sizeSettled, - [], - true, - ); + return buildNullifierReadRequestHints(oracle, siloedReadRequests, scopedNullifiers, [], maxPending, maxSettled, true); } diff --git a/yarn-project/circuits.js/src/hints/build_transient_data_hints.test.ts b/yarn-project/circuits.js/src/hints/build_transient_data_hints.test.ts index a4c0c921638..6f85aae552e 100644 --- a/yarn-project/circuits.js/src/hints/build_transient_data_hints.test.ts +++ b/yarn-project/circuits.js/src/hints/build_transient_data_hints.test.ts @@ -21,6 +21,7 @@ describe('buildTransientDataHints', () => { let futureNoteHashReads: ScopedReadRequest[]; let futureNullifierReads: ScopedReadRequest[]; let noteHashNullifierCounterMap: Map; + let validationRequestsSplitCounter = 0; const buildHints = () => buildTransientDataHints( @@ -29,9 +30,11 @@ describe('buildTransientDataHints', () => { futureNoteHashReads, futureNullifierReads, noteHashNullifierCounterMap, + validationRequestsSplitCounter, ); beforeEach(() => { + validationRequestsSplitCounter = 0; noteHashes = [ new NoteHash(new Fr(11), 100).scope(contractAddress), new NoteHash(new Fr(22), 200).scope(contractAddress), @@ -79,6 +82,13 @@ describe('buildTransientDataHints', () => { expect(hints).toEqual(Array(nullifiers.length).fill(nadaIndexHint)); }); + it('keeps the pair if note hash is non-revertible and nullifier is revertible', () => { + validationRequestsSplitCounter = noteHashes[0].counter + 1; + const { numTransientData, hints } = buildHints(); + expect(numTransientData).toBe(0); + expect(hints).toEqual(Array(nullifiers.length).fill(nadaIndexHint)); + }); + it('throws if contract address does not match', () => { nullifiers[3].contractAddress = AztecAddress.fromBigInt(123456n); expect(buildHints).toThrow('Contract address of hinted note hash does not match.'); diff --git a/yarn-project/circuits.js/src/hints/build_transient_data_hints.ts b/yarn-project/circuits.js/src/hints/build_transient_data_hints.ts index b5386a3ed99..6044d02f17a 100644 --- a/yarn-project/circuits.js/src/hints/build_transient_data_hints.ts +++ b/yarn-project/circuits.js/src/hints/build_transient_data_hints.ts @@ -18,6 +18,7 @@ export function buildTransientDataHints, + validationRequestsSplitCounter: number, noteHashesLength: NOTE_HASHES_LEN = noteHashes.length as NOTE_HASHES_LEN, nullifiersLength: NULLIFIERS_LEN = nullifiers.length as NULLIFIERS_LEN, ): { numTransientData: number; hints: Tuple } { @@ -47,6 +48,11 @@ export function buildTransientDataHints= validationRequestsSplitCounter) { + continue; + } + // If the following errors show up, something's wrong with how we build the noteHashNullifierCounterMap in client_execution_context.ts. if (nullifier.counter < noteHash.counter) { throw new Error('Hinted nullifier has smaller counter than note hash.'); diff --git a/yarn-project/circuits.js/src/hints/find_private_kernel_reset_dimensions.test.ts b/yarn-project/circuits.js/src/hints/find_private_kernel_reset_dimensions.test.ts new file mode 100644 index 00000000000..245ba0316df --- /dev/null +++ b/yarn-project/circuits.js/src/hints/find_private_kernel_reset_dimensions.test.ts @@ -0,0 +1,299 @@ +import { type FieldsOf } from '@aztec/foundation/types'; + +import { + type DimensionName, + PrivateKernelResetDimensions, + type PrivateKernelResetDimensionsConfig, + privateKernelResetDimensionNames, +} from '../structs/index.js'; +import { findPrivateKernelResetDimensions } from './find_private_kernel_reset_dimensions.js'; + +describe('findPrivateKernelResetDimensions', () => { + let config: PrivateKernelResetDimensionsConfig; + let isInner = false; + let allowRemainder = false; + + beforeEach(() => { + config = { + dimensions: { + NOTE_HASH_PENDING_AMOUNT: { + variants: [1], + standalone: [], + cost: 100, + }, + NOTE_HASH_SETTLED_AMOUNT: { + variants: [2, 4], + standalone: [6], + cost: 100, + }, + NULLIFIER_PENDING_AMOUNT: { + variants: [3, 6, 9], + standalone: [], + cost: 100, + }, + NULLIFIER_SETTLED_AMOUNT: { + variants: [4, 8], + standalone: [12], + cost: 100, + }, + NULLIFIER_KEYS: { + variants: [5, 10], + standalone: [15, 20, 25], + cost: 100, + }, + TRANSIENT_DATA_AMOUNT: { + variants: [6], + standalone: [12], + cost: 100, + }, + NOTE_HASH_SILOING_AMOUNT: { + variants: [7, 14, 21], + standalone: [28, 35], + cost: 100, + }, + NULLIFIER_SILOING_AMOUNT: { + variants: [8, 16], + standalone: [24], + cost: 100, + }, + ENCRYPTED_LOG_SILOING_AMOUNT: { + variants: [9], + standalone: [18], + cost: 100, + }, + }, + specialCases: [], + }; + + isInner = false; + allowRemainder = false; + }); + + const getDimensions = (requestedDimensions: Partial> = {}) => + findPrivateKernelResetDimensions( + PrivateKernelResetDimensions.from(requestedDimensions), + config, + isInner, + allowRemainder, + ); + + const expectEqualDimensions = ( + dimensions: PrivateKernelResetDimensions, + { + NOTE_HASH_PENDING_AMOUNT, + NOTE_HASH_SETTLED_AMOUNT, + NULLIFIER_PENDING_AMOUNT, + NULLIFIER_SETTLED_AMOUNT, + NULLIFIER_KEYS, + TRANSIENT_DATA_AMOUNT, + NOTE_HASH_SILOING_AMOUNT, + NULLIFIER_SILOING_AMOUNT, + ENCRYPTED_LOG_SILOING_AMOUNT, + }: Partial<{ [K in DimensionName]: number }> = {}, + ) => { + const expected = new PrivateKernelResetDimensions( + NOTE_HASH_PENDING_AMOUNT ?? 1, + NOTE_HASH_SETTLED_AMOUNT ?? 2, + NULLIFIER_PENDING_AMOUNT ?? 3, + NULLIFIER_SETTLED_AMOUNT ?? 4, + NULLIFIER_KEYS ?? 5, + TRANSIENT_DATA_AMOUNT ?? 6, + NOTE_HASH_SILOING_AMOUNT ?? 7, + NULLIFIER_SILOING_AMOUNT ?? 8, + ENCRYPTED_LOG_SILOING_AMOUNT ?? 9, + ); + + expect(dimensions).toEqual(expected); + }; + + const expectEqualStandalone = (dimensions: PrivateKernelResetDimensions, name: DimensionName, value: number) => { + const expected = PrivateKernelResetDimensions.empty(); + expected[name] = value; + expect(dimensions).toEqual(expected); + }; + + const expectEqualSpecialCase = (dimensions: PrivateKernelResetDimensions, specialCaseIndex: number) => { + expect(dimensions).toEqual(PrivateKernelResetDimensions.fromValues(config.specialCases[specialCaseIndex])); + }; + + describe('only variant', () => { + beforeEach(() => { + // Clear standalone values to focus on testing picking options among available variants. + privateKernelResetDimensionNames.forEach(name => (config.dimensions[name].standalone = [])); + }); + + it('returns smallest dimensions by default', () => { + const dimensions = getDimensions(); + expectEqualDimensions(dimensions); + }); + + it('finds the cheapest option for all dimensions', () => { + const dimensions = getDimensions({ + NOTE_HASH_PENDING_AMOUNT: 1, + NOTE_HASH_SETTLED_AMOUNT: 3, + NULLIFIER_PENDING_AMOUNT: 4, + NULLIFIER_SETTLED_AMOUNT: 5, + NULLIFIER_KEYS: 6, + TRANSIENT_DATA_AMOUNT: 4, + NOTE_HASH_SILOING_AMOUNT: 9, + NULLIFIER_SILOING_AMOUNT: 11, + ENCRYPTED_LOG_SILOING_AMOUNT: 7, + }); + + expectEqualDimensions(dimensions, { + NOTE_HASH_PENDING_AMOUNT: 1, + NOTE_HASH_SETTLED_AMOUNT: 4, + NULLIFIER_PENDING_AMOUNT: 6, + NULLIFIER_SETTLED_AMOUNT: 8, + NULLIFIER_KEYS: 10, + TRANSIENT_DATA_AMOUNT: 6, + NOTE_HASH_SILOING_AMOUNT: 14, + NULLIFIER_SILOING_AMOUNT: 16, + ENCRYPTED_LOG_SILOING_AMOUNT: 9, + }); + }); + + it('finds the cheapest option for partial dimensions', () => { + const dimensions = getDimensions({ + NULLIFIER_PENDING_AMOUNT: 7, + NULLIFIER_KEYS: 7, + NULLIFIER_SILOING_AMOUNT: 11, + }); + + expectEqualDimensions(dimensions, { + NULLIFIER_PENDING_AMOUNT: 9, + NULLIFIER_KEYS: 10, + NULLIFIER_SILOING_AMOUNT: 16, + }); + }); + }); + + describe('with standalone', () => { + it('uses standalone for one dimension', () => { + const dimensions = getDimensions({ + ENCRYPTED_LOG_SILOING_AMOUNT: 8, + }); + + expectEqualStandalone(dimensions, 'ENCRYPTED_LOG_SILOING_AMOUNT', 18); + }); + + it('uses variant for one dimension if standalone is more expensive', () => { + // Increase the cost so it's more expensive running all the extra siloing. + config.dimensions.ENCRYPTED_LOG_SILOING_AMOUNT.cost = 9999; + + const dimensions = getDimensions({ + ENCRYPTED_LOG_SILOING_AMOUNT: 8, + }); + + expectEqualDimensions(dimensions, { ENCRYPTED_LOG_SILOING_AMOUNT: 9 }); + }); + }); + + describe('with special cases', () => { + beforeEach(() => { + config.specialCases = [ + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [99, 99, 99, 99, 99, 99, 99, 99, 99], + ]; + }); + + it('returns smallest special case by default', () => { + const dimensions = getDimensions(); + expectEqualSpecialCase(dimensions, 0); + }); + + it('returns the option to reset all dimensions', () => { + const dimensions = getDimensions({ + NULLIFIER_PENDING_AMOUNT: 88, + NULLIFIER_KEYS: 88, + NULLIFIER_SILOING_AMOUNT: 88, + }); + + expectEqualSpecialCase(dimensions, 1); + }); + + it('picks cheapest option among variants', () => { + const dimensions = getDimensions({ + NULLIFIER_PENDING_AMOUNT: 5, + NULLIFIER_KEYS: 7, + NULLIFIER_SILOING_AMOUNT: 9, + }); + + expectEqualDimensions(dimensions, { + NULLIFIER_PENDING_AMOUNT: 6, + NULLIFIER_KEYS: 10, + NULLIFIER_SILOING_AMOUNT: 16, + }); + }); + + it('picks cheapest option among standalone', () => { + const dimensions = getDimensions({ + ENCRYPTED_LOG_SILOING_AMOUNT: 8, + }); + + expectEqualStandalone(dimensions, 'ENCRYPTED_LOG_SILOING_AMOUNT', 18); + }); + }); + + describe('is inner', () => { + it('returns the option that does not perform siloing', () => { + // Increase the cost so it's more expensive running a key verification check. + config.dimensions.NULLIFIER_KEYS.cost = 9999; + + isInner = false; + { + const dimensions = getDimensions({ + NULLIFIER_KEYS: 4, + }); + + expectEqualDimensions(dimensions, { NULLIFIER_KEYS: 5 }); + } + + isInner = true; + { + const dimensions = getDimensions({ + NULLIFIER_KEYS: 8, + }); + + expectEqualStandalone(dimensions, 'NULLIFIER_KEYS', 15); + } + }); + }); + + describe('allow remainder', () => { + const request = { + NULLIFIER_PENDING_AMOUNT: 88, + NULLIFIER_KEYS: 88, + NULLIFIER_SILOING_AMOUNT: 88, + }; + + it('finds the option that can reset the most values', () => { + allowRemainder = false; + expect(() => getDimensions(request)).toThrow(); + + allowRemainder = true; + { + const dimensions = getDimensions(request); + + expectEqualDimensions(dimensions, { + NULLIFIER_PENDING_AMOUNT: 9, + NULLIFIER_KEYS: 10, + NULLIFIER_SILOING_AMOUNT: 16, + }); + } + }); + + it('finds the option in special cases that can reset the most values', () => { + config.specialCases = [ + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [77, 77, 77, 77, 77, 77, 77, 77, 77], + ]; + + allowRemainder = false; + expect(() => getDimensions(request)).toThrow(); + + allowRemainder = true; + expectEqualSpecialCase(getDimensions(request), 1); + }); + }); +}); diff --git a/yarn-project/circuits.js/src/hints/find_private_kernel_reset_dimensions.ts b/yarn-project/circuits.js/src/hints/find_private_kernel_reset_dimensions.ts new file mode 100644 index 00000000000..5554bea8601 --- /dev/null +++ b/yarn-project/circuits.js/src/hints/find_private_kernel_reset_dimensions.ts @@ -0,0 +1,167 @@ +import { + PrivateKernelResetDimensions, + type PrivateKernelResetDimensionsConfig, + privateKernelResetDimensionNames, +} from '../structs/index.js'; + +interface DimensionOption { + dimensions: PrivateKernelResetDimensions; + cost: number; + remainder?: PrivateKernelResetDimensions; +} + +function isDefined(value: T | undefined): value is T { + return value !== undefined; +} + +function computeCost(dimensions: PrivateKernelResetDimensions, config: PrivateKernelResetDimensionsConfig) { + return privateKernelResetDimensionNames.reduce( + (accum, name) => accum + dimensions[name] * config.dimensions[name].cost, + 0, + ); +} + +function getSize(dimensions: PrivateKernelResetDimensions) { + return privateKernelResetDimensionNames.reduce((accum, name) => accum + dimensions[name], 0); +} + +function getRemainder( + requestedDimensions: PrivateKernelResetDimensions, + foundDimensions: PrivateKernelResetDimensions, +) { + const remainder = PrivateKernelResetDimensions.empty(); + let remainingDimensions = 0; + privateKernelResetDimensionNames.forEach(name => { + if (requestedDimensions[name] > foundDimensions[name]) { + remainingDimensions++; + remainder[name] = requestedDimensions[name] - foundDimensions[name]; + } + }); + return remainingDimensions ? remainder : undefined; +} + +function pickFromValues(targetValue: number, values: number[]) { + // Find the min value in `values` that's greater than or equal to `targetValue`. + const minGte = values.reduce( + (prev: number | undefined, curr) => (curr >= targetValue && (prev === undefined || curr < prev) ? curr : prev), + undefined, + ); + + // If no such value is found, returns the max value. + return minGte ?? Math.max(...values); +} + +function pickCheapest(options: DimensionOption[]) { + return options.reduce((prev, curr) => (curr.cost < prev.cost ? curr : prev), options[0]); +} + +function pickSmallestRemainder(options: DimensionOption[]) { + const optionsWithSize = options + .filter(o => o.remainder) + .map(option => ({ option, size: getSize(option.remainder!) })); + return optionsWithSize.reduce((prev, curr) => (curr.size < prev.size ? curr : prev), optionsWithSize[0])?.option; +} + +function pickBestOption(options: DimensionOption[]) { + const optionsResetAll = options.filter(opt => !opt.remainder); + const optionsResetPartial = options.filter(opt => opt.remainder); + // The best option is the cheapest one that can reset all dimensions. + // If no such option exists, find one that can reset the most data. + return pickCheapest(optionsResetAll) || pickSmallestRemainder(optionsResetPartial); +} + +function findVariant( + requestedDimensions: PrivateKernelResetDimensions, + config: PrivateKernelResetDimensionsConfig, + isQualified: (dimensions: PrivateKernelResetDimensions) => boolean, +): DimensionOption | undefined { + const variant = PrivateKernelResetDimensions.empty(); + privateKernelResetDimensionNames.forEach(name => { + variant[name] = pickFromValues(requestedDimensions[name], config.dimensions[name].variants); + }); + if (!isQualified(variant)) { + return; + } + + return { + dimensions: variant, + cost: computeCost(variant, config), + remainder: getRemainder(requestedDimensions, variant), + }; +} + +function findStandalone( + requestedDimensions: PrivateKernelResetDimensions, + config: PrivateKernelResetDimensionsConfig, + isQualified: (dimensions: PrivateKernelResetDimensions) => boolean, +): DimensionOption | undefined { + const needsReset = privateKernelResetDimensionNames.filter(name => requestedDimensions[name] > 0); + if (needsReset.length !== 1) { + // At the moment, we only use standalone to reset one dimension when it's about to overflow. + return; + } + + const name = needsReset[0]; + const value = pickFromValues(requestedDimensions[name], config.dimensions[name].standalone); + if (!value) { + return; + } + + const dimensions = PrivateKernelResetDimensions.from({ [name]: value }); + if (!isQualified(dimensions)) { + return; + } + + return { + dimensions, + cost: computeCost(dimensions, config), + remainder: getRemainder(requestedDimensions, dimensions), + }; +} + +function findSpecialCase( + requestedDimensions: PrivateKernelResetDimensions, + config: PrivateKernelResetDimensionsConfig, + isQualified: (dimensions: PrivateKernelResetDimensions) => boolean, +): DimensionOption | undefined { + const specialCases = config.specialCases.map(PrivateKernelResetDimensions.fromValues); + const options = specialCases.filter(isQualified).map(dimensions => ({ + dimensions, + cost: computeCost(dimensions, config), + remainder: getRemainder(requestedDimensions, dimensions), + })); + return pickBestOption(options); +} + +export function findPrivateKernelResetDimensions( + requestedDimensions: PrivateKernelResetDimensions, + config: PrivateKernelResetDimensionsConfig, + isInner = false, + allowRemainder = false, +) { + const requestedValues = requestedDimensions.toValues(); + const isEnough = allowRemainder + ? () => true + : (dimensions: PrivateKernelResetDimensions) => dimensions.toValues().every((v, i) => v >= requestedValues[i]); + + const isQualified = !isInner + ? isEnough + : // If isInner is true, it's a reset to prevent overflow. The following must be zero because siloing can't be done at the moment. + (dimensions: PrivateKernelResetDimensions) => + dimensions.NOTE_HASH_SILOING_AMOUNT === 0 && + dimensions.NULLIFIER_SILOING_AMOUNT === 0 && + dimensions.ENCRYPTED_LOG_SILOING_AMOUNT === 0 && + isEnough(dimensions); + + const options = [ + findVariant(requestedDimensions, config, isQualified), + findStandalone(requestedDimensions, config, isQualified), + findSpecialCase(requestedDimensions, config, isQualified), + ].filter(isDefined); + + if (!options.length) { + throw new Error(`Cannot find an option for dimension: ${requestedDimensions.toValues()}`); + } + + return pickBestOption(options).dimensions; +} diff --git a/yarn-project/circuits.js/src/hints/index.ts b/yarn-project/circuits.js/src/hints/index.ts index 67970d7bdc4..2da0098c29b 100644 --- a/yarn-project/circuits.js/src/hints/index.ts +++ b/yarn-project/circuits.js/src/hints/index.ts @@ -3,3 +3,4 @@ export * from './build_nullifier_non_existent_read_request_hints.js'; export * from './build_nullifier_read_request_hints.js'; export * from './build_public_data_hints.js'; export * from './build_transient_data_hints.js'; +export * from './find_private_kernel_reset_dimensions.js'; diff --git a/yarn-project/circuits.js/src/scripts/constants.in.ts b/yarn-project/circuits.js/src/scripts/constants.in.ts index bf922fa24fa..8580b48e8ba 100644 --- a/yarn-project/circuits.js/src/scripts/constants.in.ts +++ b/yarn-project/circuits.js/src/scripts/constants.in.ts @@ -269,7 +269,7 @@ function generateSolidityConstants({ constants }: ParsedContent, targetPath: str const resultSolidity: string = `// GENERATED FILE - DO NOT EDIT, RUN yarn remake-constants in circuits.js // SPDX-License-Identifier: Apache-2.0 // Copyright 2023 Aztec Labs. -pragma solidity >=0.8.18; +pragma solidity >=0.8.27; /** * @title Constants Library diff --git a/yarn-project/circuits.js/src/scripts/generate_reset_variants.ts b/yarn-project/circuits.js/src/scripts/generate_reset_variants.ts deleted file mode 100644 index 1bf61877bf9..00000000000 --- a/yarn-project/circuits.js/src/scripts/generate_reset_variants.ts +++ /dev/null @@ -1,157 +0,0 @@ -import fs from 'fs'; -import path from 'path'; - -import { - MAX_ENCRYPTED_LOGS_PER_TX, - MAX_KEY_VALIDATION_REQUESTS_PER_TX, - MAX_NOTE_HASHES_PER_TX, - MAX_NOTE_HASH_READ_REQUESTS_PER_TX, - MAX_NULLIFIERS_PER_TX, - MAX_NULLIFIER_READ_REQUESTS_PER_TX, -} from '../constants.gen.js'; - -interface ResetVariant { - tag: string; - priority: number; - replacements: { - NOTE_HASH_PENDING_AMOUNT: number; - NOTE_HASH_SETTLED_AMOUNT: number; - NULLIFIER_PENDING_AMOUNT: number; - NULLIFIER_SETTLED_AMOUNT: number; - NULLIFIER_KEYS: number; - TRANSIENT_DATA_AMOUNT: number; - NOTE_HASH_SILOING_AMOUNT: number; - NULLIFIER_SILOING_AMOUNT: number; - ENCRYPTED_LOG_SILOING_AMOUNT: number; - }; -} - -const prelude = ` -// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -import { - MAX_ENCRYPTED_LOGS_PER_TX, - MAX_NOTE_HASHES_PER_TX, - MAX_NOTE_HASH_READ_REQUESTS_PER_TX, - MAX_KEY_VALIDATION_REQUESTS_PER_TX, - MAX_NULLIFIER_READ_REQUESTS_PER_TX, - MAX_NULLIFIERS_PER_TX, -} from '../../constants.gen.js'; -import type { PrivateKernelResetCircuitPrivateInputs } from './private_kernel_reset_circuit_private_inputs.js'; -`; - -function buildPrivateResetVariantsObject(variants: ResetVariant[]): string { - let output = 'export const PRIVATE_RESET_VARIANTS = {'; - - for (const variant of variants) { - output += ` - '${variant.tag}': { - NOTE_HASH_PENDING_AMOUNT: ${variant.replacements.NOTE_HASH_PENDING_AMOUNT}, - NOTE_HASH_SETTLED_AMOUNT: ${variant.replacements.NOTE_HASH_SETTLED_AMOUNT}, - NULLIFIER_PENDING_AMOUNT: ${variant.replacements.NULLIFIER_PENDING_AMOUNT}, - NULLIFIER_SETTLED_AMOUNT: ${variant.replacements.NULLIFIER_SETTLED_AMOUNT}, - NULLIFIER_KEYS: ${variant.replacements.NULLIFIER_KEYS}, - TRANSIENT_DATA_AMOUNT: ${variant.replacements.TRANSIENT_DATA_AMOUNT}, - NOTE_HASH_SILOING_AMOUNT: ${variant.replacements.NOTE_HASH_SILOING_AMOUNT}, - NULLIFIER_SILOING_AMOUNT: ${variant.replacements.NULLIFIER_SILOING_AMOUNT}, - ENCRYPTED_LOG_SILOING_AMOUNT: ${variant.replacements.ENCRYPTED_LOG_SILOING_AMOUNT}, - },`; - } - - output += ` - full: { - NOTE_HASH_PENDING_AMOUNT: MAX_NOTE_HASH_READ_REQUESTS_PER_TX, - NOTE_HASH_SETTLED_AMOUNT: MAX_NOTE_HASH_READ_REQUESTS_PER_TX, - NULLIFIER_PENDING_AMOUNT: MAX_NULLIFIER_READ_REQUESTS_PER_TX, - NULLIFIER_SETTLED_AMOUNT: MAX_NULLIFIER_READ_REQUESTS_PER_TX, - NULLIFIER_KEYS: MAX_KEY_VALIDATION_REQUESTS_PER_TX, - TRANSIENT_DATA_AMOUNT: MAX_NULLIFIERS_PER_TX, - NOTE_HASH_SILOING_AMOUNT: MAX_NOTE_HASHES_PER_TX, - NULLIFIER_SILOING_AMOUNT: MAX_NULLIFIERS_PER_TX, - ENCRYPTED_LOG_SILOING_AMOUNT: MAX_ENCRYPTED_LOGS_PER_TX, - }, - } as const;\n`; - return output; -} - -function buildPrivateResetVariantsType(variants: ResetVariant[]): string { - let output = 'export type PrivateKernelResetCircuitPrivateInputsVariants =\n'; - - for (const variant of variants) { - output += ` - | PrivateKernelResetCircuitPrivateInputs< - ${variant.replacements.NOTE_HASH_PENDING_AMOUNT}, - ${variant.replacements.NOTE_HASH_SETTLED_AMOUNT}, - ${variant.replacements.NULLIFIER_PENDING_AMOUNT}, - ${variant.replacements.NULLIFIER_SETTLED_AMOUNT}, - ${variant.replacements.NULLIFIER_KEYS}, - ${variant.replacements.TRANSIENT_DATA_AMOUNT}, - '${variant.tag}' - > - `; - } - - output += ` - | PrivateKernelResetCircuitPrivateInputs< - typeof MAX_NOTE_HASH_READ_REQUESTS_PER_TX, - typeof MAX_NOTE_HASH_READ_REQUESTS_PER_TX, - typeof MAX_NULLIFIER_READ_REQUESTS_PER_TX, - typeof MAX_NULLIFIER_READ_REQUESTS_PER_TX, - typeof MAX_KEY_VALIDATION_REQUESTS_PER_TX, - typeof MAX_NULLIFIERS_PER_TX, - 'full' - >;`; - return output; -} - -function validateVariants(variants: ResetVariant[]) { - for (const variant of variants) { - if (variant.replacements.NOTE_HASH_PENDING_AMOUNT > MAX_NOTE_HASH_READ_REQUESTS_PER_TX) { - throw new Error(`NOTE_HASH_PENDING_AMOUNT must be less than or equal to ${MAX_NOTE_HASH_READ_REQUESTS_PER_TX}`); - } - if (variant.replacements.NOTE_HASH_SETTLED_AMOUNT > MAX_NOTE_HASH_READ_REQUESTS_PER_TX) { - throw new Error(`NOTE_HASH_SETTLED_AMOUNT must be less than or equal to ${MAX_NOTE_HASH_READ_REQUESTS_PER_TX}`); - } - if (variant.replacements.NULLIFIER_PENDING_AMOUNT > MAX_NULLIFIER_READ_REQUESTS_PER_TX) { - throw new Error(`NULLIFIER_PENDING_AMOUNT must be less than or equal to ${MAX_NULLIFIER_READ_REQUESTS_PER_TX}`); - } - if (variant.replacements.NULLIFIER_SETTLED_AMOUNT > MAX_NULLIFIER_READ_REQUESTS_PER_TX) { - throw new Error(`NULLIFIER_SETTLED_AMOUNT must be less than or equal to ${MAX_NULLIFIER_READ_REQUESTS_PER_TX}`); - } - if (variant.replacements.NULLIFIER_KEYS > MAX_KEY_VALIDATION_REQUESTS_PER_TX) { - throw new Error(`NULLIFIER_KEYS must be less than or equal to ${MAX_KEY_VALIDATION_REQUESTS_PER_TX}`); - } - if (variant.replacements.TRANSIENT_DATA_AMOUNT > MAX_NULLIFIERS_PER_TX) { - throw new Error(`TRANSIENT_DATA_AMOUNT must be less than or equal to ${MAX_NULLIFIERS_PER_TX}`); - } - if (variant.replacements.NOTE_HASH_SILOING_AMOUNT > MAX_NOTE_HASHES_PER_TX) { - throw new Error(`NOTE_HASH_SILOING_AMOUNT must be less than or equal to ${MAX_NOTE_HASHES_PER_TX}`); - } - if (variant.replacements.NULLIFIER_SILOING_AMOUNT > MAX_NULLIFIERS_PER_TX) { - throw new Error(`NULLIFIER_SILOING_AMOUNT must be less than or equal to ${MAX_NULLIFIERS_PER_TX}`); - } - if (variant.replacements.ENCRYPTED_LOG_SILOING_AMOUNT > MAX_ENCRYPTED_LOGS_PER_TX) { - throw new Error(`ENCRYPTED_LOG_SILOING_AMOUNT must be less than or equal to ${MAX_ENCRYPTED_LOGS_PER_TX}`); - } - } -} - -const resetVariants: ResetVariant[] = JSON.parse( - fs.readFileSync(path.resolve('../../noir-projects/noir-protocol-circuits/reset_variants.json'), 'utf8'), -); - -// Sort them by decreasing priority so that the bigger circuits are tried later -resetVariants.sort((a, b) => b.priority - a.priority); - -validateVariants(resetVariants); - -fs.writeFileSync( - path.resolve('./src/structs/kernel/private_kernel_reset_circuit_private_inputs_variants.ts'), - ` -${prelude} - -${buildPrivateResetVariantsObject(resetVariants)} - -export type PrivateKernelResetTags = keyof typeof PRIVATE_RESET_VARIANTS; - -${buildPrivateResetVariantsType(resetVariants)}`, -); diff --git a/yarn-project/circuits.js/src/structs/index.ts b/yarn-project/circuits.js/src/structs/index.ts index 0ff816c36cd..ea548e3e4ce 100644 --- a/yarn-project/circuits.js/src/structs/index.ts +++ b/yarn-project/circuits.js/src/structs/index.ts @@ -26,7 +26,8 @@ export * from './kernel/private_kernel_data.js'; export * from './kernel/private_kernel_init_circuit_private_inputs.js'; export * from './kernel/private_kernel_inner_circuit_private_inputs.js'; export * from './kernel/private_kernel_reset_circuit_private_inputs.js'; -export * from './kernel/private_kernel_reset_circuit_private_inputs_variants.js'; +export * from './kernel/private_kernel_reset_dimensions.js'; +export * from './kernel/private_kernel_reset_hints.js'; export * from './kernel/private_kernel_tail_circuit_private_inputs.js'; export * from './kernel/private_kernel_tail_circuit_public_inputs.js'; export * from './kernel/public_accumulated_data.js'; @@ -78,6 +79,7 @@ export * from './rollup/base_or_merge_rollup_public_inputs.js'; export * from './rollup/base_rollup.js'; export * from './rollup/block_merge_rollup.js'; export * from './rollup/block_root_or_block_merge_public_inputs.js'; +export * from './rollup/empty_block_root_rollup_inputs.js'; export * from './rollup/block_root_rollup.js'; export * from './rollup/merge_rollup.js'; export * from './rollup/previous_rollup_block_data.js'; diff --git a/yarn-project/circuits.js/src/structs/kernel/private_kernel_reset_circuit_private_inputs.ts b/yarn-project/circuits.js/src/structs/kernel/private_kernel_reset_circuit_private_inputs.ts index 904fcccef16..0085ff416b4 100644 --- a/yarn-project/circuits.js/src/structs/kernel/private_kernel_reset_circuit_private_inputs.ts +++ b/yarn-project/circuits.js/src/structs/kernel/private_kernel_reset_circuit_private_inputs.ts @@ -1,19 +1,16 @@ -import { BufferReader, type Tuple, serializeToBuffer } from '@aztec/foundation/serialize'; +import { serializeToBuffer } from '@aztec/foundation/serialize'; -import { countAccumulatedItems } from '../../utils/index.js'; import { - KeyValidationHint, - type NoteHashReadRequestHints, - type NullifierReadRequestHints, - noteHashReadRequestHintsFromBuffer, - nullifierReadRequestHintsFromBuffer, -} from '../read_request_hints/index.js'; -import { TransientDataIndexHint } from '../transient_data_index_hint.js'; -import { PrivateKernelData } from './private_kernel_data.js'; + type MAX_KEY_VALIDATION_REQUESTS_PER_TX, + type MAX_NOTE_HASH_READ_REQUESTS_PER_TX, + type MAX_NULLIFIERS_PER_TX, + type MAX_NULLIFIER_READ_REQUESTS_PER_TX, +} from '../../constants.gen.js'; +import { type PrivateKernelData } from './private_kernel_data.js'; +import { type PrivateKernelResetDimensions } from './private_kernel_reset_dimensions.js'; +import { type PrivateKernelResetHints } from './private_kernel_reset_hints.js'; -export { TransientDataIndexHint } from '../transient_data_index_hint.js'; - -export class PrivateKernelResetHints< +export class PrivateKernelResetCircuitPrivateInputsVariants< NH_RR_PENDING extends number, NH_RR_SETTLED extends number, NLL_RR_PENDING extends number, @@ -22,207 +19,59 @@ export class PrivateKernelResetHints< NUM_TRANSIENT_DATA_INDEX_HINTS extends number, > { constructor( - /** - * Contains hints for the transient read requests to localize corresponding commitments. - */ - public noteHashReadRequestHints: NoteHashReadRequestHints, - /** - * Contains hints for the nullifier read requests to locate corresponding pending or settled nullifiers. - */ - public nullifierReadRequestHints: NullifierReadRequestHints, - /** - * Contains hints for key validation request. - */ - public keyValidationHints: Tuple, - /** - * Contains hints for the transient note hashes to locate corresponding nullifiers. - */ - public transientDataIndexHints: Tuple, - /** - * The "final" minRevertibleSideEffectCounter of a tx, to split the data for squashing. - * Not the minRevertibleSideEffectCounter at the point the reset circuit is run. - */ - public validationRequestsSplitCounter: number, + public previousKernel: PrivateKernelData, + public hints: PrivateKernelResetHints< + NH_RR_PENDING, + NH_RR_SETTLED, + NLL_RR_PENDING, + NLL_RR_SETTLED, + KEY_VALIDATION_REQUESTS, + NUM_TRANSIENT_DATA_INDEX_HINTS + >, ) {} toBuffer() { - return serializeToBuffer( - this.noteHashReadRequestHints, - this.nullifierReadRequestHints, - this.keyValidationHints, - this.transientDataIndexHints, - this.validationRequestsSplitCounter, - ); - } - - trimToSizes< - NEW_NH_RR_PENDING extends number, - NEW_NH_RR_SETTLED extends number, - NEW_NLL_RR_PENDING extends number, - NEW_NLL_RR_SETTLED extends number, - NEW_KEY_VALIDATION_REQUESTS extends number, - NUM_TRANSIENT_DATA_INDEX_HINTS extends number, - >( - numNoteHashReadRequestPending: NEW_NH_RR_PENDING, - numNoteHashReadRequestSettled: NEW_NH_RR_SETTLED, - numNullifierReadRequestPending: NEW_NLL_RR_PENDING, - numNullifierReadRequestSettled: NEW_NLL_RR_SETTLED, - numKeyValidationRequests: NEW_KEY_VALIDATION_REQUESTS, - numTransientDataIndexHints: NUM_TRANSIENT_DATA_INDEX_HINTS, - ): PrivateKernelResetHints< - NEW_NH_RR_PENDING, - NEW_NH_RR_SETTLED, - NEW_NLL_RR_PENDING, - NEW_NLL_RR_SETTLED, - NEW_KEY_VALIDATION_REQUESTS, - NUM_TRANSIENT_DATA_INDEX_HINTS - > { - return new PrivateKernelResetHints( - this.noteHashReadRequestHints.trimToSizes(numNoteHashReadRequestPending, numNoteHashReadRequestSettled), - this.nullifierReadRequestHints.trimToSizes(numNullifierReadRequestPending, numNullifierReadRequestSettled), - this.keyValidationHints.slice(0, numKeyValidationRequests) as Tuple< - KeyValidationHint, - NEW_KEY_VALIDATION_REQUESTS - >, - this.transientDataIndexHints.slice(0, numTransientDataIndexHints) as Tuple< - TransientDataIndexHint, - NUM_TRANSIENT_DATA_INDEX_HINTS - >, - this.validationRequestsSplitCounter, - ); - } - /** - * Deserializes from a buffer or reader. - * @param buffer - Buffer or reader to read from. - * @returns The deserialized instance. - */ - static fromBuffer< - NH_RR_PENDING extends number, - NH_RR_SETTLED extends number, - NLL_RR_PENDING extends number, - NLL_RR_SETTLED extends number, - KEY_VALIDATION_REQUESTS extends number, - NUM_TRANSIENT_DATA_INDEX_HINTS extends number, - >( - buffer: Buffer | BufferReader, - numNoteHashReadRequestPending: NH_RR_PENDING, - numNoteHashReadRequestSettled: NH_RR_SETTLED, - numNullifierReadRequestPending: NLL_RR_PENDING, - numNullifierReadRequestSettled: NLL_RR_SETTLED, - numNullifierKeys: KEY_VALIDATION_REQUESTS, - numTransientDataIndexHints: NUM_TRANSIENT_DATA_INDEX_HINTS, - ): PrivateKernelResetHints< - NH_RR_PENDING, - NH_RR_SETTLED, - NLL_RR_PENDING, - NLL_RR_SETTLED, - KEY_VALIDATION_REQUESTS, - NUM_TRANSIENT_DATA_INDEX_HINTS - > { - const reader = BufferReader.asReader(buffer); - return new PrivateKernelResetHints( - reader.readObject({ - fromBuffer: buf => - noteHashReadRequestHintsFromBuffer(buf, numNoteHashReadRequestPending, numNoteHashReadRequestSettled), - }), - reader.readObject({ - fromBuffer: buf => - nullifierReadRequestHintsFromBuffer(buf, numNullifierReadRequestPending, numNullifierReadRequestSettled), - }), - reader.readArray(numNullifierKeys, KeyValidationHint), - reader.readArray(numTransientDataIndexHints, TransientDataIndexHint), - reader.readNumber(), - ); + return serializeToBuffer(this.previousKernel, this.hints); } } /** * Input to the private kernel circuit - reset call. */ -export class PrivateKernelResetCircuitPrivateInputs< - NH_RR_PENDING extends number, - NH_RR_SETTLED extends number, - NLL_RR_PENDING extends number, - NLL_RR_SETTLED extends number, - KEY_VALIDATION_REQUESTS extends number, - NUM_TRANSIENT_DATA_INDEX_HINTS extends number, - TAG extends string, -> { +export class PrivateKernelResetCircuitPrivateInputs { constructor( /** * The previous kernel data */ public previousKernel: PrivateKernelData, public hints: PrivateKernelResetHints< - NH_RR_PENDING, - NH_RR_SETTLED, - NLL_RR_PENDING, - NLL_RR_SETTLED, - KEY_VALIDATION_REQUESTS, - NUM_TRANSIENT_DATA_INDEX_HINTS + typeof MAX_NOTE_HASH_READ_REQUESTS_PER_TX, + typeof MAX_NOTE_HASH_READ_REQUESTS_PER_TX, + typeof MAX_NULLIFIER_READ_REQUESTS_PER_TX, + typeof MAX_NULLIFIER_READ_REQUESTS_PER_TX, + typeof MAX_KEY_VALIDATION_REQUESTS_PER_TX, + typeof MAX_NULLIFIERS_PER_TX >, - public sizeTag: TAG, + public dimensions: PrivateKernelResetDimensions, ) {} - isForPublic() { - return countAccumulatedItems(this.previousKernel.publicInputs.end.publicCallRequests) > 0; - } - /** * Serialize this as a buffer. * @returns The buffer. */ toBuffer() { - return serializeToBuffer(this.previousKernel, this.hints); + return serializeToBuffer(this.previousKernel, this.hints, this.dimensions); } - /** - * Deserializes from a buffer or reader. - * @param buffer - Buffer or reader to read from. - * @returns The deserialized instance. - */ - static fromBuffer< - NH_RR_PENDING extends number, - NH_RR_SETTLED extends number, - NLL_RR_PENDING extends number, - NLL_RR_SETTLED extends number, - KEY_VALIDATION_REQUESTS extends number, - NUM_TRANSIENT_DATA_INDEX_HINTS extends number, - TAG extends string, - >( - buffer: Buffer | BufferReader, - numNoteHashReadRequestPending: NH_RR_PENDING, - numNoteHashReadRequestSettled: NH_RR_SETTLED, - numNullifierReadRequestPending: NLL_RR_PENDING, - numNullifierReadRequestSettled: NLL_RR_SETTLED, - numNullifierKeys: KEY_VALIDATION_REQUESTS, - numTransientDataIndexHints: NUM_TRANSIENT_DATA_INDEX_HINTS, - sizeTag: TAG, - ): PrivateKernelResetCircuitPrivateInputs< - NH_RR_PENDING, - NH_RR_SETTLED, - NLL_RR_PENDING, - NLL_RR_SETTLED, - KEY_VALIDATION_REQUESTS, - NUM_TRANSIENT_DATA_INDEX_HINTS, - TAG - > { - const reader = BufferReader.asReader(buffer); - return new PrivateKernelResetCircuitPrivateInputs( - reader.readObject(PrivateKernelData), - reader.readObject({ - fromBuffer: buf => - PrivateKernelResetHints.fromBuffer( - buf, - numNoteHashReadRequestPending, - numNoteHashReadRequestSettled, - numNullifierReadRequestPending, - numNullifierReadRequestSettled, - numNullifierKeys, - numTransientDataIndexHints, - ), - }), - sizeTag, + trimToSizes() { + const hints = this.hints.trimToSizes( + this.dimensions.NOTE_HASH_PENDING_AMOUNT, + this.dimensions.NOTE_HASH_SETTLED_AMOUNT, + this.dimensions.NULLIFIER_PENDING_AMOUNT, + this.dimensions.NULLIFIER_SETTLED_AMOUNT, + this.dimensions.NULLIFIER_KEYS, + this.dimensions.TRANSIENT_DATA_AMOUNT, ); + return new PrivateKernelResetCircuitPrivateInputsVariants(this.previousKernel, hints); } } diff --git a/yarn-project/circuits.js/src/structs/kernel/private_kernel_reset_dimensions.ts b/yarn-project/circuits.js/src/structs/kernel/private_kernel_reset_dimensions.ts new file mode 100644 index 00000000000..b057dcc696b --- /dev/null +++ b/yarn-project/circuits.js/src/structs/kernel/private_kernel_reset_dimensions.ts @@ -0,0 +1,81 @@ +import { serializeToBuffer } from '@aztec/foundation/serialize'; +import { type FieldsOf } from '@aztec/foundation/types'; + +export class PrivateKernelResetDimensions { + constructor( + public NOTE_HASH_PENDING_AMOUNT: number, + public NOTE_HASH_SETTLED_AMOUNT: number, + public NULLIFIER_PENDING_AMOUNT: number, + public NULLIFIER_SETTLED_AMOUNT: number, + public NULLIFIER_KEYS: number, + public TRANSIENT_DATA_AMOUNT: number, + public NOTE_HASH_SILOING_AMOUNT: number, + public NULLIFIER_SILOING_AMOUNT: number, + public ENCRYPTED_LOG_SILOING_AMOUNT: number, + ) {} + + toBuffer() { + return serializeToBuffer( + this.NOTE_HASH_PENDING_AMOUNT, + this.NOTE_HASH_SETTLED_AMOUNT, + this.NULLIFIER_PENDING_AMOUNT, + this.NULLIFIER_SETTLED_AMOUNT, + this.NULLIFIER_KEYS, + this.TRANSIENT_DATA_AMOUNT, + this.NOTE_HASH_SILOING_AMOUNT, + this.NULLIFIER_SILOING_AMOUNT, + this.ENCRYPTED_LOG_SILOING_AMOUNT, + ); + } + + static empty() { + return new PrivateKernelResetDimensions(0, 0, 0, 0, 0, 0, 0, 0, 0); + } + + static from(fields: Partial>) { + const dimensions = PrivateKernelResetDimensions.empty(); + privateKernelResetDimensionNames.forEach(name => (dimensions[name] = fields[name] ?? 0)); + return dimensions; + } + + static fromValues(values: number[]) { + if (values.length !== privateKernelResetDimensionNames.length) { + throw new Error( + `Not enough values for all dimensions. Required ${privateKernelResetDimensionNames.length}. Got ${values.length}.`, + ); + } + const dimensions = PrivateKernelResetDimensions.empty(); + privateKernelResetDimensionNames.forEach((name, i) => (dimensions[name] = values[i])); + return dimensions; + } + + toValues() { + return privateKernelResetDimensionNames.map(name => this[name]); + } +} + +export type DimensionName = keyof FieldsOf; + +export const privateKernelResetDimensionNames: DimensionName[] = [ + 'NOTE_HASH_PENDING_AMOUNT', + 'NOTE_HASH_SETTLED_AMOUNT', + 'NULLIFIER_PENDING_AMOUNT', + 'NULLIFIER_SETTLED_AMOUNT', + 'NULLIFIER_KEYS', + 'TRANSIENT_DATA_AMOUNT', + 'NOTE_HASH_SILOING_AMOUNT', + 'NULLIFIER_SILOING_AMOUNT', + 'ENCRYPTED_LOG_SILOING_AMOUNT', +]; + +export interface DimensionConfig { + variants: number[]; + standalone: number[]; + cost: number; +} + +// Must match the config in noir-projects/noir-protocol-circuits/private_kernel_reset_config.json +export interface PrivateKernelResetDimensionsConfig { + dimensions: { [K in DimensionName]: DimensionConfig }; + specialCases: number[][]; +} diff --git a/yarn-project/circuits.js/src/structs/kernel/private_kernel_reset_hints.ts b/yarn-project/circuits.js/src/structs/kernel/private_kernel_reset_hints.ts new file mode 100644 index 00000000000..aa51f48af5b --- /dev/null +++ b/yarn-project/circuits.js/src/structs/kernel/private_kernel_reset_hints.ts @@ -0,0 +1,135 @@ +import { BufferReader, type Tuple, serializeToBuffer } from '@aztec/foundation/serialize'; + +import { + KeyValidationHint, + type NoteHashReadRequestHints, + type NullifierReadRequestHints, + noteHashReadRequestHintsFromBuffer, + nullifierReadRequestHintsFromBuffer, +} from '../read_request_hints/index.js'; +import { TransientDataIndexHint } from '../transient_data_index_hint.js'; + +export { TransientDataIndexHint } from '../transient_data_index_hint.js'; + +export class PrivateKernelResetHints< + NH_RR_PENDING extends number, + NH_RR_SETTLED extends number, + NLL_RR_PENDING extends number, + NLL_RR_SETTLED extends number, + KEY_VALIDATION_REQUESTS extends number, + NUM_TRANSIENT_DATA_INDEX_HINTS extends number, +> { + constructor( + /** + * Contains hints for the transient read requests to localize corresponding commitments. + */ + public noteHashReadRequestHints: NoteHashReadRequestHints, + /** + * Contains hints for the nullifier read requests to locate corresponding pending or settled nullifiers. + */ + public nullifierReadRequestHints: NullifierReadRequestHints, + /** + * Contains hints for key validation request. + */ + public keyValidationHints: Tuple, + /** + * Contains hints for the transient note hashes to locate corresponding nullifiers. + */ + public transientDataIndexHints: Tuple, + /** + * The "final" minRevertibleSideEffectCounter of a tx, to split the data for squashing. + * Not the minRevertibleSideEffectCounter at the point the reset circuit is run. + */ + public validationRequestsSplitCounter: number, + ) {} + + toBuffer() { + return serializeToBuffer( + this.noteHashReadRequestHints, + this.nullifierReadRequestHints, + this.keyValidationHints, + this.transientDataIndexHints, + this.validationRequestsSplitCounter, + ); + } + + trimToSizes< + NEW_NH_RR_PENDING extends number, + NEW_NH_RR_SETTLED extends number, + NEW_NLL_RR_PENDING extends number, + NEW_NLL_RR_SETTLED extends number, + NEW_KEY_VALIDATION_REQUESTS extends number, + NUM_TRANSIENT_DATA_INDEX_HINTS extends number, + >( + numNoteHashReadRequestPending: NEW_NH_RR_PENDING, + numNoteHashReadRequestSettled: NEW_NH_RR_SETTLED, + numNullifierReadRequestPending: NEW_NLL_RR_PENDING, + numNullifierReadRequestSettled: NEW_NLL_RR_SETTLED, + numKeyValidationRequests: NEW_KEY_VALIDATION_REQUESTS, + numTransientDataIndexHints: NUM_TRANSIENT_DATA_INDEX_HINTS, + ): PrivateKernelResetHints< + NEW_NH_RR_PENDING, + NEW_NH_RR_SETTLED, + NEW_NLL_RR_PENDING, + NEW_NLL_RR_SETTLED, + NEW_KEY_VALIDATION_REQUESTS, + NUM_TRANSIENT_DATA_INDEX_HINTS + > { + return new PrivateKernelResetHints( + this.noteHashReadRequestHints.trimToSizes(numNoteHashReadRequestPending, numNoteHashReadRequestSettled), + this.nullifierReadRequestHints.trimToSizes(numNullifierReadRequestPending, numNullifierReadRequestSettled), + this.keyValidationHints.slice(0, numKeyValidationRequests) as Tuple< + KeyValidationHint, + NEW_KEY_VALIDATION_REQUESTS + >, + this.transientDataIndexHints.slice(0, numTransientDataIndexHints) as Tuple< + TransientDataIndexHint, + NUM_TRANSIENT_DATA_INDEX_HINTS + >, + this.validationRequestsSplitCounter, + ); + } + /** + * Deserializes from a buffer or reader. + * @param buffer - Buffer or reader to read from. + * @returns The deserialized instance. + */ + static fromBuffer< + NH_RR_PENDING extends number, + NH_RR_SETTLED extends number, + NLL_RR_PENDING extends number, + NLL_RR_SETTLED extends number, + KEY_VALIDATION_REQUESTS extends number, + NUM_TRANSIENT_DATA_INDEX_HINTS extends number, + >( + buffer: Buffer | BufferReader, + numNoteHashReadRequestPending: NH_RR_PENDING, + numNoteHashReadRequestSettled: NH_RR_SETTLED, + numNullifierReadRequestPending: NLL_RR_PENDING, + numNullifierReadRequestSettled: NLL_RR_SETTLED, + numNullifierKeys: KEY_VALIDATION_REQUESTS, + numTransientDataIndexHints: NUM_TRANSIENT_DATA_INDEX_HINTS, + ): PrivateKernelResetHints< + NH_RR_PENDING, + NH_RR_SETTLED, + NLL_RR_PENDING, + NLL_RR_SETTLED, + KEY_VALIDATION_REQUESTS, + NUM_TRANSIENT_DATA_INDEX_HINTS + > { + const reader = BufferReader.asReader(buffer); + return new PrivateKernelResetHints( + reader.readObject({ + fromBuffer: buf => + noteHashReadRequestHintsFromBuffer(buf, numNoteHashReadRequestPending, numNoteHashReadRequestSettled), + }), + reader.readObject({ + fromBuffer: buf => + nullifierReadRequestHintsFromBuffer(buf, numNullifierReadRequestPending, numNullifierReadRequestSettled), + }), + reader.readArray(numNullifierKeys, KeyValidationHint), + reader.readArray(numTransientDataIndexHints, TransientDataIndexHint), + reader.readNumber(), + ); + } +} diff --git a/yarn-project/circuits.js/src/structs/proof.ts b/yarn-project/circuits.js/src/structs/proof.ts index 298210cc551..57b57606df4 100644 --- a/yarn-project/circuits.js/src/structs/proof.ts +++ b/yarn-project/circuits.js/src/structs/proof.ts @@ -91,6 +91,13 @@ export class Proof { static fromString(str: string) { return Proof.fromBuffer(Buffer.from(str, 'hex')); } + + /** Returns whether this proof is actually empty. */ + public isEmpty() { + return ( + this.buffer.length === EMPTY_PROOF_SIZE && this.buffer.every(byte => byte === 0) && this.numPublicInputs === 0 + ); + } } /** diff --git a/yarn-project/circuits.js/src/structs/read_request_hints/note_hash_read_request_hints.ts b/yarn-project/circuits.js/src/structs/read_request_hints/note_hash_read_request_hints.ts index 55ae64a2ae2..2f5e842241d 100644 --- a/yarn-project/circuits.js/src/structs/read_request_hints/note_hash_read_request_hints.ts +++ b/yarn-project/circuits.js/src/structs/read_request_hints/note_hash_read_request_hints.ts @@ -42,21 +42,24 @@ export class NoteHashReadRequestHintsBuilder PendingReadHint.nada(MAX_NOTE_HASH_READ_REQUESTS_PER_TX)), - makeTuple(numSettled, () => + makeTuple(maxPending, () => PendingReadHint.nada(MAX_NOTE_HASH_READ_REQUESTS_PER_TX)), + makeTuple(maxSettled, () => SettledReadHint.nada(MAX_NOTE_HASH_READ_REQUESTS_PER_TX, NOTE_HASH_TREE_HEIGHT, Fr.zero), ), ); } - static empty(numPending: PENDING, numSettled: SETTLED) { - return new NoteHashReadRequestHintsBuilder(numPending, numSettled).toHints().hints; + static empty(maxPending: PENDING, maxSettled: SETTLED) { + return new NoteHashReadRequestHintsBuilder(maxPending, maxSettled).toHints(); } addPendingReadRequest(readRequestIndex: number, noteHashIndex: number) { + if (this.numPendingReadHints === this.maxPending) { + throw new Error('Cannot add more pending read request.'); + } this.hints.readRequestStatuses[readRequestIndex] = new ReadRequestStatus( ReadRequestState.PENDING, this.numPendingReadHints, @@ -70,6 +73,9 @@ export class NoteHashReadRequestHintsBuilder, value: NoteHashLeafValue, ) { + if (this.numSettledReadHints === this.maxSettled) { + throw new Error('Cannot add more settled read request.'); + } this.hints.readRequestStatuses[readRequestIndex] = new ReadRequestStatus( ReadRequestState.SETTLED, this.numSettledReadHints, @@ -83,10 +89,6 @@ export class NoteHashReadRequestHintsBuilder PendingReadHint.nada(MAX_NULLIFIER_READ_REQUESTS_PER_TX)), - makeTuple(numSettled, () => + makeTuple(maxPending, () => PendingReadHint.nada(MAX_NULLIFIER_READ_REQUESTS_PER_TX)), + makeTuple(maxSettled, () => SettledReadHint.nada(MAX_NULLIFIER_READ_REQUESTS_PER_TX, NULLIFIER_TREE_HEIGHT, NullifierLeafPreimage.empty), ), ); } - static empty(numPending: PENDING, numSettled: SETTLED) { - return new NullifierReadRequestHintsBuilder(numPending, numSettled).toHints().hints; + static empty(maxPending: PENDING, maxSettled: SETTLED) { + return new NullifierReadRequestHintsBuilder(maxPending, maxSettled).toHints(); } addPendingReadRequest(readRequestIndex: number, nullifierIndex: number) { + if (this.numPendingReadHints === this.maxPending) { + throw new Error('Cannot add more pending read request.'); + } + this.hints.readRequestStatuses[readRequestIndex] = new ReadRequestStatus( ReadRequestState.PENDING, this.numPendingReadHints, @@ -69,6 +73,9 @@ export class NullifierReadRequestHintsBuilder, leafPreimage: TreeLeafPreimage, ) { + if (this.numSettledReadHints === this.maxSettled) { + throw new Error('Cannot add more settled read request.'); + } this.hints.readRequestStatuses[readRequestIndex] = new ReadRequestStatus( ReadRequestState.SETTLED, this.numSettledReadHints, @@ -82,10 +89,6 @@ export class NullifierReadRequestHintsBuilder { + constructor(public states: Tuple, public pendingReadHints: PendingReadHint[]) {} + + static empty(numReads: NUM_READS) { + return new ReadRequestResetStates( + makeTuple(numReads, () => ReadRequestState.NADA), + [], + ); + } +} diff --git a/yarn-project/circuits.js/src/structs/rollup/empty_block_root_rollup_inputs.test.ts b/yarn-project/circuits.js/src/structs/rollup/empty_block_root_rollup_inputs.test.ts new file mode 100644 index 00000000000..f5b147d052a --- /dev/null +++ b/yarn-project/circuits.js/src/structs/rollup/empty_block_root_rollup_inputs.test.ts @@ -0,0 +1,18 @@ +import { makeEmptyBlockRootRollupInputs } from '../../tests/factories.js'; +import { EmptyBlockRootRollupInputs } from './empty_block_root_rollup_inputs.js'; + +describe('EmptyBlockRootRollupInputs', () => { + it(`serializes a EmptyBlockRootRollupInputs to buffer and deserializes it back`, () => { + const expected = makeEmptyBlockRootRollupInputs(); + const buffer = expected.toBuffer(); + const res = EmptyBlockRootRollupInputs.fromBuffer(buffer); + expect(res).toEqual(expected); + }); + + it(`serializes a EmptyBlockRootRollupInputs to hex string and deserializes it back`, () => { + const expected = makeEmptyBlockRootRollupInputs(); + const str = expected.toString(); + const res = EmptyBlockRootRollupInputs.fromString(str); + expect(res).toEqual(expected); + }); +}); diff --git a/yarn-project/circuits.js/src/structs/rollup/empty_block_root_rollup_inputs.ts b/yarn-project/circuits.js/src/structs/rollup/empty_block_root_rollup_inputs.ts new file mode 100644 index 00000000000..87506ad0a7c --- /dev/null +++ b/yarn-project/circuits.js/src/structs/rollup/empty_block_root_rollup_inputs.ts @@ -0,0 +1,79 @@ +import { Fr } from '@aztec/foundation/fields'; +import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; +import { type FieldsOf } from '@aztec/foundation/types'; + +import { GlobalVariables } from '../global_variables.js'; +import { AppendOnlyTreeSnapshot } from './append_only_tree_snapshot.js'; + +/** + * Represents inputs of the empty block root rollup circuit. + */ +export class EmptyBlockRootRollupInputs { + constructor( + public readonly archive: AppendOnlyTreeSnapshot, + public readonly blockHash: Fr, + public readonly globalVariables: GlobalVariables, + public readonly vkTreeRoot: Fr, + // // TODO(#7346): Temporarily added prover_id while we verify block-root proofs on L1 + public readonly proverId: Fr, + ) {} + + /** + * Serializes the inputs to a buffer. + * @returns - The inputs serialized to a buffer. + */ + toBuffer() { + return serializeToBuffer(...EmptyBlockRootRollupInputs.getFields(this)); + } + + /** + * Serializes the inputs to a hex string. + * @returns The instance serialized to a hex string. + */ + toString() { + return this.toBuffer().toString('hex'); + } + + /** + * Creates a new instance from fields. + * @param fields - Fields to create the instance from. + * @returns A new instance. + */ + static from(fields: FieldsOf): EmptyBlockRootRollupInputs { + return new EmptyBlockRootRollupInputs(...EmptyBlockRootRollupInputs.getFields(fields)); + } + + /** + * Extracts fields from an instance. + * @param fields - Fields to create the instance from. + * @returns An array of fields. + */ + static getFields(fields: FieldsOf) { + return [fields.archive, fields.blockHash, fields.globalVariables, fields.vkTreeRoot, fields.proverId] as const; + } + + /** + * Deserializes the inputs from a buffer. + * @param buffer - A buffer to deserialize from. + * @returns A new RootRollupInputs instance. + */ + static fromBuffer(buffer: Buffer | BufferReader): EmptyBlockRootRollupInputs { + const reader = BufferReader.asReader(buffer); + return new EmptyBlockRootRollupInputs( + reader.readObject(AppendOnlyTreeSnapshot), + Fr.fromBuffer(reader), + GlobalVariables.fromBuffer(reader), + Fr.fromBuffer(reader), + Fr.fromBuffer(reader), + ); + } + + /** + * Deserializes the inputs from a hex string. + * @param str - A hex string to deserialize from. + * @returns A new RootRollupInputs instance. + */ + static fromString(str: string) { + return EmptyBlockRootRollupInputs.fromBuffer(Buffer.from(str, 'hex')); + } +} diff --git a/yarn-project/circuits.js/src/tests/factories.ts b/yarn-project/circuits.js/src/tests/factories.ts index 074a0714bf1..50f332c96d9 100644 --- a/yarn-project/circuits.js/src/tests/factories.ts +++ b/yarn-project/circuits.js/src/tests/factories.ts @@ -170,6 +170,7 @@ import { FeeRecipient, } from '../structs/rollup/block_root_or_block_merge_public_inputs.js'; import { BlockRootRollupInputs } from '../structs/rollup/block_root_rollup.js'; +import { EmptyBlockRootRollupInputs } from '../structs/rollup/empty_block_root_rollup_inputs.js'; import { PreviousRollupBlockData } from '../structs/rollup/previous_rollup_block_data.js'; import { RollupValidationRequests } from '../structs/rollup_validation_requests.js'; @@ -1060,6 +1061,25 @@ export function makeBlockRootRollupInputs(seed = 0, globalVariables?: GlobalVari ); } +/** + * Makes empty block root rollup inputs. + * @param seed - The seed to use for generating the root rollup inputs. + * @param globalVariables - The global variables to use. + * @returns A block root rollup inputs. + */ +export function makeEmptyBlockRootRollupInputs( + seed = 0, + globalVariables?: GlobalVariables, +): EmptyBlockRootRollupInputs { + return new EmptyBlockRootRollupInputs( + makeAppendOnlyTreeSnapshot(seed), + fr(seed + 0x100), + globalVariables ?? makeGlobalVariables(seed + 0x200), + fr(seed + 0x300), + fr(seed + 0x400), + ); +} + export function makeRootParityInput( proofSize: PROOF_LENGTH, seed = 0, diff --git a/yarn-project/cli-wallet/src/cmds/deploy.ts b/yarn-project/cli-wallet/src/cmds/deploy.ts index 804f755d684..5d5779b41b6 100644 --- a/yarn-project/cli-wallet/src/cmds/deploy.ts +++ b/yarn-project/cli-wallet/src/cmds/deploy.ts @@ -79,7 +79,7 @@ export async function deploy( partialAddress: partialAddress.toString(), initializationHash: instance.initializationHash.toString(), salt: salt.toString(), - transactionFee: deployed.transactionFee, + transactionFee: deployed.transactionFee?.toString(), }); } else { log(`Contract deployed at ${address.toString()}`); diff --git a/yarn-project/cli/src/cmds/devnet/bootstrap_network.ts b/yarn-project/cli/src/cmds/devnet/bootstrap_network.ts index 5d5ef4eff6b..55b3d945513 100644 --- a/yarn-project/cli/src/cmds/devnet/bootstrap_network.ts +++ b/yarn-project/cli/src/cmds/devnet/bootstrap_network.ts @@ -100,13 +100,11 @@ export async function bootstrapNetwork( * Step 1. Deploy the L1 contracts, but don't initialize */ async function deployERC20({ walletClient, publicClient }: L1Clients) { - const { PortalERC20Abi, PortalERC20Bytecode, TokenPortalAbi, TokenPortalBytecode } = await import( - '@aztec/l1-artifacts' - ); + const { TestERC20Abi, TestERC20Bytecode, TokenPortalAbi, TokenPortalBytecode } = await import('@aztec/l1-artifacts'); const erc20: ContractArtifacts = { - contractAbi: PortalERC20Abi, - contractBytecode: PortalERC20Bytecode, + contractAbi: TestERC20Abi, + contractBytecode: TestERC20Bytecode, }; const portal: ContractArtifacts = { contractAbi: TokenPortalAbi, diff --git a/yarn-project/cli/src/cmds/l1/deploy_l1_verifier.ts b/yarn-project/cli/src/cmds/l1/deploy_l1_verifier.ts index 656986f5b58..f2a9f8b8a6a 100644 --- a/yarn-project/cli/src/cmds/l1/deploy_l1_verifier.ts +++ b/yarn-project/cli/src/cmds/l1/deploy_l1_verifier.ts @@ -1,5 +1,5 @@ import { createCompatibleClient } from '@aztec/aztec.js'; -import { createEthereumChain, createL1Clients, deployL1Contract } from '@aztec/ethereum'; +import { compileContract, createEthereumChain, createL1Clients, deployL1Contract } from '@aztec/ethereum'; import { type DebugLogger, type LogFn } from '@aztec/foundation/log'; import { InvalidOptionArgumentError } from 'commander'; @@ -24,41 +24,7 @@ export async function deployUltraHonkVerifier( // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - Importing bb-prover even in devDeps results in a circular dependency error through @aztec/simulator. Need to ignore because this line doesn't cause an error in a dev environment const { BBCircuitVerifier } = await import('@aztec/bb-prover'); - - const circuitVerifier = await BBCircuitVerifier.new({ bbBinaryPath, bbWorkingDirectory }); - const contractSrc = await circuitVerifier.generateSolidityContract( - 'BlockRootRollupFinalArtifact', - 'UltraHonkVerifier.sol', - ); - log('Generated UltraHonkVerifier contract'); - - const input = { - language: 'Solidity', - sources: { - 'UltraHonkVerifier.sol': { - content: contractSrc, - }, - }, - settings: { - // we require the optimizer - optimizer: { - enabled: true, - runs: 200, - }, - evmVersion: 'paris', - outputSelection: { - '*': { - '*': ['evm.bytecode.object', 'abi'], - }, - }, - }, - }; - - const output = JSON.parse(solc.compile(JSON.stringify(input))); - log('Compiled UltraHonkVerifier'); - - const abi = output.contracts['UltraHonkVerifier.sol']['HonkVerifier'].abi; - const bytecode: string = output.contracts['UltraHonkVerifier.sol']['HonkVerifier'].evm.bytecode.object; + const verifier = await BBCircuitVerifier.new({ bbBinaryPath, bbWorkingDirectory }); const { publicClient, walletClient } = createL1Clients( ethRpcUrl, @@ -66,9 +32,6 @@ export async function deployUltraHonkVerifier( createEthereumChain(ethRpcUrl, l1ChainId).chainInfo, ); - const { address: verifierAddress } = await deployL1Contract(walletClient, publicClient, abi, `0x${bytecode}`); - log(`Deployed HonkVerifier at ${verifierAddress.toString()}`); - const pxe = await createCompatibleClient(pxeRpcUrl, debugLogger); const { l1ContractAddresses } = await pxe.getNodeInfo(); @@ -80,7 +43,23 @@ export async function deployUltraHonkVerifier( client: walletClient, }); - await rollup.write.setVerifier([verifierAddress.toString()]); + // REFACTOR: Extract this method to a common package. We need a package that deals with L1 + // but also has a reference to L1 artifacts and bb-prover. + const setupVerifier = async ( + artifact: Parameters<(typeof verifier)['generateSolidityContract']>[0], // Cannot properly import the type here due to the hack above + ) => { + const contract = await verifier.generateSolidityContract(artifact, 'UltraHonkVerifier.sol'); + log(`Generated UltraHonkVerifier contract for ${artifact}`); + const { abi, bytecode } = compileContract('UltraHonkVerifier.sol', 'HonkVerifier', contract, solc); + log(`Compiled UltraHonkVerifier contract for ${artifact}`); + const { address: verifierAddress } = await deployL1Contract(walletClient, publicClient, abi, bytecode); + log(`Deployed real ${artifact} verifier at ${verifierAddress}`); + await rollup.write.setEpochVerifier([verifierAddress.toString()]); + log(`Set ${artifact} verifier in ${rollup.address} rollup contract to ${verifierAddress}`); + }; + + await setupVerifier('RootRollupArtifact'); + log(`Rollup accepts only real proofs now`); } @@ -117,6 +96,6 @@ export async function deployMockVerifier( client: walletClient, }); - await rollup.write.setVerifier([mockVerifierAddress.toString()]); + await rollup.write.setEpochVerifier([mockVerifierAddress.toString()]); log(`Rollup accepts only fake proofs now`); } diff --git a/yarn-project/cli/src/cmds/l1/get_l1_balance.ts b/yarn-project/cli/src/cmds/l1/get_l1_balance.ts index 43f75ae5cde..c89cbb95954 100644 --- a/yarn-project/cli/src/cmds/l1/get_l1_balance.ts +++ b/yarn-project/cli/src/cmds/l1/get_l1_balance.ts @@ -1,7 +1,7 @@ import { type EthAddress } from '@aztec/circuits.js'; import { createEthereumChain } from '@aztec/ethereum'; import { type LogFn } from '@aztec/foundation/log'; -import { PortalERC20Abi } from '@aztec/l1-artifacts'; +import { TestERC20Abi } from '@aztec/l1-artifacts'; import { createPublicClient, getContract, http } from 'viem'; @@ -22,7 +22,7 @@ export async function getL1Balance( if (token) { const gasL1 = getContract({ address: token.toString(), - abi: PortalERC20Abi, + abi: TestERC20Abi, client: publicClient, }); diff --git a/yarn-project/cli/src/utils/aztec.ts b/yarn-project/cli/src/utils/aztec.ts index 71919cd8ec7..2c6f4316ee2 100644 --- a/yarn-project/cli/src/utils/aztec.ts +++ b/yarn-project/cli/src/utils/aztec.ts @@ -72,8 +72,8 @@ export async function deployAztecContracts( FeeJuicePortalAbi, FeeJuicePortalBytecode, - PortalERC20Abi, - PortalERC20Bytecode, + TestERC20Abi, + TestERC20Bytecode, } = await import('@aztec/l1-artifacts'); const { createEthereumChain, deployL1Contracts } = await import('@aztec/ethereum'); const { mnemonicToAccount, privateKeyToAccount } = await import('viem/accounts'); @@ -100,8 +100,8 @@ export async function deployAztecContracts( contractBytecode: RollupBytecode, }, feeJuice: { - contractAbi: PortalERC20Abi, - contractBytecode: PortalERC20Bytecode, + contractAbi: TestERC20Abi, + contractBytecode: TestERC20Bytecode, }, feeJuicePortal: { contractAbi: FeeJuicePortalAbi, diff --git a/yarn-project/cli/src/utils/portal_manager.ts b/yarn-project/cli/src/utils/portal_manager.ts index a30040f42c9..265ca2f5f95 100644 --- a/yarn-project/cli/src/utils/portal_manager.ts +++ b/yarn-project/cli/src/utils/portal_manager.ts @@ -1,7 +1,7 @@ // REFACTOR: This file has been shamelessly copied from yarn-project/end-to-end/src/shared/gas_portal_test_harness.ts // We should make this a shared utility in the aztec.js package. import { type AztecAddress, type DebugLogger, type EthAddress, Fr, type PXE, computeSecretHash } from '@aztec/aztec.js'; -import { FeeJuicePortalAbi, PortalERC20Abi, TokenPortalAbi } from '@aztec/l1-artifacts'; +import { FeeJuicePortalAbi, TestERC20Abi, TokenPortalAbi } from '@aztec/l1-artifacts'; import { type Account, @@ -31,7 +31,7 @@ function generateClaimSecret(): [Fr, Fr] { } class L1TokenManager { - private contract: GetContractReturnType>; + private contract: GetContractReturnType>; public constructor( public readonly address: EthAddress, @@ -41,7 +41,7 @@ class L1TokenManager { ) { this.contract = getContract({ address: this.address.toString(), - abi: PortalERC20Abi, + abi: TestERC20Abi, client: this.walletClient, }); } diff --git a/yarn-project/end-to-end/.prettierignore b/yarn-project/end-to-end/.prettierignore index d16e4d38d98..b1979911a8c 100644 --- a/yarn-project/end-to-end/.prettierignore +++ b/yarn-project/end-to-end/.prettierignore @@ -1,2 +1,2 @@ src/e2e_sandbox_example.test.ts -src/fixtures/dumps/block_result.json +src/fixtures/dumps/*.json diff --git a/yarn-project/end-to-end/Dockerfile b/yarn-project/end-to-end/Dockerfile index 215a0fb1f97..613edc427d3 100644 --- a/yarn-project/end-to-end/Dockerfile +++ b/yarn-project/end-to-end/Dockerfile @@ -39,7 +39,7 @@ RUN rm -rf /usr/src/noir-projects /usr/src/l1-contracts # Anvil. Hacky, but can't be bothered handling foundry image as we're moving to earthly. RUN curl -L https://foundry.paradigm.xyz | bash -RUN /root/.foundry/bin/foundryup --version nightly-de33b6af53005037b463318d2628b5cfcaf39916 && mkdir -p /usr/src/foundry/bin && cp /root/.foundry/bin/anvil /usr/src/foundry/bin/anvil +RUN /root/.foundry/bin/foundryup --version nightly-25f24e677a6a32a62512ad4f561995589ac2c7dc && mkdir -p /usr/src/foundry/bin && cp /root/.foundry/bin/anvil /usr/src/foundry/bin/anvil # Create minimal image. FROM node:18.19.1-slim diff --git a/yarn-project/end-to-end/Earthfile b/yarn-project/end-to-end/Earthfile index 2cf744c225d..de86cd9f3eb 100644 --- a/yarn-project/end-to-end/Earthfile +++ b/yarn-project/end-to-end/Earthfile @@ -8,6 +8,10 @@ e2e-l1-with-wall-time: LOCALLY RUN ./scripts/e2e_test.sh ./src/e2e_l1_with_wall_time.test.ts +e2e-synching: + LOCALLY + RUN ./scripts/e2e_test.sh ./src/e2e_synching.test.ts + e2e-2-pxes: LOCALLY RUN ./scripts/e2e_test.sh ./src/e2e_2_pxes.test.ts @@ -20,9 +24,9 @@ e2e-prover-full: LOCALLY RUN HARDWARE_CONCURRENCY=${HARDWARE_CONCURRENCY:-32} ./scripts/e2e_test.sh ./src/e2e_prover/full -e2e-prover-with-padding: +e2e-prover-fake-proofs: LOCALLY - RUN HARDWARE_CONCURRENCY=${HARDWARE_CONCURRENCY:-32} ./scripts/e2e_test.sh ./src/e2e_prover/with_padding + RUN FAKE_PROOFS=1 ./scripts/e2e_test.sh ./src/e2e_prover/full e2e-account-contracts: LOCALLY @@ -68,10 +72,6 @@ e2e-deploy-contract: LOCALLY RUN ./scripts/e2e_test.sh ./src/e2e_deploy_contract -e2e-encryption: - LOCALLY - RUN ./scripts/e2e_test.sh ./src/e2e_encryption.test.ts - e2e-escrow-contract: LOCALLY RUN ./scripts/e2e_test.sh ./src/e2e_escrow_contract.test.ts @@ -120,10 +120,6 @@ e2e-private-voting-contract: LOCALLY RUN ./scripts/e2e_test.sh ./src/e2e_private_voting_contract.test.ts -e2e-prover-node: - LOCALLY - RUN ./scripts/e2e_test.sh ./src/e2e_prover_node.test.ts - e2e-fees-private-payments: LOCALLY RUN ./scripts/e2e_test.sh ./src/e2e_fees/private_payments.test.ts @@ -140,9 +136,9 @@ e2e-fees-dapp-subscription: LOCALLY RUN ./scripts/e2e_test.sh ./src/e2e_fees/dapp_subscription.test.ts -# e2e-fees-failures: -# LOCALLY -# RUN ./scripts/e2e_test.sh ./src/e2e_fees/failures.test.ts +e2e-fees-failures: + LOCALLY + RUN ./scripts/e2e_test.sh ./src/e2e_fees/failures.test.ts e2e-fees-fee-juice-payments: LOCALLY @@ -172,6 +168,11 @@ e2e-token-contract: LOCALLY RUN ./scripts/e2e_test.sh ./src/e2e_token_contract +# https://github.com/AztecProtocol/aztec-packages/issues/8925 +# e2e-prover-coordination: +# LOCALLY +# RUN ./scripts/e2e_test.sh ./src/prover-coordination/e2e_json_coordination.test.ts + e2e-public-testnet: ARG L1_CHAIN_ID="31337" # automatically exported as ENV variables for below @@ -222,15 +223,18 @@ guides-dapp-testing: LOCALLY RUN ./scripts/e2e_compose_test.sh guides/dapp_testing.test.ts -# TODO intermittent failure -# guides-sample-dapp: -# LOCALLY -# RUN ./scripts/e2e_compose_test.sh sample-dapp +# The two tests below need to be separated, because there is some crosstalk between the two. TODO (#8813): Figure out why. +guides-sample-dapp-ci: + LOCALLY + RUN ./scripts/e2e_compose_test.sh sample-dapp/ci/index.test.mjs -# TODO currently hangs for hour+ -# guides-up-quick-start: -# LOCALLY -# RUN ./scripts/e2e_compose_test.sh guides/up_quick_start.test.ts +guides-sample-dapp: + LOCALLY + RUN ./scripts/e2e_compose_test.sh sample-dapp/index.test.mjs + +guides-up-quick-start: + LOCALLY + RUN ./scripts/e2e_compose_test.sh guides/up_quick_start.test.ts bench-publish-rollup: LOCALLY @@ -289,9 +293,11 @@ e2e-cli-wallet: RUN COMPOSE_FILE=scripts/docker-compose-wallet.yml ./scripts/e2e_compose_test.sh e2e_cli_wallet network-smoke: + ARG values_file LOCALLY - RUN NAMESPACE=smoke FRESH_INSTALL=true FORCE_BUILD=$force_build VALUES_FILE=${values_file:-default.yaml} ./scripts/network_test.sh ./src/spartan/smoke.test.ts + RUN NAMESPACE=smoke FRESH_INSTALL=true VALUES_FILE=${values_file:-default.yaml} ./scripts/network_test.sh ./src/spartan/smoke.test.ts network-transfer: + ARG values_file LOCALLY - RUN NAMESPACE=transfer FRESH_INSTALL=true FORCE_BUILD=$force_build VALUES_FILE=${values_file:-default.yaml} ./scripts/network_test.sh ./src/spartan/transfer.test.ts + RUN NAMESPACE=transfer FRESH_INSTALL=true VALUES_FILE=${values_file:-default.yaml} ./scripts/network_test.sh ./src/spartan/transfer.test.ts diff --git a/yarn-project/end-to-end/scripts/deflaker.sh b/yarn-project/end-to-end/scripts/deflaker.sh new file mode 100755 index 00000000000..072a5f2952a --- /dev/null +++ b/yarn-project/end-to-end/scripts/deflaker.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +testname=$1 +script_dir=$(dirname "$0") + +for i in {1..100} +do + echo "Run #$i" + if ! yarn test $1 > $script_dir/deflaker.log 2>&1; then + echo "failed" + exit 1 + fi +done +echo "success" diff --git a/yarn-project/end-to-end/scripts/docker-compose-no-sandbox.yml b/yarn-project/end-to-end/scripts/docker-compose-no-sandbox.yml index 23353de37dc..c11eca2414c 100644 --- a/yarn-project/end-to-end/scripts/docker-compose-no-sandbox.yml +++ b/yarn-project/end-to-end/scripts/docker-compose-no-sandbox.yml @@ -1,7 +1,7 @@ version: '3' services: fork: - image: aztecprotocol/foundry:de33b6af53005037b463318d2628b5cfcaf39916 + image: aztecprotocol/foundry:25f24e677a6a32a62512ad4f561995589ac2c7dc-${ARCH_TAG:-amd64} pull_policy: always entrypoint: > sh -c ' diff --git a/yarn-project/end-to-end/scripts/docker-compose-p2p.yml b/yarn-project/end-to-end/scripts/docker-compose-p2p.yml index dd07cd209f2..57f3b51c8fb 100644 --- a/yarn-project/end-to-end/scripts/docker-compose-p2p.yml +++ b/yarn-project/end-to-end/scripts/docker-compose-p2p.yml @@ -1,7 +1,7 @@ version: '3' services: fork: - image: aztecprotocol/foundry:de33b6af53005037b463318d2628b5cfcaf39916 + image: aztecprotocol/foundry:25f24e677a6a32a62512ad4f561995589ac2c7dc-${ARCH_TAG:-amd64} pull_policy: always entrypoint: 'anvil --silent -p 8545 --host 0.0.0.0 --chain-id 31337' expose: diff --git a/yarn-project/end-to-end/scripts/docker-compose-wallet.yml b/yarn-project/end-to-end/scripts/docker-compose-wallet.yml index 6c30f54a345..f896569f7ca 100644 --- a/yarn-project/end-to-end/scripts/docker-compose-wallet.yml +++ b/yarn-project/end-to-end/scripts/docker-compose-wallet.yml @@ -1,7 +1,7 @@ version: '3' services: fork: - image: aztecprotocol/foundry:de33b6af53005037b463318d2628b5cfcaf39916 + image: aztecprotocol/foundry:25f24e677a6a32a62512ad4f561995589ac2c7dc-${ARCH_TAG:-amd64} pull_policy: always entrypoint: > sh -c ' diff --git a/yarn-project/end-to-end/scripts/docker-compose.yml b/yarn-project/end-to-end/scripts/docker-compose.yml index 3c9e447afbb..cebb63ff048 100644 --- a/yarn-project/end-to-end/scripts/docker-compose.yml +++ b/yarn-project/end-to-end/scripts/docker-compose.yml @@ -1,7 +1,7 @@ version: '3' services: fork: - image: aztecprotocol/foundry:de33b6af53005037b463318d2628b5cfcaf39916 + image: aztecprotocol/foundry:25f24e677a6a32a62512ad4f561995589ac2c7dc-${ARCH_TAG:-amd64} pull_policy: always entrypoint: > sh -c ' diff --git a/yarn-project/end-to-end/scripts/e2e_compose_test.sh b/yarn-project/end-to-end/scripts/e2e_compose_test.sh index c82338c9b8b..eb3e419f614 100755 --- a/yarn-project/end-to-end/scripts/e2e_compose_test.sh +++ b/yarn-project/end-to-end/scripts/e2e_compose_test.sh @@ -19,6 +19,15 @@ COMPOSE_FILE="${COMPOSE_FILE:-./scripts/docker-compose.yml}" export DEBUG="${DEBUG:-aztec:*}" export HARDWARE_CONCURRENCY="${HARDWARE_CONCURRENCY:-}" export AZTEC_DOCKER_TAG="${AZTEC_DOCKER_TAG:-$(git rev-parse HEAD)}" + +# Set the ARCH_TAG variable for docker compose +ARCH=$(uname -m) +if [ "$ARCH" = "arm64" ] || [ "$ARCH" = "aarch64" ]; then + export ARCH_TAG="arm64" +else + export ARCH_TAG="amd64" +fi + FORCE_BUILD="${FORCE_BUILD:-true}" # Compute project_name diff --git a/yarn-project/end-to-end/scripts/e2e_test.sh b/yarn-project/end-to-end/scripts/e2e_test.sh index 5faec984d16..f826a164000 100755 --- a/yarn-project/end-to-end/scripts/e2e_test.sh +++ b/yarn-project/end-to-end/scripts/e2e_test.sh @@ -10,6 +10,7 @@ set -eu TEST="$1" # Default values for environment variables HARDWARE_CONCURRENCY="${HARDWARE_CONCURRENCY:-}" +FAKE_PROOFS="${FAKE_PROOFS:-}" AZTEC_DOCKER_TAG=$(git rev-parse HEAD) if ! docker image ls --format '{{.Repository}}:{{.Tag}}' | grep -q "aztecprotocol/end-to-end:$AZTEC_DOCKER_TAG"; then @@ -17,4 +18,4 @@ if ! docker image ls --format '{{.Repository}}:{{.Tag}}' | grep -q "aztecprotoco exit 1 fi -docker run -e HARDWARE_CONCURRENCY="$HARDWARE_CONCURRENCY" --rm aztecprotocol/end-to-end:$AZTEC_DOCKER_TAG "$TEST" +docker run -e HARDWARE_CONCURRENCY="$HARDWARE_CONCURRENCY" -e FAKE_PROOFS="$FAKE_PROOFS" --rm aztecprotocol/end-to-end:$AZTEC_DOCKER_TAG "$TEST" diff --git a/yarn-project/end-to-end/scripts/network_test.sh b/yarn-project/end-to-end/scripts/network_test.sh index 77f92f0b14e..00e58e54f4a 100755 --- a/yarn-project/end-to-end/scripts/network_test.sh +++ b/yarn-project/end-to-end/scripts/network_test.sh @@ -9,7 +9,9 @@ # FRESH_INSTALL (default: "false") # AZTEC_DOCKER_TAG (default: current git commit) -set -eu +set -eux + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Main positional parameter TEST="$1" @@ -28,7 +30,7 @@ fi if ! docker image ls --format '{{.Repository}}:{{.Tag}}' | grep -q "aztecprotocol/aztec:$AZTEC_DOCKER_TAG" || \ ! docker image ls --format '{{.Repository}}:{{.Tag}}' | grep -q "aztecprotocol/end-to-end:$AZTEC_DOCKER_TAG"; then - echo "Docker images not found. They need to be built with 'earthly ./yarn-project/+export-test-images' or otherwise tagged with aztecprotocol/aztec:$AZTEC_DOCKER_TAG and aztecprotocol/end-to-end:$AZTEC_DOCKER_TAG." + echo "Docker images not found. They need to be built with 'earthly ./yarn-project/+export-e2e-test-images' or otherwise tagged with aztecprotocol/aztec:$AZTEC_DOCKER_TAG and aztecprotocol/end-to-end:$AZTEC_DOCKER_TAG." exit 1 fi @@ -41,18 +43,45 @@ if [ "$FRESH_INSTALL" = "true" ]; then kubectl delete namespace "$NAMESPACE" --ignore-not-found=true --wait=true --now --timeout=10m fi +function show_status_until_pxe_ready() { + set +x # don't spam with our commands + sleep 15 # let helm upgrade start + for i in {1..100} ; do + if kubectl wait pod -l app==pxe --for=condition=Ready -n "transfer" --timeout=20s >/dev/null 2>/dev/null ; then + break # we are up, stop showing status + fi + # show startup status + kubectl get pods -n "$NAMESPACE" + done +} + +show_status_until_pxe_ready & + # Install the Helm chart -helm install spartan spartan/aztec-network/ \ +helm upgrade --install spartan "$(git rev-parse --show-toplevel)/spartan/aztec-network/" \ --namespace "$NAMESPACE" \ --create-namespace \ --values "$(git rev-parse --show-toplevel)/spartan/aztec-network/values/$VALUES_FILE" \ - --set images.test.image="aztecprotocol/end-to-end:$AZTEC_DOCKER_TAG" \ --set images.aztec.image="aztecprotocol/aztec:$AZTEC_DOCKER_TAG" \ - --set test="$TEST" \ + --set ingress.enabled=true \ --wait \ --wait-for-jobs=true \ - --timeout=10m + --timeout=30m kubectl wait pod -l app==pxe --for=condition=Ready -n "$NAMESPACE" --timeout=10m -helm test spartan --namespace "$NAMESPACE" --timeout 30m +function forward_pxe_k8s_port() { + # NOTE we fail silently, and work in the background + kubectl port-forward --namespace transfer svc/spartan-aztec-network-pxe 9082:8080 2>/dev/null >/dev/null || true +} +# tunnel in to get access directly to our PXE service in k8s +(kubectl port-forward --namespace transfer svc/spartan-aztec-network-pxe 9082:8080 2>/dev/null >/dev/null || true) & + +# run our test in the host network namespace (so we can access the above with localhost) +docker run --rm --network=host \ + -e SCENARIO=default \ + -e PXE_URL=http://localhost:9082 \ + -e DEBUG="aztec:*" \ + -e LOG_LEVEL=debug \ + -e LOG_JSON=1 \ + aztecprotocol/end-to-end:$AZTEC_DOCKER_TAG $TEST diff --git a/yarn-project/end-to-end/src/composed/integration_l1_publisher.test.ts b/yarn-project/end-to-end/src/composed/integration_l1_publisher.test.ts index 06709cf7028..691d0c3aae6 100644 --- a/yarn-project/end-to-end/src/composed/integration_l1_publisher.test.ts +++ b/yarn-project/end-to-end/src/composed/integration_l1_publisher.test.ts @@ -11,8 +11,7 @@ import { } from '@aztec/aztec.js'; // eslint-disable-next-line no-restricted-imports import { - type BlockSimulator, - PROVING_STATUS, + type BlockBuilder, type ProcessedTx, makeEmptyProcessedTx as makeEmptyProcessedTxFromHistoricalTreeRoots, makeProcessedTx, @@ -90,7 +89,7 @@ describe('L1Publisher integration', () => { let publisher: L1Publisher; - let builder: BlockSimulator; + let builder: BlockBuilder; let builderDb: MerkleTrees; // The header of the last block @@ -126,6 +125,7 @@ describe('L1Publisher integration', () => { config.l1RpcUrl, deployerAccount, logger, + { assumeProvenThrough: undefined }, )); ethCheatCodes = new EthCheatCodes(config.l1RpcUrl); @@ -251,6 +251,7 @@ describe('L1Publisher integration', () => { // The json formatting in forge is a bit brittle, so we convert Fr to a number in the few values below. // This should not be a problem for testing as long as the values are not larger than u32. archive: `0x${block.archive.root.toBuffer().toString('hex').padStart(64, '0')}`, + blockHash: `0x${block.hash().toBuffer().toString('hex').padStart(64, '0')}`, body: `0x${block.body.toBuffer().toString('hex')}`, txsEffectsHash: `0x${block.body.getTxsEffectsHash().toString('hex').padStart(64, '0')}`, decodedHeader: { @@ -312,11 +313,11 @@ describe('L1Publisher integration', () => { }; const buildBlock = async (globalVariables: GlobalVariables, txs: ProcessedTx[], l1ToL2Messages: Fr[]) => { - const blockTicket = await builder.startNewBlock(txs.length, globalVariables, l1ToL2Messages); + await builder.startNewBlock(txs.length, globalVariables, l1ToL2Messages); for (const tx of txs) { await builder.addNewTx(tx); } - return blockTicket; + return builder.setBlockCompleted(); }; it(`Build ${numberOfConsecutiveBlocks} blocks of 4 bloated txs building on each other`, async () => { @@ -363,11 +364,8 @@ describe('L1Publisher integration', () => { feeRecipient, GasFees.empty(), ); - const ticket = await buildBlock(globalVariables, txs, currentL1ToL2Messages); - const result = await ticket.provingPromise; - expect(result.status).toBe(PROVING_STATUS.SUCCESS); - const blockResult = await builder.finaliseBlock(); - const block = blockResult.block; + + const block = await buildBlock(globalVariables, txs, currentL1ToL2Messages); prevHeader = block.header; blockSource.getL1ToL2Messages.mockResolvedValueOnce(currentL1ToL2Messages); blockSource.getBlocks.mockResolvedValueOnce([block]); @@ -471,12 +469,7 @@ describe('L1Publisher integration', () => { feeRecipient, GasFees.empty(), ); - const blockTicket = await buildBlock(globalVariables, txs, l1ToL2Messages); - await builder.setBlockCompleted(); - const result = await blockTicket.provingPromise; - expect(result.status).toBe(PROVING_STATUS.SUCCESS); - const blockResult = await builder.finaliseBlock(); - const block = blockResult.block; + const block = await buildBlock(globalVariables, txs, l1ToL2Messages); prevHeader = block.header; blockSource.getL1ToL2Messages.mockResolvedValueOnce(l1ToL2Messages); blockSource.getBlocks.mockResolvedValueOnce([block]); diff --git a/yarn-project/end-to-end/src/composed/integration_proof_verification.test.ts b/yarn-project/end-to-end/src/composed/integration_proof_verification.test.ts index 402cfe3fe81..4463505fb1f 100644 --- a/yarn-project/end-to-end/src/composed/integration_proof_verification.test.ts +++ b/yarn-project/end-to-end/src/composed/integration_proof_verification.test.ts @@ -1,9 +1,9 @@ -import { L2Block, deployL1Contract, fileURLToPath } from '@aztec/aztec.js'; +import { deployL1Contract, fileURLToPath } from '@aztec/aztec.js'; import { BBCircuitVerifier } from '@aztec/bb-prover'; -import { Fr, Proof } from '@aztec/circuits.js'; -import { type L1ContractAddresses } from '@aztec/ethereum'; +import { Proof, RootRollupPublicInputs } from '@aztec/circuits.js'; +import { compileContract, createL1Clients } from '@aztec/ethereum'; import { type Logger } from '@aztec/foundation/log'; -import { BufferReader } from '@aztec/foundation/serialize'; +import { IVerifierAbi } from '@aztec/l1-artifacts'; import { type Anvil } from '@viem/anvil'; import { readFile } from 'fs/promises'; @@ -14,6 +14,7 @@ import { type Account, type Chain, type GetContractReturnType, + type Hex, type HttpTransport, type PublicClient, type WalletClient, @@ -24,28 +25,23 @@ import { mnemonicToAccount } from 'viem/accounts'; import { MNEMONIC } from '../fixtures/fixtures.js'; import { getACVMConfig } from '../fixtures/get_acvm_config.js'; import { getBBConfig } from '../fixtures/get_bb_config.js'; -import { getLogger, setupL1Contracts, startAnvil } from '../fixtures/utils.js'; +import { getLogger, startAnvil } from '../fixtures/utils.js'; /** * Regenerate this test's fixture with - * AZTEC_GENERATE_TEST_DATA=1 yarn workspace @aztec/end-to-end test e2e_prover + * AZTEC_GENERATE_TEST_DATA=1 yarn workspace @aztec/prover-client test bb_prover_full_rollup */ describe('proof_verification', () => { let proof: Proof; - let proverId: Fr; - let vkTreeRoot: Fr; - let block: L2Block; - let aggregationObject: Fr[]; + let publicInputs: RootRollupPublicInputs; let anvil: Anvil | undefined; let walletClient: WalletClient; let publicClient: PublicClient; - // eslint-disable-next-line - let l1ContractAddresses: L1ContractAddresses; let logger: Logger; let circuitVerifier: BBCircuitVerifier; let bbTeardown: () => Promise; let acvmTeardown: () => Promise; - let verifierContract: GetContractReturnType; + let verifierContract: GetContractReturnType; beforeAll(async () => { logger = getLogger(); @@ -55,13 +51,6 @@ describe('proof_verification', () => { } logger.info('Anvil started'); - ({ l1ContractAddresses, publicClient, walletClient } = await setupL1Contracts( - rpcUrl, - mnemonicToAccount(MNEMONIC), - logger, - )); - logger.info('l1 contracts done'); - const bb = await getBBConfig(logger); const acvm = await getACVMConfig(logger); @@ -72,134 +61,54 @@ describe('proof_verification', () => { bbTeardown = bb!.cleanup; acvmTeardown = acvm!.cleanup; - logger.info('bb, acvm done'); - - const content = await circuitVerifier.generateSolidityContract( - 'BlockRootRollupFinalArtifact', - 'UltraHonkVerifier.sol', - ); - logger.info('generated contract'); - - const input = { - language: 'Solidity', - sources: { - 'UltraHonkVerifier.sol': { - content, - }, - }, - settings: { - // we require the optimizer - optimizer: { - enabled: true, - runs: 200, - }, - evmVersion: 'paris', - outputSelection: { - '*': { - '*': ['evm.bytecode.object', 'abi'], - }, - }, - }, - }; - - const output = JSON.parse(solc.compile(JSON.stringify(input))); - logger.info('compiled contract'); - - const abi = output.contracts['UltraHonkVerifier.sol']['HonkVerifier'].abi; - const bytecode: string = output.contracts['UltraHonkVerifier.sol']['HonkVerifier'].evm.bytecode.object; - - const { address: verifierAddress } = await deployL1Contract(walletClient, publicClient, abi, `0x${bytecode}`); - verifierContract = getContract({ - address: verifierAddress.toString(), - client: publicClient, - abi, - }) as any; - logger.info('deployed verifier'); + logger.info('BB and ACVM initialized'); + + ({ publicClient, walletClient } = createL1Clients(rpcUrl, mnemonicToAccount(MNEMONIC))); + const content = await circuitVerifier.generateSolidityContract('RootRollupArtifact', 'UltraHonkVerifier.sol'); + const { bytecode, abi } = compileContract('UltraHonkVerifier.sol', 'HonkVerifier', content, solc); + const { address: verifierAddress } = await deployL1Contract(walletClient, publicClient, abi, bytecode); + verifierContract = getContract({ address: verifierAddress.toString(), client: publicClient, abi: IVerifierAbi }); + logger.info('Deployed verifier'); }); afterAll(async () => { - // await ctx.teardown(); await anvil?.stop(); await bbTeardown(); await acvmTeardown(); }); beforeAll(async () => { - // regenerate with - // AZTEC_GENERATE_TEST_DATA=1 yarn workspace @aztec/end-to-end test e2e_prover - const blockResult = JSON.parse( - await readFile(join(fileURLToPath(import.meta.url), '../../fixtures/dumps/block_result.json'), 'utf-8'), + // AZTEC_GENERATE_TEST_DATA=1 yarn workspace @aztec/prover-client test bb_prover_full_rollup + const epochProof = JSON.parse( + await readFile(join(fileURLToPath(import.meta.url), '../../fixtures/dumps/epoch_proof_result.json'), 'utf-8'), ); - block = L2Block.fromString(blockResult.block); - proof = Proof.fromString(blockResult.proof); - proverId = Fr.fromString(blockResult.proverId); - vkTreeRoot = Fr.fromString(blockResult.vkTreeRoot); - aggregationObject = blockResult.aggregationObject.map((x: string) => Fr.fromString(x)); + proof = Proof.fromString(epochProof.proof); + publicInputs = RootRollupPublicInputs.fromString(epochProof.publicInputs); + }); + + describe('public inputs', () => { + it('output and proof public inputs are equal', () => { + const proofPublicInputs = proof.extractPublicInputs().map(x => x.toString()); + const aggregationObject = proof.extractAggregationObject(); + const outputPublicInputs = [...publicInputs.toFields(), ...aggregationObject].map(x => x.toString()); + + expect(proofPublicInputs).toEqual(outputPublicInputs); + }); }); describe('bb', () => { it('verifies proof', async () => { - await expect( - circuitVerifier.verifyProofForCircuit('BlockRootRollupFinalArtifact', proof), - ).resolves.toBeUndefined(); + await expect(circuitVerifier.verifyProofForCircuit('RootRollupArtifact', proof)).resolves.toBeUndefined(); }); }); - describe('HonkVerifier', () => { - it('verifies full proof', async () => { - // skip proof size which is an uint32 - const reader = BufferReader.asReader(proof.buffer.subarray(4)); - const [circuitSize, numPublicInputs, publicInputsOffset] = reader.readArray(3, Fr); - const publicInputs = reader.readArray(numPublicInputs.toNumber(), Fr).map(x => x.toString()); - - const proofStr = `0x${Buffer.concat([ - circuitSize.toBuffer(), - numPublicInputs.toBuffer(), - publicInputsOffset.toBuffer(), - reader.readToEnd(), - ]).toString('hex')}` as const; - - await expect(verifierContract.read.verify([proofStr, publicInputs])).resolves.toBeTruthy(); - }); + describe('honk verifier', () => { + it('verifies proof', async () => { + const proofStr = `0x${proof.withoutPublicInputs().toString('hex')}` as Hex; + const proofPublicInputs = proof.extractPublicInputs().map(x => x.toString()); - it('verifies proof taking public inputs from block', async () => { - const reader = BufferReader.asReader(proof.buffer.subarray(4)); - const [circuitSize, numPublicInputs, publicInputsOffset] = reader.readArray(3, Fr); - const publicInputsFromProof = reader.readArray(numPublicInputs.toNumber(), Fr).map(x => x.toString()); - - const proofStr = `0x${Buffer.concat([ - circuitSize.toBuffer(), - numPublicInputs.toBuffer(), - publicInputsOffset.toBuffer(), - reader.readToEnd(), - ]).toString('hex')}` as const; - - const publicInputs = [ - block.header.lastArchive.root, - block.header.globalVariables.blockNumber, - block.archive.root, - new Fr(block.archive.nextAvailableLeafIndex), - Fr.ZERO, // prev block hash - block.hash(), - ...block.header.globalVariables.toFields(), // start global vars - ...block.header.globalVariables.toFields(), // end global vars - new Fr(block.header.contentCommitment.outHash), - block.header.globalVariables.coinbase.toField(), // the fee taker's address - block.header.totalFees, // how much they got - ...Array(62).fill(Fr.ZERO), // 31 other (fee takers, fee) pairs - vkTreeRoot, - proverId, // 0x51 - ...aggregationObject, - ].map((x: Fr) => x.toString()); - - expect(publicInputs.length).toEqual(publicInputsFromProof.length); - expect(publicInputs.slice(0, 27)).toEqual(publicInputsFromProof.slice(0, 27)); - expect(publicInputs.slice(27, 89)).toEqual(publicInputsFromProof.slice(27, 89)); - expect(publicInputs.slice(89, 91)).toEqual(publicInputsFromProof.slice(89, 91)); - expect(publicInputs.slice(91)).toEqual(publicInputsFromProof.slice(91)); - - await expect(verifierContract.read.verify([proofStr, publicInputs])).resolves.toBeTruthy(); + await expect(verifierContract.read.verify([proofStr, proofPublicInputs])).resolves.toBeTruthy(); }); }); }); diff --git a/yarn-project/end-to-end/src/e2e_block_building.test.ts b/yarn-project/end-to-end/src/e2e_block_building.test.ts index 0cb5ea031b5..52579d5870c 100644 --- a/yarn-project/end-to-end/src/e2e_block_building.test.ts +++ b/yarn-project/end-to-end/src/e2e_block_building.test.ts @@ -22,7 +22,6 @@ import { TokenContract } from '@aztec/noir-contracts.js/Token'; import 'jest-extended'; -import { TaggedLog } from '../../circuit-types/src/logs/l1_payload/tagged_log.js'; import { DUPLICATE_NULLIFIER_ERROR } from './fixtures/fixtures.js'; import { setup } from './fixtures/utils.js'; @@ -293,13 +292,13 @@ describe('e2e_block_building', () => { // compare logs expect(rct.status).toEqual('success'); - const decryptedLogs = tx.noteEncryptedLogs - .unrollLogs() - .map(l => TaggedLog.decryptAsIncoming(l.data, keys.masterIncomingViewingSecretKey, L1NotePayload)); - const notevalues = decryptedLogs.map(l => l?.payload.note.items[0]); - expect(notevalues[0]).toEqual(new Fr(10)); - expect(notevalues[1]).toEqual(new Fr(11)); - expect(notevalues[2]).toEqual(new Fr(12)); + const noteValues = tx.noteEncryptedLogs.unrollLogs().map(l => { + const notePayload = L1NotePayload.decryptAsIncoming(l, keys.masterIncomingViewingSecretKey); + return notePayload?.note.items[0]; + }); + expect(noteValues[0]).toEqual(new Fr(10)); + expect(noteValues[1]).toEqual(new Fr(11)); + expect(noteValues[2]).toEqual(new Fr(12)); }, 30_000); it('calls a method with nested encrypted logs', async () => { @@ -369,7 +368,7 @@ describe('e2e_block_building', () => { }); // Regression for https://github.com/AztecProtocol/aztec-packages/issues/8306 - it('can simulate public txs while building a block', async () => { + it.skip('can simulate public txs while building a block', async () => { ({ teardown, pxe, diff --git a/yarn-project/end-to-end/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts b/yarn-project/end-to-end/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts index 6f0f889e4eb..168aa7fe72c 100644 --- a/yarn-project/end-to-end/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +++ b/yarn-project/end-to-end/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts @@ -11,7 +11,7 @@ import { createDebugLogger, } from '@aztec/aztec.js'; import { createL1Clients } from '@aztec/ethereum'; -import { InboxAbi, OutboxAbi, PortalERC20Abi, RollupAbi, TokenPortalAbi } from '@aztec/l1-artifacts'; +import { InboxAbi, OutboxAbi, RollupAbi, TestERC20Abi, TokenPortalAbi } from '@aztec/l1-artifacts'; import { TokenBridgeContract, TokenContract } from '@aztec/noir-contracts.js'; import { type Chain, type HttpTransport, type PublicClient, getContract } from 'viem'; @@ -158,7 +158,7 @@ export class CrossChainMessagingTest { }); const underlyingERC20 = getContract({ address: crossChainContext.underlying.toString(), - abi: PortalERC20Abi, + abi: TestERC20Abi, client: walletClient, }); diff --git a/yarn-project/end-to-end/src/e2e_encryption.test.ts b/yarn-project/end-to-end/src/e2e_encryption.test.ts deleted file mode 100644 index f3ff1e03632..00000000000 --- a/yarn-project/end-to-end/src/e2e_encryption.test.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { - AztecAddress, - EncryptedLogHeader, - EncryptedLogOutgoingBody, - EncryptedNoteLogIncomingBody, - Fr, - GrumpkinScalar, - Note, - type Wallet, -} from '@aztec/aztec.js'; -import { Aes128, Grumpkin } from '@aztec/circuits.js/barretenberg'; -import { TestContract } from '@aztec/noir-contracts.js'; - -import { randomBytes } from 'crypto'; - -import { setup } from './fixtures/utils.js'; - -describe('e2e_encryption', () => { - const aes128 = new Aes128(); - let grumpkin: Grumpkin; - - let wallet: Wallet; - let teardown: () => Promise; - - let contract: TestContract; - - beforeAll(async () => { - ({ teardown, wallet } = await setup()); - contract = await TestContract.deploy(wallet).send().deployed(); - grumpkin = new Grumpkin(); - }, 120_000); - - afterAll(() => teardown()); - - it('encrypts 🔒📄🔑💻', async () => { - const input = randomBytes(64); - const iv = randomBytes(16); - const key = randomBytes(16); - - const expectedCiphertext = aes128.encryptBufferCBC(input, iv, key); - - const ciphertextAsBigInts = await contract.methods - .encrypt(Array.from(input), Array.from(iv), Array.from(key)) - .simulate(); - const ciphertext = Buffer.from(ciphertextAsBigInts.map((x: bigint) => Number(x))); - - expect(ciphertext).toEqual(expectedCiphertext); - }); - - it('encrypts with padding 🔒📄🔑💻 ➕ 📦', async () => { - const input = randomBytes(65); - const iv = randomBytes(16); - const key = randomBytes(16); - - const expectedCiphertext = aes128.encryptBufferCBC(input, iv, key); - // AES 128 CBC with PKCS7 is padding to multiples of 16 bytes so from 65 bytes long input we get 80 bytes long output - expect(expectedCiphertext.length).toBe(80); - - const ciphertextAsBigInts = await contract.methods - .encrypt_with_padding(Array.from(input), Array.from(iv), Array.from(key)) - .simulate(); - const ciphertext = Buffer.from(ciphertextAsBigInts.map((x: bigint) => Number(x))); - - expect(ciphertext).toEqual(expectedCiphertext); - }); - - it('encrypts log header', async () => { - const ephSecretKey = GrumpkinScalar.random(); - const viewingSecretKey = GrumpkinScalar.random(); - - const ephPubKey = grumpkin.mul(Grumpkin.generator, ephSecretKey); - const viewingPubKey = grumpkin.mul(Grumpkin.generator, viewingSecretKey); - const header = new EncryptedLogHeader(contract.address); - - const encrypted = await contract.methods - .compute_note_header_ciphertext(ephSecretKey, viewingPubKey.toWrappedNoirStruct()) - .simulate(); - expect(Buffer.from(encrypted.map((x: bigint) => Number(x)))).toEqual( - header.computeCiphertext(ephSecretKey, viewingPubKey), - ); - - const recreated = EncryptedLogHeader.fromCiphertext(encrypted, viewingSecretKey, ephPubKey); - - expect(recreated.address).toEqual(contract.address); - }); - - it('encrypts log incoming body', async () => { - const ephSecretKey = GrumpkinScalar.random(); - const viewingSecretKey = GrumpkinScalar.random(); - - const ephPubKey = grumpkin.mul(Grumpkin.generator, ephSecretKey); - const viewingPubKey = grumpkin.mul(Grumpkin.generator, viewingSecretKey); - - const storageSlot = new Fr(1); - const noteTypeId = TestContract.artifact.notes['TestNote'].id; - const value = Fr.random(); - const note = new Note([value]); - - const body = new EncryptedNoteLogIncomingBody(storageSlot, noteTypeId, note); - - const encrypted = await contract.methods - .compute_incoming_log_body_ciphertext(ephSecretKey, viewingPubKey.toWrappedNoirStruct(), storageSlot, value) - .simulate(); - - expect(Buffer.from(encrypted.map((x: bigint) => Number(x)))).toEqual( - body.computeCiphertext(ephSecretKey, viewingPubKey), - ); - - const recreated = EncryptedNoteLogIncomingBody.fromCiphertext(encrypted, viewingSecretKey, ephPubKey); - - expect(recreated.toBuffer()).toEqual(body.toBuffer()); - }); - - it('encrypts log outgoing body', async () => { - const ephSk = GrumpkinScalar.random(); - const recipientIvsk = GrumpkinScalar.random(); - const senderOvskApp = GrumpkinScalar.random(); - - const ephPk = grumpkin.mul(Grumpkin.generator, ephSk); - const recipientIvpk = grumpkin.mul(Grumpkin.generator, recipientIvsk); - - const recipientAddress = AztecAddress.fromBigInt(BigInt('0xdeadbeef')); - - const body = new EncryptedLogOutgoingBody(ephSk, recipientAddress, recipientIvpk); - - const encrypted = await contract.methods - .compute_outgoing_log_body_ciphertext(ephSk, recipientAddress, recipientIvpk.toWrappedNoirStruct(), senderOvskApp) - .simulate(); - - expect(Buffer.from(encrypted.map((x: bigint) => Number(x)))).toEqual(body.computeCiphertext(senderOvskApp, ephPk)); - - const recreated = EncryptedLogOutgoingBody.fromCiphertext(encrypted, senderOvskApp, ephPk); - - expect(recreated.toBuffer()).toEqual(body.toBuffer()); - }); -}); diff --git a/yarn-project/end-to-end/src/e2e_event_logs.test.ts b/yarn-project/end-to-end/src/e2e_event_logs.test.ts index f436552613f..a6ed7b351bc 100644 --- a/yarn-project/end-to-end/src/e2e_event_logs.test.ts +++ b/yarn-project/end-to-end/src/e2e_event_logs.test.ts @@ -5,7 +5,6 @@ import { Fr, L1EventPayload, type PXE, - TaggedLog, } from '@aztec/aztec.js'; import { deriveMasterIncomingViewingSecretKey } from '@aztec/circuits.js'; import { EventSelector } from '@aztec/foundation/abi'; @@ -56,44 +55,37 @@ describe('Logs', () => { const encryptedLogs = txEffect!.encryptedLogs.unrollLogs(); expect(encryptedLogs.length).toBe(3); - const decryptedLog0 = TaggedLog.decryptAsIncoming( + const decryptedEvent0 = L1EventPayload.decryptAsIncoming( encryptedLogs[0], deriveMasterIncomingViewingSecretKey(wallets[0].getSecretKey()), - L1EventPayload, - ); + )!; - expect(decryptedLog0?.payload.contractAddress).toStrictEqual(testLogContract.address); - expect(decryptedLog0?.payload.randomness).toStrictEqual(randomness[0]); - expect(decryptedLog0?.payload.eventTypeId).toStrictEqual( - EventSelector.fromSignature('ExampleEvent0(Field,Field)'), - ); + expect(decryptedEvent0.contractAddress).toStrictEqual(testLogContract.address); + expect(decryptedEvent0.randomness).toStrictEqual(randomness[0]); + expect(decryptedEvent0.eventTypeId).toStrictEqual(EventSelector.fromSignature('ExampleEvent0(Field,Field)')); // We decode our event into the event type - const event0 = TestLogContract.events.ExampleEvent0.decode(decryptedLog0!.payload); + const event0 = TestLogContract.events.ExampleEvent0.decode(decryptedEvent0); // We check that the event was decoded correctly expect(event0?.value0).toStrictEqual(preimage[0].toBigInt()); expect(event0?.value1).toStrictEqual(preimage[1].toBigInt()); // We check that an event that does not match, is not decoded correctly due to an event type id mismatch - const badEvent0 = TestLogContract.events.ExampleEvent1.decode(decryptedLog0!.payload); + const badEvent0 = TestLogContract.events.ExampleEvent1.decode(decryptedEvent0); expect(badEvent0).toBe(undefined); - const decryptedLog1 = TaggedLog.decryptAsIncoming( - // We want to skip the second emitted log as it is irrelevant in this test. + const decryptedEvent1 = L1EventPayload.decryptAsIncoming( encryptedLogs[2], deriveMasterIncomingViewingSecretKey(wallets[0].getSecretKey()), - L1EventPayload, - ); + )!; - expect(decryptedLog1?.payload.contractAddress).toStrictEqual(testLogContract.address); - expect(decryptedLog1?.payload.randomness).toStrictEqual(randomness[1]); - expect(decryptedLog1?.payload.eventTypeId).toStrictEqual( - EventSelector.fromSignature('ExampleEvent1((Field),u8)'), - ); + expect(decryptedEvent1.contractAddress).toStrictEqual(testLogContract.address); + expect(decryptedEvent1.randomness).toStrictEqual(randomness[1]); + expect(decryptedEvent1.eventTypeId).toStrictEqual(EventSelector.fromSignature('ExampleEvent1((Field),u8)')); // We check our second event, which is a different type - const event1 = TestLogContract.events.ExampleEvent1.decode(decryptedLog1!.payload); + const event1 = TestLogContract.events.ExampleEvent1.decode(decryptedEvent1); // We expect the fields to have been populated correctly expect(event1?.value2).toStrictEqual(preimage[2]); @@ -101,7 +93,7 @@ describe('Logs', () => { expect(event1?.value3).toStrictEqual(BigInt(preimage[3].toBuffer().subarray(31).readUint8())); // Again, trying to decode another event with mismatching data does not yield anything - const badEvent1 = TestLogContract.events.ExampleEvent0.decode(decryptedLog1!.payload); + const badEvent1 = TestLogContract.events.ExampleEvent0.decode(decryptedEvent1); expect(badEvent1).toBe(undefined); }); diff --git a/yarn-project/end-to-end/src/e2e_fees/failures.test.ts b/yarn-project/end-to-end/src/e2e_fees/failures.test.ts index 253cada5a31..60a418bdee6 100644 --- a/yarn-project/end-to-end/src/e2e_fees/failures.test.ts +++ b/yarn-project/end-to-end/src/e2e_fees/failures.test.ts @@ -8,7 +8,6 @@ import { PublicFeePaymentMethod, TxStatus, computeSecretHash, - sleep, } from '@aztec/aztec.js'; import { Gas, GasSettings } from '@aztec/circuits.js'; import { FunctionType } from '@aztec/foundation/abi'; @@ -82,7 +81,11 @@ describe('e2e_fees failures', () => { // if we skip simulation, it includes the failed TX const rebateSecret = Fr.random(); + + // We wait until the proven chain is caught up so all previous fees are paid out. + await t.catchUpProvenChain(); const currentSequencerL1Gas = await t.getCoinbaseBalance(); + const txReceipt = await bananaCoin.methods .transfer_public(aliceAddress, sequencerAddress, OutrageousPublicAmountAliceDoesNotHave, 0) .send({ @@ -97,10 +100,7 @@ describe('e2e_fees failures', () => { expect(txReceipt.status).toBe(TxStatus.APP_LOGIC_REVERTED); // We wait until the block is proven since that is when the payout happens. - const bn = await t.aztecNode.getBlockNumber(); - while ((await t.aztecNode.getProvenBlockNumber()) < bn) { - await sleep(1000); - } + await t.catchUpProvenChain(); const feeAmount = txReceipt.transactionFee!; const newSequencerL1FeeAssetBalance = await t.getCoinbaseBalance(); diff --git a/yarn-project/end-to-end/src/e2e_fees/fees_test.ts b/yarn-project/end-to-end/src/e2e_fees/fees_test.ts index 4beb1b07dee..1157a4f3c7b 100644 --- a/yarn-project/end-to-end/src/e2e_fees/fees_test.ts +++ b/yarn-project/end-to-end/src/e2e_fees/fees_test.ts @@ -12,11 +12,12 @@ import { type TxHash, computeSecretHash, createDebugLogger, + sleep, } from '@aztec/aztec.js'; import { DefaultMultiCallEntrypoint } from '@aztec/aztec.js/entrypoint'; import { EthAddress, GasSettings, computePartialAddress } from '@aztec/circuits.js'; import { createL1Clients } from '@aztec/ethereum'; -import { PortalERC20Abi } from '@aztec/l1-artifacts'; +import { TestERC20Abi } from '@aztec/l1-artifacts'; import { AppSubscriptionContract, TokenContract as BananaCoin, @@ -101,6 +102,13 @@ export class FeesTest { await this.snapshotManager.teardown(); } + async catchUpProvenChain() { + const bn = await this.aztecNode.getBlockNumber(); + while ((await this.aztecNode.getProvenBlockNumber()) < bn) { + await sleep(1000); + } + } + /** Alice mints Token */ async mintToken(amount: bigint) { const balanceBefore = await this.token.methods.balance_of_private(this.aliceAddress).simulate(); @@ -332,7 +340,7 @@ export class FeesTest { const { walletClient } = createL1Clients(context.aztecNodeConfig.l1RpcUrl, MNEMONIC); const gasL1 = getContract({ address: data.l1FeeJuiceAddress.toString(), - abi: PortalERC20Abi, + abi: TestERC20Abi, client: walletClient, }); return await gasL1.read.balanceOf([this.coinbase.toString()]); diff --git a/yarn-project/end-to-end/src/e2e_prover/e2e_prover_test.ts b/yarn-project/end-to-end/src/e2e_prover/e2e_prover_test.ts index 89a833ff216..ba5f1c0f4bf 100644 --- a/yarn-project/end-to-end/src/e2e_prover/e2e_prover_test.ts +++ b/yarn-project/end-to-end/src/e2e_prover/e2e_prover_test.ts @@ -3,6 +3,7 @@ import { type Archiver, createArchiver } from '@aztec/archiver'; import { type AccountWalletWithSecretKey, type AztecNode, + type CheatCodes, type CompleteAddress, type DebugLogger, type DeployL1Contracts, @@ -16,7 +17,13 @@ import { createDebugLogger, deployL1Contract, } from '@aztec/aztec.js'; -import { BBCircuitVerifier, type ClientProtocolCircuitVerifier, TestCircuitVerifier } from '@aztec/bb-prover'; +import { + BBCircuitVerifier, + type ClientProtocolCircuitVerifier, + TestCircuitVerifier, + type UltraKeccakHonkProtocolArtifact, +} from '@aztec/bb-prover'; +import { compileContract } from '@aztec/ethereum'; import { RollupAbi } from '@aztec/l1-artifacts'; import { TokenContract } from '@aztec/noir-contracts.js'; import { type ProverNode, type ProverNodeConfig, createProverNode } from '@aztec/prover-node'; @@ -70,6 +77,7 @@ export class FullProverTest { tokenSim!: TokenSimulator; aztecNode!: AztecNode; pxe!: PXEService; + cheatCodes!: CheatCodes; private provenComponents: ProvenSetup[] = []; private bbConfigCleanup?: () => Promise; private acvmConfigCleanup?: () => Promise; @@ -82,7 +90,12 @@ export class FullProverTest { constructor(testName: string, private minNumberOfTxsPerBlock: number, private realProofs = true) { this.logger = createDebugLogger(`aztec:full_prover_test:${testName}`); - this.snapshotManager = createSnapshotManager(`full_prover_integration/${testName}`, dataPath); + this.snapshotManager = createSnapshotManager( + `full_prover_integration/${testName}`, + dataPath, + {}, + { assumeProvenThrough: undefined }, + ); } /** @@ -105,7 +118,7 @@ export class FullProverTest { // Create the token contract state. // Move this account thing to addAccounts above? this.logger.verbose(`Public deploy accounts...`); - await publicDeployAccounts(this.wallets[0], this.accounts.slice(0, 2)); + await publicDeployAccounts(this.wallets[0], this.accounts.slice(0, 2), false); this.logger.verbose(`Deploying TokenContract...`); const asset = await TokenContract.deploy( @@ -116,7 +129,7 @@ export class FullProverTest { FullProverTest.TOKEN_DECIMALS, ) .send() - .deployed({ proven: true }); + .deployed(); this.logger.verbose(`Token deployed to ${asset.address}`); return { tokenContractAddress: asset.address }; @@ -145,10 +158,10 @@ export class FullProverTest { aztecNode: this.aztecNode, proverNode: this.simulatedProverNode, deployL1ContractsValues: this.l1Contracts, + cheatCodes: this.cheatCodes, } = this.context); // Configure a full prover PXE - let acvmConfig: Awaited> | undefined; let bbConfig: Awaited> | undefined; if (this.realProofs) { @@ -172,11 +185,20 @@ export class FullProverTest { minTxsPerBlock: this.minNumberOfTxsPerBlock, }); } else { + this.logger.debug(`Configuring the node min txs per block ${this.minNumberOfTxsPerBlock}...`); this.circuitProofVerifier = new TestCircuitVerifier(); + await this.aztecNode.setConfig({ + minTxsPerBlock: this.minNumberOfTxsPerBlock, + }); } - this.logger.debug(`Main setup completed, initializing full prover PXE, Node, and Prover Node...`); + this.logger.verbose(`Move to a clean epoch`); + await this.context.cheatCodes.rollup.advanceToNextEpoch(); + + this.logger.verbose(`Marking current block as proven`); + await this.context.cheatCodes.rollup.markAsProven(); + this.logger.verbose(`Main setup completed, initializing full prover PXE, Node, and Prover Node`); for (let i = 0; i < 2; i++) { const result = await setupPXEService( this.aztecNode, @@ -220,7 +242,6 @@ export class FullProverTest { }); this.provenAssets.push(asset); } - this.logger.info(`Full prover PXE started`); // Shutdown the current, simulated prover node @@ -228,7 +249,6 @@ export class FullProverTest { await this.simulatedProverNode.stop(); // Creating temp store and archiver for fully proven prover node - this.logger.verbose('Starting archiver for new prover node'); const archiver = await createArchiver( { ...this.context.aztecNodeConfig, dataDirectory: undefined }, @@ -239,25 +259,27 @@ export class FullProverTest { // The simulated prover node (now shutdown) used private key index 2 const proverNodePrivateKey = getPrivateKeyFromIndex(2); - this.logger.verbose('Starting fully proven prover node'); + this.logger.verbose('Starting prover node'); const proverConfig: ProverNodeConfig = { ...this.context.aztecNodeConfig, - txProviderNodeUrl: undefined, + proverCoordinationNodeUrl: undefined, dataDirectory: undefined, proverId: new Fr(81), realProofs: this.realProofs, proverAgentConcurrency: 2, publisherPrivateKey: `0x${proverNodePrivateKey!.toString('hex')}`, proverNodeMaxPendingJobs: 100, + proverNodePollingIntervalMs: 100, + quoteProviderBasisPointFee: 100, + quoteProviderBondAmount: 1000n, }; this.proverNode = await createProverNode(proverConfig, { aztecNodeTxProvider: this.aztecNode, archiver: archiver as Archiver, }); - this.proverNode.start(); - - this.logger.info('Prover node started'); + await this.proverNode.start(); + this.logger.warn(`Proofs are now enabled`); return this; } @@ -302,7 +324,7 @@ export class FullProverTest { const { fakeProofsAsset: asset, accounts } = this; const amount = 10000n; - const waitOpts = { proven: true }; + const waitOpts = { proven: false }; this.logger.verbose(`Minting ${amount} publicly...`); await asset.methods.mint_public(accounts[0].address, amount).send().wait(waitOpts); @@ -314,7 +336,7 @@ export class FullProverTest { await this.addPendingShieldNoteToPXE(0, amount, secretHash, receipt.txHash); const txClaim = asset.methods.redeem_shield(accounts[0].address, amount, secret).send(); - await txClaim.wait({ debug: true, proven: true }); + await txClaim.wait({ ...waitOpts, debug: true }); this.logger.verbose(`Minting complete.`); return { amount }; @@ -355,51 +377,27 @@ export class FullProverTest { throw new Error('No verifier'); } + const verifier = this.circuitProofVerifier as BBCircuitVerifier; const { walletClient, publicClient, l1ContractAddresses } = this.context.deployL1ContractsValues; - - const contract = await (this.circuitProofVerifier as BBCircuitVerifier).generateSolidityContract( - 'BlockRootRollupFinalArtifact', - 'UltraHonkVerifier.sol', - ); - - const input = { - language: 'Solidity', - sources: { - 'UltraHonkVerifier.sol': { - content: contract, - }, - }, - settings: { - // we require the optimizer - optimizer: { - enabled: true, - runs: 200, - }, - evmVersion: 'paris', - outputSelection: { - '*': { - '*': ['evm.bytecode.object', 'abi'], - }, - }, - }, - }; - - const output = JSON.parse(solc.compile(JSON.stringify(input))); - - const abi = output.contracts['UltraHonkVerifier.sol']['HonkVerifier'].abi; - const bytecode: string = output.contracts['UltraHonkVerifier.sol']['HonkVerifier'].evm.bytecode.object; - - const { address: verifierAddress } = await deployL1Contract(walletClient, publicClient, abi, `0x${bytecode}`); - - this.logger.info(`Deployed Real verifier at ${verifierAddress}`); - const rollup = getContract({ abi: RollupAbi, address: l1ContractAddresses.rollupAddress.toString(), client: walletClient, }); - await rollup.write.setVerifier([verifierAddress.toString()]); + // REFACTOR: Extract this method to a common package. We need a package that deals with L1 + // but also has a reference to L1 artifacts and bb-prover. + const setupVerifier = async (artifact: UltraKeccakHonkProtocolArtifact) => { + const contract = await verifier.generateSolidityContract(artifact, 'UltraHonkVerifier.sol'); + const { abi, bytecode } = compileContract('UltraHonkVerifier.sol', 'HonkVerifier', contract, solc); + const { address: verifierAddress } = await deployL1Contract(walletClient, publicClient, abi, bytecode); + this.logger.info(`Deployed real ${artifact} verifier at ${verifierAddress}`); + + await rollup.write.setEpochVerifier([verifierAddress.toString()]); + }; + + await setupVerifier('RootRollupArtifact'); + this.logger.info('Rollup only accepts valid proofs now'); } } diff --git a/yarn-project/end-to-end/src/e2e_prover/full.test.ts b/yarn-project/end-to-end/src/e2e_prover/full.test.ts index f6d52aabb76..316b65b42d7 100644 --- a/yarn-project/end-to-end/src/e2e_prover/full.test.ts +++ b/yarn-project/end-to-end/src/e2e_prover/full.test.ts @@ -1,4 +1,6 @@ -import { getTestData, isGenerateTestDataEnabled, writeTestData } from '@aztec/foundation/testing'; +import { type AztecAddress, retryUntil } from '@aztec/aztec.js'; + +import '@jest/globals'; import { FullProverTest } from './e2e_prover_test.js'; @@ -9,15 +11,20 @@ process.env.AVM_PROVING_STRICT = '1'; describe('full_prover', () => { const realProofs = !['true', '1'].includes(process.env.FAKE_PROOFS ?? ''); - const t = new FullProverTest('full_prover', 2, realProofs); - let { provenAssets, accounts, tokenSim, logger } = t; + const t = new FullProverTest('full_prover', 1, realProofs); + + let { provenAssets, accounts, tokenSim, logger, cheatCodes } = t; + let sender: AztecAddress; + let recipient: AztecAddress; beforeAll(async () => { await t.applyBaseSnapshots(); await t.applyMintSnapshot(); await t.setup(); await t.deployVerifier(); - ({ provenAssets, accounts, tokenSim, logger } = t); + + ({ provenAssets, accounts, tokenSim, logger, cheatCodes } = t); + [sender, recipient] = accounts.map(a => a.address); }); afterAll(async () => { @@ -31,54 +38,65 @@ describe('full_prover', () => { it( 'makes both public and private transfers', async () => { - logger.info( - `Starting test using function: ${provenAssets[0].address}:${provenAssets[0].methods.balance_of_private.selector}`, - ); - const privateBalance = await provenAssets[0].methods.balance_of_private(accounts[0].address).simulate(); - const privateSendAmount = privateBalance / 2n; + logger.info(`Starting test for public and private transfer`); + + // Create the two transactions + const privateBalance = await provenAssets[0].methods.balance_of_private(sender).simulate(); + const privateSendAmount = privateBalance / 10n; expect(privateSendAmount).toBeGreaterThan(0n); - const privateInteraction = provenAssets[0].methods.transfer(accounts[1].address, privateSendAmount); + const privateInteraction = provenAssets[0].methods.transfer(recipient, privateSendAmount); - const publicBalance = await provenAssets[1].methods.balance_of_public(accounts[0].address).simulate(); - const publicSendAmount = publicBalance / 2n; + const publicBalance = await provenAssets[1].methods.balance_of_public(sender).simulate(); + const publicSendAmount = publicBalance / 10n; expect(publicSendAmount).toBeGreaterThan(0n); - const publicInteraction = provenAssets[1].methods.transfer_public( - accounts[0].address, - accounts[1].address, - publicSendAmount, - 0, - ); + const publicInteraction = provenAssets[1].methods.transfer_public(sender, recipient, publicSendAmount, 0); + + // Prove them + logger.info(`Proving txs`); const [publicTx, privateTx] = await Promise.all([publicInteraction.prove(), privateInteraction.prove()]); - // This will recursively verify all app and kernel circuits involved in the private stage of this transaction! - logger.info(`Verifying kernel tail to public proof`); + // Verify them + logger.info(`Verifying txs`); await expect(t.circuitProofVerifier?.verifyProof(publicTx)).resolves.not.toThrow(); - - // This will recursively verify all app and kernel circuits involved in the private stage of this transaction! - logger.info(`Verifying private kernel tail proof`); await expect(t.circuitProofVerifier?.verifyProof(privateTx)).resolves.not.toThrow(); - const sentPrivateTx = privateInteraction.send({ skipPublicSimulation: true }); - const sentPublicTx = publicInteraction.send({ skipPublicSimulation: true }); - await Promise.all([ - sentPrivateTx.wait({ timeout: 60, interval: 10, proven: true, provenTimeout: 1200 }), - sentPublicTx.wait({ timeout: 60, interval: 10, proven: true, provenTimeout: 1200 }), - ]); - tokenSim.transferPrivate(accounts[0].address, accounts[1].address, privateSendAmount); - tokenSim.transferPublic(accounts[0].address, accounts[1].address, publicSendAmount); - - if (isGenerateTestDataEnabled()) { - const blockResults = getTestData('blockResults'); - // the first blocks were setup blocks with fake proofs - // the last block is the one that was actually proven to the end - const blockResult: any = blockResults.at(-1); - - if (!blockResult) { - // fail the test. User asked for fixtures but we don't have any - throw new Error('No block result found in test data'); - } - writeTestData('yarn-project/end-to-end/src/fixtures/dumps/block_result.json', JSON.stringify(blockResult)); - } + // Sends the txs to node and awaits them to be mined + logger.info(`Sending txs`); + const sendOpts = { skipPublicSimulation: true }; + const txs = [privateInteraction.send(sendOpts), publicInteraction.send(sendOpts)]; + logger.info(`Awaiting txs to be mined`); + await Promise.all(txs.map(tx => tx.wait({ timeout: 300, interval: 10, proven: false }))); + + // Flag the transfers on the token simulator + tokenSim.transferPrivate(sender, recipient, privateSendAmount); + tokenSim.transferPublic(sender, recipient, publicSendAmount); + + // Warp to the next epoch + const epoch = await cheatCodes.rollup.getEpoch(); + logger.info(`Advancing from epoch ${epoch} to next epoch`); + await cheatCodes.rollup.advanceToNextEpoch(); + + // Wait until the prover node submits a quote + logger.info(`Waiting for prover node to submit quote for epoch ${epoch}`); + await retryUntil(() => t.aztecNode.getEpochProofQuotes(epoch).then(qs => qs.length > 0), 'quote', 60, 1); + + // Send another tx so the sequencer can assemble a block that includes the prover node claim + // so the prover node starts proving + logger.info(`Sending tx to trigger a new block that includes the quote from the prover node`); + await provenAssets[0].methods + .transfer(recipient, privateSendAmount) + .send(sendOpts) + .wait({ timeout: 300, interval: 10 }); + tokenSim.transferPrivate(sender, recipient, privateSendAmount); + + // Expect the block to have a claim + const claim = await cheatCodes.rollup.getProofClaim(); + expect(claim).toBeDefined(); + expect(claim?.epochToProve).toEqual(epoch); + + // And wait for the first pair of txs to be proven + logger.info(`Awaiting proof for the previous epoch`); + await Promise.all(txs.map(tx => tx.wait({ timeout: 300, interval: 10, proven: true, provenTimeout: 1500 }))); }, TIMEOUT, ); @@ -89,11 +107,11 @@ describe('full_prover', () => { return; } - const privateInteraction = t.fakeProofsAsset.methods.transfer(accounts[1].address, 1); - const publicInteraction = t.fakeProofsAsset.methods.transfer_public(accounts[0].address, accounts[1].address, 1, 0); + const privateInteraction = t.fakeProofsAsset.methods.transfer(recipient, 1n); + const publicInteraction = t.fakeProofsAsset.methods.transfer_public(sender, recipient, 1n, 0); - const sentPrivateTx = privateInteraction.send(); - const sentPublicTx = publicInteraction.send(); + const sentPrivateTx = privateInteraction.send({ skipPublicSimulation: true }); + const sentPublicTx = publicInteraction.send({ skipPublicSimulation: true }); const results = await Promise.allSettled([ sentPrivateTx.wait({ timeout: 10, interval: 0.1 }), diff --git a/yarn-project/end-to-end/src/e2e_prover/with_padding.test.ts b/yarn-project/end-to-end/src/e2e_prover/with_padding.test.ts deleted file mode 100644 index 30e507012ab..00000000000 --- a/yarn-project/end-to-end/src/e2e_prover/with_padding.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { FullProverTest } from './e2e_prover_test.js'; - -const TIMEOUT = 1_800_000; - -describe('full_prover_with_padding_tx', () => { - const t = new FullProverTest('full_prover_with_padding_tx', 1); - let { provenAssets, accounts, tokenSim, logger } = t; - - beforeAll(async () => { - await t.applyBaseSnapshots(); - await t.applyMintSnapshot(); - await t.setup(); - // await t.deployVerifier(); - ({ provenAssets, accounts, tokenSim, logger } = t); - }); - - afterAll(async () => { - await t.teardown(); - }); - - afterEach(async () => { - await t.tokenSim.check(); - }); - - it( - 'makes a private transfers and pads the block with a padding tx', - async () => { - logger.info( - `Starting test using function: ${provenAssets[0].address}:${provenAssets[0].methods.balance_of_private.selector}`, - ); - const privateBalance = await provenAssets[0].methods.balance_of_private(accounts[0].address).simulate(); - const privateSendAmount = privateBalance / 2n; - expect(privateSendAmount).toBeGreaterThan(0n); - const privateInteraction = provenAssets[0].methods.transfer(accounts[1].address, privateSendAmount); - - const privateTx = await privateInteraction.prove(); - - // This will recursively verify all app and kernel circuits involved in the private stage of this transaction! - logger.info(`Verifying private kernel tail proof`); - await expect(t.circuitProofVerifier?.verifyProof(privateTx)).resolves.not.toThrow(); - - const sentPrivateTx = privateInteraction.send(); - await sentPrivateTx.wait({ timeout: 1200, interval: 10 }); - tokenSim.transferPrivate(accounts[0].address, accounts[1].address, privateSendAmount); - }, - TIMEOUT, - ); -}); diff --git a/yarn-project/end-to-end/src/e2e_prover_node.test.ts b/yarn-project/end-to-end/src/e2e_prover_node.test.ts deleted file mode 100644 index efab32e13fd..00000000000 --- a/yarn-project/end-to-end/src/e2e_prover_node.test.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { getSchnorrAccount } from '@aztec/accounts/schnorr'; -import { type Archiver, retrieveL2ProofVerifiedEvents } from '@aztec/archiver'; -import { - type AccountWalletWithSecretKey, - type AztecAddress, - type DebugLogger, - EthAddress, - Fr, - SignerlessWallet, - computeSecretHash, - createDebugLogger, - sleep, -} from '@aztec/aztec.js'; -import { StatefulTestContract, TestContract } from '@aztec/noir-contracts.js'; -import { type ProverNodeConfig, createProverNode } from '@aztec/prover-node'; - -import { sendL1ToL2Message } from './fixtures/l1_to_l2_messaging.js'; -import { - type ISnapshotManager, - type SubsystemsContext, - addAccounts, - createSnapshotManager, -} from './fixtures/snapshot_manager.js'; -import { waitForProvenChain } from './fixtures/utils.js'; - -// Tests simple block building with a sequencer that does not upload proofs to L1, -// and then follows with a prover node run (with real proofs disabled, but -// still simulating all circuits via a prover-client), in order to test -// the coordination through L1 between the sequencer and the prover node. -describe('e2e_prover_node', () => { - let ctx: SubsystemsContext; - let wallet: AccountWalletWithSecretKey; - let recipient: AztecAddress; - let contract: StatefulTestContract; - let msgTestContract: TestContract; - - let logger: DebugLogger; - let snapshotManager: ISnapshotManager; - - const msgContent: Fr = Fr.fromString('0xcafe'); - const msgSecret: Fr = Fr.fromString('0xfeca'); - - beforeAll(async () => { - logger = createDebugLogger('aztec:e2e_prover_node'); - snapshotManager = createSnapshotManager(`e2e_prover_node`, process.env.E2E_DATA_PATH); - - const testContractOpts = { contractAddressSalt: Fr.ONE, universalDeploy: true }; - await snapshotManager.snapshot( - 'send-l1-to-l2-msg', - async ctx => { - const testContract = TestContract.deploy(new SignerlessWallet(ctx.pxe)).getInstance(testContractOpts); - const msgHash = await sendL1ToL2Message( - { recipient: testContract.address, content: msgContent, secretHash: computeSecretHash(msgSecret) }, - ctx.deployL1ContractsValues, - ); - return { msgHash }; - }, - async (_data, ctx) => { - msgTestContract = await TestContract.deploy(new SignerlessWallet(ctx.pxe)).register(testContractOpts); - }, - ); - - await snapshotManager.snapshot('setup', addAccounts(2, logger), async ({ accountKeys }, ctx) => { - const accountManagers = accountKeys.map(ak => getSchnorrAccount(ctx.pxe, ak[0], ak[1], 1)); - await Promise.all(accountManagers.map(a => a.register())); - const wallets = await Promise.all(accountManagers.map(a => a.getWallet())); - wallets.forEach((w, i) => logger.verbose(`Wallet ${i} address: ${w.getAddress()}`)); - wallet = wallets[0]; - recipient = wallets[1].getAddress(); - }); - - await snapshotManager.snapshot( - 'deploy-test-contract', - async () => { - const owner = wallet.getAddress(); - const contract = await StatefulTestContract.deploy(wallet, owner, owner, 42).send().deployed(); - return { contractAddress: contract.address }; - }, - async ({ contractAddress }) => { - contract = await StatefulTestContract.at(contractAddress, wallet); - }, - ); - - ctx = await snapshotManager.setup(); - }); - - it('submits three blocks, then prover proves the first two', async () => { - // wait for the proven chain to catch up with the pending chain before we shut off the prover node - await waitForProvenChain(ctx.aztecNode); - - // Stop the current prover node - await ctx.proverNode.stop(); - - const msgSender = ctx.deployL1ContractsValues.walletClient.account.address; - const txReceipt1 = await msgTestContract.methods - .consume_message_from_arbitrary_sender_private(msgContent, msgSecret, EthAddress.fromString(msgSender)) - .send() - .wait(); - const txReceipt2 = await contract.methods.create_note(recipient, recipient, 10).send().wait(); - const txReceipt3 = await contract.methods.increment_public_value(recipient, 20).send().wait(); - - // Check everything went well during setup and txs were mined in two different blocks - const firstBlock = txReceipt1.blockNumber!; - const secondBlock = firstBlock + 1; - expect(txReceipt2.blockNumber).toEqual(secondBlock); - expect(txReceipt3.blockNumber).toEqual(firstBlock + 2); - expect(await contract.methods.get_public_value(recipient).simulate()).toEqual(20n); - expect(await contract.methods.summed_values(recipient).simulate()).toEqual(10n); - - // Kick off a prover node - await sleep(1000); - const proverId = Fr.fromString(Buffer.from('awesome-prover', 'utf-8').toString('hex')); - logger.info(`Creating prover node ${proverId.toString()}`); - // HACK: We have to use the existing archiver to fetch L2 data, since anvil's chain dump/load used by the - // snapshot manager does not include events nor txs, so a new archiver would not "see" old blocks. - const proverConfig: ProverNodeConfig = { - ...ctx.aztecNodeConfig, - txProviderNodeUrl: undefined, - dataDirectory: undefined, - proverId, - proverNodeMaxPendingJobs: 100, - }; - const archiver = ctx.aztecNode.getBlockSource() as Archiver; - const proverNode = await createProverNode(proverConfig, { aztecNodeTxProvider: ctx.aztecNode, archiver }); - - // Prove the first two blocks simultaneously - logger.info(`Starting proof for first block #${firstBlock}`); - await proverNode.startProof(firstBlock, firstBlock); - logger.info(`Starting proof for second block #${secondBlock}`); - await proverNode.startProof(secondBlock, secondBlock); - - // Confirm that we cannot go back to prove an old one - await expect(proverNode.startProof(firstBlock, firstBlock)).rejects.toThrow(/behind the current world state/i); - - // Await until proofs get submitted - await waitForProvenChain(ctx.aztecNode, secondBlock); - expect(await ctx.aztecNode.getProvenBlockNumber()).toEqual(secondBlock); - - // Check that the prover id made it to the emitted event - const { publicClient, l1ContractAddresses } = ctx.deployL1ContractsValues; - const logs = await retrieveL2ProofVerifiedEvents(publicClient, l1ContractAddresses.rollupAddress, 1n); - expect(logs.length).toEqual(secondBlock); - - const expectedBlockNumbers = [firstBlock, secondBlock]; - const logsSlice = logs.slice(firstBlock - 1); - for (let i = 0; i < 2; i++) { - const log = logsSlice[i]; - expect(log.l2BlockNumber).toEqual(BigInt(expectedBlockNumbers[i])); - expect(log.proverId.toString()).toEqual(proverId.toString()); - } - }); -}); diff --git a/yarn-project/end-to-end/src/e2e_state_vars.test.ts b/yarn-project/end-to-end/src/e2e_state_vars.test.ts index 400a25e9f36..90d89404194 100644 --- a/yarn-project/end-to-end/src/e2e_state_vars.test.ts +++ b/yarn-project/end-to-end/src/e2e_state_vars.test.ts @@ -1,5 +1,5 @@ -import { AztecAddress, BatchCall, Fr, type PXE, type Wallet } from '@aztec/aztec.js'; -import { AuthContract, DocsExampleContract, TestContract } from '@aztec/noir-contracts.js'; +import { BatchCall, Fr, type PXE, type Wallet } from '@aztec/aztec.js'; +import { AuthContract, DocsExampleContract } from '@aztec/noir-contracts.js'; import { jest } from '@jest/globals'; @@ -236,9 +236,8 @@ describe('e2e_state_vars', () => { }); }); - describe('SharedMutablePrivateGetter', () => { + describe('SharedMutable', () => { let authContract: AuthContract; - let testContract: TestContract; const delay = async (blocks: number) => { for (let i = 0; i < blocks; i++) { @@ -247,65 +246,14 @@ describe('e2e_state_vars', () => { }; beforeAll(async () => { - testContract = await TestContract.deploy(wallet).send().deployed(); - // We use the auth contract here because has a nice, clear, simple implementation of the Shared Mutable, - // and we will need to read from it to test our private getter. + // We use the auth contract here because has a nice, clear, simple implementation of Shared Mutable authContract = await AuthContract.deploy(wallet, wallet.getAddress()).send().deployed(); }); - it('checks authorized in AuthContract from TestContract with our SharedMutablePrivateGetter before and after a value change', async () => { - // We set the authorized value here, knowing there will be some delay before the value change takes place - await authContract - .withWallet(wallet) - .methods.set_authorized(AztecAddress.fromField(new Fr(6969696969))) - .send() - .wait(); - - const authorized = await testContract.methods - .test_shared_mutable_private_getter(authContract.address, 2) - .simulate(); - - // We expect the value to not have been applied yet - expect(AztecAddress.fromBigInt(authorized)).toEqual(AztecAddress.ZERO); - - // We wait for the SharedMutable delay - await delay(5); - - // We check after the delay, expecting to find the value we set. - const newAuthorized = await testContract.methods - .test_shared_mutable_private_getter(authContract.address, 2) - .simulate(); - - expect(AztecAddress.fromBigInt(newAuthorized)).toEqual(AztecAddress.fromBigInt(6969696969n)); - }); - - it('checks authorized in AuthContract from TestContract and finds the correctly set max block number', async () => { - const lastBlockNumber = await pxe.getBlockNumber(); - - const tx = await testContract.methods.test_shared_mutable_private_getter(authContract.address, 2).prove(); - - const expectedMaxBlockNumber = lastBlockNumber + 5; - - expect(tx.data.forRollup!.rollupValidationRequests.maxBlockNumber.isSome).toEqual(true); - expect(tx.data.forRollup!.rollupValidationRequests.maxBlockNumber.value).toEqual(new Fr(expectedMaxBlockNumber)); - }); - - it('checks propagation of max block number in private', async () => { - // Our initial max block number will be 5 because that is the value of INITIAL_DELAY - const expectedInitialMaxBlockNumber = (await pxe.getBlockNumber()) + 5; - - // Our SharedMutablePrivateGetter here reads from the SharedMutable authorized storage property in AuthContract - const tx = await testContract.methods.test_shared_mutable_private_getter(authContract.address, 2).prove(); - - // The validity of our SharedMutable read request is limited to 5 blocks, which is our initial delay. - expect(tx.data.forRollup!.rollupValidationRequests.maxBlockNumber.isSome).toEqual(true); - expect(tx.data.forRollup!.rollupValidationRequests.maxBlockNumber.value).toEqual( - new Fr(expectedInitialMaxBlockNumber), - ); - + it('sets the max block number property', async () => { // We change the SharedMutable authorized delay here to 2, this means that a change to the "authorized" value can - // only be applied 2 blocks after it is initiated, and thus read requests on a historical state without an initiated change is - // valid for at least 2 blocks. + // only be applied 2 blocks after it is initiated, and thus read requests on a historical state without an + // initiated change is valid for at least 2 blocks. await authContract.methods.set_authorized_delay(2).send().wait(); // Note: Because we are decreasing the delay, we must first wait for the full previous delay - 1 (5 -1). @@ -314,44 +262,13 @@ describe('e2e_state_vars', () => { const expectedModifiedMaxBlockNumber = (await pxe.getBlockNumber()) + 2; // We now call our AuthContract to see if the change in max block number has reflected our delay change - const tx2 = await authContract.methods.get_authorized_in_private().prove(); - - // The validity of our SharedMutable read request should now be limited to 2 blocks, instead of 5 - expect(tx2.data.forRollup!.rollupValidationRequests.maxBlockNumber.isSome).toEqual(true); - expect(tx2.data.forRollup!.rollupValidationRequests.maxBlockNumber.value).toEqual( - new Fr(expectedModifiedMaxBlockNumber), - ); + const tx = await authContract.methods.get_authorized_in_private().prove(); - // We check for parity between accessing our SharedMutable directly and from our SharedMutablePrivateGetter. The validity assumptions should remain the same. - const tx3 = await testContract.methods.test_shared_mutable_private_getter(authContract.address, 2).prove(); - - expect(tx3.data.forRollup!.rollupValidationRequests.maxBlockNumber.isSome).toEqual(true); - expect(tx3.data.forRollup!.rollupValidationRequests.maxBlockNumber.value).toEqual( + // The validity of our SharedMutable read request should be limited to 2 blocks + expect(tx.data.forRollup!.rollupValidationRequests.maxBlockNumber.isSome).toEqual(true); + expect(tx.data.forRollup!.rollupValidationRequests.maxBlockNumber.value).toEqual( new Fr(expectedModifiedMaxBlockNumber), ); - - // We now change the SharedMutable authorized delay here to 100, the same assumptions apply here - await authContract.methods.set_authorized_delay(100).send().wait(); - - // Note: Because we are increasing the delay, we do not have to wait for this change to apply - const expectedLengthenedModifiedMaxBlockNumber = (await pxe.getBlockNumber()) + 100; - - // We now call our AuthContract to see if the change in max block number has reflected our delay change - const tx4 = await authContract.methods.get_authorized_in_private().prove(); - - // The validity of our SharedMutable read request should now be limited to 100 blocks, instead of 2 - expect(tx4.data.forRollup!.rollupValidationRequests.maxBlockNumber.isSome).toEqual(true); - expect(tx4.data.forRollup!.rollupValidationRequests.maxBlockNumber.value).toEqual( - new Fr(expectedLengthenedModifiedMaxBlockNumber), - ); - - // We check for parity between accessing our SharedMutable directly and from our SharedMutablePrivateGetter. The validity assumptions should remain the same. - const tx5 = await testContract.methods.test_shared_mutable_private_getter(authContract.address, 2).prove(); - - expect(tx5.data.forRollup!.rollupValidationRequests.maxBlockNumber.isSome).toEqual(true); - expect(tx5.data.forRollup!.rollupValidationRequests.maxBlockNumber.value).toEqual( - new Fr(expectedLengthenedModifiedMaxBlockNumber), - ); }); }); }); diff --git a/yarn-project/end-to-end/src/e2e_synching.test.ts b/yarn-project/end-to-end/src/e2e_synching.test.ts index a0f980bab34..18b1f7b4285 100644 --- a/yarn-project/end-to-end/src/e2e_synching.test.ts +++ b/yarn-project/end-to-end/src/e2e_synching.test.ts @@ -33,24 +33,27 @@ * blockCount: 10, txCount: 9, complexity: Spam: {"numberOfBlocks":17, "syncTime":49.40888188171387} */ import { getSchnorrAccount } from '@aztec/accounts/schnorr'; +import { createArchiver } from '@aztec/archiver'; import { AztecNodeService } from '@aztec/aztec-node'; import { type AccountWallet, type AccountWalletWithSecretKey, AnvilTestWatcher, BatchCall, + type Contract, type DebugLogger, Fr, GrumpkinScalar, computeSecretHash, createDebugLogger, + sleep, } from '@aztec/aztec.js'; // eslint-disable-next-line no-restricted-imports -import { ExtendedNote, L2Block, Note, type TxHash } from '@aztec/circuit-types'; +import { ExtendedNote, L2Block, LogType, Note, type TxHash } from '@aztec/circuit-types'; import { type AztecAddress, ETHEREUM_SLOT_DURATION } from '@aztec/circuits.js'; import { Timer } from '@aztec/foundation/timer'; import { RollupAbi } from '@aztec/l1-artifacts'; -import { SpamContract, TokenContract } from '@aztec/noir-contracts.js'; +import { SchnorrHardcodedAccountContract, SpamContract, TokenContract } from '@aztec/noir-contracts.js'; import { type PXEService } from '@aztec/pxe'; import { L1Publisher } from '@aztec/sequencer-client'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; @@ -74,6 +77,12 @@ enum TxComplexity { Spam, } +type VariantDefinition = { + blockCount: number; + txCount: number; + txComplexity: TxComplexity; +}; + /** * Helper class that wraps a certain variant of test, provides functionality for * setting up the test state (e.g., funding accounts etc) and to generate a list of transactions. @@ -91,11 +100,21 @@ class TestVariant { private token!: TokenContract; private spam!: SpamContract; - private wallets!: AccountWalletWithSecretKey[]; + public wallets!: AccountWalletWithSecretKey[]; private seed = 0n; - constructor(public blockCount: number, public txCount: number, public txComplexity: TxComplexity) {} + private contractAddresses: AztecAddress[] = []; + + public blockCount: number; + public txCount: number; + public txComplexity: TxComplexity; + + constructor(def: VariantDefinition) { + this.blockCount = def.blockCount; + this.txCount = def.txCount; + this.txComplexity = def.txComplexity; + } setPXE(pxe: PXEService) { this.pxe = pxe; @@ -121,20 +140,12 @@ class TestVariant { return `${this.blockCount}_${this.txCount}_${this.txComplexity}`; } - async setup() { - if (this.pxe === undefined) { - throw new Error('Undefined PXE'); - } - - if (this.txComplexity == TxComplexity.Deployment) { - return; - } - + async deployWallets(numberOfAccounts: number) { // Create accounts such that we can send from many to not have colliding nullifiers - const { accountKeys } = await addAccounts(this.txCount, this.logger, false)({ pxe: this.pxe }); + const { accountKeys } = await addAccounts(numberOfAccounts, this.logger, false)({ pxe: this.pxe }); const accountManagers = accountKeys.map(ak => getSchnorrAccount(this.pxe, ak[0], ak[1], 1)); - this.wallets = await Promise.all( + return await Promise.all( accountManagers.map(async (a, i) => { const partialAddress = a.getCompleteAddress().partialAddress; await this.pxe.registerAccount(accountKeys[i][0], partialAddress); @@ -143,6 +154,17 @@ class TestVariant { return wallet; }), ); + } + + async setup() { + if (this.pxe === undefined) { + throw new Error('Undefined PXE'); + } + + if (this.txComplexity == TxComplexity.Deployment) { + return; + } + this.wallets = await this.deployWallets(this.txCount); // Mint tokens publicly if needed if (this.txComplexity == TxComplexity.PublicTransfer) { @@ -225,6 +247,7 @@ class TestVariant { skipPublicDeployment: true, universalDeploy: true, }); + this.contractAddresses.push(accountManager.getAddress()); txs.push(deployMethod.send()); } return txs; @@ -310,11 +333,11 @@ class TestVariant { * because each transaction is LARGE, so the block size in kb is hit. * I decided that 1/4 should be acceptable, and still small enough to work. */ -const variants: TestVariant[] = [ - new TestVariant(10, 36, TxComplexity.Deployment), - new TestVariant(10, 36, TxComplexity.PrivateTransfer), - new TestVariant(10, 36, TxComplexity.PublicTransfer), - new TestVariant(10, 9, TxComplexity.Spam), +const variants: VariantDefinition[] = [ + { blockCount: 10, txCount: 36, txComplexity: TxComplexity.Deployment }, + { blockCount: 10, txCount: 36, txComplexity: TxComplexity.PrivateTransfer }, + { blockCount: 10, txCount: 36, txComplexity: TxComplexity.PublicTransfer }, + { blockCount: 10, txCount: 9, txComplexity: TxComplexity.Spam }, ]; describe('e2e_synching', () => { @@ -322,10 +345,11 @@ describe('e2e_synching', () => { // of fixtures including multiple blocks with many transaction in. it.each(variants)( `Add blocks to the pending chain - %s`, - async (variant: TestVariant) => { + async (variantDef: VariantDefinition) => { if (!AZTEC_GENERATE_TEST_DATA) { return; } + const variant = new TestVariant(variantDef); // The setup is in here and not at the `before` since we are doing different setups depending on what mode we are running in. const { teardown, pxe, sequencer, aztecNode, wallet } = await setup(1, { salt: SALT, l1StartTime: START_TIME }); @@ -352,7 +376,7 @@ describe('e2e_synching', () => { } } - const blocks = await aztecNode.getBlocks(0, await aztecNode.getBlockNumber()); + const blocks = await aztecNode.getBlocks(1, await aztecNode.getBlockNumber()); await variant.writeBlocks(blocks); await teardown(); @@ -362,14 +386,13 @@ describe('e2e_synching', () => { const testTheVariant = async ( variant: TestVariant, - beforeSync: (opts: Partial) => Promise = () => Promise.resolve(), - afterSync: (opts: Partial) => Promise = () => Promise.resolve(), + alternativeSync: (opts: Partial, variant: TestVariant) => Promise, ) => { if (AZTEC_GENERATE_TEST_DATA) { return; } - const { teardown, logger, deployL1ContractsValues, config, cheatCodes, aztecNode, sequencer, watcher } = + const { teardown, logger, deployL1ContractsValues, config, cheatCodes, aztecNode, sequencer, watcher, pxe } = await setup(0, { salt: SALT, l1StartTime: START_TIME, @@ -406,89 +429,256 @@ describe('e2e_synching', () => { await publisher.proposeL2Block(block); } - await beforeSync({ deployL1ContractsValues, cheatCodes, config, logger }); + await alternativeSync({ deployL1ContractsValues, cheatCodes, config, logger, pxe }, variant); - // All the blocks have been "re-played" and we are now to simply get a new node up to speed - const timer = new Timer(); - const freshNode = await AztecNodeService.createAndSync( - { ...config, disableSequencer: true, disableValidator: true }, - new NoopTelemetryClient(), - ); - const syncTime = timer.s(); + await teardown(); + }; - const blockNumber = await freshNode.getBlockNumber(); + describe('replay history and then do a fresh sync', () => { + it.each(variants)('vanilla - %s', async (variantDef: VariantDefinition) => { + await testTheVariant( + new TestVariant(variantDef), + async (opts: Partial, variant: TestVariant) => { + // All the blocks have been "re-played" and we are now to simply get a new node up to speed + const timer = new Timer(); + const freshNode = await AztecNodeService.createAndSync( + { ...opts.config!, disableSequencer: true, disableValidator: true }, + new NoopTelemetryClient(), + ); + const syncTime = timer.s(); + + const blockNumber = await freshNode.getBlockNumber(); + + opts.logger!.info( + `Stats: ${variant.description()}: ${JSON.stringify({ + numberOfBlocks: blockNumber, + syncTime, + })}`, + ); + }, + ); + }); + }); - logger.info( - `Stats: ${variant.description()}: ${JSON.stringify({ - numberOfBlocks: blockNumber, - syncTime, - })}`, - ); + describe('a wild prune appears', () => { + it('archiver following catches reorg as it occur and deletes blocks', async () => { + if (AZTEC_GENERATE_TEST_DATA) { + return; + } - await afterSync({ deployL1ContractsValues, cheatCodes, config, logger }); + await testTheVariant( + new TestVariant({ blockCount: 10, txCount: 36, txComplexity: TxComplexity.PrivateTransfer }), + async (opts: Partial, variant: TestVariant) => { + const rollup = getContract({ + address: opts.deployL1ContractsValues!.l1ContractAddresses.rollupAddress.toString(), + abi: RollupAbi, + client: opts.deployL1ContractsValues!.walletClient, + }); + + const contracts: Contract[] = []; + { + const watcher = new AnvilTestWatcher( + opts.cheatCodes!.eth, + opts.deployL1ContractsValues!.l1ContractAddresses.rollupAddress, + opts.deployL1ContractsValues!.publicClient, + ); + await watcher.start(); + + const aztecNode = await AztecNodeService.createAndSync(opts.config!, new NoopTelemetryClient()); + const sequencer = aztecNode.getSequencer(); + + const { pxe } = await setupPXEService(aztecNode!); + + variant.setPXE(pxe); + const wallet = (await variant.deployWallets(1))[0]; + + contracts.push( + await TokenContract.deploy(wallet, wallet.getAddress(), 'TestToken', 'TST', 18n).send().deployed(), + ); + contracts.push(await SchnorrHardcodedAccountContract.deploy(wallet).send().deployed()); + contracts.push( + await TokenContract.deploy(wallet, wallet.getAddress(), 'TestToken', 'TST', 18n).send().deployed(), + ); + + await watcher.stop(); + await sequencer?.stop(); + await aztecNode.stop(); + } + + const archiver = await createArchiver(opts.config!); + const pendingBlockNumber = await rollup.read.getPendingBlockNumber(); + + // We prune the last token and schnorr contract + const assumeProvenThrough = pendingBlockNumber - 2n; + await rollup.write.setAssumeProvenThroughBlockNumber([assumeProvenThrough]); + + const timeliness = (await rollup.read.EPOCH_DURATION()) * 2n; + const [, , slot] = await rollup.read.blocks([(await rollup.read.getProvenBlockNumber()) + 1n]); + const timeJumpTo = await rollup.read.getTimestampForSlot([slot + timeliness]); + + await opts.cheatCodes!.eth.warp(Number(timeJumpTo)); + + expect(await archiver.getBlockNumber()).toBeGreaterThan(Number(assumeProvenThrough)); + const blockTip = (await archiver.getBlock(await archiver.getBlockNumber()))!; + const txHash = blockTip.body.txEffects[0].txHash; + + const contractClassIds = await archiver.getContractClassIds(); + contracts.forEach(async c => { + expect(contractClassIds.includes(c.instance.contractClassId)).toBeTrue; + expect(await archiver.getContract(c.address)).not.toBeUndefined; + }); + + expect(await archiver.getTxEffect(txHash)).not.toBeUndefined; + [LogType.NOTEENCRYPTED, LogType.ENCRYPTED, LogType.UNENCRYPTED].forEach(async t => { + expect(await archiver.getLogs(blockTip.number, 1, t)).not.toEqual([]); + }); + + await rollup.write.prune(); + + // We need to sleep a bit to make sure that we have caught the prune and deleted blocks. + await sleep(3000); + expect(await archiver.getBlockNumber()).toBe(Number(assumeProvenThrough)); + + const contractClassIdsAfter = await archiver.getContractClassIds(); + + expect(contractClassIdsAfter.includes(contracts[0].instance.contractClassId)).toBeTrue; + expect(contractClassIdsAfter.includes(contracts[1].instance.contractClassId)).toBeFalse; + expect(await archiver.getContract(contracts[0].address)).not.toBeUndefined; + expect(await archiver.getContract(contracts[1].address)).toBeUndefined; + expect(await archiver.getContract(contracts[2].address)).toBeUndefined; + + // Only the hardcoded schnorr is pruned since the contract class also existed before prune. + expect(contractClassIdsAfter).toEqual( + contractClassIds.filter(c => !c.equals(contracts[1].instance.contractClassId)), + ); + + expect(await archiver.getTxEffect(txHash)).toBeUndefined; + [LogType.NOTEENCRYPTED, LogType.ENCRYPTED, LogType.UNENCRYPTED].forEach(async t => { + expect(await archiver.getLogs(blockTip.number, 1, t)).toEqual([]); + }); + }, + ); + }); - await teardown(); - }; + it.skip('node following prunes and can extend chain', async () => { + // @todo This test is to be activated when we can unwind the world state + // It will currently stall forever as the state will never match. + if (AZTEC_GENERATE_TEST_DATA) { + return; + } - it.each(variants)('replay and then sync - %s', async (variant: TestVariant) => { - await testTheVariant(variant); - }); + await testTheVariant( + new TestVariant({ blockCount: 10, txCount: 36, txComplexity: TxComplexity.Deployment }), + async (opts: Partial, variant: TestVariant) => { + const rollup = getContract({ + address: opts.deployL1ContractsValues!.l1ContractAddresses.rollupAddress.toString(), + abi: RollupAbi, + client: opts.deployL1ContractsValues!.walletClient, + }); - it('replay, then prune and only then perform an initial sync', async () => { - if (AZTEC_GENERATE_TEST_DATA) { - return; - } + const pendingBlockNumber = await rollup.read.getPendingBlockNumber(); + await rollup.write.setAssumeProvenThroughBlockNumber([pendingBlockNumber - BigInt(variant.blockCount) / 2n]); - const variant = variants[0]; + const timeliness = (await rollup.read.EPOCH_DURATION()) * 2n; + const [, , slot] = await rollup.read.blocks([(await rollup.read.getProvenBlockNumber()) + 1n]); + const timeJumpTo = await rollup.read.getTimestampForSlot([slot + timeliness]); - const beforeSync = async (opts: Partial) => { - const rollup = getContract({ - address: opts.deployL1ContractsValues!.l1ContractAddresses.rollupAddress.toString(), - abi: RollupAbi, - client: opts.deployL1ContractsValues!.walletClient, - }); + await opts.cheatCodes!.eth.warp(Number(timeJumpTo)); + + const watcher = new AnvilTestWatcher( + opts.cheatCodes!.eth, + opts.deployL1ContractsValues!.l1ContractAddresses.rollupAddress, + opts.deployL1ContractsValues!.publicClient, + ); + await watcher.start(); + + const aztecNode = await AztecNodeService.createAndSync(opts.config!, new NoopTelemetryClient()); + const sequencer = aztecNode.getSequencer(); + + const blockBeforePrune = await aztecNode.getBlockNumber(); + + await rollup.write.prune(); - const pendingBlockNumber = await rollup.read.getPendingBlockNumber(); - await rollup.write.setAssumeProvenThroughBlockNumber([pendingBlockNumber - BigInt(variant.blockCount) / 2n]); + await sleep(5000); + expect(await aztecNode.getBlockNumber()).toBeLessThan(blockBeforePrune); - const timeliness = (await rollup.read.EPOCH_DURATION()) * 2n; - const [, , slot] = await rollup.read.blocks([(await rollup.read.getProvenBlockNumber()) + 1n]); - const timeJumpTo = await rollup.read.getTimestampForSlot([slot + timeliness]); + const { pxe } = await setupPXEService(aztecNode!); + variant.setPXE(pxe); - await opts.cheatCodes!.eth.warp(Number(timeJumpTo)); + const blockBefore = await aztecNode.getBlock(await aztecNode.getBlockNumber()); - await rollup.write.prune(); - }; + sequencer?.updateSequencerConfig({ minTxsPerBlock: variant.txCount, maxTxsPerBlock: variant.txCount }); + const txs = await variant.createAndSendTxs(); + await Promise.all(txs.map(tx => tx.wait({ timeout: 1200 }))); + + const blockAfter = await aztecNode.getBlock(await aztecNode.getBlockNumber()); - // After we have synched the chain, we will publish a block. Here we are VERY interested in seeing the block number. - const afterSync = async (opts: Partial) => { - const watcher = new AnvilTestWatcher( - opts.cheatCodes!.eth, - opts.deployL1ContractsValues!.l1ContractAddresses.rollupAddress, - opts.deployL1ContractsValues!.publicClient, + expect(blockAfter!.number).toEqual(blockBefore!.number + 1); + expect(blockAfter!.header.lastArchive).toEqual(blockBefore!.archive); + + await sequencer?.stop(); + await aztecNode.stop(); + await watcher.stop(); + }, ); - await watcher.start(); + }); + + it('fresh sync can extend chain', async () => { + if (AZTEC_GENERATE_TEST_DATA) { + return; + } - // The sync here could likely be avoided by using the node we just synched. - const aztecNode = await AztecNodeService.createAndSync(opts.config!, new NoopTelemetryClient()); - const sequencer = aztecNode.getSequencer(); + await testTheVariant( + new TestVariant({ blockCount: 10, txCount: 36, txComplexity: TxComplexity.Deployment }), + async (opts: Partial, variant: TestVariant) => { + const rollup = getContract({ + address: opts.deployL1ContractsValues!.l1ContractAddresses.rollupAddress.toString(), + abi: RollupAbi, + client: opts.deployL1ContractsValues!.walletClient, + }); - const { pxe } = await setupPXEService(aztecNode!); + const pendingBlockNumber = await rollup.read.getPendingBlockNumber(); + await rollup.write.setAssumeProvenThroughBlockNumber([pendingBlockNumber - BigInt(variant.blockCount) / 2n]); - variant.setPXE(pxe); + const timeliness = (await rollup.read.EPOCH_DURATION()) * 2n; + const [, , slot] = await rollup.read.blocks([(await rollup.read.getProvenBlockNumber()) + 1n]); + const timeJumpTo = await rollup.read.getTimestampForSlot([slot + timeliness]); - const blockBefore = await aztecNode.getBlock(await aztecNode.getBlockNumber()); + await opts.cheatCodes!.eth.warp(Number(timeJumpTo)); - sequencer?.updateSequencerConfig({ minTxsPerBlock: variant.txCount, maxTxsPerBlock: variant.txCount }); - const txs = await variant.createAndSendTxs(); - await Promise.all(txs.map(tx => tx.wait({ timeout: 1200 }))); + await rollup.write.prune(); + + const watcher = new AnvilTestWatcher( + opts.cheatCodes!.eth, + opts.deployL1ContractsValues!.l1ContractAddresses.rollupAddress, + opts.deployL1ContractsValues!.publicClient, + ); + await watcher.start(); - const blockAfter = await aztecNode.getBlock(await aztecNode.getBlockNumber()); + // The sync here could likely be avoided by using the node we just synched. + const aztecNode = await AztecNodeService.createAndSync(opts.config!, new NoopTelemetryClient()); + const sequencer = aztecNode.getSequencer(); - expect(blockAfter!.number).toEqual(blockBefore!.number + 1); - expect(blockAfter!.header.lastArchive).toEqual(blockBefore!.archive); - }; + const { pxe } = await setupPXEService(aztecNode!); - await testTheVariant(variant, beforeSync, afterSync); + variant.setPXE(pxe); + + const blockBefore = await aztecNode.getBlock(await aztecNode.getBlockNumber()); + + sequencer?.updateSequencerConfig({ minTxsPerBlock: variant.txCount, maxTxsPerBlock: variant.txCount }); + const txs = await variant.createAndSendTxs(); + await Promise.all(txs.map(tx => tx.wait({ timeout: 1200 }))); + + const blockAfter = await aztecNode.getBlock(await aztecNode.getBlockNumber()); + + expect(blockAfter!.number).toEqual(blockBefore!.number + 1); + expect(blockAfter!.header.lastArchive).toEqual(blockBefore!.archive); + + await sequencer?.stop(); + await aztecNode.stop(); + await watcher.stop(); + }, + ); + }); }); }); diff --git a/yarn-project/end-to-end/src/fixtures/dumps/block_result.json b/yarn-project/end-to-end/src/fixtures/dumps/block_result.json deleted file mode 100644 index 571794253af..00000000000 --- a/yarn-project/end-to-end/src/fixtures/dumps/block_result.json +++ /dev/null @@ -1 +0,0 @@ -{"proverId":"0x0000000000000000000000000000000000000000000000000000000000000051","vkTreeRoot":"0x0682f798cbd4d79c13a2f650654b14b1c1f90cf56ab0eb53f2303137316fd110","block":"168412281b25723f31c01d87dcbd5eb4bfa1c9d497054276811f7b1b60e8a9260000000a000000000000000000000000000000000000000000000000000000000000000200770f3c19522567719f7c16a16168cd7d360a58a085351d24e19981ced404bd00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000a01c4f87a8c97de8261d1c8917492b3f4c52a4f7d62783a50c8068bc54a9f095f2000005002164b077e0d3ae48b923af55339853f6077a68b50272d8414a9336b484a7fdf3000005803001c6ef98334f2cc43764ea7d811fa76f1ae4920f794737f04227ed57f35a9b000005800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000066db32e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000017d9770e08ec6a88f0e5308085c1da0e4271d46ae7a9a42a52d7967aaae9da14ef5a24a10000000b0000000200000000000000000000000000000000000000000000000000000000000bed2f5e000107aa36912351af5e47e85b6bde747868b34cb09daccda474616d09075bbce1780002098021189e3f5a9a448d3283e621791b2a280964f8e7e57bddd10f8faf79154b00000000000000000000000000000000000000000000000000000000000013880d87e811041d9b7f4747717d508f7be2570a92a24dd1f7572e871bae1cff83d800000000000000000000000000000000000000000000000000000000000013880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bec47b00207d0acbb35869b1b8d7df8f9c9ea217f9cad8f9a4b2ab2a655acfe9ff672019d0f8434eac2f39429fc5a560045e27c6e272a4fdce8fb4f891a2abd2cfa4f72d2022cf34eca3766f7f0c15ed93ea433946d790d54ef538a51635bbe7b9fa7d09cc90e94192696ac67a8c77aecd3540d3654bbbf79a4a52bbe350557052764c7068600000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088560f0f994ba3f5bbd628798917d2603cf3459a90d8b2e12918ee2364b712034c8a99cb64ca689e91887a76a4704ef83e800a49fba0d4b8c9f1db7bac462020b110f454eaccbb0080fe5e8c2ca5e8725a1a4126a8428707c21475b05c6c879669ffefa13c2e31ed4fb7ede224b5271c5616d72847e415d8782620edd49dca52c6920644ef4b77f85abe3d2af9bd5b3c3810a30d76090bec7ed9df0a815b0544aa227930a27ae9d052b02cce25d703b392a48101fedc789dd9e93406f944014858347901598744d5c8aaeaa8daddb794023ac23385c49bdab78bcb8b3a7c1068dd8a545be5829fa9ccf3c28ee45be5ddf76e1c446ec57d422676056b7ea388f2ee1003dc5f085642323ac9405fe528cda36331f6f5fb0da478f0f4c6b79a76584f0bd2a67ec965743ee2edfb9a8dad254354c72aab7cad1add5be6f9189a797d93ca2dc84be3d4dcea7a9a1df295e9b690387f99ecbbd46cd35f036795f60ecb2a6dfad512fb601828602e62b0d4aaf54019e0613eb2882582dff3903d609bea13742e186e1a574ca42caa496f05a6e7cedc8f1b706ac27b179e045ab1c87749806aa19d6e6c8ed0957098fa38c99da5019278e0f86bcd1f83e801e10debef5900000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fb5cfc23d13c58bccbe4aba8f1b0649aad5f47c67aecac3d288dd72040d4b46cbce4fd84f3e184a7e0b995ccd758577cbf2e2516e369479063acfe2193aafc1c07cad0765fa4afa491214a84cdb36a65b21c0d0011cd24c5118b2e2132d4d6eae2923a211286d0d5106a9ef375139435ed7423910967724d33cb2c1455eabefc39395d3ca5482f4450672e1d7733e9737faa3755756eb92435ae5524bb4cc43a6f0751e92c8a78015099e97804fb3e09df278f828b4f2df39969e49dd42919fa9bc412ebe799302d7147ca7c3057f0e13d0dfbe8a0a799603cad60db29bbe587e0235dd3c271354b02103e9e3a3b0fec304fc07123331fe8efd4dee89c70a04707907e8a4737bc23ee7ea6aa737412f06adbbed64f3f88cab2b9f25e342bc37ccfd63ea6c2ea22fa0236863db4c659bafadb24041b51013403d813b9c923267629c4d21becd352980b84273d42320b8fe7b132c60e508832570fe23906ba61329934e265fbc4bf58a6a1c1b9e3d8816b6169acd318b3c5ee6083d2e41836dd5cd288d10367253af00a383368f798df4e5456986a756f2476c50309fd71741ca62d125903345799708ef0aef33099ef6e618282cb942e63bc0b5474e4ca651a20000022800000224000002200513f23dac12350cd76868b8a3d05065c3791a3789383d1fea9ac3ccc3be7c830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006fb08e47bf4a5bacd50e4a162b67d37ddc33cd3aa7216a9e8ff64e301e30df68a39e315731c6cf7ec6fc433a3b8c1a5f0ea486d6b693c1f4180b57476b9b2c0eb87ae8203a12a3a53798bdd781187f28888ad2c4d0cb583c9102610fdb527ad793c1bb58f0542b77d710c2eb23b5f41c5fa75139cf5cbed830552adfd309ba56e4704ffb7d2f1a181d88a4c29dc8413fc873a5c127e221f5f0925613f06fbe49af6b243238ed369489e0e5a6e23f81968ebc1b45159de50996370730538a24316bffe41cc183f5afbbd630f8a6c1bc1d56782546e63baf390a9a95a8a4f707412f2ca990db35154b0eeee962bb363de1448b249cff1258e0c3964e5b922ea23e967025a05b79cdb949cc14156b74e306b254d304ea54662171c68c622e36687f3f8b029a40fde2493e336aec8e03b1b883bb11b849a100a30a591f805fa2e2a65d9b6aea0a78fb16047c7aca474818d342aec0e71d695b7e20af06a78e5f4052f6173139f83a3f183995062c4a7e3212c9c48ed0581909f39b4fe3f4a834c9f3be24047a2226fe7b78e7974521c71d114c8b318e93e3573a1da616d90dbe3d9d73963df0e3355a197feb54545ddaf20e376bbb0ade6b0e7c693510d1da27b9a0000000400000000","proof":"00004244000002120000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000006b0000000000000000000000000000000000000000000000000000000000000001168412281b25723f31c01d87dcbd5eb4bfa1c9d497054276811f7b1b60e8a926000000000000000000000000000000000000000000000000000000000000000a08ec6a88f0e5308085c1da0e4271d46ae7a9a42a52d7967aaae9da14ef5a24a1000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000016e43c5ced27da8b6f2fc788451dc743bd619c3763dd038512e1e02e4c8c6f440000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000066db32e400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000066db32e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017d9770e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000682f798cbd4d79c13a2f650654b14b1c1f90cf56ab0eb53f2303137316fd1100000000000000000000000000000000000000000000000000000000000000051000000000000000000000000000000000000000000000002e3059a3a513ebd2100000000000000000000000000000000000000000000000acb31b01e879a466900000000000000000000000000000000000000000000000e4156ce7e68f8d05b000000000000000000000000000000000000000000000000000207a06299fa9a00000000000000000000000000000000000000000000000165ad30b03ce3eb2d00000000000000000000000000000000000000000000000a3a7147ddb3b9458c0000000000000000000000000000000000000000000000016e5155e9178c65c8000000000000000000000000000000000000000000000000000068b23602e6fe00000000000000000000000000000000000000000000000f6efd39e580a3e6100000000000000000000000000000000000000000000000082e36b8da2b12bc49000000000000000000000000000000000000000000000008ed75e19a27997c5900000000000000000000000000000000000000000000000000017cef742b6868000000000000000000000000000000000000000000000000fd810553a9e73f3400000000000000000000000000000000000000000000000b145e0a2ee85822fc000000000000000000000000000000000000000000000003b13582511a99c9940000000000000000000000000000000000000000000000000002865bf9f95be9000000000000000000000000000000e890e23ea66995ac0cd157ad66203420ba00000000000000000000000000000000001c001ed135ba5936f3a916a97177a900000000000000000000000000000064678cfe06a8015932a3e281645a534c0200000000000000000000000000000000000675ccb0e38833042f9c8dabdfbbf300000000000000000000000000000007ee7d86d5d35b8497170aa93149d6ea9f000000000000000000000000000000000017a0ff465881fb66307b71208429c3000000000000000000000000000000fdde0ed9f5c731c7f476c7df130e7e4a200000000000000000000000000000000000017f5ddf57f45a9aa6288b3feb101800000000000000000000000000000027995bc3cd9f6ffb368b2d8524bd9b802b00000000000000000000000000000000001cec85cc344dcbf75dc4b68e640e34000000000000000000000000000000dceeaa901d6af7095576c5f01243416eb700000000000000000000000000000000001f0de24acb0d0392930bf4336c8ce8000000000000000000000000000000c3562d3de20254558799fe1cc6dcd83d47000000000000000000000000000000000012e94fb56eca2710e5ee89f76ca7bf000000000000000000000000000000c8e15d87aa3d60f470e3f45067e43f8ea900000000000000000000000000000000001d068a50ca319ecc7c91255068c4cd000000000000000000000000000000f10600b8565647170aba4864d7d764729600000000000000000000000000000000000890c5f08938a81e9f7749cb8d0fe5000000000000000000000000000000c5236a4737f4ba302ae6a186735d6703cd00000000000000000000000000000000001245132eeab701ce68da11c25e6f7400000000000000000000000000000058af1b0a892816a68b47f1d913396c02a4000000000000000000000000000000000007228bac9d853b2aaa5a424bd20eb8000000000000000000000000000000f18e69117cb80bf7fdea3aeeff5dab8d9900000000000000000000000000000000002c015dbb072d722403f4728fea05aa0000000000000000000000000000001156803aabf9b319bee320bbef73efaf6600000000000000000000000000000000000453bba56f5d72c28e338eae272c17000000000000000000000000000000c299833e9f322019bffb0bd9e75656a60300000000000000000000000000000000002330e2edafd8bbe9a0abb1cd860440000000000000000000000000000000372449d66cd4cc5db696dc322f7ee3012800000000000000000000000000000000001583bdb63325fbeb57bda9e2ff70f8000000000000000000000000000000be29e683f6ada33319ac9a523407fe264e00000000000000000000000000000000000de6b54f7f3d9d54d36e2961fa376c17b7f860176ee3972e7cc5bd5511f9c2abebff7e18143725b603eafba3a505f518ac5612c9c2bc9289d37ff92c6f5e9a7c47e8ca61a5396b8dde0a984c5afa0c20d87055e7d7872895512f79682588689bd04a7053bdf14c54973d913c2a8ad11c627a0c55d075e872109b2c525f2c904c860ad67e74228e47dc4e1082321b1117f1d69d1069d0c732313407ffa64e4d757689ec7df3b6d6e8dbada090f4f7e40ae8d5151e9b492b63f3c92f8f8276201887061c7b34bf1d8a4be1c6d1e8c2790c07331c29013c619653684d2d56af2b01f123f6bc659b5caf2e30d8f13c2d4628a582d3882a9af99e1216411f61ede2117ad47124bbfdf2a2c34cfe8a3ad55801431292fae6ae7152f2ccd6a1e97dd6a006c867c79ec9a88cebde40cea2837814d566cfbd8792b59aeb248ad90af535a01b91ea94039e4d73e246c68427fe320f89d71c640a23c60f5e98ac5951595bafd93b1cffb420994a5281456a5174602f6a07795c2b9df7994e0429c1830616218fc6c0a43a2013a934bf1ed6a83851294c4cf42781ba7ccbcd0c874e14ec3a73e76dacd2f4fa4c97ec61f681ff5fdd23c8c84c119e4e874e80e11b68a8e564ed6d5b3957023c8cfc3b085781fe59c617dc32cd82fe63fa9cdcaf5b711d9b5cb6584e97cbbac645c7b1964134c52e1e26bb7e9efeb4c2143181f3add3dc8113f124ed3bf393590824af3b1522dc3bf626db5481496d903b8101a71797aac69bdc8296591d77177ec38eb47d6a03ef5e006752754121fdcd97edaeda2fc4eaadc34598310fed1e51817b403bfcf8ace526079895e0b13bb1b39d335a3040e6bcd9647559aac3a9061281288859fd278d00ea848fc7253a53b8e12e578e1dcf176b4ab824fd977dd9d00fe1c644d1c83b2fb9cbf6fe97157f7ec36ae4491ce00589acd2404a2eeba16c1d2eba111806080e366300e8c7176ed2718dbf8fdfd48bb3898ab6b0d365b0322aac89562eb20518f27f51f4ee9a02c95e01e959f8a3a52a62de398387703dcf8c17e30a857d6f042a273ea54f5b686b0d83c242a2736ac45e9213d73a6ac3e18bb15016d9f9e8274239f20372290daaa50b8146c7a8bf1b151da1e3ab8d6366b655299b3302aa2b3be763a558172f183b9ef49f9bd423402d74db715c465cde710586c8c343d30abc860c1690ffafdc4caaf069ba2b47883a5af98f542e2c592d0e52fddb6f3d198e4fd8c00fb5294eb59709c928197f5cdeafe1e5a1b8e80a07a225cec02dde2d01556017cff634782415df3e0d2a366af18ee7d59610fbeffb8345b05546f71075899a23429760934844ae9fd56302dfa82e98a8be785f1c5be63885f1a2fd1ce066b240980d270630eb6fbc04d8389773651b293c143781305c42e5592d2802feb21684df8dddf3e437493d17d3b9cbdf47c1c916d7f2bd49ee3e766edbd626c47b3935b3603eaddaf1d7844a79b3163846ce49796c740021316f6c6ac83e076375c457b32bacabb4e21c7b99086b537768b9df5b8ebafbeba49b6a7f675f216904f2f790a0d90ebf52f9af807ca4ba4fde03334e500d21e419967a16f7d1300a15a76424279985d17286ff240ac9364c2623009f05c75f545bfba3e8baf202a79752fb46e21f792d96c75374a13fa33bdd787731835c83ec50be62dcf01e1cef40b75c12e728067f0d8c79f86bdbec7e63d8b157ec51a8d7876b5690efd30b98d76a073bfbe9485347582533dd4ea6ee29342876d1c53a45783ef7cad664090b57d866ccf481882059dbc98fe30e355a1684c1d3990ff36c555b85c0d52905d6a79b9ac60fae15d6902822f6f9a76572f46353e660d7da57abd11a71f3bc223dd3794e061e82130d9a7e452574838e49ef163cd19b0cad58fdf71b186875112af6f9281fd729e25f7314dad5f71321ac1b64936efd29253abe195e91d08b118bba2dd001287b9ddb54184cb7f20a77161599dd5b606bea6753b403de896716081afb6ca45dd1c8304df51be9b4fe53d2866c7318ad79db7bdb45ba6052e919cff7b5a11c4c274f1e7d6355034b909767bea8cf7de1ce7196d29eb5bc95a908283dda4b0fde95822093cc1ab63a35e1d40c1f4b231cac8c0359db70fc48f522ad94da4eaf4bfd93793ea2f383e80d14d15af940696c219c1bd8cc568d0abd11398622c040d733c5f81aad86abca86cd3f300a93832cb76fe0b5058492bf382675f859089e42831c53d1b8c675d36678979d1093f4728bb25cee192d3847db029864880302591ebdea08f4f6fe7e9ddfee962c008199a7ab5c38e093adf4411f62c0e3e8f4ec3d9f96ce4dc500ebdb2798f0bafae904da10fc171f69f13d7318516b67a1c414709e87bb4b981cff45d98cae9ae00a04fa5d6385f1fda248f126b46a97aae540020825d888c310c3f92176a9d279c8a044809726f9c6d3f86114f9317b53aacdfcdd75b0ce2aeac842b0b92ab8b7feb057a43c63b4a485967929496a8af1c25fff6e8564430facf472466d2476784ab74df515c150fa1be99d13fe388f77a03cb39148a389ef0036f89d9fa8845acfe5e481a7e4fe13b4d8160df767c37d1c36737b18df2cb0ddf710238c36e9a99b2d6162ea76410276416c1e2ffd4f11e221db4c5629cb516ee415e1524353092846220a5ccbd3f277f822039fa4197b3b5431f8ce16c2e60cfa14b36ebded00b859098f62a85106852ab1231ec238d4a775ed1dd411cf2c69ffd0550672490c6bffb504b28b014a354cae0a7a1cf1a50877d89c8f927a01270ce12e2842e058dd9d1ec8f1a8ef6177082014c6e1da7c984549c5405e1f02d0ddc1338ddaaf1424a1faafe3bb37dc1c60d51e29dccc27c1ac3240382e98555c265df7fe38d8a169adfae9b8e43aebc68bf3027af160f84ce4f5dd25a0c01af01d20b6c28bdf0870141b755050d4b848163613fcd1107536e6edbb270565f688b9a316c9be1cb78cf45b2b015f22425cf83d1413cb6685900b5daccecec7db62c3a444c89174fafe2484c042de9bbb9e64462f7625d117ef05575a1fa62d9e32f7423fc64e6ab89073ff2d64b382e1718cd10bffd54589b6a7d70eb86210858b84e64648450071c30213a0fe8739618fbd450d0198103d9087861566f436459362b131fe5138dec463b2596181b30df0e97d1b54c0e8f65e2367c45d41c7147b92603aa49174e96493238420fd739c8b473f1a6c805e1261159df95b55b0f25a0e1cef428912e19fed7d985152fcda7c71161273745a2f156839a1e0cdbcaeb1d830017bf30e89e12286e405a5ab3ffff3b6249eea7e5576a3d0b755193cf5de3be6739bcbde111746fa7509a98560f4b32a1207c5704e49ed9082181a85da3524fa0cd9182f20486abb7edf5e55cdda4e9d1544865b4f6d1623bd5b10037d2774bec886400abde4efe406439757c69333111234eb078dbcda1dfaf5799eb565f1ce2f74a19141f3deb171e82d2f07354d8d0a75afa7c749ace21add83097ef9ea0f43a8b46ebfe35abdd2c4346d8a7fbf3c2310e85b02b9665436bfba3b2f5913aefc1aefcf483464acc705c7bae16e3c0f1331e3e99164c0bfc273ff0aab9c9a290442ce82c1f7b59c47c52dc1dea65aea19c31df3d83e6cda11275929f992a3bf65da098a15462c7802c798085aa6da531755f409584f67e4e1fa3a8a1c49e8f9738e059da7773bc4764412155ce7695a06de4f09d47eaab8410674490f0f7e753c2de2728bfdead8365d01c0dc35a2e21da26c3f00a662c03d1fad9582802aa492de146a5cf7b33ae19c6c0888f7b3f10382783475be591fb2cb4413f10bba5ab8a3ca700ae606ab10023f3955c6e6db2d489c0396b3547b84e5dc9e3e93b43540c33ea6434772169e43110ed5e13cd4041a4b364800e252f48987f787cd25c49f8e8a541692de892522da6e4e96e64d267ea0c5efddb96fd3b98789005ef051d7448f1294ba417834ade96bd21f621e15cff207bc6b81b90b722d2914ac9a4419348b1c7c066b45af6a325e056cfb1703ca4768f96522dbcf8ea19c0509edc60b9987d845168dcec1c6cb6ef85169420baefc83e3689e63e456ebb533aa5b6c9b6d90cc033ee9c14a90c3ac7dda6ed2205c946255cc7d340c7a35687fb4ef5de1829bd3461e5a2faab8349276bda13d1462d49dcd5e6f9a36368520b6c7c1752b06ae0a0506565bc1a7d8c4c59e139b0d330d82aa9c303eea7cbb7fc2224d9f95b2287a681922425bf6ef7f743f71ed2fa2842381c1b2949a651e1bb299dac8e29ac9315b992664e5ba8a9b3ca3906b196efadbc05ca4657dd0ef2cfec897b01e70f868f1305e8b75da5bd94e47c1632094c7a36aca33f4d3372b2c50e55d2d15902fbd05a4e8fc9bb5d0f48e74acb2035095fdf5e00b5b74816f7a5147bd2209e1f86fd6e7380b6c7a0f21072aead00543fd3fa0d91069492434b5ec156790d9771280de3da610aee08984cfc1f81c066539a009ca24c0ad28eb8fd8d308648f00b4570c5b21f396d43d904b2cf1fd2707efd6b88459b769bbe2780a0e40eab6f75fbbd78a8ce2e314cc172913d58727400972c7f660514196631adf83977f9061a134732fdd95ef8d5d3947a8a01f0533d9f7ef930f5949c1c1c653c9fb90081643a100aa4ec653163313ac57aaaa1a61989b08984503a728d78353e244cf9808732c64cfc96aeb9e819bf10c0a671ef93e145144c4bf20f953671ab48d3f59bd3a25bb11813d634aa75a694919b6159de4f1e2baaa6c167aa26eaa59db15138e13329e5b1934f8955dde5366245d0247aded5fd1b78c249ce2b2f1e78687dc28da8854ecda9c496a1d4c19a0ede52513e61a5b394a643dcd6f130de3cdbd2db36030a7791baf39576bd2f54605a317833a6872380699eec46280a26304bc49a0f68c79db2fe44abd20b5bee690d92708963fec33f845e5720c7a25b7fce90e9102899172fab1ea26e6cc845c437f0e5ce793ec5d3948acb35f573c31e78e75b68fc76895e1583c710aef41aae5c90481424c02846be8668ae730f76587968037e34e522ebffeedcef3e81e0941e415c618ed6b810867c20facbfed55ca333d3a50c482609698f5b95d21e2279795295ce0e98d92fe1d2b43c42ed5559c6f4971ffae3329491473121aa7cb794ca00b7c3e7863507e82276fd36ffcf3c43d23e47ce5536bc76aa398368eeb579e7f11853b53920633bf35a45b9dc1152e54da494bbfc93077ee3099dd9a881850b02e4343e6772cb70201912893f7718cf3d9b7e0d0fe2e1ba6f1fdb2557db6f1f50a98771e423932f665fb9147123b4fba2853d93eb14152ccaf7aca70a2004ffd2457af6073b63c0efb1bbeb3940a0c916850fc1b63af7dff2b8650c02feff9be090222667949c1ffa8914d84037352820a9217cc6d8b5b86f52885eab7d6d47e267c0e4f355115ef7bec78eb1bb9b07f03537ac96e07a32024da4f61e32c6e1a0e6ca58ef7dabc94adf7f49167a946e1773314bd07caedea2b68ad18f9f0fc0d0cf941c6e7859e25aaaaeaee65f741bcbe44c1cc1f96ba18af294aee5af9593d04d4a99b71e196c51238d7dba3c1b70781a3f006e16e4f7c9a0dac3b453787c40f48eeae19d2c0a72762fa9a8e6b5aaddeb87c68c69e64f441d5ba7645531b431a787ffbecac74ed1de159491427b9b03e42b10fe1f98e8a4313f264d4fe067a05a3111e9f466f1738f37512359547155116970b042fc44b8ad98a7cf5dd00cb02e1524ff398f782f37222bdcb828b5dcfb4ea040ed8c8f3be119ed63625fb2e2a77380c84d607566fced8b0d3d8e909d9ff83f01527b190e40015a3d7def6d70f22fc9b4d8f06fdeee2c95c699ea8f8ecee88fa13c27cdf9c9fed4d38843f0019569ff7b02007bc0027f0a57c6b0b9e156f434a896d71b8b799efb621635a3512119ec00b23decb223eda213d5c2401dd1f14777cd6d612f0f7594d2cfc5701286f01cf5656ef4973e68f7df3e3b5215872b570d631eba74f4c55b27a4066f42fedf79141ddf98f44d7094dc562f62a590d88bd287429712f797d9658defa82229e4fd6f4f37b9f6b19b94470507f269b4a1473231d28e642946d95afd1923e082b35ea2f62f7f7b72cb5f365b08fc3bfe253d5247d6371ad6251a48eddb009177ae9cd062fbd258fbe07783d47fca0b290167da10536c29e4c86dc0877be242ca1b1ebba3fe8b526b6b5a6255f9aff4cecb7ece457020ddf108575355a98c2095bfce79a9b6a8d5c3ea400cbcf3f1c5228d4f14c4cb1c133e3ef9606daa69729bd87eede7202b55af964ec94c16100acf0045fceb020259acf5372628108a52dee8a37400289210ea94fc4d04320d0438e5446c61d9d015256d6afccb3cf1e1d92558cd7cebf73a10361e81e150ce610b06090910d19178cea3e3bc69cb9432958f2188617b97072f509c28a32a788615d4d591a752be53e55d89e80ec6bd72017be7dc9d99a3a2bca785c86ebc7539c6ddd18c1a0a37d8a918d316edddbf8238863eac1ffc39ff5017451e61d76e7d57a5c90a6e2b4964ce727c02bbe50e8104c0a87a31fc214b6f6a2e444fa3d5b96615262c059074eb41063bd0637c22c1591b5323e36d5acd765426b4f3b4fa2382a9cb45b9576207f780e82c5a4a3a204d4ffe24ac6810abbab362beb90ca637c6311a44ad31d6e3a868308e432feef18b2965854badd7ad634057f2e60258fabcd3c83d18de3031c4601783e6c8240085eabca90cec30013d00138685cc104c58e6d48e80b5582f4735a389cc3b781175b46dec8cb5249ffa38c7d54ceecd23ae4d3887cdd21b27d14982596004b9d17c6c69f79ad3cc750aa3b78bfd218170d5878c9332d345ba6d353cfc01edd2e133cf75325c79370a28117fa6ad8dbf04a0058a925c5f2ca117374c853e193c62355120f880ce444c81ac3d6558a8e9a345bf92aa75ea7d285e67bf01331d1561559f8502fe8d1c4b9150b91c5fefa5cb1159dd4ebdc25e9360a7d4e868a370b0fba1eda0da1014808d4e2ade1a5c0166f9076d99f36525000a638e03cc5936528b9341ff914e119da78f92a7355f42db985376707aff5609be44973ba5b926e2405c4715e456b9effc0fa6f000437a0bd37c04439958c647708f5b0d89acc5e245dc396aae5e61a3167916efeca48299130de7a9197ac5c91f41a2f8134a8d10ec0adca399237bfb1da227fc2ce8f6ee5a7b8707ca6cffed2a5bb6eeb8fbde91311dcc425d7a1c594a129963fbd366b34291492736a3e761f977c27e8140056287b33ac0a5d6cb9d5515c988fcfdf46b046e3800be37b85bd88877c4bb9e8ad1f1c2f1ce028010d6dddad64f7ec693353f5a69f86fb61b4fdeb60befc012fbf17250a793576c282e64ce1f1a8ae1b7cc1ca582f07dfb8a62a7f32d005592d1c18136f8ac60d1e0a0368da85a34337cb8fb61f9b6c93b945f0b694f8fd5c17dd004063c77a4235b56485926549450ce67d53211b80d8e22659d8ec39adc1533730387aa61745575304a44cdf5e46ff334bc1b5739f44e22955ea6cbf59ebe6450720a67099b41e4d3806a19b88b863742b1305c4fc80307f271380aeba22e949213da42eb6836f8a2477f025170295f4762ad8afc70384a829eafb2c330c0eef02e7b4a10f1880bb9a52d1b283d7ca2314450ff2974b5fb4246c2623531ccdab1a77c3b232427bc299b76f7380cde37298c1a684ac0e6349128a15afb4ee5fcb0524a99c8f4ce54a1c005e257baf2e31c4442d1cb1f42c336ee7d7d6b2c19625034a1ee973a46b2bebe839e776a66cebee1a741f094b7f10b58812d28508cf442c14e9e633d6e2640f79ff203d77caea167e7b7efe21ea52d2317df3898a0ebb0d3316f16bf92e3570d022b9bd5cbb277b709469ab03dc8981002862d232703c151039d50e1721e3f4b5e53bcc0dbee038c8f443ad769773ca6c5b8f0475dbad0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aedd39c45321954a31a94232c1514fc2d632d6f1fe182f7f127654038a76d8f2e1cc07f39c70c7a87d578756db548ebbd6c17bb0319b5b490e2d39fe55652ea0d9e9b4cfc7cdfc182a0b5514d0e3a583b499ab342b4cc5d2536073110aa7cb50741f0550dec2646df9f3e68cc6ef12bb85f34e1e74ff59bfa84806e4e4f419f2192a4130a392ab8d1caea80ac2fc4b39d125fc1ef06374e463ae27414040c962ed1dc5d1756a69e788374dd3716c1efe9e40f48547ff520dddf440a12881aef1c28d881ae2867c83c54c39c0143afc5e89cbf4f921577f6fc3151729ff846d728b1e554b1f115db276ad487936bd19d596c7bf889237e3ec4e4c4ee72af76730a586f58b60b9ab4e8c87ca91344a7ca8c81171a1d291e6c7d9d6c3d31dc18c61ed6d19da10b0eeceb81f44426ddffba12d1135825ed3908cc0fd1648a04544e29cd60006839f4586321e6f3eeb651e71223a0e4f1cc3d7a921e78382210d00b23950215b85405f7a7c5381bc3bc4dd6a953cb37a74e20305c416d411ba1c9130829350bfa6aa9998057922d982b2ac617b501372b988de766b247b4e156fadc08b813a22d284a4b5b7b6974fd7fbf0f694155bb82010de7e31c079f2ae027772d09a35579c1fdbfeb9a6f97716a936cd98988291ac5ee87b7a719e371ddc52b0e06e29be3bad2ff8d82b19db6a5003d4defbeffca6ed2b4c85fb234f7e5e3ee1dc2e039ce4ea34aed5500432bfba4e67117442b46302b0b17cc8fec23c3983b076be47f23284da334b5d02a4a60124482dc41d70492cce003c854334bc988cf0a1129a2c793c04576e2011c4e39ccb6dca3df91755e24763597ba336ac3c2a000c897ac8508951277d9578d2838c0865ad9340bbb3fe17e00155ff6e5c172880c48fa15afb7eb2d2d45e987d8f930b389fa97d2a577f453ccc509d7cbf89c9a084bab654462daad3297491ad6005a08dcc5bfc71f27e86a7898c9d1971337890c6ea6968ed79a9eb09eacdb1f1b300b887eec3d79dad17899b959be2e2934c608cf74eb496ee77f75e21ec80abf489f18685aed9cfa5a65988d678f3a10b68f0385bfa953fa078638a4d0bb697e2f347323c1b7582f6512826a3ce6d437b4e50e44ca62869e9d1b4dd8e7cf50fae25136050ea4642142fb537485989ad3aea121992bf4432347ca2fdb606a89340a9fe2612c5644e0004b84207b92abca88702b3f75bc130abed3704261e0e0c7bc6172d315554f60b7be40ebd250f89ac7e4087e943193c8bccbb159cab9ef52af004c36575d4b33b50bd580a26363ea5c5023a3a37df568dede4fb1d2ee6000a8e1ce9c5377ab5861193c029db7661d01652dc1c49ee330a65454b2eede670e39cab7b88128c6c707605cddae6a2059abb924d73ca2402e2d2d09affe5f3cf580c40bcbfaca0216069ef0ed2455657a63921818c2a8fcd6ae7d39e8ebc4984b875f3820224b1bdbcfb17e4a89aa8fef4a88225426beca80ea5140730767b2d12dcbfe4c84971efc2cc1db4536244ef31ae2066ee0901d265ba71a95a5ebcf960b9ad56a91e125483048b1c6fc49939fa68d1f2cb09b504e77ffa01264c004d2973a5c30c2dfe6c8b20818d5ba4eee65e0362648eb1a5a239f933cb9b579d4e432d2d0f85ee0bf7fc223103fff7bf3f3c5410d4cfbe1f878e512b3f5ce26a09921f0df624b7105ef4b80095151d0480e421610fbb3b11018866d6a7c1e55fffee264d04cab0fd467157b452685717298fd57159b78d3457ebf31e21758e7443639bd1d102cfd70a40ade42024ab06a38f8c41cef250cbc560e0ba83ee7e92dbbd6166ca711736cd65146bba4bb11a4a13dbe0bbf839aee17e01a2566a72e383bb2c64737b264121468f6dbd60d4e229511dd026c8a44ee3f4fee5c3059c05a660ba74f407142c9a39ced7dad8e3ce277e518166aaf5d1c680e8ebe44da44f7cfc9d140de342682bd049cc4e1ec4243874a740000000000000000000000000000002d544172ff58c414aec63e4d5f1dfef43300000000000000000000000000000000001f9355535c4011f0431fd5d78385d70000000000000000000000000000005b0861b99d5f160f6230f9f890be2ebed600000000000000000000000000000000002712498aa068f693d353be01177e76000000000000000000000000000000a3ed814facb4a323ecf496cfe22111b98e000000000000000000000000000000000000453eacc387f1fc8f03e972e861df000000000000000000000000000000b562fd6643d726082f602da446b919e91b00000000000000000000000000000000002904ac9aa8f8c73d5d123d0daf07f500000000000000000000000000000024b01c7f327c090af5aabcc61b7744c5f600000000000000000000000000000000001af13e910c661bdaed7c407ef22832000000000000000000000000000000c5f99bec72c68505b53689e505ba5073a4000000000000000000000000000000000025d37be6c22499780a76ddead2c0f4000000000000000000000000000000bc96ca0405b11887d07dae6d902fc1af8000000000000000000000000000000000000570316b99804a92474966927a1eeb000000000000000000000000000000c51afbeae269b1d50b50ce246e56e43d710000000000000000000000000000000000112b77cb044c9747fe69f93a39abef000000000000000000000000000000cfeaaf59760d5bbc4655db3aadfea1a0aa000000000000000000000000000000000022c10efe9bc26d9b4ee0b1611e135a0000000000000000000000000000007582cf1ec23d97ba97718f2188b1c93371000000000000000000000000000000000013d8c781f121595d4e5598a4030a6c0000000000000000000000000000000a03577c6032b26766c15e3e08700548690000000000000000000000000000000000087663ffc7008c874adb639af87158000000000000000000000000000000a686745b827bfece761fe5806e76e35251000000000000000000000000000000000009e390b295946c5ac093093d77f7e1000000000000000000000000000000f48ac2601aa03434eb86554c6a549ed3e700000000000000000000000000000000001df06322fcd37d73fb3f73c03527310000000000000000000000000000001a6b37aabc3d0edb4464b9b50f0389ed38000000000000000000000000000000000022b9f7519f313e4fd502b95694aed90000000000000000000000000000001be2abb66660e897fe5f82fb08fc27315e00000000000000000000000000000000001f8501ccdd5f18745aa2201802eb02000000000000000000000000000000351aeb7da4935c09161342c7d209a8afaa0000000000000000000000000000000000225a2e0d33b9be5bb96ff1eb92d98f0000000000000000000000000000008cf2f296c72458fee42619fd34f507075500000000000000000000000000000000001e8fff6a9ae9dd278cd2aadf0e4594000000000000000000000000000000449ea257819728f0f882fa5d2e396d71a200000000000000000000000000000000000977abd3552057a0ea284e4663b71d000000000000000000000000000000065e14c6475e60e9d4861a4464e61f254700000000000000000000000000000000000c6c2d75a8189325b7db63beb40e1700000000000000000000000000000031bed94f48899760d0298269afec303b050000000000000000000000000000000000080a945d72442ba1d6e21ab43a96c1000000000000000000000000000000ed0fac5f4c80e355c0be8e66047830f59f000000000000000000000000000000000024e5c1a9a6375cc88f61d419b84c53000000000000000000000000000000f1ba93b6a3e6ef60273914a2ecfc75e8cf0000000000000000000000000000000000028e915ebf8361451cdeeb95c3abcc000000000000000000000000000000db1215215845e883a175c9a4a6f7263f4f00000000000000000000000000000000001bc43ab52f8e49eedd73ab963220fc000000000000000000000000000000b05cb9b046f7334960c1a24ca41f3d495000000000000000000000000000000000000b549fae7a60f066880d9168c3cde0000000000000000000000000000000e76311a28721dbb951d7c059ce215233a2000000000000000000000000000000000021e9da757f03a2b5aece398c8f1931000000000000000000000000000000c5c4ec6e9154a076fedc74df770919800f00000000000000000000000000000000002753f03c77aa03bb83ebc39588300f0000000000000000000000000000003406e0dd884841bca4da43bea6ed4d4bde000000000000000000000000000000000021e99f09e1ae95843b7164b7b096750000000000000000000000000000005ba04fffc36b84ebf25a49db84fe1bd39b00000000000000000000000000000000001e3e8423aa44343e612bb8ba4a089600000000000000000000000000000018cc12d2403c522eac722d7509ffce8f1b00000000000000000000000000000000001c6679071a1163f2ed8f2cdc8774500000000000000000000000000000009ec6c30ee33ffb79e6acceedb714f2544700000000000000000000000000000000000f58de5c741ddb445d68e0b103dd2e000000000000000000000000000000e11c50687be4e1f1604ee9049fe590f04d00000000000000000000000000000000001bf4b5bcfc56dc5d4e110fbdd2caec00000000000000000000000000000050564da2d316b539c0b90e67051b3aae240000000000000000000000000000000000024f95673a0d92228aea675d32ec1400000000000000000000000000000078e152955aec020cc07d64080144cd4e2100000000000000000000000000000000000bc4d829ac3c1e7e343fba8ce93546000000000000000000000000000000c2116b1ea40649ccff4f52eaaae87705d200000000000000000000000000000000000ec5de6da728c2e9464ff06bea8a2a000000000000000000000000000000dc164daa4520700db4a7ccd0da9dc15d0a00000000000000000000000000000000001ccc9883777dd2b7823c81951414cb000000000000000000000000000000a8e5dda2672f008588528bdf5755e82ff3000000000000000000000000000000000005b91f947e4eef5e064820f30652d30000000000000000000000000000003abdfc9d089300d182a4ee2a3de0ea5233000000000000000000000000000000000019c08834d097f3cab625642decf921000000000000000000000000000000e2f74bdf88bdc17abecf32d8f6b373ef08000000000000000000000000000000000015f00c84e4a25a8296891934c039820000000000000000000000000000009fbebd8a792cf6c8052ba4294d92698ae10000000000000000000000000000000000152eb9b5244862d97216b89e225ff000000000000000000000000000000022d241f5abdc2d4e66aa8d42553294dbef0000000000000000000000000000000000010bde456e78f9667d4a3626e3b979000000000000000000000000000000620da80ba4347c36225e7aeebb0931385300000000000000000000000000000000000708e7820ee84707ab5f837adf3dbd000000000000000000000000000000670890818a869ce4a038075ea47797966500000000000000000000000000000000000b084ac3e55bec281cfb12fd482407000000000000000000000000000000d1d5b9d7e75041e7ea386045e8119df15200000000000000000000000000000000001b24df43985e524d880ac83e3b903f0000000000000000000000000000001f90a496153cc5018f349982d7867d028700000000000000000000000000000000002329d015ee424259e29b2f0c9104de000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e287483358a5b7c81992f3fca50c2b348a00000000000000000000000000000000000ca6f20f3b3593f453aff040297f3200000000000000000000000000000063afa6e0000bd6381aa541e8116f7a71bd000000000000000000000000000000000015782cd812d4be6f6a93a0e3c4ec4b00000000000000000000000000000096877293c61a6caf329e011bc0fc2c9a4300000000000000000000000000000000000ed171e13cf1f16dc7c2abfe2712350000000000000000000000000000005f21b82d180b91c46a74d3f35bd0ed1e8c000000000000000000000000000000000003c25739dc307a886612157f3a34ec0000006b","aggregationObject":["0x000000000000000000000000000000000000000000000002e3059a3a513ebd21","0x00000000000000000000000000000000000000000000000acb31b01e879a4669","0x00000000000000000000000000000000000000000000000e4156ce7e68f8d05b","0x000000000000000000000000000000000000000000000000000207a06299fa9a","0x00000000000000000000000000000000000000000000000165ad30b03ce3eb2d","0x00000000000000000000000000000000000000000000000a3a7147ddb3b9458c","0x0000000000000000000000000000000000000000000000016e5155e9178c65c8","0x000000000000000000000000000000000000000000000000000068b23602e6fe","0x00000000000000000000000000000000000000000000000f6efd39e580a3e610","0x0000000000000000000000000000000000000000000000082e36b8da2b12bc49","0x000000000000000000000000000000000000000000000008ed75e19a27997c59","0x00000000000000000000000000000000000000000000000000017cef742b6868","0x000000000000000000000000000000000000000000000000fd810553a9e73f34","0x00000000000000000000000000000000000000000000000b145e0a2ee85822fc","0x000000000000000000000000000000000000000000000003b13582511a99c994","0x0000000000000000000000000000000000000000000000000002865bf9f95be9"]} \ No newline at end of file diff --git a/yarn-project/end-to-end/src/fixtures/dumps/epoch_proof_result.json b/yarn-project/end-to-end/src/fixtures/dumps/epoch_proof_result.json new file mode 100644 index 00000000000..eced8abdbfe --- /dev/null +++ b/yarn-project/end-to-end/src/fixtures/dumps/epoch_proof_result.json @@ -0,0 +1,4 @@ +{ + "proof": "00003f84000001fc0000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000005b00000000000000000000000000000000000000000000000000000000000000011200a06aae1368abe36530b585bd7a4d2ba4de5037b82076412691a187d7621e00000000000000000000000000000000000000000000000000000000000000012d5773cb9b23c4ed50f9fba054aceace67637c56c492104bd6cd85ccdb3ded6000000000000000000000000000000000000000000000000000000000000000030fd77c2a44e9430a2e6196ff4ed74eb832169caf335c122899deb80b805570c30cb534cd47c98f9e2b5ec2c125eddff184d68a2d8375bedb2c586db12130b8c6000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014210b92326dd0c8842f2a4f79e2b806a75d62d98de66215bfbc4938d6aaed34000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d287c83a2e429d0940000000000000000000000000000000000000000000000042dff630f5c5325b700000000000000000000000000000000000000000000000cf2838e7f9b887b4a00000000000000000000000000000000000000000000000000005c5644fa4c8600000000000000000000000000000000000000000000000a9a62618ac5b7ea66000000000000000000000000000000000000000000000001eb973bc56be097db000000000000000000000000000000000000000000000002698bd6fcd08c82b0000000000000000000000000000000000000000000000000000079b39932309a00000000000000000000000000000000000000000000000ecc24daf882c84b4c000000000000000000000000000000000000000000000008e3cb57ab2f5fb565000000000000000000000000000000000000000000000005a9b4b319e5ff99cd00000000000000000000000000000000000000000000000000016fac74ebdab800000000000000000000000000000000000000000000000dc29b05e5f81abf7600000000000000000000000000000000000000000000000e10bdb052bcc6f47000000000000000000000000000000000000000000000000096b01b166d3ebf540000000000000000000000000000000000000000000000000000027f3e7466e7000000000000000000000000000000c715d73b672d8154c7f2d66bb3acd285bf00000000000000000000000000000000001187a5eb31a289d09cda667f4b15b90000000000000000000000000000000431839d401332b45305569e7ec18d23c500000000000000000000000000000000001c7f6ce65c950449e8ee971849404f00000000000000000000000000000037e6de1b9d468c43a2743c1b35b0786f8d00000000000000000000000000000000002bcc59db00ba4cef317c02644ef196000000000000000000000000000000129adaa925d426817339b5d852213c3087000000000000000000000000000000000003b3c3df1c3219173974211916b4140000000000000000000000000000003a693398df272c7fd539cb9c2d35636713000000000000000000000000000000000004478ca4018d3534c64b831751ceca00000000000000000000000000000076f0f54e5787b8703505531fabc7516899000000000000000000000000000000000023832b439690c8216ee2e1c282ddb5000000000000000000000000000000f367ef12bf942e511bc004b117f221de8f000000000000000000000000000000000017c4ab714573d549169b7cc15f8788000000000000000000000000000000477bab618ca21296c3aa697d87d36a75ab00000000000000000000000000000000002d1a771acc9628202e5063eed75c25000000000000000000000000000000e5e2da926b49804d37e9eadfe03b685e6f000000000000000000000000000000000017cfb773536cd88e90d84f970b964f000000000000000000000000000000dd30545e389b4c93ba7a424b240274e8b800000000000000000000000000000000000c030be9da22451073b3b2e1b40b1700000000000000000000000000000077fc3535bc4493188dd59d73eca664f6d3000000000000000000000000000000000028e2005aa9a4e503421d668f9b5ff70000000000000000000000000000005b50a6c3835186ac89ed782652496b911900000000000000000000000000000000001f41c8083b49fc05251fd7a216ed490000000000000000000000000000007255caa06eb633a1cf73ce5183c256433a000000000000000000000000000000000019b9995c4a28caa885548ab88fd33500000000000000000000000000000018c42884878b122b2b4ea980c59006b51800000000000000000000000000000000002f11050bc92d3b07e4e0327190b1dd0000000000000000000000000000003c834fc8e1c39d6079e8b051468deda93100000000000000000000000000000000002502dc747448ef16549ea6da1fedb60000000000000000000000000000003dd7019c39749a8da3e2d55febaf79edb000000000000000000000000000000000001f140041fba58b4748d20dacb6fc040e835715f6ab60393ed109b638e99e152668be99acab5018743da6a19f06018d21e0f75cea863ff0797f3c004897ba4801cb29aecd0e2078cfa44ef250f9fe7404812a79d4a32e019643db45679498a3bc06565b70c72bf441b9eb4532ecb2bb2766baf41b64818fb5cee16f7bdb2ce9774157b98d2a7ce90bdb833677ad7ab71fdce50c14792af8f51b748e8ecc25a36c750e20bdfaa69e71e87c16213a26cc13f9d3f05652e97ad5407eaf070b9c9a0d4f3e6880980f417a41818af4421cc228a6bd5dc06d9aaf7cc071e43fb103009bf97e084344c3711caa7029a4c489600f574c7d10db3f68a23844533cb0308237f04009f72ff8a15b9c07f8e742f76216063195cbdf5c415829b805b876e21c1cdb5ab974812b473a4dff5f8c7bf1eb11ee2e81bf5df8174e66bd0ae0e8eea9212882e3dc8b1bcf7c796c8d23bfd0f81525be06bd78b5cdb0a6eeb604b13f2517f27bd2d1a7404680f5e771cf9af8e41aee6211e9d23202700003872726969cd15115c566ab08b0fee05208ad550edb243243c05fc0812283d832f778d7d210bb4db7867079aa0efa2a4de0ac2b26ec0f6cccce084068dca69c5fcbe2f7b968f351981a725b7fc238f9b0b64c9203aa0679dd3a66e08d807a157e8c2dc9743590c0cb56e0df3dfb156263d992477c210b2534769bd7f974676cf06c683fe8a8037fce8f5631c915d4b5228ec5d728b21fbb66b37330f16b58ddad068e2a53414ba11f113aa3ce245fc5a3f68faf12b00f6cebfdecfe094dc4af1b2c2962addc95a502b55b52ba02f79447d03097c9ff1a6f61d297c522084a681ae8513d817b48f36d490877e700fc81eec545362cc62bc973f0685297754138cccc1c43fa8ff5cc7d358b45b0a1e656deec6a55415d1918b6d78d7965c59f0219c4a09706af3e22044e8ad5655271f854d3537373bf0913d3739252487b3d144050cffb49956d7b5b94924d4d4f8a5ff6e9ee940c6310bf8b224ec8c19fd048fea5864ad5aef8eccfd39128687611a303de6ec1744022341693723924980e5c7eeae8baa7c1068956a6eeccdc837ed36308d0758c9116b1b1c87f2b67dcde7da2fe9f63b935e9d96e77c0912dda15383e735c759c811ed7e43f32bee63ff0dc8254e0af4d0f9bbbf379f1b760a4d8dd3c37e08d48e30bd6675640bca75b8c1a3e5864bdf1292336f83187e69add9b65a5ccc8eefba8246bda343416fd0653759b4e6c5439320f26c5e4cda7c975a3b11d85099e5f642269760ca610738dd87d87399b076a9b6b6155a321c183493814493885b26dab270bd672cd7cca81d94cff4d742cd958abea7e1db38c9552f68101c7bd9cf56821a8c18f1e199bafa9658e94a401cd7fe7880ce787d6e03ed8695fa194073d92195f185f0f2217d9de8a661b2d251651d9bad8a63a833f9dd5afef8b6111c96f28aa0d0c842126655a48f20b74ec8057076e12680aa84fc41bc1f47d94da03eb201a0de141045e2724092bb0ecb3cd2a5cc5210d2ea752056f5e4571327fbbfd21ffd375225498f01f56506349c502992fd43733790f74197f2e13467983de6902828a05b4c481473c2970b08474f320707cb524cb727685a02f43e034ae16e31165ac117ac0c14cbe22829c546065e2936de6906159007735b3a74e66d4a4aa1519c4da911d739d86372ad03f9ba7a56cb1570baabf0e1606d254173e4c8ccd0f6530b48aa65747103ae44490e74ead8627d267a9ca7670bf0bcd00653bb0942411855718178b7a9013b83347c1ac991dd1600c85076cbe64e8f5c968e33405209b2b50e497f3f76bcb84145a30c0e5671009dcf9e934b385344dd372a1603d27e98ab2fa04b8fa959f08cf4ba8d66ffa8647f20fd199f1079c5bbe0dee4ee917c0e6dc2deffcf464dc4ec6cbb9bd619965730981949c5acb83069cf69e998c0443ec80dc0149a6212a7b15fc04ae21f46614dfd92cee00327f489b07f883f9176d57d603b63ec5b7ee56c7ffca540b69a4db20a782d7a812fe86e480b4664c1cfea11495dbfe3bea19d7882c9fb802191a4be26d0cbfe4d53e5ae4fa14d8891f3a7bd985c6e248fed69937983142aeb9e9c900c9e1442b569405c549c24a92013a8cab3653a53ac11ee501b06de8d7e34d1a936b80f3ba5aa59c770bdf5184083f80e9bd1c4703cea35ab4a22851f25548f6236beb5eb179c3ba7d1213167602165a3788df896869ad1f395dd2e43ad7845c904f04040436b5f93e785aeb3e0598dce07ca7b8119f09d08d899863d4c795564503a65092e973fc6b6329ffca2a320d843dae5f0d9b14f22ae930f2f20876061dcf47ded93124c2dd5f4cd2150a0fa19474fabb9635aa3b2c2e0e047b55173343056692fd2642502a30bc01e42a59b34e8906c5c9ff0a69777fb50373303b0c481c11fde33434bfa51c76c5b20e90f1b2357dbf29633965224aa4e58ad87d2120fbcb6145659377df9a330aa404f2858133ca7c08b9e06eb8d4f9790dd46caa2f32c2129e059d96d32d1bc5c12a63aec96f2cd76ef30d8fd78584295f280a6907c4652f88570c4f0e6a3731541d20aaf4de6d8b255457b0e88520bb9e373ac10eeecfe7efa42e74b6a4c5aa402ed9246ae43dbafd8544d56f4ad83657a06304397e8b55233ec1fcc0fd604c6f183f29283e90d86500f4a35bc23890d52795c8035c95ebbd30ca6481f21dd6c80a17c8893fd16fe1bca27f83877e42cc7e3e579a2c5935e5905af638d43d24fb2a30f3ed391fb9f5101ea514ff58d9e901c7c703d5d5beea01d109ccf0837844211d0c4e91d68a13395b8959b367a130dc197c9b6a0b9e0043b6ebd9cfa468491a50b15989746483991e27ecebdf5a051f5fb0a8b37792c89ff4a958aa85c09918f696cd2d8cb73de87560055f7e87535e7efdb348a37da26ecfa1a398094ad20da8ba75157c4db506030a73fe30980811c4a4959bdf1798af992e87b47ada532613449ec92b077e4f8be8a5712645883a5f29ac8281b89788eaeca4fbacf88c0ce6689c834b850e50aafe02f2e92998cb9560904e5bbf1a7be94ef8e49a2afb136fc234d04670db5abe2eeca56e8d4e01e36d313bb37feb019a65f07df40a061ecea8ded7348dc88d337ea6266c3ea8e8df6d8849295bdc525758eef4334dd016c6c0b29e822757f2a946429492f36fe255f3d748b08a58221db869972066ff111e22176449df0a126a02a57359041c9e12950a3b1319000f8602480290c17d054269f7cea31835569a9c71afc84c50fc2cf8d7c21ba474284632971b27c4632ae5c4993ebb43823e831809880d29c1718a0dac27e2bea45b6882902a4fb7aa0e15a72d699f63176e8458525643d50562adf048fc14011b9a175418fa10f87e2ca5b18301eaeef6d650f170e29d6c500a2d19ee7cc07c6550586d2cd586e2da1dd662288f23e0b0b320d6171048e9afd49c82ba7c64a3d70bf230d6cd3b81c40f2d6e3beb8376fabadc28451103d416ce41f61d2e48b8d84565ddddd314c74c25209d69b13d4555708abdb13cd69ae4218df134484a0374c2a2a7521819806429b48ad45191aee67eec9cfa77b92d65109a2a5c21f35ddf538f049a06813b2f0e8866fb912b26d7ef2591470115a0b376a8d7b93615c10800fd6d03763f628d21f5e2df3c112bef7c2c47a1e2101540080cf6e0fb83ca34a67008ecafd644db2019f4754d8cfe731b65c5f73e248ea9430479f80a0346524c6dff10de7bff340dda66989fbd9c2e3c4c267bf40d12481ea728a2d7b176ee42209db3f6bfe0cb1d0d2085f47e68848c81c1f293bc489a666581224a2460f4e9858f8afe10c96a2ed5d01d9ec5505ccbe8b00e5ffe9bf99f72bb6f5c61c5dd5efe3fd6e11d632312a056317ff59cdb2d5447ccf3079b0e7ae2314d0f2346de3bf5584a078e28161ea426bb7dbfd8dcbe5ae182831cd021c565b58d29fcfa1455b8f4a5b370908028b341c3779836df765d001680e897ed75011ff8b12d16acdcf83d86de1adcea0d7ec37f24721bbbee7573a0dcbbb506f75f0be0bfda1aee346a49765132978b196472b509d868d7a24679c635edcc90c18cdcb639c7a93a18b5f178ca95dd9822b3c29c5066f3f5949c70f07e51d4104ac4e4cef5ef77b6a2cf32eb06f135002e486c2ce3ee6b396a04b71c66707b3d0c8322d00636729769e0247b3bae4266231ec9b6d5347dfcbfd6ef8372223b8105195450adc2b4de85efae65d61f0aa61059498be7c67da604870bd72937b6a82f9902b7495df0a3ddcf83deae6d3edc10a0077cb0beb542521416428867cabdc7766c097a61f0a6160237d406c3ae870706f647d8baf74a8afa86d826d7e3d555b597ef5a436e7f27c520670e4478322e062aaf273062d09e923a2ab966153c8587490f43905cb6205c3be7e1900aa524320853569e81bc09da68f57c13d40506915f986befd273951380af4d2144ee1889307af8d694d6d28867ff7ab9c72985709136ba81ee49f5a82c34485bae291adbb20b92418a956009067cf5f3fb7b8c7a1334f4aaf80e9d659a44d91bcf1b2d4ff891410afb260b97141f1d0c7b8355fee93b2e4003dad80294383575db65287bab6a8f2a7c98d94e464ad3f66d564135271eac4706f542aad94fab60c2551430fb8af01a04fc3c88631c6e8d98cf2f863a08e8df4d44475b9e52d8a8d52407f800604b10fb84cf7d85a8ede2f88d5a1c89fcdce36c98ce56fd7ada0990e21658b44c5b8278dbfb7d25cc2ac2dac6fc8764fb4c215b23be20612d40b330ee1692a7833b6fcac6ea9cb29f6ce7126de70598af6656061e17d4ab49d3c0a90624ae420e929af0e84e6f1f969123f0718f2fe931af0ec59035d901ddf54712160853beb75312d28a729633dadf589d3990f4dda32000c1a8f7dca26c3efeab290b58f43c6e0b98f2561fca3ffd4b3f83fdd4ab6746e3e3491be917c6ab51ad1b13b0852710fdedebb67b3ddb1eec0943e53206dd5dd55834a0a80847cfaf836007dfa84710e56a1cbed7865218133ca960cb4584343a124196f689d8a38531db075acedc3ce23d64a71b360b1847d052ec1ad76aafc630073888eeaba7a68b0526f7c0fc371d44f289f29f750e6845388d2a3db98e649af987d9e75f8d8996ba125e23628f4df554486676ec161e317bc3ac434df3fa26af9d54d7b148e3c02000622a03d100170fab668dc9ff05f1c3504201a72f94697c9389eaafc0988d46129a92c30ddb988c5150ad2f3a34b2cda0dcd266074a77bdec2f7c6464c3803f08da4bd236b77c96200e11313d90a0eb6a8478b3c71c61755ed33ef44f97ca8113a533e2ec25aec322af506e5fddc051b5fcd96dafbefeefdcead3cf1c31d3c117ab1516181ae3caefa5b83b2193de02e19936a7c6671b4116f713f6e008d5af2870bf725c6a51d49484a02b740b344faed2032cca5a725d7760b67fdc0bb3682a40a3e6e450ba0f68e32715612c71d99e7ede2beeed56ffb00e9fa75364bfc20d87fa8412ef8fcb5a7e2d8fa5358a4fa5ddc48a3752f8138b1349196d39e24504c8f5e101a4874f662de6b1b08e74d9754b1208747f50f9e7d5666c686c3bb10a4f17d0836ab3912a78a87f5c3a4a11573b5917d9df66e645d73b4e965c1c79003bb46f7e4f984fa5c6fed60053ed9de1d8db0698bea3edef1b4365be42a1e614ea0ef415dab3dea62553e9fb2f861652420d3efbd932363dec1f494f9b73ee104da69938e7675a9c1d5141e1f1c6587c471c82ffcf30063fa92d0eab1a30a713e711dfd33e6302b8aa6e697c58ad2ecf09805e8b55ebe825b5e2dff43c3fdb0c07ff066fe92168d8f3213ced8885c02ebea43138d91bb176d16c79de09d0201ac7aa842cd5fa9e6583430ade4fbce07c354c99dbe81cee37517f96d3d24cae2e8b6056005fff9ab9f77b3c877b98f2e2cc3d7c258d5f040aaad64d9b1a2b7a0795d45f181274582eac44164099b4ff760769e73ae2e62789390bf8147d553a02020f35cf3386668a335e9c459a6d8ea7909d600b828412ca6a468a17894ba014c4cf83e5b94db03ac6839192661e929d2a2292bd2204f598d5bf6d0849c4490cbc2403a882373cd4a151a1d426506bca20a15c1879e4ae33db8cbc7a6978062e9ec06a6dfe471ccebab4df6be492386cb661f814b81947892fe0a9dc8d38742e553cc4cf1166ab0a66a5147974d94c35d8d8299e75eaf6fa6f0d5b65b5773b103f13117afb5650ba0b56c7719bfd58946dab85d9e3890cda2d44e02707d1c2053daf4dac2563007e3804668dcb50e047f9aa5f15bd1391c0c02f070e2b474c067cb247f2887364e7feac00a5275353cb7fbac4e1a710c279703d9592df646409446fc4603e0543cce0d84debe9322cd746897d378558b9a88c88d9ffbce3b91e040c579cd5d1ef62536994e4698d0658cb1605427c68445bac8f46d9cc156213efb15a0a171aea91031b3d31a2ef091926ba40b667c91808b48fb3059fd9ee062de3da771675d3ede1c1640bdfd4a1b76fcfb10fca275038d51c4d577f006c17e18023072dc9c2f966d74322d0aade0de962d845011818e4982bb9a97ff5c7076141abae84cad26080cce8b33ede3f4f59067f6dc024a103dd6022884b0fed1753191792c49504b21f5f4f5df855cfd1db0bc9abf0063532d0f95ff1ca5dd620c7606d02ca726522c7d701e7003fb619e02ffa510d4dce5f474f4d94131afa2392d190a53341b35039a2f651b24d3de4753e61165c00daf5540807a74aff5a17a9ce8d058ac3f2cc50e8ef53dec271be401026aec1b15ce10900f0a7b99b1718e8d7962b410af0f691778cbfb3242ab62eec7d745aa6f4a5b405150db51ea62d091462b7a2100d0947c87218364dfceaf70f8cf0aea0df13206470cce19c03290b87b8cf48cbcbb20a56c390ee6d73a72b65c8cf72e2160c2c8abb5498d4301e9929bc09344bb1cce361fbc6fe845e2870f4781846f2fea036463a7cc385f82dcde3305f931de79f5801b41a8d3b9b4d5a26bdabde4375aeb3afaaea0681bc0d3a7ed5712347c79ab6387dffe674aef6157ad83887975d86e3d9bc0c9a771316197ed31e1c31008d55a722c554c75d91255c664b2b791b115749cac0597c67188e7189c901c1bbce453b5091b5deeb44149b3cd8678ad73ed83e2f083b4e1d1b8d21bbe490494b623416fa6e12736aec603a246c88584d3ea19e6f1c8e9a962b54f4a0368f1c8b91f24012110cfcf939984d76f377e524015aad15626debac224b5899a20fa56b7dbbb39958face74b368a6f01f7a67af32f1ba69115df020283b9b7a1329395db79332849016da0d82d373c3e08b1c4608d3c2525b7e692503945ba579006b96dd8a39af16a7dcd28576b14f0a5d340344be843809bbfb301a6e7450ba46193e45ceec9a3b3187c699317660e4571da3c5f0589f41503fa6218987c613334d4babd4ec473d83ada7dc4c490b17ccac1490c9bc7ac4d6b68800b3b38b872a751f6dfdf420fde376af1940e360749628875a916d9c34bbba1013f36b18b82e79822486508d5f1b48043e85b4783019ad43ba5bedb30f572f252ee9515df6e5fed254f8ae1b14afb2c0bcb2dd9af2fc6dea3f2be7337763bfb903268ca75c686ec2bc4c520acf211a51c13b17b8e40797dbfc9a85aa92d69cc02405eb6cb721fd727f63488e1b1d2f4d552494eabfcdc55e7004adfe2be61a9325d88bdd94b9206667bbecfaa41b08d0b5d1dce2d6f355c25df7da325e53d66b0a845b15155ee551097cb127c65c191b5462dd7ea9b7d5ac1a016a0c77d350ad0366a28132bd9b3dc3be6f1be89929f90caac86758bfaa45011d74702edb915d0d19ebd94ac00bcbf9eeddf36e7af56c589e7fe4c95d6a3966073a73d2cff37c1563927a96d501ed638af8cbac9e3ea057b44dfc674a10ac903cb8344811c3660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4b8b2d194e22ff58a7b73fdc2c3a3a56b2dc6762d670e55373b1e6f4263e1c13a9597a062935e5f28b3cf84fdc19f8e465579adfaca48a2de89186e58895611e91d1fd14ca6bf645eda775818dcacd7ff027ac065414fca82e79142826c8af0b6d33456cecb12c27bed8ced0f526f353b6f53ef40e7085b2bec5146e591f152a626a0176105fb87579725d44a1f02804288545407d9f18e92109624eb7ae00147e4e900de1f3a4eb3c0a0171e46c99baf4dbbac97f9544d004945235ac3d8924e1dfc4a053dfc0d5adf28268ea41a7447ebcdc1e022d3ac08912449c35a63f2fee5256fec2c6434195e7398b105582465c285a5f0b643179db66ef7245941418f25bbd94a1775c5bab6b30a9c0ea98722a63e979fdd8b1b96b7a6f89908d652496117d21b6ccb928d3e4c37401bc2dfbe6044f523ecdd969499e35bf02f3742d7fe7154ff3d8f8627d3fbc827493d25aed3debec977ef01cc40853a57b1abe2563bc9d9e13307db8d292433819751d2192093c047f8fee29a194664299802400106687505736baf0577016d6e5aa72f4830c7508b27801cff262ac5a8f5d9319b3c566695b0f05ed81b0cf089ae609eb2ea894df989491f47359b19122182f0633bddb1d2eb5b4ec98ffd906d9add90afa17d7433769cb1669840373fb00d82d1171f24c91b34dfb0c9d86c932211f6d77095adaf42fcfe254a1c2f3e5b55d11695bb3bf7de32b02c6ef759547df8c3711e73064b9103bd847838dac8109cb111240074fed13fad8671251d45157648059d0f7755e0b6f265605a69b43473419c760af99fb0ef4a31c385ce70362934d1c7f4814c23341f6e85697fc58809808a49ca621a9001d23246500c6296dc4ca0c67eaed63a9b96e31628d3f73ae2820773978cb1cfe830c9612a508e141272617a67aaea7096689599133a0bacc33081cd767126ebbab80641b0df9b9144a6addc6e0adccc6be384a4dd0d4ea5f7013312f0c8c3154eacb1f465464cb0a9e48064747520f8640af60958293386dda10d051e1c93a32cac397b0db17bc0abc2b4f0a2bfa589441b794ec32e634e9c703073de9a27f586a1f78a23cf52e2f7fd319ff244ed3c250e8b05803ebd9c0931aad389f50192637d08257524bba2182aacb3a4822fcb471cf0211266fd36e2a0ea6bb2f72a9b969ced0c96684bde403e603d15f468190d2db8ea9db4d1ef1db25feb4d7db6bfc95e369c75bfb43e24c2b3f3830ed0aa2b57580f96cad45e31b111cadad342f58190c7c3c4daa3dc496c5bb48950f19d3e61786a76f4de78ac71db57fdbc14f812acf803380fba7d06ab43c987668a5cec73ccd3adf041dc9f920b277ab107d33dcefa25048c948fd10061df3e4bfe6dbf984ad49ed36fc30e425855c3815abfc80b87920e231c22891bf666e97186efaada77408122cb2c412118759aa97b8a333a6acbceb3526e70a54586421248aef3affef84769717ab130a5facaec3ed438f30dfff9445423664c4972ffc6f0d9466e497d369157853632515d12c6a7fafed5ceb18b126d2993feefee6d3bb10dcb2b30e8b25677c8cdf2eaf0b530a1ccbb1b8dd103e13a6d9ddcb61c058e06166d598c0d8fab13d34400edad8a622f23e28dae81f4f24ce4dc254e7b0cb1212a430bf31b14151200aa80999ca63e9e0412aab7c54edfc9db83aed5e80b6f560c202e0ae6457110516ba0ff593e4ed1bc9f0ee428151422a98c627abb44379b1c17bf0bedebf886d4a6309f6465de8527934543097938052bf9485bac1870d4f8530427ab40d326516ff2b7d14450d444bb3cfd0fc6803bd96d19d0e551df4d4c74ff5040f9419fa052e17a396c9398760694c34dfb056f8461d22b010267b3e9e75b64c404ecd1209b527b7dc11b3326711bf8098cc378499b488363e45a16e03b4c28198e4e32f9f682cdc8a32b58fcdd3cc6f7cfec1dc40c5bf25ebb415ce585519c4a24c25f15d6a000000000000000000000000000000b69ec720916bb33d509e8c078cd3971d24000000000000000000000000000000000003af32c4bff6f494e1c9d07d3d44370000000000000000000000000000004f24ec9cf59472c0f1756a45c60eac1484000000000000000000000000000000000013d9222abfe151905874812b77011200000000000000000000000000000081a13258076a05207291c060b43170cba3000000000000000000000000000000000002d14e8077701f061e024acb8a432e000000000000000000000000000000cca98116917cadfbc3061958892c2cd57700000000000000000000000000000000001491aa7defbb262d4bd39454b845640000000000000000000000000000001fbf47968feace896fb105c90936a3746f00000000000000000000000000000000001f20e2094abc5d3f29080e7bc9e3820000000000000000000000000000007952a28967d0c5da1be08ad9845d57116700000000000000000000000000000000002390dc0a3cbaed00f56d334a2a1ed4000000000000000000000000000000febf97aecb8ad808cca5cc10b7d1955a2800000000000000000000000000000000002a5ba117a8c9e885cf484975128ea6000000000000000000000000000000f2022c25c33188d1176bb024208908f446000000000000000000000000000000000027864c740580b3f29b52172c2010a30000000000000000000000000000008ed3464dea633012cf05f0ed70c3a6378500000000000000000000000000000000002be0bd9a7bb2deb59bcd1f411dfe3b000000000000000000000000000000df26c045a8cbb0f252e98bf0849cbbd14600000000000000000000000000000000001f686cb1274319148824149be5005c000000000000000000000000000000fa045060d1e0fd9e33c1b2bbbe37196682000000000000000000000000000000000017ad7ce37bff3ad6b174b9e9dce81b000000000000000000000000000000fae7bdd16454f1805673f01ddebf93ddcb00000000000000000000000000000000001eabc17fd90d700ea989310d08900c000000000000000000000000000000ac6e57fb6c95ebc06d2f10f114b555f8ff0000000000000000000000000000000000017910028ecf2ea03abe0325fbc5e2000000000000000000000000000000d04e388a13bed596bf1ccd77c8cc672b4200000000000000000000000000000000002e8cf8a87b0c85555c32ea2c9378a800000000000000000000000000000028e03c159f3d9e1d4fb9dac0c0e28b40330000000000000000000000000000000000302721ff7a472348d110d0ea8af47b0000000000000000000000000000004d1275b8fc38955038ae5a30bf2a51401300000000000000000000000000000000000018dc648727c2f6255ab3b65324010000000000000000000000000000008a17b8afe770359d90e414f1941dd9715600000000000000000000000000000000001e335c23b56329f96d30def7e0d5fb000000000000000000000000000000b8c4ff348d88d44f23013727cf67194f550000000000000000000000000000000000259725d9ca9915160779ec14c60c070000000000000000000000000000005cb1aedbe02c9fdeec371a2d384bff339800000000000000000000000000000000001296e18f8091a9af4fcc8c43c88a6b00000000000000000000000000000000e28a094346cdc32abff6c8edc12e815a00000000000000000000000000000000000d5fe2c676bb8a2248c0c862be879200000000000000000000000000000037ba320f4e9fcd78ec747c10fd5ea788cb00000000000000000000000000000000002e61f74a97f33522a25da625fe5a0d000000000000000000000000000000af38818c423a88054c9249f7d975e268270000000000000000000000000000000000172fa88963f9a8afcb447276bd61b700000000000000000000000000000073b5c815253f526b0e006957ee9800ceba000000000000000000000000000000000024df7e03e0e06f05eda23ce414fdab000000000000000000000000000000c35d9c91e1bfc0484c1142fa00aa0278d100000000000000000000000000000000002e0b1cd890b57535f23b0a0307f35d00000000000000000000000000000068cf808715321d135c1280ac8bfd8f26c5000000000000000000000000000000000010d7bc17130a641d0cd98adb7d563a000000000000000000000000000000b1962cadc7850f2d76101946c0634c82690000000000000000000000000000000000219c196d7f8d511e73b18741e556d90000000000000000000000000000000db21a307e79de4c54d7a47ab3af8c9e410000000000000000000000000000000000135ca2d2c5be2ebe163619ad05f58d00000000000000000000000000000076d7e4db7f1697e3aa5cf79183566b193000000000000000000000000000000000000c84d9689f9a96f870c798b0ed1d50000000000000000000000000000000d725ff8b8fefa0ca951111fa3dc9be904600000000000000000000000000000000000d8dabf2ce1f7e07ebc88110e1f11b0000000000000000000000000000005f349c7bb2cd50c4fc0a6de879052704d000000000000000000000000000000000002aa09c72729a29c1c4a2bcddb2b0d800000000000000000000000000000094b29bd11221ecefdf851596d26bd1ef890000000000000000000000000000000000013c30027679bafc916dbf73d86c9d00000000000000000000000000000061bfae304b0f0b35563654902d8f96108d00000000000000000000000000000000002cefe84f2a195dda74603da4a083b900000000000000000000000000000094d0e58c078e2906e62be92ec5c43017130000000000000000000000000000000000089cf2a6d458939348ac7746edbe68000000000000000000000000000000f450b3ab0378f7a7b897dc8c217a13b901000000000000000000000000000000000000c9d11eff73bdfade30f20b6f0442000000000000000000000000000000fecc618e1692c29c933dc25676210eab0000000000000000000000000000000000000f0e10a9823c7d21a13bd9c690474500000000000000000000000000000044b2db469dc5e9d4659d4ea81b29374058000000000000000000000000000000000013191f8ef0ccf3228376f7381dd0f90000000000000000000000000000000677f0b8483922c4773ba0e9a1e67d4aac000000000000000000000000000000000007828f033d61ad49e6e27edeeb40560000000000000000000000000000008efc84f9620f21a21d124f87530a6a472100000000000000000000000000000000002b97ae0a8daa8507cf5461229600d3000000000000000000000000000000ab428214cd4d24ce1c58aaf039c3d0183800000000000000000000000000000000000448a9144f2321fc9b56887c6390c900000000000000000000000000000011180c35a7d871096f60fa54d3812274c300000000000000000000000000000000001d71acd36298d956f06e5b8414042c000000000000000000000000000000c7f501c7bae8388652f05bf07431b45ff10000000000000000000000000000000000248b33d62a790b8d4aa631ab22f5fa00000000000000000000000000000084a901919a9f90a813a132c8a7c997668d00000000000000000000000000000000001c580b64521e3eea1df3ed83d1026e17ed0c238256265fffa4045db9c7891c470e9ae966d9dd6f17f57b0f319f6a4d11500525010e80966078c6f1560377c66b1e63c026246226717d6707363205d4171e78047ea0305e68218dc772d144ddd7bba06dd93a3b21a31c8ea4290315db0d9911ecc14e50ad48f9efa777ac089cccf9c12eb95189dc9975af0cbddfc9501bd7e69945fcc67fa507d5c2b8116d0bf53e55dc8266d38524d3519b3579d9731159ba6c9415aee9368cbbc4a071ed547e8c68138c74eee38cc37ab4eb71c8cd1a17de13e5732b312247cb6a9e0ac0b2ee17175dc834ad6f22094d8940276d5d270b417eda28681fac99c679f04524ab961ec2e322ba52748c224aa3389715221a77e34f0ffd8cf5e5dbeaf80801a70a2f51f8a9403311f779d4d0a7b544abc11502cad74703476407d838e8eda1c975fd967c49bd3948f141b3e856fb65d0640474648a654ac07b9fa69061f639bdd9431cbf5fb44d17165313232e8c44659b2776c09eee367190a4d290215d144977d9f739b2034425274071f03a2271cdc5241bb5330e8bb50ec3c494980e2af3c17b7b04e1d11a721d00c0cfe77ca7a7b62dbf40901b93a1d071d951c64b2ff75f3b5d3c1dac326a6524ff861b46e97f522b182199f26bf0387b0176eb128beaae1feba260892cb71a81c24c2708486d6d0af6a17c3677d6a60d845a7118ddb2021bf190f1efdcdca13803c64e1175af1a11cd45f886dac908e0c6f81ee361f646dd99512e7169b8957f7f270a30cb7fae0eb63efb505e5aa0a4cfd3d7ff723f3c04db7f116c6a5dc4af98fb86033327f02a1cd09132d2d37831aa2a855b6dae4fe44cf71cc4def79f45ef7fa5448236f5189a15ac188c88084d693720eccb2bb58a01b084cf9dc89470dcf9faec34ff0113a0402faac26ee3c3557d2ec36f65ae4169eeac65730ad7b373f9902dd9b3ad2ddb1cde1125ab257b99a4b17e85a5d70439a78cac10d985c2d623d682a8a8f7000000000000000000000000000000778fc803b231bbfb9522e0c517d283d9bf00000000000000000000000000000000002a99a700ed586f5a2ffc15a1b63c05000000000000000000000000000000c432d9210ba5fc7158201320bf930d0d41000000000000000000000000000000000018370a060b0ceaf4408c900f04a57f000000000000000000000000000000589db5f3c9cd2e5dd3e0206938f8a1700b000000000000000000000000000000000016be090cd2b3ce4a57e6fbf368ea4c0000000000000000000000000000008e7b6afe53baac20636cb21ad0149ed57b00000000000000000000000000000000001cfaed13a0d3db327e0fce9f461bbb0000005b", + "publicInputs": "1200a06aae1368abe36530b585bd7a4d2ba4de5037b82076412691a187d7621e000000012d5773cb9b23c4ed50f9fba054aceace67637c56c492104bd6cd85ccdb3ded60000000030fd77c2a44e9430a2e6196ff4ed74eb832169caf335c122899deb80b805570c30cb534cd47c98f9e2b5ec2c125eddff184d68a2d8375bedb2c586db12130b8c6000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014210b92326dd0c8842f2a4f79e2b806a75d62d98de66215bfbc4938d6aaed340000000000000000000000000000000000000000000000000000000000000000" +} diff --git a/yarn-project/end-to-end/src/fixtures/setup_l1_contracts.ts b/yarn-project/end-to-end/src/fixtures/setup_l1_contracts.ts index 62099e72a14..c62950d85cb 100644 --- a/yarn-project/end-to-end/src/fixtures/setup_l1_contracts.ts +++ b/yarn-project/end-to-end/src/fixtures/setup_l1_contracts.ts @@ -1,4 +1,5 @@ import { type DebugLogger, type L1ContractArtifactsForDeployment, deployL1Contracts } from '@aztec/aztec.js'; +import { type DeployL1ContractsArgs } from '@aztec/ethereum'; import { FeeJuicePortalAbi, FeeJuicePortalBytecode, @@ -6,12 +7,12 @@ import { InboxBytecode, OutboxAbi, OutboxBytecode, - PortalERC20Abi, - PortalERC20Bytecode, RegistryAbi, RegistryBytecode, RollupAbi, RollupBytecode, + TestERC20Abi, + TestERC20Bytecode, } from '@aztec/l1-artifacts'; import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types'; import { FeeJuiceAddress } from '@aztec/protocol-contracts/fee-juice'; @@ -25,6 +26,7 @@ export const setupL1Contracts = async ( l1RpcUrl: string, account: HDAccount | PrivateKeyAccount, logger: DebugLogger, + args: Pick, ) => { const l1Artifacts: L1ContractArtifactsForDeployment = { registry: { @@ -44,8 +46,8 @@ export const setupL1Contracts = async ( contractBytecode: RollupBytecode, }, feeJuice: { - contractAbi: PortalERC20Abi, - contractBytecode: PortalERC20Bytecode, + contractAbi: TestERC20Abi, + contractBytecode: TestERC20Bytecode, }, feeJuicePortal: { contractAbi: FeeJuicePortalAbi, @@ -57,6 +59,7 @@ export const setupL1Contracts = async ( l2FeeJuiceAddress: FeeJuiceAddress, vkTreeRoot: getVKTreeRoot(), salt: undefined, + ...args, }); return l1Data; diff --git a/yarn-project/end-to-end/src/fixtures/snapshot_manager.ts b/yarn-project/end-to-end/src/fixtures/snapshot_manager.ts index bb1af6a9da5..1972e17960e 100644 --- a/yarn-project/end-to-end/src/fixtures/snapshot_manager.ts +++ b/yarn-project/end-to-end/src/fixtures/snapshot_manager.ts @@ -6,6 +6,7 @@ import { type AztecAddress, type AztecNode, BatchCall, + CheatCodes, type CompleteAddress, type DebugLogger, type DeployL1Contracts, @@ -18,7 +19,7 @@ import { } from '@aztec/aztec.js'; import { deployInstance, registerContractClass } from '@aztec/aztec.js/deployment'; import { DefaultMultiCallEntrypoint } from '@aztec/aztec.js/entrypoint'; -import { createL1Clients } from '@aztec/ethereum'; +import { type DeployL1ContractsArgs, createL1Clients } from '@aztec/ethereum'; import { asyncMap } from '@aztec/foundation/async-map'; import { type Logger, createDebugLogger } from '@aztec/foundation/log'; import { makeBackoff, retry } from '@aztec/foundation/retry'; @@ -33,6 +34,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'; import { copySync, removeSync } from 'fs-extra/esm'; import getPort from 'get-port'; import { join } from 'path'; +import { type Hex } from 'viem'; import { mnemonicToAccount } from 'viem/accounts'; import { MNEMONIC } from './fixtures.js'; @@ -51,6 +53,7 @@ export type SubsystemsContext = { deployL1ContractsValues: DeployL1Contracts; proverNode: ProverNode; watcher: AnvilTestWatcher; + cheatCodes: CheatCodes; }; type SnapshotEntry = { @@ -60,8 +63,15 @@ type SnapshotEntry = { snapshotPath: string; }; -export function createSnapshotManager(testName: string, dataPath?: string, config: Partial = {}) { - return dataPath ? new SnapshotManager(testName, dataPath, config) : new MockSnapshotManager(testName, config); +export function createSnapshotManager( + testName: string, + dataPath?: string, + config: Partial = {}, + deployL1ContractsArgs: Partial = { assumeProvenThrough: Number.MAX_SAFE_INTEGER }, +) { + return dataPath + ? new SnapshotManager(testName, dataPath, config, deployL1ContractsArgs) + : new MockSnapshotManager(testName, config, deployL1ContractsArgs); } export interface ISnapshotManager { @@ -81,7 +91,11 @@ class MockSnapshotManager implements ISnapshotManager { private context?: SubsystemsContext; private logger: DebugLogger; - constructor(testName: string, private config: Partial = {}) { + constructor( + testName: string, + private config: Partial = {}, + private deployL1ContractsArgs: Partial = { assumeProvenThrough: Number.MAX_SAFE_INTEGER }, + ) { this.logger = createDebugLogger(`aztec:snapshot_manager:${testName}`); this.logger.warn(`No data path given, will not persist any snapshots.`); } @@ -103,7 +117,7 @@ class MockSnapshotManager implements ISnapshotManager { public async setup() { if (!this.context) { - this.context = await setupFromFresh(undefined, this.logger, this.config); + this.context = await setupFromFresh(undefined, this.logger, this.config, this.deployL1ContractsArgs); } return this.context; } @@ -124,7 +138,12 @@ class SnapshotManager implements ISnapshotManager { private livePath: string; private logger: DebugLogger; - constructor(testName: string, private dataPath: string, private config: Partial = {}) { + constructor( + testName: string, + private dataPath: string, + private config: Partial = {}, + private deployL1ContractsArgs: Partial = { assumeProvenThrough: Number.MAX_SAFE_INTEGER }, + ) { this.livePath = join(this.dataPath, 'live', testName); this.logger = createDebugLogger(`aztec:snapshot_manager:${testName}`); } @@ -201,7 +220,7 @@ class SnapshotManager implements ISnapshotManager { this.logger.verbose(`Restoration of ${e.name} complete.`); }); } else { - this.context = await setupFromFresh(this.livePath, this.logger, this.config); + this.context = await setupFromFresh(this.livePath, this.logger, this.config, this.deployL1ContractsArgs); } } return this.context; @@ -244,19 +263,22 @@ export async function createAndSyncProverNode( // Prover node config is for simulated proofs const proverConfig: ProverNodeConfig = { ...aztecNodeConfig, - txProviderNodeUrl: undefined, + proverCoordinationNodeUrl: undefined, dataDirectory: undefined, proverId: new Fr(42), realProofs: false, proverAgentConcurrency: 2, publisherPrivateKey: proverNodePrivateKey, - proverNodeMaxPendingJobs: 100, + proverNodeMaxPendingJobs: 10, + proverNodePollingIntervalMs: 200, + quoteProviderBasisPointFee: 100, + quoteProviderBondAmount: 1000n, }; const proverNode = await createProverNode(proverConfig, { aztecNodeTxProvider: aztecNode, archiver: archiver as Archiver, }); - proverNode.start(); + await proverNode.start(); return proverNode; } @@ -269,6 +291,9 @@ async function setupFromFresh( statePath: string | undefined, logger: Logger, config: Partial = {}, + deployL1ContractsArgs: Partial = { + assumeProvenThrough: Number.MAX_SAFE_INTEGER, + }, ): Promise { logger.verbose(`Initializing state...`); @@ -303,7 +328,12 @@ async function setupFromFresh( aztecNodeConfig.publisherPrivateKey = `0x${publisherPrivKey!.toString('hex')}`; aztecNodeConfig.validatorPrivateKey = `0x${validatorPrivKey!.toString('hex')}`; - const deployL1ContractsValues = await setupL1Contracts(aztecNodeConfig.l1RpcUrl, hdAccount, logger); + const deployL1ContractsValues = await setupL1Contracts( + aztecNodeConfig.l1RpcUrl, + hdAccount, + logger, + deployL1ContractsArgs, + ); aztecNodeConfig.l1Contracts = deployL1ContractsValues.l1ContractAddresses; aztecNodeConfig.l1PublishRetryIntervalMS = 100; @@ -342,6 +372,8 @@ async function setupFromFresh( pxeConfig.dataDirectory = statePath; const pxe = await createPXEService(aztecNode, pxeConfig); + const cheatCodes = await CheatCodes.create(aztecNodeConfig.l1RpcUrl, pxe); + logger.verbose('Deploying auth registry...'); await deployCanonicalAuthRegistry( new SignerlessWallet(pxe, new DefaultMultiCallEntrypoint(aztecNodeConfig.l1ChainId, aztecNodeConfig.version)), @@ -365,6 +397,7 @@ async function setupFromFresh( deployL1ContractsValues, proverNode, watcher, + cheatCodes, }; } @@ -420,15 +453,18 @@ async function setupFromState(statePath: string, logger: Logger): Promise + (numberOfAccounts: number, logger: DebugLogger, waitUntilProven = false) => async ({ pxe }: { pxe: PXE }) => { // Generate account keys. const accountKeys: [Fr, GrumpkinScalar][] = Array.from({ length: numberOfAccounts }).map(_ => [ @@ -492,7 +529,7 @@ export const addAccounts = export async function publicDeployAccounts( sender: Wallet, accountsToDeploy: (CompleteAddress | AztecAddress)[], - waitUntilProven = true, + waitUntilProven = false, ) { const accountAddressesToDeploy = accountsToDeploy.map(a => ('address' in a ? a.address : a)); const instances = await Promise.all(accountAddressesToDeploy.map(account => sender.getContractInstance(account))); diff --git a/yarn-project/end-to-end/src/fixtures/synching_blocks/10_36_1/blocks.json b/yarn-project/end-to-end/src/fixtures/synching_blocks/10_36_1/blocks.json index eee52bf8ba0..d53ad18395b 100644 --- a/yarn-project/end-to-end/src/fixtures/synching_blocks/10_36_1/blocks.json +++ b/yarn-project/end-to-end/src/fixtures/synching_blocks/10_36_1/blocks.json @@ -1,23 +1,22 @@ { "blocks": [ - "1200a06aae1368abe36530b585bd7a4d2ba4de5037b82076412691a187d7621e000000010000000000000000000000000000000000000000000000000000000000000002000e73c1bde1ab363089fd186e7f70614a73449c1c46c67d01de097799565b9800089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000100b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d0000008027ec6e434b56740daf1130639487fdcb64140673d107cfdd275c76fcf25608ef0000010023c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9000001000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000070dbd8d40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000caf43802af38fa06ffef34d3a3b16629594f4b14beb4969f4e35e43ea395e87c5b16884000000010000000100000000000000000000000000000000000000000000000000000000000caf4380000317fffca5bc072ec0d7e26721ef4e5f67d23b1d50e36b6e7e3d1e8b2216d67bf6188890eb3288ab5859e03bfc642af41fdc32194f209f34e88df2996dbd1ee5eb0f82ba823c27bf47b723dd674e43fa4fd37a8c4ce3af4bd7b9f785aa123ff467000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c5f0000000040000000000000004000000000009c5f40009c5f00009c4c405d15342d76e46e5be07d3cda0d753158431cdc5e39d29ce4e8fe1f5c070564a0009c4a0000000006999d1e02b08a447a463563453cb36919c9dd7150336fc7c4d2b52f814c2d321b88ded0e008e23bcabfd7119e218f9964a2cf6496c6498c3ad2b9c06000000000000000000000000000000000000000000000000000000000000000127a4b26f0fae861600e17526b39adb2f13d4d6ffe9421310b7656e5b576830da0a43a7d0ff038f2492a51b4465c73f28c0644cdde523cb652668b167eab21b7a0000000000000000000000000000000000000000000000000000000000001e3d00000000026715c38900000a981f8b08000000000002ff95584d883447197ebb00aabbb7777776f6677a7a667aa7a7a7a7bb676677fb4bbe68e855c14348cc8f00f962cc17bc885e043d68503c091e3c7911c5430848902012056f060904f496006340104390e0c193474f2aa260f079aaba6b57b3fb810bd5fb56d5fb576fbd00f5d45b7357b4a71e111dbd287257f4d1081f89cf047f31da48247a3c93307a00227ae205f4a3276c1385e671e299e81933f18c6d5713f7a27b66e29e6d571300cf47cf9b89e76dbb9ab81fdd3713f76db313977040f425adfaf87e4a027c9f009410dfa76407dfa725baa4e95d7c3f2d7bf83e2bfb97b439c0f73939c0f7330032bca4b1437c3f2b47f8be20c797b472f2108c144fd2ec8b5c3496ef8d5bb300782d6369958e39a4fb218d21df0cf9fd900f214ffc7efc1aeb5d094553452200de6e3c97308e5fe8231bf70bdc9370478f7df1e271023a327432a6cc600c9900f1d8c88cbbd6cbece9047ce364027adfc84cc61c899331240f13482689914c00bad64b1ee89816624a0e0d3d893b5d903c7980e451ef1be863dd59b3964ddc00f0f1278f62d1f6ef40fa3f0646a6089337434c1e4dd11d9ce2a3e777c47b49009246be00abbb343dc8f0395ce07392536981702e19cec2eccd0add82dd95e90096e8aed82d4db742b764b762d7afd1add8ade5ae87599095c260bd6e55ba46006fad40e96b54abaa2524830749ea1b257b2aa68ea255e31512a26ce47bad4c00ab46be3f8086d3fa8ec8fb5237f2c3d62b177be22dfc0c432f4bf6942702ce00bc9157c099cf17187e43168dfca8f58a155dcafb40e4c625922bc510f90b90004b953dab11e91c2d6bbde5ca4cc387d5923d75d5534b78372b8d0c23594c5700adb72ac15580ab50982d96ad94a3c6fb3a26167467412fdf94ac9177e1ce02002da3e18a731517f56ba9b902a8cb548d6f9d57ad5725504a466d19d7607c5b00d68ed1c4cc3042244c6aa333216b42d6772ceba5c822d2802809221fa7d55f00e1e00662ac742a925665687501ff30908f17c3dee93ff4a15d30b43070b046001c292c6b13c74e4f2beb4dab7636e86d14a8c85189a3f61cb5efa8cc51078e001a3a6ae1a823471d3b2adff01c6c98199b2d7cfd976cbbd8d46a8befb6dab400de668d54a9912ab50f1ecfb33cd8188ce97aceb154b68d1720d6358621b2da0032e6e7d0bb3dbfc0fc402eba40d63690fef54002ebf599bac0f7627bdeaaf50039dd1baf11c1cd9ada279d457586dc59af1aef93c8d3baf1e603dadf80e37100d9345e6eed175c53708618730550ce186fcd8acfb8bdd4be5517265779cb5c00b4ded60564b36dbd7aa3fa5ecd39d7dbdee2bf9536fe4f8dffe085a75b730600e12d8feeb8c672aa1a59e53d66b30a4799a79201e33a187fef29c6f12b5c0300dad678cb3913c3e76c0cadf7b4559fb7def91916ed825d9f3760fc9c348eb100c1b7318c1009cf2e8cce33b29e91f58b9615ebdadc90e0c64aa7e20ceb41bb0028e01fd363bc19f64e7fb5db1ed9704f5ad13cb7c4c2ac35e0ad2533d0b8400037637761ba4493458726e8e2c0133a3410863e5e07dd0e6b0016ad1089c2c300b255a5c3177d8d02b62457f0af1dfc1b482d7a6cb63a499656e77f2bf930b500442b336ce702909a37deab48c065e3fd185a5581682e8bd51dd1af0b76fb2700ad9787382ca1bf446c5e976587ab08cacfc1399a87e0fcb6848df78bd6cb78006b05616bca1c0dbfe917c944858c02973d5285c9552eaa68bd5162a60136c900883d75d55323b838cb8d0c039d4d017f098ec52853443bcc66235c9c793082006b6fcb88ae3177467dec47c60192b9c2e00878187a546ed451419099c9ccac00fc391f3e4d6d91c6ad9502da473ac0f2033f878d7725a70d161f01eed3203000977ad0b5abe223c7151ee4b6f80878c1a303d478808c2d3e82a430c507e92200a1641e242c3e7248e6b991ccbb76557c58bec2141fa48b80f61388a2f8788000e491b1931b9bc79dcdce73eca98f22c2fb1b8b08d60f03561287218b88e0c300e9fd7fd514fef59ac2e52d06ab1a4584bd3d40e96b14b295f772404569a7080092245385c1b202972d296ea162b41420360688f9ab86c7649a36aa440aa7a700f11d51df94b8c1a5e5ad52ec76ea2302ea5c922ed9b34635e0cce629869f1600083eccdb9d2e657d2032976b8549277f6e322b35c9ce644a719226189ba84900ab26397beaaaa77278375b1919734ea72c3366e0ba2a350031b345a3438069004a77527a790ffba4be065ee85ff2fcf921e7c20073f725e8a03351c836780b00d9308652326acbe883f1f3e23b461c02ed1b468884716074c6648dc9fa25cb000a8c4d6fc05863a55311e3a0a1054bf8c7f3364e87bdd3dfe8439b32b42c2200cabec8b75b4b32eeb776c76d63e4a8cc517b8eda7754e2a803470d1d153aea00c851c78e0a2a16112cb0525662ea655789c5b6124b5960a1bc5ba16af7629f003caf5a1e6c0cc6743ce7d8af5096aad7106bc4bb80485133e6ee72543fb3f7000c0219df7009dbf2d7142d352eeb72636edd92b76e49edbfec2caa3572a72c001af51ef21429fce680f62b70fc51aa46bd65ed2fb9a6e08642ad526b6eefc6009648265761595836b880e05c7a71a5fa5ecc39d7ab6ff1df4a1bffa7c67ff000c2d3da9c4178cba33b8eb19c342ee1ecfb52da8488792a1930aec3c4ff4f8c00e3075c030b22e32de74c0cfffcbf055edc1578b90b76bc3903e35fe4cc319a00facc3042245c6f8dce3559d764fdbb65c5baaa1b12dc58e954e061c2e7cb160009fe01d3635c0d3ba7b5eab6472aee098a089e5b62618a3d203200c7d01dce007a449b5d43b4190f84818ad904479e057c32e1f335beedc90b8b33c159d3dd006ddae863e0dd9ce89d12bd7789de03a2f7a18133bde4793e9d41ee7199351a00119fa757477a787dc533a89c29e3ce29eece05da6c6eb53c4447e706194fa100eaa372dae88f3c0c33b8327073cef9223db05035c5fcc765da6dc24ce19ad500d30c9895ce3fc12108c8a94189f9b0d7f7989cda20ce690b2e9ac0240819bd00c135cc905948c520b166c7e206a8c851a9a3f61cb5efa85d471d386ae8a88100a38e1c75eca843bec207161a4fe0ef97e5a45bdf449de07b0208c4839e4e9f0090e904178d7e49e22ebd663704dbaec658c84e806327262409439270b7be2500337bec27d882841bd97a0be2f828447da6bf23cb46037308df198b447fc5b900158e98feae3d62a6f23477ee88cf5494600919b5650470e81f48e518cd3136008c10098bd2e86489382ac8fa8a65c562c21bce4a77b31b15857d269770f935005674e370d83bfdd3bea80c59541a5faed50fd862f3a8c60d287854ab91d50a002a2c59b5f10a5f9674e60de777618d2e91d6257ccf51e178854f9eb72c0f820086315d1028f5ef0094fa37880362b180c88260a90908d51aaf31fdb66cba45001637009d2d53cc9ba90218ac08dce5b8c0ea4a5345ff565676c76a1c9c023000f0579c9da2d1bf1fd03e37e69f5236fa3d6b3f2b6ff9b1a45416a60cac6e0c0050c3b26c7815f5012979cb94aaef159c73bdea16ffadb4f17f6afc072f3cad00ccf300de320dcc72eca3e01fdd72a4e0838101e33a4cfcff8d38fa73ae01ad00ea41b5600c7d6d6368bda7ad0220bdc6c592b860177c1cfbfb0ed1bbdbc330004224ac37550ffe05c1df1fb90bb4bcf5e70cab82970f5a9d35a62a2bcc3d6a009cc693c4268494dc934b2fd251b88f5f6f4351d10ee6d7d14ee3e3a58cf1a000f13f76c9df35038f4fb10855ce2386d83d80c06ee4477b13f1a2bd688fbfbd00e29ff9ed75cfb61ea7fd36da837844817d98db8f227603d3555114edb3bb0b00ebbb8d7ff188a7a191861fbe94e93bd377fe03f4b5032b5e1600007339c60b00000013911f8b08000000000002ffa55a7bac2d57595fb36666ef3db35fe79c00fd989933fb31fbfd9a73cfbdb4ccb5250d6a5bfa4014a231374ac1f88a901400d1941850c1d686aa69a8a689a4c4a046099646214609463426ea1fa241d1a20021f887d510d4f20718aa688cf1f7fbd6ccecede59cdb3f3cc99ab3d69a6f7d00efef5b6b7db3af2adbd2d7945d7b50a9abcaaefa78a8fa46e1af8ee62b55bb007ba82ab57b6af7bc01e3da3da6298d66f1c5fdb5fbe5c5fda69917d7b14ad900d709eae079af72f17c8daae0799faa5e27640dcf07947705e027af218207490013d4ad7a2674c186cab4ed7fdd9473f3d45565a97aa6eb32df28e61b98afa80046a61b7e42d4beaf2aaedfec2babe90f54c5f7dfa08c80d2846d20b29a5440000b0fbb4d744740621da3e79c9c29f54ae5a7ea1a10790d1fc3db957f9fa55400eabc452878133e3b40dee9726d0fac74c84a8f827438d5c7548f537d0ad22b00a69c62aaee702ac0549f5301a61a7d4e85980a381562aa15702ac254c8a988006a53a778e801c6a783186f22be89d5550b80e8463acef4694c9898c3f834d30051388098a7e0f734422fb233d5827c6f6e28dbb723829e9ea9ea1b5594aaef00cbac8e9f593d3bb38238b3c2c05776dc0acf94fdbc0a53f55678101431c0ca00413cf4e119f501f4f3c36a40fd90d901581a92a50187c7230cc9ab1a0987ec000ef4086f8ec6e88e47e34c8d12604bc613186c32018f9389186c9237311868003ca626d011f46f273a49d5bb323d1892e02105100442f4301c0b4176477a4c0082b2749c646a3c01c1493205c1e91404a7532138cd5b41f017d51404c1823d00d19354bd2fd3a301091e50c07bca6201a9a23c2aa1d100d082ae7e1554c2380021e9099c2b9dde0e37357fc7aaf89b9d29fd8c823c1fceac3115d14ac6a0fd009c1aa716ec304c320b3ab20642262e448d55e12ab17195c29942e34c1cce0b00479a73e82c309c73b810bdb03bd7985c2c333d5d62b4d4e8350e7a999e535e00f7562b1b17ae2c7a33e2803b1e8570f820557f07c5cc53f53988399f2c20f9004c2d52f5f770b5395c695ec794fa07b5a02b017294aa7f04e4a83d3f53d67f00292cfc4266c554841b168a084baf1ae99062cec5c116afb59528432da83b79003da2fd38d2fb914604e966206ba8c9b83582be0340c5808a194af1001133a600228e62f1fa11b8b1d4884c5e572aa9d90809755c7390e0aa3f8d5ce78a278c00b550257ec4911e0f7373160e34cc5d3477e071e9c01240a332806eb2b973680073482e4c6b4c8601cc4841028d5ee3a007111827eeb458393d5889c9298cd300a0df84fa92de0c2d1ec38c505a7d905ab7c338716a6550473c416ab01e476a00b0ee80d6429831ac0798ba4b05b91901f96a42b609f9dd84fc66b8ba98312e001461d2d750ec148b98e80e75206604a70a2619eecd38e448ef477a08ee9a03005923ca1733c2d8c3b1a629c63440a606516aff2d5e84642724976f56416abd001bec8468ccb5ce44849ae2dd0fa829251045222dd8d378925913c4e39080b6000144f85a0fab590938c3732680585249a68293611d27047d870185df84c66f00dc43bf112a398a047e8336451a78372d7514b60aa61f2b541b52b574cc8004000232fd3325d349ce34341740bac114a6998a699ecad75b23ccd9d336e77e83008a789ab2711a6d461917c03b5b2cf1fe036a99331e18c69d43c64d4a90b09f002d321d2e4859389e8614fb43466c2403d82a1ca5d69fc32f40f023c01fb4c900f767d434b57ed3d01f4fe91b4c5fb33c7dc13766a29bb964322a482fc5374000592d336b6654877c3d9d41dea92e4601df95a3d925fc9bd5c27f4bf8072c38009d89cf83db9b0cf0978706c8a830ca31a5a49f55b3d4fa2a65409b09b77c27003afcbcd1a1e19eb40224a7c51c4297ca0e162b00fe935a95802b3c570288250095f95270ce093a27e88b0614724d2f702893880d8a39e4415bc2a1be4a573d009ab60aa6bf969b474d69136cfac43f9a231b5bff8304ad116e31d88c17a4bd00e2bbd51ac9db51eb9ccd855ee3b91ead326b056b0c08681bc00d001b6a530200e2c0696f04104b2acbb5e05c13744dd0ae01853cf34be53128d6995ea02d6300f0c7c470346fe54ceb49b185ccb985304096dc719650189451e8766414330700c34be8375821405675184a5f318682223067afda9cbb4f2d53fd0ac8b6e43400da9a326e8177bddde1fd1d6a9733bebcc0c18465bdc373b7de82f12d291fad00c1f16a4decf7e414f5067bd23a4cf55b112020f800f02fdbe4fbed6a95ea6f0031f4e31503648300a1da819c01c2ee4a6fa84e625feb9d04080ff8bbcc5a8b00ac7a95e9d51af2ae74315af25d395a5fc2bf592dfcb7847fc09253d9dbc12d00e3ff680171e6f474fdb65c1cb5e06e4f85510e719a47d43ad54f5306b4b57000cb77a2c377191d1aee496bb9cdaced064297ca5e6e53003ea6d21230c5331500402ca96c76827343d00d417fce8042aed5050e255472141bc883b683433d4d003f3b5ab50aa6df6f3c3d532bda04fc601718cfe578477ffba0f137d900e84d00f4b650bcedd78cb7f1844ddf0d96a2c8505c6eef9724f19c2171c989c2e85f00820cfeaa79f282fe716064a217c5270b9c92f427d4dcf8d1620ccf5d4c12cc007d12a74bfb1c590654478be2b43a37a7550ed7181211bc89c343bfc2709b890013d96a2be78f1d86f42fa88e5ec7ee5663729722678a22357a8d835ea6b7f300e2fcb1dd9f3fcc4a9e3f76803286b8a43743db62333c42bcd737a9fe2282630096ea7fe1eec4adda7e13760ffda5ccdacc10c3b33aa6f497cd460848c4cdbf003518c64875f62b919ff54b9995ac8b3d66b5df6356e250b2c7cc44e1d3728f00999a8485d7e0612de94bef477a05ee9a1b5923266921c8e04cd62ad1725dc90074b2c23172b1927b08b9496074fbb834faf202a32ff69995f837680b9ee48e0069a1c53ef20ddc46fc898ebb59666ac3885b2dd7b8e2acd7b8e2acd772c55900e72dbfe2d81b05011a796e486d5cb016037a09226901327a33e27506eec3a300e051023f0b9309d6dda62646bb09ef399075467233dae20ed8c2be010d6323004ea64580af18e0f6abcb009f9a005f316e715a9a4f8b005f31c0edfbca009f009ae85c15013ed909ce1d417704fdb632c0671704b8b9bd1914f022fada04e1007043f2efac5530fdc6c25b66f4166a92bccc84e9ef2d99ce33e08cbcc02136003b78dbaebe05cc5bd4d6ec186bccd9bb36e71e53dbd47e18b26d398d9652c6002bc09b5e39c7fb47d479cef8f6828c8b9b907da6a9f7f3f40a18bf42ca47290038dea5c4fe9e9ca23ec3a69eae53fb437075107c1cf8b76df2fd1c62d27ec200d04f7674f733f80d5501e4f49b54e2eb8ceabc22e17a2eee0eca0ae9222dc3000fa10dddeb62b4e5bb72945ec2bf592dfcb7847fc09253096370cbc38d1c410066538af36c2e8e9a32b0a930ca2106fea84a53fbd394012d156ef94e74f8bb004687867bd2da5ec9ac2b6710ba54f6f6ca5500fe81ba5a025ec5f3aa00624900e5ec5c709e11f48ca07f6a4021d7ee0287122a398a33c883760e87fa34b3d900d1ae5530fdd7c62b911769934c35e4eaa1fd0eea433de40a07451929f738450005c8916c6b1735225b158525db149638f48ba292cf92d7995f5c083bfb0b2100bb9de242e85f7221ec90b4eb172bfd839598f45fe642b82f6338651903487100cbd01dc87564234bf752c7952a8853e566c83b46e5f3b86338ac2d95b744a70055de12a3d4390264c45b62e5b7714b743a99e5b036e51ed635c06728452eb90058f585a1aeb82d04545d1c354c0d2c62d18b23bd1fe910dc357bb2863a765a005166453d4039807234de3ae16d46b8ffb8f32e68943e1415168984ba2c04420015755fa92a57bfff5b7ff4856bbfb2f9c4ebeffdf8a38fde78687ddb3fdfff00cedf7bfb2fdcfdc24b4f7f9978fa99ee77b1a4abbbec61c9fc899f78fd7b9f007aef8f4cbff1c56f7fe8e73ff3678fd87ff5c84f3df437ef78f2ce2f7d6c7300e36bcf2ba9c7513ccdea660097816064a0230c186cf0a38075464dab753b5000518029d7d810bd5e47f80c04d8cb2c8fb83c2d4be8635eee6340e8c99bf8ee005eaec448895b48b194576f868d54538065af5cefff8e58508d60563beac3ac003754dfa4438fce4b8adaf66e351216045dab9f597d3bb7c273fffee0f30aac00576c2f02da1f52515e85a5619c420ce7400c4c3ac0785ce2766d99b74557af00a3c3b672c7a54c1de0761a2e1877eb1e28bc5379451dd3037a97501e87ade30082daf10135968b9ba2f36358e9d88603db9d2ef6dc6e177b6eb72b7b6e376f00f99eeb3c0937d58d9cc1d4793cd39e2bf558e729a23b6651f618cc547e497900a983a3b2eb1599c12d3343b3536406e315061dcddb1007e97433d5e90155af00db073ffd3ef8e9f7859f7ede0a7e3e4c276d302c7a1a61fbcbb047cecf478800ce96227107fc3ca63aa9f35be4c7f812e56e23e4baae8c85ee09c2a94736dc00ae4c3242fb5dd6207ae0a0770107644cb4d59377bdbce5657abbd2173c927a00fa8c574646b5bf7798fe69669d32526b66f29485f13e4ad7314add95e854b0009ee6ada0782afa88e45d94b782a2772a78a4527dca4a130b52be99e44d7378002ac5254cd6cda4d4a54e51a41d0f8175e809562f6f05454faaef437937cc9b00bc83756a1e012e5807efac34468eb2bc11cef3956ac3437fec8db0a6778b35006ea3c7353daee9487fdce3ca91d7c3ca688495a391ac1ce5ad58193422c245008cb950fa5e44fabd518495c35bac8c1b43ae1cf6d01f48bf37e4ca683484eb001ca961ea520db5a888ad5e195bd6b088ad61590f1deeeba187057d55b97d2c0055bae2ca3211ef371f0530394195675cd6821a073d9cc0f911c61d172bc707002bc7fc26b0aff55fd4db6f7acd72d36349092089874d0fe5a2fa28e5110be70065f71c4133b671fb727f12b72ff7152ce223c98ceb9cc2a9b9dcf4dc6f904d00af8ee9ef50f5d47d15f2a2546b7bc5979d5ef96567a82981d396ac5b974d8f0091524750885f6a1642192243bd1f3153ebe648d688a3b6987a9b80da1750b1009b35fdb472025faf939d3abe40b837f005c2fd31c002bf372e4aa311ef5bee009bca2ae3d85419a3bc34da1b17a5d188a551f707cbd2e8d8d435a37d69745c009446239646ddb795a5d1faad4ba3118e906396463df047b98eeaad82e91f570063a3da3a55cb3c792b4fa994fe512d7b51d973cb5ea7ec75cb5e50f6c2b2d7002f7b71d91b94bd535e5c1a2c158e5975733f58ea263182b166087fb246095c0025a913a6289ce2c301ee1509afb0ee1fe20aeb3e0b5db3143d3dac1e4aa9d600fd5859aa4d5ebe543b31a55adeeca6bcd9b9bf9fdfecf41cc7d40451fb02fc00142efc47fc46c752adfb455cf0dc3f36f4bdff6fa936d9176793af2bd5262f005faa9db0540b4e671283e096ae26e28c459c2f941755462515463944ff2f42008f159f32a095a5da4474f8959b4bb5495eaaed95ca4e58aa75fff3e6526d720053a996159e84b5a08a75cb52adb18b41517c39f3c09f1478784f12a62badb200544b9be05ec1b865963c2952ea891c57da189e70d81693b07ba2f99dbb89f4006537dbcd4cb519ebf5a687c4ee5db69980e24241b58d3a56d5753dad20ab9c00702baf9d48feaab0d216d96d00be56b5d34acaed1f22768c88ad43117326f0006cdb4d5c4e9a44052cddb4721d58bac73c64bc0a878cca9de73c10e0805171003ac2748bef5b4dbcff26d5cc157ea245946e2bb35a9d3b557e6a25faee511b000aebb689ef01d5310a6b930cb8137cfced4033ffed00d4238834261b756485005c566485b27752f6dcb2d7297bddb21794bdb0ecf5cb5e5cf60665efb4ceac0060d22e0f7d0f9b13a83024e7ac08f9b7de20d31e813c6c159547543d77a5f600057a36d2080526ff862749b2c124d9a0a1dea3da26c49b3db9985650a8727900406e7679d6ebf600f384eae56c785a8e863e0f7ae67c294038e657de678ef90060c3366c340fd930274a390062b1eef040e81f75c086dfb1b1fa199479848d001e76c40e8f9b60e3983fd8f068780f95a4fc94eec98197643b5d2cfc75d5cd00c91e5f20bd3909cb6194b76daf23643d92f58eb1faa3ead890e529d7e3a93b00b36c7e118cf86da7f2715c522b9fc5d513d71d472e99241c757cbcfba4f9150088dca419987e843b2a4eda565fbe081a401af14f4a2306b91109882595ae2f0038a9c3a84bd0bf30a0977c11142a390ae83040f31df02716e50729c3f4e7ca000f52bc460bd3c5c77f733d30b7ff0ef50c9518ace875cb5ec45a82edf3aeee00c7c0f8af2a2e25902fc5213225f469f5026c4e419d305f3130501f7f2412b4003157f5559c565ea246308d25360fcff690df2787f8705ef9eff2c3f945dfe100f25f87f0981223d1748662bb80b60b10ccd56a1ecc7a802b4b60a7d533f98e00586dc8774498a87a9bf2d36adbd0979f0fb983e2b3f7a0fceced6b9ede9da1007c011fc9e634e07116778652213e6e1081af8b51c077e528be847fb3da1cb300847fc082d358aa22e056aaa814271471ae15b929609d840aa31cd47ff53af40058fd4eca80265fc4a9c3803aacde657468b827ad80b714d46dfba5b283214e0043d57bcd694800e5b3b80062496530129c23828e08fa3a030ab9fc0bdcd0d800c5a0c08131461b38e04fbe23faad82e9efca1d42f9b409ef617e8497a7115f007e8f7929bf4bcae436567cf6971b9b8e374e7e113b62e10197ba7d79218790001f68f0271c38e406b8f685b1cc0fc0756cb8b60cd71f10ae87785660551dc100b2c33d365865807ad530a4d63425e30f418caf0de96bc301f87dd4fca429530043fe52eaba55b36bd819f050ba064b569fa855d3eacf82845d73d3ea33d7f900cb36d762faa941906bd2f19a58e0d59c1a0a7156cdaff9fc1d1dfec9efe87c00d38a8db6fafe9a6f319162411de4eab51a87ae0c75ad56ab73e881ba97569f00bc665158123e9745640a8baab52a875590ac91056d70d640d43be4101925c700203488546878078b6c2e32e3bae1a45ef38d5c0dcad5009926e56ad69a940b00ff44aea669a55cbf536b0ae758d0028b2d83cd972150d75a1c3640a591569f0035afaab5caf975157e2afcd4ff02e3b668efb6280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001242ab1a2bd6d07d8d61ea56d85861446349e52c6b7c0612b702cb1e6db6ad0b089000001000000000085864497636cf755ae7bde03f267ce01a520981c21c3682aaf82a631156eabf84e3ea50d40e3330224f2d2e81648fff8f1f7ec1bc6d2873cca6e959d0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000114c2d321b88ded0e008e23bcabfd7119e218f9964a2cf6496c6498c3ad2b9c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "2af38fa06ffef34d3a3b16629594f4b14beb4969f4e35e43ea395e87c5b1688400000002000000000000000000000000000000000000000000000000000000000000000200b4bd6723dcbe8773b98c4300516c819d961b48bdbf6683941f35505501cfc800089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000200b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d0000010001dbba12858d7d218b4e1cc839f77a6e6285ee64744457bf04642eb7178658de0000018023c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9000001800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000070dbd8f80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000caf438012b34d8b04b61fcf58031221017668557c93080db65823f4e467fd64f9e3b47d000000020000000100000000000000000000000000000000000000000000000000000000000caf4380000316fd83165eee0a36df163ee635d12f7f238b11b5003f5874bef482cbf19503361e160b0b73158f3bb4576f4fe7c1763304049e85517c02129493c9bc1f1a86d91e3c545786f2098a0ed6694f5f49fd407d1b60a50122e995fb37b7f1aaa3e14f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c5f0000000040000000000000004000000000009c5f40009c5f00009c4c405d15342d76e46e5be07d3cda0d753158431cdc5e39d29ce4e8fe1f5c070564a0009c4a0000000006999d1e02b08a447a463563453cb36919c9dd7150336fc7c4d2b52f801f595d1e7be64f80c670849206be58b45246f44302c15435100d7eb653d645500000000000000000000000000000000000000000000000000000000000000012b2a7fc4bd74f07a2dcf4a5dcb8642b3aa7c16132e115c032a1b8d96a870683b1de9ccd83e9067a8f9f84960c8399af3bb72131b795aabb4888347390db8b8de0000000000000000000000000000000000000000000000000000000000000c7700000000064cbe507e000000fe1f8b08000000000002ff4d50d14a0331109c640093cd5e92f6b90f0a822054aa9e2f77e09360af3ef9e06ff7ab9cbd43e8c18400dd99cdec5c464888ef10bb0023449407ca11fc0aa1807ddd43ed6ce75ff67600de80480417165b5661d9b009336f41661f4db3f3f995f4fee2837ee0615d30004283f9c2c157b709a860d73006095ed648b2f5295a67d723abd257bef346dc00fd24da0c44232860474b940a6d85c6c1cb60a5be008fa8df01b883e63261d000139e2a4407d79e514f38be51536ed5563d54ccff79f24d1e92393145e24448009d0e49e83043dc7d1d11f83ba629a4fce154f6bff67116a2d9f63ccdd77e6e00912698a79971b81eae7fb4916d6790010000da4cf031000001bd1f8b0800000000000002ff3d523d4f1c410c7df3e119cfc721a50a4552a68874097b45769500160e8e86e24a7e00120542a247fc407e15cfb31c2bd96b7becf7c6f64c08ce00ef10f416981062a682fe063fa564feae7e22e95ef7478bed5781a7b8858708008b4522f53584fa06e92f0fcf1610f5706345074b9ee09cfe01be211e9c9125001f4916ca3ca8020a26179c99ea192c75f6b1d2ab9e96d469a4d861a3e9fb5d00242a03600e1aa51312ac48350ac9a0154eb493f217fa4a1942279b185b1f6c00668a67b0b7d957a284e669a536e28368f345d43f8936e4e831113ea910fe1f00e413dea55333c95c2f7493b932d8cc4c1694d11b79947de62d2e2b422e8d580047b42dae67a79c7cc87e541499d9c80f6ea1d80ec65dca69070c974c95f578005a9a9ece66689e91c305f19ae57054a9d7f4df32938dceee2c9d4c12497ebf00ae869b6b1af828e035da2e1fb956c17a7b0e83af44382db1621b546ef58cba001ac4c30ab1b656adb5c569500e948a7899394fcaf8333183ca166f8b5d591c00e9a044df0da36c5850346afd0ea755ab3d42fec623acabac4d12f0552bcbd5000a1ae99aaab9325cafaacddc42f6b2c5cbce05221af1c582f3f7f3f70f7dd500175f03030000dce235010000013f1f8b08000000000002ff3d90bb4e0331100045afedf8b17e8506290520da480196c62b101248846c9a14347c74be8a3bde00c06a67349ec73d638f304a3fc3842330c2d84087610b7e032df0ffbc850bfb00b0ff96f37e31689a92c21ce65e98175b0a13a76026695dd17fc1d21fe026e900f18f6cb93ac8d05138f71d76273e46b821a607e01a69567d25333416206b6100544649183593431ae1746e3a27a6924e4ddbd4d7ef1d85a1aea7d5e526ec4100a1550e219393b21da104a96cac446e51ff9095482bc8da91125acd642d4d2700aa98a219b9d2f31db4fe07d50b684d46cdb6cb67cabf208bfc0d9c8f5c3eec00f016f9ee4361ed036587f727d602475d2d593453eb4a86bbcb160b97c9e49b008e9e1dca672a784785139ca8f71647ef826fcaa7575cae2e824ade29a45ce900b3607f5064a821cb361336e7cdf917686dc2f811020000df27eb560000012b001f8b08000000000002ff3d50c14ec3300c7d49b6c47593f4ba03481cb8200d0028126aa571a4745c38ecb7f7553ca7d32ad975deb3df8b332238ff812067600044d82526c80bf80923f1f7fd88288b2c17c3962de019ce8855d646ac5b6cc400cc2984d95a77cc3fd8cfc6c637928375991df0d46cccb11b11bdb20a79027a0010ca185d7056f69e602e93d7c253f1aca434bc70c2d7bf1d653a46669040a5001a4411b350d3a15738edeb2bf08c7a766dd35069a466549b9195ea0956cae700bbd1be34bc190d77a37a331ae851459bbc50fe938b51fe0131f613ba74c4ac0008a92be4be508e38bd934b1c8db564d3d4a929055ec56eb1f91254997c6f4f00e324534122157e114dbdb544e6986472a22783d4d6b776db2369aeccd96c2f002836c407b4dbcc385c0fd77fa6b1e19cf5010000f73a3d03000005941f8b0800000000000002ff7556bdab244510afee9e8f9eeeed99e9d99dd9dd87a2a2890030efee9d1ef35003913beffc40e45203f15f3033500c3410414104ff0953110031301283c3ccc3ec82c3d0c8e4c040f457d533fbf6b873a17bbbaaabebe35700d5d5734646e92b64ec6b446764b21213d967093f8b51e2efdae354d8ebf6fa002de65d4f8334863ac7269973e664985fa51cf30d2a2e61b33e2768bd79830f00dd64612856d5246a0d5534696399651696012b1396052b6396854b8aeca46d00b6886649f48c0a3250017ea178932a4cc643c2b184a73365142f9d06d3afa0007b056aa5b1ca57c25fe1840e6f4123dc211c21c2060547853799239559774a00f41cb99b4ac0516e71c0919c5dac85236b6006d830182e9ba82a477ad99129002bc71a56a7a4fe2037d2b54965b068bc96635539a9327b8c8acc31ccac568600c00cb6f3987c267bd93c644fdcf470f36df2ece69322f134cffe19d1c466d900d372f614640d3230590bd980ac996c846c41364cb652111164cb64942879d9006a306307ec2fad27bdeec0ea7487a08f56936eb996f2f5727c7d741ccc758400540415f523575791e1f4cb69f941690791364c7a55a32a9a913e02c4ed481f008ba72be866b78c5903e7f7a81be9d349352d406a05a4cf12483883adcf21de00addb53ae63a8f86252a1668f39cb7ece323ce665ad9d5c0e4958f1a699b353004cca1f1c8f9e297d41691f50bec05e87460e8a68554faa6e1e14658fe36235001eac7a81193e15ba9874518b23883baf65939dd5e5a17e234916a944fd46e30011b3b72562fe9ecab97e4db9d8288f6c805942693ca86f8ed4bb83fa7256ef00a0be3411eaa340fa4b82940b876f5f9c6f1f9f7d1847cf4c071b06c3c794bb00df703ddaaa461e9ea27aa4df2735fb22272a37291751fdd14bf5fb792c37c300d798ea287b711eb207dfee515c428f4bc92778791912bc0f211b52e8fe216400bd208bfea082cda1fe2fca17f5f9a23e3f520f668ec44514b291143685f08b0007d5737d17b3fa7c561f81864ade0b48ca0848cd29dff86654c5f3e97a7c7b00ff8d3b6884a8cd8932731950b4a8b5226feaa54135170d8a978d342814a7f1009232be321e6d4e6d539b131169492dd773789159210160da55a83107ced513005427ef027bc73963e3c84c517af7c2d2c3c448c646b20e879ea58e0fe169a800adc1ab43e8ec782cd4df7837724a0d547a489ba13e3231e9d9a4679357679300da21719e2b0757a9e55bdca212d54be447f50e6e718bc186b382f78a0c7baf00503647e735abcd3adcdd02a555cae54b821b08be4e9b83e006f3460471a4700099e8742cea58f4561245306d0a263f0e46accc2a1c82c1c802fce3e8566dbd0038fdeed2915aee48dc7e36481a63401b495a6aa9606e7a68e841f51a2b7f5800b9c3aae8d9c19ed1ee07e87e9f8639964e0f9887b69f54bf4147ec50649d6500990f920c80040fed90795fd130aa0f81cd9ad91891311aa0370e5bec7f42db0039f0750a3c3b0e3cb9b3c5bc8dc3a4378344bce688d70cdb9709b649f725de008e7a54df493b565f4b3bee21f123f5a3fa26d90fdccef30198b05e1a04933e0085c4d16ec5da4e5a322cd10e115eb464c4bbbee8b36bde3b50fdfff89f4e0b00ecd50efe634478dacba3036fa528632d4f0d9cfd2195343a093f43008bf1ef0004ff9f18c7bb88016e04f176c77bbb3df67ea6fd9c9b41ef31ef3b78bedb220068163449f00482bfd2c941f004f38908e248b1dd8bce3d8bee59f44e12455c00fd230a523232abd84f7ac0d8a220ef4a7afa7a71fade5c10d4734ef095e27000af4b7480c2875aee35b7c220df0db05c36fc80fe49ed6cd93de25ea7f62a2f007fd9ccaf6129ada40cdc7aeea7d633e91a5d2cf007d3b9b2c6161e1f90055400e11553ffd87254ff429db1f9a89b73feaccc152c91c54dbb228b2ae04065f100d9b625659d75fce18a3ff97075692c6f830ed6e1b8e5031ee6bcb54ce6426a006bad67b282f56ad4fa8a32d0c8862f9fd3eef6eef67f1a47be96370b0000fc003cf9cb0000018a1f8b08000000000002ff3552cb4a2d410cac74fa91eebe5e00dce942776e84a3ce0199c19de0f1b17121082e44702ffea85f65a5e738904c0027935425353d41256ca1f6084c50cd7428e7e0536819b0bb5364dbd9ee85b100ed5643a0c9c28fd0c53391fe1ee992e98305c47b78f072773241a45c008788008fb2d2c479e02b222651f163094c469b90a5cea19a83049b43b269d47945e30031f467069e006bd0689d4d488d63a64232d40629b593f20c7d4f49d03d65c5004061583dec63023f564ff6464a5a2d9c266fb06dd01c13b16e9136b89ea5500014cd21d1a7a8b36839412ed9e571bd860d7998ce912e96973f3dcbdfb719c500d7d52be2252f54369ad61bafe430509fb9fd2353f3459ed645286d32e5ff4200b0e862bf51f784fdf4f43d7376759dc407cc49ffd3ab43bcae10eb6aeaab2d00626ab953e84c3cff45ef5636f820a61a97fd5e5ce424a48351f0ed38d4033600548bd68e20d6acf9fde06bdc8fb6daba2401bfacb1ddbca193ae9b7998461800ccac7b58c95e37f8dc8a12d189af161cff1cfffc024357b20c9e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001242ab1a2bd6d07d8d61ea56d85861446349e52c6b7c0612b702cb1e6db6ad0b089000001000000000085864497636cf755ae7bde03f267ce01a520981c21c3682aaf82a63124877c50868f86712240eb535d90d1c97403d074805dd3758c3aecb02958f8d40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000101f595d1e7be64f80c670849206be58b45246f44302c15435100d7eb653d6455000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "12b34d8b04b61fcf58031221017668557c93080db65823f4e467fd64f9e3b47d00000003000000000000000000000000000000000000000000000000000000000000000200de0e5d0089a09386d6403346631e61b367c28d86587296d1cccd77fdf691c900089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000300b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d000001802efe30100bdbbf22116041e365d1a73197a37fe590eb0aec8e582ac0e5cbb8b70000020023c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9000002000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000070dbd91c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000caf43801736540b42de3ea4d9ea53cd1f8efce1833e4751c9174820e0ba578bd63f5d05000000030000000100000000000000000000000000000000000000000000000000000000000caf438000030ccbcc6043c77497ffdda88bc7fa35e0945b93589515e3a8a556388f1231812c0c661c51495da9559f09271a89b5a5b33fc83574c737551a6c2576b5bd38ff6d22bc6ce50a3b301a4a69de618ab29d86ee1ce740fa682ea804ce54affbb7e567000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c5f0000000040000000000000004000000000009c5f40009c5f00009c4c405d15342d76e46e5be07d3cda0d753158431cdc5e39d29ce4e8fe1f5c070564a0009c4a0000000006999d1e02b08a447a463563453cb36919c9dd7150336fc7c4d2b52f82f6bcc824014da6ffe5a5d9357672e71023705b12b4c0a46422b36b1f8e30fe800000000000000000000000000000000000000000000000000000000000000010a61b86c05c921bdc04ae78e1e19c5bdb1d8a9c2a0aafef4addccf8fdcba38841ff77dec4100baf62b87b9a1e824419d3979d0b2a4bc4d28b6dc5cdb155a53b900000000000000000000000000000000000000000000000000000000000004550000000002387e3048000002221f8b08000000000002ff7d523d8b1441107dfd0031ddbd3ddd3383885ee0ea9a08c2a86bd20b0626b71f81811c06829888a90800226222221a991898991a98f84fee57f9aa678ec5e406aa66fad5ab9ad755b5008651fa214c38006b18ebe910ee824fa079be4e9770611bb667826d2783a6a9002554d885dd1236ecc37e432acc46e2967e87867e0f779fd47e2fc90729bbaa00b56f8a5f44565ec47bc055c48312054a2d78bc0e2bc73b42b237e06ca0735600e8d6512d6391426fa702b4a0e284b5324a3e5b9dcef4ac3e5163fd65512dcf0026e85074682f32c331738a4e99f6ffcc10198b3a161d03339565a640e4512e006cd156b4a85c6a9a4106a1247d2494fd8847fc5e9904e34de6e5be218f785c0054f472dd18a19a68887f8619714a4c4f584bec23da110762a615ac4dc4de23008d7842cc26c192d47c2b359f126bb260b923f61add8867c4dc117b29d8731e00edc2f3f8025efa5c60dd8857d7a07cc346378d8c1acd6c75d4058d500a1c7f00fee6322663ce33e67d8df9d96acc528777739182c4cbbdbbc25aae617d391400b471c487023fbd225bf2e9b28a640aa5707c23beb0b2bc78b3afdc36deec410051c930df64e6e75cf3f36c359fd4efd2bb3f9cd12da3618ccf9d4c4abaf50300ddb49566d5717cb9eb09fe447fa8bbc155ebe9fbdc15d599236920e91786990014f4403f5452cfc6934f3d79a09e61a87a86d92ef4fcc6403d49a85dd11d17006f912681caa02e9108ace3fc3b099cd76c8393f393f37f5a578201d203000000fa3858e80000021f1f8b08000000000002ff7d52b18a1441107dddd5d3d3db00d33d3b281c1778ba0606c2a86bd21b9808eede1a1878208889988a2022262200a291898199a98189df725fe5ab9e39964b6ea0baa75ebfaa7e5d556b88b10f0021610fac21aee5827017fc02ade5f6e4043e6cc3f64cb1ed64b034730213760061b72107b2d103c7758786eb29fc7d72fa538dda6bbe554d7a53d74564ca4500bc075c47dc1bbdda9805dd233875ef28c991e47ca0382291ba6ea70274a0c00084b511a3bf9d4d67aac5d11225d58b8ae9e88bb3ae58d75d44ba43e4743a4500facb918ebe78eb8bf58e9126964a11441589586cf48ae752c304198492968d00506e476cf8bf92046925f349df91473c2a46d319e3234ce385f817c888c7c400ac28261db14fe8466c8949a75897887d401af194984b8a25cdf94e733e23d60064c5724fec0dfa11cf89f903f64ab11774e3a2a1fb128d56b7208611af8f980032de808f513bcbf74d563b3b530a022f7f7b159367c1f1ccb97ae666ab678e0017bb302729487cdcfb6b84038b1ad529e858848f056edac48ff8ac191b666c009a9ab1996dd6d528a5c0b3d05f995937beec1b5a7dd9836292305e32e373ae00f179b61a4fea0faddd5ff6e8965888b4b9d74e69b57ea29f6651563ddb97fb0025c15f58eeeb6c70d4965c97b92fa697036920e9378699e4ecc075a8a4250b004f3ef5e4817a86a1ea1966bbd0f30703f524a5f6c5f61cbc459a041a411d22001558dbf96f12388fd906c7e7c7e7ff01b796338dc1030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001242ab1a2bd6d07d8d61ea56d85861446349e52c6b7c0612b702cb1e6db6ad0b089000001000000000085864497636cf755ae7bde03f267ce01a520981c21c3682aaf82a6311011feaa54609098a884322267ec754c637b280c15aa79c3be9f1394e2b29cd3000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000012f6bcc824014da6ffe5a5d9357672e71023705b12b4c0a46422b36b1f8e30fe8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "1736540b42de3ea4d9ea53cd1f8efce1833e4751c9174820e0ba578bd63f5d05000000040000000000000000000000000000000000000000000000000000000000000002004e4f54bf092545092ab4c7b62f785e531a69260e96ad1afef3b1750b683d2600089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb30000004005c09d13a998cb242b57ffffa79d75aaf2a3d081c22ff85897e7ef9a5fcb8c250000020011356c3cf93715d33891b70ead7db65ea38c5521486c665e78efdcd84aa512bb0000028023c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9000002800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000070dbd9400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000bebf7300e5bd8eba51b33ff9abfa451366593545ab4372e33cb9775708746c5d5419224000000040000000100000000000000000000000000000000000000000000000000000000000bebf730012f05ef70d10428ff54d8183da77e7b175f2761b223f2acc43a03f7d03b905e430308832686b1fbe435e789f38eac425a0a466170c645e85dd6b603a49aed8f737b087bd5e70a3e29f3d820cd4479bad39d2d37959baed85f7b2a40df1172a3f2cf24a82ee4283b878f65b8624d8254f084ff0caf97a9b69159ce0bcf67e7e08fe800000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083cba3d59e1c2f45f74068a4afc046e8452333ecfb52762a527546cf46245d80a535bc78b53f0a524f7d0c63924452b2f99a4d14c224e1abb5d88dfd711ec72a81312a84a71db7c32aca5f1be712b12fc4e1629400d662447eec93f2300f0eb43eef7af66c5f346f2a1057f2241168a310e5b0b697821f030b5da2c1410687ebbdab973c42341f06f884be94a00330a3417151a94e73e1105526fe4dab22b61d39860d573250a7df2e7ad78b7900a1ad7cdcbcb59f0bcb8244f51113a0fbbffaed4f79366e4324ed6e9db4072b5f3466e269d48aa2df9e917b4eb07d76c8371a9f2c1daaabd23df6d82ba2869a743142986a98cd9da85085bca6fd7ccbfb204c4f38599de4a8033895ede4e994e6aae7efe8af45bdbc2256c37fc615269cb3e6bdf8c24746e358458b011c2467e3eb1e49d62f477ab3bf3090e6218db9c5bdf074e53180a2ccf418766ce8909f786d6b5f7dfe4c4898f9c5409c9fdebfb345680dd3403bd771a8efc441cfb468a036b6bf9cf4579517f2aeb98ddbf3cc451f5d13ef7834501aae69994290c11fb2c100b70704d4d2ab111262ebcacefd2d4daa5641740fe44b7515be1dbab97e4fdbfe9f6095cdc7f62141960592f3792a146c00000004000000000000000400000000", - "0e5bd8eba51b33ff9abfa451366593545ab4372e33cb9775708746c5d541922400000005000000000000000000000000000000000000000000000000000000000000000200e58a4b3184f9301b46c8e34303d38975236a11e9d028609785f1935c42ea6900089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb30000005005c09d13a998cb242b57ffffa79d75aaf2a3d081c22ff85897e7ef9a5fcb8c25000002800dc73dc6fb7c4c43a28a1ab50883583352fea868adba8e9b6211f16255e700270000030017ac40ebf9733f6e07e35d5d086b61347430f109e37e19a281d9be6a97793550000003000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000070dbd9640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000d70417413b17ddf4a3709b147c1417b1622ef4cc79a06616bd9ddb158f11ab563d391fc000000050000000100000000000000000000000000000000000000000000000000000000000d70417400042ac8c03d05178560b528b3ac02be163fef046bd10793f7b39a5afe811e21678f11c58c442882343993398e172a90d153a03117964c6db38d5d1c970c01b6513c235fd61a2ac7f55ddce86a2cc62dd5347cbcf836135eaa436fa7f4752f80bee8202ddbc296d1d8765bafcf9f175eb3be77f37c81c4c93559ff7023fe2495dc5e00082341f495992e20779a83780b54b78cfaab4d39b08b10ffa1907cfb8cd42035ec02b1f6aa32fe7f19e158e57710447737f502f846e394cf5333f0e02323d0317f1a17d85963452ec3575a3fbd15f7daafa11c0c1b4e4801b8bede6fda3cf67d1900000000000000000000000000000000000000000000000000000000000000011cedfb6167cca7ac71218cb23f0d1f6ee7f4c3a408a45eaf5830d091dbed4c24000000000000000000000000000000000000000000000000000000000000dead22319ec11d7c77892dbbc3f81dcdf88897830d0c0585779f9e0ebe5f4065884f0054657374546f6b656e00000000000000000000000000000000000000000000099168297a5169bd09fea3fa7c996b98883583956c5de90ef5bc3664f01a5453000000000000000000000000000000000000000000000000000000000000dead174c9ac876981bfeabd404b8a2990efd8cfb820501a49c80bf8bba976780b601005453540000000000000000000000000000000000000000000000000000000003970ab2dc2c225a9febe92d91b7d6c881878a77c94631d9db2b1dfbcfdb2037000000000000000000000000000000000000000000000000000000000000dead2a859ac399e31702cd6fe7a2d6d2194a3124fb1e1b4b0c70fdc7ab800ece92c3000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c5f0000000040000000000000004000000000009c5f80009c5f00009c4c405d15342d76e46e5be07d3cda0d753158431cdc5e39d29ce4e8fe1f5c070564a0009c4a0000000006999d1e02b08a447a463563453cb36919c9dd7150336fc7c4d2b52f82b7fbd849f92417221e567c919124b68c52f08deee4ce6c5d7ad71ba349937f20000000000000000000000000000000000000000000000000000000000000001081b6fc6f0b0c08088062e4bbb563dc00ace0177a5fd345d8bc1c4afdb77b8a91e4ddd5e8fefe0a88ac60e5d36efc13bb4f937ee19a1f37669f20a186ba00b060000000000000000000000000000000000000000000000000000000000006d3b000000001310763932000005841f8b08000000000002ffed56cfab1d35143e49002633c9647ecfdc67174fa90882729f7d0fec3c5a14046bab42b5a5a50b572e00ddead22e0417e2c28d165110410495f70fb8d40a2ea4b81344415c8a4205a900b40b17eaf765eedc3e5f2bf40fe885e44ebe24e73b3939f9926d314aef887100a744b6c524192a710f097e0e25c3df93f74aea4eb81367899d988a6814b58b004e31bb4412d44f89457d52d247d0599ee4f053340493ca8fd1a0112fa3368e0090992103288950324309262949667cdfd06d49c5d0c47dd1c758fbc7677f3d004a8ea9cae7a272efb6441e84174ae4701cc8d5a1df98305b0cb2ad8ce2a7d300004301025d8eba2c0015ba18b52f62273a8cae4e2764400928e8902a97341800d2f98474c7263a7aedc6e810e2c9268cae28cb7d9400cb0acb417188519e2d00e5642e26cbe3ba8b2d51df8b5bcab3a3f2d304ec087acb51957e53529f715700b84db1c45d019c3954cec73ebf2ab18fa1a19717c4cf5e66b39719b6c13242008a9e6693a7a34eb3194a67c8a4842a4025a18a5049a8065411aa0955841a400035a106505e136a013584da18970ecd96cd2ec6859f2dc1ae870d941626f2b000948b884bc85bec4fd2212e97a55dca6ba36ab01326e81e759f0fa31a1aacbd000947e9ee7f7fff1cf8495f61effa01f1785306c6635392266c12d4b0d1874700d746d4da4ae3d0df0c1865ef88644192c50648de918d15898d240b90d8458800f62cc2db2f0027a1dfe4a7e6801e7d3d17980eb6e78860d7b37b245e6f03ec007e2c8176138ea59d8565c4109d4f11b136c710b52708e05e3c2c16a9d48c2a00f3d8ed74dab8d432e19182453d6f6cbdded808d97963ed7a6353409650ca330089a64eedb45197d1dd640576254bc17d5cd2a57c3daa1acc557d6bc8d4c110004a85a554351221b52dcf5759b558e6b7d2ae727664b29976f6a98d79c3cf4a00036cbb51371d5a1db248fb8e636f936395664fcc9b560f670c78314906949e00fa35aa763289b854535232699b78f6e855659a88f20c9485475827b44c44350065058f6f48b594ab71503415a7de32699406c253e11c2608d45fa3509c0c9a008e4d8a7239afb4dcb7522a873fcac3f0c070f12577e6a7d77ffde48577b74e005fd317feb6977e7c66effce64775fee5421ca50553bce6f0fcad577e29ab1700afff909cfff0e93f93d3e910defffde5573f38f7f08dedafce656f47715d0d0087fc520f8c9f4fba8ffcd177f40af248db18148dafbaa1afcd2c274d1ceba300af4ddcaf386d1d74af87e7a959cdbec0b78cc73ae89317912d77a372556c4700192c6ae413b340171164bad64532aae4ff948f6259a02adcd9f9b2703755d100245c6371738d93fafbe79e58493d3d65e2561243315d36a32a26f109a30ed3008c699f339caff01879c211380ab95416c265eeefc7b858831423cb94a500fb00013a870898410fbcf916a35eac9a77bfeee40bc13d3c50720628ad7a6352da0018dd0dd41b81174314d68d51d91efab2d163769a0eb8607a2453c5940cd95000d10455eb92a42bb5399cc2ee90d2ee7b07ed0ee9a8d28c376e07bb19ec76190075aba7087515b06e07e288cc66574b326a66287a12f5bcc73e938e36910394004e986aa9f75db0f1a08c31fde67c595d7553be345cb4e2a2db6101439fcb6200e55cd00bd48b362efab8ac148dc46d6141dcda1ee3bf907e22b6bc2a7091b600f15a21793f1c93590b49d231b21d49be994876b12267f06e14ed123cf7d45500bcfcac4c1b12c90302d07771ad2dd7da92f2bb15a51e20132def74be6b183e009ca9349455a48d672c3e27409bd50d26fe2ccd8ad6dd8676928c2844598d9b008c6a90152568b312af1df5dbf426a3a44034f9c4da55ceb83440495298ca3000e60f972dd5359833ce2eb5dee519b70a4ce2f0e4db891fbec404ef1297df2300cae52ee7cb187ff1659c4f6552942dfcb91cd31d2704d005e7d8b4b1a99d7300814d0f76bf54d777948145121fd99543570e5df917278e2385980b00001d2400add0000012341f8b08000000000002ffed5afbab6cd75d5f7bad3dfbec993d007b66ce99d79e39f37ecf9c3df761ccbe4df042e5a66962487b434a29da60b50025587cf58608ad8ada083785c6478812215483a025544d8a52ac14b43fa620006a5ba53586189558698bd5a631a2a4fd7cbe6bef3dd39b734aff800e77efbb00d6777dd7f7fdfdaec73e179471f44565fc3b95baa08c57c44b95d60abf129e00a252fe95bef2fcdbfcdbee41dfbfcd3e4ae3712e6150994b84b878bf4915f000be5d7978bf591de07d87f2cf01b17a3ba7de49a220ef9412210c3e2ad1a6f8003a907b23e882725429d1258107193c00dc5341a283e280a4edbb7c5959b95500194f88a94eb9a49cb05cdc2ab552c5373b4a8d8812969457088b2de514c39e00f2c2f01e81a68fe8c7c9e0e939155aa54aee35bcf4215eb523d0bb4585b1ba001984fc2044f70d2a24f9d8fd29e1e08ff9ae8378bdc1b94d485ea7e44dea5d0027a8055093a016f56e66203703955c82da00b5086a0314b4088a006a13140100546d13d4012822a8432bab2e25eda1dfed1d63a4c3916375c101229a1d7d9c00e8ee31718ed93dee26ba13f59401baf2ba1db43a265155e8f7eeb232a1e96c0095f709d589d5fd89533789d3ec244ebb9b3851bb0416d508945c9233bdad32005f5051ac7e1661056bf431bddf1dc00783521f467a50f569244adc875c03ca00d567f770886e9fdda188c9665f0f696b98d38c86a3440dc7a0361e4de0b5c90004824e26e2b549fa88d7c0e3613581a1607e33d6e358fd72a2fb0332dce7000086208816ba2361c8e6508fc850a68ec6891a4dc070329e82e1740a86d3a930009ca64fc6f0093505438860267a12abc7123dec93e11e078c53170744198046008de939205461ab3f0497a83b46acc593ef4754dbdfa1ca7ed3add21f5150e500638933a20daae311d83ead46b153499cc13871601ea72f1cba99965d95854a00d7864a164c910d2676675920cdd875e7e8ced89d8b49d89c6900e78b444f1600e82d345ac15e2bd133aa5af84e3383536766ad296920fe6a1102be1dabe760009359ac9e879ab3a339345faa79acfe19f1364314cd4a00a97f53734611308700b17a0998c3de6cab9cd71426fe47e274698842941922ca036aa8255267125b00f3bb8c1263a8396d27c343ba8e3dbdebe93ea42bb6650e2dd9ad0e61ef36b000bac0ea6a8c76fbc898110d51eb4ac00f214d410d29e425a5c6be4136a843df00453df49e47692c48108cb470257d24931e0d527766b13348a3338ddd511ebb00923bc33c776ef0b9bbef73682e426b00a336dc4845da1aad60af051598220500129aa48430d38634805d382760dc44fa8cd614cf640437c268a57eecbc01ce00e9c6cead3047f72882393e84aae05c86d522b8312ab501fa41d54edd08cc2b00c4ec11f34789793b427d988934d88934103f75454d3407ba2d6e848e0a2e1900ecdc38604fef7a7a00e98a7d9923c61737c2d98391a62b467440a2fa616cfe00110311c58928e5bb553b761e8238111ed65a9755a13b41563aef55536a208600444530d3ee247126c8c701118d4564685e53b31c5192431031c51b4f8526d300ba3b26ea072c2ae226b27153d88f1be1929218236ef04c51061ea28f6b51250013fa7a66da88a66560b6c9a03dc1d8236a92ca32d6e2e12e2cd78676fd095c003311d73c96ce77868099498fb03fa2211ea76e04e39952c739e84ee70b8cff00ae5aa482b7ade0eebee0b62448da4fe7898ee6e42c124f229af2296b4a140300f82a1ac6cedf202ec0f04f40bfdda3dc7faf26b1f371cb7f34616cb07c4dd300f285d8984ab8cea492899916121be0ac1689334d0b34e2740a7d273aebb5390096f7a667c86f678bfc55911fb8031a9f310f696f70c0e7f61d702b0d463d240068bea8a6b1f32a75c03315693926367cc1dad04a4f5e6d14a7f90c4ae7c66e00cf9740fc77b5cc1197782f051153bcd94268ce883a23ea7f5a54e8353925a0006c21b62466d007cf0201f52a43b536a96442ff7fea1e35a14fb0f293fe70c60002ad51a03562be0b31bb73f25e726cb9c298af56a99873bdc27b355c26ce1200dee813d158c435106b6a9d2362036ad6828829de62253457445d1135b2a8d0006776a63e96c42ad1733c8b2ee46361a8cd2a99d0f36c0999710961822cb8e2002c60307d92db76680d3383c00bd8b7bd44822c4b7094fe3eeb28180230b3ec001176975ac43a816e0b82f1aca8e30674579b138c5f5627a9e08b53024c4406006f654e561b08be21e7da0a122f57a47e47ca51afb126ada258ff0c12040cef0006fd458f723fa896b1be6af977974c9075c26d2f38ad2541d85cea35cd49ea002b7d2209c20dff49e2ac4457bd4cf472057d973aeb2d3896f75667c86f678b00fc55911fb89454d67648cbfcafcda1ce8c91ae1f48d55173aef63418f590a00079bf5ac5fa71ea806725d2724c6cf84bd686567af25a6c1267b386d2b9b117009b1888d7559c23c678c7828829defa4468ae89ba26eaaf5b54e8b53c25a084004b4a620d7df09c20a01e679cd596954ce8276ca4276a499f401e64c468263b003bc6dbefdb78930580d1c4688b24da3e6aa38d9b71c66e7b21868c24e476710049164f5b1667ec28acfd25c910af9a3b2fd81f1b46167a31fc788ef5457fca00ae2fc0182172e74763c0fe0abb4b7313aa0cb80ee7d946756637aaecaed02500214413bbfb7185ee269120326a23fb8f1374195f301da38ecd8d06f0244eb8003f8621355ac15e2bd11b96edc226db7f6cf6f61f006e4e80651d71466b8a07000bafae21df4beb587f19c9318df557b93a1d61f5303f8ed5437f2d71d653e400f0b404907ed92e84c044debc52661aa3d4995b509ff5ff26ce7895ad31cbdd001ab394809235662a069fe46bccc4162c0c438695942fbdebe925a42bae658e00b8a48a24433039cbb196934aa2c74b6c23e74b3982509a319c6e9ab9d317a700387dbeabaca4bfc633e74eee901e9aef32dfe2ad259e18b8eb45a2d6ccb8e5006285d3cd6a85d3cd6a25a79b55faa4a71bb3555020486b436cb0eecdfb8c1200c830af2019d6439e64103edc0ad6c688b3684c835fcaac3be61107ba4ec96e00caa1cbf08579272c8c85783c9190e1d80992d15cc9f37662936e89d27482dc009d11d158c42d10ef52db1c116702b315444cf136b1d08c891a13f55e8b0a1b004e4f49701b9f96844428a211e9f04ea9bfd34a26f4bb327da68c165a92c56600caaa64eecfab525a01a72c360888f509a2eda4b401ce4fab8d5d3156809993001e61d7d52636d7a0db86603c31753c07baf1b9f3187fbf3a9f0abe39a5e28a00c8fa3cdee7e37310fc1c39d762487c1293faafa61cf5168b7abc8acd5308750030fc10e86f7a94fb69e4a4f9b0e53f3e61b86f1137343b88336e62c9af2dcd00794ed2f5bc843b38abf38913e7e987d44671d5596fc3b1bc179f21bf9d2df20057457ee05252496348cbcd8d6c41a613aaf3c7a93a6ac2c4a6c1a88704cd9f00aa38369fa50e786291966362c34f5a1b5ae9c96b732e71ce6da1746eeccdb9000b40fcb4ba90235ec0fb8220628ab73d2f34b744dd12f5598b0abd4e4e092800e19292d8421f3ce711509f659cd54e2a99d0ff60231d75913e495420470fdc000de132a6895ae1263a94eb1e37bb01725576d5e3e6573d72b1d4b1174bec9a00ec52c9f0866c6b287837bb7bb2672836ebd9b1ce9c7aac4b749dac0bf584d300f0af2e33d9341ac03a56f5c01e2c4f6dedae31dcfc1a034423a018e855eba0004a3763b728673f37c8ce7edecd38fbb9380437f353a27bb4774a741b3966990098d8babbddecb0dfd91d793bf6c84bdddb72dfd5ca0ffbadc4e9f0d2eb98770060c71df6f4aea73b90aed89439b4b15b3d4e9ce326b05c60b91aa36e874b3500afe6e43ac0ed9e75c1e6ee5db0c1852e40859c73f3f866e55d78cf5b1e78f100e293eb3fbffaa64f7cf083efb86f75d397eef8c027dff7e89517bff1d8d7c4007837593bfecfad97419ee1dacacef6adbdb33d802d9ce1ddfc44efb6417df600f02f5ebdfe1bd7af4ddef8e57beffbcdbf7bf641f3b70ffeca7d9ffbb9476e00fdca33eb77bcfa7989a9aeb606aae362af217141abe9308b98702f62fc2b4d0025f7459c29c66cf0a293eb447a710a63d5c56c62a8fab7f7e422d685477f4400b9b612d6714b6bcaba9ce872fd3bf5843be89bb0eac2e3e5d42a1f7be5873e00af40d62bd77101ebfe647e018bc5cc2bdf9c8760fefbe60d3fe55730d9a74c00d7ac4c3de57ae51e811a34fcf22e8e9d9c8ae763dc630018265b394d3698c9008a0c20ef773daf91e886951d295da8cb202f7e75f36e664555496ed1ceaa09002d4cc0bbea72a909711e56cdec9eb499f190fc66f2d9fcb619c9665332b2c500db610456592e6edddf2ad15cf5ad2abca2eab18bed74592ca82587ab08e9a600281a7e377632b0536828d8935630d8a92c17e706762a9b1026099192501a1c00d0f60d304c13184d5eb59b509a82ec36359b6592009667a87bb38c7d86fb71006548dc559e2bc4fcb2dc80fb99057cde939733909b810e72ac830c141c64b500d0b7ee01c8cf2ed84d76c11e98d75db05759f6ccde053b8d6cf38a3768a810000d9be068153a02977ad0cd5dcabce8f04a0a6a45012ec89d76a900e59e53850054b9a607825ed8f6e029b8e60578aa5e45a92bbc801b16f75fe44b4603feaa0033d6c1f0c00aef15fc44fb06d5b39529d7ca9513d041a6dc41ae5c23b34a0300a00a10aa28bbafa28a368f1ae0f83ed588ddff4b9c166aae69bd3e149c1b430003d90c97b5104a5e2534fcf861907b0563738fb6f33321fcbd2503403fc4a200624310ad323ece98842e31943ab45273422813e83fed0976e12ab3044aa80200b38f252771c23cb1eafb615da6d920553d3002958cac01dfb7d0b2ab1c536600566c911585e90ea91a244e50977e8077502b264e11b95447fe9561c5d2515c00b888451add00dd22bbb057e991075e0a2beffac617dcb77de48eafbb777b8d00e077be7aede79fb877f3ca854fdf7bf0a862c2c38ba98ae55c45b005e1002400dca369e3177ec2bffa4f0f7de90f7ef8b7b777ffb77efb6b85c7be78e7536f00eb3d592dfd655315b124894c1adfbbea79ab14d07a41961cc15e09023040b0005418fc3e8caf5bb4b44bd7043bd7042286f5814cf368f482d077df7a90d676002f5dc40f601fc65b0bcb8d6e59296c4d2e254ea9257d7c353425b15cb8eb1f00b25f43a6d70eefc93e6c1c66070c800f03bc829a8cd5d227fd0267dcc34ce400c35ce4401fbee58d4aaaa02c4047e98214a6730f4f11944b5ba35a4b9c5aeb0007c8a785dd6b8bdfe5c65ce92abb958ecd0a97bf10c6700a056439a3d0a36d001cc5752ced7eaff5ddb460e191c76ae3b1be7dca6ee5c4c452539b5ee278b2008e60277710a2b4b443ccf61a5ec8cd2f6a12e3a879e455488205eb59d5480b00cd8837da5e1b7bc1c25fab28a72b9b588f37da0dd06d1440b701ba05bcc0c600e59a6c08bb882fbb086c0c355c326306346b21198564f4bc65844060c1e467005c16eda8cdcfb4ba91ad0f8dbdf501c0062879ac6cd8e9a03c85a83285afd800ba2f28ccad423d44f96adcaad2f0e50a5eaf35c0b8dec00a5b78d9aeb020c600b581f58cf6011656cad62d2a0d76f95a4c0b846281d7ac057020a9db0389de003f90d86c10cbc0d0ba4979c35a132cc3266aa15754757b506ca12635b979c0008637ff02e2d5b02c7948187c58725cf95a51e718375d5ecb167ed14eaa4157007692c82ef90262117d200e949f234a591244ae238d5068cad6be41d485453d00e30b882d9e9604bcd9c613ba90efdb2fe0bd9bf62ee0dd869c04f6be7dc26900f6b403601b8b889f2f27bb1d5b58df6980dd89779bdd9dc834596d4483767e005821ce5d1687e6c3aa1ef5087b0f0e94de5b611198af83291d2ecc6650e60b001f0abdb7e71f0aa3530ec9e987705e461b7c6f680f245ca8675df4fcb1544f00dd47b58b3ab1f7b07c54f6eee705638fdefd35ac74de7b2d7f973a15fad91200ddcf97e8bae6e74b77208bef504e4be0acf08dccec565a244e54d7592fe25800de3367c86f678bfc55919f47cbec1408696f70db87f7dd16d060d443ecff2800edf80c75c023e75ada30121b3e6e6d68a527af88dfff704fd5ca8d1d0df0d100dcfb3d35ca11e533a020628ad71f0acd21518744fda845dde554e1f57eb12400700366f0f41186cfc82d58bd9209fd676940a83a7d82c1c3b083c1c34e1783007fa1bad9d5ef7176ae3bde3bd71dafdd743359b387ab6ebef7eca4183c4f56007b89d3cbfe22e358e03d487d6ca576acd42f5ba9f1f6147cd081dafd1d355c00d4f75019fafc0ad8834f7bba07485fea449f75a2df83bccfa99e55a6cfbf0c00b9e4f8c6f702e4a187727380f117fd83d8fb57b0307e21f6be7e893b8882c30050f3a1c84569606760fca2effaa536442bf925fe8111fe933f302ad927bb7b00f4fecb2f61bacf0901d805becf6e41badaf7fd80dd22b81763efa58b0e952500e3f332894261d2817fc0ee0158fab6320a4d1f4c8bfb121621a1a5203c4854007814f726194eb2fdc04a12f825ab57997a95c126a45ea11f522ffc277a85f600c9f43aa8f8a1488e09158858b1d44ad20569bfc26e195ccaf181b14307be7700fe928a3e137de65bc2a1a82bb62500002ad355940000028c1f8b0800000000000002ff8d54cd8a143110aefc74524977273d20b8c2285e85597716b40717f400e2ba73f2b08fe0237810f4053c8a47ef820711bc8b4fb02fa5df97de1d614f0036245da9547d5fa5aa92ad38634fc5e95e642bce474ca28f049f6244fc5ede0097a0e77a7e49ddf932c462981d36c5eda8f1985f4987f942c2636c8e1734df0013e841436b737a7e839c30f2568cd12c266b3a16b923696f441efe33cf19d400997bf7963d44e7f2dc109c64d91a6728aa8532a7ad84d0cfb607b64b36cdb6004bdb66478b01a21d5f7bc25ef30f8c134e8218425288460684330e0594c75200ae294d01e548cac2a5ad58162e6b8b8062a1b24eb3558c32229ab891b32c2e00664f0407c0cfe237f2623623b2eaa24524cee7329b32ae258cf12902b9f5fd00b9f5892f12a26774fb25bab5f831aea9b4c0f0f1c901c41c5046c5fe58601500fe8ba492a44e20b994e99a2434920a925063c3034ef0156a1ffd9aa2a581c7009ee70143099e16311cbc3db20c11b86f24de5433229781b98c2d971483853200161472c92ca4ae347d61f6a7430d41c33ac804e0a83d2ad70f0af8b7683cc0007b86821a873ab0206923ef50909407987c906123ef4f1056a2451c7a42ebdc009a0237a0054371a052c36cc7c03a860108a103c247e9f62dc730e9307729cc0026e8d94d83f76c42a705b3f6b0ff243ded01c640d005cc5a44f82195fa8c5e0095c721c9049238ade0f4455674dae130ea704dc5aae7edfa868bd6d1c155bb00c2bc8a6cbb897de5d0236ee991af4b8fccb6e2fc9e0db933ea34f4b80f0150002cc57785fe07e09c761bf9bd63f49d019328d27cda8434c221a9d77c57705f0035f345c0afbd087919cb8b00c05f9ae1ae74e841d7ab72d9b5a555d59ecb040076a4e1e7a9714024f1c94e8eae8eaefe02fe35119f900400003940e9ee000000018b1f8b08000000000002ff5d52cd4a35310c3d6dda34edf573f381bab8ba001314ae3a17740611575e75abb810c1bdf8aabe949e7450d0423393bf9393a4000324c435c4ee8001123305f4183cca9b01bbd987dac6368fd46d335f44de3000d10999dc924e69d89a40a4db3b0fbcf580838ed365b9fec62cee1e104269080056f404f80fbd0f4e2004a3ba8334ab12d2c860a222757a856a72b56008f4f20037b9b1e840ec3ac6aa634ce64dd41135af70d820b916a25ea1ac7034b224b3004a2415d19ac7906dc906eb4527f7eb7cfe3928dbd0da19af67c64b24ab4b37004662947afe03127e50cce8374d5056e1080a39d2427a72e66c989e9d7e6237009a542e3d497c587d005be49f1a4b6ed0bc24675c4cb83244eb537fe202b2270088c446d9721aa3264ff64e73d16d4a75888719628c62a4e0d3998289e9826b0053e2f9989e8d637a21a61803de27ef2007c7b7e47dfb4ffdc7846ac9da2e5700d8acf913e1a73f9136dff98910f0cd1ad3cd13162cb730733577359ad9c2d500caea7585d77510227ae1b3097b1f7b1f5f7535f090a102000039f0420c00000001581f8b08000000000002ff3551cb4e03310c9cc489e3a4c005097a006e48002015babd64e1c0896d7b40487046fc70bf8af1ae58c9de8c1fe389334042dc0041ec000c9098e9a08fe0a7b40cd8fb2dd4269bbe896d5a0c9116462621a34700d233036723c8b43f78e1de0bee669ed997b77fcee2e901216843302d4fc02500ca31b880108cf00a698112526731599166794a981c2a86c02c8fc9835a0686006a8fb5f498cc2f513b6adee0be4172f5215b940d1e7a300a90122945b4e61e00b2759857cbd69337d0ac642b24d7a4f2eaba85965c8f9e914e1be95ed05c2400af5c4cb841449b9770e43eb23788c446dfb252927ab30fce255dd027a79816008a1e8512928b1d8389e98a5b54f2b9ea0fa3ea4f728ab1e077f4e5e5e0fc460081bbf950cfd9502d59bbe6469b357f31fee6176b8b2d2f46c21f6b6c376f580071dccacc619e6134b395c3cae97583af5d1032fae0ed88f5697dfa03e7248000b53002000041b90896000001b71f8b08000000000002ff6552b16e1531105c007b7df67a7dd09202100d05d241de53a43b404242f0f2a81125a2a48f94228a00943ecaafe5ab32e3cb35c949deb3e77667e676bd130d712f6a47919da8660400291f044fc1ca22f6f38d643bd8e137ce76589744acb0e0a3e84224219ecbf00009f0786422031983cd9d4ac5648e5a08e90629a0d4a10228112a280a52e6580012f1b4a526e05912f3df76773deab7cda95214a5a1b8042bfa51e4bde8aff000cc048e91066c35b00bf88aad11d40a7e2ca3274191e549ce5c345b77a3f010002aa8ff499ae4f31c0a3da7e8886e6d0eadbca3a1e4924b72247e17a78795e90047672a808f5226393f7d2d39c356aefd67a36f2ebddbe2b610f436c7a1d140001bc1d04630fc9191c43d65441c33e5fd2b2197b59959d34bc46ee4ef6624d100089d53dc29eeed0bab1a2b2952295229f27f155940678a5b22d112477c8969000f2cd0f6288ea6797d2279f128195b5965cf96606ab9a1db19546cc495a11100d7a0531b26b95b38c521709a863fd8f74d7d81826ac9fc1546ebe6bc9078f5000be9eb5a2f24086fcd516e2c68906b663c0efd18cdacf158a15e27b9d907050023854f1739b93fb97f00366f60c80f0300004d5d68750000058a1f8b0800000000000002ff8d55cfab1c4510aeee9e376f77767676a6677fccbee999dd0d78005036e645b41f18c5a0312f3e63241e3c0822a2a2282a41fc8128281e72118f00a207c18b8282f122e412050fa2e6e01fa0472f221e3c79d5af6a66dec6e0c10085eee9aeeafeaaaaebabda5d324a1f27d33b4bb44ba61f63a2e18d84df10230026eadd5351d83bd53b751efbdea96690c650acd8efed8b62bf191bc541ef40001407cd68147b8023b3c71801e67b690bf3690af7f8f236e633d4c37c1ff5f700f85684f97e1adc8cabd3d30c76961dabc53b99933b3b4f138cd12e29358c48008d86c951a28a927d45b4dc1c1f45140e47ac3bd2e810ad1a7941303422afb700869d68ab13855b9d28ec44db6127daee44bded4ed4eb44fd5e27ea77a2a8ef00281c44b731d4bf7f7f5ff7a351426124beded5f8ea2818448e851a18a3e8d6004310758832e8413f488ef05acea6ffc7540653696661ea806c6b2a4a1d0b61002aca52a0a66c3b482ca416aa20b57c28c736976d1e5360f37497423dc64413004c6a0ac827285dd323d0e636c0f6310ad6f4a8a729a48f7b1a379f345ed353009e26fc01da88c1b3942153bef4125f7a3666ab06db17c9ace97960407a011800cd27c8d7f43230f8833cc7530ee875b26b7acd533c5ed31b9e72fe40399e58007085c6e08a1da738f736a5fbf28c78598ba06d36623fe4112c2e8cac2cf9e9009328d5bc4cf83d1a291f4818e6bd0626902c002c4b2214172409a8b04a4185008ca990d2ae328a97994ecf73654418699bc9a55719d626d5a9d769c6248abd00a80d0ad2eb49caa2c04b791a188388eb5619cfa62132104d032e65880c1ee40033acd3598cf5ace093f3e3c80ed1ce51521f50b1a62fbd4a73afe2ffa08bba009e3e1423bc3885f7619e05083d0a32847e99b2b6a24cd4f911499cbc0c34840051e675de449d716430b67bf70b4f5efa35f9f0ddfc879ffef8f9f657df7af3009b2f1eba72ecc49fbfff76feabcbe9b714013028bb872baf7938084b87927200d839ed00961d7ff8e367fe32fa96933f3ef7c027fba79ffee5c4c5ecbbd5f7006756374dae98739f52e575d51ef77aec18da01ba646827d0a540b3c6d4e2f600024b8d16624abd7a10d58e73440b8c157722afcac378b2524e49e64ce0559000c95ea29fe371b9388c6c0185791520d14ba9a015774a415c759d12e25589a900cc4597b743745e0d4bafb6565e854b8ea1f6e2924167e41878b9d0f5b9932400afc6c491bb658bbf6c3c5f34fe965e97cd0d89c4007555ca5e9c9ca7a04626007b892ce04856c8fa6abac0cd21e2def27a118213a3017042bb1830d76de79300bdc6272b5c1f60d80dd717281493e8c4eb841f5bf1cda4b90962275d0fb55d000fe5d26d44934e349d80e6c55a95607831abc1ea0b54af15824c9c573661c2002600089d8de1fa20466b503734bd8e53cde53568ca8b9de5e54043185baf1d001bb61aab840d07b6abbb26305ec6d092c54346874f5a1daec665c760bb61b000955bac313b628cab52cfc4d24468c6c92a4862a41d8ee1f0911a7fc447549a008a12d9a38198688e68dd40f642f3a0f2aa92ff01272c72ede818e6a49d47a2008bdad1326cdb7ad5035cbf62f7c75dd0e36b821e0bc39236a3519355c1af3000c668271ba79b1be2941978c5cdb1dbcf796f36fb80f773a4693e8d7173db6b00d3f33aee83f5f11dd27f644e8e21bb359c5b4ad6cb1c297d85f2a68b836b6000bcc90bd449e93852d076e2c083dce165c39a3b874bf0ae6cb298950943307100dea1ba65c5127f69a6ccd1dbd4c5a6b76daaa4e42aa81d0301b7066e597343007459ed756d5b59bdc36d81595acc33b690b185f71b0b9e32662caa8b73bf7400dc9c5d05fd4754b5c6328d873455ce59955e80740625802bec282c1cd72eea003366b2e5339730440188cfa9e8822880eb0ac6bd743dae2bbc2a66c09dc140003003ae9b41013333af67712b9bed70d7e4b695cf2bb650f1bfc6d7b4d3045100f1bfcb1e15578babff00f4f196a84c0a00006bfd1d5b000004331f8b0800000000000002ff8d55cdaa253510aefc74773ae9a4d3dd171c611417a2083dcebd00a07d980bb3f2cebd20080e8222ba1797be80e0d647f0055cb8f5115ccdda8500e042d01770296ef4fb92d367aec3087320399daaa4beaaaf2a9573314a5f8800713722e7626c8749dc5b829fc3e8f0f7de2bd2ba2b77f598b2ab3a4463a8030094620e9458cc8fa4c17c2deddb50c66b6ebfa1219854fd560c1ae965d3c65100e436ae090791351419882c45068794186cb5fb565bb79e4b2b6ed3cebe4ad30075ee1f966f7e61781c55bd17e57b7b4fe40db1374ae435a92a7880c984dd6200907365143fad86300c00d071d3718068d0c3a6fd509450189d3ed8510206140092bcb4c159c0591301f74022e1e875dc312297da6319b9f405929f91429f10000e46b49bf4dd2ad75e4cd7d35535dc13f550fc2aef6f0a1062bc4646a08d9b008af6aeb4b6635698a6324a5620ee3c266f1fefb4d85d476a3cbcfcb892825d00ad7d178c3ef3fbe7991f7c0496ef70f233e9ea49db1607bc860d6fdf39195100272bad83be654599db549ce8863026d0dd8e9b1e13444983862615652265f900447724d5181974c723dd19ee7c2579a73bef18b9d09db0cc5ca602c9cf4c61009a40374626dd6195af4177e813987e53d22adf80e99a1a64188abca95c028d002fc253004f31d0b16fab63e0c9c6bb1482271b2228892dbc6c8387d8c60c5d00a60ea7a0cb2db0915578db6666f8789a6167cbfafaee7feb6bdaeb6bba555f00104e33029e8ff58508bf47c0a98f20de4e887a92b8ca0fa7a867cc73bf6c6a0079f1a867463d2ff0ee4759fe13f5cca8e7a751cf35ea529ed4c5d943e78f5100a3c25b5fa32e3b22936d59af3f893f466dfc1eb5bf554abc461daaa8dc0e8d00afa62b72169f5e4e55e48ff7648161ef1a5451631cccff8c4ea5681609304c008ec995ab5f0a5723b6fc2de32abf5a0632329011ecf77995dfb023971d7f7000c7eff79950ee98c652c26c34e3d346c3cfb1341a8f8c944b8efe62b2a71b7f005637ca16364b97fda67cb89463bfe1cdc8434a9853c0febf24703f6a9a8e00003811d88f81c06e0776b780217460279317d50138750d6aa093e604dc606e5200b7a9ce5deecf00af421a50dc2605380a63ae020772c4da21f8cca8e7e5014f002d18334126824c6738f4b29cf1d00155ea0c9e1c4113c74ba13ec2a3d1f0800059f419e633ded0792a90919071c6e9d7652e907ab16c1b2863c026c006de950098a7023bb1451076066c6049aafbb524019b9e034b984917f0803b9259fe6100c8800d993de15252859d009bd92ed889d96259b221a602cbce14093b02b61b0071ffd5a37aff01eb9f035bbb5de9491dba5f6476ba015dd6741eb75c7d586f00f9a6936565e3513828675c1b50142d4ca113ab4f5cb7aa4f61ceb866555f1e0098ab46f14975a8f78bf2d1471ce89d75fe2551ce3bcfb71c7fe52df775d497000106bf701ec71d0f04c005e7b86cca523be702973dd0fb557d7ea10c2c12f800fe41ee3cb9f3e45fd7763d2e4a080000713784f40000022e1f8b0800000000000002ff8d53b18e14310c75e2c4f138d96bb962413414a085db95600690ae6200d96bb94fa040821fa04494f4481408891ef125f753f09cd959094441a47826008efd9ee3bc6c8943dc11eb81684bcc0243e53e61144c21d217b74974affb6b00ac753f4f8a9861c226f1e49e04fb92f223b8dbc103dd3862d0b14331298d91008bbb7871315ca9bbd2e24a480a94fee997d97fa757d72d5f2e95b2932235b00051502e0f89ee51b90a44777b600f572361f5bd07f3de528dced56019cbd8c100d005da06ece2b73bcb006e4c566f11925836f4d4f0f143494a8e3500fa2395000d5d8e41d13c9668b0c6750c55d768a43cf1a6fe397efd35c8ce48c42ac00e0054bdce352595b53b23304c1e9f40c2094515fb5a1195ff8ba439495b81e41500ad8e24b9933490e4261d2f53278cee3644d81c81465a3b5554730fb0ec108800121304483680bf2673f0b480b50c45305af406bd2b2c08794768e5db0be41500942d49b25f848d5d7f4cd62fe2d8cd91ac8e51ab77bb3620d40684f7d4ae7a002710d2605bf186db7377e10208c45c867c06db8bfa30173552f6427057a51f00c5c9ad3ef3acea995d812091e4249f6692098253c69ba1a8c905ff05dacf9e00c0752617c8d492173314504a71cacf47ca5871fee2da99a053958ac727807200557e5594f30d70ac79433f27bfd51c5c8e0ab85dff1956481834a9dd82d04d00cd9f273ed7b3befb9c9f27007fa8215d3da182aeaafa32f76554d5eacb01ec00c386beef20f6d0892f263abf39bff90dffa2c02d1d0400007db8f44900001000c51f8b08000000000002ff8d5a79a82cd9593f754e55ddeaaa5e6e7757dfea00fb7aaddebb6fddb76432f5f4e9a0f026c92463e2244119d40719a324ff0c1800cd334a0c38222f18464c50440d89514190209a3f9409a2c820320ee24212110091c8b89081a818301b21cbeff79daaea7e33f70eb950fdcef29df3fdbef56c00efba328ebea14cf07aa5ae2be3d7f0a3c2adc25f88afa654707ba4fce0e1e000e137a31e3c6c3fa5f13937d1a9cc4db6b8f87d8df2f0fb5ae5e3f775ea08bf008fa8e02a085bafe5d0d773d2317f6af21b3ea42c07e1145d578e1386ca89c200dab95227aaf63a47a92949a250f95e543b514e2d1a2a3f8ade2cadc5274888001ad07d5547c969602ed5c42c4b15652ac5f0a01ea1ba501127cddc1f9179830094bf2d4cd93ae6b0768e9ac24c6d956bd36253074d6d3675d0e4b6cb26b76c006aba6ceaa2a9c3a62e9aea1d36c568eab2294653adcba61e9a6236f5a8697500821fdd47fda49fa0a7c79e445d774088624f27b93e494893b09a9ce4ba170f00953127c07bd243a9677255837cdf5f5726323d929e9c2bbfa17a997a6beeb400a2dc699bdce926b913774365925a0c1ad3c78f7b4a6d5f3957e6391567ea0e001c007a1960a24132840d86cd01d4f5a36a407511fb000887443860b53d427500c0ea4800b338d023f41cc3b2663c1ae76a34c16c93f114569b4e01793a15ab004d8b4fac061e77d5142a9b60d4444f32f564ae0743323ce4008698102554c700c290c5911e93a10c1d4f72359e82e1749282619a82619a0ac3b4f84a86bfa4005230040433d5d34c3d95ebd1800c0f38a09fb2389894fe6ad4843604410dba00fa3570899309594fe17059fa6a789dfd6babf26f76aef4d30af2fc56ee8ca90088da640cde1f55e34c7d3d778693dc818e9c81b0494a5113557a4e623da7f400add8fa16abf3d2afe6acba0b54e7ac2e442f2cce351a17cb5ca74bd4961aa500fa4129d773caebbdd2c8fa8523cbd28c73c03b1b31fcbf9ba9e7a19879a6fe001662cea70b487ea21699fa7b78de1cae346fa2497d4a2de84aa01c65ea33a0001cf5e7e7caf91f8581ff9c3b0915e1c5a522e2caab469a3eebcec5c1168f1a0025ca500bea4eba47b41f6b7a5fd303a0bbd29531d464521b41df5d5025a04a001859c9000134a6228e13f1fa1140febf1a11e44da52681b9c13c10b8485ffe00ab91c93cf184b116ae9c1f61a5c7c3c29ca5030d0b172d1c785c39b004d0a8000aa097d8dc3db4392417d01a8d711766a4205d8d52fda0041118275e5a8e4c000f46a2318571eaf49b585f529ae14bc6302394d61c64ce1ac64932670b752400d318c6790f528393416b31cc1837bbe74cb3ddc28ca07c1529fba47c13291f0084ab8b19935211369b0dc54e898889e25077c58c40aa6092e1de8c43d6f4be00a687407765206344f96246187b38d634c59806c8d5a09799e7d111134e4c94006f51ddcc7917e0c4f8987adda90895a2ef719552025124d282499369ee4c11008f43121a4b88f075dea66615e10cbf3321c4107f92ca9c0ceb6442d2775a5200f84d6cfdc63bf41be1524c3181dfe04bc7c0474b35e26609fa6ea9da98aaa5006376c9a04bd0efad404f0ad0d05c17d20db0b639a998e6178af1ce086d26ed00b3edc354c43dcac6667c33cab8c0bcb3c512fdbfac9605f0ae05ee1e02b7290041c27eb6c875bc20e7461788d32eadfe1b2a168e7a0e5b754799f317f00b3000fc08e6eff689fbaf549a391fb3fcc7297d83e96b56a42ff8c64c7433974c460005e9a5f80638ab65eeccacea90afd319e44d7559ebb2afaacd2ec16f470bfe009ae0072d90cec4e781f6250678f6d0005b2a8c72a434f0736a96399fa30cf8006682967da2c3bfb33ab4e8c9ab8be4b49843e84ad9ddc50a84ffa45615e10a00bf2b21c4107fbe943997245d92f4b3961472a5173894b58b9da24cc770a8cf00d1551b69b304fd79eb954805b409f60073a6dd39b2b1f30524687d8cb40b9800c982bc57ec5badd1f765b52e602ef41abfebd12a7756b0c68084c6126e40f8004db5a90837f8dd082186f8cbf5a29467b404a93eb2a490677e813cc2a5980200b270015a27c0c7c4d098370bd03a2e9790399710060819cca9307da5d2edc8002a660ec04be8b7bb4280ac9a30140267690324469b59f5d9764b2d334dd996006cc6b7a68c4c81ebed0efd99da15c09717389840d63bfceed65b00df9273630009c4ab2511df2c10eb0dd6a4659ce93b081030fc6eccbfec13f7dbd52ad3df0063f9272b06c806014285607206088b2bbda13ab7a2a69d040838ab5deeac450056bdcaf56a0d7957baac2dd957d5d697e0b7a3057f4df0837640e5736d075a00fa59630171e6f474fd44a140b5e06a4f85510e3a8d7e875a67fa1e65c0b71600b4ec131d3e697568d193d712c1b5dd40e84ad9cbed1908efaab38af00cbf6700428821fe6627736e48ba21e9fb2c29e45a5de050c2a598620379f0ede050f700189d8d55b304fd01ebe9b95ad126c08355603c97ed1dadf7216b3d5900e84d00f4b658bcedd7adb771c3cd8847cc5291b1b8dcde2fc9e2a396c5253b0aab7f0071ff79e1f8d03f3088e22754fc84483e5efad1640ccf9d4cb173d27f849d9300619601d7d1a2dcadceed6e95552ce78a7b637813ab877e85ea361727326a2b00fb8f1daaf42fa88e5ec7e256a37177869c298ad428d50f4ab9dececbfdc77600bfffb023b9ffd881ca1ae292d20cdf168b61638dfdc726d3ff82e09865fa5f00b93a71a9366fc1eaa1ff2d773633c4f0ac8926fd1f76210425e2e6bfea0c6300a43ab3457ed62fe6ce645dae31abfd1ab31287923566260a4fab3526b5090b00ddc0b096f4a5f735bd02ba2b1b1923a78c1a820ccee4ac265a8e2b30c80adb00c8c54ace21443381d18d5b197d7981d117fbcccaf937f816dcc9b597b9924e001c5a09dbd22d39b5f8c97295ab252360b35ae388b35ee388b35ecb11675d7c00c511c70c1504a8dbecb4c90cf6798b81f512dfe17ab35852b811cf34f021ee0007c5d9e2c91483d76a6a553ce1610702cf28d88c06398741ccf741cd588d27006919e52b46b979a08af2d446f98ac18b2dd33c2da37cc52837df5545796a4300745546f97497967bb5d594a4b7ab289fbd7294af70864cf1ed26c0274978d6002c413f56bacc8c2e437512cb4c40ff6005ba4883336281576c7670b95d730b009a3b6a6b978d35daccaecfb69f56dbcc3c01d9b66cc6774619cf31efd9f95500f4bf535d2d806f2f48bb1938651a7573f5ec1cc0cfc9b9b105e2dd96887faa0040acb33922649d99df84bf83e1cf60fe6d9fb87f5bed32f35ecb7fb2a3cf6700701eaa0293d379ce443719d5792e317b557c1e9cd5d5dc39ab6210f10dddeb00b2b6655f553bbb04bf1d2df86b821fb4407a26b10cb4dce1c83e649652591f002914a85246371546397634f0efa9b3cc3c4b19f09d095af6890effc0ead0a20027afed79ee9ce33832af94bd3dbf06c24fa86b15e135fc5e1342c2cdaeca9c00194933927ed29242aedd050e255c8a2932c883ef2a1cea59a6b4c6ae5982fe006beb95488eb449aeea72fed0510b77466d240c1717357205e496b742aea45c0053de1b19555e36197bd9c46aabbc686a49428ecaaba848ecc9624ba331c23900ca3f4744c7f6a487a5ba7e50ca75abb3bf8f70abfb081ea2bdcbe7bc7f92970097624e0cb91a06a9ba9d99afca01d07cad3c007a4fe30068be81fba61ee2a600d74493ab8bd301295d57287ba07c3b6ea7dca3dc71790de5f5cad36baf3abd00f675af3c2a26c551b1678f8a495fbafbb9c685196a7a5fd309d05d69cb18fe00b66b2e585c01551b546d0dbbb4930791f9deff738fddfb957bef9a7defe7df007ae783fff837ef36fff0ee9fbff3a9bb4fdffaef3fde3efe954f2bb970e39d009e3e55bc26eb9766e90b40999b3c05bedcdeb5fbb0b38b26af8277a50f56d7007fec4d3ff9c28d8f6d9f79ec357ffad4538fdfd93cf0e2233ffbc99ff8d0ed0017bef8abff27d679c01aeacbb71ec2f4f4695ef59c16573d60c6e2294efb0a00273ded56e77629a15da07472a7c3ebc28edc93604f5fb8dcb1ccd0919ed66d00516071e68e0b85b6b858e0c3365bf5318b158d8aeadc5f83458fc3362cfaa8006adb4c882665421de63aecbc524db8731b7f5c6bc337c242e08f7fe90d9f5600a0f3c3ce31a6fd61755c5cca62453b0a1facdcb7fafbe64bfe54d0c4e000a900cd7d42b91c3c54ee513864a3c61c41b88f01a79ae52840ff116d6b188a6111008a5093858c46def9fafe71ae8f6d7020a4bd9674f23258b7dfe81617d6a65000601b52983a6fadc32655f41eaba232bec32abef5617c578e84c6568737c6d000732897b9ee2f6291896a2d44ca1b552b73df9f3b212eb94da4992b8cd52305008dbe1d3d19e8293204f6410b0c7a0ae50add404fa189a092e80828fd2370400039c0dec1356d50b479e96e22290ab18b484231e414a0f20d656f87d814b8bf00a34c21f5e59a8588c7d62150f23ad2ce2ca9bbf729b5434f3d50aa87e93fa1003c4eef829d608d42e8b606e5fc0974d5aae162df4312cbdc6708006ae4ab0000de300480d51d1a430f003cd43c8d92ef49bb4700a602c067088f40e89bf588006f114dcaf75c259f24f1a84ae298aa48e29e70131bb1d143e4d4f199c822fd008c208530de5479998b1bcfc8aa4610d5704b6fc42cdf96f77bf47e8fc05eb000c06092489cc2a30dbd501c1d287d2f107379431669c4c0439f67b5e87aa4a0003b94a3e59925c4bc5f506169d04bf589847bcce5ccd528f9aeb4bb2fd7a75b00e9d3873efd661d3a7054bd30a8770471fdc0f7444d9e276ac2c38d5753cdcc000baef169a6098ab0c9771d2e56aab95fc1586cca0a16c0a702da27c042d30a008e30c3893a2ab6054ddc3f2873d40a7227886e954f4775467823c2b2de8a08006a6c416132028181a8b5962173d3fecef27adfc80b1099747067e46dec9d110036149edd50e8c30d850d72b9b465989b8eb0346469e80b0f58c746f047cc3d007013b2a4e14c1496ee15edddcb2a9feec584d1b91fca6d0b45484a964ec71300793d6b0c300fc93c24f3470be62a642421cdf01d2c6a9379bb23f23216e5c5008b179111affcbc1fb08b3ae46d5d20af8d6f59a8225c50b709236ac080266a002109796f2b1610dd8103b598ece0f73d6e0d7a9cfc1dd84478b844707bf8e400daff987dc74c864faa56215dac253727b8be3ac6a6a0236f5a969099e0ae7d00e21342d197106288df6dc99cf65695a4efb3a410a677c16eb0d81ec91410860037f12d17f8e4d6b0d72c417fa0dce6f4b8cd1106070f36309a5db7b98a63350009aa7565bfc2f4b8b6981661b508ebc32f93a085c73c88dab6f7f0a4f95d4b0003f5a1cdc47db6fd1972a0f7fbd4089a5bcc289c7748db0df1bae1fd61f5ba00115fb0a92f9ef0788316f13a7728eec2cbde9628eb9982a31ec0f7ba26f33e002bcf61de9ff356a44f13fd27d62bef2f2d7f97327983d27d0795fbb634df5c00dca1b8e9487677e0ac70b11f550ae1c365dcd2652d665f558b2ec16f470bfe009ae0e75618bb72d9b502edfd97bddebf1f5cf69aaf51619443f4ff22f4e87300870a1dba91a0659fe8f07fad0e2d7af28af96881c375a752763cc44b9ff7250035ae08e5ed420831c41f8c644ebeb5c603927ec392ee63ea3e372c5e3a650a00dccd45f8462ef0c9a99da125a0fda8308f6ad1267c548ee8a327bd049d6d950094f7557c9b39d9bfcdb078a293ad5b6c0a1bdc24e6ce897d81eec1390b0a790045c336b18fd8ec9ec03e89b4f7813ab1a81d8bfa51417d8a5f5f5dc178ecc1004ff7b39d62b78e403a854d4ff7fbf753c913a7cc13a77de07d95ea5b614ef900ba7dd3094c0001f1837483d4ee7f477094f9b7c0c2045ee6bfe1269ff2b1a800c099020872430ab50606d402370813400b8390ff8901ffc87f6208ed575e9800f88f042186071c10815d1404ac7a52d5411044acd6c0bd96f90fdd70282c19005f934104854147c111ab476019d8cc287306605a3b448885b19841787052e100513b186438c8d6238b240a422b579d72d5c1a641b91a418372e11f91ab61bf004aae1f0f1a821c039a80d8b4b38552c5d44193d53ab8d433ff876cd751e05f00bba9facff79fff165854cc721a2200007f020b80000002101f8b0800000000000002ff4d523d8f14310c75e27c389e64a6e40a4094202ddc6e33234ea2816500afa2404848f00728112d3d120542a247fca0fb553c278cc44af626cff67b1e00c74762e74fc4724b74240e198ee409e127b08cbf570f28c959ce6f0d3b0f23000f7316b8c8a5072ec346604315f166a901fe35c5cda2e919828b65995c17740065ed4a4c8556cf6210ef10030a1d1240c12041912359bd843d358cd423256200508487463d7c79d1cf7682294a5d50721aca53a2c7546edd682280468d26d800d5979db5d0d1218a6330b04ce08705b529a128e403ad4a9c43319a09ac5fa8001ce866758ad171f615be86b6baa68fac97ac94345724bea43ae493b7a173dd007ba85dd48eea01d6b6fadc706b1ea7d83adeaccdf94df8f77550210468067b006568b82c0c8d77c4a6719f52c204033a7b8f6e4b50c43e921ee8c33562055a00a9aa75e1d3de45faaf0b802962e4d13e3256304463ff34d87b0ac3035e5d4c003706a5b13c5ca63cc3e784fccf942c7fa56c8d604405e2b962020ecda756e700e7563adb07995283526e0b2abfd262951bde5118db4a787edba5ef58ab6805003cfb057ec91851b511e5a94037179bf4b731e9d5cf8a37b427db9cb0a4096b009f409591f34380ff041d4b3cd09fcd76343a289160c0a77e280d054582e83d0072a2a2b6fff8ebfbafc3c6fe83f0b728cac50a26c84d22768dfdea4564b26b00813a66f1ebe4188c267cbdd1d5ddd5dd5f034c7f3f970300009a397c3700000014391f8b08000000000002ff8d5a7bac6c57595f7bed79acd933b367cffbdc0033eff7cc997dee3917ccbeb40682d2f7a52fa0a52dbd2d7d016de9bba5144a00e95b6b08514c901863d4186385aa3544fe302841515225d51034244463941a000d81fec11fa88df1f7fbd6de7ba6b7e7364cb267edb5f65adff3f77d6bedb500f6a1721d7d42b9e619a50e95fbf305fc296fa5f0f370159432efeaa99c39cf009c7725eae63c7b298dcbe929c75c602e6071a1b990c545e62216179b8b595c00622e6171ca9c62f16ef36e16979a4b595c662e6371b9b99cc515e60a16579a002b59bcc7bc87c57bcd7b59bccfbc8fc555e62a16579bab59bcdfbc9fc535e6001a16d79a6b595c67ae63f101f30116d79beb599c36a759dc606e6071a3b99100c507cd0759dc646e6271b3b999c52de61616b79a5b59dc666e63f121f32116001f361f66f111f31116b79bdb59dc61ee6071a7b993c547cd4759dc65ee627100b7b99bc53de61e16f79a7b59dc67ee6371bfb99fc503e601160f9a07593c64001e62f131f331160f9b87597cdc7c9cc523e611169f309f60f149f349168f9a0047597cca7c8ac563e631169f369f66f1b8799cc513e609164f9a27593c659e0062f1b479fa24bcaadc93746506ffe7ab2c217081cac1fb034260588c0400ae002aaa43c77578ebe9e2490528609c2a1a8c5305933d0e1cdc1a292f4702b7a9003c091449a09010286c112860505e081484407143200f399e5686d5fb2e20d2009e21064115b7f93288e74dd69836e4c78f88c44f1069ec6511b9afd4bdc63800e8ce0185938e29981cab19a96a93330556f34a9b7ca86e3b80a84e00512b1400355091762b6f68ca9cd974a81c15443a90f66ad25e457b4e55235dadf4293b009fe6eb785ae3d3ba9881b7355d7f2785c520558f9c1a07577425d295da9bd500c8ab9ef0aa33589d06aa75561b0a7d1bb86be846a41becab1ac2aa85ff56a3001d39ed66a46b22702bd22df26d6be5b6753bd2ed9aa772cd6a1b6a394df4d0003bf8cb1cc39fbbbbaf9c826a87ea050ce88056477722dd1161bae0ce26d5a50030b91eaa5d567ba2296fbb1a8dbd3e2c0283b87dfd53dc45badb012b3bba8b005a2d520df0ff2658646b25485cebc2c9ffa9baa1fabbc8a9b7159b2a3efe2b007cf00faa7ba1a3e0b40a54ecd038752d46141b74a42e635a8979eb5a9cb2d3008d9c6e5beac27cb71739bd9ad47bf8ef1deb474e1f2a3701ec8e17a90a22a4005d8a54ad1ca9ae1f021e4e07242b20539701ed3e84eaf50710ea5535a050b400d2002af4074334fe580dd9288a0ef13fec0f2267d0a39e5dead965a7ffb59d00102a35e3321872268310c9ff05a225abacdd64701bb6ea75ad623446ad07cf00e554cf1aa3df81a0b462a402c85f85fc55c85f85fc55c85fa5fce85f5305f6001f512a6601a79600acc6c8a8b3a99200bac2c8a8254d99a429c8b0a99300b500a3180f67c00510edb0691b32f8ef137bd4a63f1ce009ada806022631a81e40009101fb0c581df4a9711720ed7755ae0fe5dd9e2b6071cea5fd5c7f5fe5bfa000a0dadbe1121fde2ec1451ebcdcf1908b1a5d44abe3eeabcc1f014bcef9302e0054ef6164cfeb7bcae907b4e025d68289b0fd54d8ead112e24920fe180c2335001881da68386e29673c868ce33113961ac7579cb09cd36a0c1bc1e8ee488f4200e72aa8454b38db1cc010041515574361c8db811e92a10c1d8e22351c83e178003401c3c9040c2713613889af84e17d6a028610c11deb71e8dc1e69819db3c50001cfa98b03a28afa0013701a3a3460ab47c1a5eb8d7e06d9cefeaa2af98d2900cf04960da7fbca7d50419f2723674843344600b4f3ac1a86cef7114a23807d0088101b24d8e8a5a944d0d3b5e861d54b90e3497596cc2c335633735467acce00c52ebc9d6934ce17919e2e505b68dc55b7ee223d93307bb391d5234726776300d240c4b5900c032f74fe04869985ce97a1e66c32df57faffd43c74be1239de000c509a056872fe4ccd25185563103a5f45cfc1ee0c3dbfa330f06b40250d9100ed2486e8a4a81a68c64a6626009b9fc27c4863a8396d278f07f41f6b7a5343006444bae9c91849670d261780bfd7d5496665c40c698880f9a6d745a672be67003315f2cdc8e69bea76be11644bf40d48dfc335ecc7ee4c00d48f211a03789800025802689006d0193ecf6cfb3c9d3e3a926bf5d4ae1e7057ddba830a7dc9960018398d0961246fa750506122d1d574ce3aea6e8c6b3a841b61b4a017629e55008d71a8ab8ca20966137d2352036654a78794e174020f4d3bca8bdd8847bb8c0084dd0e9a216888d9ce190e1291fa1b91fae2a7aea82929db133776b9c886ed00366ee41cb37123125c1fd2357b9b342f6e049bfe50d315433a00536c3bccbc0088071d8ad3a194e72a2fd4d7421c4ca6438f8c991abae3099ebd534de289c700d3480beea43b8e9c31e2b1cf8eaeed88f0d517a969da51ac2a1d3124379a08004d867577c4ae57d8aec04dc7e226bb8d1be11293180137b82643c8471fb73a007e22f4e9c4b41d9a96c0a4426379768b7d2649523000df391d4cb63d0faef10002fae00ed591f1003a33bcf8e529fae56ee8d6b1f81f4ca9e31c74a7f3059e003fa416af173cb32db84d0912f6d339f03627e75617127b5daafdb8551bc980000b9741a87f0fb800c36740bfb34bb9bf4447fca2e52f8ec8ce12b8ce52b87a007a26994c90bb106c80b35a44ce06f9de94b3974e6a1d3e4b6bd3b3c86f478b00fc0d911f7dfb09e6212da7005167dca5b1fe2036a0ea320a6830eae151d33f0056d350bf4c1d704d455a3e131bfea9b5a1959ebc3a484ef319944e8ddd992f00d1f1cfd532edb8c4ff523a62486eb6109a33769db1eb5fdbaed0cb3b02503600115b1233e8836b0140bdccc06e797e22f4b763f7288f3e81fd487f306382fe002e12b4fe09d22ec4eccec97bc967cb159efd8b5ac562ce35de84ddd5601939004b78a3c78eaeedb8878effa1f6d28e7bf8df938e18925bac84e68a5d57ecfa0023db15faccceaa8f25b18af41cd70231f0132686d6cc4f847e2d9942669c420018200bce380b18ccd5a96d07d6303308bc807dbd25026419c0516ec13a0a8600409bbbdc65db582d42b70cdd166cc6b5a28e6bd05dad433c6fa830167c710400c044641de23f5cad21f89a9c5b2b48bc5c91fa20e6a8f73027ad3aa17b3e0200040ca7a0bfd8a5dca7d4327417967f77c900d94380d0ec20ce00e1ed52efd1009ca4bed2a1040838ab307256a2ab5e467ab982be4b9dd4167c96d6566791df008e16f91b223ffa525299db212de3bf35873a3322ddbd385647cd39dbd360d40083a0712f57abd0bd9b3ae05a89b47c2636bccadad04a4f5e8b75e4acf7a074006aecc57a1f1d4fabfdb42356ffeebe74c490dc5e2834f7d8758f5d6fb35da100d7f20840099798c41ef4c11576211f71d65afa89d0f75ba4476a499f401ecc0002c3992cef8037f7118b37992e8926a2ad2b687bcca28d8b7162b7b31043760005721b5c92c5b396c5595614d6fe1264c0abe6ca6bc9595496b462f8d11cab0024f757d5cce2683e0472e79311da7e0dabcb0ce74f701dcc93d5eaccae5659005d45f22ee3024dac6ee30ad575242072d55ad61f21aac4174c47d4f176add10018ee23bf882135eeaa5b77915e336d67a7c9c8e9d648344e43f4b28e38cbdd0018d71a93610bf11eec85eed7111cd3d0fd2bce4e93315e4dce51e3d0fd9bc800d9c33ce04c03ccdeeedfdad91b3d1137df2a318c215e26003bf7ef2367b44a00e698e5668e590aa0648e998ac127e91c33b1090b8f21c34ad297ded4f412d20035f7648cb8a4812003989ce548cbeb4aa4474b2c23e74b790fa134233afd0700a9d31747387dbec9aca4bf876bce955c951e9a6f22dff6db133c11b87b8b4800ed31e2968b155e71562bbce2ac56f28ab38aaff81527935150a01ae786d07d000d1c7a44092269ee2218f6067c9d017c640932e212644483fb6a6cad3be27b000e7465a25a4e61f84c434dc2cc5b6161c4c9689204f892019ed94d037c6203007cc9b8c56a693649027cc900cf8cd3009fd8e85c26013e0e8566c8ae21bbee00a5013e3d22c0eddb9b2501144d882684c35b25ff4efd44e893095aa6440b2d004959a622f4db53a1e30c388d85de0b81b63058a3cf796a6d678c15dadc7097006da7d53acc5c04ddd66cc6b54f1d0f4077ffe010cf2f5787b1e0eb23322eee00dce3fa10ff87fb0710fa809c5bfb9038dc27f5eb628efa3826f5fd5598791c005007c31b417fbd4bb99f556198b9d9f21f8584fb71e086a60071e2665fe2eb0038cd7920e17a2870e7d6e261e4eca7e187d086ed75525bf3595adb3f8bfc7600b4c8df10f9d197924a18435a2e6e5a63a8331d539da76375d498814d83510f0071f02fa9fd30f33c75c0b52fd2f299d8f097ad0dadf4e4b53e889c83e3503a0035f6fae0043a7e419d483b9ec0ff09e98821b9e38742f338bb1e67d7dfb25d00a1577804a0844b4ce238f4c17508403dcf6cd60afd44e8172c2a9117e9136c001dc9ab87f6eb912ed5902b32d84eac202e0bb2e79389e408012694945b4a36008a4a2ad95d2ad9dd2556fd6467c99784ccbd4e7fb373ca5b5fa3b18e5574ae00cc5dc8b3bc15fa85cdce849bee4cf0253a7b769aaf27f2c63bbe86fa50ae550042aaae85997f052aeb61e6df60ddfa0e779a8e61a729f30ab755113ceda00e005bfd97aac7a97a27ccfc003d7776dbfb2af72af653333f8a9c4c9b2255922d00b68a88c4dbb6a6f132be6c3e9604bbdc2bc6f655fd18da8ee963913e56674d006f6aba0ee99a76c39236ce348e45ce31ec48d633e895d1789aa9639fb75c830068d982150df562b53ca47db8075cacd56bca29d76be85151b5b847b68a8d0400a719b0b56e5b45a52c9add9d0655fa2e54ca72d7d8ddda314cd4c1062b761f00a1524efb3062baa59db5bbafd455972f85ccdcb2260244db3238d7aa90d8a9000759705ea96cccb91966d7e0dc6c4091dcd7553dcc1e7fc35e65b59e6cd9d700d28dfd9a1dfb361e5104f04633a89cc0162010013abfab2a61961b85e98e6600e2144a97ec66964529ab011acb0003f650b9d72ca44f895895b7a8dccffefa004b469541f7b3a47b39e8da41847ba9518c9c227d51af56a0d9d5aab2d1ec1a00abd95b88e07f7e41e179ee61aa78bd7d7c43aaf88d6cbde92c8a9713c5cb5b008adf293a53a89f53e5307b77a26c908c0f4459866110872194e56dc046bf0c00eab88258d9474594c02a9b1723ae5510661f075d3ba88cff7203b02d5965b100c59cfd05156c947d2ed5a6416d3e635b3f9bb4665f63ebaf9ca12365dc72ec00e654058d010056c5558b65fc4d2155b3321614057845d5c2ecef507719242900a081f79fb29591207f3e0539487c3195e6654af387c86d26a6fea2a58e475f0021d12fcba98ffb0ef93f40bf26cc9b2b60733457ad0514bb9a885ddd121b8d005544435d1266853eaac096d96f283f4eecb190cd0a4e17aae726fbad3471b3005545626e8a61bf9518b64ac9c81df6ca05e262615cdf30b65149c6b055c59700e44bc63ec091fd9e2ac78cebd6834dec9dfb1bc6b52dc6d4fddf136b91f11700695832f7c9dc2f9fc351658abb6152c2a01faad2ebcf35f4f65c246c6dac8000b90e7c611990a564a1ff8e59ea323c11d0cfa22fac9d0f44693f01497d031200ab34410210d7ca122694a70c79729e95c7665ce14b4804a234482a2b814f09007c583b574baced13b089b5fd7a90a48bfa265d58c671baa894642224e35211008446aa98322ee2bfd864bc94cf4dedb6a53a437765bd63d57e8ea146e66532002f97c4da258edc589b4cde6a99c0dac111d6167d63e6b076d93f83e53b629600ba145bfb514c2841b32c1d68bcf3adf1d05a6e95d0da2a93e9c5962944a43400b29554f20a7870993d650297bce6e2a050c24b9c57841e45e85e2b6654ae5400c4835cb9508c74b11eb715fd42a40b167d05f22e90cbe9988b2a30c3253030003448b95e7a536f80788d47d54e91862a62b72e7757bacb58b7bb8c4da6ea8d00374ac25d3417d83c64350731e6e6040631e362c2b8b8c5188d452c252a9e1c006c90b1d8e4e9d426756b93a6d844181753c645322e92f16712c645ce199c5e00c8bc44e6a5e239c9a8f2066bd4eef3563bc0a072040c0400b1d6006a795b57004e43bf1d4f53f488e87b4a60504971f2fb162768ad087a5a15b67e29468f2300096e40690241fe8b29f273167c81201f7a9471965a2bc3e541190f7295622000b38e530bd8e61314b52d7b301ebf96c423edf1b6c411351b8f472cb1ea6cac0000edeeebb35feee523b35f451c5139231e69957f4a266f06c61a8c7770869c0073db728ecee5667bb3dc947367596e62a59c95b99727da3b35127ac512b2cb003fae157678405d17c6905835d1b6d3425e75779a9c317f982c2e9b5c89c172006d926af3d18f3151e5eb5c60e2aacb5292cf7c62e07fce44f88ee81739057600746d47ec05e7b5dd0b968e7260221d3dfac3139a9caa762aecead9aec055fb0088170bbb84b624649ec31e7406f2893e6d3f163adf4ef46973b14c59bc64b100ee6d2dd63d6ee6227ed2339c3617f69a0705f50e8e6cf273fb0180749643a4007ac71efbd620bce307ecb31f7f24e094d0e6fabb6cbb00473df913b003d42c00614889c7356e9f3b5e3cc3cfbf2d3d19f38f782b8c8f7fb9fbdaed73935d7600a2395f7468f6fcbbe2a30ddd4312f34b61fe762c21fc307f5189fc69c47b700050913f65f967e465e5880f2a3a9ae77599be1c8e0de4cd009cd58087dae9c700193814f13b3aa9f97c96d6ba6791df8e16f91b7d7b48d081a45d79e381b4840081a8531775ee4a4e6a7cbe03d160d443ecff00edf839ea804b8ebc68435f6c00f888b5a1959ebc7c1e786163a6901adbefe39438ffc499df4648470cc9f5060042939f51f8fc8c22ff5cfa85c451274fd62f96c4804734f000c0f739c2434e009eacd09f8f01a13af40991d9a6b23b5cabe47fc3e65ac2cc4bde582d24edcc00e9ad327685a05af640af64a1ca979db80743a0c1335a78a38334d7f5a4bdb70039de70acd4ff68bfebc07f0e5ed590d9e96fa8f18b0778b1dfa5d53435e349006f5fbefae0d726ed7e0ff27e35feea43f5f929c449c7b8265754f8e3374f7800fe97261fe6bf0116aec986f9ef9ce4475459473eb4ca245f5c15f8c555c164008cc72fae3ce3f18b2b14f2c59567af64b32dff6de3d92fae0aa6087645fb01005656aada185364b500ee8530ffcd130e9525e3031944a130286ff2f25d1658001a3b35094d03a6856d093139c6148407890a8fc2d62097836cbd6825291acf00ea55a25e25b02953afb229532f14a257d95ea95eaf9ab2488e013e44f42d35004faa206d7c564be08208f9be7d9437b983936ae7a59d97fe1f25258d5f59290000009e029ef9000001571f8b08000000000002ff3551cb4e03310c9cc489e300a4c005097a006e482015babd64e1c0896d7b40487046fc70bf8af1ae58c9de008c1fe389334042dc41ec000c9098e9a08fe0a7b40cd8fb2dd4269bbe896d5a000c9116462621a347d233036723c8b43f78e1de0bee669ed997b77fcee2e90100216843302d4fc025ca31b880108cf00a698112526731599166794a981c2a8600c02c8fc9835a06866a8fb5f498cc2f513b6adee0be4172f5215b940d1e7a30000a90122945b4e61eb2759857cbd69337d0ac6433926b527975dd424bae47cf0048a78d742f682e92572e26dc20a2cd4b38721fd91b4462a36f592949bdd90700e7922ee893534c0b458f4209c9c58ec1c474c52d2af95cf58751f52739c55800f03bfaf272707e17b89b0ff59c0dd592b56b6eb459f317e36f7eb1b6d8f2620024fcb1c676f38615c7adcc1ce61946335b39ac9c5e37f8da0521a30fde8e58009fd6a73f25879a5d30020000b09b434a0000019d1f8b08000000000002ff3500524d6f54310c1cc7f97012ca09a93d0077c442df5ede03214e2cdd13423d5700eaa1aad47bd55fd95fd571b2bb92bdb19dcc8cedb74025eca1760416a8663a00942fe0afd032607f3e21dbc10eb78ced300d81261b8bd0cd3391fe2fd277a6002f3610efe6c6afbb93cf036d78fb7d46365a5d20620d52ad7c033ea01cc56500885486978833cca1ba345b8148683e5d44c58f313069650d95905a024fa92c00e38a171b8fa1ff8b273aa76db44e48a4865c5224192a15c4da49f9157d52aa00d4335bc54061583dec83dc8fd593bd9192562385e41d7e3468b644ac23d20e00bf5689531a27e9855552fc881ccbed7910e53c4da68bd1591cb578b2515b1100bd53bd265ee29dacdc4dd1fad36f520cd435b777e468dec8ffd90837914cb9005e048bbe9b7bae29e1a49ebe676a579f93241798f43dbd3ac4dd8498ada9b700b689a9e5cee566e2f9c61eacecf0484c3536fbb2f9a093900e46e9fb71a817007c502d5abb04976dcd3f27fe8dcfa94d9b4d12f0d91a9f9b3fe8a4eb661ea600110633eb1e56b2d71d9ef6a24474e2eb0d57af57af6f25fedec1cd020000b000e964d5000010961f8b08000000000002ff8d5a6ba835d7595eb3d6ccecd9b30067cfbecc3e73f6d967dfcede7bf6e59c395fbecfa4f335977a4b1a6383a5510091a0a452f1021a342dd520464825a65002b6847841d1828856d35afd21d51f00d21f825a100d49a94154224a9578a3681a4b519fe75d33b377d2f3951e323b006bad79d77b79decb5ab3d6775d1947df50267840a9ebca78017e5473a7f0d700c413e0bf7b27ca0fee0bee7b88fdfbeca3341ee7265e2a7393232e7edfae3c00fcdeaf7cfc7e8b6a5c03497c3f273d407660ec340b610909aad026f88a21f700cd43d795a39a856eca78588d8718f75558e8309892b5fd6dbd4d598d550b4f0084a94e2b544ed40a2e95da402547a93949a250f95e14a4ca09a2b1f2a3e82100192d1fb18c2888cc36e6dea1a25c5dc7a44618a17bbb8ac82a777f44b835ce00f81b8351dce18c2eb48ca9659736c61cea61a8cba11e6dec56436e35d4743900d4c7508f437d0c853d0e2518ea7328c150d0e7d0004309870644541de1471f00a37f749ce2cd806f5275dd01219a039d16fa28254dca6e7a54e8413256c61c0041dfa3015a0353a800f6bd3b52263203921e5d2aef7fd52057df5738715438005d5338fdb470927ea84c1a24a0718f09ef102d7372a9cce75492ab471146c000650446a3f414c89f364780ebbd6a44b8a8fb081a9e52c311bbbd31ba2376c700a2309b233dc69bee04cdc97852a8f114dca693197c359b41e5d94c7c352b1f00f115643ca566800c5160a67a9aab270a3d3aa5c0430910088668a13b11816c008ef5840265ea645aa8c90c0267d33904cee710389f8bc079f954027f51cd2100102a98999ee5eac3851e8f28f04002ded316074c15ed5153fa100401b0fa75004849d2e91d0863fbd753d5df0cb19dcfa9d4d9a5d2bfac60cfc70a6742208200e904b23fae26b903b79c4e0b07183923119356a6a6aa8a9cd4464e155b898d002d7617555c2dd87597e82ed85d0a2e6c2e340697ab42cf57e8ad345ae141ab00d00bdaeb7db599e19533abd68c3c109ded04f1dfcfd5cb006691abbf81998b00b3252ccfd432577f87c85b2094164d0ca97f504b861228c7b9fa47508e4f160097caf9b2c2c4cf174e4a20bca40222a9a36aac2566171260cb078d1230d49200d8c9eb31fdc79edef7f408da0dfb328748a6c11878f74195822a6566a5986e002604a29b4ad48fa10d828d4ade546a1a981bccf0c04529f43354454f2261a200452af923adf4e4b474671540a7658896013ca9035812685c27d09b7cee1efa001c968bd21a83491f6ea4217d8d5678d08209cc136f5ecd9c1fccc4e01cce0900193789be456b86279dc08d00ad39ca9d02ce99e7ce5b01c7fc6c06389e56b300dcb91ba8257063d2ec63e81b54bf74639a3bdf04caf424c1f0232822ce7d08007571635a0161abd9a9f8291533d13cd57d7123345570c9e9de8da7ece97d4f009f42bbe148e608f8e24638fb74a2e98a091d50a8d120372fe3454275126af9001ed5cf9d27a14e8287a5d76569486773bcfb2135a7050224ca8299a7b3c29900211f4f49682c21d2d7f931755613629d3067428829fe742e3ce7249d93f471004b8ab8496cdc788771636b9b6581d2d3c733451978929e6a2771a5f45315b40009a1ad02739e12df0fa9a4d465aac57f73d474ea53ba2605cd47542af30104006a7d72c2b1df56e0f51c6c4b39cc1ca08d4bf0ed2f5778ff2b6a552a9e5ac500dd43c56d4990b4ef2f112f4b4a6ef7a171d227f7df2c25ea057cd51fe7ce5f00d8b878be8e8b171917bf6be54f98c8de61f9426cf425181752c904e995c4060024ab15ea471dabc803274d74d54bf9aeeef56fa1bf9d2dfa07a23f68a9a9c4003cb4a5f7db3398339fd19c174a73d48c59f08680fa1c03eab5c3802286a96000f8b71643ab3d65a5284ecb451550963003e13fa9ac26ccf09b0921a6f88b9500f05c907441d27fb3a4b708285b882d8b05ecc1b34240bdf6a680fad261403d008f3d00f98f172cd028a0b946f860ba932e293be3bb6c8d77be5a976a2ef51a00bfeb71563819bc3122a1b1841b10c66a53136ef0bb11424cf1576be1b922e9008aa4a925853d8b2bec1129250b2c2d5c80d629f46361682fe24ae965b5842c00b88430412860b102607a57633bb6c02ca0f00af8f6332448d684a3f475eb2800008131939d70ec5bd52ad777c0b61587f1ac69e3167cd7db1ddedfad76a5e200ab2b024c54866c6576eb2d14df52727b058db31535bebfd4586fb026ad925c003f8a0481c007c17f7542bddfa7b25cbfd3ca4f3326c806094240c09c09c26600a63784732b30ed24412059ed0a672db6eaacd0d91af666baeaadf8aeeead6f00a1bf9d2dfa07a23f6847049f6b3bb465feb7973067c148d78f9500aa25577b0002463b24687e42ad73fd1c6dc0b3166df94e307cc26268b5a7acd5b670b61b00185d83bdda9e83f029755e139ee3f75c0831c5dfec84e78ea43b923e634961005776454059bf58163bd8836783807a8e79d3cee24ae95fb2915ea88c3e813e005805260bd9ded17b1fb5deb3890d74196d8944db6fd868e3869bb9d85f0990008984dc3e2e29e2e356c42d7614167f09ff4519f8c0df99b0142e25f2978b2900b8fc919a96857612567bac3f460a9baf439581d4f1b2daad2eec6e95dd35ba005c7a104dec1ec615badb4282c8a8adec3f76e832bed44ea28ecdadc6e0ee1c00fb0f0152a3151eb40abd5d54fb8fed7eff616772ff01d04371b7be456b8667003b45a8adb1ffd8e4fa5f64ffa15fadf61fe63dd87fe87f2f9ccd1972f8ac8900d55b7fc1aedea044defc57c434c6026cdeaace72fdc5c299aeab3526dbaf3100990494ac316702f8bc5e63e6b660e13574584bf9d2fb9ecea0dd7023736411000f90646b046e36d5f2b982853cc3367299c97708b599c2e926a99dbebac2e900cb7d6525ff0d9e257772bd15d4e64bd477aa6de956642d71b2ca0ab5da40c800265be31367bdc627ce7a2d9f38ebf2293f71cc858201a1cd824d6eb0ee2d4700364a7c87ebcd7245e3c6fca6410cc9aa3ee5aa3e25ea58ff2cc4537eecc0e000331a7606f4cd3d6a9e9bef01cc6778e6559667cc72f3cd7596cf6d96674c5e00ac318b7995e519b3dcbca3cef2b94dd1accaf2d96e5eedd5b21949bfbdcef200b32bb2dc069265816fc8399edd14fa49113e8b2ba5bfb70a9933860ce1a42e007351fa076aa5cb32382f95deec1072bbe616348faaad5d36d61833bb138efd00acdae6e631d8b6e5309e73da9883ef797e89f78fabcb52f1ed1565f702922e00343e8acce5795ef023147cdb5b68bcdbd2033f537a405f6065dfae73f35b88007708fc20f86f4fa8f727d42e371fb2f2a73bc6fc05828750803983e75cb0b900209cb9e4eca5c43c24abcbc239af7310f90dec75d5dbf25ddd3bbf85fe76b600e81f88fea085a6e792cbd0f6605f45b09e2f01e4be4abf4ac06807cbb8f97d00759e9b1768039e73d196ef04c34f590cadf694b5cd0b27bf80d135d8dbfc1a00083fadaed58450d25c13424cf12f2e85e725492f49fa67961476edae0828eb0017cbe212f6e0b94040bdc092d6dec595d29fb55189e2489f142a94ef0f1dc5003833eaa260b838a8912320b73a15725575bae4dad325764d75b264a41b156c00e3bf8827649711154fabf328fb21c5668c8f579562d71b5df96d57e898a2bd00a89a191dccc46084a53db4df8857b6f6a71a6e7daa6137dc3a865d6dd8d73400b91bc846df0dab8dbef7d3d8e8bbedc23103e4cda08921b767bf592ca56ca5004f06a0fc4e9c4ec130c74dab2ffec1febb7760bf7b697b5fcec07af5177faf0070063c2c3bd6c7853e1eb0a7f73d3d8076432373f86b02172286a032a032da00c037724066aa433773ec56b2dd834337b0313cd2d3f4d4c085930c863cf65c00be1cba6f51fef5ef7fe7fb5eb9f1d1dda7def5f63ff8c0071e7e647bfb3f3f00f0937ff8d847ee7de5bf9ffd4f89c4db2d8e5fbceb6d60cf70a52b8ff7aeb40096d0953d086490f4b4b4c07df5c127def5f4cf3dfddec537befa1d8f7cf885003f7fbff9abf73ff9c88b3ffecc5dfffac9ddc3afbf249ffbc7ba27fa7671c60047ff77353f2174a70aaa8e88e9ca9bf8dea3f2984abeb94b40632e16783a740036b81cf12452e394f1a8fbc61e3cda69e160d1fd6e75642b6117734c07c27400a7fbd57a221d27baa6151c15ce51a744e5775e7bc74b0a6cfd4eb705b63fac005ae5a12c5634bff5963a04ebbfff7bd39f6ac4ca6f355c4c7e4cb99c3c56ae00df1a73508347a3b58f63a7e6e20778efc31b104297c455c6c58295848dc660000cdd5bb5155e47c6793eacbbdfe696c7d471091cad884303884cb30b759e5600ddeac4b45bb19774bfda3318ecf478625ce8ae3dcc759fc52213051d64cad700ab4eeefe3c72ca66af6814106103434dfcb5e0d48979b44dc57ecd2a069c8c003def064ea6130392d88796bedf893112373aa0e87441d18de9a0589a42ec7600359b862c4005e781a06ba0a9fb49d529ad369dcaeace01a8a599ad3acebd9e008cb354e97e0d6aa78cd23e2587bc0068353db0ffb4f2c8de85381f371b7edc00ec5aacfe44b08a81d546c5b9fba7d50d44abba8130da2be43604955ef461b300c9410f1521c4d36c59562f09ab10c1e136c1afa7c2dcfdeb82b710ca84da5300bc5fc159ba91200bbf16ec3d601f7a06fabfa24c897d2b1c731040b6bc10d800877e8bd87b2146c286070a4f281abce668ec895d21f05c10b8a0c20410842e00c1f9420d4ee80348bfe186d6a2d7c42226d897542b77ffe736de97505cb3d50020327e05942fc8489a72d0f7808c47283dde2b78c832af61b34c48a414465e00e178fe5d9256bc48c158d4f6b144467e03f41dd5b0b5dfa7228491c23d0af700cc9dc288b7547b21f4e1898acbc539b48bb33e5c9ccbf4642a40b86e7a223200a4c8901e5ba9a6dd34197834a4472912f40862a6bb6e564b62f36049c4601300dcba07f6c263de1dd663422282c5dee65dd5dd5a4b843729bc0984bd7b6c090003334625c28409127519abddde9dd52581dc1ef529a4cf35f37ebb40c2dece0015f6da5c91a53dc2616fb72f223b14c984f61eb2095de81e0a47878503956100c0657640e60f6341f61ec71a8895d29505b5c3771d02fd6e0bb4ec1a0486b40053381d9cb0f512496121c47599f783f6ba4c0823ca174262da8fed224dd23e00497fd492c298c1153bab72ff212cfa729a87ed04f49313ab415c29fd53d5960061c02d830838b8fc80d3ec4e07837d6cb61a962b5a9dba3588a5b253ad986a003df31516c4b81883a9c61e9c92e6594bc385540e4e39f63cee0dbd5f20221800c6942ef763e694be3bc54d81f7abf54d4172c506b9bc0ee36954c403479e8000c7723217f364cefb587932a747a8854937f7fe52ae96bc4ff084e1842efa2c00ea99f77b56be4b9b3cde1f44e5fd019088c462de5fb8e41ee9b1ec942059e100903caa01e1256082d25ef612beab7bd12df4b7b345ff40f4e7b6125b4ed9010042db371e347a2f1e1c34a2fa0030da21f8bf4c1c5fa70d78644f4b0c13c1f000ef2d86567bca4a7801800fd55e0d76728a5b33eff36a5213ca3d8010628a3f001a0b4fde5b262392fe8725855df1156158de1a0a0b9c734578c608c3d7e50b00388e2ba5bf5c06848ae9136e8422c6e8d100a7c4beb6a7c4722f0b971cedf7007476cb94eeb89c6133a9dadc7061db633796dca396147223755c38dcc5f6b100314a52193fde1f633b56eb7b44eb217e7d7582f9278533dc6fcc86d8f922910086f0e970bf171e4a9d18b24e0c8fa1ef521d5b6386bc29bee90426c0a2831f00941b946a7f173472ff02224ce0e5fedd37b9167b0ecb6d00436e48a3d9c6840066e006e131540b8390ffac00ff937f5610daa73a7cf0ef0c424c0f38a1057100ad2060d793ae0e82a0c56e13d29bb97fed86436329f8369944a530a91134d8006d4064602ba3f00c20b479a8216a71c9416490a9c8681e4c329c64fb2dab49002b08ad5d11ed8a20a64dbbda419b76e17f6257db3eb55ddf15b445734c88a100626cb985d205eb206637829428f71fb4af1a817fdb4d35fcccf033ff0f50f8007382ac210000c1095e76000001611f8b08000000000002ff35514d4b04310c007d6dda34edaa17413dacde0485d59df5d041c493fb011e44f12efedefd55be00cce040327d69f2f2920e90103710db030324663ae83df8292d03f6760db5ad006dbf886d3b1b222d8cbc848c1e498f0c9c8c20d36eef893b4fb89978265f5e00ff398b5f0f08411b82697900ce510ec10584608417483394903a93c98a34c90053c2e4503104def2983ca86560a8f6584b8fc97c88da51f30ab70d92ab3779004259e1ae07a300299152446bee21db923aca922495a76a1de6c5b2ee73382b00c92b7b695279f63184965c9e9e905d1bd95fd05c3337504cb850449b76f2ce00f5642f10898dbe65a542f562d7914b3aa34f4e7198297a144a48ae7d0c26a6000b2e55c9e7437c1887f824a718137e47df650ece6f14b8990ef59405d592b5004b0ed6acf903f2373d609b6d7e4012fe5863b979c182ed16660ef304a3992d001c5676af2b7c6f8290d11baf475c1daf8e7f2d935b133f020000d6421a4e00000001ba1f8b08000000000002ff5d52c16e15310c9c6c126792d09e90dac383003b62a1fb24d805214e3cda13485cf800240e08893be20ffb5330ced24a10c900ded89bccd8132f88613a22f2065810a3c9a13c81569119c0778f603cf1f44900314fbb6192854d3f1137cf24f9f7c8cf953edb20bceb6b3fee2e3c1e68c3f300ed1d32657541086c0895e519f010e52678194a2abc40da43337a69750592a00051b184187c9b26256b59270a329649bb5c9671c47f366da7fe2139d55fda2600eb82446eb09293c8e0152476513e45df2963e01d1b3150d65172441fe4bea500277b13a58c4985d88c570dd1aa97ff119cf16615f2383b0aacb6064b0758aa002f5ddb7fd7efff16780edba539edd21c90523d78721206eb8b7b90708f223e00aba924b597d4b5b1aab4e43ac52baf46d72dc39b8faffd7c9465efb83d50e900cd65f8bccba07724a386036acf5ff6ab1e39fb852841e4bb8dee875c0a8df9005c3e3bc4971d629da2d8b30bb305465a9716263c6fea1bcb8cefc28ccc337e006d3e1539383ea5fc716cea992e5426b60b6854d87c18f519c3d876db875180003fd9749d7ea18bae931ee6114e24bb8755ec75c68f63884274e2ab0d97b79700b77f00e0c142bd0b030000eebbc347000002cc1f8b08000000000002ff8d5400bb8a154110ad9eaeeea9a9eeb9a9062a468278d55dd07b513072dd05416153007f600353633fc140d01f30144373c16ccd050311ccc54fd0737a66aeb2183800503dddd555e7549f7eec490cddbe443b12d993a83d1ab1ab82cf603d7ef72f004ab6033b38a6ef6032e960618b49895b7a14ed0349680f25dfc0e478c8f023000201320c9b061865904d178daeb8b8225cda5cbab814494174f1ff15ba27590022212eb51a5b3bdc5bea1d608ed430b8041fecbac8155411442e33c4a77097003ccd5d9be6b8e601c01d52632c0b5991bd1003bbd6c159eaa6f38a51edd04b00b5f92b32baf191cedc0556b97a50949850445212dddb11850478257ce2b033000c1387d6d8d84d749a6391b0044d867e2d0f5d623fb0c040c08fe26b79bc09003a25385a1fca2614bd2059fdb8ad76b6b657707b4293b4cde96c6d8e822580003e115daad4a52c6d55fa52b4b72ad9553abda04a98a6a9ca9356a5424b8d00007c27ba96a71b883025ecaa9c2ab98dbd3cf3fd3af389afb89e02b0675258dd0005d1342db20386ebad1d48d8a124c37c2a88caff4552495247903c977126c9008da48224576d78c0c95ee15675cac939ad6e54160bcc253b2334efb29d272d002b705f4cd22a638953f3acd8cba65846c86bc96b797513793d2362d645f9fc00477976f3a27c2adcaa5281502a10de483d6a2220a41dd49e5afbdde5307017007ad3155a75c4bf1567fc469485709b48ce45442f77643ecfedcc45924492bc009f48b680b38897433a535ef82fb8fb8909b1cce4b8a61ecf507e9829bb922600da139c61aad9272a986aa3e5154aa41d493bae90f8495633adff8376ba962b00b4ab7e843063a34da44da4fdbcd0561cecc4ebb40d162d17dce10ca81e315f000dfe6f808b96d6f273cb272505308941b8fdd61946240ca6e6e724989bf36d00c4afbd8d3ed974a700f8c31ce9c68402ba62c6616ac3cecc0a8703d887b57c00df0f118824beb995f3a7e74f7f03d71cc7f99a050000f851a440000001571f008b08000000000002ff3551cb4e03310c9cc489e3a4c005097a006e482015ba00bd64e1c0896d7b40487046fc70bf8af1ae58c9de8c1fe389334042dc41ec00000c9098e9a08fe0a7b40cd8fb2dd4269bbe896d5a0c9116462621a347d23303006723c8b43f78e1de0bee669ed997b77fcee2e901216843302d4fc025ca31b80080108cf00a698112526731599166794a981c2a86c02c8fc9835a06866a8fb500f498cc2f513b6adee0be4172f5215b940d1e7a300a90122945b4e61eb275980057cbd69337d0ac6473724d2aafae5b68c9f5e819e9b491ee05cd45f2cac584001b44b4790947ee237b83486cf42d2b25a937fbe05cd2057d728a69a1e851280021b9d8319898aeb845259fabfe30aafe24a7180b7e475f5e0ece6f14b89b0f00f59c0dd592b56b6eb459f317e36f7eb1b6d8f26224fcb1c676f38615c7adcc001ce61946335b39ac9c5e37f8da0521a30fde8e589fd6a73f333071da30020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001242ab1a2bd6d07d8d61ea56d85861446349e52c6b7c0612b702cb1e6db6ad0b089000001000000000085864497636cf755ae7bde03f267ce01a520981c21c3682aaf82a6312e1f4ce0bebfb68ed9ff8efee9b19306213260751a4d2a2f557be6f5e765d4360000000000000000000000000000000000000000000000000000000000000001181f056b799b412069176d9aea82249cf1095821c6371bebd35aac351b9253232b7fbd849f92417221e567c919124b68c52f08deee4ce6c5d7ad71ba349937f20f38ff6e186556c8b618142d34a1a6358c33d48e989c264702fb21a36b3066ed000000000000000000000000000000000000000000000000000000000000000002b1f6aa32fe7f19e158e57710447737f502f846e394cf5333f0e02323d0317f00000000", - "13b17ddf4a3709b147c1417b1622ef4cc79a06616bd9ddb158f11ab563d391fc0000000600000000000000000000000000000000000000000000000000000000000000020077f77be9c9d3dc51cf83530ef80fe5b31a9fe22a9137acbdba17f2525635ae00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb30000006005c09d13a998cb242b57ffffa79d75aaf2a3d081c22ff85897e7ef9a5fcb8c2500000300177fff32c72f88b411cea8ef489d821589b24a0f219ce7c0e6f7cadde418540c0000038017ac40ebf9733f6e07e35d5d086b61347430f109e37e19a281d9be6a97793550000003800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000070dbd9880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000caf43802040e82dd5266aebcc7921e1c5244e3260ca8f1dfd8523f838226e43536eb73f000000060000000100000000000000000000000000000000000000000000000000000000000caf4380000328e73bb1e2c01a1559fbe837ae5424fa29dc62369b3a651436a248b23edfd385129ae734059c90ea1aaaa58007a2f1c92adaead59be5fd3f57b6af2fe8d648243056906b9bfc3b3c5e62ee221aed10f8163dc1ec55d1ccc6b295a2e1599bd369000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c5f0000000040000000000000004000000000009c5f40009c5f00009c4c405d15342d76e46e5be07d3cda0d753158431cdc5e39d29ce4e8fe1f5c070564a0009c4a0000000006999d1e02b08a447a463563453cb36919c9dd7150336fc7c4d2b52f82b342271eae42d0afb6182a99d3ad876530841583fdc0845907de3159809bc83000000000000000000000000000000000000000000000000000000000000000100bf8896e9ee636b27cf5478406ee1322588136d3eb980d0bcd4927f541093a407c2dd7990f8f46e2c2d6369734265adfc029f4d5cf8ba41ee15e0e277a76a4f00000000000000000000000000000000000000000000000000000000000002840000000001e7b86ba1000002781f8b08000000000002ff5d533b8ed440107dfd00b3abddedb6bd02b1c1ec0140033b2b812d206476362220e500044804880b1000224272240284448e38c45e0a5eb597115a4bddeeaeae7af5eab78333f6024e00ae801d9c6fb941ee839f70b5fcbd3843237bd9bf52d97e5db05ce68c76977200a9bf831c16aac22dfaeeb95f22703fa07944d5e1a0c6570a3b23b45b4c19ae006dc243e02ec21677ce37685a4fe74e669082b2c0ce38a347672994b84363bb00d97691a268e36c7dac6cab46e2d1e697fe86387590b8328de03a34d111dd200077303e27fa7d8074656ad026d1a5579749afb69fabad435f19e831a9b02fb300755cc9930d492f1d5c10756c7a027e46dae2f96cfcca2f405fcb6c8a676c3e003e21915bdf9f5b1f4221d15008b64751761b781f372ab4c408f1f111c41c5100bcf0dd174da0e6c38da43f28fdb1d2d7e360291c27e66ee26db23cc5a9ca27000df8e498b6918b0f3861c6461799ac981de9bc865b93d5980c342193948f6100a347328b399044d0c89ba2625255d68530254402bc415400cfbb67669a1c3400894cd85b2631c940950f18b67847566d9f0bf75aa5f76b9566646d1a6226c600d38c43a9e5fe1769fe2f520a33bbc4775a978e6d963a25f0712550556a81520037f3f9998a18128a56b93a4e590bf0692d00c19424ab9a34586a31aae1a95a000d6aa54e463a09e344a32f98d46861ff88e354c18ad7f6ffc6490858f9d50a008471b665d40ee9135d86a42ebfdeb8b4037393b4c116234e9ac4f96a08d55200e7bb300f3f08e7b4037f2f5ab76074608435bca887d8d3208a97ee1e8c74d200e900f35707b85bd73ac004fc251dcd450d12dd2511bd867ab52292f41ae93d006ef1f382e368aae3f305a7d7a7d77f01e11697143f040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001242ab1a2bd6d07d8d61ea56d85861446349e52c6b7c0612b702cb1e6db6ad0b089000001000000000085864497636cf755ae7bde03f267ce01a520981c21c3682aaf82a6310d591aa2fe80d90f03d827a459509800620a76fc0b660dc8e2b5679021ee159c0000000000000000000000000000000000000000000000000000000000000001058510d75fff931b096071fa420119e84ce188e279ed346f1b72e34a151c874b2b342271eae42d0afb6182a99d3ad876530841583fdc0845907de3159809bc830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b1f6aa32fe7f19e158e57710447737f502f846e394cf5333f0e02323d0317f", - "2040e82dd5266aebcc7921e1c5244e3260ca8f1dfd8523f838226e43536eb73f00000007000000000000000000000000000000000000000000000000000000000000002400a260a24e741dee0779f46a4dbe9ce165679538b19bd479dc273fd36c1d01d200089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb300000070267c9d8e39fb76d9818e035d50275240f19af4f8e26f554c72850ab89ccb1bbb00000c0003dfb6521add64ebe0aba3fa170a1df8486528e97c76d9a53185d7bd4223033700000c8017ac40ebf9733f6e07e35d5d086b61347430f109e37e19a281d9be6a9779355000000c800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000070dbd9ac000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad2ec2c017f349a87e050baec1f852d9861e73bf3642bc147e66e2e0ef4f4e935f6b334a000000070000002400000000000000000000000000000000000000000000000000000000000bebf73001058375bca6a9d113ba2e3b2b9a508dd2f7f8d7e7e49d3bcf2248153ffd4fe880030481055310681e2da2779832bb923af077913af6c50d7e407f58f6a12dadca88141571120156dfb289be1451d6326ba604b7031e638da05b352ca3255bef23ae1f937e8a427d6b90ed1573fb1917c967d5072b18ad4076754ddfb3496f01a2ec000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae81d94d3e364be1c101722e9427866d16ee61b7cb671afd7ddff4f3af18ea87e127c9afe2cd368650f08d0fd6ab54aca59eca12e47ebc453b81b8eaacecfb5199c81c3e053656a1c19cd40e006bec24248cf9a9d91ce8ee2b0f95ea33e7d6fe769b2c5d7c11f624a1e6f33d28456255e87ac100d3ad8ef0ce7ac5f6f00228f05aae1cf3dc2fc13e0774ecbcb4741dd9830ca531881d8c22c5af56f2967962a9d810d9c00e5bd66d6a4ebde472103d7d4ad144f8d0943aa217579ef5e4e00c3361e9bc12280b733c325d6cb9fec7dd0968fe4978b343fba87a75950db47e520e43103f40ed057d44a26989a3a85018a2f923f95d10b85b0b1158db6d7b0c6cc4947f7bc2a2a8ad6c66e792decc43f666b829ddcf96bcc11194bd169baed323298261374a118bae8ded1eebba9009549aea5b2340c435731d91203d7b5be18c68cffe31632a3b57d7dc0797f0b30c5091502596da100d27aa7ae49f8ef057dccd50f253307d9c91d9fce0093e40a0f40950902e84f6a480b85b37d61f55ee5949a3c6987eee35f693de711bcad4e5e927678634c779d2f1d6a0665e6763f7c9bad3dffe59b0744c7b232d367fef3dbbb08ebb339b837da75a718834ceb0ff823e0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730010e042e1f063bb38812b430d630599d195b7b4ebe6f2d8a0de1b3017f07c3e63d03048fa00aceca888fff1cc39fac455f84559fc5213cf794c77bd3592097d7463c118c8cd1773ae3f32f4a3a7d90d3382903ab3b6931b6672ebd08cedc3c61b0eb00d9c78281d640cc0ac5ebbfd5d9d48f09456256ced54beca73d73317fced1800000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c765dca33bce4a239b731ec479172977d25a0ebf047fb38a5696c6ac980ef33be9d2c2d786dc5561edfab595c4d72530b8b2ec813c6b9a4db934e2203e3491a1474abb040204c97fec497962a33e5de0efa2a25747545fcc8d2287432d1c060293edc7ed6ef89c8565bf108ac75a651f08e1fcc913d845cac199f98dce66b796daee32ca7bf576f32e078f71a46451eaeb225668e85efec35cd08300cfb0480dd72aacf99b97ac3e003ba9f414caab9c29234f810a4e0aad4bae77254d53f84283286c079fd248c156c81225cf88070348ff8c7dfd33845a8ed4797773ceaa668334f5ba28267b8292beaa8340b1300677984aeaffb17aa250429a9fa6d574f7668401ceff5ec377d86cb3d757c8ea2b947c98d5b60d497544cfa280d70f2bfb90a0b9ffbf7fa73be7eb956d38fceac9aa9783d2a3003bfc959848423880d755cf75b68179fe79d594962be22798e6da14cbbf278e63441edea91e236b27187eb880f5dee3a449cab52e0a51f1f9afc9a0441da0f32be31cdd62c2d3d5fc7d6ed98c1ca10113551de4401e1a50d44710b7b87358b42629560f5e3e88e4d16f6fa2d9e2e6949b0f5c70ed5c03b88fa474b51af2c4c2884f8ab746949045bede60000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf73001109a263e790619ca8e1c37b1d442edc25ee5fde01a85ff44b823556ec3ea15ec03072548e4f58c0433fe28035a3431a3342a076daf3c1b3ef319bd509fd54fe45030454b8279256d02a496db826d0295f5ac89a6a5a305b581382a461283734dfb2c9c7d41760063d52eff8adcd06f1567f7aeae8830640dda01f8a94cba5879d40000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f9d6502fcd0fc2747b1b187a54dbfc21a5ec707800e11a7956b4cf5aa36633e3148bed074ae80cf7897642d582d2b50bb4198132b5af4ceae59cd34d4e4221c06a0c03330dd2988eb420f88f342ba4607e11349e5a50aa6449b2a648afab1d8cc71b977914e0a500138c6227e9266a1656b44aa168c6b79ed375dd9245a089041b96a6d345283929194337d7744d071fc61c3858655f6a381061ee3e2580c77cf8e0b937ffe4f7c5ce2f86a4d596b4ddacea912be832b43edd0f183cf9189284aea5c1f7f45d783ce4c34472c1e0bfa21da0ab826751cd2e2b9f4ed16076f6062bc909fd90de26f0a61bd02a054c1bc4cc9862ed512e9234a93abff324202eb53e0ccb7d19330aa6e6cccfb3e5ca9c605c1ba530926165da06f9c9d20a934e6668f2b8162da244320166345d74dac4d6591068937be640394c11f01bca657fb4dfd46bee872f169e391e00874fb256d77c8199ea0e1ac2d0459f2f5e054fdeb4966edc2e2f0e2f88971f27ddc083e976a1ba121a947255e7eeac8266549be1815b56252dcec1a821881f370e88147107a56562a0da3b6347ea2954b0afe1b287c94e3961d921d0d7afdf4d66dee669d7640cc811f6f1dd68d723855786506460000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf73001014f9761fcd38005be14f1abb0d365aea66809e084988fa0227dffd54418d78f0307affd338908a4d76dd8f5efea6cc527870a2e5deadfe633faf156ca1bd6cf4c17da25d153219eca78eeb29c0a48f2d7c046fadd610eb12088b36e5c2bc437722d5bfa6b461ce8a65335830351bca32d788af64ef7aab2fac75663c358f11d43000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000856b06d530448c3d37315fa461909eff26f3ccde4fb0cce73588c583e467752d98ff77cd41bd01d0f635fdb3834af3043f6cfef6084c1ecfbc7a99d5c66a9eec79111554a7a34f2d3bcfbda81dc422e5a1a32c58a3cfb5fc5d4aa04ac2ea517bb6c26fc35eb6c61729f5ac884b574c0d1702684030c4448dd19708d518f3368b4b55a527fb0a1f110789afdee23ec7ae62b284c5d6e466c960d768857292b1007031014d8e18cb5429223abc59dadf8f6717c6dfd481771f07eb2564d7d18801bc289a2e5e6849d3d6044be32f272c97f641f5c528926bf2045162eb40bf5d1abf035f790b405c51d9dbd4221f1b5b45afef3a6cebc87b31bbbda467aa33e961321446379e205aa85a6fa68cb3c418a9819329745146d8b7f7314aee8e1b28904b85794d83e99120a1c3ad5a110ad19a84263f3473c6dcf046f0f0465469bc07a6e40beda30fdf6924b27b5fa2e1f83ada8374e0967b00e95c072d7b49586f142057570bdcf31e67613062b2656bce0cb93204e30ea1f38e00d2aaa55d8debc757de657ed6b67997141c0329546711a4103b8e03e04a5aa846c7a5dfaead613da6f8c48ba29d3bafe7976016cde23c92d70d2b138298169b5c529f3f88cd0d290000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7300112c02f3aaec8a710a5bc027d6ff0b848b6ffe5d369a04e144868c942738ca75c0307f54070a6bf248e3541031cc61bbcb1dfaea93e5371036d3e114cadb6cd47241430d179fcc9fb18cc9e912347eabefa6479dd7c5633ad8c9cb0a5b57c4e1852173f151c891ed403ea29d62c5bd38c62f78cd266fb89d3dda5a4f029bb90ecc5000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000afca58f7f354527e902a1ca1193f20e16e8049c636c5e19a0f4e3dd2dd3b5ab61f91bd4fe0a030f2aa7f940fc55c9330536b5a5bdaa6df1373f2a7be417331590a0093bea3be4fc64d054af6f6ea01bf6b2e78ac4e2d732d04e160294f6166f7909947faefae01bfe8ec4578c72ed7477fbe9d1db1ae8f2741485c4e4853e5a8a657696ffd9479d47e1d7b11c82d2fb8b57e40bcc72c7257baff8b2c44faec3a07664f1d9beb879fdc502df4770e47cc3008f21543898cff594e09a11a294a78600d9e3f19246895db7f0e072aa1f71e238e0033dcbd90663f3fdc4229308f629d68490a59e3fa8f8143e2595cdb8ae39fce571b63014af62c1de0a6d9931912ac37d44d4f1635f65073fe94538210387e0d2b0bae8d2683beba1ff0ec52ba35f1017e1369c94153dea4bf2ed1eac6382abdef0d0fcf1b98d245e846e309e1e074fbb4248d0e0af98071fcbd2d9b870840693729ac6ab7e08182013a9cf344f794456bf773a39792b17044e46904efad30cb476445e2f54cc141163f4a2518c42918cb51c58d9a083536eaf63a39a0875d58ea9087fe827e96abc80e02b4999f95798553155cc9c9b1db72f798f7b82812359889b352028842b7af000d7d77dc0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7300121c358c76ff40cbe81043f94003fe6ba1495cd5ddbc987b60ede4f251b0c898d0309487ca7a545bcba354a8d7f053bdb6c9aa1e5bb70f07d2674c7c361aed4e13405a83cca4809011bc1113a21a983a2682e8cbda81b0691d7d848e45222a04d38002d7310bde1795eb47b4f4ce375fd4c5ba88ee4f1251c462d7a4f78f6f4622c000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6f959ce24a7fe36616c9f98e2008f963e1acd43d1c0345dcdef786171b7fb12e37abc34b8cf1d29b5c0730b17bba5210400b1a79989977d59dac54ef1432005b41c46280d6b2fce26f36f671c9c81d39681cfac94370d2896a18bd5e9c0fa6495257c3a79b2aedf482ce2ab4b0324cff23dfa584a92f3be893a5c7b0d30fbe0419b4c855c1fea67efe60dfc6c23664c9306490ae20678c768f0c45b25d41dad773986cd15c591af3dc4c40dfc01d12efb18185362195b401a10cc8248a3853e189e378305ea21428f5bec90055692f80a3f92e777ba7a2ecf2f760e9bf1114c65b1a48ec76df91847c80a26dd0de1b7c630ac21ecee6e4068d7898bb004a8a982175b342d566e72bc0c8a7cd4d03c5f514249b12a5cb307f98644748e87eabd2b6904c3df93a5289e20e113bc5e5881886e4ffcf62596be809eae3202733e9a565e32bdbc4aff7b33dc15ea7266da1f9498ed22328a556b6f5bc2436a3c3dbb6a404e757ad6deb0056f19c83d9bfde27a36ea964e61ca537a074e070ec74698dcdbd9f22193bc4042a4f483d4dc9f4c858b2e0f4636ff60c28a9c57ca948e7d3122310852bdb97a9f0dfc17bafbd7557bba97839eab8fc5490f9247c3d6ca2d0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730010ec60a8793dc8eec30ef3ed63db5ac88ca13b3e48343ad4829b8afd81dc7ff52030a478aafa957f485a71e5e762759f39ecf75e7f839ebe81673b1a5120e1dc02a1793173668766e77f63b21debe7594fc397d54314225201474a326fea8f194771fb93079a8c789217e27b3a799e524e8799046a7aa09f2aad6848d48449562d20000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b047ecea93dea8b89ea31fb6c7467173dc697052cb50c8cb40dadd6054fc5a5d64dbfc2958fd919dbfad7f37fa7231c70837e83077b9600a685bd8f08f15795de09d755b22bd73cc0a4755096414e51a427b9fd299a992800d01e774011d05657d0bb06ed60ddb8779ab31da99b5bda37f48549ecad8f76b07518871d26fc589e644f709bf25117935b3050b692b83b7e72fa8fa92f5bf040cfff6e4d4c568d66b7d90b0ae527e2adcf1c5754db4a027617a547b4ae00f4ecfdda7543550db3c549d93066260c438db86a7ec852932cfd5dcddc4517d601218f5d1b34b7e3095c3df2497a725a87c4db2b7fb16afbf6b4b5b3a8bbcbc420e806008ca1a43de7b9dd657a8b389d900ae1a68665650cf42866ae69af6603525f0841127228158320ed2b33e271400499e1735e4c402d037d2b571873de2d5eda07afd5b010bb7e66528416ead86e250eac92cf4991971fffcbe23ad6664847311d13eb1b70f87b0c1252ebc3b17a0cab01eb14c5c71bfbdadfc4faca7695fa7d1d23b75249c461e2c94bbe58be523fe0ad25e8d2bcb999f718b928d37af34b0361fd94f2f9c4cf73fcd1e14514539a606232b4a55b936f06399e2c479d27aaa484717ac61a71b10000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730010a4944980af9d255e98ee81c66b7ca7b9726ece898ef89c30c2acc91855f4c95030c3e055ef27aec23d99660e56d67c06102004cb20f34576ab95d86c6b8d167352b9449bbbab26821e98364eb6586a8884e94addf42e843fedc31a9fbd7993f66098897e3995d39c989d48b745afe2fe655a22aadf6d01d2dba52f1ec0f0feb9a000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a613ce036feb754534570fcd7b5963fd3facf5095565dcc3226f6442fc53f88b103a501e4e3a2db9a24ddb19953ba61fd44315ee3317031fe74b6a8cdd03c86cb34425fdef06001de740722275f17491fa020a6a288617afa264d64af40c0dd516d2102e5fd4cee1c80778f5edd401b7f6e134388abbb90c5cc45917023f23829678a48961626220defc63b49cc44c279b4730dd1602e0f319efc9c3a40833abe5d424b52f4c8baf0ec4bd8e2e2b27a8b3e08b547cd1f05f6b9072053e0fc7d31088b08662a4876995b899558838017a6f8f8d43643d3dfd5a4ea8510a494ec9746e37c27f0a4b831e5b598b110f4f176edbf5ac7f337dbe0f9bc302aef7dd351aafe7c74a7015cef1b6a7eba90311ebc143de65001709f5fadf695f7f2fe4ee4c994d64a6c1bda88e91af4789024448edb5502de6893dcd5ae1a170646695ba356fa202c502bc76bf4fa341c091b4adf951ccd21614d78a5b39f9b71867f2c2a9f12a0f3212b2342ab819155654710338b642cd03f627f6445f0f4418025944c0fd8d9fe27311afe698dc6bef6eefc80b007ba015a6b1d3029970f2ecc81da9e859e2147febcd14f770cb80d9b36c95683f3c22e164aeff79f15f448f56bb480000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730011c94158e554bb2dc75e4572ce31654b02d474acff0334ae9d17c182c2fdc4fff030d04bd2d838776b6016ec20e6e61c3054b9b7cf5e38abfa39c8d3b4bb8ecbe920a951a5b269263d5b7868547ec8d89b7b10ea31e5948d38de6e8a3ddfa7074e51a5f5a58cf1d1efdfadfe1911a9b673d244d9467eb1b2f912c8e03c5dbf1f9b500000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007cdcddca3d7807121e25c121ece512ec0d32e6056f920c4ce7aef8bfab52689f2cce63c6326b121a289498df2e16145163159fdcf91e21132c7b6c6d00e631ed14aea3b9478fddca9df22c18098c56982ea7d344298c5832eb1bb2c35302ebad159b7ba9d854517304407d8c5b25e60b288a106e10777ae74a21a5107a5e4ccbbaa3430554a9bd8d2e68f7ae3762480ee63fa95cd645f0595182d62e367ee76cd8f8f5a7c24a3d99a8d292f63aee9b08e8a68b01dc2122a7879acf248d11cccca27330b672e4185182324e41d7728962d0323adb367e636f9946728787a39b7758405e5afb6e8e3c001c89dcab2f8c4ab0fd1f6925bcad2d22146a2b5450114baea182c6cd517fb809e31d804fa0af1085994ab17a8ce9d7b43fd6ce2f3cd408e36e00550e869bd100645a0d25a40bb71de1d0ea0e11f27a5301ba28cd27ebf83d298fec8660e3401b868170b184083e09d554766f2e0030e39791b2cb5032a74f33f6c47cab511c71000fd78fa7a9e1feabea60221aa4985c8f1889e4de0e282b3bc6ddd68c8de226e13b99cffb4e26f63777b8f538c4ad82122f8802d92b370a7fb2fc9d76cde968ef311a80809dd5d9ec050d59ac3cfb0bf43b830caf6030000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7300102fe217fdd175b05c861c3e78ccb9f154b324493f4da62223a8f5b5642df9975030d064572208dc60c7c2a2b6e4123dfde2fa05bb0cca1414ff58ea86eea45c7ff2232f4a387e35cf346dc3d5fb49b3e9c5aeae982ef15554a65699eeaaff4a9b40d47a1106ff1ef3ea124a9769d129551eeee1c0c45976a70b1710b9457469a000000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f6f19f3d73f76f24d44853983ff21e30d3c3e19272925697bd57690ef44839d842310d358f968a69336a0b685d9d0aad19c990a17502a3f3e492612ea6e6c76f19ce3c7db3c63ae0770e535e1f5af698a07cf6912d30c79530fd96d53aade0fa7dde71f01712ff88428548c366c06186c6d06e58f2e9f752f578199c34cf596d07ad08eb5e83b86a1af71d5e3e604b924776b86bc88bf61fc9498720f8ba564fc819ca4e761f8bcc888442fa89b7244817770350ec7232f4f114f6945131b53c1e1dd15be51ec1d4186b971f5e0bb1a9dc7f101f1aa4948aa81f115c60c8c19e279b4c61c1bc89818e77d344c664e933a70891b19a7ab41a951c7ee01dcbd0e7014d4e8f288581efdb7fa13ab8134cd7da6ce8fc73430187d04316eb60e63f486496e0d5fead8b73626bc24c7a9e131ec67e1f74c32065b4d52ea96907462175eb0cdd78ecf1ef659d5f77855da23d115b0184fa04bda785dbcbfa6d49125b73041108582df853f3695c6bdac0838e1eb08c6f5cd6839846fae3dd329269a154033dbc274e8eadaa5e2f495aca4f62c4b96fe07d67f5127ce68307a184fd58132e69d4f49a728c7ede1c15e16e62222226a75b48bd30b7709e1867f38c7adc60000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730011218ff454158102c2c3d65843e5b5b60661a4884b88bff57b642dd02ef1e6b8f030e220011efcc1de332fc6f1e7184bc8736adacb495a45a2f7ac453577595f4f82514ce64e8f7e303b18b71b2273830e5c0cc9a4c3133454e56f557272735f53b17750fb59fade2591d4541a1e1924d7ecc33e8f40dbb1552757b4773e4039a710000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008af26c7d2ee3a5e21dfbcb9cb27c03425a35da43b550f62857826022bb8c69db0a56c92276d98a8858edcb001bba2666e2c35d0a1e46c70b5769af83d01d5d36ae3c08c2096a48ac5f7b20615d0090e8309b895a0b35b7994435c11621c33dcf3a9ec396c432975541470cc7a5f45a4008e0c85f4393d3451eebcde8a5a507e3f2ca024985023419d72b6b243c9b903cdb6400e5d916a7c013cac3d800f87ee6c160ca4e3f5c031169a7cb2b73942c53d7021c87ac5ae14138c02ea0a789851c85a4b1eb9634e172b98b95a9f2392a766d51f91e4882980c1b0c44d85ac985a5e31ed96605e82d74c7d71ff6de6fb47a609440ba0bffac3d78677b4c2d03e160526500a8291848c8d9b019c502c2a590f0f1f87ce6c141cdaf381a28421678c9a98d5b456bedca987288b52e08f060d5d754a631f94799750b024bdf803f55c0bd4dce7c600339a7cca6ba9d0b88e0726f7723f7c85a2825fa2321ae800f084701834b889aacd17e61fd4426cd94463352c20602810745c7cc86ea8294323880d7c544897fe602936136cbb7d0f9054ec7bf5872f3cf80b129c19f6f4c179241b3deb399c271d69197c1fbdf392fab608475eaf2484d01043f811ad69a2437f20000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730011992df5e08d449e5e71d9f47289dab8b5cc469e173ca2243ed7431ade07ab411030e27958f38a3c36765424149b5a3bf330ba7ae5a8af7f81af05410b629ed9fc20d89f0e3662891cf64c1e47c93b0300b5d67d5e1b1f48ffe2432006ac01ef7422947ff55037d1cb00791c177cf99eea68045b1ac64488366b38d381d8d24a6b8000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae0b0ffc310d0160a7a2f3a63cd5702e1ea70d9bba82183d196a4b33b9ada0d6dc690232eb8eaf4d0e2e50bc00443a2ccb552d754223d2facb4e4e13f430e8a9bd568f876971c964e516c133919e0c577c3e6942032d90b1469ce5285c6481e54fcf4cb888663205b72bae05409074d5ac3763fafc3b9e1c7f6519756f35136bc5558c4dd06461c9e48da40e3c39e332974441841d65a7bcc7f7fd0ecdf6d3bbc66c74895f609aab00a2cd869a338aa3ea1c429ae9975a494d141195f13974b6cb6d7adcffc2b8f675df5fab6c94a00fad3006a1a85a1c84bc607ebcad89d1712926494a1e59a4f660d6d018977bfbb0bdfa69122b09101c8f88a25a9e1e7dd81bd6d38ecafd79f5a050c86cbe109875ab59f6982b3ad0d34bd00b52c75f3f0d894241e5ed885a36191a5849731a7ea471f7dd2f6249c5fa158740edb5a4e161b733b01131c6763dccfbda8dec41ec9b85f57acda40799bd64412a3bcf1a02ab2c70a4705bf18d73c98c21a2c92e9dc277f03eb98c2f1c0e7fb020429f612a5a34e73f3f857f4c7986fc526a6ed083e9897fc06eb4a1f240cc53a543b30b6b4f5cd3ed2ed15d3880db3833afaf9b5fbc3cd89f0b7b8dbe6a7e88745b47e75d420000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730010ed197a6fb65ea2fb488f74be042abeff45f8002c336388a7b05e260e9accdd6030f62d4c70c6601ca731742c126b3c9c51e2adcc99bd46764a3f9a1d213d17d3d22ecd7f66bf6a0092781165bc44814ed8fcbdc975231c7a036e039506e024a6d1909e8e49c045418061c6d8c42f8383933794e6e67f1e6671fb59c89dd046ba00000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b2b872e617e66f16a4ed02e4778fded3fae538dfe63c876a2a4799f44b5a334ceeb77caa2796b460b4ad6e00e73f5dec055589a1bf41e4ad85bc45e4e70122f6120242db5ddcfbe6f675dd2aec5063a694932186684ad245ffdc3e26dd1f4f1c41ef0b20a7e7c9f26235cfb5e0e174f1dd1250528a0d323260fa9c88e74691409c6267c37e23dbd9e486fcc4140c48265b95c88d370e8dac6e2c8efa0957f844fbc5cfaf470b5f77927987b1bcb726b07c67da222a2dd9a5da266c8acc41d129d2cafeb3b952fbeaf2b1692341541fcfcdc4cc51408db9f56db1cad3cf999724dcc17f77d84ab7fb345be11dc1bd51468e10d5585f3128c099057f25b347a76adb548cd7509cb8ffb02107f7bf2ad8d183ab238d8c0943f8b97dcff3ad41d00fbfaccace791947837190f652444f2bd8dc4ca56b36dad31e15108a8606930cf5af2c779138fb6541053efd35a7a4071997bebc73b2c6d318dae6ec1c0fd6209dec51c4bf487d41fa74174bea61413145ce263ed52ac2b07cf2874777e6daf3afd5ba8f555d737b76dcd26e687b6a9a4ed704b6e3718726d09fd6a45d581fe3b7a89d839e2feed6edecafd90661348ba0667a80332b4c8263cee4002a7310a850000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730012670f7d093f08bf0654621ffbb9f39f92af9c66e1d6af24b1a911d48ad505703030faa82142f3eef4f07390f7d6a4b98c9c7f2cd4b688ae71a8b95408ccc6402ce0866857f1af17784e2c206b6502c9796c8c00a6c0440c94144f63df7f354181e0eac875b03c3f82d55e6deecf6044129f46091bf904e0209a741d7234cbcae950000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8f18d5399ee1c98873dd7c325cc11d5095a356ab407dd2c31adf7924105d24856e93ef4524d5f9354f30f67c12cdd4609406d1689389ee2883661107d281be212aefeea4b340d72347dc9849be08e1e54787d7c76888f0ce6955b11dedb0d40bb4b53887c2697ec29f8dbc4c60b10e6fc87ae54205cee7a1dd7e25fbbc797c3debf8eacbb2dbc8c930155973d42941852a0912c23b644680bd13212fdf5cd24e649ea81afb40b94481b58bfd3a1b4df3b0493b1a92d134740dc88504d36dde409de4eced36d7619adf9f1670134703efdc5ecee28a3468eb0e61076eff577ad0c6a5bbae566c3bead2b3fab1faef367eea3520eab649a81a7bc66b9202bee41b5af31216f6ae4221ae06563b856e34f84b0126a7cb8ad24320ff0986f494be42da718c6aeff23e702ea41a23218298157cf6fb12d31f972f196ca2ec3280958e62ffb6b9558c69564295f13f65ac1382d4d90556500f1f8ee4e1c4c12f361a5c21b36df371b21ee01656009cd029fbdb842fd3d3b3140e7973c0aa8dbaaba8620177c8f89d7e5964a1066c433f6be259ce7ff73705470072c209a499b8eca98b789f807a95d8e594ff5049fcd3516eca0cfb3e7b929a6e77540c8e9c997b770000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730012dbd37063dc984b2edddf9778235ea43d3a00778ef47b683be54dbabbb1e52b3030fdd9066293c4563caad7b084563b077267c7ae8bb3c148ecf6afc4c02ba37c729326f58d4f776dc433073b7218e76dba2b9d5a475a26fc71bbaecf33128b62a276159ef071c2d5e5caaa0f94cc963bf9b964edf9b3625854cdf681fd88e4a510000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c1be9888a1f045605d653f0c82e1136dd897f0d80aea82ffda2f2d26a597491a17cdb9d584c7cceeab32f9eb4048b8e3a5810d92fcf40a1c7b914612490e66af1209f4e48520f6f5c2d482a7b7e616318ddaa18330c49d293242a5806f66e5481115703cf074ccb0c96b360cb2062aa14dfc1fb65d2cdc803593256431aa5f5e4ff3d8f203db611a38139d95b842685d792d8a82497a0b3fdd7bd4471bd1b6c3e2e90992328886d4283f0b032872ed44691724fd5b8f53088ceadffde4fac9c43b7754886beba70bb3aed0288decd585cb18da92d90a417dcb638d1e8590aa77124de845b0caf15b5332798afcaf25fe0576b85d0e068577a4949484c3eec9cd15ae1284a44e255074eb4e8a5c913674bfc7a1d878c4be655ec94799c68ece038138ef1f6c5145f6e4b48b89cca0357d5d1e2193b1c87cc8085828de85d4abdc3a38f3f2133a21b91ee38e115b6c17851d19935f7b9386402eb3162cec9be7c44f87848b28c7292dcf3196f0ed12f277595e2d1965b3d9a8eabb7988e2f5da8d3a9829aacaf9d71329b6a0f57b952b4252f339a0324e50509923e178f4a29062b35d0920e393663756edc29e578537cacfea869cb337b0d289a3674c8604f960000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730011c24de2c9c6cac6e66bd779089c7c5626c14f50aae4485c6c08f95ad1c16e2f8031086d8bfbfc419ae72e96553df452510f4caac82089d9be46d0faccadded0bfd1f5479241fe59d50159c0618ef6ac008f4976665762efdd7b6c1b500abade723064ae7b06650640c98797a9fdbbb0ca0c8c06d465a6ee79a212f805278e3ac71000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000375b8bce68e313a95bea825366f05d1adc4507c44c0e6bc9b4fdcf88b6c8cb8254ad7ea159561a1d806778f00fafa814ef90d767d8d0a94421006f30a4d6caa1284546c674e3e819e32bcb36cb38dab34c8a773fa305f23d1616d906a60108e7f56c2efa4a67a19e8930a69a8944b7bf3dcc82fc992858257d732fa542997c0b04f62b63421afd4aa54f671567cffcbea5fdffc684576e8f8d023b019b588855a5e96a5e9b932ac77339590350a42c20b9f02600a8b1da6d8d81f8f153893c4490e7c5c8534522bf7cceff94ddc52cba560db99d664c9007a0cbc66dee5a06be1ccd5c727074df678f3cab97c9c885cfc6f71a273606866a7d8fd83d88cbcf1b2bb6787162af5edf8ab66c4f8c53b52f9178094d3108703fb240eaa39c1bddfce6b4b99da47da1d43710a5457f96f42db4e09e2b8f0e0416cd21855f7e6e8e0f0fbd535dca599e2ee960ce44d2f2b2414734019c8c4ae89bff67cb6a7fa1be6db8315faa6189baef53dde7cef31673466e495f6b96074230c45940302f7d107e97cc0073258ed85bd4ee77d8a1d3b860551f460356db56d5f9785bc8df49d9904a739bbd989827207749d9b88c5881059cd63f64276d7bd7b33cbc318b5560000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf73001170c4dde649d636c35f35b62c3ed7568b1adaf4f5b0cb47d02c0f6e4a18fa2230310b60115244a228369d7fc553f9cdc8704aeb531a230b112c787999b6a8cac07105261740591fab93f892d344a2516d896cd3d0d3985137368277fc3bd53761e133f3a39c01a89cb573abdf12c3be1c0f961776be425ae58ed43183875e42e20000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000906163b4acad216e7d005f2f94b44f6ad7d1dc83dd843d8bf570922fd374c067f3734c3d1bfa8a5d7486897eb1d1bcdf988a7c2c6d52c1a51b9dd0dbabea825d2e84df3a50da5c4fc7a5f39242dffb43ece1a97f9cbed4da0573f894a2924dce13853ab1e9597d7dec12e248a03e82d462dd8d47eca028be129dc1bcfbbf148ce99b7354e129f53e739a0fef84ed9dcbece04cccfc9b5e4ff9f2e97794ccbed36b608f7ce1eef6dba6cb277d9680281167316bd6432cd8dd87c26e7c68c0ffbc5402b2f700ac2a7fd4d59a47a0da9428ff25bf145ee5759571a33802c5835e0e622dd0d86effcf409b032df0e08137ad08f03ebb4204b2100da59224609564cd263f48c185763e80da929201ae3a6833caf716cf70fc8b964c0011a0ee31100c2fce38864eba1410a5dc353bebaa4349bbbcda390daa3b80e984815142b7ae01e8e076c3f8dc448cbd26f8ed612407a79fb3667da682480c76ba312e3dddb712f464e0b9390c5a584fe88aa459377b01743f8c2821e33990f62dbd99fb1ce43bf1a3dd5ca72bc295592f638957fc01108eb6cc42eb73309a7bef59a3036da47f98dcd4da110635626ea2b71350ca991f910ddc6362dd5625fe7f7a9c40b260fa0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730010efb0ddd8dd41347b82c00c0f34ede9eaed733308c2c3d2e60111eae67033c6a03138760f5e88ba59ca5cb388655644e1b8c089917b616aeedf294baadb3ab52ac0513343e1c49ab1a81d8ea230a87f446e7d1d1aa93c9c5727cd8370a0abc109d1cc85233f3e40f99d5e55f711cf3488bdd7fa378133d4b98cb070421ae672ca90000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c4236687295655c9947d4ea807258ac641c85ace6d5edec51941a59ef56568408e28cb3e901ae4ef1f9a3a6fdd1484a663e95d20cbe5bc07b16184288c3442a4df9b4d3e9d5b42632757d7cec38b871e639e500d2d392ab332cc7fca3dd2ac07552a205b3a8582af872bbcef29b362aa7c51e9583646a69b255be0b5fda293b68121b94b082a406428cd5d2dc2031ac4a01a5cccdfa5759a18577d6d51db097589de5bc3f742c7d64f1330574625dc9e9a2d214eb1a9f2b8b31e9d5bb18590750b6496d1e8641677d16cbf6ad72a9f529c40e8d286fa04dde74df8d7a638caa410611548b5a0172e4b464a4d384615730cb8e74ec73c2e49624ad31cc965b284fb50f18e171ce35a7b2d2d835f632079f524e0c2bf6ffacad045a28de68659cf1ea21913bb38a9bdba71e63686baaf9bd4285d024eb4925de11a81789603c340aa148057b24f702a201f8c3d8898ca495e73fd948eee8e3093ef8bff630b1c749b1a976d1644d6f055ef5e8b788532ddc948ec9980dfaa33b4576a85e41899f22a3c1502f45a1eb647dfccd5d3f0b2c81a5790090db87daf65a3ac5c37e80a742202ca41a17d1647f1686d8b9fd8953fe83bc84059774125104958b4a6d19b10000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf73001275c5a0dd537d97b35f4063ea647280b9f9cd82eab305cf5bd1102eb2182c4650313da0c4c1debb779bf39ed5037ba1f5e2e2a873c190fdaf3a6510ee7be713c4c0046b43b0695964d993679582dca8dc82e2d8c43451bcca518167b1bfc413d68183aa97af7b4ed087abfd8953f4e2fdd060177724d37b0a420157efad5cbc7d5000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000807d266b692c511b43b8ee53f50147b81127a67732cdf0a206aa8e8b5e9f9473d906e965f3acb6853ce33837ee9e821a13275344f51215a89747decb9c6bbcc8f04618f763304210bc83990269c38a929b95a3a469e3bafe5e323d7acc3c8bb6faaea28087652ab626ba90a09e8be41fb9ed58627d9106ecc15687ff49273e1a8d22289426ea515af201e1e5ef5b53e15c63a6c586269572f84c6c2a2ea748c9efb12f7371c016f9e274bbd679b54de3ade9f27e804a4b4dee79c989aa33dd1eadf522927495997bf46d3f3244ad64368c3f2ec8364d96023921f0ec91efeeac91b7eb311f37df0910f948bc2b82e3574943ba4a11e337ee4ea4ad60453bbeedcee25544fb7f8259ae95676d08badfe799efb4b3b869cbd6706f806bce057c5a25c0a7a3afac0a9a705898e47cc659212cb81ff9e112d9f6099751d24790ddd9a507476450748565dbbd8a27e103911ccd6d4ca3ef07450dc465c77cc950149b4c89a146665495b86bcbb15ecd0dd906f140a82ad411ae6c80cd026e6397d680d47de851c0407eed3660609c652fe3ca57d359012df405777d84077f22cb6212f58a15b71238c6c86414bbd9393a2a88aebb08b6717022cb6fd8280e9e6c493a0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf73001112ca2db0ea581b1a668eac0028eb72b1ae3a6d1ca91cc7c893d4a6dd4c993350314ea4aff7d70a6adcfdf894ba8bc6d358c09905237fc96bc7c78f8dbe5a97a1c072d54c0d35f2a464d8c59f35e4d4e7fdc1dd2caaee719f808df661e4417790b2a297d8f1aceb1e69556ce49fd301ca4c59ca7fbdf1413913d239ff24d8a3f140000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c50292e6bcec15e72df5a19beafb8d26300c7147cb9f632436db04c12831068ff2209d7bf7a02244d56acfccf075f98af8930541798ab094fbfc62ec99e05ad97cc99366b009a4ea071e4e1658b67dfdf56811c20a764713f5250fc829d3dfbd48eb9b0c3318205541f042de76ae64aa6ad19f6e7234dbe86a42e2cef45a3ed29858c5462c3a7a09e1aea7cf2753435e976533f23fba6295a031760cf6e2a3eb4cb0acf9017a1a2512f056723fb09a7a53c18d0467921a7da5b25655d84f1399a0c82dc75eb88e2f70a0c7ca22f8008ed6b4faf00a7951c219190aa4b6885b1ca296e7d96d7bcfb4bead2af93f9df536f8ab60202a6e999c9492eacecc1c3adb4dc2b5d0a87818215c18d1a2d429beef369c3be304ef61d1cd52235c767dfd264524c597a04939c0d849cd17bb9daa71589468fb16b77eb9f1e8392980878b93baad08c120d95d20d02738d8745e78caa6f7a49552fb379d6a1332e9630ea390e019e4d4a958fd0667fff15b5cfa69e15394da430d5e1dea66ef799b9681803de81e7cdc748019bf135fb96b7690cf3b8053ac961138e5e9bdc940035a18253a3d69d8b4ae7ee0ec789589f950ff2522759b5243de794759dabeebf0c274a1c0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730010ddd08bd81a3a5a78376f52dfe9501551e7bf92766dd4e4e4cee2ef99f79fae903191cfcdb5c51da28af6268ee4feedda84a2bf351d52c14146197e8e152b379af03734295bfebc31facff1caff996d43aa2ce73bb0ba2a8cd4a43a681e95fa22e1a630c20f759bd0e14c3e2af33d60325d8277f502219b3a198947c3e47ba53740000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009da19eb2ad58b60dafa9a043b22027318b2e3605f66f474d58e2fd45958e45c21795df279c563bd913c45445ebcf7585e365996557c46591e75d78a3ae166b69ba80ad6a931dade7a274d2d466f46aec7a882db08c4297e945df9e864617d1d8e44b96cc2a841d63d4cfbdb053d0b253e46ca0254fd07d9d119a00607cb4316a2f01d42950a4e0b9a69cb032ef773b140d692630f714216e349a7875b086a74863d64a0111c8baf424e30afcfeb78a082ce43424abf73e74c5f48b82435d27fa56ef6b1482aa12137e398627a38fd1e308267bbab85678110a070228be2cbf8fdcef2e374ef5f12b46e4a57bc6ebe83ef2819833d7a0a93a68aaa4137b5b16592327bdf446761588dc6b4c010ee67acca71f71ddbecc9e4127ad9bcdc89c0c69319694f9f999259a74abdaf7b5cd42f103ddf405848ab90f030718971749f80d38b597850c0cfb1abcae9d89a1496215294c8629a7a5a156ebd7d5a39ef99d4de313fd4abcefc9279b5e82d65112b63ad66757246041e00ed2b99a4b99f36ae82aa2e249c85960b685df7640487797f989fd6b62e0a57071efd77abf75fab33efbce8ffe47fcda143dfca4bd2d6ae8d9c0329f11681d0d236c76d8c5445f9eda0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730010f01eaa2c9ccf0b96913d7c8d3136159b839ddb1c933fb60506150bb32ab243b031a2ce46b8fef0b2da3c23bf81008e0a65374111b7b550035d653a94c635f6a811faa8b9fba2cbae1d5e06c097255b6cf6decb682a54dd8788fb4cb90f2aa9817003cc8fae169e97dfa8748d77c7dd0e8972ee57979e7c8f8c226acfab85ee5ff0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f20ed70035ca6627d36c50464ea3691e83d5046c13606c7169f0ae2238b22585465957ef2f4ec4f28b3e4fd7381cba67bc2e0e4f5f163d2691e1378f8b5df04421fca9a5cace16099826984ff40dab43ca1f41493e46f09293813641da30702ddb548c423dc09aca224753123b870d585ef9de4e1f77003a0c69769c2048554703d743ccaea204e24bd10018b3ac3e4535a13ceb318acf997a171031b3c7e2ee9a0aa79b7cd501eeed3aa6d54d9617716a2bd8a57518e89341907383c4a1e843bcb7fbad177300650acd50a89b3f3c1381dd9bfb1ed3325d16f7c4b5da675bbd9e643741fcdb8e2959c9ad19dae9f346f8fea8d09f4c52da6bd5179cb965f27869006582e9dcde2b92e39b99cb77f15c3c6095866ee841e40348b543bda8c867f675878d661b0601925015ced944b629833271b11e4e4d7157c45c725aafa4ac9fd31da0186aa95f53b11e3be215aef799146a6f5623b11cd53de49eb9f610db49221ebd0d1c2140eaa0803e9ca50fabd292911e4b6a9c3a46c6c9d875930207fa94c17fa7b177260c15c069bfacde78e2ad7252fa8be7b799fd465c238f9ede9ceee3552accae627d3c94eb03eb5faf7e3506419aef4fea2f7c7b9200cce410000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730010e1e871df04ac042a5381227f927200f3b8850dbb21eba79d16b4ce771397aea031b05a6028f15e2de33f69f2ba30ae1ab0397eb231b1ec4964de55bfa3b7d946122cb20cfae0019934d228d7cc3edd771dbe93963e1326a3cd7b6f895bab3527c18544491cbc5366bdee705a387820139ab71485b25a2df2f43af6e1a699a2faa000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041a6b6f5ccc94aebb50987b40d132cda4076ed3c09195ec2f2405bb37bbfa7012ffa5b9076070ec87c23a49ef8b48adc950ca51e35aaaf61d94ac3f608059f4a3605d93c581c3a6ad1991c0dffd5f01f32ddeee2bb0a8fc5e184afebe4bc6fdfbb54ddf54f4e8a8834081350ee179ad79f2a4826679ff665de86425f862d4d12983e6c3d8df240f01510fb2c66f5951ce7399c889513dce694efca8e4e6d765a0e5a8a0d8aa11feda873381b2f1c6eb5abd5a48e2d1ac488309a479495db5afd180643edb34ac92b82a2097698e9b9022ce788d9ffa387ddff7485f461ba3ab8132bfb548b1da73c5aeca84aefad4d8173c77d6429b04864b52b83250223c37cb2f3ed7457d6ca99366f1a43dc5d2e965b8170411056107fbe520dc3fa20fc5fe76cb024c66d566b79adca9ffbed11eb764422fbdcceda9e96703de500173303447ae367f4495817c19c0de9b8b5cc70e87679b2e57c9106d2809aff9c42402e982184e80b3da8dbeb2ee90e331b407e39dbe5769a4f6da02c0c2f67beb73d99420bb7d05caeda7d69268e0bc87455dccbf4258bdf193b3b2121a5a038b00a0ec170bdc60fc5e542242569527d7818ab0bbbd2a2ed74764b15a54390abb3b0c0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730010a6a4c17698ea8b486e0ec3256b0101f446144016ac5e4c805374b0d5b072d48031b2a5ee417f467b885f4abf91cd5bc63ea6d4a1bb5746b35893d2d5542d27e2f264b67e39e3b5664fe2ae5f1ebbd5efc44f6455b5e7c3a001fb7ccee85ed818b2db035e4a437b03a2a789bb7472a85ef2560ba7f16c7eeb2f896feadbccc791b0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009054f3f6939b782097697772e135129a5fcd01addd641ee3f4d7db95a9412f9a1ce62f4fef55a430e24bd5546891f117ef3b139610ee7b95a80e81fff9f547f1c7a80a161db98aa9b89a4a5780681e0054ef6d84fec44db848d66e4c6ddff934c86fa2f75210a371033109d3e0663d1b482be53bbf4fefaa27d4a1a14bd50cdd012cf5ded67fa69ce407437c98322063f014849ef1647d795ef787f6e069ebde6a1c997afb82bf9aa58bc4aaf8c3f0197a8db333a0a80e92e7dd9362fb284200606b17b85d122a5abbcd36aaf07952137eb9a714b97c69c69812825ede29607e80f7a8871ea7f136981c753096f1aeb341be013fa2fe80c8708940f88f84c16673cea106aa7bffe3c842d82bd2bed1562840f5c8153af2df3b6337f1d00411bb4c8eb697420d3fc554b876e86e04a5d5721c668e06259bc1436ba764ba67ace083989a9a2034846da6b98fa9dc41a028cb677a7d98b3de6f78ef0edeb6ad9ed15c7828a37dd405c240718ba9e74583fe5a82909ecb1558bc53c9a5361fc5c3170567ad8f1cd988b50aba0a182f4221419c24ce3d9cfa053cc33d4f75701fad85d45209799d39659b2f648a01fd361d0e79b837a31ff3ecaeebf7eb72f35545760000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7300102fc4a87e6a7e61c96512b7cbda1d4596237b7f8db367292f6879004ba1727bf031bd0b52fab26d4b12e1e4961f3b11f10c32c01270835563d6e83e72a31285b7c1369eb946ca8bcbf9bf426932b6bd127de9b059696e2e611a79e27d2ae0bb7211b630917f2882cf1a31299e1eeb6175c1f90019a15ad84a25df01a209fa0df55000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000962910149c12d56b8f92d3342edce2559f32cc6c13499dfbe9d9a96ea7b78e887064a183019ec70c427c3d374fe903ead59647b88ac08cd8b1bcd6242690f5dffcbcf13498ebcced7e11d9a42f1e6ffa678bc1926a9ec017a76c57e6dfb14979c6703255d30750b546ae99fcb9fc06033f52c46f18fa425922196663690638f72172c5bb743901ad77f4db001b60a5b184b06d5218e1571c5cc5528ef1b27205c543f0e8a8fac31793763c03b35dd4b988458d00295cbf07f1a0ae1a8faa5cc44772bc03404a2edc99c6397aa708e7e73244f797da8651ee7a384ad3275669d2355fa7a2c80dba5b4dcbeb373153e7f6d0acf123dac8706fb0c147ac3214736ba96c948dd57b30a2308fa769d78f263d29819b5a0b6f15ac8bde01c10392893db113342cc7e0aabf5fcaa3ad6ea7a8804206206a92ab82ad580159c01138d8ab881f2e751e6225ac84471aa59ce99f844ec19bb203eb54699d774570ab7b6a8a4b308b06101558b2dc186a4f5963f1a0ce7dc9ff06504451758d3ddcac5a00e2aaa264db9c64e213c3ca8550f74ba006966822a3cc057236e7e475990439c99d01b482aa239b5bdffcbaf43c76a1f0ea271f0357e133d4788e7fa3ef851e229f0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf73001016b3f2539d046213bf758229c816b6921980f5357e6371d05468964b5874d52031d991ffaaf1fe82dffacd73cdc03421e88b015d17b9a44d383d99e22ff8ced3f23f90916a35090167554f4cd3592b91dcf7e016d4e016d4deaa6c19f5dd6e7b5302863ab58438111c15b70f4aa7f9e09a566311cbce5e0857adbbba7430018a3000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a901f5d01463aad00be9bf72d7d4580cc4625d007fdd85189eabfc08dc9fbaaa5e0a287efdf5604974f1b266194b2013366c3a0ec54a4c4236327fb789223267ae95c847c3f65a3b0d2a19c32e2bba61e7b0784e337d4146fdac653a15eb22a2e2d96e7545c24ad5b2f0da909ea3142579a726f7ed20f16cf4fe9d477b89ce6694ad57ec26d334571c1cec61856cbbab617ae3e14eff69890b0b81e36fadbc8ae56aa75a2b29bc4357324038c5108ed106ef881fd5518c499e56507d31319908185e2d42f581a890b7f1d085fd6923428e52d1401648c5b7ac5d26ef74a1045bf2d11c534668d597151ca89b09c8b16ddd0e5ab95f99858de3d6243d6f8164bb92e94b3f92f399b470a76174398b1746cd1e659b1210891e3e6e6d07e7446170ed4de69457c8aa26ecc412ef4c63f900f02c3d01bb6a10eef13ea6ed18be872781d6d9e5fa43f870211c6aeb45be8539f36b192b6fe66967379c2b025c24c335c417bf887c33767823776d6a4b3d53cbe490bc793497b18cafc9c0c3010bbe3755ffeb8eb21f5f9b82d34f2ff3b138450495e31431bd86b12751eb554817cf550eb6df57e93f2f80e8173aec946314e09b1dedbb9b051f822796c54593df8a720000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730011f2750ca65fdb442984d5dc4e042f0466af11c58bc4c7ff5e3680bd62271b49e03257e3a2e68d86e04263cfc2e8802347c0cbed631550150b76dc4d8ad8c265ea4305789bc0794f842460da247c9c6a0a12d1947114255eedfc75bb1bacc09ef0f1b6e45ac803a6224ece280116026910b703b6ba1c3015eb17f8ef8f1307a3bd300000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083e20d8d088d784913f7fac4d02e52a8ef2e01a461063ce4712a43916a384cb84f219921ad7d1fda5cb3cdf3bde09dc87ba0a37b16db2d927e8ea8c51f8fcc8f63f56e0cfc08bf9cd3ada260fac5b15e00725e828db86b4304fac6e9c3b57afbc779763743e97496287fe6aaf5b6aeb920496f0d5418ff5915649e3f9d50839a01f067ddaaa66a5d1cc714cf58d66a8fb52988f5e97654019f3ead6206bad63a18aeeb9054c0d8c2d4f440b1bd851dda4f8912b23bf049e151fb984a718d77d25f18ea26a29800381dac5c469a81fb991635dd39deabca67c77c899e2bcded1717d989fc7803b6fc8a65f0d82d6c5774ffd981dd510e1a4534f198ef63e137dafb03fead97411cbb21ae5d730015010faa176d8aefec8d2a2f0bbaf1dd5ceb6cc03bf23523b0ac7931e11d9ed9241be3d1a7a268951befdc20e753c8bbcdc504ba27e3fa522836e28d416457f86172158bba0e2f6aecefbddcc443f2473e382562bafabf625a65e0be3e72960ece273720fa4f22464d88b2e58a3135f7471512f25894a33b0f83780d212b6e08950899c71f7d561c3313411690d96e8877ee389cb4b8a31ddd9cc622b9d776725d5682b800c41aec07c36f5d23970e30dd787a0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730011ac11f8fbde5c0a6906aa464eb4968505f95b3e2acac579b748b77ec9712cf610326759ab17942d5482e0fb5031456e08b12686f4a508adc1a232283163222e45900e24e080509a7cdf1853d94ed3cf16c5d1c4e08f973be377d26f66b06b4595c213191ebf195c28ceea33583b77a6e6889e4595b391ac41f5398970b676e136d00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005e6adfb43401bea5675291ba380f11f4381a26cca5b117d1559e8cb76628bc41c01de165c05dfb3db7ba2f6c5fc004ee2069fe7909912563a584da1b801286151d71a44f0b45a1c568aaafa2fb7e3a684de78f30de41e9f61f41f7f566bdef15ffda1684697bd1183a4a2e58b8e10986f02c966426eecc0c2df1d681e26eabbfb373e418224ad88d48cc55f7900079a443d3d2f3a732428e6ad7a251bc29df51e6c838e1413a64e9d30af34089ee7070286fd524db48f2dad5f82e9d0d7fa8b0fc71476c366e370cf8469a9c4d1ee64212a0500fa6490122e4436abbde66ba969ab82a6a01781cafeacc11630a12fb51d441ac1f1e60dce0dbf8c47a7255b4605db2bfc8cadf7ee9b80bc76db01fed60e7046ef6ee2b52c3bfcdcc2b78e0f1fb1cd6c990cd27839fe84447a7e9290b114b75e88d161ff73d91cd1e54f8156701566ad38b4bbcf18e03862fb810f1793809db556a29458ee2701c69486af641ba7bb49d7aadb34ab3cf80c05b7d5da7ca8e6d393b7ac1dad4481c7498bdcb01d43e16e2303242cb552768a481929454c3b4d334d30f20f35ae59d751af276ebb60e574fd2e565a82697ee9bf91bee47442f0d8c2cbb2392cd81d1f6621c6b4870000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7300110d424bfcd43d4d3281e6a5281c8f4e4faca25d2ab6d15dba4ca1da698e5c09a0327892f02b26a32e7709e598218c97f2289e6cfbbe28a20c2b02bec31293ea3a32790f23903f5395cffac91f85ec6812c8af0acb60413ab3876149be6afb6928b15b8003f6138afd8445c811b5532f872a3597a95e20320804e657f975583c2ce000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a72f28afa5b29a5bc796e18e2d2b32f10da4dee917fde777e93a4e4e75971489c0c2ac881638a7b20618f4cb93edc748ddbb3d607ef65b5963a3f98ad062f2cdcf86d4de9868338e5fb4295760815d922452405b5de1db8351740e7a4e8a0fd4880cc3d450de9bd8c48b4017d8ddbd0cd202960602f5667f2294ebc38a95c8c521601b96d503adb6d49a5f200be6ed3d072133d5b902da444e837c4e3ced1f301a99d02cb3a47242974f7edb77afd22461490b22ecf7ae1502e99ae6562d8045bcbefad38eb4cdc09f3f2434f4caafe22388542c9e863997f95eeb4f09d24ca56880caab2ddab0f32bd5c96d8f7edb83c3b5e35b085c92c36bd3a07e314b854de2f42b44b0c5e89164bba1a540ccd0633ccc7fa3c95ca6f704a2326ca390f4104832fd5578d8d0a5367ea10624e45f35700f6f51fae61a8614533b1029be189c4e8bf2310fb9b5c7cf547f760a96e9067261cf5af3102221113ec7474c3711ab023b24305ffc31411c010f2b330cf13699005b0e88afea127c2dd7ecc985cae1a01d6a6cdd47c8ab286134bd42b29fac1c76b26009b7678fba98f117a7a503e93232e770dbfd8b77bc276d9a35fd7ad5bd3b88855f67d318dda79cfe4d1130bb0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730012aba9c14c53b55b96337c76b52de1c2a709ecf0b84f2486013840318ed69eeff0328021a73f588bf8fe8a24db46deb553bbe2eced367a6cf8393027284fe5ac55e11b56d871f1ccf01d7a5fa730d3225e8204cb4bee458238ff99ece8084b555d507bc32c1064c042281ebf823521251b7dae74e84a470e254fa4fb4a2fb291eaf000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a766f92c2916d6ca8c11f568a3be1faa2ddef1da89e10c8f96ce9c0872651e8c971b5880e1cf88d2416543c7da7c60f7d3d0d436f7b321bd2e14e512298460964e36ac6e41b0a06368eb38262d7da7993b29cd8b0bfd50a1c1ab671ce255633e3b8ea9ff68d5ad8d093521e92038d026604a9987ab9b2dfd1b90b95d691015eb379563b18d298be77c5fe0bc4e3ac463664cf2fc2b91b2f5b2aa2cbe60408106542163f7d42ee03be5ace013e22701a8374a674a77ff20b989025f66ca010ab6a5de8a60f685b6caf3a4452408cc6e1e40b366c2bf7f7a308b73b066821db73e9facbaf29068516fe70d8427d4693c292ac9011e298133e3b965491866cccdc7500516810ba62ae3147d0cd43d892d6e0e1f15c70af8972293a3d1776ab2df8299e360310857e5207e351e04519510d25367186fd0efc5d84278a4845f45466c1adde2988043a3f9664924ce80fc960635113ff3f3ffba33aca9047c9c87ca58b04571388369ee2a117faa98cfb1f4b2e96505c8bae979b5386c5a745cb93899d20def7caae0589a34519e255fa11809495166d659270c5f362d390b0634228f2e6ed7f8ab158ca59405ddedb5a38cc90fe008a8bc9f9752b744b0bdea7ec1200000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730010b51b0bbab051682a2a1d815a806d4f02a4f210dca34fec099ce39b73dfd4e5e03280a0531a1760df60083d3c507ac04b5162444af81f7c4cd8fc331a246ce43db2f44a4bfd6fa09d243db4cfa7c690266eaba10d9742865ff7f6768d1ac50d3c0189183e6771347911372d1929f12d20a558f0856575747ed49948c7d0ef436e400000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093713c5e18832b926cac277e93655077194aa79ee50b6b30eb025ded3bd2d8e2dae24823390cf621a5533acc36d47dca472ca0cdd6d7597190939272ec7e14f76b08793c31a7720c6a205e34a36e6067c8dc0ca67db8ea5219e2a0c5516e58eb5345d03c217c3fd057452ff8bbcca9ba99eab2cfa1903eceb0eaeef5319407a749c1db2c8e333733154252b41249aa958d8e13c8e7a893f73036472e99d3e83ca0f4db4e3ed95e97a8a0fb961c43d118b8348001062206f983c8c47e79c891771c7ff5732dafaebf506051ac648243669ba64ca876ea07e69c10a2e986cde1fcbf7bbda4ff9c6e6f8d310e25fc47c0fb1aac4ea40f88922cdf46d9d405c6c8303fd056f59e7012758d17da965f05915af95dc92d188929ac7a7eddafbbede874ab159f3d4b06f39b4584415f960d723f2f989c75bbc3d0a4acd2ef04bdc0dfdd7a2bf2c70d84fdb40c28148f02aa4b2a151a5f975ae37fb8648b6bd5a8a3b647bcb3298ecb330690e5eb092e94bbc963935562e11a2b93e60b01609524e92eda24a4f301b49f6bd2d75a8beaca2272b797a02175d9496d6fcc347914d96594c3b21a7057b8714d2a2df34b2863ee9269518f16af673360d31a42604b600a59ea0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730012672bdb5f9580a976451eb0fcd0c06e79da7daa310799b5e221224fd08018953032bd969fae7ec9f16ba1a7de7f0f8fc3be349fb75c5e9718823caafa69ec77b2d146fe2cb2be98398becb3a1c903d3024f8acf53df69df5c871bbd235f399aedc22c310255c70b8c6f7a4afc88743516337610ce278e7146ceb3de1d783d3eda8000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076b33b2ea134da01ece72ed160c06b4adb8dde56b24b6b1709288f999cd4513984c31d0b4b7bbc2075df5f3eeab4cfcb442d275d1ab57e03dd2c26fb44d7da1469c58fa392c2c104e430001cb497e3dd216dfc0eb9a7b66a01ba012288853aadb74ea6169134dd633d61ccc33bbd2be1b894df6562e12187974b4b612a961228b7f29ee8d287c53213602f438342336f9aa79df399a7cd56ded251295e9c38a64fbc8b21f5661d37549032191a4c23d6d4f84b710aeb9a06d28152078779cf212d139d553ad8fb0e6b120ec24d147914f04fa5dbbc1b3596690a123451b6f57f0136625385788d6623ba91852f7233b4d5adaeb5df10e297ecb7414ba694be633582179a1f4330311cb0d7f30f49964c6780019b5054a165184d6a397908b8a087a93d72e5415f3594d1b7f8ac369c245b398e57e39d7376324d58d6321378b32bee7e40198f68de3ea49c0044707f5a5a04945cce792ddf331ee612979addb97eae4e9c415ad993139f38eb4fdf6ab63e5c4f55c110d70c44d6f0d5ad787a986b17c31583b115fdc7334dfe7d7b39831af462e7bd6d2d828a1d37986c1799c159a5fefc9356f215c5e5ec5d781998080c1673765441058de569601b30c08160000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730010555f251552cf0cf5f747da0f66ef2374539f8696bc7e98875be7bef6bfd349c032cf23027b783178c21a8e4b2294a873cfb0b13a3a6fa391d758617000edcbdb12c06ab533dd641cdb128d93dc1120a5c012e37e01aabfd6c7aaa8d34a7da294e25a128e5b552484c15abe3dc80eb691dd13ad233ea8f9bd9fbfa293847954bd3000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa357de71a7c09b8650964edfc4507a188de28de00da6e64cdf0fee8c49c2166c276679f6a0ec6d009f03875b34120e5c344bd79b23a9eb7cb2f7521698816c83d3cfe6151c78934937a6adff4a5ab20326b655c48fb5d7d05b90236ecc1a966be258cad79acc240b7381c1eaa9f5a70c36af24db1eaf365893119d0ffd42606188ace5249655202ae181b701d0c8f4bbd89d0eaef4d44735f9d143614f6d2b097ee874615689e34eda0aa8ac6909beb615bfc6a2dd8611706b01c782bb6c94c825263c091d0fc7b9a33c37068d4ef10dfcc8d6b9a6545f8bf5367737c0166b2acd5e74fc58122c644d980ffc4b62001ccb7dc29e9c33a976fd4a480846e1f30d0e69eb4edb7deb24909557ae76ff6f83c2921304e1e468939c0b17f638185f8cb5a409b3bb05933e67d7d2439d483ca4b58e78f0fee1cab59b4a289ae073446a643c3e9d8a04267a5019cff035e8d1404db07deb397510c1a164b62674d534b8d3b2ea30bcabbd7fe22dbbfed597a850faebf1c2235343e63e6929d708d1ba82a77ab5ec9bac92b46796567a4ee1a2817cb2c42dcbebf70d70fb5a167566e73a870d4d06d5f45720cb55585e228517b66dada2b95e7c9f039e307d5f0a672ad0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730011c7ff3e834747b9305ab943f6bf065f6c05153f51d894307d50773cb504406c2032d9f571a17fe538f5e6fec3fee404cd251028fb461d5d80d2e80ed8f144d79241388af03d072fd5e0fc7238d83c632391e7cd75efd2bd8dff48d652da32620991b4b16069b7650874a63cb67107221e85e6facc827cae5a714acd95f1b5fba0300000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015de52aee2de6f8d8f4c257f938b68db5367cca94ee37441e4e32053d0c736a23b54a13a0b2f5b81f105e1ed711ce717d41b2bab9c5a606f53b867f3198561597c4a57269bc9d40cf04b69a65e76131ffe6a3af8daf0a56b6a376dbfc9840f986e3f50109449014d934131b46a0d58142105b158ea1a243732a4e6850a9021ce79c940cd9b531acc039768ebde85b2979aeda252eefc48ed789d1c5be020911bc08ae47570df2293adf6a4b54e76f9b62ccbbd9b9ee5f7daf2e1d3a1e4db21933b3531606d432a74e1a5212ca564bc8e223ade497a2af7aa5bc9c5add4d73c5d3aa3f495a7707de8d44ee80870749356632986f80cce4eb227e563f3301d1c506aa27d9ab0ae64756be3742ec7f458df44a82418a9a924cb439d6835ab684fcf56f09c5bc0cb02f75d954b508462939e4e597243665f31a340f8c0bcadfcd877421d51066b03780a6d963950a0ecaf2d3ea7fda0ab61c693e5fd84174bcf9ba31dd1a720a58d831f488bc80725d468e4bcaa771f968fd426968c271edc4900933e798ace20a509340dcb9a73f1c2875b5063f4b2659d888ee251ec6f2708bcb06193f81cf2b3fcea95d82dfe45e6580cf98758433063bb71a7bb165205d3370b0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730011a64987efc340c75f57a809f5d138b0c426ce7b2f498440078d353e61a43a89d032e7631466d251cf09f1d7de1bd7bdd6c442869fae1f97d856502de2f2131753e0be8773aa2c27d6ec1867031e32f7275534f21483005af20cc25f81dba4f4f7b1ff6ae4344cfe45295c23aae7df2e57316bd7712f8fadabf33c81d4cf5027c960000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df0e0b40df4d5f79b83aa5560c4c6ff6ac532aa86cb197b4e5835a38a390b2dfc74bcbeeba6d20e936b91a6085648d46cd2c785353b44b78cada18c0610abc057edea5918f9f02bf240a0ddee24819d53de71d6b0025307dd1bc08e6d9fdad3260ae8e1a5133b23ce6fb1edf9d33778835972ce8afe5d51057b6295d4e545d478cc843f4cc6dbcae9e40a66e105e485cb3d7d2003acdf9d5f8f96e335787642c9d6f855a97e7a498eefc1ea8f9cedee35306525edf05f0f1d365d2763b08aac36c31868fed792251d7a2e161069bef75477a1ab95dc1b99dc73ef806399368c033c1db741176459363973d6e35634e4255e4c3b893f22072f27a84199d08ec4138874abf0fdd4065c3cd9b1a5a94989f89aca3e6cb6537085f20d319145fbf403907ebee57ac249dbff6ded0c50d4254b033cf9b0028a67d5298c974329bace2bc42c3b66bfb5ab4b4743da05234c20786068ad4d4c38729b838d045506fa6d68f492867c11e3b7bdb8b664466a2d628d1518c30d436503570d6d3baa104cbe9e28fee0e1b96b45e0c551b8c8aae4b1a51edbb2d51a1732036c17ba84b44213bcaa548c3467128f99e209c3523ef8722c63b07bf403404e44d20d33cf0a2f7c0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf730012917abb8ef536def8328cd6bbd1705214d252fe6645d2ea024069a807c43b994032f6fbe3e7c34c4163d0fc2c3cdd66b62660ea9f4dd52fc78fa73fe406004355c067d5f88308be753cdf5568b3083a01fd2befa73fdb4784f59c643af1e78c38e0b0d378b2775b5b821527478794e5811687bcb8918b08fe1e32c7fed88ac13880000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ca4c06e99c747a546ad2c656b0bf74ea8d50bd85a5b6c6a2ed5bbb16c059261ad3d48273690ad2f718b33fa371609d6969682333a1bc56b61f34fcb99fb2755546684f5e0af3c77575596ab7aca75b5f6ec929b45d756b886a1bf502a44a3eca3aadaca3b998d41b7d5b8e45eceb4a5b6ebad22c61b2a5ffdbf0beffedf4b6dafcea4847e7c3e67169054b2e53ff991bff75c9d17581b3aa15164e9d444d3b03b2b981c19049b89c1facd06a7a73bd1c7b1027e6e49be9e044782fdc2e9da1640c6189f797cbbe3ce2ab49d0fe587080302076506031719b8dfd374ea747fd0d48a46d4518727930e18a9cdb6d3e82a5c5dd2269cd656df31f9d69d16780f804ad6316c6669e36729328c8685d39929b56dfc395407fd15d5f7a93d42f8115215b84411561434457aec10ddf69e18f12a61e7ffa9e4b09ba87f19117c358ccf13e3446e80f7f332cefcc0dea36da315d1de0b9655164a8bd58183e05d084b633b8d79bd7f95ce05571d2d49c8fd801760b49272de6debba3bff9ab4e0326c471ecc0a88efd1070901d7dca560325d8fae8b3f95d7a5e916b5c89143ffad25a7ace53b6a9210905e7a5ad40621439bfad47e40e1b3da081f6fb6359ec101497d00000004000000000000000400000000", - "17f349a87e050baec1f852d9861e73bf3642bc147e66e2e0ef4f4e935f6b334a00000008000000000000000000000000000000000000000000000000000000000000002400c5443987df6edf422ed495d2ee15668ecb23d54c5007fddd7e4ae35f5a347800089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000800606debe3fe32ab13af089a1674b07bc552bc10553619ebfac0e9fa73acbaac3000015001777e4620b2412a766bb7345a574398dd2ebe6399f5f0ac868d020576024994c000015800825bed0f04513688a20a73113b41d525a804966b3e35ccf0894be7867dd9f59000015800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000070dbd9d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ae7004301e67fe9f13a03b1fcbf795811303fc0bcd6fc2ee6377e25279ca7932cba7cd8b000000080000002400000000000000000000000000000000000000000000000000000000000bf4e3ac01014300681cdf04ea1d4d0ae99be07f13a5185b9922eb75e3db606c8ec8cb05b20100364bddab85930feda367f13089642bca51604e83a3198b6222fb9a612de78800011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac012b8e2a294ea5f1cd53b8265c578d3fc1f2a19c13fb4aacb4b1180776754bfa0d01005c28d4a02307dabe290106c0362cdfbf7db5991ec20172e127b681aee1987f00011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac0105c748ea410ff723ebf5cf72073e28966c3b358907d2a513005ce669f2ed4df20101caf34e17f614d1ac175dabaf41ba5e0a6bc54f5d24443241dc22d5735fc2c300011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e0000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac011e9ce34ff85e03878ffaf6aa03ecb56e6bc62e1af1996475eb0a46ec258e6f8501022aab9979bb6b16dde02b6d5963f98e599348c0ea19b75d7b13aa4e58b3fc4c00011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e0000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac0123d61639267141b2a139cb361e63c88e8cfa1896769ff8ce3c8109a20a3956010102ae614bf85e7dab4fd9f56a99ceceeadfd15513ca564912bdb655f9d9cc6ed200011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000013880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac010079d5012baf3e97c561fbbb1b792e64182abca1e426876af96865b0344f524e0102eabaa1ed18c7aff048fc5ca4c8a4eb641d580d59cd6905b7b2ec56dbaeb13600011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000017700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac012a148fdb174c0f93c3c3ee6a43455cf57b5f1dce7ed31cd8011a656dca3e280b01054dd68f8ac123cab07eab6e5892e4bf28094709fe09082e74db5c94eaaea4df00011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e0000000000000000000000000000000000000000000000000000000000001b580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac011dd0145b152ab9b544fa73eef9be7a07452632879cca4fc5d879628d54f2ca120106068461c988a5fd55e96667615aff05ff14ecb1b14acb452f4b0e19a8b76ae000011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e0000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac010ecc7cd250df68a974bbff3895d8e3f224be5bc88c96496d810d92a9ff1dbc0b010bdbb7da89190ef7fe48c95e03b56f53a8b84a8c4735bbb870e89e4c8d938ad200011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000023280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac0127d2ac80a0155074efb0c4f806f05fab46ea93bd594311d8dc5e86330d11926e010c226b9feee5fb956f6993f8a3c3c6b9e954723375e1140029d6da89304af1df00011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac01300d642f138c5b01664059ded18a1a6c1b816dd5f2ec7aec235b31c0d0ee684a010dd8b695d2d548be55da79143870dff60b95be6d0b57de8ae667b77a447fa57b00011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e0000000000000000000000000000000000000000000000000000000000002af80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac011f7562a4e93900cacf308a07c2d99e602eeb8d6cfcf67bc6ca7bd43ed9388e9b010dfa58b3c5b941459e3db139a0b1f86bca078a032ba45d6ddb4cefb2e740976300011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e0000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac0128fa21785566a718bbe11a672c3a893587882c1e4b031cb246ead21f2ea3823b0112a82f55a270b1d1d32b9993a305c6c013f0cb33a42675943f84e0fd8d7b987800011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000032c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac010ccdf5162abaf0ae27e19417ec9816689aa1b675c7b54d3c618b9b862019a6040113ddb3c4db34fc3baecced77d9ceaa56fef43c73913043c2a1c94143adb5d15a00011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000036b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac011783efb59d6cc19e7790ead8403bb74548087013d5baaac97fc88285d38a9ec90115a0ae1010df693b6586610cc31ecc8e0f98bee0d54798dd230afe7d2440834d00011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e0000000000000000000000000000000000000000000000000000000000003a980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac01261aeb0fd79e4af3f2cb422b059fe7b7d7f547121d1d58e59a5fcbf8f3b3c3a60115cfbcd63910cfc5560c78f855b0f747aa6b43b701d967a60b271ca6d3e742eb00011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e0000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac012c7c8211350a3c492ecc78d754f200f0882b68d6a4ae9a4ff85ce38afe0a56770119dc75def24fb3533429c8940660baf15945b07c9693261b7539c0f98cc73a4500011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000042680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac010ab3bcb6cd1fb16cd44013fa5911003a48fce66ae3d4bf259c78b4725fd697c4011ab5cf62eecc8f1605a6af38fc4f9241c10998d78aece3e6a80522434f06a44800011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000046500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac011d400a7c37b7b6c9560d47284c132589a8c3ee76cc16742df80684b6fb3c22e8011db10779874ef15ed7f50e19c4eb3199214c02faced2bcd616ee677964acfd3800011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e0000000000000000000000000000000000000000000000000000000000004a380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac012382f7ad454afae362c3a6ba585069dc225ddce8a3a2c7d657adc596a0e6a5f6011eaf206d9a8dcf1efc717d54652726672afc88495a44d8a76502c546f8c812b100011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e0000000000000000000000000000000000000000000000000000000000004e200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac0127c6c126fba4d0c3b95ae2dcbaccd2e502fcfb97672bf4e7ffa8497db9100ff4011fa2acfd3cdaf51fc7a49978afc278628996d75229529871d8990b6238692c4700011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000052080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac012e7777b5ad106d0eca5cf2da9970fca482578738c8180d7095cc55e54bb1497c01217e9c729ce7fd2d354303f83747d1059902ee63616630760289f1e50dd95df000011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000055f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac010bef1b237e7f2c0f962e4cf56d16c3f913ee42e469587cdcf0660358953437ec012264fc8f8f64df13ab66be52270ec2fcd46f41e22f1d6b6d7fbb4e665b329a3f00011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000059d80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac0100b47120029d6414b905ceaf0c1ce123ddead869e29c34bb4cd609a5b571b9e801231f611c2256ab305db21ee558d85379557236e7578047f85bfa9f85b549ef2b00011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e0000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac0118f895327fb19c1be92640e0e2e987252b25b33438e0b0d771b347d18b6fc55c012501ae4c19b208753fb1bb0697c0872ef68b3be812256c20238c86216baaa68600011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000061a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac010bc0507c268de47c2f0e10e2209e79d4d0e3002d37441bdda5ac4ad9e2d5eb5e0127897f79cbebbd61fa302bfa36aed0af7b589edbcbb93974c63d63a3f2cb630400011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000065900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac010f3ac06bc350dd1f8a1abb7ec142fe7f69a2206db1b1463a7dc8ef18e4387faa0127f8037e076b7dedca7fda14b04ea399027a15186ed8453d8192d626ef8824ce00011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000069780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac010009e36ab6bf99312e4962b1f5737194e0f4cb3124a0278e92a53aa3f547fb1201285c60f2a79fa16f6e7195593baec520f35bf4bbef8bd5839b0757ecd566a12b00011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e0000000000000000000000000000000000000000000000000000000000006d600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac01135e1732ad5d59ab29eda2f80b9e722a1b34a337f23cb7789c503975b6fa7bca0129ee62d9bb35fd9796f313f545ce4d68c3ca9f889a802384cc6e3e03054cfc7800011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000071480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac011a155e7d8925288be8ebcaa84458ae3d922a2947db7a335c9b05d38db2d414c4012bf3f77b341b549017e9100426de7f1ac8231b2d1a60fb1d22461e757a06e44300011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000075300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac012227402967d9bdac0512dd8a6147c4b2c91adfc0468bde21df9ffebcf215f5fa012bff7e983b91fc305b288c2c8b7b494a762c25eec100093e05374356ae46b17500011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000079180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac0116622a58cd660cd9fd4cf2ed0d7745bd8a968655153f609b4e08553081a315eb012c2b87fe5dec81b39c95c024403f10b3fa622ac8cbde9529178952af3d6f6ad600011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e0000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac01145e98b12716c507518ac8316c8a3bfbbccb6ef9ffffef4f347ceb42e7d7cda6012ddd687c5fce6f7bffb6190b6f69cef53f3a01b8e26e6d7d5575fbd06d9d2ecb00011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000080e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac0110999fabdd197db7270206bab6d89572bed1f66437d9c1df723e635e39630682012de0854f6ca9baf18f68fa01ebf8c62980ef0b65e08b6e10ca8a2a928d5b7d9f00011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000084d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac011f160727c8532a3f6de5d72d1e7c77c9dee1192956d517ecc6b5983cae4eb4a8012fcad2b16a394b9cd1792e33c1ffcaa0fc709c7c85de402897ebf53f376e055300011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e00000000000000000000000000000000000000000000000000000000000088b80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bf4e3ac0116e47866c1946af8a9df06ab578c2146f3ff4aca9557b0cc4209650e559099bb0130259868bf07d566d61602fc11995a2a7d0daa84c45ea95df0eda53a1590c95700011b78d5037d52acec9e096124e05a45508d91bc537e2c017240ffdad916532e2e0000000000000000000000000000000000000000000000000000000000008ca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000400000000000000080000000000000000", - "1e67fe9f13a03b1fcbf795811303fc0bcd6fc2ee6377e25279ca7932cba7cd8b00000009000000000000000000000000000000000000000000000000000000000000002400438a472347e296cb881e76b7c92fa1241d7ed5e861de86b9a0b4412446b2e200089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000900ef2c4291be4a44026d49d9b40dff77da22b90ebcf5df4ea4e791bc4b27f2b5800001e002fcfd40399aa2f168be30449f7051f99acaef01425cde48319a355c270690eaa00001e800825bed0f04513688a20a73113b41d525a804966b3e35ccf0894be7867dd9f5900001e800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000070dbd9f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad2e71c00495ae5d183ec54d23ce35c4e5648d95264badb3a8b7993adb5d13a789ed1703000000090000002400000000000000000000000000000000000000000000000000000000000bebf4f0010bcf5be5961204e932fe11398698849eb10fe7869de16fcf4efe8f50083b83c7020062c6ec429fa1cacda661c7f0dc3cfa769269afb7d41af95df45748c7f28bdf17b8990f636be436ff6ae31a41eb56612d8378dc5bfca4067f1527c1f24872fd0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e2311fe32916bc4b61c7d08074375c16027af69bd9f565751626e762a26bcaf8b59e5471163f0a7e040437ba718f6aa75725ec2fd652e5682cfd704b90c614f9d797176e189f1375db5b163ffa9e71315cb476987cd594d37e5b8d3711ee2e2aaeb29bc0d76ef864478a4f002c1b9f7fc0c96f557ff5810ab4283725d33bfecf1b2820c473dd3a9c14ab91121c38f057af5119d9b79445a4ecfa2b0ea4812d1c328fedde830dae86b509f651a2856aaa4585c4d53cec49e0553e7367ba93f4e2ff4f07a00b6a119ea6987517b70a8497ac56eebe4dfa6de1aac4ec0717ae56c4dc480532214ca3d8fbf559f1be8016ae395b7115018b1e566cce7444ca5866b682db7a1f77f12636bdb96a99f25063f4985f4fe5fe331b6d156a83afab1dd78f773e25fe957f78a13bafa08d77c423dbd47b9de067fe857b3b4fc3e93e27673eb0e08290027c8ea6d1a28dafd4109ef6f32c255ca90786d9a6f1616909c8ce3ff52cfb40f1c77d9a9dcffcdd118f2f4764ca1e4c226e6ad16b68ad710a24327073441b4d06684c3037d790682596e645b8de6f52a062a03119041f55990e4409386d7c9fb105f7f3e050fe7585dc5bb5342a7b32078352d0614c87c02f71da60000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0012696eb4fb41fc017d8b63ff8d23931a4500c414f3e440693d86f89686513bc7402008764a42331789bf65042d9201e2d7eba3ad2d4d4e57cf43c8c56e8cf25f5c0035f5b9755f587ae48a37589d612fc678209711d7359b5d2ba89d087880fd4dc0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed6a383ed016901542be2b1969774db06b7c31b68e6c8c7fa87eef6b29048c5d87730b293666d7a379843edf30fd3a2d039fde97f2425c8a34b82ef854499db7fb0b1ce90f59fd1ad1b664667a812bc829e43c2f05ae563baeafff1acee92e64d5579194352681ed5f74fc48430d5b3a543c7808808ddfc2b08423dd6f8561ece58f7c98374aaa387f8a012f49e65ef3a8019ed9310465477a054bf2c19f863d0af5857ba3159d1f279dbaa303ec1f9af2f503cfe24f0b0a587c060ba23a17bd695e24eca25f05b41ffbbe9ec69de5b9291db1a2760bbe562676786286fd7dbfe313d207e1b806c363b271b4d33ee839fb7f76a359a7b6d5bfe3c87ef06a181f5e04257e32b366d7721a7cbb417b7e7625663ce2c694d16087ed09ce08001b41d529174d4f3820fe097bbfeb21ee4ef9e279cb2e08fb5cf108a907692eb93a102437d201f77c5bcef37c73f24c85a0f9ec690866c3a07ef1ee540c5c2a728335b93704bfb0d10afd09494b9027e22cb28bc5352634f11a376c395d8ebbc0a96f7eb73bf2fd5b6eb34fe1447cb6886f46b6c00b1ce416dba56e7f228075daf158d6aa42980d387010a938995ce5e2272edbc87aa2dbc225455031098095fb7710000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0011eaea04530d79742806b112c3d2c2682791714a354544eec887b7fd5d11e500802015cfd1d505963aa093aa2da16a06f46bc569ec4a65ba844a9d521bfe0076e44032c3296e39361a7cd0b491eac1927611ccede5675ff710488852abfc654dbcc000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4a47fd6dd130d805b0cf45738dfc7d82358a1e75ea0ff3e0eec43265f8986b17e10a86ce2ccb75e8e6a8cd9c120980c1cdfb6921c1d31cb2192171bb806aa42a5e1602091a5b547e729e561329bd9e811dcf876bb67315584671196df1bc82974b77bbfce46bc8cd897d6ac25569a595e4f67b3aa2b79b35ce80b8a2f8f9864e316514ebb5b1839db078f931818e5b2f20803ebbb212cab20a77da530fa6e72b373d0c780d4a49dfdd52d56bbcf8a619b4094642de3d2c5fdb473b8bb674296cece746f6fe384c00c214e9b0193cedf5e7d5d92b45a01afc4f631f21128ab4f6e2e93dac908a13beafa5f7630a96821a65726d1237f886e74bfb60a29cff0ab495736e981f6b3c39a6b88582a81acc6c7cbae2b0cac0d1055e703a658f291f8f893781fc8ec7c18dc05b824e02798f63df3531f272bcbcc2de54ac821908ddce24b2168effccbe8232b53edae9316097958b17094565cd1b5be1f64e6708a08d2f86263d6094c47504abac5c0beafb425ec0d46e112e69454a54f81a5b8e9e88b0f6ccf9adfaf7daa303815ddae4fee65a47c4238307a0e83a1cbaa4ab2874b2dcc5abb864fcd995ec2b3c8ca5462d94fab4ac23f1caa6470d6247a57f2326c0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0010044710caf1277a8ffacce00bb134ba0645eba19f426aae0edbf2f25d6d302c5020197fc7256b0a759a22b8eb2f5eb5f012a866fa3170d4cbced7d3c2df759188e0ad4674924c7c3197641dd4d0362442ebb17f79f789c255af15140e4d3e3c3640000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c4cebf3294cea1fa4a797715d92f17c9d2b09acea63341a823896dbbd3b777eb3fbd37ebe753816ae6b6d6d8a4589457f6fb09dcb287a009f30b6b5bf1fc1145fea667d9b98821ee25f7d6e2721fe16020a6805cd890cc1b5cdab69c1a15739aec7162671f6bd5270012827933822ce8efd583e84ec2b20a8aaf3c14234995299a552553ad7e3c835957f7ad5610ac985c72c1920fa3369227d022bf4c43ecd92ac51f6e7a0b3aeaae80ea947be6b89b2a77fb2b01f575a04987732fca5c6a06163009f6cdfad36ffaf815febf58e4bd76d895f16434c9cd55693f66e527ab25454c4e3eb25687736a4a51541114c6832ff19f07171a919387424e52abc9ca132ea489bd41e55bf2c3710124aa5fa90827d82d0a7cb1a71d0ab7a14d88b3f47e7abbd8b3f0c721db9005cc0d48917686ae852319da0f8bd3c853b93acfcdfcc287ee398f8f01f806c5dbecc37abca5fbfb74318384e5a876ab6fa5e876fa0d4f923347b201a568b5f62f6c37c4a63f95af49643aa503a0c1b2d984c11f1e43875cac19cb08973714222ded102a0e66fe62e2c998b747bef71e70d9a1b94b3d0ed4de360bf7ae5dde569218cca90f0cdc601e91dda4b6c1d9cbda682855f604b0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f001101b78df5f1239e0ddad3133517721e2ae335519d432a0f8528fa9790b27fd2902019d91b6fb876d99da99c21f86464fd96de9bb5faadf2138f1b056acf153b78911d141323654a00e554851827e1df5cdb9e9f5d9195ddd61289c17adaf58f4cd00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016708e82827f5a9bfab2f82f10fc25311aee4bba269fadab661deeae4449648a1748107c3e7936e9d9c2986b5e83811c6e711e14dff2abb7276cf9dd6d8eef22fd8ec8110b8d2c1ceb01c162f3330dc22c7cd63e213a5841bd529a1f39604ec17a056095805e28ad4bb6947972fd35604c79f0a05e94d99abc33d61076a8d8cc03f48b35583a398ff71b41377e8a4f40b5715cbc5bfce531732c3d4c3b24162ae5f5ddf2baa89246997c25b5b2020f821aeaf2c6ba13e41a5241d24be2090d20de4a593d08a3de96227a62a3c09e753e23fbe21c93441a5239dcf8788b2194785f33dc3927cd3059368aec35ac168f8126723de360a42fe27ba682b0cf72d6ad53ea4949f20656930922016e3540e886b28ffe1961a557b7620bf4ada476dc118d82086c43ea3ca18755d817b15d9800e691311c7ba93677ab6f4616c7d3679c6a359700b02e02e10b5a43e8b7e8dad29b0df17f8881701971c10ad6c3390719e93c7020cd76de83259ba0b900f1be58274b08287be3719ea44bb8c65d71052b240163c7b0dc64fc12f2bcf5dffd59e65660e1e9ef8339c63dac278c63a24975a89b078771a52c10290de99bd9846e097c10fab8938654070e9521da3d7d753b0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f00127ecd2cf3737644fbe2f8229e79503c4d39c44cf19854e99ec57bda72c4854170201d1b32678e85b6fc6ffd57b32f727572315dff68891b138b982baa74c3f33171a0b60c8de430b7aed95a6719c47fd74e752675b5c8036a18a43ec622cde63c60000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f922a523c2ba983ca5cd8c7e6ba042de026cec66fef70b564163dcdf63b7d3fdf665d10f5753517221df23e5441009577909f19bc5a00bf409d13eda506747961b5c3fc9863b292469c20e646e2562ca787df667d8768af6c1da3fcbff8dfe0939bb2eb7595fe6f78386f16a89b9723cff5cd496a47326958c0da0825ba2fea0b8fd33db6fc04df587aca3d6fb9ea8150c182f82d3d0fb7c6818afe2d4151f07fb214441a85d2db0f78dd4a44721a2456135c9dd6c32477cc193c1a77f22f2e2deecc626e6e3c703797dd56542b82e7af0df1570518242ec0b36d3223a9e88086bc99ea058d28b31497a4bfc2756bc2c55231916fe696d2fe1e48af42a854cc6bfad7a9365cc54128c2dc40fd28fe8eaf20069f3e6526f697812aaaed373f7878b99f3f4c4ecb8443546e00cddd63640231fe66463ed01e45cb058fb656af2568a946f7607fbe2960f7358ab66f496e54f71e8e8507290ea6b46dd0ac40dd97ba3aba864f40a8fb2ca2237f31692122589627c8a95a9fbb359c6dae79624872b617bfd2396c14cae448640c37467f6996593f0e43c28f5a4a3ae7dfe71668582f4ec588f468d17c5ba07ddf4a77f5df518496684a56dc85aa186b983a2081040000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0011c39a8afca366afd7959d0eaad4fc6d8922517ebbc761ce9fff335226dedff53020299e4642007e120acafddc49179c60330eb536daa752ec7d5cc83a08e3374740e8e106e17cf484f334e1beb9df55d69e01793acfc2971e701e1e06deb69c2b60000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c2f4b534130400bd14cf01b039360e50ed5a3cac15a8a0da8ce3dd73e3280b34b2fd6f7de35469b74582873201ef923bb55caa216af609551b748ef68da64718dcd7545cce388b70316dee44062442d3ab5fea46123fd60ce9e9976460ead5c417c7b323172c714baf743e79a55855de40a145691026032c46215ca625a0b3bc3a2274064c8d82c0d4e770d50fa97ef8fc66e53c811c6ba51179240a123c23cca37338645b82e8ea466bcf6b1b5900b5ddaafadb8b93645b0a582de983c56e15d967061e6493ee046a567ec2aea7fda6082b00c46710179f85d1c39730970fa8ea10e3125493d2443fac777282cae0aba4fec1d580f1ee7ba230c7e203b0153aee31e7d6bb8f0dd8061a89b21a87ec24abb499351c13ba82e03b2839dff5bd5a90bb667cfeec8bdccb51ada71a1de89cc983da50c4be546e8a4500ed558a3ae55b702dc6b696ef17a5244726686ea4328a21070256db057e7831a55626e06e00cf742cbf9681c12a2ede8de8d6ac119baef5d0a41f128572afa6024a792fcd106428294d04ba9537d9c4e85e027e14deac99f8147c493941a5ea7c251e0dff4ba1e2a4502134bcba80685a090b0a76c1d8bd7f3764c2f683855612fa884e9200000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f00125abaa0efd26812074db07a5d2174970be8a34b68b4761eccf29c3b46768c0650203660f4a676b8c13dc5d4cd88a1f62ed2422eb375fe4599083ff6a379069e2a804c17b0acea8e48756f41ac94a03b0d27a3379002ce65c134b466d6149cfba5f0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a7729ee019c89fbf69031834b97e22b8a07c5d7f70c2685194fd8f14dd37ac322d6e753c5430e1b0608e89549bb6cb86ace06c426c48e36eb9e709f9d4c7415b8d52fc4cc76d6b95fe87c27e1219cf793503659081f1e2022adf590581f64c7843621ad2ec837ecb55289f731eb4662a23af9bde0dbc705d22d661847f465c3f84742b9653949a3751fd049a37efe2300b07f59b2028b3fda11a0dbc94eab61811ee6e760a304d6fc613c472356953bad9e4cfe642e05474cef32c7212bd3d8ad956fba8c5b755557d303eb92b3ffde7a94369c5c1cf0161e5847e9cb134bae780365532ad340995709111431dede8cd7c8d9b0c79ebe9cf1bfe26f7bebd42a7248e201a62303e809a682b4d90c31131e7837cd7b4705df95116fd27b5003e2f46a8e874faca6bce06f1813aac22bfbd7653235474cbcc9dd303e65e473d6a684dd8a088290940073ab30ce926539e3c7e17a29fc2031453e44060ea380f1752fe8ac23cce65f79e8746e8692b4380540c21f2d19ffd4192fd6d30cd904a1548d9936b1278acfa7c1a7ae104ad8387f741a9b85dbd47528b92362660e82c42aa3b5b2930aa1900d2d71043b8e438b2c2536a6a1fa57de116948f57ef1678e8c0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0010cf4ac9ae104448b268522c4557e83c76af7c7b7442a4b23e7f91fb86c0f35d40203f2825026b01b734aa3fd917f1ea813449cd82a84659a94b1efe54ceefacd5530205ceb07cb3d278ef2f8ac46f1b918080daa31a12577837e5c65748ab2bc4f0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fc188580376b6b57543efd2ff36199125d8d729e554bb4d3dfcb581969be21d938f4aacd1b2d2378ba4b0b66dc0b15ad4e70f9067c6fa90a21c84e5f398c507c4436367f025b1c5330ee1a5b3dfba3033d4cefdb9a036d02224f233591a1f80f75b654bc684f490afd1a9e1f596415515cd4c1c47a62b0ad88566a13396db0b0042cd9276954d3a9849488397b7f98662436c911cb5249584e8fdf0c9ad7cd3e4f2f1702bea0f4de40990a71ba1f10c2454aeeb075f9e8ca7a8ceb06fddf81cd65e96e2cc33b321749766a845cb66da6710d062e344659ef83180c55f373488d73ad3f44c72fc955c7cf7cdab2d58ca087ea8e95fcd70afca98776b35268a235f7ecd9b648139f6bdd8a931bd79025b8dfb6917be3ada1cb77dc05bcfae067f721a118b72c8fdf6f04a602d3888d862662ff92afbef3e6aa28cb74fe86d7b468b47584056f41d7ead4e9495ea9bd464a186b5d688773030e20fce7a9d4a30afa4c0564fe749b41cc229db667061b7e1ad8157fb9c2b33d4c46eeaffe46535aa5c10c4753ef26d6e8cadd7e92f7c469a7eb936485a298b7b9396d82896dff4d584492db6c98a1d056b5b1cd1e2b99c8040329b94b314cfbd7bc77192e45383260000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f001121ba74ced73273be67d0a0865211c974ee9d003633e23c4d2076f0f9ff0ce6e0205ddf9116eebeea68e9d464eeeb7a2b7af29b9e9793b3437ee29616d92d6f11e079d486378fffe835907552bc365221caed8f38cfd3c44a1ae46bf0bcdd650e300000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013f16c67b6479a47187f177cdb70b88a7ab4fb901b9e8b76d41e6cb063e9aff62b9b183ea23188148ce6e24b5036008e03769ace8e558ba42b64a3cbeef16cb2e5ac6434120f20a6cada0c2cc103f2c13595cd315761c0df4e4b4840f6d190d88316703df1d82b17812cd18b0e00cebf68d954660dd601e8436d2433de6fcb978f2a299a8c58e06db069d0e0fabe3a0abc90b20ec84d55f38a015d30defe7c7bc0b3d509b79e20d6dd9a42546cf4de55316d1166b6b200082844639ea158e51ec7f774b5014b620e791632e76e7de7ab2e1f1bef03736e6af6a21706d3a18e62297a99aa27403d515ef2cdc6d3838754919a719118ae4e16d0b0a59235552d0ab69d30fdbb1bb2b22e7bf2c82e3b75735da3ad458bad0e1433ee138d3d30947f6e239647e60ba407e066236070dda0cbff5c991eccd5210680e9b3029890bf63158c03d0514f5e089b3b9e148bbba8ab64ea43e6787aae74fafc08648138656435c2f248d4cb2b816df59da3e25c8435f681cf2b48a8aa9d3b07960b8af24ebbd02c7fb0f68537159d5eee02fedbda1dead577acac3db83881e1d4d08b299fda0bbbbfda6efbd393bad3b45649098f13bdbf789391e6bf87ff5f9e9300368d5c0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f00114761cd7e67cf22e6570d7c4593826478d597a1d64563d057c037be84d7fe7cb020698cacabd5f66c1049d01658ee1e340249d472ae7a69f423e255e1e34014cc104c41302ba02e737c2e7661a7ba6ee6a3c64b1aeabdff31b5246ee171b5a0f56000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000258a42507c02fb0e1bbccf263b232353f4cc175cf5a8269d4b83a5a9b8469fbe805a1d27fe2042abc5d72846ab21cbf8c2f6475905c79f73acfef3d474bb89250bcecbec43dd3c49eda7564a56a63de85296f4d4a3afcf05a00e50bf05f2c4fa279474b35d74c186d68a61eae4c305de750300410084a84ae309b3ee59b7cc284d1cf9ae70dcc30d1a79f14bfda31768ebb24b2527ac79a43fda241673418bb3f7de1414f14cab20d9e832442ae55790e25eb235756f7c9143d35bd834c59056a95a84f098f89a490d6e9d880de8921ecfa4c3c8d7c702c0bf91a0719f3bd5cb65f2c866f667ae357bc8f9f14e0f15235ae6ca0c6880fa551b5ddd7415d89e099b8ea741a393f640d546eb720f0a68bf95ee87e1c4a0561826c46ec9bc40b36158b253c81d66f5b18ba14d306a49e7c7808cf2259dc45eafeb457d15e07f60c2ce5a953ce1a6e25c35f1be53fa8f31a704278cb42d8860227364eebaa4bd179288251f472c3ce1101c6ff3c746f8594b2af178a886a860b7d2ade635ab9ad51ec0ff38fb8e5fb8f08ca24e4df62e3fd4a123a55a37a58f5bb61325ca2f024839942bb901fc96b2f01adab000ed45cfbb38b3270502a1cd51a206eb20fcbb9b5f0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0011dbb2c62360c45aec5625a5d548592e44273f1e038a4130c8b9300c3e7d2f5b602079b7f15aeb03c1021672520c50d280565af15934ece38f0da176ce2d483dbb22aec693d44ab4c6f5c138f493649577aa15eb6a30caab16f63574b0bd7bd347f00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002209d493900f83f9d32d148f66cabab2c930f910ebe8de6bdd60f289d55f793f73a6a5acf0ae940b1195274d0584b9116f4a8bab9ad2d4da15fe1f2acaea128daf7c65f508fabd60e2a5e2f10dd893318db00c71fd5997f7a33c8e998b7a886164af4eff0f33acf1c966a9f266210c8e00ecc3272a0f195d54b3de72332c6ecf2c9dc7208567c6ced779168d208e2c696120145f0e58f47330b705990dd39f92869d6cc0505124b45f7442c06f33c9162273d555f613e2e0791669756a7dc8606b9d5870f684a1ddfe9b3b7a5ac49803d07232c6d3142e3f631ec698ead28969b3bb967a4a30e7fe23bf571c45db65608698fd8f109d881bd16b1d5508aa8077bad5501a0bcf026b079d21635b68a972192b8a3925cf48c81f3bbb8c2258d84d85559f958addc7190a8492b1f22670649c5a0813ac8772e13c3fa74b228a72c2841804dd8cebda5c4f667e596f4de08d75af1bfca7d954704392e81b310e5db8bf7816ce3dcc3c67d3c25acac36c07342065973ca1e85b3d8b9af4383ac21b9c6d35ac3c57bafd9f2754fd666644d6ccd60c6299b2414e11e73b5daa512d10539ad09b53201e9e176715226eb88f79cd6aa620ee4ec04ee47dec8e4306f01520000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0011a5fa7813f9ae215710500a5cefbb0dfa3aea0f2e7de5cf6a7cd3d9aa0f1fb260208204127b1890ed369f26299bbcd1f05846c851e80b74f6786726e0152e23afe024bbbe15f410487ae57ba2c16449b8caa4bdcf9885248f37f1db06a933709a8000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000892d5c3c3338fc733411fa281e8c06e03fbcd6f05727215e0d2b4516735c6fc7246a03801d167f3f1c5678a4badda8d4f47d890acc7e4bf9beebceb044c52051ec4dcff0c38a4be9dc8cdf1b9f2391d268271c8660825bcc76e856c22bc5835b111fb6b4a0a0f81db062f96095a7b87387ec86cd7a4effa2747017a980dae4b66a5da7d2eab3d752cfbe3e19406575db6f2ecdca61013b4d8570633ea07fd1d9a9a9bc5909e91d4e7bdaf1f1c07345ffa4bdf0b509146af35e9ef8be317f603807059933824c6874a36e788e335b5b0a0bb49eaa75c10bc75c750a7e11ca33c6f66c987f53be7bc1fa2e71efc9f7a65b64000ae8c6ee1c5ec75a852de3aee1e8020bb606474398cd92b36dc295d93180c95da49a2d1782c3a775d39fcd863601cbd07c4d41009ac33e578a27ed716903adba5e9dda1ffce53fe28eef25d5ce1116fccda83d3ecbac01e406cbbf8aee72985d092154ffc326d0b511c139bcab190ab905f1be9515274f78705225fc0ee0398a545dc78ea0a1be0980dfba80dffe9c788ff869f3c3ae5ff39edca62bc3332d3a2310c97387ba41042b93a08abc52dfce29a9a27ed643e0157a3d54efa670eb61e8690e3a75c93124b0a70012b0820000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0010ca2333043b34c21ad2fe8dc5af1710837c545e4753d1836f81ea0feebf0e50402090938b8b66ba314c01afa9b8850c309ef83c6ed924e31be73937f823a92fac620c4195494a034e8af901b706b80128a019876c3114ce7262a4f78570aadde2d000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d4a92f386ca314ab758f79e7d54561d33e812119ff3621291276819c1b2011d44ad7143f33a8b96bdcaeba4675de7a8cf75ef3370b0773639470eaac90a36977c0631da0cc075f3902d85503231f3e5f67dca673b6ec7cad9eaa4e4ae3b690f99e339449beb152c660a37eff7bc2332b63e3b7cf272233916a2068d1c21668a6c64baca07202a1e85ef2a9a5c7fbd779b0d50be0026a39ead61e80e45e5caaad804c74612c9353a71f62a33aad3dea888dcd639808920568233e20d6f3e33374617f7a4f8a7ce1df92383b52dff581892c7910f6e2c98c804a00dd7455d21a6fa0fcdcb5a01a7efde78251ca0832445946d6c5e02b4fac0ecb35d91c9cb1dd55498f8f0ecf186d847148175f773faf1dfbefdeaee826527a96d59ac207ae3b703c626afe764f3b0226fbea03374a175540224e2f8893f05d064b73c13676338c49cc38f5bc6151b0ec09cf4f0d373cd0efbd75ea1c8196dca486344065c3c0e48d7a3d24a4b1dbfa1dc78531ac885996494b9912cb31adf7606485be42d995ae2c4f751ecce6a8bea90f2d3d6c876e997ed96280b8ba4740fc8e06995b105ecaf3423158f4d919153098014f40f40ea0726507863e3cb07252f0afcc9f1940000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0011f2c1f0bb9993dd46dfe6115d51cc609ac00a12f047c987874d4da220717cc4c020c57c662f66c688e4d53186873db2b7e01b270fc880894b8ae6ae6f6fa02385310eb96e72ec0da8168efb38d300c2fff5793d4eb92610b2a9595d65682c3e8c000000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088efa4006551103f7d9ac3334ffa5c692d529c1b5356511dd36d7eddafe5743c545df06ea58f2a8e9d8dcd8d884d93fdf4c6b67ad3ea01492a4eb066863d12343ce9ea43625ea38c6c7706e24d0df150730931e54e9f2a7eb2bd0e47c8096d399b5ca771cd535c16ad9a4d10923ba1b4e8a4fad6aabdd22850a7b7bd472f0928da6b501e9997427af102fec2c57f9cb1395812c9b014a9321e6b59f1cf3f953d80cc49ea54ea13c4c5498e823873a8aaa0d5135bae9fc71202b006c5704c7ade26993c9b854fe0091d5f28fac9d0863882a48bf8117b130085ed6eab42eabfee4ec224bda79866c62b0527056cf568e4860e396a4bb1e18c0691e768b959b3f0c0e0643a21648efd24a94efd254c7f39c84f72666ba13d504dbae47065aea43ddd7dbd657bb68fee2e35185b89b1a410c7499cac9a5b3fb2a2fbf4e9595b4b68f697e2edd13082bcc0c7953a946c9f1b1d664e508db35fb23de7f3ae3f69f1fa498402a903c233d1c361593b0e0f5259344c9d0620f84c764d44ec2b588c65f976d41de803504e609236bb2f1fe152e9a19d99f1a42a391ac4c49e3aadf807aa3dd4f6a6bd0d639c76cc249f20e3cc13819e53d8ced3e68ab009e114c589fc2b0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0012e15379d8a465a0eba09a91c70a67d5313189532268a4e9f6e97cd2f96b3c922020e6438bea559562dd658ad17b496432bf91845d6e62b146131b4f5a5e3fa493d254ddeefd5c1a33eb934b90051e4332501f3e0d722a494afaaa4c61584d8200f00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023c08e433287dc6bd1d682825207a6790e03e5a85112249a5888eec87c832ae9bedc374c7e0efe73e0adbe54efba1b5ae03d4a63527d7827c8472ebe637bae0517f31571ee2052ccf42be610746a956f3fe5e5a3771aa2934d73cf832dc25cf1937bb6d25dda15449e6d09d37d76db0a29ab36146bfcb066b8c5935bbdca11720ab934ffab2d1ad118dc350566eaecda6ba2d85acff0d6d25bea5fce6ceb4dbb4b05cb2ff6a4e74891d19385fd9246ddfb0e914a8f3fafcfe4b971909b34af0ed289aebfba62fc520020d88d00228e01a3a22a4e0018a27febce7f82977691e483b0759ca008ef2923dd29e3f4ef2cd8eba2b2d028765a082754784b7f0cd00af8b7963d3fc679e7ffbe2e60903aa5ab5f040443a4d87f36c21adc1b9000df71c9b58fccfa267dda942a8489b9b36d856173da1debbb637d33466cefa8f4ccd68f102207ec294009c651998c0c273a5c152123f2cbeaba5970276f8e35f1807e784a1f89c31231dc6b1b3fa1d6ba011e32e3db52437b2fd47e0fcb3bce27deb248cd5f3386d9db66e3e23717c50b585d51008ef8ce660fbe12987cb7bc48dfce938c6f39fe5f2d709f0d78c3a28ab457d861ba25be490aa65219c84c8c36bc7a0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0012e24256108e422e3b44b7cae0b99a141316fd4b7faa62be2b23d4fe150a66161020f64d36e163915403a9cde92907090b1b2a4af17a1fd0b705d4d512b7984e74809f4589526ae8af56d7ed587af47799b1970815b58ada4b88ba3083797c3092c0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c6248a6bc0a0dc4483c8d8f96ea81fd5891fe14cbd5138ec9855becfa178aa09e92f8cd443bf8e4c3df7672f6239a699f99e1d966cadd94999dcc60f16b01153a054325a9f7deec893df9407ad8489b3475d9c9a9ccb8c16f34e66d81c3fafef8da3517dfa9d834fa146414fad194ede86acc8654384e0255a4e34c5ad74d15952cb89d239adc22a818f084e3465ec3da8f25251d36c283948a5052805bd405ef77a1481b2b3681b0b59966b565686a1dca317f65dee782f47d89e997fa43ff1ddbe2af5500741e252018fc57d6ae5542ec4a6623b6edd5ef388da7032818a08527fa4ddc91ddb083ca959a1837d7a922b5a4a5a7bac59d05ae1b1e71068612560bb99e0e5a5dbb055b0b3f577ff30150ad0719adf692720b0788b87416b848be182bd5e798a8efab86801b8df7bf27cfbb6efea58756b004dc37e5a789801b32e410c91cb66b7242fd0324b9e283334cab6c0961f78b009a2ca1937da84b110ae7e808f2c9b82e5f358343f90427e8fce3a468a55efde51ba1169f4dfaf6e7abd200b162778bf8fe405bccb4fa1b85dae19a0c26c4417108361900d33fa2df6cebac5a8a154d3e0a32c1eae901b4ad98ebd49544e15fe8dcd1dd7cc75beb810000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f001009404d6d81382283b0c13d63b44aa9c3b23d321f0516a22d6e3beee46555b1e02120e6216d686af5fac18999279c8ba1a1a60c821216c61da666067c2cb384177239911b55e6d3ab6190915bfed857ff437d4d6aa35b9fa4be554d739ad135b5700000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029ae5e727bd19f8a4da342194af17c4c678fd072a32c3badbcd7a600813f00c6c37f20d77537b48b2a6de6977f66f2a199b5ec8bea7ff685598320603823e121c304b4f4f6681dcc259e81e229b63f1ae4e1224e8cd57ecfa616d9f82c0e44be79f25f63bdfd1691a44a5d0f4da7a6dcd2594eb8bfcd54cabe7ce124f05552e758169fd45a5d63059e9060253ed80fdf460ba5dba39a576a3a0084c93656c81477638df43a81c07372ae6467ba9d1fabe296743393fdafd46754851bc5caf64ba38ecae7323be28f724d1f5534466cc24467f0c7faa5a6e024e83980610d79b1c7e2e1f7ea7f32845002a60694c228fd15a909131a8b6bd04d715aee01a70ac1a0f5a7106d20a3aa6d452585a2094d29d8cf9fe583b1c7f30fee1beb4efa627bbc8584bfbf050d1c2e824314951a23f00a574caf571d6be9ba54ac699267cb34b72f3f9467b97f5a5c01ab5220bee120beb434304b8eaec6a9fa023785ec01589eb0250a9978256ac6d6288b94400dcd9d8978476a5f33e0bc77a3d62d80dba1e20ae280be3aa903eeaab1cdbea3beed26749b3f3f39cd4852237f619c0d599b0184e727187e8074275690a0ab049ede4924f13efbdd280627fcaa9a317620490000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0011235512df1abc12d076e521758d9067d8663d086c619074b8be3df2c2a82cc9e02121f9992f32112def31b9c5ccec0ffbcc4d157d27b6158f9644bdfb569f238811bdb964d474071bbd043c370bf764129be9fdb8c763966ad561c257ecbb880e80000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d416f24b37aaf0d57cdcfff753fb5b92cfd9c09dac79aea4c98515a8fcadd3462b24febe6bd7f427bee3c0ceb858fdf2a9af8c8ed7d83dd18f604044905adf0d1aeea54a19a3e308193f509ce7948a015bffe7bd1457c963676beaae9418586971a370fe2a3c323d1048d97c0b26ec381773e8f88251846b02bd8e63c83f129ba291a00d5ffc956d33726885a97151941747619442619d34636826bd6df14b4fa434057826b1524757242d4649b58346bf8459d8cdb7c2ba0d012b3849a7f274f9d5213c3fda8d32740b080a6a7f6006cfb5643df0e767454887d5c237c1d67c802598ef3572ec6fb0697107d8e388b136cf04dc10d18eea48d4714d55b46abe19d09114e7b10d5740be41e0c0f11a173e4f9c44e0a3c69d5b59798ae9a5487fa1e69e4f8ee7b47c416ff3fb643955fc74bc5ea562fe2c6ce7cb7067066485931bc1d377bdd6813add443e65f2246f6a23dd396dbb08cccd31f03ae0a9ad7b6840d3f7514d031445b31b6e6c77c49124d8f2f6b754757f9a1d3464ba60c7670cf06b428f88882c54d836064ee57538aab0f24dd7257de63f9e35cf723b9cdf1a084a1e136674681f508fd3996cc4fc309f223954dfb5196d5c8bc6acc66f5040000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0011571f1d935685023ed3eff31c9a7fdd2d4eaf49aab495940ece5e1fbe368ab3c02134aad4982f5a568840ca18e4e38deb735cc6109ae97c28cfb6989842cf4c18a0f5dd693a0f740fbc70eca18147693f58286aebf24edfdbda38bff0fac4caebf0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dc44e908f122a8a5cd69cddbaf71171a59e990b7a279af4af2064ce536eb1cf4333ae8662428d37785d77717c7dea1ff2cfcce23ba0e894142827e6389acf9cd1c9330bba1ceab14d4af5bf6315b54d2a59c9343616c826f56485ca0ffd9165e276db257890de7f77cbcf219c4d02c546f3f458088ffaf5fe8a62c32d423d462b5b57bc7e4787c47df98c5e270fde63613c2bdcdf28ba5dba26963004d2989b99566cab4ec718a1ae9693aa9c5ef0fade76b0ea4ed718e028d72be19ff27a49cf1ae53cfab5f6f8c202390acfb5365dbda7b69510cc4453a582c91f0b77614f2f65178056abc9a972c72e3d90c5bdf64f27b53fb61ed5b720458ce815bf05bb251670c0337e925ee5f02abe6798710cf96a2dfc4cc608356025f6b366e13e835e1433db73326643c2157281caecd5b2e447fc59b0f2bef8c53942dd7cb2b289675a6caac2fe18286fdfb940f244a42264f4852b380450bcce9ebaf3df1db6ba9b25a40f8ed1b60170a37ef758a62e119c60e94d2670b2a61fb766e01f3142819a8ef524a0bdbd2f5a5ae80ed3179f5baf6a365cb75ce9dc56c99138dbbc445c4193b79ab4d8c0c4cf535f00a148e7a060cbfb6d5922f46c47838ba63875c1c10000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f00123e5fc7826bd72b90104d1ef7b719f1dd907228765bfb449191a030abe63ab9902137268a532df25d08b9ea35357752030c69a3f8a25fbc9af61c1171fd25b72a91765c3090b4380f03f021079ff515d059867700350353bd858c88bfa73e243a1000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041d56fa048011ac70973a6b638fa078564cd8bc92320698f7550ed24cc99d65b45cf16e91ed9046c8bf736915f275abff74e2f178a2f329ae1ce7e99fff98c74f45cfc60edc4e1dc42ad8f2fdab5457bd35178190219a55a8f642dd9211840ed9fb04a67f6cced0243d242588d88c7c2237af3c135e2363c67ddd237002ad6f146738a1fb06dabf12133d4b973b5c5ad7800905e8d00a5fff3a2e4bbadc547c84a3fa02d70e152308d56cc5f845a4b90b5c03cc2d2bb1ad684a5e34f11298a97c325d2077dc3306473193e719e47f39139864ec688c01415909b7ac573d71667e880fbe8d009ebbeee2d30894f6d597fa690fbe2669fb21bb5502c9d81870f3bd45f1d18b0a5c8f951dba6ddc4395613ac378b18a71336b360543bb29e559c56687c7633210ecc3f9a7ce98226458332783dbf41e5cd050e796957de816f2f42673178afb1c1120ab8f081ac896871a31816bcf5e098fe6ab1a05a4cd793064c1133795a9227caf9e48b08d4a1b17487bc80d9445b246e2c68d8ce89b5236e542af613a11875231d4723762829a5c623446d0c4fc88b5d31f31e4c263e5b7948f043309ca1b3e46a1af5325762c8287edc330b6f06c097d95a43155d56dba740000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0012bcca05d85812fd5c4a529b24f9f5a1137dad319fb3b54fdf68f696f739662920213eb72e67b9904c827ace91a47eaf4647bc67612454cf71c488037caa847e19f27d3d85c302773ffb0930a194d497391b913ecdc6cceefaf11af9f2fd44c528c0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009586e2e3e7fca3ea3bb566bbeef7b0271b71887551f855549e90ecbefe7fcaab2732c95f1e760f458a48c4ee7378ba9b81b2497cc554a02ee68c194136751389f355d342dac9a5a923d9f0af95fde9bac08dceddbc77bf20b0a80ca2899dc2144a3535ec98a6d2172cf75c21f9d72af439c84959a4e0ef38e17510853321e376a69e06e415f0e810f79dca4b39b2f350effcedca9d22759bb5a672e0f82221b0851627fe97ccf2e65d996964170e509dae23493e44f087a1923b72a860a9847c9bc3c2fe2ebd20b4d793cc7574bed86c98924a61457cf6c029ddfd2176df27bdf19dabe5876a274dd898327269e35f975fe1f081f929c83978d9f841d9ab72eb86f909e0e921758657dad9c216f9b5dec9c0889203ba110d79795ec1c5634bb5ea1e73c78a17e699a72b71b36fb6f84088a7c949316872ba74aa48dd8a96e0603b42f4916050257b7c4624401f804ca167ef44b889078ee1f91bedf67f3cfdccc7e421245c00b2dd43d018fb2f7c0d19450abc9c9aebbd8a505ae68c212eb75e4d2310515ee2b19e776d99fe987848d999aac3dae841db1aa9986324b97f8b519ad83e693ef7dd4cc890c5ad302900d8eafcef48c53ca2fd576cabc2e36148360000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f001262d47a4b72062055e318f7b8ff8be5304003166f4257d39e58bc1559d415ff7021523ac12e6c8b73dc829197a4099e1a091ef9fff3a67c56513018917e422c8d80fafaae9011ee9f3a5e2132aaf20d150d5537ac4d9896c3892d6c984a4c6a625000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000116577a689a1a29cd84fdc52f58dfc4b78c3e598c9c447d5892f8495643bc8b91c0930d87c8d698a63488c3b8b80bd52e65597ddde85513e77b6137ab1b018e1eaaa7e3acb0dec663c190410eb2b13d49ad8d57977d8684686ab26e3d12d7afc19ed66ce0cfd57da431161b358415a8bce5f42c730c716d194d040e6f4516d765b564ff66fd17d9e7392e9ea744585bd58d1d6a5f104f401bf4b0fe0610134f31c70aa489ea435042c2fd320697283062942943a80d2e1f1e14f6b7b3321078c3565485b90dd5b246ecd7493937e4cc9135d92f6c2bb2220ab7390de6943870f1b2ee10dc558547e38ed84f649e0e3716653ea08d04f517e583ea69b0b1c6c40a5fb2c2fd96ab1a2182623b06a32c5d3fe13546a6415e1af7f4d5f9f64ec4c6f974013686958fa59fbad1bcfcbecc0dad842f2c13cd12510df9043e24d4511be59961620f6ca61fdae06c490a277e407aba26457c551452c6739ea14f3f4ecd1f8c47dbbb96dd4889ce044850ea43d3385ebe1b1c5ee9967fa0fec7add1b848dac178eb0573dc8f918e1271d77459ac4bf968729b45fad65870eb7f9c246a649bb6d53010e8959822ad7e779007d3a79ac78c5a107c19aab9667fbdd0b9808850000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f001273b40a6641addde37307db180b328e09b0ea17e8d8a299de33a7562412bbe670219a950e2031773ab3aae4d55050585df2e06b9f71ad001538801b3de26a9a5241b0b3c6e8a5a06b2c66356546499b48423e5ac54ec7fe2d65416681e3c6f508f00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019d2fdafd46302d514a566789c86e883359700c2c6f348420af598d97609b02a692aa92ae2445f41696bddb56ae79c2c8ccfe080e2b93169f712ecc33555103736f485ba881aa0180c2a7d6ffd701a5788e02109a07ff994b56c695563ba6b580b5cf39658c194001d42bd8828efdf4a2e52aca08f9cb674370ff233234ba7d5ed728edfd2786cffacebda701c50c33270c77c187def0ea86fb9c35c10bbbdba119e1b8df49e9a1821f9cb159159c5eb184bf985ab58e8803ef70a4e368de4692c98975e5107a68d43a6366221f12e6956f7742f995464f3940cac6c5dc2d3648f24c7cb8ed54985167df2224d84d75de089ab360b251f11f1e2eb5078153cbf1510e7f386a2a4d1380d38977d5ef591dd89a3afa7cbf87b903b9c849ba4e8e211b9c615be56b49b8e35d6a1908d40e75e58116a8689dc8f008ad391d6f4a12af08568b4cb42ca6bbe373581ef1b834ec349d7b48542debe3ef79952c18e18fbfe3c4b046f07591318cf7205fe576d1ef64ab505570c66890abdb55b64f507f1c52302746184c7307d42eab9fc71290902ea5ef488110b38e65b6823d27450ffe2aa3676d004cabf38da276f965012630ee6eeceafdd897ae82bd7bb5e8d82620000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f00116b3908e5debe72daa5bc557a05f8472f7edc7d368a1d0efc4c9b43fa6d63056021c1b3201d2b648682f0c89166dfd7a11ddd058610481b6084a94384757a21189270e4596fffeef6d92ec5eeafea0776c1233d2ba285d97929035c5f9e384892800000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095baa15f24218bb342cf93657bbcd7da041d2269da720c010756a2c8d758a91b9af2e49e97453195d13c15f98e0c2525d877a7efb78c89fbb2d557f6d85b68190713b47f05fdbd0e0ba9445634923d3b79ccb6bae6f6cba4efee9969f2b54d07e030b17961395d6c977bd306f1026f698c09cfebea27937a7255829b3bf6c252ad162ddf59cd33de4018abfa7f758cb4a68a39596cc381b3790e957fa7c7b3cad27c4dc9c787663608a5529224c2fd2ed6be1790eb6ac7a20fa65b95c3e7ec229302e9f20be4cc850621167b0db9f318bf28ddbb5cb5b0fb8e1f40284d6478811de0b73a7adb9f1ce026e1b045162032021985dcebc47d8ab9e8719e60080b239eacf5a2d211ec33be632ea97ad5f7ada43492065f55d8196d329f4ee028814c100ee63786b1667afb3e09bdef0ad1821626c7d3ac51772a5eeed516266e37411f78e3b44829084b16066477ba9212b73d2cd34de0681d09f6cab3feefa3ab3618144f2493794555c1e60ddb7d4f861b5aadb7a7280944900dcc7c1602367004be552a2066ee38bd19298b290f1bf22bfcb263caf287f1e16f2370293bcfcf2ceb1354dffdba865a752968de2a93e437d1e4a2d1681af00b0c386eb0060923260000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f00100647789edfcb308a388aa9889ffd95b08e0a6972305921479c1731cb5606fe8021dc5c78dfefb4eea34433dd327f123de3302f45c0e8f9af1e432f8223537c1aa18548ff76f8aa0fbe499b42bf6a50fefae3f2c621af99e86435c3c8575b71693000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b036d872fed52eea328435602e8e2b9180f2597a328f1f3ebe7712f447cb44e9737c01dfe348aa86539ffdecf28d7f0ed0ca108433f8371d2f22e436c3f396a303ed29e9075827432a0996b568cc1bd99c203c6ccbc4723e11ddeb0b19bf77babfc8ac320b52e6d7b91e947fe64c9a274af881324c72746f3564903f58999133df0fb979abc10f8a81271bccbfcb322b9eba07c6fedeefb120a2ca0af2a4352ab91c6c28332c056cd6e9d487ee38d8b6e39ae37c6ed7f7c7f4c3f7b9db9866c4bb1284ffa1b454e6f3490f07115c05af937b6e717e70e542d3783307461d69324834987bde17a82ba6601cafe66eddc054286d13ab910ca1d3ac040b29cb19c7ca0891332827d7dc0439ac1435e6a60f788e1d135e383d15d70342257e2d443bb04be9959cd72070ab154e80b6179985174317331065397005a04ca370b2fde0c3960eee944036b55c13e7dec1d36a8b91f4051e30fdf3342ba65b30558fc69164d06219dd4f6eeac0a2e469955e3f0aa1732a7e71f783b0cdcf72dcc9077eebbabb3dbb4bfe99472774b651481ee59768523be15bf692f75ce1706313a5ac5cc311a2a971bbdf071a46bc3a37a969698e98aef6007e6aad00880871284478280000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f001064b64aca500b0924893cd890e019511ebbc3969a4cf3f6e56f729c285e6cfdf021ddbcd52bd1e222b6fb4b37ff00451c0fffc4e2e09f570bb48738bcef55b09b00412aa24824856efcac804de33af6dd9723dbe05cb949faf4b8f06441189d9cf000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab873046042ebd769f50dfec378f0e45cd5a1107645516cba6fd020c5013d535197f3486e17a5eeb62ed1d5b6f5621e483a410c6a9c14555360049014db5f52850815171e1d404ea75048afdfa708ab6d8e1929939dd10ccef7bde7be9c6a3dc3f4213dc60cfa6e2fb315020bfbcfac23ce0d7621cd2be59ed3efeccbc888dc4452286ced12d2de1d4878d93dd09e84796d48fcbcdaa717224976a518b70eba24b0f3b225babfb9aee294cc9ac46d85f016a078c1235b6dc081b1a61c3836eea48e014378f957751cd78edd30ce797189d0813156e4f9fcea1b7f6603bdcbffe113f0080181c2a445ff048921f9ea4f6fe6232916a104bf214aba8f3faa82f2454f64018f395c72fba51d12b12c13bb20d0c14c172828ed6e46008629b98318e4b6f5265496ead09d40fbbd0d8780d45973044f4bc053b53115addf8d7db46731930c8384a68c4f5a1d7ed6966134b3ba145d957106fdfb5d6247db72706e92639166e45d4f45786687bb2cfdc84e3c3920fbaff494d3d791a9947eed23e2333a148f0aa71832a1a3bdabefa4f0d5f523f8ef3ab4c31d1695743d970fafca180b04015d2f18a64ce5bb11b612ca552593711218c4e222b70f7a1a50351d41a830000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f00127ac23152ff5494f7562b3993b0e1a0b90567500b5277d4f96798dc02c209025021e00f702a5ab9d1ce5925bad432f7a826c8b9b89860f36062933f20839cea3990f1aaffd05a44326e7efdd4ac92c5d83c94428c64f12d439279a054e9732375e0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2bfd646b2ce7298101d70dd05bd06174a40b46cba4ca50798dbc182d1e808698b5cc39cd4021e7245e706351208e686a7d2e060c2b9d27666e73c4433dd031275c2f2b1ae0c02c791a8e0e4e3ec325e87b4fce5c5dd8b776fc17aea52c7561490eea5ff69a9920afeb0367c924feb6e1720a087c6112187c61f6d8e3a4203b3b8b38064f2524c26d5ae4825b732091cfdd7b1cc61ea5b365fbd7c86cc0d1d7402b2b59268621117c0dcb9e24139177273713b0ba4fb6d38491f43cd514cb6bfcfa9bae8c113f24dc60d18eb55d34c64da8678f08c8c1f3b7c6a790e4aa074639926b3294a23271fe80fe0910bd195862a1146acc33811f0825cc8628df3b52b64ec5527865210f84e156190c3cc3563efd4f2a466e433825b41a3fb08c3c61d14375f97dac8fec7dfb681f0b10ec43bf2b3b693971e8a2a6a5d62e050e2382ef2b3021816bf0bbd3c51b760895d00550e0059fc6514b6da4e124bd4bcc4c2afa815c88a431ff3164f5c17c5ec842da9a7a67891a0a2c0aad7685635ecee32649e2d0b7418ec81de73b62b8fd72889a50e3b873daf9a4a09e8ba2d003042255a17075e20581a9fa803aa62bdf6ee4ff97e25f797128c5d7c7a6fbdb720917020000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0011c520333f92fa280e4fd0535285eef8de46bae254c618cb5383c4189e4c5629a021f587c6d668717043a5013dd4a5a375e7ca66ff0a07a48ce0c75ed72e1bfdb281d3b7a5e0025db2d8da91ffca5f6a797a75b9b843c5de5d2415ace02f71466a70000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008830b6517427402a378c8037f2b0208e389d44f69c020ecd433b4f6c8d087543c16fa1faf2003856dba475e8beca24bdb56e536eb114242aefd0c126e8b95b3ba6c43e6a24009f5bc888f49b2846c8b0069bac4244a50cbbb729130df16fb9913c36e7d246c43cc4f49f6d86ad1195ba75c24d9db452262d1d02ecc3c5eae9d2d42b9997f31f9f77531af89feea7c080be503920eb4b3ebafc07b5d04e9545046fc94ce1a382623b5d12dc239b4fcafe59daea1fc7adf74fad71d96c60c625ac978e416542b08c5b93c264dab072c631d0f0d28646f5036ad7e89f29e9e976913264aea5741b3b064c0e22b324db2c4ec97a581d87bced221e1c565fc4fdad276624a080ae30a7bc46321a1a286aa1485dbfd72b0ebb71bf677b3fdcf69b40db6149d51b1f0cf99eb84ff717f399d66d8a7039dcb4dbc70f0af8e6518705422da02ae197d63658e80bb01ee2a94130489da36c8af9901d481b3b80a9d4610561e58a9a156b8a050001db2ed05096c92c7b967df5021523248d12c6e4e6871840cdf978fd3a0d4b863fa226b062203c41c0d1852a41cee2b35f07ba3062eedd7f1b576c3fc880709d3032549a89b5bcb0b25f6fa10c23cf860747d247293bede30000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0011e1dadbbb7b9b759f7d1c9eacb895cebdbfb68f47372519b93669116c5baaffb0221e18fccbb5f4ea08901327b6b9c1dd078f634f4fcfd83d7f95e356898935c4914df72675ae6b68d8c9cbb8cc95ac82c8b30debf845cf2174685141ebe2313fb00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082966903b5ba248b6368df0b20f181adaa67aa9ea26f3b8338bfa728b487b5235428cdd959fd9185c866a6c1a2dcf32ce067e04a9ace7a493fd9d7b594c5fb314deb933ab85fd9e93a8e766103fc956601c4a8bf1e2468b6fc251e048b9f02021173b014911bdb8fd8af9dc9e8a548d3bcc63964efdd939c743bd572f09908c8df89691784181b730870bd0c42d4993bdf0c5ae5c20ed8facb707bdf8bcb42110bcd16f306a588b654bd741e64e22e569722ceb38c4b7926ca5d0f679ecdd1d606bf12212e57fb4cd3b03466b8c88beabfb32675df63769f93a0233191029840ed3578ed97f3c23013f32c4711cbd2c2e765a6b5c07dd2d6101ba12ef34a27d1de8d79098145e48c0a6dbd37273fa6fdfb4088abc08483ce7c7dcaffe6ef540d4c9fb8891266b0487c4e55f90e6b7b8d6829c53ca48192e640aabd6128b4aae50f349015d26978294789083cf958d9bf49188cde510e25989421d46618bb01dea9a5321ed82a6fccb92b644755b95ae7f0884f9b3fb2865e0ef727a3c4b0ad7aa4a7ac16c7c13ccae735a223024819a30f33d63a6e9e019059402e08a8851a79cbdc8bd9dbc71d99311bf6a2304c40c49475666106ad0cbb7a49cda5f1c990180000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0012d4d042897103c9d966f7037bdcffe56f0cd11716ff5cebeca92d17cd05ee4da0222b8e5f82a658c3f35adcedc91d8b5a871933ed175b2d5909e07670e49d2ae1d2df11234fabfa16a8ab3180614a8d717670c39683b0ecf24032e954a104a6317000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000131f978ec34eafd57b62919c0b0ae5b81e8b58b508559897653edbb6549cbf5b590aa07ee63d0e3bc8faf6d7ee14d71d4bec030f5aa123432ac871a1d0601a769792331a5a248ecf97783253faeabc08fa856f3ca10d5bae20ceea9ee6cf9c745389ef4a2296c2e1772ca1b8e29263426c795269bb4f8c8c29ba38fd1c40ba2f10ffbe9563d43b63e270d752af64389653937abebf9bb6968ab111d89608776a646df9b51e7b88c5aa3ec4e932a05b8a088337daa120ea8ff0f91e8909d2a2f12fa10d72d1c9987def564fee0ba78b626f737d798f968c5c6fc7f2ea31be8b532a698589418173aa3c9952ee5313e30b2006367a1ec328217b7f0f25567d3cb05899ba4c2a456c0278ca3895393fc00f1c01f0e08c6fb0a32ddc01a66590196c54730b02860ff577cc8a14f3bbf216fea76dc5bae9db8c52bc8b3e5b4013db83a2c2f49317c5f0012a01347ac21f72d55d0f096a03c10f03250a974e3b0653887de43adee7550d27cc8c2804c3e0a35c2957123aeaee9092ffb929f10d423db9a4be7b4e2200acdcc2b626b5223a28af75d70483915454a5e8c2ecc89eb0a544cd383c98960968c9178329b247a8aef9b39c2b3736924d07d08ef0947c21634f0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0012e3c084e8f7195ba938cbd6605d0641ae947a648f01ce2ba07a007c6977c084d0222c46d29206b1a43a803067749823f8ced1a2f036a07c3994476d15bf937422a23bb5938b7879113e8bb8d62e31a310b420f2840e1c68f8f2be23203fe41a5360000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002dd89c0d904e37074a0a91061752f4dee4aedef5f8ca51fbb4722f332c4d3ad2a60fcab94da3535cd6649a9ab19ccbc654c855e50ed4da87fa4136691c61c6c214e258bf4c57ef6abafe76c96b2d4afc098b251b88040f5a46655c23c4783757acfdc7fdca762a886b74c8b72a3664a35cc50d01e3466ce65fc78f5ae27644e9691ddec2670b4d6db7b5b600406470137290325caf731f6b79d377eed2af4632fbe1b67015557f6518a842e1de64a0d04e9fb0794311fc3a7560c429f7aa06b94c4c0aec7cbfd641280556fdec801bd80e94d76defbc7ddf57a1d8a8f59bf0514a7b26c8b8f427dee9baa36007da223ebbfad46633f599d35e8a246ffdf41d69fd1ef0ab2eb5589348fbf6d4ca15300d30d9c9b9b42ecd45ae2d5e5142354f0561d0f73c881d18d5934f5c15d13aa051ade90d2e996fe2377372670cbf3e8faa9ba0b368e7f603c29d19c37c88f7d19208809921df7a7c210d8c6d4f732523b28fc1c9efba81672c44bf14b841af9988e9de96c75430fd87810b30c3b8b1aad3b8f03cf07a5fa97612c01d12ba74a34097cae6655739e5748000ef824756a729c3d1b69ddca4d1c148e5e1e2f064d5dca41a46f074de81e156c27fc6b0df1ffc0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0010bea43a52bb7859572d5b9f92c779e14a4cbd9d67b12aa463c59f17ecbebeefe0223cc1736352ccac7b4ca0ca2ff37d4caa220e0accbe4856cc0fadf0034550b9c05227cb2dd59c477f447242bd38efbf773977405b6de51516a80eba9581db2f50000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fed42a861c872224f672dd9424355625b235d0536e148d506cb7830d25e52039203e35e61e83d0985f33c308ae05c60285bd56e60b68a056667bf88b4b7d5ad4487b418ca024ca8e97b6761268b1726aba15b3643437eb77f86089f69299dde250fab2367b786fea632799e9a15cb2394c422168e0fbaa70a33125362bad91cea19a088d26ef7dac6033aaf0297761eb35b868610d4050120e9700c18a24cf4367f32cc78d749ba7730f948b1f0d8b0eec2ff3293efdd4cd4b5b4a3f68811404e09ad3c4839fb8af1e96ca21f902e533294bc2b85e9807f75188f53380ffbc445fccad49aef18a53edb1db61b8dca0ce85feed3962b59021aafeb6e5db8cdc8a01925b1f97c2a7f77bf02e3a7d164b3be569c90656057dab79187d2bd71ddcc58db1a926729daab06dd26cd8908f483fc7ab2bf012039ca11ae6c1093d84f8a4180c0b2357a616ff8da23ed11a6513df2ea18b219edd8dbcaa8a1b94e4a664c18c120193936dd916d24ebfb02530a52892b5664edd3002d0018bbe316b63e7e404c4dbaa4818fdab1750346acdd8e9d288adfb5b0a41c479bedb57cca4dfaac82374f526e5e3e993336463da56de673fa2f0e73c959d44ef64a6b43798238130000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f001035d0380aad4ae4ea5d5c94b2b92a9357f9fbbaac818791135a8320eef062c9802260870b39e6a5184dea4fe9f9a060c1efdc8900572aa44da8757b74657179d0a2a335bc9f39057e4f4474b23a2c71945979092d435a411f88fb97e6c2ac5cfe30000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a3639a7491c81d37e32a28bab441b92a18c0abc1a8ae712c286d08d6248bb1ab0fb883d66d7000533f6ed0bad140692a45f509c303f91c9ba8ef47ffa810e6e2b8f84ab627f056e899e63ffc1885ad1720d8874e4c5f7bf000bfd3868153928f89033082dd1abb18e16a2002f60ffe29afbd8726d505048cd241e2d0cca269a15c0b29245fea3bc61531258db0b00e8e7145fc5f49dee2b56f70d948352cb5f973605f4ddaaa15810454e9b0459a34b935eaf51fc7525881f4a653a825df28d10dedb36dad8abb8bde1554717c138ca1cd03721d5c3f790a776f2edf6195461184ee67ebed68cc6ea8a72c19ad0c785baaaa24b79cb22cbfbb67a4d5416930a0aa3bf7fb20c0b6166016f6422bc65dea55a489c1be2e535dad6e3cde284fbe49a7992bfa83c5321d9e7b89833cdce21dcdbcad2d3f4a25fcf6a16d0a0d2ae0a461136c68b9c31b8ecc1957e64725af5622ef2ad74b3d140404a4cf0d9c56c4a976cc316718a3f92da294c07ace02e88bd5d4f0306302461e2be6dfef1bef16e1b3fc5e3630c19fcea0897495c4d994bc4fac90c8e839f190e72a388bcf17bfc0e2b0a1343ebac32e46937368f0cd81354da66da87b1adae0bd90a837f145a470000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0011ed891ff599f1f4e381d894ccb08046469dbce0131d9c98c5649c06a196eb1f80227b53ae3fec49b686083e8ae6e11c5e3882bc530412a8b99352c5c258792359b089c1f340c95c2e89cf48cff1529ecfb51920202f1cfe4cf48538488f7431f7900000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ed43930f5cd191389e4b78e8dc5db47db29614111c1c6171bd4e92e1dff1e1edf353ac000b1ef3c44fe183c65f1990a43827a6cf9f8e6c5b61e9e6eb1952c66af9a1b15cbc84b64f5b8cf89017444a3f36b1a541587e4871495e4af321feeb6b6aa195826c69f5654c79362a9659db0b311c5cef5be72345ea8ad60e793f6ec342db541ab4de3d4ddc69d751e4d95436e379d80584a239e0fb179aa9b461e24aa77f2a19adfac9e2f6ad0bca8c35647ce7d2e757ac09acd944fad4206a677c63fa551f562c3b580376a9fe46e9c72a4cd817ed00fcc032ab04a6000dd1631aa33e543cabdae3201464e4c2ddcc8aa1700a6435f2e270b32a9d7914ad5c9154bfb4dcf073c36e3a4da77d84a453026b0ac039053e80061c8d49e2ad51f863cd9f8386b06df804f1996979645753c7675405110c20030ce648f5cedab5c013caa9bdc24aa5ffaeda7e991b1232350070b651ba4ddf2f4c40c6622240825e4ec24e7624fd9c3e628bbce3951a24a8315a09d6bc83cadeb7432c2b270821c7a43065c4f310f778ee614a6eafd91b46e5f4b3b5978c1acb5fd39136e3bde1c1be9c2bbbac832aea0c123551232d663a37fe08754d8cfe5a480c0f10f35d55bfd7c90000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf4f0012057532aec1a58570291f83a52e7e612750ef07a816405818a5086239317dab60228e1bc4fe384f385013f8b09cea81c81af6c5168d31fc89db2a3b47e50ee1716278640445b05a43eeae0c8b6756e2d32828162f8df941409906facfc4d90b759000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000908cf480cf4db7d8573e7170637fd66b075c2ba05c32b5ecf63a755a3e4ebe4a249471d790992ed8df0f573196a291ee720f44d95ba558f73b4378b65f9b3fcc24ad5dff98db676c47bfaf30d4421c87d065cf7c685701e7b32ad362452c990693881329c8ea31dd96b101f60ebb135726dcf0e0aeebcfb9795c5bc160dcb6c50e9e69e99eab66d479fc8f7a5b9739fc7f9e64047309129a6cf4cb764a5baf00edac22e66cb103267b4d23118c36973090e1c866e5a163da26f4fd71878280c44b4f04f6696a37aeedb02d8408f953da751f7ab3fa93c4a843405f1d746133755342a01f9380512b45f43b7f2b2c69582a2471a46bd0a4cd919f1450501515c065ac8ad817cc822ff89b3bd3d8f7587cfd3758f0b85d5290c667d5c6ece56d019923807da762497fda11b44db9421532bc2dca1091f417c2d361bc39e64c74ee195d89f36a2f2d8ce61d1f4b94a3ac54a32374c1f467aec2aa5101fc51b5acfafe845845cc211d0a052f3aaa99d5ea8399ee4d1897ce7f56df5c7fc2eb49ca3a4c063b065676e6cff431c5a28e7c0490f26198066ca7926a5ebe50cf8a7a1e5c42a896b1e5560b89666972355a5559c4c93267b2ed3656522958a05b57292d2700000004000000000000000400000000", - "0495ae5d183ec54d23ce35c4e5648d95264badb3a8b7993adb5d13a789ed17030000000a0000000000000000000000000000000000000000000000000000000000000024006e803b6f5d5c031fc4c53213841afac14b57c01dcc6f5f43f61ce1455f430300089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000a02b0e1d4ac3238bdeac405b1e324049f3cd49412171a933c03e18fb283a56754c000027000aee73f4890139b83a993bb3073beeeb09a0bf42b90cab414a4d23e1f71edcd3000027800825bed0f04513688a20a73113b41d525a804966b3e35ccf0894be7867dd9f59000027800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000070dbda18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad3a14c02c335e1066cc91e2e1b59e0d212e7b0a2097c808e9ce1f19aadb4f9b5b23af5d0000000a0000002400000000000000000000000000000000000000000000000000000000000bec47b0022972972d050ac91c21200fbf80a5f768b4bd958c7bd85f987a4a581ebfcef46e226c2fb0990e95071fce4d335bd70cd2be4d5af93cba00fc7e7a961ff87dd3a80202f238e9c0279431f9d8d15fe69595f5f442b59900063ac8b2adf5771b4669d21626912025ae2856a284286f665c8522c2db9d540466098f32b8e79dfb48f3d000000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e0fd46211af9325b20b0a4c76ebaac4fbc41fed833dbeb893d83f231826a75c94b6d4e7b61673269496431a26eaac71714a49a3609b239ab1117398b75daca5f3df43ff215f2bec68191edfbea386db45b63560a3a33d44b54395e640aec099090bcc6e0caaa58e031ff5447bc429ff9313c001c756f9848988a27058a48f5a9de0035e62ece50b542829cd94d6ab471447c423f70ceb0b65a4e82306c7fcdf58b72ceb149b5ccda9f34de5c77bcc40a8cec71d27d4e37e9f16de2e3a8d888bb6de127d3ac8c4c7afdec96dbabbbf0e61d48be3369c3dfaecd0e75bbbc580b3075734403d9f8caabc0aef22e7a3cb33455f9a5868312971270a6589db7a78bafd3a9de502be21492c6473f745bea2c32e771c0fdac1dcd5c19e031cfe0a2786ee498bec6cdca4162bb924af9972181b4c4b3fe4fb62036c5b26e528cb0655850385fbf74b4a3e599b03d2a063795dda5682e4ad7cae8eccfd9ab32b4c7578575f70cca30484ccaf80966c47945f009a9fbaf5f6b34bc5ff0cde4286b168083e13e873b155cf4c31613489a21cb4bc3bdc9d89c8bd89f5a755277dcee7f231fa4ab590407369f46bcd2a31ef3036786c1b4fc1c5beed76c808cd356aa16f08ce00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b763645f1df1dbd2c8090e72336e4c8c497d5209c16661bc5a4f52c45387873c091991897f44450426cfb667a49276fb9fed8299a1473207ba68fc78675e3111927a4257708fde086a8d7be5b02d95a79312652298bb6ff7e9ca15c9a1b02922d86f233f2bf1c0a195af75e68d8499e8840b2d51811df22013767e876522e51879f55db841f45588edb5fe465d5d1afc3f774c1cd156ec085108f65cbf7255fbcb15fe07c289add84aee01f730f3ac2264f0b61912ff8aaef53e878ce0b8e5cec5790b6a2f644f351fe734450cc350257828f47a61dc6678ce2187963e46fd2be870b0a8bf8f12fcdcac190225614681b72cfdfe8575ccbb8c3d6b0fae26127723a598e73a3ff483f7bdc24a87e7966ee4775c2d357dda7001373ea88b9e0b495dfb5791b4c6e365d334600da01a67e071b4a1a45b34728fb5104d876750dae2eaa88217015a5b6f56d11ed789889ba0ada894eed7f204ade03872926da580ffea65e95c3a93d1934888cc92b49479bf9c379f8774187918a55c1f2e39ee996c88fc3a50b3a99ebcd3a80ffce335b681ab661a727a216592c4c6436d7d8c6939c14e4f21cb815b6efdce2f0230fc403875298ae0eb9b8839970277ad3ff2afa0000022800000224000002202d6346239ce3ceba280186d8a907927a3cb4da40c4856ea682db8a9433c9b4590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001421135213ff0b36c682a378beb4410429dbff431aa47910d9395622067baea3ca00a2770a6b55c6f4277030d6b0f6ef49048b32e9fe5d0b67dbed9f49a24e824ecfd2e0aedfb9232eaf7b281245d746814e6b260968363c5ba24831151661cd53f0030a129232fd1e248a064614f8f87e4d63d3ef97c7bf70cd9777b43611de12d0038d725dcb01860882c2189bd1da2a297e9b782a2ecd49e173caac6d83b19405ab2d78d1c7605d3e53e1d785313d712690d5751d272c9145da8bd630c696598ca861e5c4597ecf4124643872a7bd0e9c3859a8b3a8ac16b0f49c221fe9738844131fc68e6f82377eee1547dd36b08e4a79309a1f732b7329652033f3f1d75f116fcca061875eae89369efc304104b5db1648cffea538615fecc6775410c82059b2bee59edb20c43ee40475174d84f6bb231bc05088ae1837624a5d25706ac3c7dce9ae86b1f0d4e5ea33105d752d5be93a90bf736ea0c950e8b8a6c3de0f9e7dcb3079f5b50d154de0d48fda7f3cf02976852c4919f8d80dd7c0e916317140027ef801e74992aabcc00f85e0b9ac348dfe57a4c3b5cf70ca10255d2f07099021d1682a8791021e194ce88cbaa32bb76185c38d8ee47c6e0e9b9275d9e9d000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00211eb8f3c8e578f1741cd429ab7bff5fff149194cbc0fc56d163ceb32c6319c6b12e64b6c81f38dce216e77414b8c7ab9f1f6b00c269f7376cf345fd1470729aa020394c6e60dd4749701680973d0dc4f5703ee0a4d666b2de21d751ddb6c7fbd1f160419cf245dd92d289c6baa3ca4c2b42b8391235776c2e2926a1d8e54c798ab00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af9ed3e3b09bedcb368b31610bca8b86be319c75136827c45fda49a9c379fb24df0cd62fc2e708621a37eb00066fb32401d96479519000d3a0c1cb4c29c0928576a00778bff4ef64036ed0e09836a46c2f28eec90819861f7e288e8ce20bd771cf3f3033c1b2e34bdf0071e4e7cebc75f8a3d81cc58722d23fc07b1022fb0ccb17c3f952e9019c1499885f7cf337d4f0d1b72a8ba8a0ede3e4e8a0f486583b019dbba904e9cde3470fd21474070ee53356f7b95a577fad49aec99b7bdb24ae979263e1e0d4972c5db654fb3ed7d3e2ec20c4fc75f4ef752a19308a7147b6c6b06205c826dbd7768b99bfe71a4653a35c951d0b51a0cd93eea5473d42cc1d11c46bdd22d34c46fe8f4077b0a333b1782800a8578f40fc322df2994aca39d3825346e375667309a90562e15e1e7d83fc4323747620fb58a1378867d5de36fd70efa87377c985b64489cb47d7f81385c978399f283a9b1d32db7e391517fed5c003df07e73035e71dc930a3e07dea2281e45ecdcf35559f1eef5780dce22dfb02464d26f59c5ada8d1e9c23c08f5292f6268260ef3f0e9d0f0e9e05a426b9c8915022720d5e38d5272b13290aba0c3e3edd6d9a75781d4e7e5d486fbeae1ba5289b000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018844f25b9051c02d86dd2b7c4f8a31fbd7e0a4f09871a788991d40b214534f9f96e08194fbed712101d506c5c70ed7f53ca4511c2ee2907cb00ea2701c465d1fe4031b7c450e86af72fa22af13dd0a3d93beb8b5f9ffdc00873a0de927b0a7ebcef487c886c5a5d157ff9e71053bf907730e5dd07172c27dbe1fb7c5ee59bf7f6fbe547a33ffe0de6ef68137943310ee29a220b1217287b92c4bdba455b0eba4146c6cdbe24d1a82c64292fb1a25327f3d4085e5633c2bed38fec1e19316c19c8351f10bbae3d58f5baab1e43f37cdc0d941ef447c7640ab9c9b0e495e80395e047133857cdd55939c9d91d487b9cd674fae8fb45d05f44bf71adb81423cfd14db61fd9319d707ce0b0bcc8ba3be10028b69250eeddf8a3bf54a147b3d6d4dc0128af5fc08314a4ee77b7e6619a50aae3bac28a812af1fd262dc032a6a3259488abfb309573083ea2f3a8a06f7ac930f4ef450f6f1e61439f9e623f111d2564bf7324824db6aba956903cfb0400e96f864c99510e31d84ed95752a6d868d07ca6b9a278fe7cc8b1ee4488bdd5a8e5a8e8f228489810b8690f9e29d6db7f0d5e5368f9e46c8df1439e93f3a3789d4427d6c8a1cd65fc6b0e62f6a9df0786aecc0000022800000224000002201b184ff31d739c7613f6cf57663248abddf7c879498efaf23c4705ca42a88f5800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000849906013eb33e18b8a4e7587ae7173d607bf37a0fa38d43ac92254f633d343d679c58fd41cb763ad45fe533a32d0ad73bf81330c42835e64b3b68422659926337b53e06c314bd3d5389c0826e9f9566c7b0f6ef4d0484737573d8d34ad5f5f5b69f517cf9fd8792d4ca8fd7cfbaee2b158551a534db562d26d19029fe9912f9ee035ef454a7fb503d081a459b717fffee00bb13d0e1bb6f8ad2ed10834c6b8f93c6a2b831e204b4b9a9607e791b045f4e0475aba0e15ffca762b0ef1d5f8c1f0a5df9a965581f8a9ff32efa027b58964c91a2d92787607d4c93dd2b7d38013b899ac860eebe994ef909c46c6383a8507fc2c3e0ba97c2a64a791d2d68594b32ef1d8b9a3dad0b83968d01968d014882c1fbbf8ed71cca4b08a8309e0fbdcf8f779be199eb2bdf4993361e7640217d50648a660dfa27b9dda0d97a5b67bf6ab745bfdfc4d84088d2ceb7347d61e5b5bcb2dc3c7a9e71099db2ffb3a882a816fc1f2aee721f44144fb76de116ae129530e7abd1a357efa1b7afe177418c58d97ab8d7cb3ab68c02967ddf59eb76412666b1a3dfd8d859b25c408d7f687776a9efd44116ad2a526caf40663c2352d1d8ab343669a63f6fd4f177e049b00046c4e1000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00226aad16132b04355cfd126603b07ef62be4d086ba380d38958bc4ca4bdce21342261f3789b4acda7f5a75dbc5ab6e73113c3eab7a30e002b6c0264808b439f3802052cc1725cd4a4702c4fdf44acf916e5f62eae8432e820da86ce39286710bfaf2cc7f189af40326e486c3e6e6a14db43095a1a0410762f4f65c125394029594800000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009cee945711dfdc584d7de8d0c0ef3233f4df535b1b8ffc799095f5a53c232a7c36fec007d65ceed41f53c6e596a6fb65a9ec6b235375a6651888f96fe32310a705ce65e566bee3a4e710be6a90a4298033504f9f5bb3230a2386e31e544e4d3e624ee2e7f6af57867a3903a0f5b942bd0a0728c37ead84aaa846c8e90c09c4276f95047e6521a446b862118449b2f9db650405b8aaea17a1cbb50996b90f3f29d157fe5fddf8dde8a2e3129fdbad8d7526b147e003fbdc538a0c83567d96bb2660f4bd4853bd62512755c4f588662dc50d5a831552a718bb3ff5bebee7c8a8651791e55bfd00cc8abbfe336f31a475605031fc4ef92fdefcffb52b87163fa0a85b4659687db6ae5c6040a1eb521731502cfc4e1477feefe73965ffde1e7be81127a3db612a37dd3c3fb4f4a2fe0c30d0d3f6296e0e3cafae47aae6ebdf626cd1b7703b046f66b834e3256b1d3d88e831bec30464f788cb36470effbc9539ab042481c9b8c2e14e8c4cc2e63dc0fdbe38b2eb217ed498963a738821b0e77958f4506238b0770e1dcdb6c416c87558d4082db57d38a7915fa9fde8439e4eb427af698c2c1603d51516764462dd8b82f3b4488454c643a9832e5c3e42268501527e00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a0e8c8e461c0be8bc9b09d570c40b6e5bd71a3a6dc79f5b3bb4dad0be6a15b0ca9e373432feab6e98b81b1bd4249ef38a8ce8580e22c067d732004af9026969400db325395e98a4efff013f215aa02483a2fe5ea52cc2aa772520bc22c3f22c19acbc4a9f34801c170f848230e589a8756ea459a5eeaaf523a495abcbbdae94344fc8cd53fbedbb6078934c83b7269e021f0255af102c816803ce811cdc65c4fb6fa70b3b485ff1985d881d7425537bde16526a43e51e725cd255895e02c10b1da13c23bec3a7c9e3ce51027d243a65533bbf4f1af1dcd0f62e34bccba66eef50ec7cf42ddc94dd812b0fc0dc43cdac155168aff8791ec78065611a9f5d87fe1e2a4ca020f3e8717a029c61abe11fe4fb2b7634517f7dca85c04dc0e1e2f7eca78d667a83e4308f6ac3d223d3e98aa2f4d401e36c3f0341993d1ece37f34cf3a1700fa784a4c392f6afefb0c42a5d62bbf4d96d55857cfb4e6fcda9ae68ffd188ccd812f857ec737e878cbe64856ac23ddf224e9cd8cfa8c29584f33edb5f48a85c10a59e0f83d5b95eb8262087f978cb082d07b2c0a5a2aa78f557d0fd825663310e008423d9edb887a371867578e3813cb6c6c283627693bd420bd6f463970000022800000224000002201936b24f2a7c8594a6a5e5b0e22fe9f1e85fad154f05f169573828f8146beb96000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d68c50728aa9d45c1069645723784876aa6f014ad6f79b8f612431384d986dddf47f09398f8041c5d75038cc3ca030d23b8847330bedb20204b497729782253380f60cb22805916eb499fdfdd033b6b158e79ed012df5897826e137ae754fb922c6f19b96ad742b3c76856e9e5a5456b70fe1dc7216eec16db6fdb76390bda1223de52bc626e8a45e8a6dbeb4233c303c888b1c4713abce2b25010aaddcd2c32c39ff8513d41e3834341a3947cc5b0cef55fda800416a512ddbbb301eef799063aa86e48df79ff8eaafc5fb1b340791cd1485113b2fb824527ded704e672ed519b1cb10e644aadb90b42a09ceb3b1d1bfdabbd97a8038eb8594d071278116c2a5017cee01d783445947ddf20d1929b721fa6a00d69110f5d165e8cc78de37eb14d4c7a55fee0b944f90d69f14727775e8d4c44645c6ac09b09d8c256a9e91bab4a58780d26d8edb9fee4919839148dcf60da6814e494fe18e898c94ccd2ef28f4058894ab6713f51d9edcc81dd0a6ecf0c3824238eb528356ef6833384ed3937f1b066f3cdad8953579c7fcef4b00d79a96682c9cab8c09190942378c80a588a441cc4528b5f1997d3f282eb86859b9508570d509feba1612d53f69704c8bfb000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020afa7976a2ee023ca609e17438d9908549ee279c8894d3009d1c3ab48b0824db2c3a2db7574ca33ab5c8fe33a98db530f91d8a2bf4792ee87d5b5bee7142843402052ed35d66be744ea27336d4cf1dc631144767ee0d125c0f5d28e508d7a306fa253558b18be1df9b6a6195f60aea138a3cd0023418134b2f910be63c648e0b2c00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088eea374e578b01216da2ac5bcd2ce4ebd38168f7f45a0516e6fdcd18e4494532cc429f4a740ea648809ae8db651aa25cf5db76fe9f8de7abd62ddaa8b1f79dce30aaa88ec1aceddff60d86a22608f2042071f7cdf6eba0039a9b9efd7ab42ccc41e52e162c8f99c451966c6ff6c0d8b598dfa84519fbf827ff73de87866c29bf8b03e7b01ecea7e0a70e76cc58f934f31ee532f94351e8ee2e4f973700f1f858d7f4b2ad3fb949e1607e26480235e13e3ddd354e76e85719d4904effbb51adb1cb497d253394caf1ed49c5bf3bf08e85e0c97959ba35c887b4820d07c6c837311a412b3b6ecee0c4118baa2439b6b05c28909e631a73518928c6bc2a13cfe5d11d6af04976ed9d9dad566bfb7d8a414727c435f9760809f8af314bdf9076136419d44af96b5ebbfdd7a318e68b19563ed79dba59c27efa702961b55282d9b5046d818f2f7731eb2b9d9a5f0007102915ec60338e3db14125fbe8a01c04ce0860fd2906b3059bfac680310b0462d3d406506d655ea98a25a7a494e452117565ae4af619a46648f8bed8ed951b55a02a635f272f559831e6a1b107fc2377b8421ef169887b3e2bf910f180cc3f6b49883237d03dc99b32919e8d0acb829580e0600000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002936e9fab8a1b9eb6bc4ebd45b99b693895c2405bafbda815427292567335a28f0394e073b77e2423125f1d6ea6a483bb7c7b0c78f83895629ef2f086452b41e1e24b3964787a7e06a7846aa7b4f3aed063f30b2b1dab41ecefbd736b01527390742edad6202b8a756e8a21c6950a72ae937e1f9ef8ca08d9b6a20f300863ba8dfa6945bc325dbc5e6584ad2ca1b3bc7d2998f80ba92fb638ff1d6b8a49ad2dd990938c958be478bbfef463d73cc8871276e1597d5b4af1ed2de95cc9c3e7d07c0bed9809ff57f0c888a004590c75793a3821a2027474906395046d60ea6900b2864d71a875fb558ceebbc4509df21d8c34eacfdc2dfad0bbeaf6ffe7f203281fc3124a22de8f7a123475380ca5b1016bc3e2c103cce4f889a7cacd93d7b915d2d23c7242e9604e6ee19867d4493315ab5b91e3fa2ae94a54f7b3a83dfa46efa377a30d32aaa49a7c0e13e6870eb7d24482f33f0e5e3eaa3c10fa6f964f3a27dcceea0131e949ab284607c46acc61b32bedb512c7c341c2eab0d02d8e176e215bfcad648cb3d9687adc3e14b7ad993c000e6883c6fac6727840dbc98899ec8d74955777cd7f974fa75db43b475bdfef2bbe545e254b10f5c3b342e9ee407f0650000022800000224000002200569174c2e8aa3d2fe744a332d03309138f86c483ff291b8e186fa0427aa140500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000936cc3cae55d9232e099c924219d991242e262a1ba765763d0ea80a5c6ec4118a035b9bf06fdcddc43c1a7f46f41387b926a3b5c85a68169aa38a54328401891eeb23b623a6f8253e974d0e2ca6c3853a3b87508989780ade6b44afb1c7c8fe001a21a681d4fef38c40421720c20d0bcd0cef63616327579d5042f2abc0e7ec9ed6162aefc090b9e6b3c95e07db97cd9829fc192d4babd12bb2c65a6d914ed202387bed632b4f3ebf37cbef3e7cc7b7157b7edbd2197cd93224634b05311d8be6d5252cc2053a58d375a24664259da79c749f3a2e3b7686561d3a0c0a09bb3953a1d4f319f6851eede186067296c02af7313159bad7d6b5fcfda4b2d23920b1a22971b10fd477ba8669f5e14de8f94ebbc855a2f173bffe05a21cf9cedc5c4792d3041a73b2a317bb2549fba2d0bcb13e97ebb47dafd4d814d523a478259fc8c3701ce35b7cafc511861c721cba7c195a61e26d793eaa714f702f7ebecd4c9d562ccb4b64ecf5316d3ca41330750356d90ef38c2091443a7c6130f37c37a37731668e6cdb7601008e3d1c6f80b86d1d87b727db48bde8ea212ef2d7351856ddb8fe9dbd57da161125a9d104f43062105bc9e50180f2e4aeed8242f27eb7d7480000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00211b2d32a02c7377c7156cd36022f97647154ca6c15cedad2e1625d4622e882c727a1217e1354b0536b68a744504e749bf0af721b7b6e841eb5b4c918684592ee0205aa7fbcebcc8d676baa9decdf6f31fed53c92e025cd4ecec936d5965e7a61ca08164c7a8acbd78b706a06dddf54c61b624ac3546ee40d3dbf9e5671c06c9ea400000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d00e6652f74727505f9c9644388f5dc299d2bd7513e9e5d51dba745b65d6eac9c9d6371fbca137df6ddbe0a91bb91e7d59bbe1437b6d7e5b753d671e5a63e3c26873d9dff5c665211cf1ff3174e63a7445ecdb69c8402b3007f3e1de311ef904ec437501fb629ec1a2d769c123d199550bbfa54a92db06b285ff69657935435311464d6449fb596c2183f5c1808aa0637dc260619adb8bd95c310c303ddb1da667ad4df2956241f063d734a5aedbc2c10bd66dcc1d117a50409f24881f0184eb6e0ac3450fee7064b5bbaaf095745b407defd3f5b3bdf1298fc56dc7d96e7283a7d024f724f9d1734ff1f6cc793ff714a99187d4df76deb01fd73993996abab258a35b2d7315aacf116c2b112929c2e94f4a56197f4804df438584ef13f2f5af834f787d37b07c69793615d45a84d76d37d16f838adb1a8aedd2423c8327b5923857ce31a0e7a58099032313bbe260bcef816099178e3003ea664201d866cf54a1ed40109bfded8d7a9949d4b4c11349b97427876b029497dc2a9b19a4cf8833b09cfb27ce751dfb5865dba68fa124e055326a6fd22a0c7c3f20e03cc0206f902c55ca7e53c09de30e1b42fc9684912c284111033e31d223dc02cb2f6e0870000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ba48aaa89c0c7b7eb032860a1db9567681ab02b05be452a67c36288becfd538c29592ec604ddf9e345ebdbb1fbe1c602754868541b9dd9c78d9d519287c526bd40238f164291ab6016dbb2463d6b4270a0465e110ae83233c4f42a4143f8c7380c875db44fb9d3cba54bd87fe15e2ff9c2a4f0bce455646e3a325d774a430fe59fedd5932f9021a5ce17492257396a1394f9065b947a1737c6bcb2e469beb0a66bda08df1e72c3f1b6cc68f0f476f27c3dc772e75010614dc7937693e70bd26dd715bc31f9db3e76ee158dbe9ac1d434222b3b35d67955d3b541e46774a998c186fdb82af3eea64100aaa78c675d09d3f1a35e2dfeb3de21fe0ed8f2d14425d7e018e306aa59a2420ebf2803d5595b7db78f203d3f0fc8fb9439277e7b38f287224f6ec87d527be9d829b7017ff6d57d2414e38add511d392215fafa1cbb66c56e81c659012e67b8bf9978d0ce44915f62854036d457d932b7e476efca59271a5df6854efb4c45026a910660750a28469976068cefdde1749f0b95ecbf8d6a65f772d03bbe4730351238cc8efa776e61e25c96cd91eb6a2ea372056d6e1137639f2b2112499180e5d6b6dfbdf79506d9daa8b365d0e6b6291920ccb7f1606e40000022800000224000002200459b3cd85b48d19a18cd2c16431cf9e73d1299ba539400f12259f72fd89dd450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093d5f5f96569a50911641c2f48e2eac6db45620ebab1f3c91a4701eb96ec3b3ab472a6c43a1327a06615baf54c47dc583703cb60a9b4fcf0291e94afaa7a7f63376099304bbdc318320213c76eaee04c04073703c55e903de2169dc794fd7f46fdadc0edb41163c94996a47b34629d1a17c889fcf44eb3a26182881e6b5b3a653720a763d8821d189a99769734e8eaeb3c7b6df1d39dd063ace1d24eed832d88bf15b0d1277cac1792452f5225e82cebb3576449a3570c83afa3dfba18af157adb8c08ba38414d558bc1342abbf4310d5acc469e32abea9fc1b3b7594aad08e802dadca3e0002231a4080ec7b76d98b314a052b36a42735f079dbfbdf0343365ab3d4f9ffed0f853b9a37fa03c28a90152cf155c0df225170aacb4256bdb4939d092407fcfb50aa867d53134affa1832acc6c9bcdb822090acbbf2310756cb177396e3713eae6ecbd3e7d7ff54491e3500b0456d6fff853680bea92d891b2fcd8c3835eeea2b4ebf89997882af1e3bc3ab1d30f52415d51ebb96526cb93510f59530fca3a7454bb672ced17f18f11d1b7617dd261c7937c2b5afaf8e16694df2da2a222cdf8567826fec68f509fe81529529b8011b99449cf711f1c62e67e2d7000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022f52729edf85d04bd5292ce06a7514ab68e1f7531ab0f7218f9d426b5a0b2446286f805fc3c2c66d719ce21e60e525484d22ed888d680d6e155b3bfe9d62422602066491d0dc723218057d5406cbec87df03c9704f222ff700c22ce9835a85abed16c31e92582d640063d5160ce8b91507ee06cda4bdba0ccfc1e28a39e904047100000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ebdba9a36ebad27c17424bdc8236835fd64a78602a445379494eadad0d5cd08218792240182f7ac0635c8b9ac3407bd3d506fc1e0b42e2c01087c8c2df94712db649d25c6a2f4ac6a1832edb526e9eec75e1396dbc741cd25428580d1ef48bc8b4e6f97c952c8f44f8a2fe31a8cb7961c6c2fca5388e54aade296e0838fa99ee2ed2cc7ed6aedaf62f0f644a88dba47851bafcd1de37a80dda93d73cf440068baabc1ab40fa76881c62e813c8867006e882137334a4514587a3b26926d1c18f65daf8a0f51183d879e46a11af8fa37703b354fce970945210c17e510981c6d97941809b664cd20d427531e773b44a8dff8a58e25b437b41fdd869a7549e6b93109169783c985d04cb0b1793db36114c4df297efdb3ea6a0d234b2ae161287e54a84e371eb48fc08ebd96cd901a6ad044da07e644ec64b59c9f2f85f0e25d9697f758edcd4b79f40736060e7b71b0082533f46f28190f1454d783448a6edf9db3b8cee30d01ea4c3202bb323ef2f495f84a1f14e7d0b19c45442f437592be6c4bd1cf1249ac43109569197454749ff70c78aea27c3d279a458d19f0f4d9be90d3392a06fd91442f115986d69448f5ca4cde3bf2bc497294ecafbe008011dfb1d0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a57831ff9efa47b68c06bd5d680c5774b49b66a8015dac918b57d1564423a8feaa7e4b9cd0be433c84596bdb19c826b810d68186377e06771fabe8f617f59fb999272d936a2c683f003575d1faaa70af9a4499795ed6823f621f0a653012c0a3227f3bc4ce049f939757b50d3632f13ba431de631976f05ab8bd33fce6a58e2eccff144cb80753b3cc7f77773510883fc114c6825f4efd42cfd3cff64df529e4716f3057f37d1c94eff70fe5222a1e082b023acb61c974760c9757e3aa675da80df4d225eff4fa8842eec046ca641e8f4be9956cbe39c5b42a54d140819d18c3d78d0159b3f0554d2cabca8619d840aea7da5517ad3e2743046bf8eeb4a76feef98475f85ffb2abc8a454c488ea59189461d3861d65f4ef09d9740d11849d325a195f2cb6f2da63e552804fb5d8953307b26b33193c2b28a207ceb0214bd39f17edcb2d5ca7d708ce7de45ad57eb40a988c351de8f0d87554b5c92af94ce8e44f0e93f5cd32ae4917ab09c19a645de857f1cf454ccc07a7cab924b34d836a6d1d1fa4b9ee09fd153aa33af871fb3110a860bd46f1a132663bf6b58bf15dce02c67da0941aa57474e6494042e3903b9b1db174c7de534c20edf6d7e3bbd44a73800000228000002240000022019ab080af75dd06f7f9b07db635f59e1b3374c1f7b8ae25cf17a469a380d385100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abd7d785783fd2b5f1a365399d8bf055d76eba994983fcaba9ae33eb907b61d3c8d44e3f5602e888eb590a047809f354270088313a5b3504a61dd2fc148d9527136d32bdb3473fdee10d5daec195934ec4000f8bd1759d78182e3a4a3d845fc4f2a2a1cffb897295e600ddf20bd8ccb7fcda967db90090b9551773628e88824ee7ab584e255ade87349e160fcd5eb0b74b015040c9aa23470dc37c77de06d4bf79958eae346093ec7ddb6b647a6c2598e33ee3c36011fb8305900c1ff038b3d8db12b730f36333ac1a99456d34d4c9a982a969cc76d748bde38ecb57016c55016804d1dff11c824c25e180163fe48ae1b82c4de629afd9bf8654bdf18be564d55ac356184450ba5c5eac3c0404aacf5c829b4c19b2edd70d321c7fe8a14cdffa85cab7ba3d24b65936575db71b9a9314f135bc058d32ba0dd71b5774f4f213248309bc799a8571f82c36885d29e708d1878c4c6c4e6de2d0bbf3eefa1d4363393b2212503dfb0ed5f3311ae5c4945747f880ca7febc57469bb362835d12216debab723b5911237aeeb3e746542e4805f615e3f70c0951dd94147867b0983e0ec9932a952274aed63ffe44b284df34dbe968688bfa03b044247d812c55d88c2d1000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002068a1daf3ba05f7be7d2a66c99e280ff376ab6ddd192773ac024c45a3a9dc569035764a1b6d53ac709c9ac62fbe67e11fa85a3b42a820ee00f0683a55ed302e402088090dd1237e1d2ed451976f4681b16257261be4d82a87665b8e6a669500e590638bcee4c9959bc2ec2440b370cbd72d3c428251d327ec888b2c44c8b688b9500000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081a29e54f405ddcea7b172c4922c6dc571c2f32233ce293a2712609bc650d2b107c2fa0837f4bab324dc67dd59b26fc9cb3644ad3253ae11bdaa384fc7892cbb11a08228f81f5a53532c3d607d0c9c1111e37358a8a09865a5ded97413eccfcf6c281b7e94ff46400809a2264c66a2fa4b3daf3b9d61a39a1b6f0b5dae30183b21e0826c2ea4d218e3e2c32efeb466af2fe597e4c8aa71db813661d5e5a38fd237c3304dd2e0c628a4297230da62ee64ea285808e0e7fd1d517e7a0bc45b3e835e1cd0f06ab6d78ab229a79a06b37eb8c3becd13a3930117a1e61a3d4a50db91148ce4d0449e6541c13ee5d4aa16961b9b4b8480a11b0f6aa3208a125fe53dde60b1668b049081ffa2676a87c1b15df72e288ae2b1376653a5ee7352d02f362828f836c440f7297536376f7019e97a689c0818448929e138ff583f2897cad60386191d83ec124268d828db32dd832310c17228b013d72b70628aa4b278a972ab9c02f41265cf7013bc89f0d5f2ed4cc5a77b79f6ca4befa5790d60e25edae0aa457116b309d93d9a6df1d2577affbb1b78b407432074d496e600cb7ab2fdd7c9cf17d48457f11f1c0dd007d56ad2ef4af26194a956b3b7081b04a4bf10b1871b00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f87e19169818a0f3079622a3d95aa0e134ba1fe0fd5d311e052f0bf11bbc7b62b330d69c6b772cb34eb42df6f53fcd4fa4d955223c48146ef23079fb9996c529bf2f13a2ce066a513a4bbeeb8919c92174c8ba46efcfce9be1d91ab9546749ed931378ce628c349bfbe2ceb3f92bee1e0a2e79afe9cd97fa566c9171faf57131aa08eaa31db203a94d966bc864359abe6da44086b4c7e17f8f1dbc7c01831d1bc5a56b568735faf0803d3f21bc3bc4d4ba172c0e1d180454243a6fda096d61cdae98198b7d9a337707dea34e3be2be83471cffb284da9a8b9d6a1e6ce9820cf5eec2e944f4275e46362df4131a129f2d51873456ff00333cbb76c262d021e29d378ba84c0a7dd339f9d4de15e0b41f323c19da35035af2381adef7d41cbce167a3406ee66d0a2762dad5ae9430244828403c4325b2091c8a5aa861478fa9c202a5580b23a85cb940a1c1b9664599266f2697afb025a507d63d188306779f41bf9749152ec52d33038761e74a0208224787c680fd636c9627f469dc348477899d953a8198ddf02e2016efe8bf5a980becb4e51a868d650bc6ca55f46efc7eb5797cadbb1cd6c811fa7760983af678c0cb92dcd46557ba794d0ed45764b8fd77900000228000002240000022005fa6cc5981b462dfef025600a2133adc30ae6b120209d994f6b06590f8e834e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f8817997c17ae6765390199c18d75a4b3069ec3098aee153072dab018d1bfd4220c57f1a0835bc0b2f9d38725c9d01e85f751b9c07f3b317df571e2a8dd33650397ba3ac0b6aa85b30b0b14ec41298f8ab297d94807c527de38389149444254abb17cd1276f9fa3f3566b2d3941a1708727f73e8967946d98bc790d31d4ad90eea1f8605caed989b7e1cff967212fceda3b365f5fcd89311aeb493335ba2c34d805c8aeea71ec1b365c7a7cf790b43b0e89c306161028c747af12d4c1cfc971d2c0a9e8f21451ff8d8a30c77b8cf05b53b6c7403be86621e51aa43e7151468dd66461489d39ef091e2f63aba4400d06ecdb9a183e0a472e0fa5b11e3e5d67b4b68594da8fcd1fb0a42fe9979905d023cb8e5574dbf1e349bfdea1899e7cc5b0ea1efee4250cdcc660f19229fdf646139daa658f5285c5d01ad52ec8d7c37ab2619bd26f61c64a4143ecf46e305ee0484d02aed75258bf52edaad31213b173bddfd792ab18f2454bf897e3c31034def4193ed9df7ef94c009e3bdbad55b6a0476737b64b3030898596813391d5f227ec02cd1f95d8a88b307abd95496518e806da193082068902f19e1d5b726ba0ebd336c151838f79a53accfb44fef8f94a91000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020e11aa71864460bcc06e38e67419271d9b3e609ad1c69da6ee2dc7a98cdd2aad2da03bbf3c2ff945cb0da9f8ce7511adb10562656a1977f7a0e356e2c5e250ea02091447fb47a6ce3f77aabe8a2f0771962adf4e3b917c3b7edb553fff5cd282e212a11f913ff09725151e4cf46e64c4ec4408747786527c0350279a872d0615fd00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f0376c05b11c19d6ba180b5071d50f94f627238574a53895880c639630fe10c360655ca220b87c48dbf73962495620289911a47042737446a0d7e61c2901c182c147161baa9a3d66a60922d6eeaa125cdcb70cd0e0d79eb6e3925df073fb5a0f4538181d55c36f9ab6884e3edc294f95b8b4375c9e0b13fc20cf766737b8157b4f930c51e3d0e8b91c28029fca251b77c59b7ad914f914a56e5513a5dcaebb430711b2acc8d766064058a5350f48b6f89946adcead639166f8b78b29e89448a168a230377cc2f91ce808e2b8b5ebc4a773e6c461bfe058d39b9d9c17185f1ffb2ce92d367efe9a737697ddd4c1c0daf7650c2c3cbb90576e13fe4347f336fa5e06307e7fecb292c04b0f8e404d70c47a7863e54a9133c171a69739d62c05271a6d514881637a20cf392054713a9339f0ed0a1afe1003a4be0a5bf6f58d4fad8c7277254232fe1b1a7a3478b13204be4917902ca90e8ccd5b460d160b93552365aa242911eb024623a813c3b6c7b010a7fc4d8d854066070a5058b6ffaf0347486b9188b5ecf875d065f4154acf7ab3d12367926c30f3d85f498f68b04e1d4d7038f53e5965288cc78a648a3956839d34d6be38f984dd8ee8f6e0df7c7a0a81b0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7e587ff410cfc1a059d7af54f167e6da8cddbd43c0c3e2a2193657f7936604a3f469e231faa38c2f9861a241880aeb126fa9224a65c39b4d2bcc60cc8518a66d48c68776c8617dca939c63ee2539bf9576939374e76fe6ef5a858f11c9c004c1aa13d6c0d12ae6cdeaac1b03db6c668945ff8ce2480323f9e9386092bd0e11e52b0e93ca76d42639af526e05f44b72a8e3194230e1c415dceaac5522c493cf3e697a03e5887f2bc9578afe96a172ebe2941d239477666c8592155e21cd53fea5c9c20cd744a7a7f5e5e5573f6f5c5aee0009ebf3b9bc3e81831bc22ce08669300d7eb879bac026c01343b1b2f3b5af68be4e61f31ba7672abf336d8ed3647004a0a9073b68e045e03c68a5a1e0e71b6c3d9f6c92b9c6ad64945a7280c63e025442e333b8f0cff5f3c7545666405aece369434c7cb899ba65baddb13aaaa6d07c521577bbc8ec8488b5b7b8c03e96e9b52a14b3049f1c3889490bbf4720acdb02affe1e8537a5e95ffdbeeecbae9130e777db42a8ba558cb126e6478e41222d61e82266c1c694cf7b8f722aace4e0298a8b3789d73d846c01f90d60c3e297799ecc0223751f2d6824c68e7b88b69be462468a39d7828dec38711dcb5dd55f8110000022800000224000002200093b50cc766d641b9dc18a05c8904d509698ba8febf445a0525e0373993ed4800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000841c20330772bf489d11f53780dd81331ee4765eb4ada1b166fb447cab9f6724faadc6b9307c389dbfc34fe05f9bec75a7712bac1355be87765604518e726636fe2f1bc951c259bc2ca486cf36eef3d4fb81c15e1cb9332a2ea6b5e2c7651c9f0d17eaa74e8624dffde13066cd4a7246b9cfd7b308c0ce294d56238fad412c0a6af1cbf76b2161742e0b57630703df2eaec581eac291f3c143fb41e69ad9aff3a8b7b1cbd3ab31a1fe7673098ff78c014f69f9f6f9f0de373ac61bdd3d5d2b97ec76f7ee22821ba1750ff416d33986cc32c3ccf3f79788c5c7c1f730e5cb8cf0d40cbe1bfc5682b455a7d2182a362b00b333b2a98ccf331ab0a7561aa8aea3910a6ce6f05f78e25f5783e128cba56a049d959e29a84f4d76351ca474b3c5e7e4341aca3243b1b9bba283af85a3a3bbcb2698469e523988e773206b9069a5c4d6eda3fe1a99253734fe849e36b80cbd611689ba0888b96f86ae49a8850003c6019614ef0aa030e3e968ce9fe4d9a1dcb0be9630e727127820cea1e23000d02b730a9a746a42947c7d20b140f0fe2dce1ea9771efcbe4aa13c0f27efc4c9c838391850541c05ff85d6b4567bbacc88002235055c8c04b0ed26a0546c0fa7662940000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022ca932aed3ad7dc2d5a3dddafd491d1280f7dcb8d13abca1e66124b26118056f02e5378435ffb46a5288e25e0028ca95a4f7f161fb06c0f706273b16a4281adb020a5646782b1b458ab11cd1694a4ba2f397a04b218499baebbe8af92b41a84f0a1dc6f070e7d0b5ac74fdeb0d7acf55600b516ee2acd3ad6c432c6b1719ed51b000000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b04b27bade4205af2b6491c67ee48164d1bbfc6b994203004a5da072a68225fb3cf76a397a667ae8548671016f7098140d5bd989b0814104e58906ff7ab97e19d159a61e20a3b7a1c3602a5faf3f9f5e52537874a53b49b2cd617dfab88ae25a13214e72a6cd1c1b557879f42cacdfaccb7d9ea14f3c4e75be3085ebbdd2ed91974ee7d8f4fb885c6e17981ba84438796ab3bf5d0a6f9db2950a8b8124e68c633d8f70b6b95a5b0f5c32001212515442089245bc733774e96f38791620058dfeffa3a69df0a214dbb6b018c0e4970f9fe1c0e43b3f6b347a09cfd25243f82dd60828fd0f3555fd99b3a0ae63cb5f65182fa3bd2a0b302821e3477ee90cf6089a5fb00e8d784fe0a79e2e3bb66a2cf281dc07c0299966ee5089a317d5b27bfa196f3f96efbb3c69d8b756b3c230b2f3365514405ac828b080de749794793a59cecbedd8e9e6156516767352c5c25c8275bb3ed9c3bd847d388ea90378d40947c1069cc46b10a75f641679fcea33ef7c9e52f840932170f462a98f28629d72a0802ab71b8a4371e97cb0936ad63774abdd3b0d2e5fb71f4cafeb422ebbcd973113ae601b3c4ef9ecec4b310b2fc12f5e88f040663a857f9f1c1862ba355bb7d365000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087bec6fe90b613e90e1edaca2b73e86528b1f9c7a07a28a45b6d7b25d769c52ddb6d92644b76748e1fad810f86065b04b0164ca901544f6d2468b1c4012f4058d3dea9473088d45fee84987c309a8644f2d7a1074061af8f67fb965865e0d963cd9dfc3512906beb487982e835dd3d484f3c0f39afd997ec32c37610421d24aba0b10897b046d4441cea47a469384a0795ff5e38b19ba46ab1014b0de55235b69c0ee4ab3de1a406b34cf4824d71fe04b8ca1bec0b1755a5e0b6fabea38220cb12d473d92d8048d998432c34db5f4bafc552bc7f9c6f6d7fb90956545d78c587b876a015dc34aeeddd9e7729928b1026d6eacf44ca5d0120e58800ed3b762716fe972dcbe898b9cb39f9449679f942ee24169a0a0d3ed04ef4d90041f17334f8985255bbc99357694cbbf6f4feed967f83668c297dd174318defa334fffea45f7fcc3f1cf77fc96d610807cd94483cf56cc3ce6a443c798078dd62d426123087eb6f84f337db65d566e67d50bc0340d70b382b15d3ed5c2bab89e4ec8eac89ffbc9535786ee0b8d44cf3c0c4684f102ff542c57c85cde47d46130799b93d8f8a0bbca51d33593ec7b4088aa8266a381e9f7942e1344ad40d122015309ac6d8930000022800000224000002202ba37a24d5313d3be14cd82eb1449260273e153cc17041c3c801b7432e9358bf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087fde2c9357adc7e3d52c038a4152aee59ca31493eb4c7b2d076e38a0f42badc387880d35e2c2ade321acb7839e8c755f7d63d4caabf37b81f1c9ac2f28156b9eb3d8eeb681acbf1881a647e1769aa6de388c254b6868f5bceae063bc7b1ae68ddad480b181e896f7c48a763d27f77b84ba9010e43315e4ef93ff2c1ad31fe049908cf975bda01ff242b9fcfec097e4abebb7efdb4c6f6f68ee7e2239798f9c650d673a6b109620d6827003cda974c2d9dda4c3ba3683eb96155b2e2dc5906cb2ea9520660a5a434dca6e88d3ee0618aeb257a3bc2c280871e143a0e96b1a56556fef08e8903de194564ca61e771d5d0a656ca17e2347127aec5dc15e79df35ca3630eadd96db1000abbeeddf63b0037a97dc82cd70d4ef2823f000acab951ee1e0ef4474540c46691e0e6140bc0f5d196ee3421be55bbf8bfcad2c65bcd03c6bc0fb704c3883fa866d871812082538bfb81855efd8d39dc0fffb233b650ce2a1749d7efc824027943d3cf972445c1911307c61d80ca846c1da2491751df9e8e123beda6375aa97de140c36506dd2ab3bcf1dfc66fef4762f88a81b3b1af7092283ebea972fd01797e4619909d13bf26c9e7bb36f8c3a0c318f1d562cea52445000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00228a2004b810fce1cd28941651d91d07193029ee98823f068d18ca284ffbc170503f3dbbb5f33e4f21139f83bbdeb9785ab292515301646136a147e19b8e53212020ba5730ad479334626a4c92c842fac7fe0ef96a733aafae62ad576df99aa585f07fd587777c329980b339e4da83002e8a1c1c815621144fdedaabe0c11c8575500000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088150b1c6ea1ffd5bffada55deea0e49f150439239fb702710810a2880747c62c20da0bba29dd513714bb435b9ca63d03e1357ec2d6c99ab2e820ec264e30c12a10d738fed7767a8c438f9bc62e4dfc03ad4d4e72d86549c860505701641b756810d61cc976fae7f105151022f2ce0dcb4e8234a7e43170ceeb410e271a3255841600f3c051ad9d2a8e7bac8ad8f71d71a9933a5e1cadc73a8fb3ad61f1dc1af4827546f13342eab8e3829d431597f010f5c70b29c047a97f317c9eae3b4b8c831cdd92e81297f647b83127078b10ffd807e029d59459d772f75d534568865af3bb675628a89e629a640f3e85d14fe796fc4de5189a0b465e88d4889576ce4a7af1bcef4b8fb78d098d94a8d2da5366a3c5a7d8a990cb93b0f85c4939099c130dc017ec3ff2addd2bf8d0cbf7ba4e7515b7507aafcb5db6f7b032c18f30a8abe14ee8ea926f6322cc0c692deef0bb72ede864aa4adb1803b6756de8bd64278a38986b081a86e5c3811d543af9f7af9ac5cd238b6774edbaaf9a43a619e022df280aba768159e84863c98afbbf472215d465ca34dac7f49909e8d651c612a717947ae63805eb6744e5a501e3f0687c59307aded5a9210be92da6eb979dee0021d000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005e97de4a38b6cba011f23c641750d0f68fa611c7d23b4d3d5a3104b549a1b79e49ea36e3b4ba5ce8667baf390b8fd3325f432eae2fc22be11afa514eea5135b2675fae4137fd0cbe552fc36be6fa5e36ad7a9dc1c3821ebd53f8fe7cc6cf458fc8f5edcfcce1a87f731b78737ed0c4152af99fc76cc725b4d7ed59a8c7c81d8bb3f0ef45ee368f26700d6fcd131f1bf9cac36e4c963470657248ecfa028c5566295eb1225c77005940427ab53445ae56646d5df2900458f5ed4f7428f2e76bcf3a0d330e2d8e6f38b81dc5a2f3211cf1db73f6e19a3dd0300ca1c799f59e300113830617e8cec86291f610cebe678cbd1367a7cb302754a01d44e45b6210713c3d1b8a323a46e0a44dbac205c92bb715f287bc479d39551ee96a6e305710c25d5da92015bf93ecc164e5f3b9753786e7718d10d0567bc21b0e3676a853886ca35b07e7ef452e65e3b956c74a93f5687ac4abdd674e51ad9417a938dc9abac353f347510b70043f15ad465b60a3b1b498210b6751f4c40d02279be72847811c2fdd7cf50bfac57553a65a706c745ef49532e2292f2f36e6d0c5f1546d7e56c9f7542593ae94a145230ebae11af1b0534b74a33c3e714a2a9ddb4a0cc9956161600000228000002240000022015c7761a3f503ae26be410442e423022cf3c2ff5fdf7492d5f1e67a0a4f488810000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025af434df9d7c0413b2e3af2f53befc89b58ae8f1b533faaf94737d2890ef0e90564a07bc4689e9620cbbcd48a2fe016b869861dce0e9d36b7ca5e413f1fa10168b8d78e7c1ef85688859425e378f1e99c8883aece62b951645cf9a77ddacf6d0dd7bc501760f75e2daaf7a3c500db8bc6f2e304c62267bed33c966287806d4499011fdb8f513559b372a4fe1d7d41850b7d16aab6de1bd8c960db180508da100b7d468da798bd295208a61f2964052c289d74d2ef8e181578609f8f352f1a77e7b47e966e6464b263c45857efff9c6a2255876f4eb9a8fbff6de7116fb63f6d7e59ca33dd094204557014e91723e63b9bc99f1f646a0f4b90104a1d372f1752389af58810452f5431004340492cc322531f21ee0d6c2fc27222299859345e0a7052e1c7bd34fd4c842127e6db73fe4be4b7f736afe1ddd0907ccaf858aac758183a1b8bd740f51a9144f41fceeadeb27ec8907da4e59a22d3ab2566769b7c43e15b2c7258ca1e4e3aa8fe27ef95ccb75213e5662187eda97254a563ad8d6074a2647940e0942d819ad98cc5083b51881d6fb2fcd761361cb6c20f3c76115596f158d033baf0cf4ac4f5ff5134c4add8f167d6c4f05ceba58ec270401b2feae4000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00209de581711a35cc6288f83be98deb3dbb591025387eedc8e8f3276aaef109e2a13c994f3e0e12b4ec0e7e677c156109c1b14c450d4795b6abdb3fd59ab8fd88b020baaa95ebb750e2844f13140389c352ffd70e80df6c64d712a46512ed5d0859d1b6a892b1ed5069b3572d08c4066db606940318496e18e6cb74adf5130acb33300000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090a36fc3e9a38250805136a346aab458af6b3028507f89ed500edf5e2f42b1e978f098c0093c84afedfeb70c8854aae98c6ca43fc94badca16f47791d02f4c0524be1f575e2d50ce693b5f96bac1d9f53b5fe59bc0a37519fdff5d48dfc8bb1c67cdf890f838f8fe95352a87e3d9b596a098145f0768b0b6b58aa7313528d5b9e81d103f45f188d638b6eeb2acac0cb74a1722dba2295903ec8e462c1ead476bbc8b9fe530e8d09f38ccb7bb077d201e19f8edf79bb885b449b56f785b1223dd595a16d4e4f083e1a7b3d28ec219ea3ae34befd60ac4a1561fde055df9999d9ee7988b1ac8dbfd724762e4d78ca8d134354ac3d469b3c422eb079eed1b93571ae9577a392357182d2d73bfba5901e5ba63f793d9c86b7684e885109018d5c549741f1ad75042591a998ba7f1092b58fcf8c1ed438419ed6b19e799d51bd71a37c631a5fbb9eb967fd1357888904584f5a49f89ca677ff3e4c617eaf360e82be49fc2adc9e25c275c90c4af466cd3c494dd7f1150d66d9c8ab22b5519ca361e16de2494c6617af13d655b780a1e8bd3396e7bb35981c120269ed732f1987c387c568a3b1c8f86131b592e88ee2ef39a3f768d841cbbea7448d7c4b41a2c7c5187000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029952378f189660ee6aa9d63a05307e72f076d81de7ed2464ef47f5063bfaab6fe01b18fbd104fd1e6c7ee18c377fe487d2d9c450f838a3ec82781551b34ddadae8bb3fb61af15b69a466e10e581b8374b0b8d292ddd041382cf57107a91bdf9b6d7326ee3a24a6c061835beddaac8b85d8d6a45624e1672fba23573b53a9271bab72d849de7e3479dc64dfa88e597c51f791a30f0e1a6b9a960374cddc86f52062fa441fdae09da7b30751983630144ce825f54fa347615a911e4d3b1abe782df271fde1c30d25e574648bf262042c11dbc0fceece8fd3d84390e931da1084fb6ca51ab75b8e315da18b85672d9621f2c356aeed14930927e382e4a051bed3e4253beed13cb713dd97972bf18017a0796b31a56d89c288c32129ad0b09c223851db3e1470fa505574965065d15b153f74cafdb712c2b1f16c358f7cce783a1ca3fed9954c1af22b502cc64843634ad5395b3e35d65c5b6a6e4f8f6e67deec8b4547619fb1207c4f6120a598d4ae3082ba14ed0d51668f7f4f81622c4ba924f000a4d437708995210b936a31aa465bedd25a34786673bc2171c40c68423bda2a1c5b3943e3d9cf17fa33f94f32c161eb51f2923f520bfab3f4ed5fc2889a128500000228000002240000022007d5c814c236486923f7cb1bd76b91f8fe0c0a8e797e0257fb8fe40750c7fadc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e054d4ddd06abdec5fcfacda30e30ed421216b12269afa63cb60ff57a6949285de6a2f008eb31700839f7e654dcb2801269c95a1fe13115e56a8ca088a7eb764cef6ba99951d90e78ac512181cde549426da5190be770403d4c6b0392dbc41e0030adcdd204cd6d1fd3b5a80b78335e103b3b76afb4b2d2a63085ba147441b36d0b6f000c6df48ddcebeb33bc978e597dda8af67c5bd1be366193c1b304d95f621d933024611e572edec654c8cfd89d382a9f14c8b570cc3cdec9f08796a0e1ab0cbae1a4afe2cd0ed2b14a2e439c165fb8c19af0ebaffcbe6a3bfa2e463deb63f90d099017cdf63a46227d5cb1dd62d5ef9588c4794823fee5374579997eb2f946ef48f366793b17e49580d718eeb5dd507cc14b9bfc9a5fcde743be03f8c5b7c8393b3d8d6dea2bfccaf12cd894e71bf64d9b57cbc4d6c7e507ea52fbaa3f3a432ee9142eccc14ca8a50c6187654802ac0689fa744e6f26fcfb9b6f6ead1e98164190d6f11ebec642094920a284be3a6d54c5b3d6030ce53c4514044f6ccb6a7cce00ebfa28cf9a66b16685bea7511d0d64d017efd83ec34369b8f03e6f3034694d3431da0cb9ade59ee885adb6a4a354ee2826ccfdd30eb106a01884af9000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002173bece10111dbe07e9deff2e407dd58bf669266cc0e9562111847f50f6003c904f0c9f9de96f5a5a18a0b54cf692bfcb1cd686cb63b45883fbcfc5966b178c8020d0a8cf56644480196db64730755119c810390ad716fa2d24d5c07c487db814e0c8a93d4441e4ecfa2a2f2f6199e3346c8421dd0ffb866c57ce61bb244f65f8000000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e343e13f2855e0e7ee0b188ab7755f8d2533ba663db5a4a35dd2f496297b057a986e4f8eae4780927c5c6fe4519a7a2d4aa9c90714d1b3b5a123f66ba3258a94fe52c1e96182d60bfdbd00c585e1200d2e1de8eb73513aaabb377fe03ff7f5916329d64a1f7bc611852a1485e7ab90a462d8a676d6ec9bdc0fbbf500382a4db99b3e5288ee9b82975c2bb6e62c81683336af75aaa72a54b401a9e3c29e119f13472d3a60b4bb042de59c86c68b6233c5fad20a90e856fefbcc3fc320d7ca4f98782c644d400e2f69794bd6e789308ee6cc03502531c3425b502fa42198334b47d60bbd0629d51b586dcf89fa2d7ccc8c9a94cf5b12831fe006ae022649343f1b6d8af5a505c5ff421f671da521389d6468df20ed915b95b006a955dba2e7e3466e1a7259b9077cda0635105d9df4d0ca826b976b0ee1f3c3326b6ebe1f196a6e976cad02b27b76d92ebacbf0b2ee2d55ad97d9204e8f0426deabd737518e1430c9c575e297d73b70bcf35d092ac8178aafb14753fca5ada7e3bbf148e9e6094b5400cc1df106b51d617e7a83b77a680d3d088ba6e3ee5eacb5a0585d57b213d831b36471c4ecd0ba84f0cc7722ec25eabb34a20afb278066fb69af492fd9a1a00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e5ce08d570673e39d79cf8c1dac38b40d917fee2ad71e178f4d53ddfde7b6856550c2dc2a919b1eb52f58367d6083b0291b76a659baeb00c077e2b6503df0bab82ef23c945c66ec0b4a9b052a80914d735a878b6e890d924b4a126a9c93fecde43208d5ade1a2234298988d11848b9b46e41dd2248d1876a09edb5773b18c659c967708894da5059fa29353d57db9c937477f464c10d90dba8b15c40cbce2df6734e8f697b634945fc422f23c2601ed8d1110a0bc3a46dd6930fd9ddefccfb8f540667a03b83ddfe11edc4158aa4dae51b7df1b627a9ddeb67cb99392e270e66814dec7eaf264e87fbc79174148058468d831557c06c9358afe0b5f6e2e05ba7e4e4472970d855769a1e481a341674ec509b0af2ef27cd34af7a023961b64638339a551ce51457e6d8783bf75f58afcab0fe6e9d0a2db99a19e881d9cbdfe96f4f3e332ce81e87f3a116735b705bc80cb89d7e2b9b421f71b6d3fe6416ab2666710289bf6d1146b6f6b9906fc521cc0270b111bf6c5105a07eb86059b23b275b5de7af60a7056ecbfe6c13dd0c9c33988a66d4b0ee8ec77c01e0caffb5a157ee0c98b268683f22bab985348bcbaf6ace6f667a93dd31d97ca705f644ee19f910000022800000224000002201a5ad8d6d6d39b616500859fccccd45b95bb859a6a9cdb2558f467c68545311a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000254613ed98d663c733400a89a8d1c89bc8d6dcc9b090057025bb1163f5cbb8764fc9d6b7285774665b02c3659fae067bce7b2e5db56424a07fb61f9600aabe9d9597e07297c2138d046b34a240d2d96fef1fd8b15371337921c98639e3147f39f50e37313ecef18fce76d90ff71168209b7a82434595a1a9df5197a6b58559d04f038c54e1bfb6a1612cd501aa97d6d6ad2f731f789a1d0f9aec7e3061c0f1c1e50e80f96431b4cfa39e971d4073670934e6a9c70df726d5ca7ec596f54235b31c5546ffc729e457e2b97f03bb816cc784015ac4835cdc926c3748ca736c56a23ca280704515eb0d5fffc90e4d1a5ba8b104c76f178c49ce06bc872201f27fe9ae0fe0c5bd86bae48bc7d8c5e88595cde4cd75f14f707210ad0ae4700cfbfb79d4a4ab8c1112d14fc4f984772078075635633fb68061e153028552cb6dc853d7464a7b0820829205f0cfbad2cbea28fbf66edc85b7aae0804d21ee011b93c4baff6e7b868b75233015b416559ce969d94207027a80772346b8c40af8f8b47db1e57d75d5d8c6f36ded8ea625d70c80ed48b5f614e89dc1c1bf8a73cf19a30d438d7ec432a0a7425eda6cb4a5f9e544a42ae820ca3e3b0918af5cf9414bfebed8000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020791f458eab2fb4de3319a14ebd28873073e4bcc691e8c1616abcc0872b44bac1639aa0b17a7f8c6ffb7650c532271e7fd6b100d046cdc7c9868824e5c11560c020d41483e0c3b05c5cffe486cb9c3421f46ac294cc9345d85556453042292b26d273ec1b47b60820fe4f4014d2bfd65799637ebd5929b841b8ecfe115a61070a700000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bc4315e62750f1e9297bbcb83181d4c0b9f3363caa055aa3fe4e3dc68a361b56dfdf0b5c214c306aee01d0b9ddc43879eac3e71ab458979c8e0bccdd53c6323e362934c34bdb6788f0ff64fd2b7602337701dab08183089d04c74dd5ed5a4e5a47bb75bf0346924ff649151b97ba14941c46da4c8493d9670519633f731eddcfdbc570bd9dde5a8717d43b54788eac5e6b379e7f186058c8a8ba16128f56a610062d2c985fc3a563d7d165a875e605fafdf36cf1b61bb324d6e96def1f77a3eaadfce4e7f69362b975aa4c16a7cadd269c8725f8bac67c0333d5a02422be1398760c3d347fa061131e8af32a808ddfc064b2003aef167312b1317cc9b2c278ee8dff7b872dd9ba4773d4ff280b0e919230ca60e5a326e4132ffe7e3bd87646631cb1b2f1c8c287c6b93e4c00495ea72f166fa4f478313e1a042d7e71d2f0778e7ea9ff545bf5b3a78f77855206e8011ffe07a681a9f001d4aa1a3f43c883bf171a3229f681f046e5e4bc1aa8f7e5e8daf7b400cc315b104df980cd80d2f400579986485084ae483626ab09fcace73066f946407b55a0d3fb73b68610db699482b4a256f88474434a433be522c6098e9dabef691433f8f8dcb879edb9b3ab1060000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000972b473fd720e1207433f823767c7678c953a157c395e98db666fb1b78d551da51354566972cc22093323658b17b31f6ba2adba4d847123ce651258afa67b8f8c52755ed25b7e7635924af590f6340f55a05efc5a5dec5307d0616ee26d01ad152881a0c2fb1fbbd83e3f946493515843da3c8a68cc90428932a75abe48fe9c8f8e16031a18fb21d9af3fe9ce6aea8bffc3cee035b091c177fea0b8508499c82409dfe4e2f0a45006a020517b2447b12b5ea2168ceced19154f7cf0e78d2fba227deab687c51078894f8e48e16d3a94ccd707ed8b29651d64f0ea450c69be0bca19b8aeb81809af1d254f21bd576e32cc73ff0422e1f48ce80ab7549cdd031f501c573d4e4d6c0abae517281469133af290ecf7c3e0b599f74ee1d68f1c79460856678c6fae3d36a062467b5a4e9bb5c393476e90717a9df8f63c324de285e870e8f42157bd410425c853e12f0d50dfc5a0d9539dbecbf1ffb5d7d3d97df1a470d9de8fbb72c05159fa8dba4c4aa2efee148158f210540b65fc54c689808bb292fa82c265b89b94e04fe215d982e37518eb25cae6a75497432950a0c35841195ab4874921d5d4654916cb29a9bd87459966b7131065e54a13cd35be44b8109de0000022800000224000002202313eeb7b1a5d328fd324b0f7e3edde4072135bc7de94ee2cf6b9fd745c97d920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003491d55af0a1e94b1c7b2756c4742d62d5d4aa24139d2b0370af7489d1f1d16071d49668282c358e2aaafdb1e896dae1107f5700dc77fa696e2f1ac3bcf8caf197c94aa56b2f697a70e62d4d48b8cb247645d1f5fd99ef3121c6dbbd4bef35e4980cd3c25c86ba5063e300b42a04cea2283ee29b5ed0fc4572337195b2cd33ac4710b66b6e26f7c687b3dcb6a67bd4ac544aca8d8347b9b0e34cdb60a495a8804eb000c43fdd29e3dc9cca0ecc09883bb5f44d392432076f7cd099da99bfd5f44a563146acc0be51e675db51b9553485f2c0365c2b925a27fcf82faf0a41ee79eb7b85daa360993787a4c05500710b10df723eef82a96fcb620971a0dd01ea3586c7c4e91f5d0f1f5852204565cc6f6e1c55f63def5e05c7da673b592804784189d93d0a7a716c899950629200f483b11fd49afda6b4bb54c8f491e23948485afcde3278207f7d8c180f9f0f05fa8f6cee4d434f7488a1cfa6abed1295df8718702a65f04e75560c689f6bc3bdbd397bc8ae371c130789ccdc019c687feeb2f8594b2ff8f3e866d5514ff29cb48a6b785b3c85c8b6f466adbcac69e31b2d4d6160cd24b2eca7355af332c388a35c00987af39f7b8739e4291bad18bade6e2c8000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00207aad6b323bb0d4ce75dff00d506ab7c3ecd4da81e592ad63aef1b3df835c42624961110e9b59d6bab03d1646a1208fd623a59a8754f7ea96eda6963608177e5020e90be5dd7728e7eadca177b982366855919509757eb3fd17fc42f0993a029fb1c99911f11a662f6f2a8568dee9fd6e980086b2bb74a5ef0e91d1fe42cc3e09a00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae6d0ec908059810b9712bf2d84a8a8a23f61c41d1110ab36fdcba4f9eb5663a1935192171d4003de69abac72caac696bdefcf6a3816bf3f83221d8de1382b0d300d4c74758249588c55f6d87ccefd440390db68bbe75e040d980c44eeb02c6d5c3886e8c16b061e905a6545906be1916af7c056f4b1cb83be53d5f3d50afbc67c12f25cf44e5194695de5b45cfba98334337247085c503bef72a015a9897a3bbc08968a7c3051a036c2376b4849f25d5cc47a0dbd5f663c30ffb174a862f19d22c51261d1b1939428d26166efb8ac09b675556499eba0c51e5811449517e164106c3efcee9ab37f36e16d241622bf5c0d34d7fad780e427f85770aa6d4f70b5c08c7577aa3d6af563fb46e07966d773bbfa58bd80bae2d1b00063c5635498c5ec0cdd18e1e23097cbe4c22a13d7c59ab6644226c4d3f7a26628ed338940228883380a63807f83a9aefa09b257c96aad98c0e6fb88e9f089e71f43575fd28066d993c51eac12db9cd06d4a56bedc64b6a7b50bc12df15c7ffc4d977671ebe894ee759db6a599f82945d6bd0ffd3aaffe2af6631cd1e2ae5b6085b90db2095fc4d2b9d076ed299cfdd67b3830adfb52f98cc657eb4c6af2a7264ad327712555d100000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c2bb94f4dcbc3689338c7622967a48faa0110e6b5a04d23b0ffab08ccb2a5d788f8a9bebc92c98e377bd8ee65d15f06ee8e390fbeb7806c6ddf3025e967ff8da27cf8ab4ac8fb28edec7168ce0545f5c7466ad8eeeb9fa4e9d322f5fd3f2d0ecc44f87883389671a221e87f1e1ad124faf47ce880f3f6910639e8c7971e5af2535e388e0c00c8284d8b489ae4716fd76b324e2f7d90c7230f23c7e6b4a965cbfb45335643a5479e918074b7fc217e69025625e7cf432361c63a7b0c6083cb32fbea32d94f27c6ee117060678033a9d298047e595e82576fc1f1283d48389ccb4c42022d1c8925bc6e519844fbd05a727290aa1524291535e3389271bbcdf319581245c19b0d411d8a9190b95a70221889d7b3d5e4cef5e0ac45505c0922a2d9df125a068b479b978814c47f88a36c39363581d5d52908364caf17d547077c2faa2a6c63fad0bea80b53598aaf922d23f4210a3ecd29ab348837636a618784435de800401ca4063f67e07a0b42e5857ff74b57af3161c70dbb3ab398791ecc6c26d1c2ccdf47041ee40e4b3ed07958b2475f4b64abe4c266f35750a07d2b5d341d3c9d2fb32fd96fc100b4121edc41ea292edf54bfef983d38639ca493a506a60000022800000224000002202c2c578cee18f0b7a33d2575213cdcec2d2a517ef656c23cc29e28d55c30f28a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000236c327605231fa66b865584a9275d59ff80a4192b1881cd78085617be7fb24b2ff660ca64b0e29cf8f60fa2a8f614514d5c84cc257ff0c443e807bb692331bebf39373b08bf5a3667759ed26a20417e2c96efab18d29fe28fa0d942b93c30eab84b962267f7112912007c2ba855bf715f16426c397eac13c1842a9af6f1c3e6e951c2077f4571122d8d9f3df79a15e77cde7dcf36e8628531f48c5692fb7c1a6320a4488fa2ea3f31e5bf59f450f23a50e4683b50b0133ea1308c918d304eeb5deb669800177b6d7e8ec3d7f86e9a8aec58e4b2b3b4ce3b9fa5c23d8e6b4936c1d7529fcdd7ceca178b7ec36b149e7ca726a3520a776c3dfa5b7061bdd0f96a4537504946ca2ba78e9c7a03ee723953ee6f0f5c9dab1ec7347c18ee998c306c881473cb2c97a079746a825355019ef5323bf041774aba5fc45e44810e06c7ee00b1d9c79c835bd1b9b8d3c14ae0be52e1059a652aff54ee2f70f44e1eedd260b5901a5d38fbe1215782d7ffb4ef90e6a7dba73cc9eb71c003b9d61ad43588958efad783bca460bea6c2ffad607a1af504bf4c3d9d4a0af8ee1a103e85e9c9f2252894726d3a1bf1c5f191ea7be5c3b78d84222f4db588c48e0b0cf3ac8b312d000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00220fcb923d21efe7900df4cbf00bf8f1bcca313254779a4100faf03469eac1c9c1be46e64bda38209fecdd7fa37a003d777d5ff3ff46e94c7ff2c0d4af0eebc47020f761233657a1ad3f6d409bba1f9d8dcb2fee73efeebcc1318bc716f6b0c32d525af44376e4d4ce061bbb0188f8854eca1c9098b07f4f0fdc513bf2b73bb3c5c00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e9b880a036e1931f941b482c592480edeae81cb6742fe581a5be74d77e099db2726b91220c97099900347cbc591df6279ae8cccf584ca4209928739c69341444e1f4cf8d47e79dde2f9dc5a81646a9e0d7190be62b4274cfd3c966e4b1c245457ab2b15f46ba75e59abcd145c31dbf373c459b038ffcc7dc3408600128209087e389c7c73e174533c3ca65d9144856a711b4ef84f4534850e655596234d08802af0fa9dabbdf916e3c912892986bc25c4f129cc5c81d1964f60eed5b875427fcdbe4427d13467878a6cc1f2d460103aae8dfe08d5bb38292e27ad60ab03770c514024429813a71c93e314679dfac0d0380ea4701ae06270bb9dd0a80ba77713e420c67da6b5d1eb8714bfb2c749b05cfccef483066cca09bcf6880e863ee48e7a2b4d4cd80a38f53d233ebb74ce3c4c04bd6948b91ac0ac00a2330933b24dd270bd61fde39f11adeb7c42cb983752cf2f46bd71cc7052fee45fa0a2ae5f45ab311afdd72a7aeed7b8d553fd3af8d5dc15199689fcd52d1e2ea0bac8a5d586f8f2280dce23def61d536a71b27e1d9c5c509a82e3e74fad1f07bf38e96058d0120f7a5a3233530e2e95efb07e6c28ffca4191586dd4b6ec3bc69630aca5bdd3be0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000281d5b70f9a1bb8d225b0dff051fcf3d1f0620a5dee80e588b4ed09885f72327ec9195dc952d9619a66a036d91ccadc7f8cbad7244ca8d10843e83620d1157d2c93fd9cf63df4c4fb8d4062559ef55e5dec4e2a8699d87757bf0930454e7ff229182f7b119070526da3d56cd2eda90a2451c8473e9e9be62e905a783799b258887797471b2cc50056559c43b500e22c491345528c592317c2a066c38c41a1c0279ea2cd972e3b2383753ab040e992af1a62b418e18c4f58da44d685a56ee90dbe0068d6921fb35db196f56e2113ce497c618e4d0aa6258f52a634d15dca6bada497634cc410a96f31d06548c4698a13e745f6becaedfc47e4b0490b9b561cb55fc32260759b92585af2e3bd412cca972e12638d781c4f3829bbad556cb7b5d86a7876e2ac3f7b071b26a42ab10be29db5f4584b3c55d758d94082ca08396d8266f68748403e7b9f2403d82cebbe9e221cc08411d3a1a8da34fd83ad923a6bcd6d9169ee79965bcc213476fdb0a893089a783240416f1d05da5064c0fd3a506b8c7173b38cf1ce6e9ee143e41ff80c326b5bb3fe5c617e789f8e4b87637061a1b2a1ab72f6666522b5e3dacfbf3c6f3add4b4f0617b901d45e6ee3225e63d0cbf0000022800000224000002202c469d5e1184aca2323182e28ed57caf9a336613380dfbddc450446f0763623a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087ff5f1b286a53827a612d0013d551d6ba9282ef1df8ca00803486d9d04ab7ee5879c59eeb4ff15edc1c27521332077e8d0f1aa3c1c80d0e4b77f2d451695e0bd7472a29d3fff917591b53467890fa0a8ffd31e77cbaab531a1a05027ad21be10460912c939a9efd57cdf15a73e9ad0aab8a663fc73dbece63c3cc8a90b632cb0806701abfe3fe017f5f35fd6027c52d88714df297cf2f7a9d85735c8d3a4595fab943cf0753b858f68dd1578fc084941edbea351c71e1a16a15dd0ab93f628863c70277fca2ed6b8e7e5a5ee6aa632edc1236d06cbc1e1f6c1e0835e4e340a4849df2f5893b4d217a64934239df1fcf805125a0cf2c041899ef9d6affb476b8b0d3087a57362f4a7686a1a8529c675acc9d223d5992a4fce7ec83fc3c0ebe8ec347bd84276bf6860972cc56a8beab7dcd7d7b23b2043851933893440c1d086778d096ae906cdec38ce206c4985e550a24aed8d2c6cd025df9ca2d174b3dae6c891cbf75929e37b899970c68895312dd74e7776f07171594c80431fe078400ef0bf00ca9ab0e39753ea2150807e3182b196b352ec8b9ec022932b5533dff5b4c73f854a247133b2b2d9821f758f1b24e05b1d16b6845d85d3a062a70ab9c2dd8000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00201a4dfc12b8266ad06e867de507ca803f2e25097d463de8c0462a82d5b54cf5322e3808db57ccca8859a62343ad8646ac08f7cda5a1adb9f9b75eeb1e3dd24e7021087569c52562ac7885b22d442ad4cafb666392ab1b581f2838d5e7b2a606aaf0e76b0916f040e84dd475f64a0669b86a2cf2f3c23415fc42b5810434191407b00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006850180f7d68449dbbdbfd1facda9b63340596fb9f0130bcd02de37fc712159bc50ab7d342b6d4e91ec3d3415c14532b966ee5b7a9e6cd60bbe50b842198b2d8dfc458641623c8c80207d032a80626e90e66382db150c17d7bcb4142a90bd6514ee9f92f9181d54214435e4b0efee0c5402c7f50d9858c8976989d54771769fcced8866eb32eeec79d014a7f49f5bb3e7e61b533533ead411ffc6fae735892be4cb5a9b90de113b8769ae9cbdb2c31adfa68599170de0c504042b0883586a0a3c06fd8f68665404b84ffc85b4ddda7b61285b9edf2d90dfc044e07909e7c1bd388fe26a8acdd0c8b8277e2b6b4bac01d9a853fe0659b47979e429061957a2bcb73ec847267696879fa12b9b04ff83721b1a75a46dc90e4adece522ed3f982683e398ba1434db8c2f36d0f4d76a99fda14424e9c41ffc64e42a25516ad016149e67f650d30103c94cb9f6e7013deba2404e57b110eb87bd67cf402414339c86e403e95eb6ff38da5f9a20b6bca2bdc4f92ca4ee3c560702854c9b139e37b089df880f81fefcd4260875ea1463ca44502d3f7f474bb8b0a137c92f91a8cd976ce40954209bd24c1a3b9f6d89f107f6a903148584b3e379c3b3b11410bde6027810000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000885dc17e50fb58b6744241860aa5b36aa335f222fb067d124c5510ef078a23689a194500b140af649d3643011323ab464da9d831473466a1d93717e9cd20c1c78684eae92a5e5671334fd9e272901b214cd9b3761265e9a9cacbd2f942c4b92f6e4e1685d7a02de665cc8c4e0655d84d4316cd169fb0dd6de97ac4b00c49b94942861965bb8b3adcdc2f3abb341ecfac378effcab912cab97924f95edce78b3598fdc645e1cc3d58023b48f7bab66a7d06c7d5ece38a83eaa80df8311ad749a4ed979b5ca01c7b2310e993d0855da2cc3e84c92d8639dcf7979bb79695cee73e3b0c2332c647ba6da3335c580c21bc6eec022387fa41995554faca2c5ba640d23d9d3f7a06bc298fe7faec0a9bdfeb2995a873af19e1a306081f60971c12a380a67bfdead37b6cf329cb2482921923d7bc7b15baf974e2ecb54a2a4076f845baf846185999ac926f6a7cc72d803ae9a3d4f9effea942dda3c2c0d83d1d73da1aedcf1dd12781f8c8df3e588b11bc05220f260ee2654967fd57068be17dca9bca04280093f18b15a953151a908035d1f4c1ae4107a75ed226016659165f99642a9387fb13047ac5c9417dda6f4d873b563c1d473d9ae61b91909307a8001b8c26000002280000022400000220027df2f55f5b94a26f2de672c000e96e920396780de05596b1d7828e7abb527e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6230742c265bebba90e3a6fb515dabef8bfe926b93171fc0876da4dbe51fa3015c161eb9eaf664920430cc77083872e911517a9694c7255ae94136dc6a677910ccad1694db1663b9d7827b484562acf732ee0a94f8eda794bce39c9df3dbe8ab032170bf778e1a2f6e0f91deb3148ecda2c0beab08bf7a10a144ba6eff6f4e7c0c5279880c55195cca7a014677006487945fecf2c90677ed93291372f5b808dc9b6619227b472b5a204870cc835f369a18d78dc74ce26a52f50294afd0a7441cb41a9d08cecb41a776cb78aefcf5aac7b44faf58500c98df60474bdfa2a88400de1c5729c4b5de5bbe1615b1e2712e491a45d77792ef55a4db8024051c07893247abd6c771bc6c94e1f24b1850db0a492ae90626bf0cd8110a3ae68ee3b8e59cc0e3e6e853abe00cad88d02c3cef3676474120782982f386e20d621e605d08d1683a7da5876d20a42d11cefe28d2a9fa6405549c17d76d2106b2a9526be1ee0be550f2bfd4d3494c25c049ded8a0a1849ab8dbbb5d2a83734078a49c5f465e94bee72f035441e6db8f1f7a31afd7de5d2e50a06385fa52df6bb2925405e6442b329ad3e9b152a5762a5fef52d9dc0cbdfecec7a0fa91e8375a7b71d1a06e35c000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0021a359f7e41ff993bafe2ab81732a86b1ae1003a4ae95453ccb95488805f0321f1ff4d065f3cad25a1835226a0c0110d6cf9304d22436faa4e02fed2b533ed90802134cbf7ec0fb914f1b287337404e493ddafb60a46ae72bcba6d000df94c54bb329b5d79a901115b383237dc03c9ea62536a59c599baaa627a62d68e6f4fcb8bf00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020bd4b83c5f9a64e1865383d2db1ebc70964e434cabecb373e9897dcad58e1bcf3cc9113c8818017f1af69340e5d0779cdb833f350483914157b1ab8230500d3073e81434c54f8e370b8ce699a4204ed03ffd82a81eae1338b9ed92d7198eac4c95075d2407a6f157093c471ef14471a86998b3fcee1c780e70f346ab9097ec93d0233ff1b8df97cf56cd98b5225a041f4aaa600ff405475b918fc96268dc53b280442da984bb29d0ab5089970b719db9653ca2648b42e726900e325ff64e6bc9564d3c89f180e644c93d2289aebddfea31ba7bd538b6ce45965f13b86d96e40ac6a66a647bd6766fbb84abd8b8e1889e645eaf5e1d16463666d7f96cdfabfdcd40ccbf5702423035ce7548e8bea026894a478c2173157db250a75ab9dab7632296cb9482468b84f5a25f4629a7a81272cb1d7b35d14aa8a9ba6c02d5b93019b900de2f46efdbd3604bfbb0be7494eb63858286648c385da92dba9b63ac7863ea31e0c0b5d62d6800c0daaae8a45aa113dc45adb9e033de532cefc83a90e90b0ee8a6a043b1c8736a620aa5e4f4ffac541ed68719ec96cc7ee25157f3e1c48cf793ffc09989ff3390e0250af88c4dd8232104beb33a71e3f7c361a567f68ff200000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c3c489c20e8d775b3452fd54fb61671b3efbfe015d0ee4041c68cea0ea03a75533d21522e55fe4b43fd46fc349674affcfd77d68435b5af9989c107080f5c8c78d83775466f5d8918b7d7c2939cc4e455d402c549e99f8ef094aeb5bf3ab6c5813d5ec8edf415e8419b03cbbe1951b3d2de23c1a96b341f6c5370a6fa9920c2e095b0ba6f09e57db2225fbf6f42b482f4d8d744e38771cb39d0053d9947136042e5f6215070972010a68fc5909236f11b88010b276d0c8bdf0a9f61572f860924ac2cb48c0eb395713df7163633257622ff62734debb92a273109e57527cb4d7c476d1c847ce6a84baf952f6a0d5c57e1e4fc62816c2ea736637d858b1c0e81a20bc8483e6fe67b4b5159313cc5bbc4ea3626139fc435fec633db9f1aebd1a2f5cbf13edcc593c5ad8b98fbe0f50ed07c7d58a6939d28b5da63808be84ea457b2bf4397a5c6bca9f659f091a605a732390ffb32211ea07f9bf1f7489a58a4ea14a0788b0b9ddee209846009a1dd49956419c36ddfd971a8e4a20fc705ee5c9f998377a700d1f901645178519cc5a1cc4a973e3b2aacdc0bdc896eaa8d6eee8f810ef55e5e3296198791d6ce9350f0d862ae77b9aefd1b50b5d1d101f78be34f0000022800000224000002201d92f94cb2eefe84f185313373e083cbad8cbc108f5e9a978de897c671c440cf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b110a2fe25c7fbe63d8bab12c2dbe9c729c57f6ff10a85f24cb94493c8d9914418b25f6b1cb9742a3e7a21b61850b180364403ff3cf21198196c5bbce3f96e1cb43a4d109a02cf08683890fce91cdc30a9704dc1e34e3de5daa78450498bc1d7f2a8adf9f48ad8e8caf374a3dacdbb5a84a7d4fcf73bc02a81e9e938e2c5cd8edc9255cf71905d77a767344e1e436a98ae8f44107d187733aa382bbbf22f1e78efdb2b3af1198fe1d644c03fde380cbee80926d36856e93ae5125be9a311074ae4dbb9805e19a07c7c238881f4b35ab1969fcef7be43bf9c4386c111d3d119547bdc483e9fe82660a57395c97f30bd3ffcfa89a2e4febaf175bc2059b81a9d0f01e918db770e347631cb604fb5dbff1bea20a26721ecbb50da07102d9f85b343712144e7fcc71af052cac0ebda6d348ce5b51705fe1989ab9570e5da220f06763e2ada77563064a989817de0ebf7501aa9e96b4baea04f16eef1dce17842bc0068ad15dded138995f8bccd8a52ad39b634461f80bd3eb45404ff9e42b3524f71de62fc79dab82b2a79341e6159dbe19711945e078875b6779755cd3c7f3661268ae932fb07d6a3779feb633c080c5f180750c0cf8669e014d1f7cab0d53e839000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00208fbb7df19c681fb649b7149ec62f68d0cc6f0fa57c7d2a4e7720f67e62a210d01c8ff747e2a6162be2009ad05853a36bb01e3eb8d7998be3ab4cd5bb8802e100214d02c315e7669d54497610eb2aa5695f06155b2f19039e6e46711a0a6ac75fc291c8803067cfbdff58b29a59715fa5f7a21fe45df9e5b44f4d51250d7821c1b00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b33ce99a3dc4d737538b9465289602a5af29e0bd9e36b71eb3e74fb2e86f8872c662cd0a87c63f378dae961555a301c082d4c4a2ac1d784c887d678f170a312540eb570b03372afd6db25293f7eab159bd73150e33335b0a81daf9bc886237cadd99bad125f7041709e24838e014fadc281687fb60dbee5f84185d4514c674cdce1f7db9c3eeb168ccd0041c55b6950b10d54e786bea80393de378a491abc504acd7f3c6a27a818106e3993730c4ec4dab04841c15ebec117b3872b37473d5db3bb7220984a6d4791408f99af9ee4d72c9f7363563041ab09b3057c93f5c89b92e480e881d7f947459661be7ce1abc9867b271f01f72cdc1425cc3a1e539dfee02a7c77cae5f029a5a0e4fa1cf26f3fcee26428530c7a79a8cd51850978bc6a6ccc7f65ae5694d8e2ca0b06221c78137ff77682356e6d1acc783da09da84a239d31c9cded99a70ab5a69e4d87d80a657dbd7cca18836e11e280d54f953a31c64cff23417247a58e0e645776b8b277e42a89de1f591f93f05672c2bf023c10b21e25c9008d8ca8af70813b3b45c2d5408b6884895336b7ae770c07e454e36976388dabf343ff1223d9940be276a84b0f61067b0604b01d63e92f38445f957ddd0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8203d60d9770e253928173854721452462a61017fd004eae0415be70631aa08dfe087e1f46442ca26878b7e93f3b90d40593cc101326c3af10d68ce53068dc85a77c76394addbf790b006fc850f51a726f4aed461599f42f032322013ce1095c1ac1f8abacd58390e2da0ac76d0d41469e9376f2178d7805c151621a1c3879342c763c17c39a3cd122fd1bb3ca821f57b4cdf057222bcf8f1163e1af0f12cd7e7d4af1025c0db5e0295d2746014b50d7ab02728f26b01e28c347ac888c2456110f05df2a1e26b6fa64ba7dbab505c7b53887b70b8a8cff11a0a5a1664548451f98d6a93a1c7358a415721c49aa5fb7b53f5dfc5f4920fa6252334b6bd6cd15a453209f908d27178c335ad208eca3f1a750c98cefff77d5ee4d8e3f78edce89e6b23551a560fb700c6200220295f85fe3201c1cf39ea0e9b76e682f1cffb811f2f10783d4480f2cfa74a3138e4890c05dc2e99d2b173357f9306e0731ee31dab5c7ce51fdc102d5516e2d63e8e86ed5c599bbc7a78afa61e32fc35713b57b9c943cdbbd1b9fe9678709c87530e1468c3c15b4555096b6b32de842960f6a97991f6b30214ff93bd1282151baf09f45171b177018bcab552f4a52e983ce8a178ea0000022800000224000002200b354528246be820e8a15880a451d91336575d3961d645e37055b87cebf73009000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b8512aa8f633de2693ca527f10605617d254fa00e9dce7eaa0d264a70205f4e0c799cd6e8138d0045af3b7126a458a60da6cae7d1c70c6f74979d4167ae44e8339ac8a9ef03a0de2a46386d40778408267178cb1487f89920a1907e5c038a4dd750f16fd835d1cc08eef7b80d33c2146a6943a266f65d5864053c526dfd2e4a0a9b557ae68b134772da7a02b2da290dc22582d0b958eac3972365c3301f9f925b743c9825331d1a2793b96171ba941f736033791c4a595d19cf905038e923f8767e5e0dd3df0fe8dbdf4d91ea1465e8bcdcbacf8f6c47bfcd532c1de1e3fb869ab1925b2c1342adb799778d7157c09008d5ea91b4621c5b8c33a8960a7920b9fbc8bb8f96459f5ec8dafd2e4b624959fff28e6b369f4638e77c04a44c832fce43758fd3d1e58f8799bbd06e452a37a87731f64edb9eb5a92b50d7960b12c8449e9d8de679902d4727f1e5b8e5d45f079aea9e0a438759e5c4851785565aa3c7aeee5ce2886a5c464c5e6ebe2bd33648f7d2dad3b7999bfd55056a9f0e1efbc21f4f28e33f4fa5b7ffdb525ddb3bd2aadcd5de4670ff56628d24543a085ddcfb2da2fb68eaea79d995ed663bc920ad8cbd27a579ed470554e1475b0d15055b22000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002072c794daa38d020ceef9b893c068d62fa76f6a0b8a61482e8f4cd811a4323570f9877b693d3c45857ee8dd1c83a487b6eb385a12f60b47d4b068de723e1673b0216808a4e4d1989e36d4b98618029eedca2f3aa40a5332cca69c6c4ffb64ca5fc130be66498c9f658716431eb551696edc35de1ce918a1668750e8dee707583c200000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d10c132d7d9d37f5a98f49c4de512c2a65d8a821e3056a3f7708751c00a2ca23bce955e05b5c7f09d2970814fbe67964d5f79da77b87907617a0702cfac5dbe51866301cf7a58189b388f88c66d5a62a2c50de52fe24d5dd7285f3c2ffd06f18b623e096e6901cb8d20c78604227d751b4479249ee415e9054cac8c8c54ecd44beacddb1b9bccdd300987b2e5911cae84086b6d651d8ab5f4712a99e458d5f24d309bcead8d8e36326ecb7f0dd2a308c328b379155e4d381e63859e8ab3e013f180c28c423902cbced550a9e5dd4230f9ae95bc758087392a1a3531d622a77190a82375b48f085905c85bdc9b9eaf87f183f791e5d12ff57c1cf8904fb4403848f6a57177dfb2233f420f7eadca694707e582992695c161e79979fbe3703b7a4571287a84663dd3f6b78eca694c18142a6a3b835a104c90b6a74c8662f10641e0f0dde1b24e219e279e52419e212e8ad5cecb1da0bb68d525a3da43a73e2102f53cbf531cc2ba224500c06c3922cd91d048cdda87117f851eaf5b833083729c7705517fb9ecacda7c593ae917e42495a3514daf31863c0dd91797bd8310d2bfaf55dc35719798deba4c81257ba6fcdbc1c231cc69af5f58681ed92d742208970000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000232f69cfb0532b42a48ac7bbc11b7837f2570a72ddacdbea922ca828346f31a1b71f39a1ccb52ab3ecb478c063eda755bcc00fe35c8ba0ab2bcea7cc85fa2fa6113154fe4ee850c259697a451d37501cfca8ab43a3ebdb9d81871c9d71e8a1c430bdced55f4ec14bb8f3174b95fd683ade1fcf79f8b33710162510eaf7dcc2eb603bb5d03117282ef2dd2cb8b6cc01c5cf3c0372e973300366032cbcce90c0a61431a439fec53fc97d07c7f88939be1a1990a46e6103912225ccbb3c3c65db25ff068a253c6e8f7b8766e0a55769ea5143ef8b0cb4509bcacea794f786735eceedf23a05c8812df9334dec1af6d6f978a1d6188a6821afd0cb03d72b8c7db15c3640dd40b092c5e4e22441ee7298bdc2e7186b4be11128e6803909c289abb4078ad44924b2d1ca46bf74bd3322adbbcd2fbca0d278eb71df46f66a3430fb62b66269d6b9eafd0a2701b0d7d4500f61845c8c329048080d65736aa56dbd7648fa64bcd159630fc6bde4edd03d695e01f2c359b819db62fbaa88918fbe73e155bf745d9035c65c7eafa2020fb227349065ab19f068f36f96af805f574fa4dbe690a34d7da3754074b4987cb6a7b6377352acf093bcf6f821f809a751ea9a0a9a2b0000022800000224000002201d211e5bf105d24427eb8b56bb59685b040ee6cef559bc559c2af96e425ec83400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000858638cf65bfaf2639ce212d9c0bda869556aad78b89dc477548a261a520f89f38eaf634624bfc76a93774e59ce5de7a26440f52f7cdb4e4fe98a5fc64b7901775b751aec1892c9b04772a1a7301acc6bd5b3d0f96328baae5f3e55088cb281a527d5020d3f9948ca98a3b845e7cbaf4f14b392d58d17fea5ec4f7432ef8797bd1ef50ae48d0bafc516b1bdf44e1f149da1cd21592d430ce25bb27fd5b87f613e393419ae6f90d8dd7093c0507d31973dd54da5451d300c580344bcc876069b052cc43c2189afa5d142b68a4cc138dea04ad4977df2db53e2bc6b4aef95a186732954e6ab17e27707ad183d37d0737436b47fd3077ac6f6328d7667148dfaef00d865aed4dbebb6f4c92d060aee483b9111cf4f5061ccf443d481fa375c291e3c0569732a50bc62e2c2510c1f46044f32fdeb2ac463a1dc68bb04a07442e4dec5446ceb82140b0b87ab44e31089fa2f3e1e89de61a664a7b375a0cce65e3388598077a325f88adaec3f6b89458cae2253a3be509c83738ee7fbce6e963dd77dfc51e71464bd60a40eadeade6cf932cb44eecf7392a167eb40b3716caf1d0a7f1a2b3e7da7ebfab2bf550e12480984d6222feb2294cfe58b0470507dc3aa8df26000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022b89b66ef22495d88aced2e90aedfa477d8b18e569826884bc5f74a729ddab712894f6579d6c591f613947da655e9fde185eb1e6c49e1db402a3e6e56feab8c30216e76fd31160a18fb9ffe9e717b576f6ebcc9abbfaa249b9ee8a862aaa415a2d1acec874d79437a5a6746ffb956c5a294fe02f3156918e2f25e6ec59d272679700000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092b34683019bda4f2fd6afe59976786fd93a49fb01abb1abf0583a1f89ca09dc7ad05ede8eec0ac324f79c23312ed8a5e84bed3f634f4f51c26c27b7203dee1c8275ee00dd79ce2346dc59da65cb96ad15ff99b94961fa15d4197ca2866cbde077705329ea6eeef19e418bc1033a4037de606867db41ce523291a178801b7fe6ef05ef93b2b607678c429d645bef3785459ffc37c6ba330f627f85f65b7f050e449cc7ff814b717eaf10e9dc580e5fbb700cfba09b83ad3a347419d1fcd62f9fa360ef75345910b6988f0ca350b3433c5c6c2bf372e28349d0225e86e02b2ae7bc32eb0657988a4f08fd6dbfa45ce764ff674930a2f2bc9a21b27d5d951daa60e2b686e6b844f2ebc1f11cb3b5574592000de6c4f20546cf89b7bdf13b8dcd8d54cff70ffb976975abc3a772a37198337f18e03cf5eea5c5ddf7a39c1e3c5bc90374ce4e723cf83cbde2e24d71f88f8ebc9f32550d614b77797f645635bfe628e929851e8c9fd7090f8c524b65764f5b3e8292f653e9799cabc75fc4ebc53f0dd6189b49ca18803dc67e21fdec0ded9e017d1c2ef8117bfd79dace91df2a8a7ec548c2bb9b26a092d8fb110f371e24bb58c527485e1ae803ca724286c26f25300000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000079ed26a02d7f5aced43790f18e3429f1c0adf08ffa656404c41c94b4e97f64a48a3dd267c2bf359099903614e35a4bb8a27d9273df070d4bc4b3b6e3a5266f7a0cb3c008a4300cdb0df05204462c3bf0d2e66c75b524f8a0716f757b2756a0f9666dac6aaccf9c7ff8d19980e6dab79d28fed2fd9442d8b3550d46a95e40a2319573ea3e4782e973f50b82e2ebfd2caeb4954055a2ff0cbb9160a58502e558d35ace21d273555d8427252d515da960dc6862f3254b86c883800b6d933849a796f79bc244c134d76071a8b8c4013589fc03d2db852730f9fd5911df778ca9fbdabf17bc33c68156cf91f1d019a343aa51cebe7d55b3a1ca51acb2279cb68c2f693e7016dbc96670e6e7cbbab9770be2387e6ebfda9f1c3e84ea5fa803a91deec25b1c1705169c9c0087edf157a7109794df36d9595af367a059414428ef207442fb78e67fff54a42d04a10027ec07aeb522d2125254d2be0fff61cd1a5a20d08b343ccab2b7e47c1231a854ca5218ed08f972b62358050681d281afb29cb6bef0e09f7a273f03dc8e3275ac4ff00e90b4622a6d515815870e849adb5c09add007a40b52caf960933e627e7eeb450da063dedc7ff04e7328bbbeba75522ddf5870000022800000224000002202f542c6de23e2b8fea3bcb76c3795ca8a97cb2fe304de8137622cb3167af13f1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009379629140f8d61512558e0de1cee53590f1468d098209d4648c6c95083171590a0a9f43132d1ef014a0b2309255dfc8a0231aa969177ebdb468bd42b543b2ca23826eb1383484b1f7a6939cc70437f7928e8048428dd20034f57d73cabde7ba66ae2a6e46a8c17e5abf458f52161fb8119bfcf5d713f0bda925062efbaf1e305748ad22692d10ad1c61c25a762ec0028e235b2c460a4aebdd1b4f528ea85fba959574453ba8ef6d5be84b704b24fb739fec2e4226f35b1911609f6edf39420813a763d11b3347bba23f0c6a7e647099a39b7ac06b0419f0834af49a7e370ff879cba27f02769fec8d6a8a2929cdfce3dacdc4dc870322c86546d807a1716f526bad905b72acba7ded5c2ce56c332c5798d2a4f0708ea1a089d7e56f2c28e074dd421929ed0f1c641d8f2173302fda01cd6d05b4601d664e43b710fdd58d39a8d82f5cb0c2de207253123909c91f4f8d0b544f260e4e4478491a13d1454831b2a6be8745d8d51b685f02a68d5b43271f00751234df2b483c5637f10888255bc95b71f7083ebd81c4f5f295e03f7ff20a7092ecfad2e0ddc87ad45689ef2bb4f50dd20b5c5f88dd6c6197884861e2164a32e736993e2a9f0cffcdef4511bc91a7000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0021ca40ee40876dd89f5ac49fd68b4285df2549bade660ddfe6ac9cad5e16aa2fd0f2c2b933d21bcf6f2b109c871af7ed6d63816348e57bb41e01e3e8bf9c3f6380219ddc28c0630c41e7d647f356bb7e6182eaf14b90d6563fd988c7fd31b4edf79250587084742884163c02ed5c0a68aa7dfac8c3571dc84c570f7b8c2eca03bf500000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090d9762518eca9c6bf5a0f49c0ef94d8ec805dd38ef8653b31f299646b89a7b06dc28e638b0e85e01e2e8ff65a24dd1f1edc1e7eadc21063b7b08d9d956ec12f20d8defecad7d4abe09bbee3581ad7da450db7772fef5985ed0fd9560d2b0c7bbe202490738b3c0fa6b805c016d6cb39413643773bf11394f7ca18aef535f5547cb32ba46eb68aaef03cd56c7c5650655a31ffdc6f694c2b633f45cd44f568a950450c087a97fbaff51d4e3e96e7b8ea899aa1b029bb1023c28e7fa08c2c753d591f12823ea6f45d5805ca6e09981017e2630667eed6b36a3bb49853d18c0429f29d7515a1878d5b8fee0f6d7bca62b2b5a89172e2d54ff4ded094e285d8d56c5268599d151ece60fa295553d1abcd97c143b7b4ede58b9b5526514a06f1e691cb18179c5abe010ff521f2200d4a1575f3141c3271b57d54180e19fa4e0913afebb826a876a618764a590d8f0b3e86d0608048f6613bb29a32b5ad161720d2c2858ed5f003c4c9c4a52f3f3879810f0ac47a0cf477f9fece8ce4bab69ef16e6db9f0cd057503262ebe352c1a063e736b1f9d04cce6fc53cb037200018f08ce3434fde5ac89ee51b7c5caf839cce1f46a8afe6b5c04d04ddb23727cf44ad73f550000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5c2f334b7091d548532f94a1b914bfb4f0456be733ad1ddc403e8e888ecb8fba8b28840749c5126f11863c714a9ad1de9979c755f44d88500da013e0f6cbdd960c8010c4c3ddf575190779fe197960cea9a69061223990d1fabbd5fd0184080bd5817d94b5a3faa81f08ba42b5deb42d0cf23c6f4f6c26b32b423bbcb7922a0b98ee681c642d4d6cb946ed54a04c743e72bd93ce7083aebf73e88d43daeec9172c03840478f7d8a4062bb05f73e42e75bcf383aaf8e401fb8c4d404312e8cb29d4a6ce8aea36a0bc9f117ecec64d91b66313ae6a5179c5bef68c3cec336b917b90434caf1cf9eace70c1699ef9f65216c92fb2f346f893aaeab1e6afc65e7769d044a5c69368b39dd92658869f122adef167f5e089e173a6478ff11d0322d73d79a6ee56d582020f2a869096ce2a6032ab54c5936207757ef627cb318444e5b96afb051e8cba2aae630db44db533ad558b9a2c88f021b6691b802acd99c7503da1e3c16558d5d8e0c0dea71a816d4a54ebddf1ed22338e38e04d1a9d3458494787173eda2e352532a39d42bd0516f1c20c12119f78932006e7029875095faa8d4d7f3130b3e1b4538dd2a0fc81370f56255d4bf1c66ed816f5ca751f9c6fb59000002280000022400000220025bd1717be76f366d6d5e15ee9a6c98a28d66a77f4d5517d3165c00162721700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025eb5f60662696f5ce97ab33b513c1b4186fa48e40372d67d81347a8c1d411637a66f862849d31ee135b4a6c6529c49975d747958c0477ee14c114968aae70e155683582fff78f0c53b5975637eeff109516e75f2916a00eeb057ace6f97c308a4418e5c06656c482cf2bdd1a39d84d7e59ec9c01ee9cc3308bb04994996c9944e153f4f603be6052657b82e7e1036af2a30f48a1fc9371b033b502cde85d46f0d81a4d85466cd1cedc2243771d10d3c59ecc31da054085c4d84f7fd65e02433610b24ed72326ee228fa8e273a66abaf3f825dcae16a40ada16092505cc9397027090e72f98ecd60975f6ba2fa8148563a9903ca119f48d5d7c05c4a9f474e9b423663bd8a2f063bc9078b205166d3856c8f30b41929a922f2e521204fddb065f1d9707090a616bec5e0f7426603f8e0c85a291a67b81e92f85b1cc513d96b3547a587c44bd4ebe3df97110033d1a372c2f8554f45a5c75502fd0a8494210e793f92c15f5330ad45d2caf42a64ed6599337ae65998fbf4dbd3e9f26531929e81a208a3c1ffc56af008304872c466866187de62538830d94fc6e8d29de7a68e67a894d359b56a99636b5651f0be8bd9135fc748d98c95ffaa9945ff7646606cb6000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00208c76cddc3cba80bf145643e0acf687cb7de1d7023334bf18b9a91b90d7d867808c6a6366e71c0e2909fbb906f28008202a8281dd935a3ad8d6388b6139ffeb3021b16c0de06bcc495ae78c938a39e640cc21bb0c8eaee1f202e85a7a224a4c932072be088e28c533e0602ae216284b85f3ba08b30181886c0c554d911c79439ef00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d48b81ce42d3d248f0c8dd6c0ac89ee9c37482912843961340d704adba12e4d87c2da619884021448df43df53cee99c347a3c5c52e3b89434a73f64fc3d880bee176fd66a359be1720f024e3348f11eb4d05c0f6e31475bb28cb30a53f091b99a85c8f296daceccfef07429cf8fed6e6d4533c0b4408ce08f51e13296a742ff478e5c4faf8c3c8194b707f181336be1448a9f4594822b3e4e905da168eeff87c157579754dce80d6974f9ef68b1518e3fdec283926b719ebdaf3a51176e84e0dbd085fca2e9487a68aa59e6e9c09cd01ca5c140891e3c67a12a2aaaf7b5c390f58ce163d7dd5a0190ce8260e426c78ce31e3667668e76863ae39ee2f6da1d167508dfb97233d3e5d86a11d4332630f9d834d91bce532a9eb7ad7380799f27cb6daee6d6ae9a94c22fb64b2520977226b4ce45c3fa40812b27f358fd9200df90a86df6537fc04ea43e5d691361633994d2d964a6aad1e5b2376bd660c7b939421d5e4c978f40d10445adb72c927c07b6fb9b818cc1f50d480ed3d311771546b1e1beb9a7cb9d1d5c8bea6e1ec1ec86cf799e9e8790f87d2127ded6a81fff5ce729f79950b8bbe6e577ff24f881cd51e49f47afc1bf4f63ceccd80d1f3d446eed0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000979c142c2ffa898a1361470535661d606285250431ab5ea05bf280ac1bef2967ec291725472114e99cb2be5b3a55c57e5211e5e0623c744e603efc8388261c5e4367c3d0c27519da18804248d71a0773f276c81e353673f09e55805b7e62c9f053623d2d687f0cb5d2602447ea9a02a9ab1b6501d20953b79348df3880d5381b4937c65c29a0aee26c010bc06f3ff879c7bbfeb2ccc466c3dddfac61e958f02953ec0ffab6835b29fadbb5555c56956238224be00872726e0484043cd599c8f19606926bceb321326b8ea7cf12ad9d119f0d57704fbf0bd391c1a76d54cf0a5f15a9893979fe1c5765c3b49d99ac099a0c8246d4735686f07de79109ff3bcaaaed1d91d53930150085ede8eb5ce5ac53dea766e075a723330b59e2304a6e1a030028a63a2703627a3098a7e3bf92e3f16f3fc73151cf53fb5b8727c9388773b15bf02c84cf45945996a5e97fc6740884941d5f008a47dccd5d64bb5a30e3a81f7b73ea86aa53854e29c127e5f947d1c73a83123c55f258ad2adb2999f6ceaff79c093ac9154f2a31de64ca3535b71fc9f64a2439d4227a5864ad8cf02093fee8f35a45eacda26179ef909f4b7b886dbfe7f55ebe6c885b43746a56e38657b7980000022800000224000002202d440e212fa25791c5596fda799acddac5a282f57707fe169aa70a148829279d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e374c6c9c5d224580108d911f7744d10d80d531a72f08a08f5956760c40146bc9fbaa038273aac325b4abb671c6dc3b2b8f1cf6b49adb83e2228b3713447d20769e98217c2da6ec9b7b85ebbaeee271023298b3182c807692f25cb34c2e2f366c3ba3ebc54f17fb0b98acdcd65607f513de8e97dfae25527ec52c7ee64107ea5530a1133e274e5f6df255c11ba7d0d1277a0c9061c370b726ed4660f08b62fbd77169e7f937d8e63e183c6c2796b8e4a36a4084f46ba9b12cd209bf1cd1952272285590f008cb206123c9825d806050b9c2d390d3222bdc62d7cc1426babae0cf2a9893b85f810ba75cd60dbd9e0f6a995061b0edd55eb43ce9c3e027c233f77af76e644d3bda81a179a6cc43fbc133469b5a0663bb8f7f733539318e08658ec51d6f69a5db1cdfb0e7419ccd48fb5d420d68817278031a3ad0c370817767fab2015f04721ea949803aed3128172ccc70a979b4b97436423d248b6815e2927f4f694089a7cbdd11572cbe11a59e35977c3a3a598b45d7a4668f0a915d03b651a458a71d4d99b917a78fa20f9085b0f8aeb2183fd081e5ada25e6848f84f9cf4b9d0aaa920e09ee3a54910ee6d556e3b41591d94e3aa336126a2628718d05b42000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022ed517334f78236f2814dc876b9a848765d299dc7e39113b448ee027db4df75e1e0eb0b00c16f3e1e2e45f6a03c4a89d4cfef0c888dae3b57b8103d5c718a82b021b21db8a95200b5babdab31c5a8bbdd5fd6ad88be609251f9654fe9bd8a7cc1e1dd2fa8162d72c6141a44db4f76daccb0811bd186ac35b159d115c74a625aee500000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cd99673238e7b9db8549ef1c2062c7ee7d4cd98ceefa9acc2fd1732ec60b42a42d3d033975ed112edd4e4c08007335d03a3479ab4d7a0b5ee4a78b49f15b1e2b548951be386c6f69b45338328d5e06cf1342a31a28a14a09c25fbf13374e1c33d441f8e08e22e2d89a1131fef2b2a0550b19e290390c850c7f3da73ca370d79219d66b402944d69221d7bd465a0bf927743ec1686c78f5bfc0d275062559fc8817f3b8d50a9ebd802309679bac21e4256573c0b520ede7b5a62035c7962a6633dcd7d0a4d3f5534f16144585269485b02d3d60ebf72f029dfee1bc2b194c2ae2ca2b7e232bd22f0625035ff54a824be3a9c28305ee0a9327a8b865b3000c05705f5010cbf2d18f0b187f22f9c3907cb7cb04dc8e4cbd48e903ab85fa7588d2a2f76edd74545de6989bbe774a766f538b68394b8d2ff729c790f894b66d28b87f25cda530bcbaf70456d2eaf64a1d0bd1f0abae5f4903cd53512635a0d2e2a110448d0912d53778518026b5359f968636d9d505b430b23504778e9c577df4aa9f3b8283ba405a920ef5c3d94c406f18061e035b8ff8a7ada9fcdead6316fb50e8684d29ff049bd03c2b62c929a68e284d3ed79e50182624f013b5b158d339e8e000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088f0497c6bd6d0cf5d6ffb9ba10e3da51dd65cec3f1dc899d6c216be7e4bd47bb6a47b317909c18dd91c8ab9d29f21591f4acd7b4e5f3e50db71fcdb5f1e4668c5647fee1f2234a3ad2d440183127409b1efa06e012444a411b2cc1f12df17dc0aaf23a5bd491775a434cd2393ca2c597cf68249e391a346b636f008c7b0ce71d15203b2c605649df1ffd1a5f8b49060aebee5cd0448a840b2f7ce67be905e2a7716be5032aba704abb5956337106fe9118db5255d05965565416f850295b4aa788b47163dbcfaba571cd54d2b4c2e9c7d7cb57893fdd04795f3a5902d994efde57c339427ff69af1609e0688ffa0c9050fa15ee14b4d5197703497a81fafc0e1b6fe253cfe2bdb443ebd30de72786d363d509522b4562aa681ee99ba0fcea92194d2ac576d5175b5f847d66787752d8cf5573772eaa300fbe0f65a850d75a6d4094e4fcf81600447d5f7c224a2e2710eb6284af6c150c5d084f0072eb1ce8c52df24c077471c17fa970264d9bf7c74b0ceea054c8a33603bca0bc3642ae440df4cb20f3e360c66a85dcf7e36b4fdd0bb2ade9d716001a86d472c31be34960f2bbe186e00bb4c0c309e781024081ede3015f9f6af60967c4c9b5e14b1e6f34b500000228000002240000022016862eba71cfa067ba373675da0d6d632482305be5eb8d12e489b8fdf2e8895f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16fb037fdb2f7ed7fae2e230c0e305e62e279f68334f1c86f60a105ed7d1d68f3915b005b92cf144ca18b19087202a8fa42305fea24c7e74b4fbfcc16024e0fe66635bb2f0fa8e5d19294b14dc8b436c0502d915916f08b7b97e779f49d6f935dbd6cd3bd33c314d9ef736a62f9f1192ab9d746e8f00091963284a1332f5d7d1f938e149032d67f20139736a479d549d556ce6778e25305c2badcc6675ca9ea6f4189aeaaf0bb28b637fb11a7be12facc553d36ba5636ba1ebcb68fb6b2295db0e64884dc70ef2a9fef77bdb8bcca17d1e1e62e6748392476cb2069f79565e9361fa58da662a988161811c1366f67da5175465e96105df0850d842ba4fe2edaf7439a3b5d24bc75e5e3063df4bac5104f03b94e06626bcd793e774a8006525ec1988ba9d03d26c6a8de36eac39c9b4c62d1d319d8360051063a154851177e11a36f50e5e5327628106eed4c358801f9220dd8d0df9a77f3fee9aa02d8e47c3d8aab3f1fce958d8a9bcd97f0e5a48336555de1feedf29e8fbe62562b50721a5d21ea6f20da31863e3d097e1d9039d56a5cd1d897b8055f8a51c4f9c2232f752aa5b98bdac42542f76527c4d4780245ad475db8fd960f9f20d7403e3550148709000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022ea1a786efecf2c3d8fe0fd34ee5a479a7f99b5454686ffbb2c8c9bd5871558f20c51512ec41a91a6cd7f589581e4ba434d4437c4f71bdabbd82e1dbfe64fad6021b2424be594bb00fcbe46e3f783168cff50375fb06f6267c3761689d13227605026dcf19563457dce21aa00327af482858ce68e51ddaa3c49a26a02ccfb9db4d00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000501a36b13b1bff947a0d599135905552fc48208cfaeacffa4ad7830e5d9be70242f1a3975c7573d19a25ad316b6776ba36e784e576fc0dbdca645a87ee7ad78d8b11b22f5391c2c69c85538d2a504ae99fa034f5cc3db4a7eed0d1fda43ae81228483d3ec93c31f86d54197a921ef553d4145c292c72deb947384934dfc2e17dd7403816960a30f0797a65f69bdfe36066c201ea2b32cb4ab0b9ee045db4ea87fffe30587788a8c4e9ff3d7217504fdefcd0a1b8c847368c27ae5defc497c2e4080cacb19848c5f1de232d6e529e82b0ca35172cddc3352a98b2b2d4b8f9fd2b2ec0556090af8663d02ef68cfe3fc635f452c208b4e6eab32e24a344aff6baa7f193e768b41922100d271b96b2c93577b9c38d5c2e55caeda3fe38d2be703cf4bb8b9025f0b1d218c01f10325cf3dd2518c7d234582d0613a0ea34cec7758dd200e5f49fdde28aefae1c88c79bf6dc295ff1161e7fb1e2856aed7ca5a731679deab991f1d96bcad3976ce50a3e179328b72259f75219668b10ea81da6eadaebba151f4e63f15615eae1539994a5b781029afbdefbdb4248e9bcfccdb516cb97c0ec2649f85d8578b411205285eb408997f830b5c1f7b4d984965bb5dd2401ab0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069f6d8cde921124c2d0878f41681f4ec35ba34a8392c6664fb5b077f354c44600d14d07985553a8230d0f63518bfcd03b655ea711db762c732d82c9d11cf81880937abcd1fade85d395e43782e6927b04d3be84827701213e1c0f89dd55e598df99b8111df9f12b952fa56890eb4bf3ecdb8665762d69b74b8b491088b49e1ad2891b590d64ca8490a90748054252ecbf94779470fb2cecab33ed896cb29c408f0a574f718e78bac13e8501f46eaaed869e37ffeb8e8aeb6d430d902c76346914d18a2c89956731c7c26a4aaf95fc63f54ce6b2e1363804a8929b14a2485a5df09d6388a02fd019a9522bdd0bfd92163a98be4c4e522bead3e70fbd5df8bd84d399ea209d1dd1e676045383c23c52c4e9a457dfa834497d95ef92efaab6f3a8615dac4b90a4371370374ece194793da52ed4937131fe6732b00c5e402d0542d8fbdab3a2d491b1a4ff97994a7b21cfc3c0db53ad3657689a7bd6010dfb7c37236252ffa1c236315a2577ebad65438c8123d8345985f5c8613c78c9069e5085526b4c056bcffcca0ac7b8f15f03cc201bf1ce3dbaf44a0cac02d58f0ba04c1b1f25aac3a7c9b8b3524b3b95c1ce7a943c83cc166cd0202d6cc953a4c4e163b020000022800000224000002202188a07303177990545945ffbbcb747baa5d8ecb9114661450525b0e6a0488c60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c9b77403537cc302087600bdf8b8cae6a6887cc7ce7d58186d4c384676e2ab5a2d5d2b3db75e31f7747242d79871ff73fdd08e4f1e7ea31e0480a7e1ff0d2f6bdf35a170ea13ea1e056bb7615f523fd1b85a28e481087b2919a9b279e562d0bc8678c3c98d66924523a38fbfbdc1e082b7c54ed7228930028b06629dfc5d411a5d82de90fa7808537360df2f61b573a2bfee801f7c1443638488905beb1d05419379adfcc92ec4332778becd7c45e0e09aa89a27d23c72d9687e5b3eb781e9a9c8bc3d0135d1ef6c0ce68b79ff26839da5ba593dda54dfbf79d839a1d97ca1b30eb973179f1528f95d08ce0f0e6e6d7d1a352493f9528314e829998f84d6e0e51438ea051a74a4e8722b407cefea2c7862d1db64cd1b643e1776fcddd264c27cb1ce56f7c13b26b019030c798dd4f345664051ae62d30168682ede549985a10e10e362172c0585d3b778fb19efd5b9c66d42d66d251fb9b624cad1d2e520a586d98820a4ae1fadaff54371fe7f32ec01c7f403c050558a99c23e39990123ad7dff906945fa5233358eb45c38878eb8cd9e974cc18f1e70440c4b0a144ac668f7699771e200b240c58b2afb05adae5d844c67b5f861a160d7f7301c9fd2638e000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00209ed87ea4cade7f136d59d6f5bf944efa6e532edb4c649e500551a6d07e2fc0904cc917e076fe737aca24cac0dc2e47464f113cf1db6d9a2221f667f6e13725d021c183520f204d1948b82e64d1c9d3ce28fa0d7584c63a1e33abb06554a38ff2b2a2acf3d87a370f02301f770f4df78a6f2aabbb00e17123fb82cb7c351b2cee200000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c4f6c54491ab14631273e76d2db9d58829d39cd9d12d432f8a2d20d113be92f7925bad5f365453cb36b5970e3ec4a4b6f57a7d516e3c70573de839b1f191a51447515dfbfe5b4037b810721da20d9975b8f068f8962d2f803c763a1f188784a7480464a177d041ba8ee20b4142353a8e9c424db1a3f451d6d8f65a971bd826b7e7243dee11bc301c352b882663d3b83a9d6db8522498d5114a4fba71237455571dc23de3f48925f8382c0d3bcb3040e5f65c917db6e3017c5900d86b3534f1c3e0b22dd46333f072df81b2fa9e3625a5ec8fc1526023317a7b54dad8c3947a0d10707cae8b89cfd491676ef7856815ba03de202444aafd039c632d5c1c3b889a8ca1b3d46e7397a804fdccebb0a74f2b243d3b818ad7b5d7c578ac2e8aa9dbc72db83a16dfcbff697d84e25c905aaf52d553488c94f60ba96d01d2af40d45be443e7559195bdf3242ab8743bb7192ade6d2fa534fb2268986a8e822a2cfe59dacef02fc8ddb9d32fccf1aa556b9b2eabb5334f15b4dbc69d7bab209cebe36cbeb5fe9072041f55e5f9fd23c4804911ee3671f507834bff9593798d5ad0fbf5af7418f8d1ddfbfe1217322e3a845314c8156f8c8187529381881ba3111beef64000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017f5037576c8f4e9298108d97389ae0dc6e1e62f649fce44793e81d2948fe864941035ac3fc4c481ce143da96acb4c41f956e3f390c2fb59c955977ed9ebdeccd665250e25005352c5874d0f7d63c02dc1c54dbe16c98f60f7528a7ce0154fc12e35180f74f77db4473829610f7cc864048a0ffbf2d06fc00a0a1210d0bde4d7529b965556db9c14f552abc0af6d9f2d6587a638d5b4405a10fd44c576ec3fecd5e1f08f80cc6e49540c8d8b8c465771a2fe1deb5bafff37e7eef8d2f1d95df7c17402acc2d74f0f21423ffa09f4157a45c0a4172768736c5b254492c4411f08fba27d2100f88d997707ebabb514e61d813b2cc33639ae29463b1ef5dbd6d1bf7e5744a925541e3095e48ffbc954af0a6fbfbfb0a3343782c2ac2c65962289be148531c84139f5c0b835af2a33f45a3f6971d43a1106c4d5255e744039e627672844fdf57d35f5373f4f4628b850ad68f6fb8010cdc833ca596b4a27bd9f4e8b9f30bf719e03f65fbc1daed231c0750f9fecc8e954bbe9a5d6a8dc35f4cc857bf87de59df9f37f7c443bc313f6fb42219a4cc5a60f8b8bca6298eebf0c3cf06e9373de00266d5104a9d7a0b5585f395202974584eb333f7f3503713cce30f3b80000022800000224000002202c4875f4f1b6f011d074b2a936968edff4358c82372df9ac439f17feaee4396700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac6d7581db82e527315a220d9e355d7a27e025c57ff3118fa0bae7ae5173b1581c1e42347ce7dd42524bf28f09618f261d5631ce0b88b9e04a56d2cc3645dec6cfd3c36bf59756efb74e000c4df15403d877182fbfa337cf6cc80f0db7685a4b4ca007b20cff44f2b9ae766fb4af654cf45ce7d6f094133f90ad11552fc5712ec34cc2e47a70ed9fe842c1aeec19b4357e12e120a8c7133b87f1e6104f2c03904de5f2f7ce15ed276ea9cf91d9d9391b02cd605400ecc2f71531e570dbf15562d0125c86a993a4f7c2046fa92be45b804ae6629e00e87d3d85fa59afd4713c229fb41808a3632d22fa5190b0e51f5390c83a3c027f28791c74ac6b29f92f3906f69ef824ec45c032ff5e9c94b4752c88b2795b8ba528ab85b52856dc6d41acbe3ebd125f88af26d0b8b5bbbd21c053ddbf5fa18f6a35aa654a2ea586650d4963175853b43c46c8482d6730d1fbe8554121168309c9e49401dffdfc02d6dfddc30cfb54d0522eb8fd64abd15230d320bb1a0f7e4b528f81571a05eefc49533954a79cdb8ec081925c436f9e228d2d70d2bb3cd6376a9dc6b4c84fafc079047de1a7b7f42d1e76437c3e4f733c511064bd70c433aab5ba2c227b695a0f93fb0481000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020ad6113c8b10a98d81a98eec88ccd6b723624fefab8eed8463560e98c7ad0e211d69acfb56f761d5955a351f5df307f93c1011ca8141d70785de975cfbfc60c1021ef0835d8e9f2c6d67734ab061cd892b427f94e1a3403de420eed1e20281f2010857855a52755ee1feae5dc54f0df73c00e64ecb6f8b490c6d7cab779e8621e300000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016d2acc8966ca5316ff229377ac15dbfe15eca9b24cbc0cf95d0e53572262ebe0f30665b764846d9975ef753c967e93ddcf045a5f13a91e75c3a94a78483688e602cffe3932e4aecc1209bd3342a0f159b2916af0fb9188b695a3616e5661cbef887d47143b29a52f14c9b08022b602919f7d68c3084ca04859f068aa1f21d0f4232b498647436201066d10b9c7310d103902b3fea937f5ab076bcf2efe9a4c9045e6f1f3891d25ebf02b2e357b6bbb0a81a45a45209247ca7a59ae2334d58276eb234da598c2a84b3784d8c3ce974047faf7e3755341ebbfe89dcc95e3edc33d0ade065e6e0b9db36bab0075136ad56e32d1d2d214fe30a02a2c083dd25f1dd2f1717932e190f42db2512f711acce58c8d769ebf99b330092cc210775b05ed2613c90e72a03c43f5be1031b211d5a53be7ff12ed27d8174f130f4060f76637cd3c377e41e97bd15dbad4c91881ea7e47ea610c85f3bdc1e73c137b7c2b7609f68cce9b82eb31290c7a606346ff712bcbf83dec365c0a7847d9c5a8c3d48caad7d09d2ec1ab4e25a7b150c429e5b1fa2ce1bd5d82ecaf161ccfa0b2c3cd8ff271e7a28d06675028f90e9efe7708d6cf37bf085a3e651b28cfccaa6fad4bf7ee20000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000983757d5e1af9b07c331b2a28e307f17140b9a7435508d6fd29f731d1ee717d19b9ab48defe9e9ce09a11d97e9b928e7d784f13d782e1929cf105d926eb0332d8e0b912578aaf3b4ede588cd52f9783fe8a5462cc99b931c4288640f6126ff611793ca4a02fc0ab50ca81aa21f5f6e62ce64fe575bcf22b3219364dac7300fd946c4391e1a1341be2da7bf2f56eb9e543e31275bdf380d3cde019ef48ef9df4ed85cabf8abe22a7125bae398e7ac016ddbcd5c47a6c33d5cd6eff3dbb006127217425076d6e21ff7b58af39e9645d5243612398a2d412d6c0eaddf38d00df6689f60c2b5fafce8429e79dabb8f5de6edfe797220ac6f5aa1cbe67748d11f4404ab7d00ca3f2c119f20f006076ecf864d459947df8528a13081bb3f15304c55e7d1994a6a77138aa30aae9d7614147370daf979c08481cf504b425167c6893f75cad82ab8a48e996f7a9e32925298a5deed9815b98598da34b4feffc30d36e6e99576a9f5ca56635d878d0ec32fc33bfd7863baae5748d2aa3ca2b84292eaacd23938159403323cd140b05eb677422f9bd1755f78f8a184f23e7dcdd2d91ecded95fb9938fcb926ed3006a0e858e368711be18fb32e60757fd6439d33810b7e4800000228000002240000022023fac0e643533fe789152ae64a11f7a99ce1c2cfb7428eefdce00268ace1234f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab373ca313a7d55e92aa7e2d1a5f4b4e55fc21f018823391bac1cb3d3dbe5d1c649f55400b40b03f040bb2584b1eb5d19cfe15a36bf5cffbf03caf6a75e2ab2b283cb791c86c81007a593dbdd6874e9637c5728236cc1351bcb375d07afbb0032c92fc4e2d5b68a7bc35ad160ce4e74bd0d3e3690db20266922a29730091314d5754e785d3579906db5671cd0d847f9e55fdb0e5163c162f75c7ac878210484b286a951621c65b13c44f1055c083792719e356ef8cfedd11aa901b0eae793ebe8350873e3b6e804c9ae71b39db5f8d20da1cdc967a2dcf7d028564a2e952540effa69d04c69254f9288873f4f54bf5a6ccbd63bca21a81a951180b0a3c8489880acae5a172066beb96497f3750c5b86d4a9ad9accec0f3682b925dd5d9ec3429d391a48c295270b163379f3aa0232edbe3a5446324424bcef4d6a79412de8332696356e4c22566ad1f050c4a01cc2ebcd6707bc9633b0b4f94baa311da83cbbf3588f1fe131653bf689dbbabc84d82b450e1ddbe0833c701cf78380e182d38858536f5c6ee567d769d02a2b1e4c542aedc8c067a52c134872d633c65acb017daeddce545b6b1bb41aecdacc0ad2af2ea772db41abcdf026ac876208d59fb8be7000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00225ae729bf94e9f7b58348c1a56fcbdd0ba6156b277109a366b4221d9946a57302855b8509e5b83fba146e25b12a4b87d0ae1bbcf0f80d5f2678dcfdcff431b17022305b6df7872973df10a30647a7f5facea72a0c2c8927841583fbb0419da5e861ba3070d4ae6a0c0df5c0157c5cf8a61062d08ee845f0f2b00092ed31cf2099800000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008eb2d3f12b634bd9cc9d9b886b3402737b9388147044671801f075ea846df700c0621adde4ae2693b27dae963745b46c737a8e74fa838ab2838d34bf7902ca96ea3dc5559368d965497d86a6b538f767c6665942c3835e5447627581ac769519e8fd075677446e114ee8fb8e80256ba2ec542bcd18caeddfe214237954c369be2a98957cfa0fd1e793896827360d2ec8ccee369a8de825e1f87feef19e87b1bb6e774e7d91533704245f71d0ee7882726e6b4053abe225b72e305e0ac0ebdeff37828e987b95a2ba5d8dba7603e6770a18dade0f88beda0c4795230fdc2c6d2c43e9ffef66f63b835b89c3392df38cee71d5ba4d1aa7feabafb6e52e160635fea6575993ceba0a140f5398d03c1d269082331b616113ec3939d3aa2c7e78548cbb6e96362af2a7bdc5d2bc331a021da1cf8df0354aa9c3b082c44a01b4d358d3e2719739928188028d49b7e9713e07168de8271db383ecf4c87ddbd00af537afaf2861e227f25f81826f49680d5c6ffb781413e429585370c3b258091448fea20fffe84cdbed81f1c9c0d34d051be201c9a434cd4f8476f9c0e87ced7d593965a8b7e37c196f06ee6186b9d4786ee2c4ba9c1ad748c7de7e1b3cad53f42fd8700000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009571ba433a28bbbc841206422515c601054dcc8949d5fd89650bf58a53772f0cee88944802689b194d3ec6871d8362faec6231f695376c3e7e1805a58e793c74214c6214eeda79d0e3be6ed6ee44b26f5afd11b3a61729976a84eb76831653dd9697492ae2aef32a21a0fb601101997dce0bdde4562844f2cb05e2449391d6160ab1ddcce63dfa4fb31503e4fa876ff3c4f7f36691c203a6109c39d1e06a6a57b729925fc57e2ae7356fc0268b0ab555ffe824e6043018497fbe239f40ddbc1c06a6a297804b6294bf2ae87b49207375ffcb58c18b2cc3c71397cf70eda44300b39e2c9c86ebc36559d847f5e57d1750078f6b89adfe247056a7fcd3c9306a7894cf73e10c4d11d1da3b94eae4f8c28b39b2f1621898d5f9f3dc74b53879e59ab20d3d939219d4227ae4e18b61792f338385e0d34c5e4b120e2a6d2d2ec8097a3ea4f3c0c403e33e9d5fe1ba8737d52d3988a2f4d02e4b3a82a17c350650c9fda5be6cc773ee8a733429fe08dfa5865a6e3bf0ded54c0e7ac0b512570d596062e9275f7222788fb3636b79feefea79b636ac327c70f72c98f85528cb87d2b837292211eb2d6a62b27201f07c887c0a74032812356fd175953445f7145890f2b200000228000002240000022013b26a5323ae50e0b474c50dd9e5db075faa530adcadcede578f5d1ba6a4d61e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015c047a5ebbf44eef82b615b771ab9e4d81feba1dc4cf153412dbff98061e2bb9fc009773cd57c0394a9d3f9a6b5503a4effb720f823b0e1cccd2fa673bb611bbc92f61be42200e93fb8b0f0d271c73a9a17ff3785b42c8754fd52b7b5ceea70900d756538ce3073e694d22595fc88793d60fe06bfc62a587e3b0d6b6648b1ac4ac3d8764c3c526206820f1145976168ca34271d459c673231e22ccb04db1f53c4af245d5a1c35f4d5e3e7a3c07fad8579632de1f62e7431d1fcfb8e8ac27735892ab1668d77ff1fe81a7f7c2457847d223d583e5677f3ab82c386d53251ce1ee4f11c7570cf4f7489d7615d1abeb0b8f4f1daff612723d59839db43cee8b7c5095d8ede09ebecdd87846ac1e368bc63ee4f87865723913090e0c94a5791e8d32bf1ed6a58a273d1a4b1ce02e83857d2e486b247c75949c221d3467dc6f610881a62b322387ffea6f87de52494a41a80f454cbde1b4808a0032c90780c77b5e9eef5bf3bb3c31728d12ee74b4cdd776b12ba69bc84a74eb759b4b10466a0a0e3b21b5dc08037e74dbe6f72c51dbce6567ff7ee902842e40586533bce49b208f82e9cde8bec17e62ab62a98f8706f5855f29ce71fe9d4ebfb38ce4cac9e397ab0000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002100911e6f0cc3711025aba6cff925c0ebc1e06e64b0074894cfcc26ebe45c1ba0a5f8d6f5707487c9a9a43c72e32a4e3b46190168537d35ce5b6e3e4765abbc9022449ab4f58563648f93cab42d7b9a0e10e3362dd159ea4cf7b1c730c02d82f4d1002b0e2a42f4094f9566a6ed72e9adbaba2de9f093058572c201f24392e366700000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099d45b791465cb0ba4ca15b5b2779ad93d6cbdd8489224149edfcd4198620fd6550bc0d5bb9c1d6e734ad858163423297fcccbcf1bbb97190b7f74679d3d0d37824b6b20716db7b6035147528ee086bd6418f7bc49d0b39789b11e7f23a9f4b86dd4ac833c8b843c47b84e0e5a98ed1a3f8c2c0c2ffc24a5141ff8b136dc60be2cfdb5a75e84de0f6bdfffbd3c37b7df3c8af86d2f9689f2f34dea97b705318707ef6cbf9b04d12cf5295e044d5613200de618b5ad09632227c37b019e3dc3b12f013f6f58afcd39bc50c53886c1d30b2c12f98f69ad2b14535f3ec7ae89d0a605457872e6a0aba4d6b962a4c6f4c3b52dc5f6428cb13ed0e26a24224ac5b97e929d0b282a6dbf96a89f4a5471306e8653942a730671feb8a192014a94fed19165c0d58b83fcb7b51a8f1516ad52ba68a1b79e9a313a4c78ea1e6bbf18c3806d1612231eb8fc11940cebfdf079089d4de684365e1010fe987e4feb738e644f8e21585623511a58b5c4f36fd26cca2efaaf4c8372329f6659a6965e28724590e67376199c717eb8b6f255f0ab157df353ed8abb0868df6ea78fb06067116bdf0bbb81838efc98fdb9ef8638445d37f79afbfc00d81a5c6fcf0d5a255cd53d94580000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af9e858dbddd2bce1f83c629792ccc3d43d046dc0751fc621271c4464e7c0cfa3c8fa82b47b25ac391fd2299d906850d7b2493ede54c8cd3df01eb700836c415aaea630c01d6031b42ae0a059ff72f17b7adefa63e6ab3c5b2124ddaf86ef50b1a1a728440631fb7a78957ec6b9a11a2af87f9ed081ffea929ee8613889d16353f47b919c3f07b6315bbb672fb9493bdbdab5a9997b12c96ecad3f7604ad6390f37e4236e03312e72480f0ee1e826fd4854920bc5b0a8bbca16d74f65ac77cc2b18a7d54b8c825d234dc1979ee2ed66e635fbee8703bd95593a01ed5617e3e485a533d86cb015d64db4f891f5721036cc8ee38a5760e84465a2e1253ef9e52ef65c979be801dad28c17676ac48ca5d3e70d84dd5d96b552419247bf2bcc4ca413e4e258362d8e2f461d31b5f5d68bc8ce827781bf52d48b24840ec94fd75c80c822623cb9c47589bcf8198101264e5b1f3848066f49840426ccb2a6189ccab0007c9ff27c40d331938dd9b9eb9d4c022ac44a7df38f72414cac3a09386aff6e2f6c156289869e477a2fbda68ac5b3fdcdf28cbc5dc9a38e31a028a2c9fa7ddaf442e7ef104e60fcf0c767c9e1185c33f1acfbdb06b75deaf263d24080c241cc70000022800000224000002202d66e63fdfc004f8d4b3a4d8dc80c95bb34613ad6cf3883c86be41fcdb0f4af6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a66548c8d53ae5a4d98ff750e51c44c3b52e6dd1f020084b1c26a3262d21b7325acc6b5d8682871f0bf903153ca0bf05483b4d19360a8febbd61cbf3353bccd76b64f5fbb2898338243bb55bad3da44db50ea5716ff2594c71b813e4c12de414ae7ee46230b2a3736e479f922f4fada1c62996816e6fe011174c2f19f7c93bd3566a29a34cca1da130d1e479efbc319de50c943d5e5a7606c5b0d57ceead8ad55b07782ca9aacb65ee3f815f68939b8ba33fd3454664dd4b87d4373753593e4f9e0c69c3d0bcf1fe6184abaaae9e8bf8eb5e291e72bcbc03a7c51750a024392b055814d341cb4393a9ba1a07ef6dcaa3baffa322acb42145b292d1984ac49527ef0ddcfb1854d7953418912c06e4fdc377e6d7a7ec90e51688341d6547d4591592cc2b51deeff4612f52451b7ef5f19fef4b178f7e0d7485251eed5f78c3f5b24dda961467b866f398521b228228961da4fec48cf88b28abb73726fe0c3a0b4433cfb4678d6086733a37d4deb4d30cf30b1abad5ecec845491cd84d3f1edeea404d32aa5d6de76b036cff0a814f6221d0769fb5b87d35e9ee7f38dfb917d5d55e745a6be5723783fea0f095c06cff52d1b07152e2b6b109ce3646b6b4b26ac4000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002079e28b60ea0bbc75093ca84e314d8d207e295af51f532718b9b506cc7bd421f1dd201f897c200babebc9d3b8e6f5b4623f80cf1aaeb826931d0c107c565e7fc02256629e89e04a97a1b1d8256258bc88c925eb66eaaa19eb4168e94ff2beb41f702f61dc46870052e70e378df9884b05c1d3d263a7847b0691709aa54ed94632a00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ac9231e638fbabcd6f84b0a0c7a7dfeed8ea344dd55074def48556693c40a57b049d6e70d3dc2dcb83de2b8088b625548f4539a934465d0acc9dca8ac76579b93926c7d54d4aeca85cd926d76b612068e4b175030ae0b808d6b4d2166914ecd9321193d6a9da4f1bf42fdd72165416ae48e31bde5320724a3bfedde6fb1daeb434a516c782219a9acc8ac9fa7d655c997b430a3bf59bdede96a7aef7ac186e6eb19a5a386d05d6c49dedf71370ad0be4d5e7506b02123030c2bdce6c0b0789f08e2a937e335cfe50e3eb36fdfef4f8da488d068f7880a0087323a68c86d25fbc944749a5a1d95c8778bb7c91b6e5e2e45bd2ba586007e54d9f660d3c01230416d48fd7f449e44def13a8b59851240b5204ef68c9c2506925c37b0e1eb2abb8f801ff7f526fa759f39a5f4614f8bf4b5f51bb7abfcefa0f448ad3ccac4ce67876c96cdc0a5d1e5e2eb639f411db1feb6cb6f3e9ba7e8e1bca009e8559ccd12c26657c2cab833e64802f945ecd1c5c579f8f3274846e0f88ca07a027e836c386659bf3bd47c4574aa069949e3c7ad3bf17257ba2385d24ef06803116991158d18012465bab3261238917371bf43d6115f92b8773d4b079ffe64f4b77630470d1c0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000163671086c45674a817199c88d79d6292c1141726ea02651caf0654468d557d0a7805fe4d8e286aca0d96432b85a05106eeaf4f53f197e9275c77c1ded9b0ef8ec883edf9c1ce99b3f94a8410e02899fd299fd8f5c10e2980113e0a2f3039bfd97c2391a56d4c96f24ded2a426fa67e6312526e02802f72990238b768f506d383d78d138d374e9818de35d3b5df54c942a001665ccec337ff84e1b4fdce630b62918fba914627bd97b1b817fd62836048ccdc88ca6a55271ba9b7f07dd260b6c06f04bae5f37eaa8e4464deeea9a8c670527482b3bdf4c6bd576a0ffde3b95cc955eb4f6ba858998303151707d5b7876cf54815fed6e991ba60b06dcaf121389eb00f676b4fce9ea0c18c7e84b4dc5339a9726ea1e57bdc3ba8b4df8b31f18a0d72ef7783483b7cb0943308159cc95e8dcaf52afbe6385aa481d1cec9ee7ecd45ddb717705e1c3d49a89a5ed02c072b070f23e32010a96875555fc2d513474baeb93e1fa4959901328046dccd3255973884e1b465d38b4b54e329a55038ada55df76d30cf13248cee6a3c5469f6b3351dad9e23f6be4b1d373529f175d2bf7817c3d0853f7ee184d2d0bc5720a5f90397c84b5bf6a9fb11854af9a22a45b85f5000002280000022400000220036557fc7ffbb6dd308b5de7e679bfc4a20bf6ed468825c238c93c78fe53999200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0137ff8b0225cdaa3b32f47b68b4db5afd7e81d4e2db149e4a8e35c795071dd71045c8bb6b9f63b073004daeed5e7ab3ebc41165a622e9ac4d702d16f87e999e28addc5b5e82aefc25264e6d44208cd17f939312a9fdc942b70e845284511ac4aa2f527555319bdaef74716e16495fbad6706d16e9c247b24957d8682fb493ca671fc680401e915182cfd96cce6e86accd7c68eadf2ba64ef9df99f712ccbedd73e6564ce7f28e283b011c4934af834035b512753148f0bf9e7f90865543bef55871f1c5bbf5c9de7f9036567f07eb128da32362742970010dec1c4c4d00a7ba0c9b70954ba20a0e3ed29703ed33c10ea092a0e1a010ce68d3c22ab3adfed68fb7c537d3bcfa67a312a1a6245c820f332725b2b741812eac318a9f1bda08f1ef972410635e1006a03a91d5e983ca07652cd1434f254dfc6f9d246f3a9d929027611f825ceac1b757056217a8bd37f64a733c845ed20ec13896dbab66366255806c72f96a23bfe30b991f8db38af19bd7662b7d42de233ce4da7ae5c202ae84a6054f65a9a10ba8e33a7b49e5557caeec6fb437c4b0bd1de439df0f0ef3d6b72f25f4e8d58524d1aab520d0a485bc27de6325446096abdaaad356a3ba00fe7d4000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020ef4087f801f6e5d0611c9b5da28fb986efee4dfdc26205e06a3b2c29a068580240bdcd58853637bb57d04ef6c02567573eee219b65ac015e48f7eddb3c0c1ac0225ed43b8fe7a203ac375994c1c321de2bc7a10f6c70f7aa433299e5c4b97ab8f1d910d8bbf114fab15167a6c9bf7e76cdc77cd0da0b46fd21a96f20fbbde3d5000000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001914da9a3a1105e1d7c3b1a2135034f0e90f1b2d11c1bd5f2ecc52859303e2d9314df193a85d37ccae71ed4851783d7fd7d45e88066e209dd83064c180f4631cbea4cf65fc299edea7d4858fc40835b1db8da86defe3fe43cfecb9bb56f89149b8c2a0b20e389d97f6c67e388740ad59fc901c6c55e00336364e2e05988f3e6e5cd85d295e07af264c76cc1f55593351fecfa07c344d3157ae179360a17d274ea9178766b3c9a27127a7d39265622164fa6f56cc8f3f76292fb8f2178f84a710d06d66116dcf69c09a16a207d66ba52bd35447a3d64ec3845a0833da1a15fdb0d7cbb33e1e6e9fb71367c0f5c79a3ca762ca2de4e1c37f96d8ec6bb58e6fc5fc7c02066e2e98170c1e794a438bfa84891a7209cc5494f8cc5451f23b3514741329015d06acc9c3f8cbe04176d0244a41020ef836a5af8dddfb1f228829255801aae829c5abf3504ffc72474292aaed831392fc520b3781c328033f9239a4215d5ee0a368b1f44c5faa8d1a3d558da71f250299ecdec962a0f09ea12c574eff3d087ae079e58449743c7459ee2e86efb642b73debb919d60b6f1c649c3162543e3e3972b660316ab311597f1a42e0cd2238ae160f18579dcd6d4416da087752dc0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000831d0442260fe8464dc7743a5076d391229016f74e7b34f8d054a0b2619e7f4b19e255151b452135623a445777a09c173923225d5d8a15461fb1ad67fc9a73d306f0dbf375ca5d0a5982b4c48924ebb984a4a8354165886f8ed90e7c65f76ecafc407809d51632af7275a84281e795a66f7e25288b848129036e4e9c7e175b15c7176ec6c0036d1038d6322aaa1e6e7cc8a91fc804557f59eefda8d9242070c9bca243e04a1f828acf9e6aeacba7c4e517f2a828a71b28738757ca8bdf928d17b175d99be185bec795f96dc21b592bce2b8757e7662024acec55caff10e5ae635e4b91d9bb851a6a94542ab67194c420891c6d911f718fb486576e998ca80e1211f4a8e0cb91a777d31b5e207e8cd717631b5e2cf72ac271ed49da2236568b0b7570fe96dc7c9a41a4bb6ed104b5406460d9684c0a7e17aa88ee8576fb08a4fb9b8268ecd8e489cbb22623dd53fc369a91a2dfeaf565d945382f3b96f6764f7fb060c5e3611faf7868b18c12caa56b046fbe80288c441739836885b924ed0322263cafe8bf4391672a2acdb381361e2499221a9603dfbaeec6ee09c80942fba170251148aca59e898d6de79752261c632ae292210ddd8a08dcf18e590881b4b4000002280000022400000220300a996f0db23899f4f881f2168f66ea04c2398a87789af2de22b0ec730863600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091d3eee97872cfd7b59b3814893baf110666aa3ae7b40fe1b76bebd7979639cac4d38ba99658f7d77282faa86452debb38107dd1c13b16164d9f07458b42c03219c2c2bfbb8af8038fb04b16227c23d8d3df23c255e84f26b7de5d42cf140dc11e6f0879855053eb360d1157f3700a08c69dbfefc908fb808a06df6fec6c7438feab9c522963548419178b8479928e71305a3e62f6c903164ab8e99123cd83975db3bce58e949418c49492850c54c711acce087b013718403ad6e3b96db7ed88c386dbe71d7c122e726650047dc5eaeac14670d80494cbc5eaa62a2fe9ac55b87942c0296cc75f8bdd58b6090a1e5ac78b1aace65d9a88a89e239bbc393df576670c632c369d77774e4ade8192a3fd288965a228a5d2e4fefaa56e683fc02f1e0c0910b9fe76161f0bdce003f91e17c876d871bc18f36dbb7065dbe7065546defa84f650655d812bac618b984ceb35e367f2df80013c1962a4f09a9e364c48f19b1ed4b89b6cbb9231d6412ceeeafab344b975ec5238cdb4ed3196deb67b8da3b68950bb64c4ed7059c26a91d022791cd36d6bc2a565913c459c308d17ef3a9a00ada3e097c954ae8449d8d5084c676d66afab0193a9e33b5108138ea9066991000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022ec47f40af5631c04e33d612706531284c46f565834a2789ebbdae43d1f9dda926a8e7fa6f041e3df4f4ff603ec3ffdaf067fb2a5de0687781d00f55fd35ebba022764ccc0c91f3910eb5fc634e5c184d01aa80b1c77919043148a575dc678be910b32aacf30b0e1daa566c7a0e089e329d40ee8ee24529ef34920f716f077365200000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000293f6ec1ed8ff22db28362fab0485481483c3e90b3993eb7a5499994c4c1fdaf37307308ee810127d8011a6139220f6478593503160429a562a51e791884644cdb7d1241a65cff244f0709ba9005e7c9942b83ce8720b439e0a30578039efd613bb1ee3131da089b82360fb1c387c861c14d71f39ba46dbb92a8b4b9261bdaac60e777aaf2d7f324054649197f7db0f992a378311cff4c728f486ebfeb7ab8e1bc7d2d70fdc9064d23ac8efa11957a2bcabfc4803eda4db7f6a85f8ec55741355bad13a2305a3131ac868e3e484533909bfb24f0d56cf45a4bac93f76671b14d876303463962cdcbd51fd0bf5374577b6d9f5907555692ca90d9fb30067695a23569c3e51ac6c48ef6ad65b2928da34a4ae1f50da190f68600cd69bd015259073044fa85d1a67859b84c3d052d5b37743af5924db777f1944318f1c15db776055ecec1e6ee5fd359be47b42b09dbbbfc69346c9390a90d357549c8ffdfeed10806490d1db34d6fd41068d9679210e456148fedd8d6856efbf9b4e70353943e4cb4329f8d2b008d9832ffda8076d7263a98fbc72301db689ebbd3dd96195db566b0014f96d1b1529867c54b8667513703624d225365a7b4b5b450931a251346b60000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000109410526e62f4ecb305009f43f8a5cc2dc7e05e377b8b23945ccd848fa47c6ad3a1018ef749d4ddace8ec915f5f88775026aaa499b246eddeb7cec792393ce277479c782d4de386dd2a08e333b42324c098458616dedcabce419723a79009d5dacf719fb93909aaa3ae4c9f5dbb23144a2785aa00c9e57755ff93057875bf8f8bdf795788765c0e075a063f79f492394038f7f1fa301d2149958cf84aee314af76b7650df6bb634e559c859bfa634f76c09424ead5e261d818742cab0163f3f0fb827178b41a060118d18c082f5cdf6a53336234c54c20d01ad27b706160773d6fb30ae9835e47970d61ad52f5c25a53dbc0a614e0895fc4fd34ed1d2c5bb41fd34d6471821b352f850e8f66ed65c00a6ce9e289800e1a805d392fe2d3e9c3932abb7ee217bfecdb32fbdd3c7612299400781dfec816e8fa0e81a6aee02a606a3e9b307c29deee5c752d52580d021e7b0eebfdb53a64d7903c94d4251da42c96f0ec5b7d0822577a58f99c4bf3ee870860524c25b9d37f3d868f0f6522a3e94bc596f9ae5ddd48151ced68199c31b23013ffc703c3a4e21989e5b342058fff04b43decc7b67388df6061f7ecf6717e2e2f644972f5bf2ab7e0ef5a0816ddd5e0000022800000224000002201f05eab8ea44f81ac409971cae2c49b79666f7f99a9a9abb4abfd62a8ec1b2a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000971e2b8b11637fe1ce313e864f4c2cf3fda98a519d9276d4eea5d043e0c8017cf555d5d713f145de881f95e4376337fd844f56d3c2ca1398547f079972926cdc8c2e46d1b14091b38d28dee6d962148eeea4548cbd398a94eae68f6f56429ef28f11577aa08c8acac8eae4d077b9eff94bd967bdb28f40f2a3a5644e58daf0769df73fe5ef8a1810a54794af4f4dc77133e7b73007f71733eb1286be0d9f749382bf8425b91166d7ec7bbe6b143a7be448abff031304c233746d83dac9b46634478a834a614ca68faf288da2a664769251e35b7cc864ae7cb0b8fba77de5862fee5b5dfa1c655c9d8deb7ff0fb6213d20ff6a2f6a369788a83aeed7ab37d85079f834ae8e9d29c6ded6ca64c28a9f4accce6aea6a271f37d092c376e8e5d0d50d2d79e6b91edeae4c8ccbe927a7b3880f33ee28eb1723a5a687162dbff62c73d91e215f9d2fc1ef34ef6589185207b23828f5a7db135845439cf7bbb3c7ea061e2072bd4d556d0f8780239d6dbf49c918e688ec25145e30ce85615a17aa958b9c6cc4e7976a578c8753ba7d4247028c6160b030aa75ddb6940c59cadf5796be1ead57fb1f02a241e8223204b058b44de66fbd49e57390a04de976487ebeb9d29000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00227ef9adc22a3f03c66d62655077d9011f5c584ceac000849020c4664c101296a258c945f18068f31cb78b7cfd552d6bfd4dc9483a9b2ab2ea3594712f27963ba0228bf5fe693549ec69dbac5ce7e5673e5d5c0024d622a30c7ee7a9e5c53b97fe129ceb844175a1bc27d6f77f43f92bcc3d51f65adc1fc8d92031c66f52e0d881900000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bef29a286aff6392252a5ec66148443af8aa2b5efaa195f3e3ead2c325779609880aa0c77d47b76c631d8092060a7b046ebace25c3d57a409a87a614de9f12f28c8b0186c48032b06ddefeb52549f8546030af362eab4bcb789843ea6d11cc2d60d1b7121bc21c2c89436acfb11deb6c230bd6a78996217f39fad32009177c089488f1d905a7169ef15d426c1fb75ea37ddd58d2a4679261743850bcca775846f095a275901593ecb87c8883e2d6d4295af2260b53e2bf1ca38938e5a3ee55919198d49b36e1bd8455e6b69ea840cd47374ce581f00bb3e61b429a66455ce8f1c08180e7b2b59cbea232df061c11904944bfb62e6565511e0a0fef4312bb179f8a905e379431503946c245a89edd4b9d90a0502955b1950a18e3f978d5040425ce59a6dcdeb77231e39c91b54b31316f1a00da18ec0ba39a6639f36fdd3e35cdc0d57f8fe219cbcf890030d4dd74e3e84eb9c226785e3dc7e7cc53edfe2401dffedf7dce6683dbd4a620fe83767faaaf13d6d2dded6ca8ca2f254d8b1ad5fb061f8b02c21087e979ee089893709f6776978e173a4757cb189e10df429c33f9501eba435d9e33aa754d1b97df1cf0806195b1191c86caa829a8110e96bb08bc4000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085414b04388949eb557bc9a2689e8cc5b1a5e0c22ac757e07e27308eacd8aa4944cccae48c94c3479c02be61d8338a05830199ae7dbb53bfcc1a6cdbaa1b13d3abcc8710ed25dd37dee17ac3f1b7354cc7ee9c7608e87607ffd0e096157a8598ba5aad648d12e5e1aee9ad8db64614405c905b2d625b12d519a804347b0f18136bb383b4cf3ddc04c8313dc6f6d1f17c3706933717fb107daf53ec3d4dd4a11fefbe2615600584fc1f1423245b1ab61d2247a89f5ff49eafa1a7fd7e85692c02b5011e5d1405ce137a025db5963ae3d20cb49a16a4e2f9a1e87f7cf1f938109a882c97ee5f4533b93abec9e468976d9064d57dd39d4a2616862150fd510e24dc214bae4c20a9c575abad990ae2cd868511e785b8ef7ab299c561408ae7d1fa91221e3b8eaae33ddb97adf931cb982dacc3d65ca2db06d771bf2cf1f31a8bc8161ac5b23446c8c731496395b6d353eb3b6728fec67c239f3f41f635474da57b2eca3550af429593ce84087feefa8e9374da6068512b1384f463efc8e8e6dbb621247ac5f6949473c302eaa5356eed97426fdcb8adc094b02eb749ea8f6645a5ea569924bebf8f37ccd48de4e8e720d0dd398181851420302a2fab31adeb298ddf00000228000002240000022010b1345c688f5e4977170afff3dd4abe4e8aa1c308922a0a46fd6c3b0bead4fd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002710b66f53a4f29f9e888dced55d35a15feea2f01f6eaf41d000e0f0cc4fb7a3fbc75ee3a6231358929a66923481c9769fab4663e1990a7a201266464c304bbd166ac5f3655c28dbefc65aa95921f68bce0475d1121487ad4eeb4390b1c5b59914273a2e40d1fe58affd9f522eb9cd2f69bd752ead83de097dc3e0c565b79362e684ed432a47de78308a0056b97ebe2a902edb7b9073090f86e42a6988f9a1f2d40fe059ae575ab02c8772e323827660d912e33afffc5573b5b2bb6d391ad6ccb59ca3c6bab15db5529c5ff4ecb470c5654ae58c8f9c04855020626fe39570217ffbfd7954abad81d19d942f6e7148f845a21b3522b01552a5ee73586b77e2aa622e735174d79d832ce14f4a1f87d531c8c43382ecb21e4029cab198bc1369afc801f9a19fa11564dc1422c85c8c7a59d45b63eaee72d2d05b86b8f6428581bf6be2c52206a1a368881905080bbb106f8b1581acad00294b12a6927685ba7b0c37682e94ddf58f036b900f85587a6f06ffe450a3fbfcf68b367a7dd41cf3ad65027b1c61562f05bbc41cc0f89a427d429fa62d560ffa356cb8dd51ba775ba741be8f0ebb84e3d85960ce7d61807153ca53bf20f9dfa52e9eae947106fcb4c6cf000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00229dde085a5240e576a5a4e98cf2645eaa408e243b97d6fe1f264d1b5871e1fe22a9ce4c7ff0b971ebc4af8b3bd8ec256113c1249fd45bfa8f2112336bf01b3410229e2229dac3f0e87467829cbdfc26060c9326146b5d93e7bc7a4b391d6d900322caac35a9a52516f9b597a925833ee1835541b897472124c94447c4cde4da6f500000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000993d4b9082dba456f2554a656061c1b16bfff7c580b49b12413fc2b68345562a85b35765b2775b206e42e1b4668e124f64fae4017dc4ed23faac0ebeeeaeef9bce2523036dd2083bfb1c41439c7098c4463f459fa6e5f347b6219a7163646519392992a159888dff61a0351331f8f1e356a9b8fe2bbfd5d49f92c95718e80ad1ad857f57458d02b9705d316a96f053580a997ddcf138e1fb1999cd92ce0e95a24d1dd934afd711b7029f1712d9abac6e11386e324f3169ffacd430694463741c0f333f437c0d73f0026d7dea8c74c9c5febe3700d7a1fe4bb51de72dedf386c6ae728f5e1fb873afb956a9a73dda8ce85d2122719d7bb6ed44d802ad5eb6cd189229e71541270930f505d7ca75906aea4c0ab60a23ea6fb56d19649ca29e2668323b7526ef3956613b787689869aa43f1e083675efa65f3634b15833c7ad6609a1ac38b9f433367a4e2c833b1357d930f0ab3dfa465d6af8291fc74f3cd5ed7ea9249fe5bfd78ed5e6b60e2c5e488114f9af729cb31f40b1d84d4b86f20130f816384126d8d327fb59f098c692972662d56a04a4a7cde87dfe2996c914088b6364b44bdc6a63a61d5a9c0c865b9c4412894e1742a782853b08a459b5f5156916000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b7eeda35177064bfd3fae0f24f308658b8ee6f4e319b64eef2e9666d3610244ab84fad8f28e1a6d4dc0da9aec089225aa2301a4ff09de54db3b696ff48c27f0f2a1996236c91e6dfb114529c9cbea1b9a4460b71501f45cfe02e42a26b5511bd49254099bf9044e1ab6efaaf31addbae54dbbda5cf2c65eb2762a5247c98e20923dbd3cbd12aa523ab72534b010c7ac8b85faec733ea53255923aa3062be31d740ec19b4dda8a16fa5c6fcf3fb6f534820f6f13463f4433aed531bd91436d8c67a0c2958741bfd4e633d848ab3fb43db65f2b451707defb87fd2611b90f841fbfd7b2a891fa47ed57df5fd2dfa20521db125fca79c65d5f99001c85fc0f7cc05bd05e572ca679bfe9bed9aed4824d7763a7c89abb3b18f518ab946ddb7d10ec3b2a122b368b04e1d3b1ee9ca6582dde62ef757f5495d48b7b7cae18990efed015abeab706a31e5b7f23bec6fa5b53aa9b4ef81bbc8a04aed23e5e1ab42362dbc31c304ec21bcf86afa4f002d2189b5b56b16fdaaf1a84e76066af1704c55f0de06d6d5599235013a2e5138faa4f8f1b968adbb8e24d2fecf5baf78d8baf214e900d685b97c28c182bc7c22cae05bf8e685f061dbfaebf1f5907c439b8a313f000002280000022400000220305ae1b7d9f32a623131f24068d68bf612ae62b8b648a3f969e4eb0484ffce8700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097670f61479e873779fcd04b1112614779b5c4d4dada9f5817af5ed1e94c6e343a7b81373acd71280226939ed836a76349ed9fa4da64c9aecc7dad77c91ad3b0ab48c768d92d6e23c54c30bb829b5ebb03333ca9e136d66c50b0866ece905366828b9bcecef99791172d8fd4302b34ef545f4f905bd7c77c7d46163dd11c22e978c565465c5eae8313ed6d58e61efa091e35a1afaa8ce17540a08506a1981d6c33e7fa101a15ebe30e48bdf6514b5c7553d71b973b261dd095882248d10a2058b9aee9388630a2b52dfea478edd6f5fede355d907bc2e1fa78cb447b5867c6e7f3869f416794ce351a2261072296ebf9809373a7e9df25c28ef0a647acada3f824dfbdca9a8c3286d3700cf87edd6520354dd4c082ef5753accae40339e6521b4dcb5e964055037df84db81c60adf274c350959086d3bb963b4a0d6a09cab12854ce35c19327b6eddb3a0a90b3ae3fad9d336550df0f87051f0e48a00e2592d0bad0112ff69b1acb92a7cb51b6b30f0459cced7248065133599f7a4906ec05fb7b8490d69c66a39b7c06c369248cdcbd42ea0cc132af7ae0d321b7794cdbefba356c5c19c9947359b9a14860f5591a492fa504aa6ae32b3bed52e397fbad311000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002237214ab8e116d281b6785b989a2e9277b48518dabde6fa53cfd01631d00dce90bb03409b823b3dc6612edbac6f73b6437ef17a9e9b0e9f9344f3a05aa6e63af022bc8e9a4b2e40b539642dbdacc41aeb8b62f1a7802fdace86ea11c144dd15c982b3f7262657b23f2528499335b485bf91ddd9fb84a781727a7da428803c0ff2f00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080294194c0f9fdb8edba9e9052b5f7f15d8dd066872defa9d53d9f15deb300607def71975fa96e7668d13e993f2ce6b4dc01ad01039a0b17c6fc2e0f382ccc67858cc2ba918bb2982d1655ac0e8f52fb3a79198320268133d8ac74c192b0e573e2c5d133b052d1187a7fa0b457d7768c4f63a21091ac5a00dd455beba0c685c7069290b3ac98d16e251beefd1c79a97436fea04abe5b39030620a92d80efa6db6dcebfb2d878d75686be55518494bf5e14105effd3ca3e56c17366bc59c42fbfaa2b77181794dca236fa7fd44fc83cd2076b11945d5f71851f7579f9137704b2f197069d8b4ec3f2756e0de13cd6daa3708c5ff59c0c76a07f2e1176329bedc81ebd5e95bbfe52fe7a87f534a4bafeefc716254b16d5f79d0a12fb1ec29809c3152ffbaa3736ec125194ec897105389efcff88ea7ba179b2727dd6a13f2fa28980d0183cf4ea94f1928934b592eea5c060f3209e2da34086c5f602579966b0617d2f701f1ae44900b86c5a924fa4a19beabdca3fce5a347830c19401544f9825e61e9eef4b87e1a47ba9cb0fe15a4eba38a02733e49833f4799a87e28c0f72053510a3b666fa3814f6b7d0456c5e867266a496e7ebcbca34cd4706cc002f05e1000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011842e9186fbda27839e2c47a267947bbfa3b15eb05b421f14e06072707ee96d8d78603b0f4cef29b6a83099c82a904555397adb05d95f52cb1636d2fb0ab3058b5b98b81239c0138eeb21caba41f7755ab3c4428110bec70b909837a7de988a712a91ca3ce77d769c62ddd653f7d03f4c2ca72d49a4a41e542770840ee348d451639f514b4370dce89a4ce488352d43f325f906791939857c9847ba3c1e72625922c11019a12ec0dea87c829e4756f04be27910002585ba3808b44fee9df0156978da1ae40d1de47ba3f77e241c62292673f389e7bc9c2a439be3c21f4ba249f801443de81dda120362217886551fc6d2144d3bd69961b95800034012e8968c3a93275fea3be27b55a537ca1a486adc156ffdbab853a74c8ee354b8fb14342dab632b54d962ef22b8d7165db19b628ffa8a985d64564941788d637ad8dc82b287e0d45b67fbd5b11cef16920f7195c4e5f38a9da989c15d3874b6d99ff89eb6dd0be03ff094bf511abff50af7507505cfce433502cef77756ebbcc858e795ba31bc80d8c31e050fa0c98d84cf2f36ed623e609a053ca0548551e02f77502fa7eb4030fe994527a574c1b44dc10f562b2e16864cb8fefe07b29700db02d8441c00000228000002240000022013202ed8c05c320b1ee59df04a4645653e8360c7af90ed101bf3dedde79c4403000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f9b8d5b4ea6d6005f7b27535876dbd40a44b0e973bd844c964cc641dc7267d3ee7aa1aeb079d74491791c3dd70ef6715f939b864cd43b43bc7ba63fc00e7f8cf465b504b184f9e75b6f976b7af92513f7edcb99e825854fbefa94fbea5e1312b5f11ba73798143b42db6622cacc58275f4cbe842338ac14203666502bbbc90126e61a12253d87f6b18412c9cce05c126338cc1c43b3c6ad408c26b87a23d6b56f547d9d6df5c6d4c006f6c57e64061d01aed560ceac166f4022534ec8fa2141d97edffd69a911b9aca2aad3aafa0710dc6776e8a0ea43442390b6ceb55c3477eb1f933197ee3cab23addb89f1c0d28388054d10d5e57158ed64b1513e8001b265136895a62cbdf6df7e95f7d89ccc674e963533e80e8a46cf39bbcdd7959bb8880f6957a01b7107ae209c8a5db204236d0243a0f5a3c6cae41d35cc398a2732b150fa6bc9e8f39f470d523104ef22a416dbfd6a6d7c5032b9f15ce18cd4fc5c58efefaa84aad7fbd41cba3b0e1f2861bb1df56edc2141d92f9dc1350426ec7ca3c6537da8c469a09146d3e26b4fd0fa8f77be8cd1c1c671edd12074c7fa7be82d433fd7900590d92daeffb344f184b4c1027329cecb121453839b006080c609000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0021f42a8d0a2d98a2b560de592fda7dc2c1cee5cfa3d7a6557e497d58230404ae807a4870eb749084964b452657a9c68445e560aee8fce6fd057ce2b50b7730812022cd73dcc07d1679f552f7360a8415576954ab682e5a2ea722508290b908c5b9b20ea69eb9b1b78064dc8990d7851e8926c106068b52c9c273f98431f5d0e383200000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a34ad6c3fad47eea33d92b715c52d4703d12c91db760adbe5e776ac80fe8548c2ecef8f2c84df280475ef556536752c84b804c3cb7d88d48199d43baea9a36ebd78fbac869729e9f6d05799495aab1381343d603fc019b79888540a9fbdd526af23770f315bf8512bae411c49e8ad0c0c88c72f6c8fe3a61ef311b21f764bee4fbd630240ff769dca9e31d39ac34217e43e44b7a48d478a6bf8bbc3f1e6d41d803bb7b203fcd309d884fa0f7e8a5dbc099a2ad156a127063e001823f8785d83ed9f964f49bea06e39a37597206694f84e899119cc66015ff670aab09fbeda84f1620a0aecec320d81945839874f3985b613525633ed8f048fd4ed5042b9b400eca647fa1e6c020b4056b9a38642c95d120ee97d67f5c52f5a1430fd633258b74752e46cc3336c1a71f623bad9ea0c382cbe836d4d2fe447f46a089ba6a649de9fed49de5628b107815d175b9c1779e974f6fa763fece7f45900f3d00133516a79628dea615f1a2e8945fcb49b71c698108ece8bb28149243be47982ab24c28fef06cbc73b24a559a66065812450f74717f68af68da5c7907e99ae89d91088e4e2e7d042dde9537dbd3fa4b04f21fd37ba7b679c86789812e35c4b082f13c46000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022ca2d3552ab60ea3644012f36f7d4f84fcdd8d61febefbce73ff35e18fb22f0185bde9f302df52b405124fba9848307b424f84ca717cc9b01e3508f238b047abbd6d3724b82bb20e038ffcb7dcf5aea1b1fe100fd0714983dfc0159827cb70fabe7f1f949be8cb8fed218f41a35d5765be0e3d93f926283f0877fde8ee91068b2c02830fe09cd9ed63661246ac0fae26542bb49eb10d45e84b650116f7c84c964251cca1fbcacbb1da7f00d6c0c19dab9c12cd912a8738e1731dda849d2931e5680182baa676dbc23829f63d1e75f482c5dd04e487ea455ca9261ef35b290d59aef758745dff7f8d6b0d066d2c05aca0e824af7a992abcb0b7996306e85dc97808ff8ef9f6c6ee00f1a0103a71730a24bd4bc3fc7cff3f61bd745e5b1abbb0f7929652551fe09ba404aa33352fb2177aa91466ad26935cd0510de560b599586f7e10c3d1a745548cfdc38352a5dec6ac4b268b95c60de63da0266287adb30cb16d118fd12e69e15206fd720cd43bd9e845ad17b8bb0d3935d8508ebbe73836681d01d0fb68da681614439fe486d2d8ce05f0f7f5313e63edd4a1fe6cc7e1b076b3de7aabbe701b31f3137bc321f53f60a417b32b6aeeaeec6af093a2c3f3a85000002280000022400000220270318a8a8db5f98b5dfa7964096ae6fd2d1ea50584be7ed3f2f95365bb480bb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b5d53f253e4d00a6956504841e4569860febad3585908870c796585b07f3aef000173478c3950fde55aa6fd85371381d12e4b2f984a47e9f3d6bcec7972f225cb7a2facbe2b2b9e2b863d179bb88b16ad7450f717066c49c8ea5384588ff040047c90f40ace0ec7316f8bc372616bec2cf3632ade3b9910981593532cf5dac15ad8c1393f766d4107c152a8683393e26584d19aa513229c13418423620e305e17b368b3fc9bfd5c0479da665269283d8001677a7ea7090d32be0d8dffea9f5aa016bea97f37e7b25d132b673b346d1a3347c71356efe5470140781059d81ae38ce2c46610f554f61d5f3916bcab18d25f8380be33c0badf90ac8a0509ab8768c6a151f7c101d242eb5f607aa7c6ae1187d23b81c39f18a86a8bf3516e2b5164f3bff8288f4239787ce3d346277823630d81ee0f1532d9cac615811fc4a04351d0e5b318135afeb4050962e9f2c360ac117532e7e86dc82cbf9dd74ae450cf39e874f9b5fac843f6de3796d501c6cdd89c2a2a87416dbb8609831769480df627895e942e2e94a1fd86309e930c53a039c60c36bfb78be8f2b7886911a456b0fb7b26dd9f6200a2e2ad4ba59b768e1f4189b6dfd601a156ceb5f91d71760cf23b000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022ccd5e635ae4253489c2d81ebc36b7e9886b09a77c00e30f3e94a2bd63e7d738299e5c2b36d30f0072772fe2a4802883936e2fbdbb8ac143bd6cfbdda1c92c77022dcdb73c6b1716615d6e6b094beab545b27b1fa5f0864c8e358e7ccb3f9d20f41a39066e7168c54371a19fdf68952e8c0014e55a0cba0ac2f33852dcb429460c00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d6a557c859bfcc78e7dc47fde281731dcdf8ad36a06be24910b7be05c0977717180142c935265bc70917ded48d2763b8a2634d2976e915dc72d95eb0e44f59b09e2bdd348e5f60ecec2ae4b259ddb31ca4f1eee65cb6b62ed5b8f5b44ddceb1e73e797636ded11d2b02f5b9eba40b2a944517b2eac5dc72fa2927ec0f50c2c99fe802b5bd89a72a5a3b81d6ec1cabfe292d930a879c4149332d0e84fd7f1cb24c052e216b4a828611cf1259da111afa2795f7f9e1ce8d02727c5f8cfe07b134d827a56cc9d95259fbd9c568f50d3d5246299ae2b728f761e0f2dd5236ea3db26b615554de1064cfa5c3f262291d1b35918489420cca0729e6c88df58b76058f033b30044f0e8fb1f24b0c95e0027f6e9cbdf9c6c5a850c00081fcb6c87ed154a1f9ba1a7c6b50533d7aed9d477c8afb23637361cd2ccf6a888765b914f143c7b70635debabbd53c028d9e3c02cc3d297c375f2bbca68e347e3f26be66c7a0ffb57a03452a841f6c967f4d1b6e6f9b26c2192124cd5d735db200f9e15f2d4d514cb345e252371f66098c311fb802df40c07735ea6d3a3a8b22597447df919df92af8c8e31c0a6ffcf46c2759640559bb01aae32703d3c8c931d527ce7d84bcf400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f46aacdde2a8ab630f72f0e4f6f4fb37869a5f6cbbd2b052c71e2bde7c92b96122f64ef034f5ac6d7bddce292a4d0ca3665172ce39b5d27d9dd918b7b8aa1e451f12fa8dbd8829b85c03264299163aa1e82e008b98498ff68b8c3cdac50a8460d7364f13c5d247e8b2046faa7cc6d4140598e91789d2d83021327e7ffb602c3dbb52c966f35ee6036ec6d5eba398bb73cfcf7b14bdcd8c192a1d1b4c007e879cef9c2e5f0dc9880c63e704a331cb97e7062d8c1616d5b8bbf04e0916f2ede33eadfe9ee4c5c7d40fd45fc77aec172e3e30494319d60d4bde0ceef448f066eb373b718c1c98683fa44d058a66cc5375e6cf055f001dde8078a7545a767e65fdbd5353bf17abe5a004a7e7ca9ee1551ea444cebd95cb871ca2848cc72eabfb45776e05227791f5d2b5b75a2dfd21318bcbb568a7eaab9c487bce0ad3768f2812bd4d6e324451ceac70c643b47df0a3c4d182d26d6db7538b6603281d926d5b11ae61e352c99984707c4776190e6c2732255888db684df80bbfcdfd58921c1f09dab7e12584747a1d42681e6e87dd28be1eb6cb6057c04b70b0a05368fb7daa9a710ed84d9891a96db7dfa2fa2c59a0fcbb2e3e953c92a3a5d1b2ebf15e049cb770000022800000224000002202af5a305872e7da228be5ba58daf0e55196757190cb76d593d648c96a823cbe300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000206de009c5bbff2f8a84e4bf3df2219ad09aacd394790a3986f18345a537ba4a27d457f1e29a799690dfb85d0cee6c2bfe243630a99b62e6ebf96924870011306aa120b413664122d28643b8db8ff80f48c51c239de5632f629a90098dd6790bd49a2053d8654bb40b1e452a47d38e4eca3a68ef6e60124ac40341b5569418d1d214275d4ad12732cd579c34b270859ef98eb101d0e77d5ac260880e3146044c2c74a6228abdcf0bcf81ea6425b34d3fc967f3b11f37be7e4d87d18a882aa16954f22ac4ee9ab708a19e882c1eb382dde62c858cca9b34492823888a94af9d2698c4988ebcc8d7b4de7e21c81a204ca35da9498c54a7718909ae6b9191406b6878205861a26b79090ee291805c3f9315d1e0172fe06556e42000093f537d71d9e6063664dfb899678796e6e72cf648bf8662db7b23d325d601e0cf0fb49793d6ecfb38cc2ac527c5d04200faaddae3a19255faeeba408be4edea9e6b71dd37fb148f6407ca9cae0ad4f04f4df59430d214f8babf68ba04ffb95cb731bbee42b188a54453cd60a89966e949be047688375002d619098c6d05ac8e35382706d192d5a9acb429caddd5aae2410ff84385455c0932df04996348b6c5401e0cfd851b0000000400000000", - "2c335e1066cc91e2e1b59e0d212e7b0a2097c808e9ce1f19aadb4f9b5b23af5d0000000b000000000000000000000000000000000000000000000000000000000000002400e093fc291f1578643b6261da66be1432aa6ab32b78c699ca99f38f4ef164f800089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000b00f1a6bccb2a9fe4b613529842c74a3c5352087924f5687fd497e4c250fb0f6c5000030001e1afe041ee86a8b9bcb2f7f1b46ec877b879675cf690bd610921a42bd7c2956000030800825bed0f04513688a20a73113b41d525a804966b3e35ccf0894be7867dd9f59000030800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000070dbda3c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad376dc0149c938e85d129a71522085a0b25ed7647ba15b9a58658ed37e53e63b9c0fefa0000000b0000002400000000000000000000000000000000000000000000000000000000000bec1d400120dd610c9a8e127aced0676f587ff72049b093a68b85d8f1578ad081e647ff690200dbb5bd0fe8b409bf802c286059081015d221cc265fcc8dd68b13b29369d3792295243affd9724c60f75a2f48cbf276cf99b4c17848ea53b101869e6733656d000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab4140587a5fd628ef3913b58fb1e3927ce688d0e64c119a4d8f74a3bebaaa94e7e8c462fae94e35b51ef20d4885fbca89f77b7fb2d6a3c379393670f1274ecd646053e240b3a969697ff21b8b9869c41051b13674a547bb4caed5e755a099063a6febadcf99bb92a278e5429472ee927d41ae5a9fd78fa1080fbe6857836d6b7c9a5592875ffcb9cd284c99c2a740e89aab682704d6fccd6650811a2d6acbf9bcb85a6231472eab5e871e4d1fcf53db26d67a5dd08f3ec200c294388b82ff2814b922f26d1afd50f499e8d50c19cff5189c1bb3b5664c86b21de29e9f3024c162d7dde1853b7afffd0360892af01e780f53d4fde66ca52aab2d0bb53488da05d5f95a62ac8fcf858e5c97a76fafd973e1ca11cd8ad735536971a548163a1d0310b0d70f08010b8c7e84627548c44a1fc02a521468ed207b5bbef38625c6a6c68da7e71a99ca9832387d71c5dcdadb91a47ae7b38ee15a9e4f4c01f76abb45c3278a633a717ad383d37eb20944c35dfc5dcc75869aac98542df5eea2b1760e3c8cf0dcdfed34618073639a5069a61c9b81e26ca74e1e30893fc781336479e6942b27ce535f2645d660f965f05d53f02deba6237fa01e4d9abef29a6ae62e67e00000022800000224000002202d3071c7548e2b8c4d96be385b7311b073575782faeb1a81bb820ec1b5d7652600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab3b931206dfbd2608b44543c300836bbc6fd17b8150e51305df8a295661d521eb3fef065bf2a1028b0527176d3bcca20636ec713ad1b9de5edb44077bb69872fdbc86bbf5b9717503ff2617c74bcf39eb1fbe281f03de8dc3ac8555842b0eef2079ef166266f24578824fccc703d966b9e30c1e296a37c0a42747b116607fd56fe4d2f866389eeffa89a7cdcf8a2b920ad6b19cd0cd7de507c15f4491b2e4953ea5d445630c66a46808b3aa9bad29035a167741d91c36f5565f9bff561a7331e22b45144e0d79a040e904f507f542bf7f8b94e425a8b39a76984bb17bfba149fe6fc3b9ac6e7a27178ed28ec13a3abaa660d5e8d549e8e3e1ab7621c7f0806a188e80e375fdcbd073914ab0b33a20251dd8900c845588fed669c869717e4feba7915e319b27c74a0c17065122bb8415b23ae6752fe1c6f5718561b456718031b6b831031edb3650ede36733ea17170f13a40b4b3b8c4116664afe7e1c678083da840508287ada00d26e7151cd60189e486074ef32e7c73afe482d45c444615588b2b766d5769fd9a7efe46fd2a965e44e4f25a0ee0d761a814ee299c5c185626eebffc8707808708ddcdd36ee53616281c0d1e158b3eb29705c235e149c1b86000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00214230464fd2d79b20781c54f3e8c96027b1d505a95f42e8ae040315952b6c40c1ca8c447183a00b1bdf5fd215c6a50c9c380461a1962352aa0d85436019996cc0201712fc48739a6de1457e26f6fc824fdd52ae9cf454280b129577bfd6269ceac238e148060d74ba03c99a291558142eb2c6fa6eccfde83c74a1e3281470c95be00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a5a457c8dbef49a182651ed795258b090b0237d836788f1ca51a09934c9b6574049672f329dd701c9ff6dd115d9aa8b690216d5fb2a23809a3361c34e70434ca7ffb53e2c16f6c90fcbc735da3fbe9c6bee1e236788bb9805932a3939682f60c3cd5ba482dc835942e91ae789978882d684f17dd036e593fa62dae90e810b8aae0aa9115fe665991cd2eb8a0c7b525bff97f5a8e8384ef587808cef4f00455e94732a52cf25cabecbd614541a370f8c6f5371af1a08b943d074b327e6c49fafdf492b496e7f91aa46b95b5ca5b4aecb63dce517f1f6c75f7b3922ce6ca8b50e1f627b161725d0ac10c1797816060f7f35b0cedc6b8d877dbdbb56054d513e96b91548326038fe084061907d6179e4596bd81f30c2d3813bc0793f4592118d672b3c924e74b961b6d206b226fb1a679ea16a1cd956890a0cfd956e8eb926494fa9b117bc22a4ecc46af77965d77f7a62faea6dad7c3c1f2726e31b13a2240cfafa3e4b0c90ce4766cac363a2cba4a8536c5bbfe049cf134c7dd685c1ed277e0eba42914c157529784205622b5a6b26491103ca4c19c9f5d0dc84f4330523d80b923f50e296d2c6e298f5c1c9ccc12e3ff680250b22fd35d5a4b6b708996efe4500000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d44c85ace9a53b4068318e9fbccb936a3bd201dbbb04d8051fb569b61c93889d26f65830a24591ecccb9308bac5338c556ce1272e388aa34f631cdbc071e4952b8b140e39396a5e1a9354a271708c20aad4d40a971f8d648ae08bb326b470a5f78db71f7e3c7fa63e72bc50bab5ee6bf3e3978a67a3a9995803d90d02c09e1965e9e760b73be0442a018a530c94ae71faeb9603372d0d3a084cec942f5c86fe99162d6f2ecd3948c8510719bb2e9ebe3c59d9f346d9d840deabb8b29903518327b115a375885a4865bd34909652c5fca0f8604194412699a0082b103a23f41fb44e1f7bf47214c32870043c78b432dc5ff8ba6949fb73b2d47567b56790c8d5260aca9fa38451afffa1474fb556f135d65ad1d0cc638d46053d0b8e84353052f81e94ca40b485392e793fb8978396dfcbe91f4131ee96fd8d4ac47abfdd8fdb923892f916e8faa2a5f14f318371c8722e8946bba3e02ad3ada9f2daa54a8e7921c60f20ba4a7b1df445c1fc83f4d0d5fc0a480ac88c289b9217a10ae0dcf8bbb06d9fc65890078fa92de7811eb6056d8f0fb4d4cc8d046ac01230fc4133bd338cbf14bd0290b701c8f85dd9e7484d216cfeb0a9a4d1fb30de1442a46e20207b0000022800000224000002200d0dac8c26f532099fb0dc642cf418f1553857fb615bb71c16951f1a3385584200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000244a9ae3afb411079ece6eef0663da67b6f23b928b5d6c30ac8afa44527d9baa04eda1465b3f340ea668fbc12223af6ec507c789e075a3f893ce258715534ba2ebf95c4423f4ee9c5eb9c5fb3eb9112b25f6177c1e3dcb2de4e279ecfb41eb91f073d67b719e7469c2d2f10db85db3aebc29a85e98ac53f5f9cc59459fd89ade47d16e621ef6bb9ffdf4859feae51914bc1ddcb88d65573f0b61ef9fd263add8a47b38ea13f1fd273090d2b54e45047fdd681fccccd7ccc625454b4ea9e802d9adc07bc3a0f52651e42a56425bbf8bfba0fd907899b1809988739d3c7d914b9d17b30c0786490d12e31002e41bfc204b388c9ec93bd0aa52f696a6177ec434766cd3e42501828effcfdf8a963c7ad921960157cfc8f05935523700d05b95a42f72ed0d3a206b83df98c039ee45c09ae3eaff3106583ee32f44fe58acda7404eb2f8d3dfa35d6807a9da33141feb787b0373dd16e4b646e2bde07f567fb471532d099352d85ae4e86a9f3d84e582500795b6062bcfcdd48150859a26da2b35ec7b7feb7a1490bf933e397525c49c2eba94d4e6c386aec3ca7140a8c89bf7930fe19bad97e4a2feda5f4914e44f41a991695cd6c94d71062d8c39685baa19179c8000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001054566d5d55cb8bf3661e1eb015e64c42b75cac7abd671852684d39133d2415c020224c1ee5a0d43ddafed910bd2e6d4f8cfc30620116d42eb80de9a5e6b0cd6f42da67921c2f41550aca20b48a7ee7500541203dfb555c871ea640b152f4d5bb60000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a5d68228e774398c194b5bf9174dc87c8b761efb1b0f66ee672d6c3153caf9566359164fc169201a2dc96adca8d12b613b7c9317c867e391e3bf8696110489980034c934515f8e55b7316b387805c834a05c1aa6f2a424b2988de529ffcf198d1ad993688fea6bcfe2ac4df4ccdcb0ea3e36d244c9f83350fb09cb78428f77e8a49cf00ca4239b7fdd259b185fc3a1d2fe549fc3eacacfc2e19bd4345edd7c3c379b80bda0ad10b096b68c713152277b06f2490236c74f5d247676652c54fdddd0fd8ea7a4a206c14003773dfa1864bfda7384b04288790f21e23673986f04a2fba8c921cbeb5ebca3ecf1c967dfa7a2acc6090890a7785e9f791411c3557f8270f2128b6c7aeec536e17259f1c031438a585ec660324dd5e085d3358039caf674b3665953f4d1a7dc9da9d167156c1a02edc45e93406cab53a264b6aba3467aec5153df41c99c5918347913eb367c8999d5700475b9328b557d7f5074158e824355df80318c2b12ce36a231d3ce908575841642ebeac656aeb48d7e7612c8c3e0ef0294d3b04d83ca6c1aa082de9172e9b97c52b4ed52dd0c781710def21dd8d8e0c894fb5ff078b2b68d5a159d9e2cea7daf1fe3461a193faf228a4d5c4bf00000228000002240000022009f5b96fb1631a811487a72b43f407ad6723c44806f8d051e5ea624707736b38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002659e27854a1ed8ec83b1957d14e8ad6a8e0a0f48e38a9ff0d1ec67c242a247fc78a39a583a81edb37f3819cc647b315dec3b5468e5faccb0cdf5cc6005c15d59278af5be985d12784326d124057b123b45c92f2a1c625e3051c5e2bbe1310c606bdfa1540368833acca85cd6ce25b0fb97d42852bb4b0a1238bfe1686c1ef9bc44569008d4f4d904593400dea3cc46f4daa86dda24d0e90c6a9d3d7dce4273096e6698e173a931ef43069c82c960898f86bbe8400f5ff05028f3c18005e0b51837d63be5c8b4aada0e34fe3544b4b3cd947414f82ebde91d47a920b44952798dac3994776d3f02440885f4eb2cbf41fbd5f853ba99df16456228ded7b04c40b8fcd0e246727abd75fec4ea66744886b75a2deb604ccd3a7f3e9d724d6f58c2ca6f2ad1a3e9b5a2073ca9aed48e9a11c8f7e543c85ad0f4d283dfbea46d9a9d6b2a56c9b4789ca32fec9cbc264c1e5b604d00b8e544af716fe14e1e6e8f79ebbf7ec71053914818d06e10254dd25e678220e06ba56f79e1cb12305f770cff11d71e74db6cdd39356af149c28c18e313ac7084c92a62ea34fa782bf8429bbeee98fbbc0aaf3e514db0b59617420a03695e95c5fd208b6dc5f32d42009171b4f8e000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012ad2f95ae334d974c3e48562869115dd3fac821ed16fdd27b13ea18bfe9c052d0202ad50cde7fa284fab705ee5d75597e04e61a92b33c0bb5c13f4a52b37f8fbba2ba5e5cda399cbc13a69b423e7021a2e629145f8951bd065c4dc4a53226ac2c20000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009344f351432097c5ec16e4674be6cd65adc81715c84d064a7ad3bdb418bfcff8afb3881be0c3018ae9ac4e923f37c20aa6db3b7aa387d14c731c576260c24213adaebfcc3d83763026697101092bab5aae350ff30ae862a338b6845236a04774ed450235d8150517d1bc50dd31b8a08214522b68ab3aba5ae242fa0f955b3f8d75c5fda95db37fc12f8e1a5eb6a8751f9a84553f433e312da79a04e58929a3874a4dde9e39fd381b22406fac1342c50a99b9d4894bc1361e187446899b5a8defbda8ea6d58c170470c0bb53e5768de56cf6b32b0bf8a644f65bc6b80f268c590b7e00197cb28f5be0b9f5fc4280a0bc0d9986623bc9f6cea004eb25e69591a2f88dbc9b20f49aa9412bc6731b2ccfe365bbd4ac7abf38d72185fec6bb1a8959b4ea4d70b392be728ef8c3c2bc64359ad273efe0ab85343d6d69a78d0aaadf0922dea767fa3a0ba0b177ff0ecd24c43dd420538adebdc03b9125a305e82e1feecdff0d8ebcdad1a928bbc240d08a6a335dbcf4711c03975ee7bf5f8deebbfd1d8f9d272617b614e6e1589cd290d822c40964461d433a3b285055721af8f7cdd3b432661e20eed65bf22677db5e99c059d53bdc185e9b76d5529c6d09f75bb42bd00000228000002240000022014139ff2ac212eaf9e9da7b425457882e3a836023467b3f13f807558a1715ab1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9b34f21e3d126e3cafbbb80687fa01912f349d37510209b43fa2fd8684452a1227d4ffeae9eb4f537e29ebc3282c19d055b8c5ddc709adfdaa3a2f8264ea131b1275e7d83251d1c27f48ff09708a03d7f1b173cd47f329c8281010d269d69ab4c06c3c2d73543b95775ab9ea74eec89dc236040f0fc30628e9d108a6c28e443f8172bb035f004b9dc2c6466eb4b16f30d5fe2428b411a03ce8b40472ca1b29cb562afedb57c078834b506851ef2d38106ac8a52b140f2751420d0fc4081f56fa2afc7ce62bb9baa4b55e2238de46e39ab75ed7cb93dcac16a1c60977b315dba21cdbccb55265052d7918b7ef5663a5436d125b996e8f8f816200fe0a059ce7eca6c8b5d2c370e4a379fb0b382edccaeae897b4a2c30d14ab501d572e40bb4dd97d3b5efb2dcd59cba1bca4bb35db7672834ec1d1e35be1b0b0cd7daf53b69c5b88a5212c2e2788adada0c80e17dc533c948a465db9aeed7d70f6607a12df4f8287fe3842a713632bca3c6c77a4d9bae2c17ab738b518c706192acdcec576c0314811fd16a02a96e9ff94dd7f9c15cf5895d280f9bf25523cc6c4807ac66390896a538c909f70d738e00cc0a098fa6a7b23d6ea6d6ecc10e997bd0e806adfa4000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020e382d41d95d2a3e557ef338106d4b5d10b1685cf4f53b59a5a6beb9e7619d471c84bb1e6fa99b7c915659c399f3f3710d638bf9304e08bf62dac1537cf847cc0202df153cb491bbd723a0dbe7b567de0d83ee5c220e70cdcddbb689993f27e8120eb61968468e540d9c6c78dfe783528938cfe44b7e9f53f95cdbfed30447358100000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083d7b5aa9afc3818d631a67742d5feff692d90f9dd3346470c84a2ad1e0ec8a2a557c69c0b8ff7e4bb6e28b898943410d6fa2bc3555e3b26929ad72de0ef93e48544dcb5421e820b9049452524e1b7a1e137b5335261c1d3dc5158d59b7eb123993a7104406cdb62303514be46e80f0cad1a004a47909914cb57c31c82c690c280480bf5a2fcd76b9b288c6c858e4a85b4b93698e1201aa0367fa1ceb15ab21334696697450148a01241a62f892f93a0d31f9f3e4fb3c31f4f378bc183f5c09ff0a0e3549d73a5935fe8cafbbc904c6cee4f1eb520736769a18c0f7a863b5ebc7104e69f2cfa885926d8eb326c298ee7d01a1f47dfb10fe33a59825a868afd392a3e8b9bb24537be4931c7e2999836e0f1fed1e8cfc045240e8165d61ac27d24bb58733a48d6f41c8832ea7c1b756bbd3896a76fbf974d3406d067265b8481eec34138d484eb139ba68529f224680024ecb771a224869de521779de9863741c449b9de78d6d400fab74753f75f3d6aec03d13daad815904d1bd4360b811d3ac978f1223ee18a8c4c5dd0d9327c555813ec7900583151a94aaed23467d87eec6f4af38253eeef987b4059c5ed9a245c43a476578779b8097c6f39664bd80ba2d50000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000acff15c0623d72b152edd01a1e7dd02951a192bbc22909bea0c2bd1e97e12243b259d27071d4529c6078913930b421c46c8e7e3f5eab61e036b566d7545f0a7c9992967ba3cc122d0544788e12b63cd6d3363e4240a8b884a2a2f939bcba6e352367e23334fd3b942432cdc84d396563e96b44e2d026de4afffc8734cbc613ea0970c812fd61d0dc9bf96ead1dc56b36671bf79001e71135defe11d404d9a7195f86210c924d118b0099d1ba394e31e19265e3c95e77965f28271929dc01bd5914c5fd5368e5533bc10045ba7ba271fd9587b7a8b58436ba51ce7031a22a5a61b7252ba7508cafa81e5271bbc34fbf1c9771bd5232f31ba307490b2094f53d255f4bdc350fc99bf48f14d7c9075bdce7b70349d65138b3870ff7ddcb85284dceff8bd3c0d21cda96a306f92ae6066e8eda008003ffdbb0bcfddf28fcf92cd3193ea8cf88e11f30f3eaf677ff7e15037555f228ddf2383814a44e94dec06809b2e2347405dbdb5ce34c0bd9cdcbdf1b13254df6086017ddf8779a7484a7f3f6dcd87b473bd0d0a2b2a7b1420752d6ebefa56f364071788a4d313ede0afc8afea767ac1865fe91a4cb274465622e961c57dd33aac4ef0b65f1d53f22eafb8abd9200000228000002240000022028d979c83629fa92e61de1c27d01abbfafd7efaea6d6894b16cf36ae891859070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088e304a12c1ec0d13105909f4f7889e61d4a97f99b994c406487868d59b6eb2bcb3439408912bb6621156ac303a460070b2ad2fa9b3c18734052aae3eb236bd6af8d251815d969d137c39b82522bdcd6b9cbb1ceb6d92d7de0a4bea6bb6289d150af16c75c2ada0f5df4fc21595d45e9fcf91e66b190300c97debf3a199973a2fd724b129bad009635b8f4b97d64fec4f10d4f4883e8f8269533d3ac45a14a6d243c7ab6ececeab6c3b348b1b32c116b937e648089a11fb92e963f61ac0eb6c256c023295a8f09bb2823f9e59503f8c58838abdb835525c12e0d298ccb17767b94f0021231033619eb9c5deb2eac59d05471b476e6359207e9801c6c9447d61974217f84fdc028f4409f36084ac2e0316f37e33c3e650fe5196186dbefe723438c5c685c60a2febbf3bd1589b3968c8a9e1d71d2cac80eabce6709aeb8a231786e7bbd5863eebe8c8b2cffa4cadbc620a8cd84b412fa01a57babbb335b3d347b64405e8dd8ba592f736c51989c9454f1ad88e9f7d5f3bdd03dc04e835a612520ecdb5469fac27863af325b96024541fea1cce038da1b1ba0899bbaa0b48ea62770dd46891f075f224228de4b6b3d9a3917e256824f3e1ffcd7f2e9aff522c18b000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0021b9454ddac41a2511b51b947ab485cb23b8ea7b763449c96fc874cb3b570a4562967073e429ac92a703a2f0b1187ee4a131592105f619769312e0a198917cd3e0203e18402990a620139cbad3ed246026fdbce0bbafd71fb85a6b00c6fa2788266183a358438435be8bae71daee023ded280584df8aa35bd6f27392da74e592a6500000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009bd3f0fbc0ff20e5a340c6df98f499276d7dcae822496f770472bdfccc9c0dd11a035987c2dced5343700425cb4878d0ec6c9852fcc81719c385056a916a84741540b6e7cf9d07cc40ae12537d033538484e51fd14f2c161a9f9553336631c7a7a0baf68f0b25f83e3b8ff6e9a6eab7c1bba2ada016d9f0c20d6021174f07f9b0592fa992c99205c63d040e0b7176009b118d3f6ae19d24935d0d39f4d065350a05bdb8a98ff4e77940d08f86cdd8f2632fd3fe97270def727e8da16d8569107b3def18d457050389d7fc0e84e807d8dcc6d4cd478956579e159da2082d28109d6bec4273108c59d5830a22b93527176ebc7612362812d3e8a6971536ceca5c557eeb510b81e80d9ec2a643cfa96c7ed2fff9b0e1289d0a8ca20453a1836db5d238a36e266efe081134003fe0df0a684755bbc33de496014bbb1e2e70f7438a9b6596e81c6d89340949e4d5509f9e79b6e698ac92f211d6afe4493ef0874e8d7596d9018d8cbeb10344e60cb641d85578a690e7ed42794e72b2b9b7415cf35b111730a2ce4afda270cdb2a237c07a84a81c5c1e2862e2c82eecfa9c1a769d5886faf50d436bdc9314c4761609493f65adb8b31e83346744f963ff3803e1223eb00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a5a94702b9fd137995992f59492b4f4f6bf6c52cce9a39926cfa4a7ef966a63d8d487a225b9fc03ef1fba6add0bea0c3f988b724a5192ccb9e75ac83f2f6daf99ea595e6b86c809a35d8918e7dbe30fce4a22c5593130f0199b1f9ab38d06c1fc197924076ce7e9b03c05b418e8da59cdd3b61656bc8e95c6a16dc53ab88ce52da91474908f25ab9d8ac83d585d886dbeba8adaa6174ccc2f3852f726e8c46f2adcd9d36661ebb90a59bfaba6334926b4705a127a234701496767c0e94f1d132caf49a58b74c533e4a8d4e870ff41e29b5a9fb1580c331c8a127383c87f292b593698a611b1cfdb594afc47818a0efddf039871179d2efdb242fbe225aaf7ff3bb8324939b5a692fce2996a0aaccd863fdb7f825cec21e36584f2d487afa6f8c057d4fbdbef103d3188bf55a60a3c66f56e33fe9fd37927b194b404a1fefe8a66a22e991bb02b46897a945ac39d7489780367fefeb906ee5a18150944c29fdca0ded494313597d81723bb74d0a7919ac5ba942c8e620fc138fea365c8b13e38e3811592f8c87e821c28f6a8498795cd38fbb7fa033c0c17bcf08c8ac2440a90943d70c6cf67b41b1ba6b9cb38f0a805a8deefaced562605275efe261c7c35b30000022800000224000002202ebff58589500c87b324637a56ef0e171bda0b8143f47cd57abfa3d5059182a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000820e4954116cfa4609d43d4e8c609b7993d1c3e89e667b440ee74b2d1ecb219d73dd51809ba9641168aff642dfbdd4b715c6d04bd4737f1d138bd4d0692d8a35cea56e8747655876c54e753f103a6af23af61389ed417a144586b22b1c19212773c5c72935a696b89d1e0a6ecd8b37a0bf14cd9891e8054f676621068c2fd88f20c44cb3781a5ecbdd3439a74b42c59df6db04a76e3a126f6f34f17bd41b062d698c00af87d173dfe1f219aa7288210222eb105cfd428ebee00d926babe40b9270585ee39578d5dfaa2300eda07323e84a449823de08aa923204447ea9365f95081c42027379738e09318925d52180c827f1a0ef2942bcf67003360a1a2ece868d89c77cdef8e04773a241480649f4ab72962341b40001725705a8ad856f963c04032d5872d95c3eaa5f9d19891113e7e32442e18a21983e5408ba53a79a01dc2e57299fc62ba2e0f9e52df2c591c1e05367fdddc2426d73007b9957ba732f5b52461be4a34b4d0e5f8b33b996aa1c6cc9a52b4ff788e411d103cabd35cd1f27a4dfda6902d58c1c9f35d1bdda0ad4628ed8ce1f58f05e45382d35d2051a105ab72b648ed04b89d6c3c6607944cc0bee032555f6bea0b5c1678ae75519ab5b3b000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002139ed9e0638339df686a314ce6e2d5d4784f19bfa1af0168e465699763e53a35206d300828bc5a1396e4130d82ca1f25e90453e4fafb656bae39a128e2ddf8e802060c6f5a6b58faa60f42773cbf9a5c351d3e573f315b13a1f0e502d4deeff0961200dd779eb252bdba6b283a762a9b1c1e8b99cd163d494b68a2c60849a9598100000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d5c6442b5f75cac2af550ec3d0be53e98ed15aefabfb3395d0bcedfde5d1cd54a92e9a1d273ee9ba0195123b37d5f2f68dc0a302a9a9939e482f43d0b0d0dc8026b86d93fe68932c24fcd6a830877fdfddb15752889e087787e354e22e01cfe0513a9f497db2d6773a193b4201f6a001226b9f79ad45e21b35f5cb924d535dd9b8da63d41a74be50a09cff1e75afbb7df085ea5a75fc597a48fa31fd1736dd59df8bf2146e9f9b602206a48cbeb5a503f536559739fc4c2c099b74f9a861dc022f78654ffe7fa85f5d8e383f9957953b8191bdbd7939b0cb291998706529d36b9c908b00d1632e3af530968b13be82b9a4da23843cee1aa11adc4ffcbba5b96f1d71afbdfb38fd9b5288ed5ba4b00bc046165d78823450a86609e314a90ab59d120619f4bd952e739f5947124940deeb3a708176b29b1533467fc1b11453f9703f2b3dcd85ea1223212b843e594a27f58e853555ed03e7dfce804cd79fe9ced60124bb1919fd9671ffda3965e1b58c3303f25990f748bbad89261a8353c314b8486b07278e870336362da07dc2cf9e68df123eeb36b1a571dfaf28d7d262d2b770dfae043466eba276eebd7aa17924fd4a07eddd69201b1144369d563f873a700000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c400ad551afcc81ae462eabfdf1836e80cda379e9d254aea9c0c4f349dc894ad0059be696855bcb1c14e67e566d88842c3e12ba2e163820af505b20aab9c673640fe213458adb44495c3d8ba04c6b68b62c7425fb5ca1a0aacb41b3aa53733b1f9edb54d98c54d2fd25eb456ed0cc9c38bec9c83dfb93bb4a17fee21f05f496623e3b0bc327e609a06412e894254f75ccf73456f041810c35fe58af28a5d82e7e0c2060e546a935f419b308390524d1d363a5e28570dfd70ad1e750e274c66495e04ecb572d474baa3ee3ea3455e540ef9f307ff2934844d71b9b6a21d28be1d252751edf5f24886bce10b92c1215651ade88830c7c72362bb038786b6f4bdc8befa230093feebbb954502e1adcef9aedd9b775926114e7839035a762c1940432cad2665458dd591f3b40ef7e7c156fe78463af2b110bfa76d66ccb055313bb28d94814bfaa5ff35df820958be637361e9fc251d1e1a8f171fc9fffb2614e193273e4e8dcb42c8f32efd4f293fc7e9a9b06b8979d3b8e41b6c1826c3fbf3302f05ebc99e7a370c0e6b79c3101eb92e0c76efec54c712579fc1992c21cdbee818a18bc83e9d46f7bd927231f175883f1fd907c2fb1af6c1a9820cd60fc33ef5300000228000002240000022002a8fcacea4fa066791b608997cdb7d6307836c4fb56fa3c25365c8eabdf3d20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a515d1799221098f104d010c1cf022461d32c812b7e727106d1ea5e3337a8a7e1056bc33492fd8ca650928144264a2f646f86fd75b14182104421db82c7f683e6e530319f55c728b73633d80bf62ed039c2084ef0b090c514f5c92209c076613164f85ca84c54f6ba7d39a5f260a005affc54384aeaf80b38d6d45aa8938ee0105adec4668364c8860b9920014b2671866f6f94512a0bf021751bce546d26fb07bb94038af869e1b395fcb47d6bc65b5fd3acee9e7b9781ddfcc9d7b331b90e2a6474cc7d48d35e4ca20f6135f5ade626f48281e64e095408ea4f8447363ed469e8b675cdb11e8b1e1b69cd9e99a173879a13a41a7d695c546a4fd60ca696a5022a598c8ac97564acb36cdea06c5c91672c96389cd540557202f8fca31c53f9b1a8d8267e42a2ae7617b641cce5b314479c7c2cca391ac556ff02855c005e114b3acbd99a12c0598d1f45959b2218ffcc4893bcf927496352df151d4516194eb08adad6f5252d896349927ad7cdb892436977ee43ba8973a1fe004664ccb11a623b82776964d3857c7effdd218a406b99e9cf35079778f1c5273653a8692049fb225ce93ac99cfcf2139057b56054254dc4a5e49bcd271854b02badc5b12367000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020c4bd621db878ee7dabf725db4515c15709284961395ab0c690d30f41fb14add1eacd2f766f27be2d6f7dfbc50ef0bb51f27281ffeeee4613370d83a61b1c8d702070d85be8113678e5724f85bd426e0fe65b41fb728aa09503358777cc6d7de0e1148b002bdf96172bc015af502dd35a3891d4ba6032ac8f4167d435c95b92ab500000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000259f9af1cee0cc67c9a613123e7edd35f9fdfc4e81b440cdb0e8bc404d96bef6efd93ab7349cb380d553c3afaac6090f1ac88508b1d1877035e238b5ee8cce37faacb424a079f6c3cc3ff02d4e19a7bd811175f3b768fc6da52f83d642ff3720b0df4530d789db861a769f136b06aefd36fcb08d11347a23d413011a0187d2dc0bfb508bdef1454fbacbdb54f5969e456c6551ddb583be05383fd87975e774491993ba7ae2108f2d4ae3b8c1480b6d16e5a319fae80919f33a5da6243ea418951d1ecad91207bb39eb3bc8f12accb680c5f800b519b7e06c4fa3fe11537efb3bf1415f5dca70f6fdafb881f74d3bf6aa985396a76eb559895e946163def89a5441724aa38b26ccc7f6a5cd8ec570d6270376ed5244a12bfede46f0bfa884dfb64f2da144bc6f50299df028a0d5112646f8a11882197e48edc5ecb62478302a1d5ac3b8e7e3cc4f3bffce581d99c21a957d2b6dfd6b5e6374ba32226c52ad7fa64a910ef72326aba359fc5998b0c84af1c6a982ad32200a9539dec8bf1915885a04120722759e85a53a46563f6137f218926de9572fd1a989e48fee1c1d09bd5fb640cdd9cab84fc8bfca457b3d692f23f63739cf0ddf739c955dc07428ca40b8000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001625e045d38236af59b7e52ec03fa83f37eac9b852360d93a5b11fe8df416290af9d8f34a1489145b2daa8d05ae4dd9bc93d852e8ba1c6a3b6d99414cc01b02c3bef7730631543d53cce69f0c63518cce230a4cda939b9a090ac998e6d568c55db0c991d81e05bbe62376b4d780e3ac1948be57b19d2e24cb30121db012ff7f170f8825c7d6e0d877c91d027c4ac2961ba52aa5b909dbed2ce8ba6596af70e6e444325fd3016562e7cb1cf1d9c68ca17490dc9d34ba3e3db4820111daafca0edd1e9726cfd23716c819830b52ee8d2857e2fcc4c23dfad368bc88ba0750ba45e45fe3f08f2bead2dfb1562e2093763f2bcc5e88d5eefe51680a9f1a12fb65422ad1925ae2ab4a4837485d6fe659c58c028a2566dc9b4b62858ccd7f420e562f1a3273ea28e37ae4d7c09f569d16779514f8dc22f532b79c0b9ce060377616840004e9576fad2a51f4c36c2b30abb1c0c6f221f65041d69f76c0289a3562837db35376438f21aecc402a81eaf13e87bac0fd084f00db54401e818a307ef9527476af7e806b93d7c86f061cabbf593a6b3b2c6c8d5ba637c212028626a396367782d41ef6b81d2a865f2a4f34db2e651daebd97bfc0562142247beefcaff524410000022800000224000002200605f3c06eed9c40c9d473f612604411cd4b24eae64633ffd364fd2e24cf2c0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f858c2d6901c0d25a216052616f566a81ef1a30bf58daffe8f77267665b24f8446f9ff70ffef96297d821ff41ef0cae69ce5c87653d97a703b787f9b99303458f935374c3c990570a841bce0142dbf9e7a1ef4b32035064d52ccf697123a879225f0a572103e213d2ac73f08fa8465ba35cccc9ff07e331bdd4bfdf37c2f480b3277e4912be7543143924b636d61eb047fb749b81afa71aed0fa9cd3d448c8017a6a5777e84b0594060bde5895fdb9ce097bacd62b8123566deb8217e8a285e1a8621ad4b68c5b2113b60ec14e9b2e63a0930af5f6c623445e56a3327fc7a4b4ed47c8f0636ccb9b743a1c1c1c7869cd96ea507e7fbe9094f455607ed5a46947c210f5e961905efeb4f563b46cc7d2d850a8e2a5aa5db651db3cd22707d432ce5a7b01db099c9de0933b135526a77cb947ba3108e505975c2f9d0b1fe12f7f363a396980e39c392f7285bbf9f1fecda43743c067a6a2e6be8fecc8c433c7560403f7b4e6d0e40f03e3bc27d2b8e629001b34cb8fa9a658d458eaa1a16775bdd06a7a17552cea7ed1a0d7a6f339b0d8728c208704be9680987fd5f1577094bf162e444a332ed7050b405ccc7af29676cdcae3e06c98b82716bb637dedd566275000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00202d178edf91ef9ecfea297d6eb29d9771148a42e949425dccfbcee98e07203b72f039f433936e9a0bc8cf59f9ec79bcaa08617159d1a2bf0799ce96a64cf9884020722bc284dc88002d2df99dfd05a8abf374b0d19d92dec15fd9262a451c6a0b309b2906f6c46cf74c5413481a6120ff5b72f66548478d6c33363ecbccab1794600000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000929d011df2c53f78d36c1d2109cf6e44ebdd8f676cc1da3ab0910393ddb8de4c170a70f071e481a587425392a26c8a08e9368581b6801f733ae909f7957b08d93c25b7dddb800445705403285f45d1ed7de21d56da4c58a7bfb1b821b69e13a84334c11141269088f08f57a22be2f1ea9070940edae49fbccda69fceece4877d80e909b9da1b734c6ee979bfe50e7b703bf594b03e9533ca9e085d2b989b7105010825ce916abba6ad259202d1431089955a938c28975d70cfb7b86892b15efccfd9cf563a67a81d5cd1853eb9482ebda160560814216bc9f482cbfc47a6d7db7e6d5efde41ba24a814e74c24c83a283b107e60b41f9274dc60df1d40cb50d22cdf77abdae9c42dcbc0924683b64a391a2af76a6abcfeabaf5ee06887bc2c2e8b354f3fa435abbfae0c80e6848ab2164fcb74c8ab05795643693ca98cefdf7087dddc3d079035ada72263edd137bbfde3e8f6c2390b1f19fcda4506591c8e645464c7a6f867a9b295518d3f012a9f971f33f69206fdb7b9b9ebab34aefae56787492aeab491d051de7f5fcea641cc9e69db18d7e184ecfd1a4eaff8f9b108a8fb14e1cee21da99c15e0ddb9e7131dec23b6978e9ad8a63809a19cd51e06c95b000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001793a88e2a5225c98852823700085d3af495486bbfc3771c50de23b8b889208ea7c7d6e3946c48532117f628c9d40d45a620f485fc164763c219b7c4599dc5f1f06f33e5f189014e2ac672648936a4dfd0cc5a8c0c7746da02759389abb9d0ee302bda5ab2c4e7a431f922d02cc83b8de7f3f0586e89a78518773ee308573d893ae19e9e087acd07c07ddda0dc6d0601401512287a1081d6893607060297e9682999aaae0643478cd80de2da35a1e60ffd6afda4013c687441c479ba564f4c19a7b8312b35e2c2c6cd956f5d5cd0d086dc13a73daeae4b6283c85ea081cb9fcacfebbaf4a73983460bc2703ca29876dd7e2ecf00405acec74c5a271c343417f8c6d954742360c76d0c8c86e52cb5609a8a5b2ff3db152ef4fcf39b91bb8273221be1afb50ce5217f33c0175ceba161b503c66df9942025566ec4f8012ab1de7dd2ad75aee19106bd8cb4f659a1a3d5f8f20d48fe56c67321195b925e0d66756edc469a413d3783139d6be0d8fea112a4761e24de661aa265afeada37589fb35e0b4316e2125797e88734c8c4302a84dbf326ab5c53fb77982c4bfc7ed5618a72a22ac6e899d4ae4b9c0336b4756e7f5b027dfeb7ddf26169e6890589c78a7d6e0000022800000224000002202b487ae03aab97be3eb6d9d03c2e16a5d395b395ad8132d2e99ba3a232b12c1500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000255c38dbd57936b4edd85833daeab44f95d61a9a4853f23434fd86068b1208ff05aa44d941b5138758b00369d9669d615163359161dd50a44e5979292f5cd3094e7ea1768c81b37bcf05c6b285dbe3465fd61aebedfcba2da26d34b9184d30e63bebd5167e0c409ac6b270258062a481898637129cc8faebc9901513fe8840cf3dca774db8017ca7726b09bc211716213d522bfc8dfe35bfc2fcce23478207c5771c96621f5d21955395ac60db6bd81db8d11d35c56eda9dce042ca07e452b88a3b939e7d4d2a552935087f9b5e3c92a2f6525073da005b7de84a2f7fad931cef8d7457de5d7e828e07d8e0ca6771ad9c7119a34b60526bf629aa4b3183f22999fe6ecb3da6c102866172da0e4fbeefbca6e33f61d28052668464cb5f2d474f4955dbcdee923226f021ee413a289991eeccfdf6e8fac5bf506ff0cf548f0cea1c0e23ecb0870a3941d2c307bfb725210156e8a6b40c18dad9dede4f2b0c70897683b609b82b9c4058b678c530c593250561e54d75243a7f3bd6560db908f945a29e6e408a129012b0139a796e695b0e5364b394004e45fa5ebdb2cfe2fd7a1025f729a238e3133a04f923a59a1a4e380fb9f901e5a1a9c03979ba793a5f92df0000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010e0081db041fcfa9fabc26642f324ba091bcd1a82961b6739c1cd8748e6ccfbf02085d8f8f64497484083872d5388afbaf7e5f979ed9ebca8891089afd67ed986312e5e081fd57b7133767ab57edc3e247e845519b807d63445110f2fee96b3b71000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000077c4f6a3e3ccb43dc402b00be99f8e72c10ff3bb9436a07ab0456be4a3e69e4ad409ac98fcf22d52567dca652c5fc35c076c64a2db5b6c477f469f459e905ac90aa5b3ce3250e7a1423abba5ddebf411857b29160f1337db7b5f9b75b508e0af9da71f69c7414c70d3d74be8711609d7a45ebb50aa2abe2bd3310eb990b1fc8fabe85cf34e9d24cdf99626f76f181a133e5c37085192396397777328ee5c079081ce660059428702eb5b9af0eb71a8ea7f4157c6d76be557471b66c6745809a2f6c8255fd4ec4065161de2dc53de908776dffe6e10d54d9cfef31a5de96b6d23e795f460c7ee8f65738cfc01f4f8f94b48c5bfd7dec1f9043b4383d22812d32f8c84c397579de835bf007b9791bdb6ade954a140f7cddb39bdd40bfd9cf47d0c8e2f99768fefb84e965a42c515de952dbc69754b9db9e9cac1d34de37d2c2b733dfe253a7e18902e5ac37d6115798e24aa57fdf3245f867f7e0bbf29b3a1d5aa28f2495ce56013f31d64e4ea631e66d9b9e75b46f364711b9e25fabf8f8370e9e6faeb61dfc514ef0b9d3576c75e7bea611c0c01f441f9c554ed3a8b032c7b980a6b579d63d701ab36bb9a1b6910efece1182e2b1b9f1799f523ba7c92f5cb300000228000002240000022018a02b044cf935c30a6076ea2296424983c75126890a045b7a64341d5d3ef448000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000893b792487612b270e4b1559e670d40b7512328dd0acc394c6e9c2ddd430353b7facbd3190be07159c0f0db6520f16f44c9c1049c99aa0883c216f019e8c86b927921abf1e704ac6bfa068e199edcd02aeada0fbd80b9d4e134359e7edbeba084999d76af177a6a769f8fcdd605d36a7502233738d089c0d29b3ca743ae07c32e111b3d0f0ae3cd9fb2ccdd529062aa25f397f87df84afa6ebe68a883ea7c8161c648b728084b6ba0fe6954d91590729f089d53851443b81d6fcdfcee183e141c99e1659a55c32cff982dcdc40dadb62075de46e6c44831717e81836fa45048e1ce79a08ff0633ff5af26c8795b4565eaa1baddfedec8b84973f679b4af2be0869be2a78e1d48a3bc81a6c6f461e118b091e345e8d4df8c956c450822df368492229112b6d4f0d5c93818174935f5d40a1d3a58ec606e197a8c0fcefe7872274f7dd01bff8dcac26092f2d4dcc8167f5dc46b41adab70f2e0c15b9b6341ab1278e84b2e273420264a87807041afb28ddc8c31617ad73c8a47102265414b0e47ddcbf7f03e757018544d7880523edb2b7daafccdce66c5bf90b2719e9009c3fdea38ba2d900b791a1881ad52b4f358b1a79eb87ff1886c5045969270cbda56c4000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0021f3b4e52a62d2c1fec4d840fea778aa09847ece244268e19d4abbd07a9d0e9520b173809673d185691f1205548dc061cfbbf2dd5d4568840b64278c24f6214f3020883b281a800d2bcebf09dfa66d02eef208144ca6679fe104f61e4185f4e70aa0a3855baba5166587b63e5731755eee4b6ceacf462bdd6c17f318df8a560a9d100000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000977d4a0ff25e489109aabf76895814e81e6f4074c78ebf3d7d8d4ee94baca3c70f354a00020a0ccb2d4fb59530c083fe7fba3050bc412bb7e7df589bd4fba373ee0cef436306c5f899dc69c83369771a5bc14d0fbc256095d1f9fcd2fb045242e30405a756187cdea9e49a3c19b8fa2d312a091f3e7ff4306e7b1a166e222458c37e4cc7358f5b65508adbc5f8f92dd3e05f94f314c2c8e7706a7cb1f625c64e667214033188171f0a3a31f1d90db253da29abdfafc58b1f05019188c185efc4afe21f525949bf762cc2f02a68383709d41eafda9af933ad778fcc12389f766455b534aa886b67d4b3aa929cfd026f3922e2eaa43f504d94fc60ab5964cedc7ea1b3988f6c6a82ad0afb3a43e5acd73bb662e8aa671d8a20280f6608170fb179e94f4f486bbef0b552d181d37f0d910b984f4fa40132ce4a7516953d56d9a8e9101cea950814244d72c2cce5be06c7b9e7e92a8f8b16aade0ae7fbcfdad95b109083c6307bf62086404230bfd5a21ce63c61d5b72173cc770bd50090fd974ad3c0b48cb44bc01925b469bb6e85d037a65fd8d1cadbdc8db8d3e16ccf412c952694e49bde9959029bd2d135ffcc4382ba2ebc4da21a9e26df5a49d6966fcd809d00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d83050ade2865b1ae35bf8b060464c00b3ab743474f7bb8e388953c1e445de1a56e6af5738679c89ab11526ae05de326d36a3596e1e22793dd5fdc499d9c26fabd9f0715a9cdc7fc175be10fd2473489e8eb63ef27934962c9d6098798169ddb2c461bfd132c6c3ab4327f682c9557185544ae35b530ba8d813471a598769e3a7c2bd16eeff5096cf73e2a8e8011fc628dcd680b68a9d225bc5ebc5f4464cfb9dfdd874cb5b50b3e59476a1b7c1f19d0f1f5bdd72dffa9b4589962be32e7dffe38d6769b16a07f4863509e76e3deafe1ef331ee69b3d95d5c827118077e9b024cb77900ba32bfcee6480f4619948aa7d6bc76453e92033088f7d2ffc3ab6703aa21fa924543afa68453650ecbb9f35f639a298595e8848758840ed25262c0570bcbe7d71f13d27562a81704bcfe0f28a0b9e638387900230d9af577680dd5e2cec74cafd5c5c4eabf80f302d856837a45e6669aeda7145bc2f02a808ea2e431cc6c6d09e257f94e902018272457ad5bdf5bd66fec4281df38b20efaad8b7ce0e99022130ffef7acec1d4005d3ec4629415f27a4ca5252a9104a96ba6b8308d51dc5a655129879becadf45770ed8dc350d360a1efd1c2270111e04f623518edf00000228000002240000022010387bc8fac3743fea2ee2b2c402522c8ae5c28621b52d2a035604ff304d70ca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac616458894e1ab696839ce27b75ff521d7129f6e923d6f1731baf3a45ce28a8da248fbdc3da6d540932c86cfea8389671c2e40fe6abe3a605ff753a089760989ccffe47d46318711c0ad3cb029e2ccbb19255def0b96ae2a6ff3517569dff01259a7493c7d2d7e06e2dfd3bd9b97aa097d61d330561c7a329b5ea93fe012924b2dc0316a86e6f565ba6460577151f7ffdefed029112f1659727521f0321a46a198ef678200ca53ad19816796c87261ec9603f2212a8bc8afca831676d26cb9076cd4602553566256ea64a2c70b0e034b785559343fc542e4bb5258cea1bf941e900afdc1f3f5a89e1967c63ee5ec9e573d001c91cfc6cfde1e1e48e2f5837a9b3230a641282dbf17d2abd1e1119261ffdb4eac9dd2308b11d56f7c70bc20eac68d6decf07fa2b95984da46bad2c79b3b95ac9a99ec8437239c6729cbcc33117fbde495e311a9d6af4d9f2ec700485389140c5aea17e926c79357718ae1ae5c43e74b9f8f723fd5ea62623b6fd8a452481eb12dea61bb1ba1e63b4122ed8076a16a2121ff85136c116b76a27ca344036558fc111523efa334594e6d03f3189dda887d714679b02582f30eb3223a13caf8f29766ce29a25e859c1612534a539b2000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400124b0f4f67708c6bf277b386c7e5f1f066f44f03b74ccbac42bbea48f5e089aa4020a468ad60291a6df5f0e905da10a085675ea9707177b00eb6e626288d58d054216a83b361d935928dbd27ff5e5b7268f132faa34b17d6547c6a2060d64e1e5b70000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008eaa6dcc49c38e588bf65a7ba3405e824c1982bfaca37bfde67e9d06580ef74db94ff2222b8706f6e3b44fe3276c444d673d1eec717e1997ad101593f35f5eb30bdb931cdb9feceeb3dc0fc0c941a8354a660ff6c87f14b539ec83e9dca246dcb826c555c17a2a0d38fd645e1753e70c9441853d8bfcc00f9a5494f84dda0926b9983b87e3b3e1dc734d04ff999ed5c136122959ad29394ee1f07dbfc585d616352414f4acf9d667b52a939cf95b3f3c2ac0f242e4327eb40f2b7f44c3c4e4e46c73d08c075c1e750a729ebebb50c02df635166fe825aabceb5ff83af9ecbefb7a5df83c726da8f40a0ecdf8c0b9d0936dbbdbfa815a71884ab943af29fddee5575675a3aa52144d61b9f2bb931f9d4830449dfe2d18fe1c70bc2f9950a745169ae7956f21f1a1c31199b0b6552c4dfb3643726596396aae8b660f948ed6c513b35a456964f53b6d754fc7c8370f85a9fd1824f35b5edc8035a2e9148d838c05919863a39118966e5eb38d9e43650bfc33f45784a33c4fffc145f0470ac722e46204f0d4a5aedbc3afe8af13707124495f65071c6e14405aedf3554f1d9e24d770f649bbe901e10f7d4bd365ba9512f3993ec16290388770238f4b03b3c195160000022800000224000002202ae32faff8380c0f47a1a9863a5363a6d328c6d4f61a1098bf31b37ef95f85890000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020ccbbba0c52050c7911f6714c8f5eaf11f77b8be47d809f873bd1183b4156d28c5f3015b342a191d670f0f27a9a565f10d27e1bc08e26394421bc47869370f8af3dbdbd9abad857f8a25a452d35d01d4aafbca8b115be757a8b08551310748a4753f6ace04028aa8c13dc3782134b2f24dacd6c1d962cd266e9e890fdb9ae371f04d995b9cf8d309a6fe7155573f0e33ccbcb4d0b51dbcb56c14407cabfa10aaa027211f35c514ead7d492eb64670bf20ec18d273d14dcab5d883d29c3750be46eb1a119ad8d441a15c4c65ff66d0dc4a8e9e7cf3df5267843cbee51cb88ae254a597c68240f4f5b17714c87afa857d085be8a913bbb031645206571d3551a8561a92800ca756c17e2a136ad5f4985162ec34597a71c7f75670c2cbd54e3ef5bd7ab9bdab8bd1de26e7e2264fb38225c98d133c812f8d90f3bc3a7d94ce824dd0681e6eab22f41be3dc63465c735be9418928e891adebaee0a40451b592e1896e0b2ff4686ff7e32511fcb9f51ddf96a271a0560bdb8022e24e9f910f81b8f40563e7509a9aa376804eebb58461e8518e46e2f8c4a98a5f28ed9e2706c047aed1b9cc71208a1c1b23e922b02350e377a3e015a4ea49e302bfb372df6483a966000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0021400671182ed241fcb6766eb1d084dd2befb7ab9cf191a71582b06e7615424ed03a6d3dca54f86914895f5cabd0c5de1eeb6febe76f680e2ea18227d1d6df582020be37b5304f391f9df67e40ac169be801d3c616205718a7660f5b4d529b367930bb39f47fc7735fd31a5b473e6bf9bc8a2805d96d4402847117c91e368e58e8b00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a13124796de91c756c14364246a43766bd2c2a4c01e3624da6a8b7957eca9e39abfbc335327530de947d4975b456c4459810db4eec34d78f31ccb2fe64f36b0cfc75193710eaa366bbc18ac773a25a88321215826941783b09379b9b7819430449215bbdef4c3261e7873eff05088b16e87475cd1e8f48c5d6fcab33ad14adc146a01fa5002e114c8c50c1156c0b35f245ab4d336d59ed2d08de668fee80308bc4fd71922f1caf702e46b47919051eb8962a355fe6aff278b95774787aa0e3ea66d7059964fb44a395581c2bc82cc8c1f0b9d20e017a7b8b72986d006cfda6d65f27d8cde397b2268f5d76dd2d136804c0cf392faf6609ed976161353bdac55a644dd23670b55759902c6c3b47203bc35ceb5d5bfe5106cb69323bdde1bf9f6779f50b066a90065ca0ba80118ad3c12af04afb8422e141ff72bcd3fc740a723e0f253f57d9b9e7fbd6303c0541a85fac9e07f7e5630b5011d414d1dc1916926e26feeb9ac2a79193586a38e188764becd259a3e80955af5fba3c2bcc977b4eb0de43ce76c4115ee43f3d9dcf6d94d34dee7207e3367275f5d8bcdf957282303539331a3c6dd8cf534c8834cb9ffe85489e29ee543a672fb0792474195fe6aef00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d23bffed48b2f197d015ac83cd0dd1fdaec5ed47fe7da547ae05e4d7b561a5a9dae2136629c7766b16ea111d1d6cab9742537058d55dfa7024ff9baa6fdb3ba7827eba0e31e523f79bc98a0789a0122d5398f90aff9762ba316d79d8b4c69742481cf55a5d40ec7347dd5694434e6c8fb679e74e82749b3f89e9301d541a38237936d869b07ad4ed2ee0377651322e34114088ec178f6b242f481d6d64665f3d74f45a143524c2142f106d7de15bfdd0ff62f02f923d6b90fdc8967fbadd161ebd07f73c851921a7736c702d6f11049c0a31096c851b158b48cf6ac1559a6554aa7f87eeaaa6ffc457d3cd7f40023194512f3f3aa634a6f862adaa2092058c9e1d4c2ccee6859c50c82d4a31ca20bd203c574dab40b458a8e34584e9305a1f986a49519fc95fcf05c11781ebf5c3cc1e63dbf256a709bee7a68b76ece783d574a31886103760d69a255e54cb17c59ce3cc2424f7d1d6f1b7f68749c96d958b51e740b91de31ccbd5dbf11c2f4da97ae684bb0f4cb3fce9c5fb9eb8a2df20f07bdc80e94cd1683783e10363b5b8e3dc05919ec3283e6f7ea916ccf2f841c7fa80f3710fb5755153d3c5ad2e977c11b7a2ac32e874752df475a92734d4605161a0000022800000224000002202c2c2dd591f70229d5771d0dbbd1b85462f3a96c1464899179ee041fb59a6982000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002339277884a079e7a41f2f1f3034dd7c87b5972b72a2cc354f30f9d8a0660c39709be548f53236020caee9130d80e604a4748fde86a9e8fa6e87354a657905b45da60c7068c6284233afe34c1b9d670125ff127afd43fd48cc3add367a9f05b94d69e5b93ea11b10fd383e8d9ad532d890ad32aa7157a5c3818575b7bfee49ca3fa5111ab6e72b314970eff20adc797d00b2c03b64f71dde564825e6de99769cdc8f162e2d9d3e2dd71091c72d0a59e44cb2d5574dfb11ea85efba316848103231d48f0f2b5651af1d00566d00eb4d7d3cab9e679f2694b67453a9be6040480a9ab42f61ca50774007a16d67b3f28887ea566b3a0652d353b85560ddc4b85b666e4ee0b12e35ae59ae082285afaa3fd6f0f79e389a3e3f345f7bbb052f4d6fd85a69afa8037c6f053a7b842a9abb50e6bebb0b89930378f2f36dbfaa61bf47d58376ca2b64524afd116b80ecac96a44310598dbde3b362c1c50859b017b35fb6a05cf2347f10154a5e4ed9cbb398e7883d3285f3fb633c19fed8212bddbbfe080ea9c5cad5192bcbc82766da494aeb48c503f4255a8fa60cb8c519fc767bdb9064c33c77ca1202c87726cc1e41f2ee350400790fa883452d0b65e48a26ec543c000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0021e03695a030c577d2200a34fd3b360a15cc6a44acb4177673c0e1707a9170acb22770bf29c34a968a8bf074a28eeca24fd3ff976f3ba5d4bd146c853fbeff103020c3c3b98cfd31d6a04d6e276b456be08b6cb6c083b5fe6b1434b5ca68c465878166ba90372fab79addc340deaa962a4c6aa50de97c7bc6ca06ed8c6a5b02055400000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008dbf8b0481a25a99fe4d21a776a592c74eff62230ff27b3d2cea7fbac1c8cdc2586171da2ea7adf38db806b8aa5db90ea36aedaca6379558fd86119b54ea4a39163fd2830591e96f7c080636327fdaa17d136700be9ebeeb025bfcf5cedf99ca513cb683cb57089c0060c6f6b457f1959a21fe2a7e2cb1ece67b3aa061012edd348d7f3906a28133e4139b49141dbad593213f5825aeb040f96905acb3054578009d9b01223f69b5e9a6502cc268bf78a6c57d83b3355f7cd07e52987a3583edf69f66009d3913899d9b50a19860e91a14afe5bf87b928a9c6a6952ae1123e660890a212ea506bfdaa4510056e472232af728650ccfadabc24b4ffea874ad7024d45ca0759ad784fc1ee0d2155c28f6dd9578ba1c6045a53174e90280c1157329a738dacf6611b716b243bdc2739f4c7cb408c59b112236f66eb194ce9cc8e5fc32dfb4d39754dde86e6e446923579151479a23552ac3b7d142d5cc23bbb7df7d3f8cfc0fb9740b22b5d35f6da791dc4120912d9d0a8307cb684bb7e89a3450c9791f1a294faf8b63c8c5efff0682b97e7da9bb033d78961973a3bf596ed8648305ea864d784209cb22986768dbece547cee18e97b647996d0fcb7795ffb0e9400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3103535cccc01e98fe71d49e693483fa5f0b4272f91052a9a8721c57bfeace5c65b667df46eb706258375c29746bac61da0b026f48cdaa0fc4930dccbbdcb1573053b4ad5831a73dd92d90e914c0115b23dec64bc68e85a041f5bb24e79cf4d6037653178831b3d8032dca335bd28089c94d41c59ee772dd2c21024655ce8273dc19dfd5d992d7cc5d399d0648e86e1f953c07ba2c18f80d9b911863ecf6272dcaeb9e74465d6a759ec800927f4f49d6b63a1e2c533f2164d97fee7f8000b22bd85df00131a1145dc79c38996fe6678eefcf227da5af24296d85163fb468147c1c063476eebfa0bc64049da62f307cae5e5ce59745f6a1c381a468f92f833e9b9c72427838d4d160707ea9c87e30058846d0d47092a2a642e6e1d575a6ab82d5e4d4f71e5e1be09d076ca0f3aa411a83f20bc8542c590fa72f3cd8e12e74c467f40fb687b510dce1c85ba65f6c9b969f356c3712dc23d0414a6d75b76742f27427093a85ddd2bd18dfd183bae7565a367368e7a8b9f6dee12ce1334c1eb52ff1f146e829c199df2c32bacc41e429721f8de77b5bd7f13271e68e526b5c791496a303c96767007dc3bd6e1eb1ebddca14854e57defb68f4c2c71498bece042300000228000002240000022028a9cb54fe7419e11cb0c2c09c668f7eeb64d3692e0047ba46c472abd5eceb8c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026d1998e4cb59b67676d655bb1590a9e0c04d871de0de1799745b74596ba71a52e796a818b8efb4c1cf2edfa18791d5965d5ab236ce7cdeb2a3fbc8a73e9ee85c376db8079a08dc95b08625114b95eae9506eea7f4c8e9df7a0b323dc3a89a348c054c60219880a5b087c56301ae56ec1ebf423661b57b7a204933244719d248130a6a992e7c22c1242ef925f855e72da5152465182a82771141a26bba91176bd4e9b87caa2fe4da6f682991b34198f37703f385bb9847c64d19e945a8b08ac4ff55fad02e538ec8355d2a7f5a47839fd75f05f828d205678dfaa35b3655b47627614a0011bf9bf32efb2b58cac06972781ce2db4b0cf6d4dcbbd543d01adf7561df4d9cd30000974a46f7314dc31ec9df54506a93d5bb4a3b060df08117edc83a253496ec6ccae13dc3a46465592320c2da44a906cfc366fd13069b5d1743d9eac5bb3dd97682509bcc0bab8c7ce8993084513e5d26edc7b1f15d92ebc5d6689395ba99dda5eb4c36068a5b859c5cca6cb924f89c09b3df7a9b4d942df45a3239e40b7a9fd616ae41aa30bc17461f959e75bc3963ab68115575e53c361b659ab7fe100c8fdfbf531b33fe89e25424b29ccd2ea5bfe80565b4a82a8bab42f3ac000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022843e417492627668e86c5fc1539e19eeb6971198aaffde59d69f1b4531d30390e026338eba0bf485625cf6d68de10008ff625632e5660938291494774ef5bd3020f8d5641165e9d3e3b30068d87da9b01d6da197e794cb760ab736440b5f307af1f9aa42e5a786d3142d61a9ef68c494bf8e2e520b5d373d70e8943a3910904ba00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008937c77cad1e8b134235ec2bb6829aee6bcdb5ff4f07d2ebb1fdc997d496e021fa24b81d402bdaccaa1ead5505177fbfa88ad4d0418bf37d4c0eba44eef1e9711ca66e514be1fc6f487d8a81afdd4de5c374c6a240da960c026248e7d97d88d313598c7bb9de03453ff63f42ead6eff7871847c440773365df7b23b709f545a3d9bbee6fa7cd470fb492e420cf4032f5336400fdd317756e544a5dc01259b75214901c9492601638fa76a2937908beaad90c768c35856555c49fbc77cbe5be8d400bdbe44dc5c3458a9a1d63360264bd2fc1f5b9e3671d3a90aa86fae0a827e559e1c366aa1f33a4160902fabcb67a56506133d4fa0964e4350ec296909f3e70a1ab69b4e558ed7730bd157f8d4660f19feaabc0eb1f7a996bb96a10abc25c3b59011203e68056b1ef2fcfd03fcb169a3966c7457c677645ed679d23c4cf1a5cbec8218b18a66c1feb51a8fca363c8f76735c4193411436142f1183e07fd8e74a9c14b4296379ebe361d9658e50924358b51681f2c3deb617f5613466aefeb1a1119ece8be33f492b43f79128e751759d23f065555578b02830cc1563ed8ebfd18d529a7473c2455c15927bcd5385784f377a8a4f45dcd65398793b2fd1a2bb8000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021b712f65a592b621dacfed99342ed112fcd17575aea0bcf41b87613cacf89b90e7cfb503fe34dfa130aa3b383735b3f7ec623da712276a44293deff6e7b631779e60e482f9a1d4cb8c7c9ec1b7ab3616d0d594af84a3358993571f732c48aa0612f5c9cd42fca5f739446832013735d6894956d3fbd8cd883a49100cca371df075404ebb3ceaeabd9fe1b4ecfc8bfa950d06e654e7aa4be94aa5ed3957a747dd3baa324a4b7400f2515fdf29b0f60c79f9e513eb7a9b9776d92dea0109393180bb2329b40b5b21673e5bf01efebe3d087234988e7a4632926e7e8191a2cbfe58f84373455a445657094cc9d60fd8dd7d806bdcaff835c45a4ae3e6588707f46b2a7c0505895ba635bae81914d2eb7ddaf2e1cef58bd153da82cb3737f9050af0defc4d0be32a9ca3e85f3b2844feeb8d10baac2df70db268ec02b65329912e8695c21dca8aa94824d1220cf6416918960fa1d484fa8a8d07c8b29ed81aa2ea037fa25d6abdd97df40745e1e802819f62f7f74ca6fadddf356e5854fac38f26ca67ef17815781aa8fd9cdbf47681535289b6c6cdabd8d2460b1982ea19a2eb486e5e338c258341e184ae9061f024c07db71fdb91528e23069685b9a7cc5b9be0000002280000022400000220286e87e419c8f905bca02863a9b9a7ed4e3b869a7662f3f9b056e1ee56ce466b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083553c6a7d6bda798155d83b95dd458c863e9b9c193b8746e0d76faeccbb352958d6f53228bd9d003be1a6f7471bc3083df79c10a69fbf8e36bce812410e8e6aa8f110441eace20c4909c8a39be0bafab12d766ae68ebabe05041a9df369f5ed81a7644a8e2fcf85441c64bdf391daf7ca3e7c32a814a7ebbee63b937e3bfddaeb3b18c9b1c8ae4c0b3d26234e7d336348ef49e22abc1d143fda49672015a349c13c6b4f9d3ef0d195ae9b02aa78b5a68e91d1d682aca3ccb2c2a84ae2f09d340e0188f5cdff734fa0e21cfcf79d66a3216ce6bbe9efb42872628a6af7d564e44edd3e24d672e7968232283520207ae63d32c824cc6492e275a908fe9c65c5c3439d2a00f969b3d6cc9f74a95752fcab135986c692c8e68cbab116801a3f83601b015bd0cd667bf74f24381ceff970fe8706ac416c9c58b8e108af0001842fa5882c3d0d789c837bd9578026fd7be111df93b656dd93c0ba72ba652c0bec527cf8afdf882d31e3eb63cc57c1b265dfd344b68aeadfacc7f8882c5942a293432c0bd4b0cc4d06f5b779df4e4ef4b7940b4a5e2838cb3e194ed46c544ff703ec0913aa16cd8ab02b44ac2321a488490c0fa7c4080044e6d0fa2a5b0d304f437897000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010c92a9b23799e90a07330780410b36942b393b330721b0f74b5d30ca0630c9b7020fa0e4fb6dc92e7e5d3a3511dfd31654c302c7b97df26f545a43c3eedfda703726656593f594729f89f25c4ffa2a06fb0398bddcc30024fc3ab28f7344c7c404000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9058b5fcf4373f50012bae9ddfb1755f14f5873f0b191380739fe4a9246480716feedacff4c37ee7284b3d4e1ed708ff199f39b4f928fd7c4c3a0a098f96948457940c408ee156643a4bd1b83e2879262ec771df4380bbb13d3dd07830f043f16aff0db921737ced12cc5328cdc1ea107aba0bc802dc1d2669088620f0a7e7e5687d95d8da27205c5538b0f7dff6e52a804070fed4b9ddda7e92a79cd1c4f8c9b99ba819ac2341531b9a31c1a26c86dcf4025337d037b447ce17a60fe8f79d5f0e83c45e2b685a42d63cafd37c1a882bbbe53978729d431f344ebc4b965edec10672e05444f958669a72614b08320e6f76728ddffe98cc4d8654586bfdc958f0c83315601b79eb683c9c90055533c50ff79ab9eaec06703a9c639f48de2680b363c6c525483e32dc7c95caf3cafc5dec7dbe1efdb9a053701d77b579715c9e1ca20e9c9015ec4d5b7e88302c0ee99c0185831b14dc7ce8b6f82fca6bd8d3bd37af8064a58f6f27a041e3b32b8137dc0c8a24761e2f2501e62f6ac26c6e35bd6515a89d531ed7515775ae3059fa73b6fe0803f144e0c2d359ce352cbf1f4bf171f92965fd275e1cf030466249606b04dba4f8ceceef0f0c44f119f9af87dc54f0000022800000224000002202baab78deaf8d71ebf6af1c263ef12a35bca335991922ea212f1b4b3ea46974000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac95c11e330ced4f7edda7d5b10d4c09e60e641bf1bcab437456ae68140e395b595e1bd774286b918b5759f8bdea900ae99891a0ebbd507cd35819003c4404205414947bdb69c7b45197e12cd2dee209916b0b30fa2594bcc8a9150b791bde9e0c96bacf0dc85ce81dfb2a7cca1756aa7757815c851b160469105ffc8984166c62e8861cb70944e8689ce958909325a362c5aaed96b570c643a2a674a38ad2f78eb6c31edf347fd705a0e4dc37c75c58dc4191dc98d84b89d5838a79e26dcab870bdf1fee254cd6183d369f5ff4bb39f46aeb424f996958a7db9506b78e2da3292cff4cdb8b4f3609fa97d647595085a4d4632781b8e2f92b86128db9d52f0ef6cbe1a5a1abc0dca1323f0d95f051e3ee7ff7e104771af69d8d8d73bd94630ddfacb60c3b49e2bcbe0d752d6556546eec1306881644cd63989498e3558054a7ddc7291a5684cb14d8e43d217b7b6022a4fa2ce37ea3be15ed803775f7c5c2e91caba7ae0aa834e0256529a00bc7f551eecd9a51ac23a8c77f47fb2a5838f2512d451f04509e494ec821c2c10d0f9afab66759725e479faf183c32f10b2f58125b3770f86c27e965b264a9e2772707a8960a11d6185c902c40851f33eed96528a000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012f8e0ec0aac2205bef2e7e5a232688d9f83561bd87012c866a530bcc5ea835b70212cbaf3c5616542e476eb738d6a676674642fa795eb945bbb12277e58164143710c125c524a39d1d06dc55a2c07e47dae5c81b46d6cde35799342d3254032ff40000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f0308b7b96bb8b6418aef318d90ffd4c94a9e7e217ea3f6c49007934a4c8dd1ef32e2970ea6f7113535352a7122fc6bbcc4e1dca5c6816ecc701e802ed5fe09f49ba2c621239c9dbc32e107a843efcf3a05885647cce763f4279ca3bb27d2d97a9e85e2cea42dee2918111e5a02cdc52e38f0d8dc5eeef4278d535c7032f4fab656aa1aadd0d59d203d9a5c472fe7fe323345a108949a98d868b42ee4b02edaafe8552e6b2d3c1f13ddc360caa712046ae55211e7233570bc3ae48e54244965c958b8d1c5c4b416d2da2ef605305a8e6a9a9f5478a473d0723a0c82915b0469f2ea00d7b77dbceaa07259f2baf9d7942eacb5cd676491b6a0f3e2619c8baf62387643c6e60d612148f7620e4bbc3cbf3197aba23aaa39d116e2625cbea02e00398a7880b9e1775ecce788e9354ac6883c766c6a291e6b669bd5a50a3f8a738f252a4b93a07d945308b8aa17a3f669c012d3241ea6ee9556fda69dfa9e16aecc704936021ea524f0e2faa3a899dc14784fb29a00bfd50f1d00eee6a2cf03e5a0987bda50e9a53a383f3571da9cf540f5d4e3ef10b198a4a008123edd0282edf2debb8bc14a0b1fbb5c2aa3208d38ca65128e3b790b03cf50cc2532b3d05ac25b00000228000002240000022023c0df99e08fddc92607c0820c51366ad1c97e4b025558d1fd2ecb23e9c30868000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008be99a1f043e3af7bf4f2b321c5a3d6f09a9289391eba5beb9207102c7bc4f9e24089e1c6dad28f1318b71d32d19f9bb38389968218435675dec697de6a8875cb74f3aa1850d768c44d0cb8b5f2f48afb5dd2f21129a72235e0cc6c4d78f11dac82a1f24cc681cd5891a8070aceb8b6f288e4bef1dcd494d4fcd8379db3761fec832afe61104733deb39a83541ceea87630d5a2cad4ab1f1314d1f04cabdfa0c1861d79b8c60752d13d5fdf7c83d0ac0a466c0c174c95eb5cfdab8d046e23607fc9638813c22888fb24eadf17a8c366b1989279736b524646181597a01d068c90144747d74400372b8654fb006559aa1099f6177137c178b81ceb3ad1eed29569619446ac8e84314e6b79fedd45276d8e9fa39f07d016efe4ed83f57fd0b0a5aa58d8bda2af4d658173fd8722124284c02e0df061e941227f20b93e67679d5f1472e9b71a2e9f0f4d705e423a576c9d08c53fd2bd4e308f83c74318624c8cfe4acd0d9647a38eb43a845d5f557cf9e9b30e550f8f771ed5d618fabe651a4111895dd24bb8af4a59dd01a99e1881e52d95246421d8e97cf049f8d13c989b9908aef9cd4ed98c81df7491c41a958f0054f1c62fbe94663824a70f4382d67c65a28000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020fd6ae75e93e42a2fe6bbf6c22e7ad1db2739873e103d752807dc8724dc7865910a770321e2b0162d335c10926c324d95722692545356d5af640cebd0d17eff10212da4e629e19486e41a3d343ce1dc44e46d59ca9e68f3bfeb89e47c1929ea4311da01f1a191f620a23b298dbe921061a5d84429176ba8cbc6125368d6a92d6ea00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008206e9bacb03a9026f45737f1f503e544f5990c64a76ca9fcd2f86770eb4d8073bc82a333589971c8ba5b5ea5469f7536d288bb51fbcb79c8c7934e38b3feff50b61aaebbb555351562dc68694852b77b2457718ce82784b006e6564170af207efbceeaa58b288359e685a5faad454ec2e9a9f4ff7de4f19b287d4b7ab529e9fd01c7b578a470e8863255897e81e8ef1e354314573424537d190350cc421990f8f28da513a799d996cf79bdeba8b22f3117f0059e228e37b0d678191f331734b7a57b9515135413d5aa3492af73e5117e1894d2ee2c6c0a3529d985fee5c980c5a7243ca08a7e320f6488204aec0fd9d75f77392f23590bf14a7e1dd87d3312b0ee33ff2ecef8088ead03ec905205164a325e12ee57e7fcf6fe7bf00a7314a1218109c14e2bbb0146716623e2795c24e901a3edd0a5d1a4ba94e3d99c93011b2769a0d4837dfd162cd7d69106cb1e83984f7b81c80c83a75b1bdf2ac9e06b5c3a369930ed802190fe286ac221986df34cf149e47ade4649339bb16b97c8c4d68041ed00f593fbc07581945342e3212b25d077c83a5cfd7b0572b7050531b95228fc3c2f9c6ed4cae2eabe93eb1c86fef61510621b9b66a2bf769c8b08c07ebbb00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001303462ec259ea001ee7fe29fa76300fd1b7b9919c3c7fbc4bd3c78615b743913b22f7d08bf7c0e0f361da0a2ea35aa9205c6b1cf03acf012e10a6efa0ae8daa9c566377457ee6037ca7099ae4c7ef2d7899370bc3f4a666d7619907da4dcba9650a83853eb6bb6175900bf09055c5f5f7e9d88b90c11a2430e292d5b5945c42539d4ba324bdcfd6f5710cb4ea2e4c703ddd2897af1c679ca16440dd5be065a516c601b9d8be8ca3b6dd109ca1651be03b11ee1d603ac231b197371be21e64fc070d056ae230d9e51e81693d25037fcf7174480299ae61dd2498069e78ff42a4b053e844dd7ec997be631fdda6f2157fffa7b171832588f24acc1f29727b2807ae438ccdcc67aa9c1d7a5b234c29f7830c66cc731f8eb50b81d52c59a217d1ded0a82bc2c9bc3023dc08b3c327ec755a73c45bd9f8aabd84db66500060df26842ee9669485ddc0f82f30322680b7490aa98904cfe07698407e2cef28175097ac6a1f384247d501b0136b88ba0938e2cfb427db683ef9a88bc76887c09db6783238af03d20aaf6c3fc4e571a93a0d7708770e57a441bdd1bc969844c5c25fff07174af3fd6cc830bc48e83a31dfa42d745a0a4191b9b444dfbef8921953bb81b600000228000002240000022011a4fc9a895e9d61d99e7551c3174a0e02143b5e4c296ffffd1e33b2b0d38514000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ba6a5ca67cc5622125548df4be787038bd3f68cec13aa64656c17654d1cf4ff8ce9224c19e9a97152874c59ea500da7f3febb06cdde8a5adc068348fa3b01d7fc862c03dce7b0f8e13c1f677af4c0986f1d09eb8af8596f27710ef21b66eaef87ceccd1a2064ecc8f25361aa022f66b18e521e770fa565957a4acd36e15d6d498ab1b038c6fe6f7ab88fa764a2c5802c74c859e2abc7ad04a08a55ab44a60d320b2cca3c571720d186907d9af5d6aec0314483008540b218d615b496eafb2a8709255674f5a816ff1e079b843ae5652c20acc9646dca187257d502e32842b368d5c5dc6293714f515fba9ba70ed3915e327389df590a10b01adcd526f2981788b5a994f24a3161e4765358fcc2a0b4a4c34926a5f7ded97ed0161ad378b27ce64ce85a126b61a7f047d4e49e3b89a8e5ab4610bf7a61ceab1ce2e63d39f1a6075f060426871efe3e19b39897e2acbc1a0198549322656fae9f052b97ad286bad6da2bbe795035f457e1b10d96319363406561c0c781c008bfb4d1ebd9a3e3c1c1f8b26caa0efac6c43edeb7af1b52c2b4854230afa2f426beda94d82fadb9c915710de1a2d2fa3f3731a0186d4727d4511fe2b0117e103caa33af8a99143b91000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002208e9c695d292ed466f617154d0413bebef7bd807b12c0d6a4a702ba5fce99bf0783ae74a025835fbf65fd6e013aa7881914c7d8bbef0708f42dda387e32901b0212f9e40214c2b0a96238ca0eaafc5b503e35c2779fd60b0ecbf7dbcb411f1c2b154b579a201a22e4d8fbbd6a57a551b592b2bbe01b147934eca2951a3a97fb3f00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f581bf9c00306f0fbcdb4a87662c1f19e0fdb27c683307d0c868bf84f584e010ddb8e465a4cec9d68ac077f3f8a27e4a5938e9f72ef5446207781a0b45e083a7add4a2e79038b6595bd304f30e645581ee60ac0890929097cca02c7983aa6c31dd39b187f92f80f395db184f4e9d3b9f59b87888fae1a9043a2cd4c228b5cc2a080727ffc4baf9f45ac22e03ff18d652ab7604e37fb6be13e2165d1b96ee1bb3c39fa3f3a481c8b2e3347a5ac96718c1ca8cbc2fa280c0a137758cbcf3aaa0cc46d339427ae3e82950fad2e18798f83162b1b9dd38fbdfc65c3017c9e10029fc76dc290fd420de846763051c64198f9e1ad6ce2934e94c9a9779b6fbc0c59f27c0448b490ea5087c8b8b24eafa749fddf51679f40411d1137b710cc86d55c931eafeabe86d97882babdcf2dce9d77f9f1433c3be9ddfdac5c4fb457dda21d96c0af0d3c093ba51537075b5a47ab00b5c908b338aeed23b6018385f7e3e592a6e3945b545acdf733a370a9812863258d6074d3fe45d54182ed59ef4e3b8c81a85c7a03f2d49518f2b4acf7239ad0e454efabcbd393a41e8651200cd01501b41c8747ed7badb57f1fe6f6787cde8f1ab964db4d9fc3937b58f6c8741705aeb12f0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000102b0f7a1311b9d76d375bfb7763782d42d12fa926f45f9fb1718721efa69c6948ee510ea5783fa960e54fc32e42c375a689e83c7068484bc8af0bfcb2c3ef5afddffd166946c7d0d344cf5b9512d491dfcc8d0ee0753a70395733ece1bda7172a76c9898e24b559243c605368641b644b9eb3ec6461fe1d42ec2cf698d2f9eec369af9aca56082c209d8184a47b3b9e3eba1cd11a2469e88568a79cb110d216d1e2cd6f10c95ddf5f021ca511d4ee76b426468890520338c0d042d3b1b21ff1e4315e869a1c6b57a4d33e4ff15a2f1c79bd4553b93e52230b565f844d57d0b2f646f5d2bc41629c83f3a55d296b182013e5fa2107ad8e6336f9cbaf2d442ea298acf3e20d00b1eefe3c3f6bb2a2320b3d97681d22ba57b39e4934acd52ba890f8978e782299245c3b4ef22470d1072dfad4c8fdcbaac2d1abbcd58f25d089f8e4f5a7b65c14c6186c7f75fdcd06dd77956437de3f929379f02096cc7c1ef90f157861ba02581441f581eea61df03c73c7847e4058969c7ed28a70d93cbd0d2204e9346e0c9daf79be746cd0e0537ca2c144907e33772ef180a5f27423ef585df24ba87378468a0233463d09c11defeb9d9cf6f934dc3ead8e92410972f37bee0000022800000224000002201898165af4ef9a75791b79f5f0226b3afe36a4cfad0e883fdef9caca195590810000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086d8ef7351dd4578d3f14157f69203cae194d9fa9014094f36601bfa9c1d53e001a0cd64bac9761ff8278ea1296f4826f912ee24c1cba3d54e6c8c38c158e27adb5a7a7a81451b183b60bbc48f91997b116c1e07469ec613b3567054074c1928c51a6180baa82ff029d9edf67debdc3d0ab26dfd951caff67b79dd498a0604dfee659198d14878d20edfff09b2e156bb02fc4deb9391c664a5865a0b9dda3f96d90937eb97c19a56d07b528b1e8132d3b36965c81ead3a85003c07525465f294e885f1d304aece213ec463377a5b9e0953d117fcba01b85090f154e546d7d4c37be5b51e870240823bbaed435b36ad23119116097ae36412ed1613d47517446d24db669ddba69f3ade60725070ba6ef33093f38dbd6d8c1714513e869f00e2f61906a61253d9285a2774ee0eb9ad756c0516f9c59a9c72e03b7a09c46ccf2a3c0947c0c886631bd1b81ea45bcb00f63a1b09d058c8d194adb2c2c35273a55a28c7120e619f83f9ef86f96e5ae68fcbab658c86c171f7d7685bc6c0c1136e1206e31ce89f1b95b61584f1a2ee9dd6870d1a3dc19e28df8a8a7ecf6cd8aee8dbfb39c676bdbc467d8f7df365bf307b5c71ae097dafa7a093f81b4ec570661d7146000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022d2bbd6af6af92651baf6cd6afdf3f220c5c4bb05d72c1f008d05e7c1c0ce05624fa0fb2f62d21a40f4ecda34ecbc64d40303afc6e71e71be110da341f50968502133791ce801457dc5865e2dd1dc52948fa27ca3130c05d97ceb869e13a4455862b35365f72166f47050d1a78b2e58b21ad686dd6edbb6e747b4a83c8c5964e9c00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026f32f865f9ea5d4fdc18ab9cdea0501365245bb2a2dc6899faecd7822b04db864f3e590ef83dfb1c5e6a9cfaec0ad7586a0ee3e5a31076be987f3cd12f0ab1291c0ac4ef42ac0c8316865edd7ee610be872f28a89ed6e8d4bd2b0a465ecb13274c090bf03df1fbb29a240d1e64faf0a1e713b593b9162df20ab9c1c04db2c98ba4a1a97c05ff513adee057cdc11ccd1f530b5c1ee229f3a287c330b428abef8ccb1f87d5d4350763b55768f22ee9597f7a7ac330a831d627a97670375191e479a37863cbcdd9545b220196d4b612fef6494059179333ee9da1964413534f46adfb7b00c19e4b94ccf16ccb3f4348cf7709182c4872bba1da101a9b481a0cb7af36f5db53a95dfdd5b04a7ed59b698d38f549746aa3847038af8fab6513bcb80605328f8299f9b579b9bdcfffb1adc3308b95bd2d329752a56c92f4f712857af32f853a9923fbdf6c13bc456e3f3b28239a695ac07f9cb404095c7d798e4135b3849d20ea440da2c9fedb4f79cb0c0d7866fce43038d966bead0ab2ef09fe24ac1733aaf8e701ee4adf31052ae09fcf9ff19a3f57c97b5d906a08349911c8a2ebb4d209ec7da618985f23d86b9510547ab3e5d0289b3bad786e11ad85607f6f00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000188429de143a31aa0038881fb69f706b8c65c91becbf35cde95dd3eb1831a5b5ed0fd8834565bd8d9a34b9b4f78ee2a7a2c9d41df46bb60f8dfc179698b60316904d815bd353b860d6ab90d8b3cb86103096ab99178fa4bb4cc2e257a309d90c92d7344bcb831af56e9d67347b8240c7fdc1430d5420a707033af8e595b730e9d2db7428f9cf77cb8091ad2db35e5e68a75d5d0b544ef53d6720f605003605810cd758df0b3b84af935052cd251b6496c09ac1952fc70928e102c3f0cb8270a223a06d619d37711b7873e98dae7566df2b2f9921c72ea57a98ca96ed0fc11a4c755b926a28a6496783eff406049b99b8a808f8406976d5d4421ec7c62472ace3a09561dde3506e39f15015e630c4ca805d84c6b054dfac8cae8104c8bc9b5e31bfa379ca9127b0ef90bc004570c5a273bcbd9a266799c323fb08e8f8d58ac4a0d5746a2c27fc091c9c8d902b31583145a5b2c39764287501e13d76fc1e3a4941f054c97db31b4e9f30100d1d87aa3d47aab8e985afab159f3fadf0c8ce1e8abdeb846278f706d1353f07ee9a4f2497a8af66fe9b3d74480c6ba7e03b47bbe993d19351000b3ef12769aa028ba427a93643944441cf8dc725b85729fbeb3bb8a7000002280000022400000220047b68e01fac71e5570b88ad7c2261eb26f02375d55adfadbb55136dc6515431000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e453805642dc5054b44ca8f3c2243a92c891a725963eeb4b1532ae78a756ad98fc97b3e48e5769c6f4f3822f39388828b823ada1e7ce6ed64f6d4438a2f596648ae40229ef8457cbd4eae60178d84635622c1716fd0fc5ccb7ed6cf8bedcb90caae8f7a7f88e66c9dc78bba3e4f3d5f6818ce12954614217df642e3bdb55d991af7b62a7d868f14a01007056720d91ab8eba29657ad65bff82d1710b50afab52aa5ce5a1db25aa9ef20bea4ce3cbf2a6b00b4eddef73c59d7b4526d4cdf908ea11cd8f16418334f8212882e02fbaa0b32fe03caf7cdfa6ae66d24f55db9d73238089243b727d0cafd1c02f6a1993ae1f593874dd58189d89b1e4639b567719995b185fc56c4d1adec52b7f765befc218c0c818299cfd72119e08211bc0df284cd0ad957bc54cf3f3746be19c67e4ebd6348ca2d8c74902eac138a685bcb772ef76a940fe79d71d2fd94c8703a445229300ac234c7153e9bcff9676657a69a71f49ce8a9e2d85c0c60114e32ac2ae5a4dddacd5789cda9723bfdea9ccd33ff837f559c977806ecce6cf98770c42037f467fc7923b094cfbbcf6ef23c5feb7a74447f54132f2e18c6fbbcd8f39d5c5ee278b7f3aa73fc4f37c26e29438d7d4722000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002151330c2e9f9865aed3c22fb72f8be26b15dd3379d7ac75d0519e8b657381f3e0a01926eadaa79cb51dfa9d4afe61d2a2dd1ae54d8edf31e5902593c7aaeff4b0215322ac84c2016fb9a7f0644731630785ac7f3102f088380272918d630ca93f51947ada96a989623774fea86632e052396dd7c3ad75e884832c1d9a9538eee7e00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a94bbe63fa4d0cd695a2b098c756e49dbff1aa3789c58a9e54aee9a440e70bf48c4a9c73d13763c174414139ba7b6b69e89c9a3c7cbee2256fc60308a33fce1e52493119da64f5ddf8052d89973368a1f1dca08d816bbfedb064fb51844cbcf113220aec7d25e691b976ff1f7a2d72a1d2bf8259d309173408a175b9b93b359c0e9ceef25da44a0c638b30705e31094d3d30f62630d8500995b564bf9344a5c63b454babd56aa0a89f097506a215d49160d018e246665c3b1809e1ecabe3635fe9f38041e2e09244f7249cf846cfc35122c785d8a10c97f87cdc7bbaf04e953cabcb569ade2e51adf6c8f6bbcea6452cd343fd9296b66641c3e80ad44f62654319365af5a36d4d218c191793716cc4cd24226d5dccc0bb3bbe123e2f4804d19f554c9e1a6f5000d2863f67fba805b675a9e2a0eab3d350fdb96d284c53615c72fb1e172cfd5174f92013a28d78751990a0dbaecf2083f9aa3047e5fde4fe39d3653827f25a378d4ee18a48d2400275df15fd41c455b6b5944aeff12ff4d03fe9ad1cd94c099874ba3d0d02c7abca33fab9953208028349ec002ce0eab7ddb444778ccedf1eee9305aa2d40aaaa4d289c67925923022ac81c39bec76b63b683d00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c3ea1f30b62a780dd93f6494fba61a92c99ea5f395fc2c537514504d3d02049fb89f2ce0b0bad411022760c3999d6645e5a31d751f898e7a0cd2ef44d743b9a89c35647c051b3db0694b982342a95c2eee11a460cd9d3ade65699f1da6c68afb0a6cd3d9fc6534e0ebadec074daf62ebf60627a573c15736d5ac2101601d399b328c9909c920ff5628c1b089af0b6dc79c9ba79d113be83e02fc09ac42b5217672e7a232e116797ebb42876e2d8c0f4211306ee1e3eb653e89c62201b9229d704a2b651bc4b01372c42f8bf82e2aba6a98c165b715b4f11ae90561dbf03601c15e97d8a862b73e24c903bf8390afcf4347d3cf489cfddcefa3ef8d45feca0bd8386cf571dba217ec75aa669fc5234620042008ba04a0d2d3c51b929951196f5fc3b1221ecf29e4ccecd152753b7d5002aea87ef97d81048e4f6a6f64a22964784e779e07f845279c34b18ec61bc612f2a1afe4c5858612339aed5b0ccc1e2dbf6f1151540b4f8f275dc6d44d91a86c95b3aabd162f2b33dd631e916de2045b38d0c8ed49820e96b2eaaef9442da449d3129e7f4ae9da104c595ef8cba3dd9ba61729d1007de4bf1c6ca861c3572b5e046119348eeb1741056132b216c01850600000228000002240000022012437d749d4e1b1a5be4608569a41ced40c801ee09affdd6c0a63154673de2aa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7d2ce9dbe5392fca67068314dd2a2fb86a668553d6e7ad35a08ffe3c21449078d995c3ebcbd8362443d30f4282debeb4a76a37a952e0d8af055aca6c547fa67a4165bd42003e1e39a9f12b8c0a7c7f6aef315a0a3ab716bb37056710efd23445a9c9cf37c951a6dc38828597949b9ded5371484ead84cab15137e1773945e1cf3f013776aeb64e96f555a85388747072afa1f4014b2c7963b27ed9c4fe916a03ae3397f3d122aff154142063fa1f000c3c65d97e9c245bfa2346dd399b760086b8e239e57b620294c09e9813e9b47e12782e7433d37bfb798227b54a78b95a8fc49680ececa22ca22fa9496afb148c4cdebd6e5c4d054e8978da4420c06fda657a5a3235586839728b6a016c0c6edc62f45c1fbb8f8dec80fad49eac535d4c94f2ffa95243315dd2fd93893a8918399a5b5191a329c4f653fd17b5a9e2c4ee72bb9d2d506db4c08b65fd120114af349636f9324e23fb28211ce32c9403b7b265bdd8f1101f5773f66946c4f95138e47d2b2eeda2852aa63dddb3690571265ae34f8b294e09526fb573f8506a556105e8bfff6f52b143cff4a8911bb17d45c19ad7d40ee6d4b4716bf84b99813d4b9c5ff01536e286d20ae1b4f072ca0368d16000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022cd7dd3c21065d011ce4933028eec21beb3ea1571dc410ff9736db35fe43c0520e825d8d1430f22305ad937125ecb555fb3c183101507257a4f9279e58c8c5d002158e730d44cbc9d9ae979328ff818447442b16b79aca5272f2734fb16490ac660b5b039e6cb20e861b511305e6a65682c6e2f2f59eba2e35af51d7171a92f77c00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ef47689db0d172ed0984f7bf0cb401a69974265af2fdbcdebcdfd024802003dc47fb6f7aec18353f7b92240e2cbfd471dd2fdd8fbef7f62504dab0db35ae3eb4886c2eb8f1ff6e4f1ee12ad6880e3fe165f58d3f89d2fad66bd370b19c28d48c30d268767b99b756a724743168dbf86f43dd9459decc4d2591d9513228d07db3db75d08a34786ff43ccd241ceb266be226d8e06d3feaf0e0e0d747f1e0b7346df52e8d0c05f4f72b980939ce78ce7a205d0bc4d709cca4eb0faad2e4bc33ccd8612b352d60bdf55652d0ebeb2a22e084f1d35d7bc2361225161d7cd393d42e353ed8d432aae474e53434f99c5b20c8eba06ff7717ade8b6e90bffefeabc72bcfc34b4a8a3f033d0053b24045a1602d060859d77ea511f77d416aa7482f9ad082a4f83b8b924369181f39baba34b67664c3768de6b6f96583d7a66947799b6c8368fd4aadbc48cbc004c5d824bfcad06e889a020b085e3be5a08fa47bcfa2ef3e504647d4fc13a95978a413dbafa4dc4120991371d92274487c5b137edfd84ebfea70a1c1bcb472f202cbee0ce33d5efc1f3a7565ce8e6b577b40784afc8237cfe57daf19997a6d793f5de5424eb548ece9b6c4ae40bc395e7051fb93b128711000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090bbb76d3a41d28290db8fe59777d5752a41df942d7b640d9e2f265c754ec6a248f531a562ed4f422d8dcd24c695f464540d2f31c25f56584f901bf22ec6ea7152e45b5045c9d5778ede786274c1a008f605b3d601a604e6e6214e92bd326197474f12cfc441b48f7e8ada975ecb8fc92b5b4d006da8b26c6094c6f152cf3e2c265cf8df8f5358a26e95a5317cd0837ea6f8f34122601fec1fa933006154fd3265475cf1ec0facdc45c2f1ff543b87e47a2332872057a6961a4eed989d89ed47337556a52e9c2e87aa7c405bf7e350c32e4befaf2e9ca7e813bae798714bedf4303807009709b78e417be75b401075e270397df68316b8a28614f67e9146b7eee1f04fd643f9fbd66d7babd80b9756cf4f5ca89b4b158454087b94ceae249eb9f455b785ea161b52bbcc01741e512b28895f445fe1e283fcfa584d412ab0f80667f87a7a972b24ef3b4bf27347b214165bb2e33830c7b8c11cf5dc7fb1a336ff7c2c9fe4f8ba2b9835f5b90d9143b6fc411ae563cff60bbb77f6899a526cab68d965a2e537b69f5481613c2b47c7cb3a96745b0e2071774c9004383dc86eddc542aa33d6dec24b1ef35222519196da99d76b34d7946ac5d796a5f15574ce9ed4000002280000022400000220201e6e316633c3233e6a50d51d999157fc9fbd70e5215ab12024ad8b3a06a2d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e4b65c7d316571f9ba9aead9ed0c3f21e9acaed7a821b210d979c60ad5e408f923617e51ddbc62c3ba5bb6ae6b6e545e6d5ab8ee20b77cbeba1861f2b74f82d304f47ed60ff9c516466e46af368e3af7f04fca0b3f9bf82197a1b3a3eb7b937fa7b2687ab60b4bc521ef6d6e6db5026f142c48f280f8691f858a79b46a2e1d2c8d4ca1d4006931dd1fdfdbb12bddf1f815b451f27acc8adf67d405ad2aae37ea3ab73a3db85a09c9ee82c6783029428dd23990d8c63234be069761384bfac1a5485f43b12327d0be7e53d05cd3a1618fc423a36d9c7dc85243802855b90ffbdfb14fc2402f9f26c7a711580f13fe44c5f875d87c2599b33c326b77d0c21d362dddf87a0ab1c4650c9e1209ea2b71f79e60cb0f5b6de6b867352915bfdd4fa0868bae24cbe3767995f18868fe33026d6c4933c91c55f12be914d8792c42732f86315c7a1d2765f3c54bf5570ee620ab5bc36fa5deeffbea66bdeee1d8c1a42c422068133f5f8590cfe4ce209b8a04b03209d9fa6e975e77eca8650b508f999d2932c1d97e6ccd0b417780a993be32aa0961e5c52c3c0284be590da23de3b59d71c8e9a41968aebfa71e35846164cd75310c48c536761017174ce68a925c4b8e4000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012330632eedb2f8789390862531ff4fccfdbfdc56f27807d1a2b5f4fd9afd95c902168240e246b09450c70cd1c5808dd6d9b6122f8c56169e7490cac336bf6414aa20c4f23a6ff540d4fa2633eb56977c322c423aa4826af8ce50b7fe94ed7d149a000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000166ce8dfc916c719382357002a0a4780f8fdac6eee53f845132a077483b7742f119533c67445476c2acbf5979173c0971d04aee90729ae56c5bff73b9c641a43fe0ed4be1d8d21a6562404971dbf39529856304cc3a4e095dacff6c6508f75c1f78a2fc5cfd9dbee326d788af0a260b56cb2913e1d490470dd997fb486ee6c6b7102e7716f3b65205c6a6ccb0ede3ec6199f2bee6a912ff344db2a751680eef141b00b6e443fa7b6c5cb8455a72f8d3b2749932d2b7a4cdec526a4a7d1e022705fa7ebf46333c4ce63cb2b4f497080c4dc35d01c3cddadbbbdea1b6b6745de995c698301427f59ccf090748e93e66e0787cdb07e3be4166814455a22951871cec61f654d66989a200044bb038337196dc212b6999fb42a168a21e20a3e81f2acf3fb9bfe18fdacd0597e0bef034caf7bd2bf3e13c850b231b21f4bcf1fb68701a46c78ba50d6ec09b22c0a48ec3954135dd4e404741441f7d337c9c1c0287b7ab3ef6525eb4a47a31dfa3b67b9046be9ea4bad280d4f367bc62ac2784bf06e9c4d4c74d4e0dc22e3122ab98d381b8b639f1920371801ba5e43e156ee7f3c8cd6162acde21ae7d9656da6f30f90a29987685a66a3515495220765335985f4c742000002280000022400000220183d9d302a9b289eb6bf463eab4d429f088614cbf2488e8f39f005a371ac73b900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000295cfe5fb4d3b9dfeda0aa702ab416534031a9244484987ccbdc68fa8b525b6f5c71dcaa7c9bb177739e5ef56356e8efdef7088ace43822b920b15a3e9ec64b731e42a4b311b63b687bddfe78d057a17963644e689e1e4fd6566ade90ab9a9c39c0b028ea02d8f26fb734e5a92a468c31921326cbe690934994f64519ed75d4c7f31cdee17dc1e8bc2f48aa2649c92280dfce3ad1997a85880f239d1935dee396184375b7cb0ca7d894c012ee009c55f3dbf6e3b1beaa1c915cc8c52d55da50d8f6d9f3840411590a2ea81273a98e31b03315d445e8113a4e6fcd062903bc0bc35bf39d9d850caf9955af0a5a5b83583a2d873205d69ae978e592773de1c1202e2436e344eb8c151bfaaa13dc3804a16bce528ec3137062c556bf080baa3ad5c14a1c885f6c86c0b21f3418a8ee2998564cb9d016f28fef2592f6d590a509492829ba9fbf9198a197cf195d2def6802926290cb436e4193662e19c110f6ab6a93663ed8d53cdb8d1c16d2ff3bd12ff9e75cb771c190c57c7dc41565c6edadd7e26847b68d2cde0bc0fbe926a67f46cf80d38a132a7a1d5f1da9101c857381731a9b704cbfa66f1c76c02b11b5d19277f337d199d12b92d1a747329ee8c012d2e000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400117a77e9ca7e768e206b44835b894a0bbd114fbbc1e1b4712974a641e182019c30216a49ccf14fb36bb186c24ff7b08d8079e2616cf0fa038e081917420c24f4bea21e0b96988c95a4e01504188cfb2793ebd42cd3227728251b2b8d9c025b2e7b80000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e70082843c3b317432d9ae4b8489259524ef7c062412b75fae0be9f66d675e1a5a43c17990b2ee9c9de5d58b54368fbf3dee61611108ee5c81b94d1a39511605bd4f94115a57bcdab404cbfd68b84e56aab6a58f1a195cb58fbb9e7d0babc20eb8d0eb0f642de6dfd6d33e5b7123175f28d4757284fc0a00131bfa68708b5a6cd1a818e245a7ecf6895a32019c1a974071716991d2891a76178a4cc8bcc4fe1759482657c4e5138f0ef27a6c655490bf62a043fa4a25e0ed3dfb9bc59333cf685f440745f9219d44b340ad87ede4b18b9ebc7a8df8bb99652bdb02a0fd43286c695a00a9e2ae23278c7e5d55b64765fa24bae99738f4957dc791b9d7e24c2a11a3c5659a3eb91bbaf48cfc2adb852b5a6169fe1398b7c2678ea63f842c745f3d758ae7039bad104cf8f95f7ebdbb2b677296cf4af8ef3f47716f2109a9b241f95360a83bcf777baed89d2fc32c77311dc770812a378f7cad1b31aacc6e70557be54bc2b7c3dfcda35f6d2aef5abff45e4183c942671dafa379fd51dac153453c9516e9bd42eaa8c238f445d9b709bdc0e0f12f437f88100fbfe3e6c2070c269ef925dd0e96f7be854ac2c35d670e2875ff102a69a7abdf0d01848597511eec900000228000002240000022006b595b714f34ebae4f9dd6c5af54d3bb305c5367cc0f4d871f8c0a856e6ebac000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac4d1ae8e1703f54a7b6a9f3b6af3eea2ca00c85f8dcdf4b326bcfecc3a37c786a1762f66e312394626b315f531fbd93a58957c68623aefdfb3b2a3b1649258f8a19d305dd1bc81618053115cbfbcf82d84b9e02b3a2c70afb10d852acf54f111f18d26b68dcde6ee326c64cd2481b43dd3df7893c55293591cebcf7b96f2ba0eca8d30b1a58cb030ab2eb57fd5c18773b8a7a3bb2da842497dc564ec451363071bea47b9e53d62117c582cc6a7c1c11a3dcf17577f625bde097429317c875d9728734a0fc8f7f5f7a13dbfbde145c166cdc069f77a5bb639d517189ee6ab3f138d711c902a349f5a5e08b5dd2276a9ae9dae40e4210508c0ce45793dbd96a7d16639313891078481b912cd488450832f4d3369c96c7befc126c41ddba0fc62a1c1c16dc3f65f038e98c83c6b98cdec1788655edcbbeab0bdd2a1f1711549f3d7f957147468cd791723dfd5de875e9593d08ce2c53cc201cf2d5307dae7e87b4bbe283a51d03fd423791179791f93f291dd3b506d7ed0946c8a7fce5b7b3726c12065cdb740b351fd74b2d55478389604d946615bb4d5db48a3ec31499d55fd4545f4477a699d84a346b01e013b4bcb60881e7b30d7cc2555ed48801a2b05e2000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011b59a024ba2f7bc1ab0abe3415bf06b13184402f583e823a0d1a00303eec63030217bdab39fa09837df5ca3b6d4728ba840589eee9ae7364673fd16c332df5afbd1aca00ac66dbff69195ed25fd812f7d80d11895273466f486de0757e388784ce000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000124bd35c8efb025b97430ef199dc6e62183628abcb04fb875926918f43dfc4b73914b24472021ec05563d7e56ff38c95aa51c7bd6d4f4b06ec906dfa93c31807842a2b3f52eca7e713317148fc918ff6d1269a9dd1e0dc2ec836b153362b108ffbba096342704f0a1716592230bf982a4ffc7b596df96dbfa7ebbd010ebf6a8823664c7b45d4c5d4725a779b5784316c5821bcd8930f18b322e4d08a2b3b0e74b4f8a61ea3299780a8baa969f593c74f1f694e6b6ed0ad6151e5161cdd5c150182f1e677b0353fef7d4fcaa5b21ce4b5b138df17e438cfba60ee79fd6a1e74f6580388de74733416089425fe0ca9ea3a9dd91e716f8243820290d2d95d71eccbe6142c78a39b0ca47d27ef978268951f13bdbbcbdcd4a9ffe7b130fa20d07e68dea278701eff790dab71d568a91bde687cc3807dec6de17425704a12cf4382f0bc1032cfbcf59569d9067f75ab207f44efe119c8135a6e0e24e987237e423067134fb9272f0fc138bc4e1646a3e6a5b782c3535483feb0cc06bb5c58efa7e422e5bf4fa51df578e4cf6418d5e0d5710b4eee75d502717cb1245771b51b372fb9c18d1a967324e6bc27e2002eab2fbdfe4c306fd985fe8c633068138e78df7da700000228000002240000022012fba9a490308ee0398449df77baea2288539464a19976f076a06bab7e57abc40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010f54be6d3b23d9948941a791eaf697d4434bdd87f881aace7590b15dd80715db01e834417a61ba793b91402e90e0984e891213212688de4654b4c29b221b8aa121e58eb7f09e1a22c10c7a412f5a17818fdf5274b90ca0c9302d8d132cac7289e6187af33a119b8663db2afe8f5301400e72fbf44e022e054d061fe609090af4ac8d857a67b590b9f96cb789259a53913fc4b74858c9069b2b95ad29df994e9dadd342dc5b991eb19724be6274f5a1fa45486180bf80864a7d7ac19e401fed1643a4d383febfce2aa556bb176e712d40509f655f90cb2fbf890d8a7912bd3eb2f638515dec8add9f2252608aec998ae1bdb03d4dab909c177f0592a1348c79fcffe7254cb2e5c36c76dc3ecad1fbf1814f289f1d2289fe79aa1a23d9c4ffe22710dc05007956fa020fe202976d77129322a04feafe478bc7161d0effac7fb040038c305b7de455f99df814b8dbaa79b3fe12b237fee4df5f0b702babf6a473c64159a1c45a1f764ab72b9f2493c029e338e3d01dc96937f89c9e945fa0ca8c50397817db9bab5b9bae22c332e654b5ff63108e24217dcd804f486996436fa1d83b690e6587f26881bb6e4871002faf9b0bcaa0bb4a1e9f5dd50b16875cfcbd2000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011a409583f0c85c237dde8f807b1a19d4c61f37dc09eb2dd3b0f29ae3344c23fd021abb4286986b180855cf093c060676e6092a98d2a37e96bc1ca8c6b9d4d6d93e1d8772c3fc9fbb70c4f1840578dff8c660c0023c6034f0720318c51a44e65e16000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000986221cafdaf0e1465d55aacb27a12e18158696c2ec4e770197477fd914d23e5eabd91a5907c2ba7cd1a679d893f201a904e4c8bc7781008f486a9e4ac9b06e82c618d0cb20ab6cd932a4c7b117545098ed9398c45e1ab1d3c9c98314101466bb10d4546237da145d63c518e67658c7067f37ba2b09f360ed1f61e7cab0c4b32075ea7d2598b9f14570174bf278f0ef4635bd7a34d0106452dbca333f6db917d9af745814739e24b4ef97a8f1ad198026bf161459f91473e02c3b785f6819306a04d2bf209201e03fff6ff2e08164f703f121a2db0699a591fbbd223668b6b12be917ae058c9e115f8db3d5d2937c2299c471d3938ebec80c7cfdac4832daee6b9ccf02be9befb19ddb73525f9f664c06c15dc2df889a41298b9743514abf645342e510eb65b0821d9f3debd1acef128f7b00117149b47367c672a66736f144259d1c44aa29121d3c9603541cb169a70b38949571e08d93b148446fca2f301d65446c3ee84151574c49cc804031708dd0156e5c4cce54a5390eda23db71981be688731197907c5cf562813f95e5e789aab2ed581839a1547354e5b88a58494105f93dff959a9c16f4fa6b6e21648971794b59514514afb03b085a6f67ec5fbbd0000022800000224000002201df29bafbd72042c3f51f2b752e8d5a139fdc78e3d5c2620218e1fc49da6d4330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089d39acd1306f8e5d4c05356876a1c7404ce02fabe53a29b36760bb17df3d76840849117c9e796604ff435e28b7696d9f558e2b351a6912af1954aab93aedbf0253c512d69104fa81f10fe28afdd564734031066e4e15892a06625689f00fc28c315b15489d392d6aa4f70d9c843574b1c083194806e2b460bb0ee116789644cfad7ce5561dea579d5fc017e353457e891f04d10045c42836a15a647929594273ad97e36d362aeedef9cb2b02db51cb97ce0c186f034f1d17dc626e3989fdc747991968e7ee5c1713df8beeddd8db571bb2abfa969ceb8d105aab023894fcfd24968a246d4a2a2f7c774ea1ace3508873e62159acd1e3935544e4091afc4493312f388304dc5812c28cb31cbba27a573983cfd41ad4b34cbea9eda41faac703299bc487c3de995861b11ace6878225f4520ee11b714ed9e9624f67dc1582b3c1753bda3c0f63b1891876e2c1b5af8bcadbdc60d034868d3bde71dc1bc65df13d036d545cdf81ed2d10bcedf8eaa3e044ed4f4d87e87584683807ea461c691ee4034c7abd63f4a99f58f1d05b21c1aacac9bee3da064aa3152e7bd8592ba076cb87a7a61366648015b0a6e47869b4ada56cbd3e782188a8e978114ce843cb95ab000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002275b12e271a8106626f139e3abd683201ba533d814af34dade7a6fcb2fb17bb6115c7dcbb364b323554512c81b0dc8fb970cd0bf49b9d5882c0d14d43dd9d2a8021ccd96288824c1b16e691188ee9d77a5213a900c817d4bf4d12f7f76f43d68df0101d9beeba388b7503bf39f587fbdc6a175b478fea6f5318c6f81ca4a959c7300000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008fd76d3b25cbfd1550dfc3e99490975ad49405ff823870a725d1712bf7413f95e89c5c91e8cde70a8fb620230eabcc0a0541bc3fb8ed9c8084ceb4042685af3544ac655dd41d8992820ca040cd1b730adf25b388647b5f82e34643fdab31ff51166ed189471679d6483a34613311c01944ff9dabaeef8cd5141458150b4ca7ff66f9d88d3a1f6f3088a697cd9558e7bb641d45bf47426ebc488fe1cc16d1bb838ddf41b87c4d927dd48cd36237a295dc6449ac663faeae6368d8c51b523351f14ca5ad617bc52bdcadf919095ded4cb18044bf47e4e11a5d213d67f0977389913e916306e243ac0e54517d393d4a4a741c897570ea76770622a331e6060f7ad80cdfbeeb85ea7c05b0ac93ae6c34d56f78dda1a8c2229038f244df767a2901f23a4b9fb6c20b51d9f09eb02eef1a7d2617eb1114551c4ac9734b05a5c88a87cf7139cfcb051efdc27d0900af7a99bcad207c648ba18b7cba61bff9da190fbd5c3f6975b1148f706caa7961cb6fc671be42f98a6a645662e8b2407454e9ebc325dc72b74c940d220e1a91c45847b7e77d20ae78e83a8eb964e42c04c784cd7ad9f277cf1eb07f32a758f75ccfebef179cc6929780141d2f41f7a577b65efb750100000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a43ef0e8be6a62d55b2dc62e31af0cdccf8df7791022cd27750296e20ec44e53811e5e3dea80b339563f7ec65ed57b36617a23c28b26b5ed82227422f0d90174785c0a9497468cb0a1a9ef2ca2de80e420aafabaa0f1447f96032ff915b5664165de3e79a74c9745bb76b143822223ddc76a452b12bef8706297adc142d0930e63c375014ad5c7669519b929009727e00dd60a3fff67a63238d040944699c10224d4ce9e4a338a23220fd564d8bcd38a9675e0564817874837fc44da5b471e97197edcff49ee6db153f465dcf0f05dd001e47ceacccb14ea8eefbf73cfabfa5d9d8dfa045894d9a9eaee6519e27eb08afad5bff9c118486a3ab1f25aa7daff866b1cbcebdd9832e0ddfadd8b0e2fc9a45a6fd919642dbdc676678e6b44795a28c6b67242ff595552f676de4f21fd09f24ebc8508f8452092d7551831a8741f2f26845cdb01e1a3ee737838107b77f3cd675c3be8450c0f50bbf8a3284cafb98df9d27be456317fe17d939406aed1951a032f7cc61c0f048162f35fc3f35064f077cb2a2b2d2392958ffdf00494d75105c6e799be241a14b6130f2245b91ffc938d369757f6412c77ac7db8d88850722a08e37098c33bb60f028f649f761f80000000228000002240000022009421080ed321394f3b70723d2a1605efc4a886bd0b8f7239b48d512640e21d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000282d027133ca544539a29893b6e3493b555c7e25e8fe984de7444397630c255846b85a81600cce7ee30b2fec2daf01c3faf1140b0166da2a577b01e1ee47950018441587092fde734b8950a600f22fdd9ca72c56ff653862285db1070ff5424298cd9ce778af17723b8730945b376a0ee486df166bf9c375230542c88c781d4a82a01f5fa2b1942db4ebdaec4b8cb6f3cad53b745c81795660d31ef4310691b9b58bdd33a9e51db84faa4d9f3bf765840af47526091cf16f17e5719c9297bd4bf8125d79a51d60234f271f114fbec61768b99c87baa8362f1ad865c20358e76423a131e50443ae216876ace560e56c3b4c8d2014821f0fc8ddcd8205deb320e31197a44624e0c0f42683995f1f518dcfa77824a05939187e215c2ecc22d132d8a7bd3d8e444a3601ad53ec7cfbbab9c52e738a7c92839d014b8aa5a9fdca5f90e557326cb3f7db4d60267e3c080a5bf8387eb517ff8b0fc77db651ddefcefb322062bd4fcd3955577ffe3c68092945a401b019534f543dba8a607204b0a45562f27e25f5ae2f3b63b66586221f5839b86562f25f3071687a8526134fb74bd48c06e6b5d82ae57a67dbe35a42f928404b3125c9ce8770f91c702f86e8472f8c27000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012ff8c8bdecf4e8fb5b7f91fe414f9c8bfd5a4fdf22f0506180913628b68d1f75021d9ef76651d2b6dc520718ae0e584b84e285d42be06a767f7861e043a1b24c3918756901990d525610176039cc7e69741d76c0c98531630e17e170b7aa7f836200000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095547d185d8445d34329f3a1b00333c4acc52ffe1347c86062dd2b9eca7d644048a3c02d1eb0db8d5244585657ffc3699a945eb071450840401b215d805338552df731e862a61cea4a20d0449caa1f427d3f9fe006835d7e0f19320ae98dbdd4e5156b84f487d001180d3be790410e8ab5d28e2891bc4ccc6e1864efa57930d7ff80b6c25d5c442e885660beac6fa0a1c7282b756e0a3f18fe32af44cb4fdf5d534aa5bfb90101d514c29774ef2290e822310703c6302156c199e907512349b6e43070a36110e86eaa5eb4bb654b6f5d38fe98bc30361f709f4c1e1642c05121bff829cc2f18d4938cd80dc9d7cdbd26b9535f1458c97cb374091797461def5e8522a258ba360ad0833798a122916f47fd32ef4eb63d14aafccecf2ac88c7eda47d1258af79cc45b0942ae198dad36a459e4c376e330db6ebba069bad0627c90dac2980384d897ff691713a42cb87ef85095496a2ddb023236c820a6a20126c3252e2b64a033f4acee3de116daf14a6f3f606dea9a7a1fc7c1450030829f0c6c435b5fcfcac7bd19baffdeb95ee3007d3c225b897f4652e8aaba0baaaa2ecc32d0a51acddc5f5c4ed9a28302927edb04c9e52bf3fd24fb05d69d37c00316d3b30000022800000224000002201ce963b5a85eb828d5388e2c3a1e60b9c25ad15371491c7ccc829815c8410641000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d9a435bb5d6827f9df079e0f3c14a9dc928e86794daec254d18d5054c0091419c00ac6af95923f339b789bd77588dca8fd28f4001353d14b15b23f23a00d761ffe8c443e073f67e4c4c2ad6dc5f9a9a83f77b49be241e77402fb5405d62505431fd48323e2cea5a627007d22eb1a43b01035050b0b6bfac9fadfaf9ba702a2017ead407475fb1f702db7385f43ef3ba961633b5c40e720b5bd2c20e342995892bf1953eb8fdc4702bc9203dd144eb742c0d0680f63ebf333eb9bb1bf1c4c2ec00efcfc83fb1b87dec4de9678d9726cc596f634bbf53140f3edfe4293f68e231da326b8bbe379d0f24ad3ae39513058f1e327627b44fb1582d727e258fbb2fa46c91b312d7a298a3fc6d1701b356e33655f115b3cbbc2bbac1a01be6f72888bdae0185fa33eb075c5cc0af9bbcea50a4aa6c530a2d23c3048f969fae97e4138319070dba09936809ff34de6bf3183c75ed07771f5884ce64b3b939b47430cbabe9c6bd91b32e9ec18692d23a804009fe6e703dd85b9c42ae39d23d8ed10a84d1b0299c8775a4df250d2cd79008940d44d6e61972b43caee9ebc2dad4577a2d5eee889517c18aea051fa75359174809cc0de40e813a84305d061dccc6cbd0dc9b000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00206dbbc6c26fc3947bdf9ca95ba3920ca6006950e5cd0758b4d75be7119315ed922cbdb054d07bd64aac29f22eb551ba2286c19fe5dc9f17ee7073ce1b3555ced021e3d1caa57ff357eda873adbb59546f874646f4b9308f914ac77fbe45655445c05ebdb1c6116dd04900e85502864724b456c2a8bb920a51a937fafbb5945901300000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000863e09fd1bca2e4b9270129d491cd2c7fb44379e615c7503ad1775f26ceb2f8621e1127b3ec0aec9861ac39e2d2343214025c96602ef72fd751bcf9ceb9b81e66c04960b83e8a660746d45419059840a7d6699fb87374c6a10b157b69a7a6fdb4f74ec7ce31d220be36812dded87ddae3d8164ac0a1f38ad7acada82f94863bed61bfcba6cb2ed764e13e3b1d52e71d73f5e9f7cff1bc9f8e5adb25bffde460c4e79ccf41ee40356885698e4f6728b10f8f794c3621aa706059f5cc89902d621906a20714488636546bb533943aab71dad590c8de1ba09b63821ffe8102c1045e6aac3368d8c1ec66f352ef29438b9fc1484b41b9ad6d052b609fbbf1423656df2fc6a2ce4ef1f9d89eb3496aefe5c5c7e02bf3463f860349fe965f718a39339fb96dbd1574e6e44cba37ec12dab57a56aeae21bbc2b0b1ea2392807219bb8f1716ddf210eb394913479603a3d5bc17e093eb4617d3b1796e7f412a0f1056e7654f11ed54071b626f83da585af4e0d907eb1f605893c4ec1dd5269f0acb037c24f18a7f908089f79e477a9c9decf74ca352547a83cd6d4f31d7904d444fbf205c379896d42a04c0067e126aec6fba34e5de1b283ee676e6dc595fcb2d18998d20000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2723f86db232a8a8310db73e1c97e60f17792abac9852a88052b1f30c9b69746c0967fdfa74a5c30132c71167a2787cc70eba20bd386574f404703699ae75bde14c4445a0cc946bd32742bd3a03cc715ae16b99bfa4dae31d39bd1baac4556c8f9fb5a9ca042c6c42adb44380386e1281704dd7a9a65de2752e4efe1842ee631a8efbe1f14b65f2bbeb19e822b2d979c52f9228f118592f4b9719ccf0f2184f523ccd357d10f521181222dae3d667312bb9a23fab04825f1394460c1da4a31e1684e5d5e87b424a2251b51fbcb62ceb8dffcbc730e07d538da5763f0131737b6641778b90ef99e4206c75e167aa711c2c350bd52aa2844a5ec03e8c6a04d580f2d921256fa8fb08dccf99183d3b28f60504f3b49477103b1dbebb76d6d65df3086f5a16877be70d3f2edbe105555ac5bc98093a428b34509ccab4b78f0aff7878727de559a129bb046be9d786fb9a0871319fc0d867617a6a7abb3121267cf501f2b0886aa16cefb18bb9a0e8a9794bb997141393f827638b6f2b35ba41cdad213d3f0f489bd51e88b59d2b0e9c68b5e450ddc938b3f7710a0a8865b69706d970e7476a651e14c8ad9440fe99b3c874b6b9b8a349b0cc3b25eadfbf3ba870b60000022800000224000002200bd8fd595665a775606737b8e8669cb3f42fb867b548d69a5753ece4d25781550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b6ea2344a5badc678f296a00b2cae93b5d9bf123ca2d97a820d45741b6577605c105b90adb23ff8af785da167bf4348f12d012580ec5923461369523c0614f7c3f39d45fd56e2fd8b3149bed58a475a1aed17f3d91b15ad6ab33c42fea60c1f72923522ea77d20812645ee89219d61acee47d0cb880cf56fe3c3560c9d9a35a157f1beb56cb67e130cf6e84d151b0dca749cc56738828b48190a64bde1f99ee155654e80fb9f21d453918431d439a1c084c0efc1f8cd69cc91b96d471203a129f936368e0d7e0838090318069a34dd613ccc3b3b083739f4454da4706b1b34808242cb8a47550ae192cc2c74e8fac0138a6c0b73a2cf8cf8f7a1bdff490d4a207cd6898056ab82910c75679dd365360590449ffefbe0611ce5b38c2b8d6187bbaa230098fdd489aa9aad132efd99dc7fe4043390d7b4693d659df8b3d1b405148a734d51fa6603658cb81e6503dcc89f172bb6a7fe94395abd01e44b4792c232a36368ef24d8d236ba601764c4a55270ccb2e9017c9282db07662d7fde558145c5ce6be514afcb5b8f5da1efb6ecb1931a7bddd65b14a090de69e8e9e78bbe731dd735cb2eef6d0acd93bb056b310816fb309ca4f9113f66ff0aae8a2f00ed000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001001f57887a1af574f0e2edb8008e37688c0bbeb15bb66fbde629981c864ab24502218f41670758f731361ecbe80e84e4ca45161cc328834a3e7630446227fc1253277acefff71b7268ed67da6c5dde7453b8b6d01f619a9be9783651761f2432500000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a82e9e60d14461313e91487c4b35fc7aa4961fa61e4a11d4fb139d20cbaea8adcca6e0ea273936892ee6ea630f386fa1304a53308da7301a43b9b9269e842a23d5e0111bf60529c16a3404635260a6e0ffa7dcc6e4e57f22cf2d9f5d7254a10882c69ab48192d87b3ae569af32d11932806c5090299e52ca1bfbee7ad580496b8fa3298537bf75e6c8ef3428e2e49e185a8627ba1eabb5062c7175c0fb0369f6c743e8a903d77c7c4198398c0f1539efe33348532435fb6ae21f11c8ae47b4003a4eab6b4936749e29b29ba7e9600e5a88b024cc1be3cbf03084c28a9b6d4488dc56dd9bb3f596cdca53a8d39aff0bfb5036fe86a4666bed9111832e4205f13e248be5b04e4906a844dd64590e5d62161281ac1c4368055215885321be23560c5331aa3643f44ff35a626811c662a976b0095e22271c25251a4c3ca43cf7c1e465b564e06e5eec1b5bf72a35066d5baed6ad6e66fa88b51c15bafcc1159789bda6b004cf832c79daf1a0f1029b999e163c853f16e45e91562b36e03abcedb8e8dd2c01f09c57e0fa3318d12fa829a85bfcc9e196cec949c54ba2106473537429863c373dc3b859383d7e46ff56e2f72b44553103c28d05fd29f13a37ed38bbd00000228000002240000022030550e70197a86233991474ac20966ff69528a6b1f3a3f6645aaedefb6bb0b6d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015a172c3fb575da8d2b63a9aea4fbb0339f3029552d42d52db2721b0cc4c729853060b9709032ad247d3553dba7d6bc7dfeb283ae4704ad752d13ee472d275a292d7526650ac4f957f522f48d6bde32871c970064f746ad6e46a26b8c974765481cf6dc5b9dbaa3fe10491eec0f3f01fb812f9f37a6940f05e3876017d30a732e1efdbdbf4e5eb47cf94672b2d66ea20d69ca8cac9361c4bb51805f1d47ac07c4e6b11085c3533b41978abc64d31e96799c872df7c245f3f572d9c5e8e86febd073bf1dfdb2ed244db5e6a69b2793b1f20df9c00b4bcf8184d6a1d064c8b9200fa485de2bd18b0aee7d51eceb34a49fbf5437ec2a0ac72e8f96d84a3fa422f68fff041e922014a991b67d11fdca2fd58ccc4155542ee9ff9a93829b183fb9eea29517c6896193b83e82863e884bf8ecfbaea689237ebda7bedfcabbc6b49f95419e62b84d4618cf77aedddb7c7e861f4bb0f3880eb2aaae240f8149fc5e6fdfc8b0415db22917173c13fa052250b9c7627df88371e1dfa5e976c0f05f1e1946e6f7ca944d7948ed4dda68262236e6791633fd50958c13d6121a1a35546a8cb7f0f6a0f629fc0e92c3db7354dcc8781fdc767db2aef3ca63fd88199b1d51dbab000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00211d5efd8c308eab5638e5f07d6ba34ab607ae8a0f9bb235b0f6ce42c32271ac8106b945cd82e0044503945c242fb8e985b947ff0813d6f4a68d3658dd703c4770224c3e7a4d1de651dfb2c0567121fbbd9d4d426b82dec7a3f94ebb8d36aec310221193365eca59796e1b608eb2c574cefdec4a63d0ce4bf1343b41c92f297f04000000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001848f79b5a4d5c200898ed0f8acef8ff72e804299ae4189aa3193af12ecb3567b47c208d59639a7b6fb2b44e1d6a16647253f34032d8c753d9bbd8e1e74c3d939521e55b288460fbede9660a71dc5941e3de079196441a07103980a6026ca13a979aaa054c846511285f8ff3986190b385c72e9e410cb8179c782603d5e2ed07ca8a18c7a17df99f245e2544b89eb119c4dcc807bd78103a3a01a0b31a77b514b494446524cef56a4dfc70f06328437549eedf46689627a411ccff4724321c5c4f5df68afd5be370b10494b4ccff2b07143963e8559afeacdf108b1ebfc6be5c7fd46c6542a57383e0de2c0dd75f687b0c8dad95621efc7a472b77ce9454fc1a2b9a52fdff6b5d7e5e46cad2068535346121c91169c31dc31d5cd8b065ec7e977c558cfa8398b64f58ff96732dc5850c48b80459485fb61b7a1e7ad61f50ca035a8b2eb4d3317a694bbcd3fc5db7e8aa9b37a9a889d16d537a8e1fc8539d3c1d7d1fd0a892ddc08bbe2e1b650da4b042d91a16b05565ef0d1d1a17ed2b43cbf7d571d233cfec232a20cb7f814a7a38d1832d2aa544d1418a98302d44cb0b800085a4e3654122d1e099b3e392c6a876807f761c8a8dc53834443f5dd709e86c1e000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008bb9c921df64b8bb9d70098bad8386ec6d3c9a54ff7e65869388ad9f1ae2efe4d5015687e24759f864774f3506a0376cfaa6c4f483fee5c22f2e54010378ff72e5210557c1807c85313aeadad93b2df56aada25a75a77d0c27c703c95c2de18188ac4d5671955b09c6a3fe5e318bf21408ed37f9db7131072adcbd3193deb036f890b106a7e1b2bbbc932735ad5f2d103c740e444842b8a758ed963ebb19c4b2c64cd72ba5fda470d5572e2021f65a24cf51c537f2987f5528463014bfb9b0b17f357f82ede97d89ebef0f9ffaf0e0fe72572f2cc1870a788efb47841afd231166bc993222a0c6bc505fce1af419e4a8c4b8f14888364a115dfa827c4c33a009bc80445f28e93ad3d9916b762d023a6462c56928a5bc61f93916e0739cf6efa604fc1f642d810ffe9357fc113bd346b0cc2cf420016d9c8995d766f5922ff90048877a79f97e69a4d00f67349c88d2d573c0327b43dcb0ec7bde5982d49b8191e397f17d42ebf1deb53a08790d12bee75b5b0b906599de75847bbc89f0b192b850070d3d0052561b0277096f1c65ee01415baf06ba68b47c9f25a80a7b5fc9f3b1f528631ed49bab06f692ff61fbd48b9de8cac8e4ef6324e651dcf58592af600000228000002240000022010508d25003dfd22b3d109af4dbf2927e34f4dc499623fb07560a3f2b8c2ab8f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adb719b45088573ac6ce848eeddc87cb530f890c51e8a74be96c8bee8d0a7abe80b0a914bf1db95f6c9be252d24f2624d43919f37651e7e6f58d58668db6f2620950ae8a022858d85eba1bf7c56803c09a7db40bb526ccda1a94e76ad8074e9e4af1984dc7d8e26130e92462ac6550eb8dee7ff4f23bfbf3a179f53b40e365db60605f4e6b2077c4eb696f7f64559dad4e664b2f363535e21c5146e779e5eaeb40940e79c48d3721f43d33c7fa3d22dc6cb0b9340e890d5fae34ca1e8efd1c662aecb2ee9fcf9ee0a540c6164c7f3c4a5b029d31898153b33753b918e6d75468b497acc988ef1685b35f656f4c961032383b14b592a379a2706e4b55180989a1dfc7a7aa28d586ff0811dfe4b41492a1c8f362ce6f5bcd293a43cc18933b2a4eb676d5990e71b2985c1ccd0ab3a4d49f958fc2c1bf88cabf3b5dcdefb5e52b2a49b019b6d7b35d519bcc6808b0f5c9524c26215948901f3c05746366bbeb3dd2d5aeeb3ed2bdee023cfa37f39ba551820023536f043db2d199ce8ee9ba168305a7f4283cc5992e5708ff83cdb00395584b60667fdd0500cabab4e6caa6ec8ef8f411fe1e002f8be82b23c9cbacd11dd736b0916d2afe1c784b07a9a65fffcfe7000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400117af90a659b161e37adbae13d8a5ee4e6046f7001c5235105ccba1ca0494a8bc02263cff2591ed0eb8e3995558cc78221bcd7b82b25531d99e2341021a4d14732327985420c8996c03c800663a73d9668e437fc366c78aef0262fa1af5fbfc7ee00000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e2d84c6727462db0d86ab4c89d2ebefe4a18219df6017963915825bf9313f976d25a0886fbf68946ef5ac7cb4c292fb52587bfff7efc55bf3554bf2077589cc7811605821be421ca28bcc8646d55fa3e0eab845ed0829e377e2214cddd166439bc7bef65e60f4d325b23988f313a9242f54d03bbcf14df83ff93cf03abfd7af1f248a7ba40e0a191cc1a527ea4f497bba9f381de9d9b0047870e213b6f637e508001ed2c63e4e0bcb03e337bb4c8c3c508e85f67350f7c5d7e0526339b09daf1e00e051294820b96e61fca92c3e9145cb54faa52369603aae6a52c83f3bd627adb6dc93dd4810951ad15cd7308e565112d0ce1ec7fc73fc78976cef984232359f09d0727ed76870fba64df33681f06162ab3eb0f10d711256f1451a756d86eaca55b0733f27e647376ffef79aa2716afab7484009f3084c52c74930b1fc750e667a82c3129654d71971ee9a2b57aaba5ae76c95c84b047397bddbabe72cd8db04906b663cce336c627964c5a16d9cd0dc5ab4127ec6367750ad74d0d4337ed7eb791d292490dfc2c3f9d68bf7ed4c0af285eeb89ce9400b8641923dd7588fa957243039f279286b16a0e66d64d3d2c405cae86a0f86a052e8bb3b107baada0a0000022800000224000002201c14941b710a2f18edd20ab9bbc5dff1f5443110d886589e77d548cc67a7b27b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae8277c4a83cb373496385568fd4e7d5658a5d07226b3a6d8b0ad81df4c3464724f910ea7c9ed167179f96d2fa71a82d18c4c09274dbfa658396a52bee153639874a03c11726d01d20a23887d7811e00e0ebf0b8ce4c18af478cf61050ed9d6ad49136a0f58205e4bb53e1dec62f9308d7053fc5f07b7e0a6031d6686e9f49f63d01a3a91dc463d15173860a98f4adfc8b59c409ef85ba3c02814f0925b8c8595af4f36345c2c21bdbe511e484c21aad0a426a7375764a3b2498f5e125454acf369f1a258249fa2efa0030c8d82e31bf36f1a0c288a0a476ddb65779987f6053c14cfa79a2038d59cc6041afe1daa86008d535303a3d3a6fa2b955d58300eff6f09f1d761c861eb9040b55c4af557fddcfdbddce026f2b614a17f20659771787cb1b08e16386a23bd6dda9d360f8fc1f65119ede1f753dadd4ff6fbf505507466c7ad5179d4e921d84641169b7dcf09652a47bd6ca71331c7b1858800cb5e9bf2b37df493fe8fd779848f91b57b5b360236e07e8473c8f39a2e1b9ad0c77983ee3825831dd2e478007eaaee8f796c627209d6ba319e523af824c794ba9f9e8c7bef43ba9e83576f7c1398fa0c5b8f6ccc33646bcb129a8df3b05d712af767c91000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00220264a23f57179dcbdfaef82f7c1dc36a8f92b9fe041342ea43154cef0a03aa92b7e71a9d7e4a324fc97f9240407f2e8cd62681e60798ecaefa8655bce64a30002290c8a03a5223bd3c6aa7baf4fc5c35e0258b750cfa02a1ab32b332aa9878152169e461e400b6b617c2896eae847c8f237524d5fbf84dc8546627467163049d500000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c8eba12bcb20b785ef1ac2e85677f070b6dc7c878d3b038cfaa304b6b211ec9bc24298cc2dbb34e26ea2d88676ba3ee6828d1df7cb183bd2103cddd47d95b84161d55875da51cf691d6101cfe24d6bf3c13276fe1f4c37e3fc74a9160ed0f36cc36b18025dbb0b0a4838daaad061c2d2ce99b873ce898de5a959c45ce76f7918d5ee1f5fc2afff50a3adba9e1d53e30db3d77fa8a05e990fa2ec796310b0e8a987116a4c81ad48020f960bafd654375d25f05a5a61e895c3e482d2044402e2279dcc7fe712b79f114dcdd4599e89ebe3b7ee84ffef3c120d3fd6355902ef07ed576feb5f588a734ee71344ebf2b2f60c1688158712a30e5a759092a10c29d94df1b9001f42c44b0c02fe78f40b5cafed441c16da0fdfcd8ffe073556835492897af7558c9979fd42e85b4e4adb796e8636c52863c1b1d78b2234e7d417db114500176a9d668a9c3a396421e537127cf2fda883a7f5eb539e25336b00c9c811b0ba2c517abe08bccf5aa0e39bc08269427244880e80004d33d682e6e46c85982d081060815ec390e628bcfaf5d11f20837ac6842d808bc114e33fba85cb663412a2fe8bc4a5250a879b2982e4d801448dd01f098b9de02ff2d83e4697b0f90f00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c1a3b1e0fec29b212b00bdfc2a754f6b51a3da6e1cb7f5bc966359632ec3e308513359a0c40eec0c525e5c56308fd47335fd6f5cd506f3a2d6961e6a033c266555bb7d587ce103d70a1de8587c4b24c03edf0a5933f3e4c38e05ad33458d7b94c28c3ef9180a1353e04832d5ae34fe57e36c17aa6121bf16678d485e329ed789c6aac0c4c40320c2f1cf582b9c78ab659924fe57116dfa3cfc5033ab209f77fa8f3a8dbc29c763b26bff45344aa3556cd9af9ebb68199040cfde476a6801f408f128a9548a41610522f531b24ee8ef28b1158942168e3d549e6f180fc9875637e005f0111dee8fa56943c88a2c513afea34a08aadf4a1bdeb2d70b8650023f0f60eb53dd2e711d7e0b0594557c0b97444144020260811b71bc70d8ec7809f944618bceb4d0a39fba8a139d58f8cc971d94147dc04ce768358c26ef1a940d8c50fb77b6a3651b6ccd63fe8e98d0d71cb4084b2f54b433498dd47dc05c46a2fe726c23e6262d5761fee195e1a71062d48100531b838b5d79113dbc5a3ccbadc790ab9bc8f376546219cbbd6c7ee95b257d528e562ab14ea6fbcdc2584293107caf96ecc7cf59919a70c1d073c14ba2110cd72dc4f95ecd25ddecad8717210220c0000022800000224000002201e773b0a2c4ce11b5b6d7190692c9bb684fafa34db192f985a0928a58c1f7f58000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ab339e05b375400c38a33529d62e211d32c5fa6f3ddc4037385fabf014b956e2d1909b2df99e0207eaf9f960c4783edf3858de6ad5e460762dfd30c13a0506a9b5143dd29e615e7ef55c2aef6355bf887b85d90b22a7e0335ccc7a9fd7b288302096f1954bdfb4c5cd61774456d3814c638a03c002c697150c82be9a2fdbdccd1894d8686b9f2ce4e4963ce159b195277e56760b588a7a00823f90ccaaf072085badde780c2907f9cb12f5fb1c1ec7f3fc9ac418c811f446c0f8ee6d3d817e4cbb173100e6853f0ab858504144788fbc9d500b1e2a2d03641daf9c8a7ad2e970370ff26220bd8e793d05128e22c9561a5c09277f0c606c20dc61533d04ed56e9d44f19d7cd96655b4d156b71a7be3d5605973e70df3687d001391a1caf41b9494bc27553e2b328f1b7461ab3e0a1cecaa755be0dabc91975f491456bfb0525dfbfe14d7ff0fc3d16c49dab37d20c672caa54d981b8c1c9255c1541ec9824cf303f637ad42c62413d5a8952c9baf5920782d5634a2932777683d067a50dfe0a395b84e1f8b31bcaeccf607d8b8c594a60c35dfb5a102a8a6cddda8923a08fccadd6effd27825ede9e38ff95ec530ab77c21737ae825627983c5f11c90725a839000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400103b14a88e64dd4256ffc7ce62b93f33d3494b3ed5710b0dfbbeaeea7eac2a604022b7c99b4f06c613be5d8232512d119bc8717b381aa3eaa3e5671882dfa0fae4521045ce29dbc84d37d48bdba2fe0cb498aef3f0619ccb24bac576c3f8fc51a63000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000844458aae871828a50a0a172d02f5c2713e4c4a954620e5860b707504a3b536c4dbb48c774c32481dcc17d2ec6d7f88c74323d0f21eb8622b8d646915abb5b9c0709d6b5e7392ae0f8f2be94aeb855b6abdbccec6afa702410813aec2702360dbb96825fb1155d85b81c76c1d56f56ad631ced29e4c86a8ca2b66c97c83cdf5c9fb70c7c50b22fa6319edf3b750f100520a885116ba83f2f6d5ebd05560800c86a432c19d3f0d8c4b8087b966def6923e95c5893d01461a934c871cf7ab195e4d577e433fda7997025595d1d0e7bea70658adcf9de6e14fa4d01fd93fdd1e161e0b0305c295fb7f211985f05842eba965ee924f8f98c1698548d1d7f2c71e9ad0f6accf16f0504141ab886b9aa84f37547bed2d2e1153a58042bd444621f0beda3526036c16c34e2c4451fa772fef9655d15ebdd65dde890f98cfeda8e357ad0bf45d2ce5e55ff370ddc1bc3f313478d586d8f6d6e408d2a1936a6f0ae76b225428b0578e0b01aae2d40e62596ec9313c6f59103109de35479097674145a5d664e7a5eaf30dca91d29f52442c6d93f994bb6ff8654f585cb1024d6544162009ff0d8ae21a04db943e4b16805463de0e386b940669c84f836aacb2d321b467deb00000228000002240000022003357d4a1dd6ebe0a9c64179ce1d51e5bdee7bbe44ffcdd051f170cbb93443fb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082aa066525700bf78f36aeed61e12e9a29d34c41110bcce5f6365156fb4aeecc04198d4074ba01025e4e863b3af8f9cbf7e8a538702ea3085ec69777037abf48dc54e68f3c67db58307eaf3fc79ba26e91ed5cd6bc22f5516b3362bddd59f514e9e219588a8faaf7b3be4d615e09e99473f4288ba7698197e57416f641478796e16f8fb43861e8a2a0bd7cf094108a8b7459d323a530c30d0121195fe3fac57526328c1f0fd678294be336f2b847bc605f415734f2a5bf964adeb0f3ffc26ac1f39d9100345d8c10554c16978af447907d7ebdd3cb6b9956bd46ad5601f130751b88c8ffce836a6007b6bc47266c13b3d1f480c9e72ea92d187903ba321e2755a2fddbf6330125ded99f6bc2db408eb7acffa4f154762edf94a8fdb97b20db3e31b44d66fb22ea22592686b0917dcb46aa5ebce4454d594fd8f7ba1dfcfd882f2f8c0f9fd5e0744b2a08d1f73cfb358ca55059076e7578991abb00f51b495c0264216d5d194d9cfde2e69ec89d58bff9b51d3665c8726e20170b224535a8c174ddb62f74194af2136b3dbe83b703decf2401ebfee460c723096b1e7d3f40681a3306477f3d956460038e7bba9fbf992b67c18c6501e816b91fbf3de5a5fa1be5000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010757f383bd1776d1f69f49b320d4c02a3143024a32e032435c823307958c759f022c532c7e011f5f55c624937d9c307b03a717d6f1127a87c8140a723f7546f210237e727cd34c7f738d70e14ed06871bb6e25312c34a6858030c3e9a7452d4fea0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f75751fb69be4a146eb4bdafc7154660bb95570addd37cb7c19a084753c8af0d9f42efc9e6202a026235dd91a9eebea9bd19921c5adf0439df46ada80450f10dc27dd56bd90c0d65237d92dc606ca65d75dced4ff18e24451e7eca621e596abbc54171053c9ddd1a9b6de14590bffad568713ddc24c16d5a103288c2e792039cefe25207bab8dd89613406f6b601481fa1715bb4b1f9cfc4c9101f1aa8627e4b445c095d3aa07c85a620295f82966c7bb32f855df56fd05afe2cc44b97b04949e65d6e6c6928dbdaae2ac48fd1297df71946a0ad1ce482945e342ef792eddf37c271ddaeb3c72bedf370a8ff09146f63e001c4b208b0a996fcb870c4b985728246ac54311e66df3df6dece4c9781a169262571a3ff1c6b8acc47f0ea5737cdacd9415c6f394cee42912184d92a9f8815957827f7b3be8ccce7a485442b9898fb7f6639d16c45e4dce4b68215e30e19755d389995fc62d1f8d0d96b1dd65426e4817a5c8ad0913553dca450e5d0f71c6bebd78ad279b58c3e36d8bc50b47a02f12886a584cbe1c52464738ac840a0bdc6ab230c997131370109ff1d50596df8e3fd7a3e115dd96862c7c22c292399b8f8cbbb4cb4466512106e621b0e4898a0b0000022800000224000002201a096c3c956fd8603c2edded29b2322a536ea7639a5d33b414e56d5d006ee0e50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015c85d498ae4a5672a05632aafecadfc77222156d07d5d3481cb942a29b2d929e78885729e83421218cec28c65a40e69c64e90be2c9d82b963cb7c10a681b2b941c8f4f9a829bcf78d8769eaf7fc092107a4cc49a7c629269b96a64cb3d0298544136c9533d740151d98912b49b57b1504157c65949a7bd078c2e68a6bd33b741a06d6f0a776e1438b48a285c587d4b490eb533474f5c226bc5d1d5ce59b2aa5b49491638295f47a405dd03fb3216c3408097ba84a8254c2c60ea334b420fbabd97743b7f4ccd161b9f61b320ae71214c363ca044ca5da155dbf615d3d793b7d8d954c32b37c1459a8827c78ccb62be20c94a23d83dcf49c82349a3e1fcf63f9155795257f24cff7a530c880bfd8c8defde7991cccab6fcd239df2e02df87672a284e489703c6e6e16ad2bc37c53039d0e6e7ee22ab4e466c79549fc5e9612dcb066b6ab2ed015fe0237db6f056176fae5198d17867a960b2fde35809427124aabea75ecbcbe6ed1b45825b73cc84f9c162bc0321cd3bfc820b13d396f501b7fe1942f93a8501e69b06ebca799b9ec9efcfe9352d861d6d04f6bf1cd232e82e790a8402fb6786e37de24879952553280d0ee6bb4e77b200f2be7d876a4e8f021000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022a2619c3e7fb3568915c39624d440ee33063304f3ea491e46e31d379e865e1762f15c1078e27bb75f36e2de87122f217b8ddf203f90202da9a5c455e22ec0d8e022cf019441383faada65eaa0dad5c27b3fcf379bf768d7ba26b94b48e6a67ab8717248fd70e54c3ee5df7feeb554516362d4807bf0b15439ea43e5a73a826411100000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061f4ec9ec432b25ea9e84cbe6e326bf726eb720af24ed33c8c758fff5e8cdeb8f37423ccd1a9650cfeff573e196dc99a6848f03955351118e6c921717cc3c59385c5ebad81f97c924e6f68d5bcfc939647f59370e0b6078ce09e3320e9680a4c4adb514d27a1082524b6891893f7ed237e7490d01773a6ce1c7f43fe0c9f1224a11d7cd00fbc054e3097a4b866bf5a012d91efc8edd4b5b34e8f9c4dc940b30935ad4e0bef7f7e55964061b59666c110b69df06d981fd0e3121f62bb53ccc9264631c7fc6f61b0670b25f5d81bb9479adbac281a9f3b35b75a3c40adb40d339a22bba2f76e3fd1ce0af4158bff40ae43af862b281b949b31588ff1ddb1e9b8aad1463b290773f87f33f214b26ab5c3de8651b3fa313f3c2c67c5b9bc0610fee0b7c1fca140584279007a411ae8b8de74f734c648208c23034865051d83c68b5b239c08c42abd4e3972c99830737250e03d16bde2ad1996c866503783c7ea62d52842fce77239da564bc0c0a245b3d533bfcce7d9dbfcfb0a224cc4680c678eaa8f4daaa920d9270b7ae3a0a7a6b3c90a6b94cf64511cf61fa1b302abfaa2f4e42b2802c0ec5f583b79a1bd68c01c3b14adbb63725a5c341200a3ccb6e1097f200000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001855620a3cfa40851213a2d78b68403fb5bdda5bef792c3e8d35ec3c3bcc21e97a0948494a3842e12fecbd9472ebddbf5256c068d0b3628ca2c5340e1fd3b5da6b8ec84f55e44870ce79eb8b81bd86797d4393af5af20dcd32f86533e9b155bb4e15cdec7a266b12f996672bb469f99dbda4a4f3cd41c289f5dd79fddfad7b273154faf80673d9a056c98b290d335427b4adf46a8b1afac73b2b0c9b9bedc16167f19205ec2b58003243080ef0f9ae6acfa3eaf1e7d44be1341b6bf4b8bd64dd3c10ef5a6c16e308b1a0d1fc6a502fa97ab7021f8a70074599f293e2498a6220a732720e989f414938376f32da3d9da7e004fc42da66050c095a14ba2d5f7b7b9f338f1c1401416b3cb71224966f4e9708cb0d1eb9ff60f7ef8bb78ac5ed3ac093339a1ec01eacb877a065c333cbefdeff376529de06d5e8b477a8f71bb10fa24c315a48f2ef25adf229665d1121606198b811847ac2b7480b7fa2bda61eda2192b04d14cbb0ef059b6eb1f60fb14464ed7f7458fccea3acf0c86194934f18158d74dc0f5ee28cc75f3e49b776b980486bb35c89beeee1efa51b156749d3b25c663f8e86edfaebe3fa4c28868572b84574fb92a6c3a102f07806b7516b1e48090000022800000224000002200964786bb3c6ef15f3c62f3c9dedda0e055f1de332ad3a4300e005fc7edf28c2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fad2ec6b51a5baa0f4c010c2dbad01f50c1d49f3638de93d519f387c25e7a87a151c52e1a5da11fc1123534d3c572d8c7ff4400d0767d74339e8240750283a33a98c29796e4ab3ad86b8dbcb98b5153ace03f88624e9692a80766d056f8c00e9b8fa42bf6d67629fe2ea005681bccf75793d1f24250415d3575fbf29fc14f04779912371a49ad2bff882e1cc659427153f64d0f638fa3db9020f88b9c978ea206a2da6b550ad6de946929a741dae02be9de347918946763e014c664b2cf1674596e1d14ec1d4b820fad5d20820439235984d2e690c44d1a0ec595f00d84c19c1266785013e34bb1cbf03ddec93dea24ad698928b142e6f3559cfbc74c0adff1c9acfa00b5cae8bde8df8dad75847e8e8f37d8ada2bde9616d034b1875e6a6f1bfc034f1ef9d52f76508a8987c1b477bd38aea5eadf52c6575a15b7d5a89d7b2b72d1e44a98d8709af91629e39aa405c9da95029e20d60a1107aeede501ee3dcf6ba606ce2740961815a73bd39c0246117e54152d6854ea269678730fb37959c4aa431fe32555f3b0cb441285a541ab34d42d4db45dac9c9a0aa58ea4f07e2c7153f17da9468d4765dd1c5b697edf8f558455906d837d571e07129605216bdcf0000000400000000", - "149c938e85d129a71522085a0b25ed7647ba15b9a58658ed37e53e63b9c0fefa0000000c00000000000000000000000000000000000000000000000000000000000000240065acbdc75e1954fa71e2416c951b8cc03925148c37670aaca0da53629b531000089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000c01464b5853be5a2f481bcd261fd0f8a47648ed2cfd47834c042bd04b9e3667a7c0000390014c54b5f2bbeec675badd7e5f9c40ceeb13ae46533643ef0bb7ba7d48a309587000039800825bed0f04513688a20a73113b41d525a804966b3e35ccf0894be7867dd9f59000039800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000070dbda60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad36c400098fca4f64515a8cd575b3b6fd027ed1043f41ab4ee3c27fe8527d2e38d3a4480000000c0000002400000000000000000000000000000000000000000000000000000000000bec47b002048459a4750e0bfa74b5cf1d3c66450ab77b71b9dc2a16e58e15af6bc62deb5e2de5235a8c474fbf952e98fe86974b8de3a9df85ddab1e688a09fee83280e1050200af73a97ca1f03d73d712478647894cab4e53ab41301ebe01d9db62e837193a28a78797cc6ddec322519f73c7410cbd9fd1aecf7402cfb4593f6376306b4d2100000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f3806062ab9cb3967b50049e76f80b7b7bdefffbe7c380f6e63460b33f075334b9ff13901688292228bbe540871a0019e517e050cbc07a29889e92dbc66b83a0a8a1acd7755fb874f0f7e7245c5cd8dc34533bea78f09849f2fb47513919e6b7c328c24e4be9827254669a02b29bcb4a87c155924ad344447f867f747112f0262bf46948805b7e22a991b5a3d1e5e60ed19188559c57eb7ff9d6efaf26f8c1fd45a8e30753bcde258cf42cd34bab5a567fc6cd8c9ace675e373ba76e3a02d5a1905a0eab77d6f871a990cf88c8ed29f7160ec568681a912ab4c506274523223c58e4a2bc36bb0f95dde4f197f2b6f6929abd91864aa4973768c03587506b6886e4fac5bb5b14c2f8b9b448ad63daedf585998f83c84a27850877a33c227e88b25d226dd2b402bb59b49f0dd7af186cae597791e7ae62a58afa1c2bff98da7bb48cc4ca9b7d3e3d4faaa40c39ebfb7d880f19f8452cf34fed6d43fbfba52e4c671090bcd380a5ad0657a5cba1464d4884a3ec7f421e14e0419f0683f10526b66d28d06ffd4faed66f13fc1285c2764386e8369e993daef715271c47f5e9f0a88c29d7ae123f1b123b1f5d8df1852991d87f7989822ee3dbdf81aeb8af095a1a300000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d25e520ceb79f9258115f85aee5f052e7ce32ef40b5942d2d3f949cded9b23d1ab14d9465514a3a69ef411e87bd5a3226d12e4b0f6df04269282f94708ec78d7248a7e856b3aeb8f8171529009fbad9084c0fb3445381bdcb0080bc3cffd438283afdb15617e5e08c9441c07d88edf91afb2520f12986a50650bb8c033bc8e08c6955a5dd326777fe46307b9ffee530857d8a51cc5e94f52cd88e8b8ab7dad6801ea0df9bfe2a1f1eaa569585bdc8332d799f05f540fdce5959a145933f1e9a02f7e7354e4cb3628336238ed68d04c1d85c860a446278086279492cca2e3d9c635f023a9ee770f9398f2f559eca1d9c2fd1e6e018cec14d81c28be8bec85981dab5724a7c9afc5acc002fd9969b45571e53c60526ed2b208e8b9ff2f78cf119146f3f1c88ce5ec945275d1c3ec455eecf88156493348d9e39774b460fd2b13b098ae87f596cf95f4fcf0c283d85e197deba34176844fc183da49b5eda90424c9d23b117afcccf721d3ef08d46397e1c1964443b41f8ebadbd0ea92d8873f0ece91ce6476cfd7fb53962ae9b5597cbe9c070d067e1a42ba453e8f3fd5ec9f024bfa441da924b7a576e271a48c06f49e2994ff2730a280c43aee1fa67f4032b74000002280000022400000220198e5c7c01c90942356d4277672de6b13d51dcce60c90df8f973179317c0dcd500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000989b9196d030486d842694aba00259092400d48f62487be77e09acb97c26c594deabfaff1960eef4c1e928bd9c35fe70355d047c1430cbe08890cda5a878280104975e1a4856622566cc67bc568f4cae053531509e5c6afc56e0ce218c520f3cf79dc3ef8810fc23cc79b12097e4d9d59961de4f1132e008bd6f444052b19060fa855637ba0cdca77af83e52c1b21d81c058908692e47483480b7f4297f28fa7b6c5f4b3bd21026dc16fb18d7c484a12f78fca01387afce95183c56714a9f40d8dd5e28b68d9f6fcb14a5ca57421067e56ac2b3938c81e4e58f513cc4a568c712f51318211ce867068dbf70c885dae22331588f8ec8d5865c650bceabdc219ffe96189ef0c5f51ed31e3d0db35d9ca32eef8a4cac0381858614427218be9744c89ccbec3cb141e85906992faf4c94c142410ed06039797890fed3005fbd1e4db2d63bc110b447c32419b349859ed4cdd2d3ce473db61069b8fedb281131ecd031c4469f8e8c39cf9ceb6003d54387bc9db6295d1c9a9c317df1c867cd37d2256b58313f6c27e46d2e8c6d10a7a49d50c54243432ec74874611687210c04245fd5d87e618f67ca6a9fde3388d466e8f7e7a6315c36020e53d2e82ac9f36bbe627000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012f1ca0d5cc28914bc26edc41a01a25aa94628854649fa8ff7669aedc00711e7b020623a0e2ce084bfdd2caba0be913e116619dd33b32e5c485b010642f3194e749191ee09edcf375b76bdd29e1d1c815cd83c7f7fd1ff8aa5e174d7e09246e537f00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081264100b0f0bc064cc81353311809d03bc758317008ea985b8f8e643205aba78a55f7dd653ee5aa8b9c398db1bc871e68a8afbb9f57f282329ea926aa591e22086ed9fd0f8fb5038049f7aed7dae458a83ddaf6300ffae329c4586b965e22146dcde381dfd01b3652b6e3faa5c157b3e47eebf1830b842439d34513330f464e14311ee0da63ea757cc3b2e2a793c4515a228fb07046f48405d63f0245a5119d7e481582190a1a6aa081f99380d039ccada94f5da2ca699596b08dd344d01fee49e50423d261c22b2f0f01c364ecf76cf5b63494453055a4e78846a4aeab1f48595edcff0cdf7fad42b613c61ddfce420fe228e0305e82bc3ee110952fb74e1f44cab32102aee8357605509b9fc08448a9253b40315723cb31dd5a052a6e4f688723b000f2b264b28044a62dfe1a6ea837267169cc44eecda98ade4eef35f5d260722afc935a694dd58d389becea3089c9ea80301df629a8460f524eb33d2c947ab7445e7d5035369cc1245b59aa67f3b91514c881c01e8d6b917ad6d917bedcce5cce7391cfb75f935e00687121f6653916627ad8547e86ec3166ad0c0d9f4ae1d69827356ecb7fb748d50f644213cd313fae829892ce170304fd7e0ab0e01e00000228000002240000022005832182def1b3652a6201c0441d4622b3e882b1f4f837df591028fa7b1e6b4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab89a5568477b4863230608732290e5b402ca02dd229bda519b4902493578bb3d512126fad00e8a54bceae45a7bee0d8ad2e5bd9f5e6051cc2d2240ced57db2eecff928f36d594911df04f968ab8b70f17ae32bf5fc44ff9ec09674c12759a50bd1dd0ff95b154fdeaa8cd1c5da0867add40e0bfab01ff8f53ec46529408d8986fd66048aea961a48b8fc0d0dec1c1afdcc1dc5a4e84530e8a5975069ba8159a68b3d6a5385501db7ab7bd4c476ed891341a4b87a21029143c69e620a309b57d7b996321d75f1abdce034e0c689bd10b54c2635a34b9780efb7c48fca0cd65a1685f1fe3d612e870a1af5f3fff68978a12b617f3a3030c422bd28b59ca797c25e4a85fe769ecd04e86449dcc79b653e84d10ec4ede0249d0c81c981d36516c972702b5585a4e8c97f53d9e7f7c9dd386d7c62c090d1d01ec960e2cf83289beeddda6250eb22dbd1b41d22fb50a9f4bc1b7a8dd34227114306893b06bf8e9ce9adeda18f9db8e0bf5abcd73f91704e2bf0801d016a678b019f313470e8e4b3810fe43e147bd420aff3bf30e0a83d1353fa36cce504e371a33c7ea9d03ddbec490b476e55fb1b8a398aae224ee50cdc8a4d59cf6764131b3287b886d0a87444bf0000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00223580d7f600f9f54537808e6734b47c9f2e1319a47c7eed69f6112c3f24cb59303eda41a404a4d18ce63e27265074a5bb69c1529145ebb1de86c41833109bf3c020723df3df4a82a7befc15f007b4402a496faf467e4583849a0097541766308e20935c3697d64a9a01dd7f4470649a51a89ca1ff37cabba1bd01c9c842511f3e100000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089233cbced29b5ceaa6ba8098ac88f9d44d010399fbb36b83cb82a08a6916f2d1c80a9630fd8a7149ec0e9ed2842cfe6465b1591c587a29e15dbce5bb898c5f33a69c2f6287b79d2c86bbbb66912999d377768af5871472188325c998199b138b8cbab9ca6abe62f5d2eb595e71fb4759d3888a6a640d1f2e87b9089d2eee87e3790e68b1723c99bfc084ba19ee502a6c3e3384d4675cb22c9024372e16890072295648ff69d41f1df22b8cd9c1e78aeffd9693431db9ec4c34b5fe6ad83c92f01169b606229fcc869924970086ef4d0f341df6f3ed6458cfdfeb2b9a3f36b2c8fb367a19b573032ba1988476023b803137b38ce4ac901bc69b0e75b36bc95e8f4b9abc0b957a428fbcf632f2ae53f5b96ca050f26a7a8f3c89f45e45a0c9598106d75f733f75a0338e4ca2ae4a28dfec1feb1ece0d22e2f0b492f6d607120ab19960ea0174433f4fe6e093921bd53fddd96b342051bb0dbd3aa34cb8b501bbe2903e708c252d6670dcf91b16ed5fb1cf734c7dd2f2ee575ca46a3579d70462d2c2eb85551cbae80c4145dbe8326901a63871db6b05d7f05d609a061ea64c029ed34cb284c47796cc9179791dd6fdc6ac6ffed20238637c9b1747ccd31104ae00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001914df62dba7fc752c12c8c04d22ee670687d4c36be2da38285ecd8935fa3bf1b902d5c017f81568cc8bfd7f47e5ba6247704743280e2305dff695ea0df6b783c804b872cb8bd7d3db7944c0c4161668a8d6243be3392d99fd6e75d4717dfffe0b8843ea39f5c22769db4e95dfd9241112cb31f5eab80b0effd66a3ae297e2a4f901101f93cb02e6700499542271aa1160cd04e7cf3c9039cb2802559a9d2f0e1474c0421790f92b38beb68f506ebad89bc3be26d0bc259780ecf76ae99f5669c81d35ca4f583ab93562f95b58dd1741b5f3ea828a450be5f7f7a7f7eabca829bcd8b2f25b3de3a07ef42778b4992e91d851fa019e23a03396340f25346a2b6f17d72fb292faf61def610636ef3fac816c2851f373d53ecde919981dc75f16b623b96f1a6d5b0aa6b3c807a8e6e16046537b8234e8db247e5c64eedd8ada4373d1383dd17cc3dced1863972bc435a94bedbddbca1f6590e6256859e2a4490385d1a15a0f9d52c8e0728f2a9884dc71d230ea9cbfec89697f6c5e1459a444ca3a3f5af0ad163ee9da7bfd43e7b58c08f6da2bf1402afac03e7aaec994bc00ec735ad244be2caceb815dd9460aadf7fc34900caeed5f1602520c0794c8e998d6c60000022800000224000002202fdc052144bf4f5108d408f9fbdeb2b18719737de5f8d7c6f4fbf4af10950a680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092dcdcc97b29dea567a761de53baf74b5175e71e3d43f8221f39659be54d6ef710af2c0dfa53bf276daeddb4c8ce7fa9ce3abb189225ff86984e76bd4ba0d054b275b251bdc8cf75a24944ed3a33708cd06b75fa5800521a2c1c7bcaaed0e4eee718b2ec72dfdcf52c7497cfbaad02b49ae23919d8c3b5c2d1bd5cb43f9f6be1374de95f024a6405d73f2f585ad4e252eb99acfa26be7aa7dc98e71c3493dc49b7181e8cccb6f7bf834495e783f8e6c1550cfd5f4a0e991ae57937895be4dbbd9778eeda8b2f2fba701b2ada77810c438b93181f1eaf48ccadd2fb3df7797f2aa776748c963fb2a891ba4b6eb5a81790f0174f1cc930f7c4b34f51d8893364eba3e9c2fc279bdf54b3b620394c95a2cd0d7acf0d91f9240bad638adc30dd1b8393cc32a76a4bc0697f41b7171e143e9adfb71b85b2199647a7221004108f72dc0a99caa4b97b30a2d2185a3c30b550774fe27efdda6aaceeab3821a3c55e64adc1b593787ba6ab63aa57e84be8d590310a5902ab95256a9c410119f9a3ac24b7fb3e7a28cd459ca9daf2ab0580fadb2d9a1843d1fe092699f441f12de2d2ac63f7b8603840bbe1cd466855792f283b9bbc71b5234f671c3d1fce316296aa1d32000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400111f0f16c222c5da2b875ac3ef61f502868fed9c8cca3239dbbda32459530c0f80208515f34fc790b177c37d5d9152980928dfb8f555efb53dc986bdb3824bc992e104cb2e12c6435112d3355dcf4de87ef58eb88691703e0a9457ec504a95479f40000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f99cc9e97e68add1579d4871a32a382b9c52334c026bac1d72cfb11a2a612a678647a066c4f4d924e1a527f923d647581657ebda0bdccdea57c83183defcf90868e96618b07b6cd6cced5db2d4b3ae7e981524c3bab83583b39e46a039dd085e792763891ac6b3b592872e2fffe930f0e2a01cd0ce33eba0c6e37266ef11519145a6b811d2e7b4f7c684f67d35103e1d8e13d16f24aa33c6a56854c3207f730be489c27166d91be8ce0d67b8eb2099e69431d5711e7c3724066d588816390b7d64766020a4f17398acf55163d2d6e4603835b9dbb3e98a59e2fd913cab9634a5af9a6625ff37fe3ab182d000cd1ed19f4d41b16a4c6034c48fdd4dedcbe829d5a79b6e7b2056aff591f4dcad381f9ff34328c9497ab7224509176c5f9b52c7574b4a547ee03f4cbd0bad0ea51705fe81b459c266780ec3e0709473008bc2f9e89d889bd8fce597de4fecb11a817a1588b5a4b6556859dfdedae114d43d4e5378c82209388b13d163d6e3b77b2558f07b3d323fbcd13006968f71a8b2ac57dcea1f0ea5f69caa27edbff027933553acab229aaaaf3a7f44cf78ff4eedc37b3a025885b185a9baae67057337f5267bb1d1b55d22cabd59585695e7f5467cb17fe0000022800000224000002200149919311596e0d25160916c6ec4f00def8521672a46b94e1d85ee132df058c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d22b450da70af89480fa8f3ee3bd06ab6af2cef78f3abfea982c12e9d0575bd2567b7ecc029a618465dfa1d859da7d0481964789aa758541cce852c28a7bd7391fa3c634a5e333564009a26d1dfc0c502ccdbbd032656babe1d0285028ca62f9474a45e0cace7b8c01686c28742f9063a415a075bd3fbc901b8a26bbd10eef9041e2b0b3ac9b1034cf02c6cbbf8798888adca2dbd3610e10654376370921945315112c8be4aa58900d88e2c8bc824c8e286997b4ef002ee81f0a12f9bdf7bc9ab1b0bc999c1cebc5f17fc43a6594c66c928244625eb87bce560f35c31e4921f063aa924e0324abfd1ca0483ee547c5bd556eb2af0ce428299920dde93dbca1ec6be83aa2769ae59cba0e9ba039df77ecd42742296d04c53f95f297862306cb967a9bb69d182d0b7222e153cfba19dde0f8c7c92a104a35bcf088aa621992fc84837f296fc3876dcb72b0de247cac37db4c521075af69a5803c839124012a10f15dc9d823e0e4fdc945389adb7ba73c1b7179da1b80cbbed972e6efdeabb68d10c4a59153aa917153970019e740848663a18b2c39fe9724dbebdcd839c57e0d33bc5d22d4864d84e8fdc8ca19a2cebc949732de84708af73e254f6e34adb9c5000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012d0fa30cc5700d85209687049b6bf1fb4a3859a42b88020858fc6a05771362af02089e5c1caa5e5c349b619ca320c90021af5c5192ea90b8a106f8ba1483366ee22f194fd233b6ea96fed95440aa4c61d409798bfb55010e168e1c293a96d6ec830000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fad3db5d60a651148823c4cd00ef169455369785042dc208bd07ab846bb48b93a064e383211f3a12af02186899dd52508658071fb727b75344524151d7ecde994544bbb01df02d37fcd909027ca58040a7d852139c70dbf3b8cc708dda20d95ab5d489690661a3700bbf77becd9ca0ec64127ccfc43cf7ba5b3791c9a2145a2e96ca17243254ebe64350ed28ef97aee9abc179581ec292e980d1466d577e957cd49e52dfb922ecf6a68c854af7e9f5223984a64da7620386916176c1ad9ebaa9685a32f83f57006a10b8b693541962f167cfffe3983d8e7ec761948ecbab42377b8c8b8da91959620b14a0459e61f6b94ed8317347560d2391e979e2157bf7ee785d7b3056c527863cc1c7dfbe7cdd11b2feb15bf68ea691b358c57bf667a5b8128af2d6ee2629ec643844ec8d4a1540076162ecfe76c9e1850032e951ebae0f39c209b666fe063aff3c7062630c95cba3bdd026342c62a529d8c29d3bb65d65a9a604a75031dcaccf7fc359c548044735c6ff25395e31bb9c888a2cc0ee639d02ec87aba4b43919883a92d2df8a178753b73f62ad127123640752cca712371bbffe8442daef60cf326bf33f81e450c55cd0590553ee1db46be47882181f1030000022800000224000002200162fcf57e2e33eb11e0d4c78129ae578723e0795fb1c2581fa5a9985c87b5d3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b2deab020f77935bc0c23874540536d1cf00a05ea5583dd26598fc326b23f25031192e648623a4f8f790eb856627b91c2ffd76f553a0119741a1eee0daca3a7b5011c8c43874aa86198736f4f5fd4f08775ed311f6b3ba37fd1d4a17a82a8707909d284648f6c8240f2e13c7d6906d9b4af98eba738ce809abd94f7096204470dedf3a8e5f0c49fa8d2c390a73c46d4ae900f2b486a1155ac63f1375df2617d4e7e5db059bb05cb0d0900ce3b069a29cfeccfd7bebec0655a146c17063d23f827095b528a05504a47c289dff975bfcc481ec0740deffc51d9c4555f7dadb767d73daed2e506141c098373bd5641890a0e9d704eb51745a69ac33e0a4da7d5ffefa72f9e60ab97fe070fc329bd4b00c1667fb545be2e1ae760025e3aaeb7e191c0eef94332352bcc3b8e3e6bbf418c1dc50d3c9f7109c3e5721c0066e80b3cc8df1c406a6c955285ad29145e5d3ece0b6fa3d4fcde1e7bbd3e8c43c2cc1f83628cfbf774a202facb6c3a5de396ee36b1591ecb6cd87f11358e81cb892d973936a324bb700b2e2217a1b91905d427e9b2638748e37ca1aebec0e54daaac2829db4f6918cdbd13c97d4cd53fdaa96cb35cdd2eea64252e1fcf4558f0b6eeb3c4c7000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0021313fe86cbe4f8a1fb2ba2bfaae1556dc7f58a36629b4c807db8c558fd8cd8b02cc8b9074f50112cd52af016be766d5bd7b27b45677cd05e29750a01bf6c5e13020b6a4b86b013ad2bbb2b2484c63a5920765e65309f92d19079b06421c918525a08ad921ffff18c4068ee32ffbac45165e2d68e04e89cf0b4e27cb341d99faaaf00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099667d9a2793c9ff4670e3bf41d7a612e3e835315569f32f050c23720fb75f0f753bf1217bbbce98432ed832d5bff6d97d794b9dfd1d51b9164078253a0c9f2ac25f36bdb9c5046ae85d5362d6ebaec610a74e4c7409796070c17b1aeb992cbc9462d81b622f0eeb8835859cd707987a354a1e6465c918fa9d93abd2a2ac44f7bb9c37e7e54816f8b6628e93040727fdc5a30e3cc6098154aa8df07abf948bfcb3b8f3e647474bb3a875281ac7df9c0f03b2035c5282407d6616d01215797e4a485dd20b18d494cfefee5e00b07307ba8b644c65944792f585929bca1ea230f279a542d2d977e7aa227ed1cbce54e9f156e282fce9dd14cf32cfaa7bccb95dc3a93ca5c4937395d39bdd3408f78a609beeeeab1220c636baaccb01639998e9e91e9bce3f9754350e928294db9a868648634e7909306b04b41842959c716ea1c9275ac587f6a85b081ce41060c8eba92be177c9e0377534d536d5186c932c4cf557244cf51f3414799a22fec58b507bf4a576df8cb82ae7df34be388c0f475a05951cf26095c37d3e1ece2fefdebc18c4878184aac425d6101affbeb5178556723ea996425f66af23c7223bd4e26f8421e35cc6d8825ad1857788c1266d6d2d8a000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088b97584551dfb28e557eb21b4c356bee7c993e1607cfb6ce7153831a41155e4faecca6d335f4dc8ed6b26501e6d9da3b6eb0a0528bdb4ada8a0ac156cd7e631ed594a7790434a8a41f4e51a22e01b8362fe50672dac04eb997cc949014eb60ff3b83b58afbb5b9e34e24692e5390b3f7684cddbff28af43c86de3895ff00e876fbf934d077370b98f3ed89b579d6cd74c1215cd2a586ee09bbc31715534114010c55c42dce903f6bb7f7a74d01b6268f8fcd8634e66180a65e23a76bf0d1019efa205479116b192248dafb5da49d2c23f5ca0bd1cdd654209e44d93d19a7360dbad344a0652fac261827b524dfc8ef4d869076a5f56d0eb044802b27bc456da2e81f95b7ef8808e4ecf771232b9236fdc561b0f5bb351ed584aac7c8213422271e5e23c61a7da8362b72055a5cdf08aeaea4b1518fe8d916ea57db85708aa71d63f66799586e32f2603ad969023dea4ad26b0aa47f7dce846562a8e38629fc6dbe477cb50927915bd3e8aba9c9832502d28b395782877e105489dcf7002b1bc1ad592ed540a59ca945a6d60db38da82c87a8c0654ea9ff902ab7013c15e34475e7e852f4cebf665e73b40cf9777c144423c673654004b9d03ac71ef4213e13e000002280000022400000220071d966622d4cbe53456fd67d873e9006f0b62f85f74e38fb4fb9fe8ee2333bb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009147d1a3e58941f84091e99b3ae5bed3016f95b8f87bdf8ecd01327c0859b717be299c9c6528416de5d936c6049e9e4eb82754503d16c82aed93d42351c4eb517fb2f3063ae6f869830f48e43bca2ed88cd713f376a09b56417fe0d69193b0e0c41a2a514637047a6818e1e02a2080fce41015781a037396fdedb5f00fe7bf8af1de73524931160cb468b47792946313814fba72575581d83cc8acc867ecd8531b4b10e8e6b4f04f7f7b3ef889cb4460698d4c9637bae9e52909710386548d5fe77fbb8a8c66a079a8b221227fbf5779fce4ae2680a9f1eadc225ce95c2f3157b9564556812d9328b986359e06be4e0cd5477190a583c88e3b1db40b5ecef34b6391dcd38989a8acb8c201d09bbe349603083d58b39325ea92914fdffa8c9829a5bbf98217b7e71cdad64f46f3cce52ccc6a78867d691af77232d0041291c928d37a20fb253f9a975de997340e69f9adedd627e86f5672d18080ed870b92756c80f3f58197d246bb590af6ea2033a09d33ee9e6666d0cb0486d6d7cdec5d9d6a1a9430e2df110fea9796b36fd68e05adb578f9a093ee1ae941eae74b3fa409813e38ccce22e859ae3e8165d72ffb9d5e121be8fbc090671e091c8a8775e64cb000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001289ca2ce601f05b8c8fb5639ae1f730d9ae6e6e21233f50c01aae4f68522b65a020b9d3623833d64fb2cd84038540a0b1445d8649f575670520de6de323037d227278b7c4dafba3332958100c6e47367ca82a021af14a11f8a49f72c75167bade8000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6b9c61c2e9edc48e9662c3783fd575864a982c2d99f2bafbd333b8b9170e8cdc1614218f515f5a70e778ff184ad3c099f06b384f52524be4c51d13a1f1d53c53fed85dae2d33bb344b0ac83686caa23a67a923569ce7345058a11c9d02b2044bbf2fe55bc55574af86e91a43e4de2c2fa7d306ba72ecbaed9732d98e4084313feadbe48b0b7360d0ce03ce7052c510d2909274ba60b2701a31f41ffe92697198a3a589d8bd8997411623e0a90d98be0c2b8847e594672a7a2bab8159d18a879dc6f652a646e9798ef46e4568c506e1cd0286a3b066b08e639e8074178a0c446992a96938473bf31134ecfca0f84571266486a4c3676d49844b8920b08255c1dd886f219c5cf1f35d59fe2999e8b07bb4d42de19c24c51d5511afce2a3caed366d055d4c3da3ef4e34d87cb60d363329f73eecd5e4f1ec186aa34fda1e0426c39e2fe574eca0f2210742f012465d0db020eb9628090cdf74775227d762e362340e322de50a3a19e6876e4e60d733a54969198430caca27053165262f88391a7339844a20bead47f08ad51018f996e4b1abcf5dec4f4457587a18a0a5b13d8b9fb44fa8c321d018b611b735638eef89569ac69fbb08bbf06fd22fe4924c04d2f00000022800000224000002201ee3bb280eb5008389b85a6cd5c046447e5622bf7aa124869660bb5942c68e6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000187ed1024584fd278c848279a6527207c61570131a408ee2b1fbac60d0cafa0bd1cee446f0a498e13cc28d1ba0cfc17206556689d8ee9e6ee92061d81342a13d7e227e85b8aceb18baa1b696a6a3ad657d8509d692b18e71f09ec761ac5739f8584fcfe772499786004f588ad1cf0b4409b32b3bfeb8e23ad5c312508e4cfd9f2dfe2586a721326a81ee2c61a9a8f387636da5d477e204efe23ac278fdda0ba1244c75d43119ed9604b121e68fef444a46487ff461aac1ab0bba12042d2837469dd172a20ef6f6990719695057c10fb5b7110b873d8156c6295abb7b8c634d5ba37f2855404100e886856610894539d81aefffeb033cda2b249b34da5cd8707bfa1e5bf299bf2ee9dd7a9ff779e7f827c19c949386df9fd45b4ad943941c0789e01ab57ae04b942221da03857aac4dbb12111967543032686573710cbd0398af506770c1a34e93add6fc1dce58085650070b259d89a6b959b5f5e4cc82dbc50fdb4ad86b85dc00ac6811d426d85432a664efe03d25ce4919e8a51386e8dcd0ec2f5405d6e1817c389dd109f0f9c121b190b2b110f11401eb816ae0373cf4d61ad1242ce8b01c1b5015d2c3b293dd3efb633f33dfe10db4adb1865f12e31716e4000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00216cb8785bcaf0919fcc30202ebcfc68847a2e3e1bcb975ed66679ed92cd3b2d51e37a263d3886a1456cdf2cb3b2dd020c338c888e06e6dc2618eedcdb8c35dee020ee6a791aa7479059a2c0af893b56a489eea04df894c99269071dd7980fe3f6e2cf4083c0ee2b1e73e26bf9ce85b6103c600d7b0e6c1fe9cb98fbfbbd9f9b69600000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3afafed0e71686bd2421bb0b4b5e923c5849d4c5a68137abb0fcac91523a851520d183bfd6b03e241eeff97d4999b9296a546057a224592a132aca21936153cea346c23ec7d8eb854b6fa6f60e791dfaba8bdae86a610c056a33860e5652a036fb21271c5f24c5c752a9fe1a71d20603bde90e275e24f30505b6f84260e0f1a139db9a22b92e097fc7a345a80d7bb5aaa789f89f7a4c4eef6c1511dfd6a7ea97384c5c94ead01b3c3c61e73cd87f0549d1fd678405bde0e416e93820a0a7beac90e4effeff4b3ab05a4d468e548363d62512ec4dd75f0c659233623ed95609ac3bf28784d896b33014ff8b794b6d45ef74aecef8373df674007833bdd7123d50a3c41502dc1f06ded7349c0e297cbf8bd9326f16b8889a3d2a8f081688fd7632364e8cf1b036794597a193bc293db867289c296b86213038355981185e209739fda73bfae75ac4118c28fc35f53c7194891e514ac002e097dc36625231dbf15b7b57c1ed745bc76b85049f0250073f6bca7074a645b5c22029cb03d9ed0a5350cec311b0730eecd081268b1a83fb1dd2fbbebe46e0b4f7e87989c1cc4f1e990c45f99ab61959bd6d025c30c8f1b2cd4c2aa4a978e46893bc77940fc9018ed9f00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b4f8708d0a07bd90c0d5819be72ba0a279e80c98a428c2eaa38d17d3bab54ab599e3fad4ecfa9b41b5ed34a04dfa041be4dda9810e5f6e9b06811eaa5f53ea7f86f9bc53974e50adbf7ad0f1271e5747ed30977f7bcc88be863eb848816c73d6b4f2023f4acd5076feceee122dfdf28a6edd30f6869fe387d7a8896abe927a364a4338425e8b805324b630e8418e9d6961ff9abfe85a05134a1ad02095bd513068b229ac7bf7cd951999af652dcd293b97787b0bc43028d5f305997f913a4a8a3b2d2e222e23b3808c35ab06ed330f0294a78b7947854a506258eda3546762a91f73b6fa0d58dec1889d7d9839d15ff8ab3fe3e28c7f7bcbbf7334d40f126b076c9593015d39c9ec9d083b801996214fcd91fc9ea0ebfc53f4ed9d0c5babfaa879e69cd1489e92450f9cdc93ea502f469e52bb779e7670a97b2b8639a677d3a7ee6cd6cd52e579fa36d4201890a1ea83de9164f7a8fea1e4b1cc1001a6afee429cff93a0cfcfbf33d60980182d3bf76d52b1dec0f6331703ed31f290b5bd8e55850af1c4b72bcb717b3a4715e90df41230a6ea897cae670fa08daa21fc8b1db664675dcfb1e14be8603dc1cb51936a81bbdb3c5d6d5120cd29496416f2c3d0f0000022800000224000002202984930b81b33e43ef928b129741fe115b8bfb512a42038d7c97269c8907355c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d0811f28b59b160c574e58ef4dee6301e44fdebdf9532bd152cf40ef20f36cdb13ec5957bcd888a70b253a1640561da867f89f802b00bd3f08e97a3b4b46433ca3a014e38ba7e3413b40feb72574c532f3cdec94e7284c1509d381398fd429ed319b8100bcaec9624dd220fd7039023127779b7c0127628ca21078b2ced1b7580ae7caa49813bb0dad39022541415cf0d9d870f480c198a71acd52b0ad57548da05c393ab87d7d552bede56fdb66fd733142721019d9c712e73a0951eb3fffb388f3bc7f779633b60f13165d30241b4434422855a78634b148c83465d5c3d014dd280be2a13ba767184387e0e2e2996c78fde9b4292024c4a328fde37aec22d3e26e9385eef3160ee3daa900689531f1c954b8bba1b46e39e70610a4cfbc47d811c37d02fff80cb0d70e27b95502fd3613f67fd4d1a90204209d7296d75467372046e784bcff98d7b9fb6d436dcfa9802cbff3cfd01227539a117d4a8053981f17dd5b9c844d71eebdb610d0ab22333c4e430dc0b5e4e9acc13e40921229e3cb2af0cf140254eef154035f9e2b0ccbcd490270b986b2641edd1647e0356099c94060ca7cd91edd57631c3ed9f7d57617934ad210a7803f503d40731953c9e9a000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020bfdfb895ae3c511db4c7c69ae5196a9654d97a9afb71a246d388ab527e52b812b3e08363b04d2162fe02d748f18ab96fcddb9e2dac975b5035804879633eb90020f8456333754ae3e931e89c23b842f42ddc6aa52e1685adc8006b776badd8aae08328c5ccb873dce3c9a49f9cd370eff73b9b8e37484394225dedda1e380b05f00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075a9cfa619cde449d4a1b324a0dedd8c3dc3d8c2f4ab46224092896fbced98608edb8c814125aa80699dbc3695b0930b7eb015c3ff0384c5488c38d49f1f09bae7568497b5cb57edc9279da9ea50e0a013d8e753e165d5fac6085c298902bb2a236570ffdc2549d0d4e9e5599e01e58de44ae9d08580395f0119055a5e315d8dbaef09066afc7c518d7bd8010b8702bd121a2be7e0e77daa9a0acbbc53ed0236e0f15df7bda2840d7892248a1112af270d9849df72477db306c7a5dbe278f1f93f37095af6ca41a3c33ef49cca65502aa3c6c7d8adf664c6877dccab834b7143ab278e88b1e9e501c6018195fe8dffa24a206260b10f97557edbe0077099e3bc60d1ceef14de169de8fab68ab20118317d9babb141596ceefca6755aa432e1178e8d0d579a7d24ad5b411b98c87de3bec8abcc282d9ff7bfe0a87ba13a5e872b64495e35b6e1414796cfb19d48877dde0764426e3c3bd8cc916341adfbd80b050e0ef890c4e7d080dff416b4261dd8f2708c0c4efe873dd510567a7aeab62b3b7ec441435094f535fe493d4eaa4f08134e213b2e7b742937d5289d70fba8e152f25d0dfb49ee4f8f49691f3fc656c127e4583d6e1e87c2d990a989897cffbf30000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000950317d56c421279acdeeaad5e428fb1cfeba79653c1867ffcc47c348f50af8a1f13281a1eb440d1a6c998416709c4e69477db25ccfb2ee643e0e4c8887c2a57f7d50c406c8f5d6b35ed33d476e9ee17cdbdbe40a31b14647a646e731bd2c1105098875cfb10a4baa13ec56187bc965424ad0bdffd1f67138bedd380ff11e82f0b10b8cdd37cc4859835ae9920b312d9086aebfa4cfde0d910550aaa2d0abc15d6a20bc6919bcc616cb1d05b5562ef35b5f01c06ed93a73fa4cb7108ac7bf478843f791129229b9742be55cb3a7e9d3e89c178ff13d6669cfd5d18ebdb03d187a5fe0235030b1a0bc95b58f328a5a15ad1c44077839276043536179b6752dcc8cade03fa55793ff443a60098472ead7318327544a0df00eec42bf61f21cd898b15a84f46a717e6f66f763c8170e82d9c627851f15d072b8c2851e98a306161a24d538bacc5a631fbe504f843fbef1549f4e932508650ad8222258ea5955c450bf55a8a2fae839012c45e0f713a0c5b0fcef92b6c611ebdcc3d677e9bf507373d9b7427b06b380271b67fe5df841977cbbf5e47de927799fe7c076949d5f85874b5c04ea61ad62e4b5fe046ee1579bda1467516d9c34fb6b12485f8ac95d7d9fd00000228000002240000022005bd6b3ae56508eeb14f5ab355e5740b59755b1c65bdd13938f01c1cdc9d90550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d5f6e55b8c390a01f84bdb142d7983480e7ebd742e73742003b0c637a46845e4db7d7dc60083763398cbfb05cda08c475a4be1cdd50de93af4a177d2da64a8587a049969106fc0ce093b5c7ce186970ca598b9cc4c9d5d88ee37d05642b3c5f2dfa272ffde342f8004d2cb2bc482dad556493fbf6229196e44b2a208b466f9332b45748912048ac97ad56d925e49d7c3d1cf70f84b23ed27a0c8b0024a6c0908266a9034af80802de1c23d0c2f9f4a53c996155f58e86ec2824b64f1f3f0ed5c3acf54a772b8f2010dff34fe1acd34fc632599e935eea25a4ad9c9f407aba3d2d2796448f4f6f3649b6767c306a4d387b86b986dd932ff53a7e5b04e25aa30a4a8c89700e09a9718cdbc8a014471c8c7eb5a6b47652bbe9bc8cf3794c5408c636d57e73dff15d51c8415c5e0008ce4c06dde2b78c874b296f12497ff72c43d2360890429ef9307371de2a7b7b3c7a6bb8b37d084eb95c88570c0dcc32c3898265013161787465ce24214fc125ac443e8e4b5e01b050a20958570f650fdfb801b0712f90fa3edd197f7f2b74853f77758ccb305d6b8e6ef04420088a56341f3f43ae333d2db64fdf66cc52b42cfc843953f022ac3a735be0b24ab9f6965bf48000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00226d0f4d0b24e589310df29d4dd4e0623eed4018b31e7cf379d41493e16e93e2d0130d09d325d4bd3988fbbd8e076d8df6db8a8c67cafe32bec2c2a2f623f2356020fd1d5ff045e36be9be29d3836ac833ea2e213ddaa72b3d8f1d76482b23c053a26288bd3a7e7c1bbfb322a332a5c8b2bfe6a58c985f87da6863a153872c7656300000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002918cfe9be31e571b90bf5033dd7901764065d1901648f1681e6ed63eacc908467297f923b4671620b6cec6b1677ee0b31396fbcd42f898b87194d051e63673e05401faf4d73ccea0f466979c14c87b3e146212a6b93794c79431dd77c7518b9e9e565f12e6f65f63dd4bbb4f74b0b2d387bee2f8ac36bf2aad014a96d2cd70c056da22c3bcbb194918aa35063f21fbb958e1ee3f3df7ef9761438c1db8ab6d1febd43177b81be4bd30cd619c5074a922d8d9654210050d0243fd081a2ef5b38abc027eee1d2ef3652cd62010a17b9304eee69aabf18625fb35c93d718f83fe6a2fda285f0d9a55aae399c11c8e47ed97aecd17c6e8388599efe49e816b909e0fb33dd8c058f9da0811a6b38c65b20d9bfdea30f12cf7d5cac58e057ccd13a359dda48880c13899f86c27218491f2d9d0b7205e58a6e30493268bbb5fa17cea0cfdac48ecfe2378694bccb6228291b0b5af24089e7dddaae432534d59b028ae87fe66738eed15f24906b015416f977cc2d239c01d305f1db7a06ff31ecd4099bfa7bcf3915855ea93e115310b4b9b350a9522be3b1e07a2d33a65cac9d0e744cd20a4e774d3ea9d81d7241f777e4a30e0ccc39e244a38595574b3e915375965100000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000960fe13f8b337b1ac7093a6557864c45429f4205acc50bb87bef54aea8c0af57e0dc87bfca3f22a451058afa8f2fad6ebb2dbc57c37b39cec9bc85de3ab037355c470e16c3a922bfec9f3d5a900f734c8e155106c54a470a8636f74b74f819f7b5304cc2ea5c4964d603e8e1bc32d373f8b9fa15cb682d860455e97816ca0f2a5aa17e5354de16cf339a4a6abc6a9c72c8b2a6b4b42eaf7f57f70dd6a6e458515067ece1d73ee4457e3ff38cc04011533ac35a648990197dcb19027d8a580443d6af20434ea7b630abeef01a862853f676b33b6cce24ed9ff545decd578cb1da48b9785f113dc055015adedadda31a89d2dbbf6777a3777553ccaa2e1fef215b78010d6ca6fb596144e5678037499015c00716c99ff1871361c042b89898be6899d5a117a46fa7c26f63ce8515e884635e633784f957ceaac4ba8b427de4a1737f099ac201c64b95ff821d6878d58c8ff2a74999f4863968597d03fbafce51e34e356ba6f446c93ac8d8b02a8fde8186f782b0d7c892c96eaa29457cc2757486326f490ce2a0bd1da319dd063793500152b0cd500763174ff776506d4a6c970d170424083000617237bbc2a4952c1080f010f533b34d59d43be7e896e9ab49600000228000002240000022024b186020c272a05817fafff8f553861078e0144f00c763206d35fbad783ed3e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6de0a75d2435c1fd76a4bb61e52b8b61fb7517a1bcd89ad25b329353e5ed4c50f8f782778118549727bd390c82e9dc6bc8c8021b5d4968517998386201ffe0fee06550e95d2c74ede8be028b8a3636333fecf5d01757184e4250da7073d40bcf1677d348f7eb566be9dfab5be01d0831047c64199d2c32ea06e0f1eb3692d97abb669bce6ef40f922ac681b6d4283bad63ef835255075bb266ff3b2903df85e78f356d20b5d25d32a4fa8b9ec3b8078da60c425d0df9b165e702b059ba7d187402a8b8ad660ff7ffa8563f477f91e90feb12004ee32347c863d410fbd9696481884ad5708439a0dcb1aa0a80c1c79c7274fc5ce6033e271a69443d789ed6535cfdedb42ee80cfa1c52d70b9d92e487f1f5a7c22e83213ba2a57e38c0944c6e62207e42aeb1c5a280b83676a4cc037707c4bf30cb10bcf6f73ae22e5a6aa72fbb6c050122811ac9b1ccf6232e9d459ecfc993c532e9bb630cff541afda5d613c1147e2764dec1c3807531b6321922efc4e85d9bf8f1b8f6099a3816ddfbb4061a29eb5832c2cf6c62d3c01b4ff0e27eaff3b0521a957d50f2077aa99166eb8e27c4495355441c39e5c1194652bef5262fa09b14fcc2136c7b5ce01be08d7c274000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012da004c1ee3975e1f4a6b361b8355f18d089f7e98ca859d67f03aa112b24dc9c020fe5817d82ac71f566fe9f46120e7db83aca0f3acf724453e0727297d7463b9b0d20ec26ce2de52f123a8150b13a3eab40df264869da15bc6d4a2229eb8b29c60000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001670eced1ca59b8a6ecd23e8521b2c317337d8480b8c5b87274bd7c2efee838376c37517bdb023b3ff01e6876fc6a682917eed5c6e297926939c26995af58b72e9f020e4d16e0e6de5a1780e599b7e62fb9584c6fcf9fefd1e4c92b4ae05044b7d544158056e2b9516774af6a5ca09b1eab3039b649de00ed43e803a83898e60dd1bd0dc719eb9fed3381bce6acda187f71990a15a496af0203d32a632f1e13f4ce789661ed6351ddf438a9869932fbb6791efcad48219c9b1201faeac36437e56b84fb130982b2832ae9aa79a5aaa5ef6bcb2b1c312478229a61a2440094a63b7d66a0541f91938b17f3d6e1bb7285e77765d899f87a04c9540de1ad696809173bc5d405fdd826c090578ed21d4ec95e831e66d3f2b4a488d9c99a0f0c50617611294d92098ac4197bcf033485033a5a8660ff0d77e7a0de5df3996cdcc361e3c9d86c02d3ebe0107488eb73459c0a14678620485ff5b02e4dc29a5c3b9995cbb9a3e2644cde95ed61f614e62c3c703d73e2cb4af9bd59538646dfce73be71571cdedb3b282cda935388c66df1fc2d613a4d257d164502f63c6ee19963c36e3ed6b81153b3b2150ecc865545b62803b1eb840c633425abc19a4cee05ec9ef2500000228000002240000022001db97cb1b84b587a97a4db73bd04966735cf54d8602e176fd3b87007780af8f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c3a9388810e51be2c8c42eafc86ef835bbff3fe082f567f246eee6ba12984cd7972cd0b4859e17d84f768dca70339d45f4b4dec4165ac97ce8ff49526a0fb30b27b861b8c9b604ebd3deacfa8d77707a21d225f8cbfb6b3b15f1543cf11f2923a83e78ea78364391801f094e4bbb6796f36d381b4ea38cc43ad15389cd245538a25b8770765601435edcaae2d7b4691cc672a22ae3803ec1b70fdb0aaa45f19d89da639f736c52efd3ec39abb7c9637394501c261f2a99f908ebf476b61f26e6a1041dbb1cacc869d0e0255e07949c1f5d57efe46149674f1f4d2f12ac816420c92e42433e2971a0278468368f2716001c6f7bae6264979406d092ebbc39710745a3a72510956cef0cde602939cc0737146bd3af33a30bd8fc55a39358e6e46e9ca072e7d08533382855dce70731800e45110b573e4258fc54e7631c9ea5ee5e4c408325b712b29068dd43c50ae5565286df56f2c2ae34b8838723913abc59c6b95cc96251f6d682d2b13efa1d979bbede69131afe7b794fb2e059469d8fb564014c70aca323ef6ac46b6b34ffabe5b66963d8d6dd148ab2e38d86c6bae9bc1faa55b77ab60a2072dab70a83e384051e2bf185fa34eb01062af6f16a879c320000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012eb02fcf60d8661ea2d2cb585d2936984c828498c166efee3a11baab6f09652c0210ae568fef81a6d2e8c046086213ad38bfc6cf463b60b68d1dc98ce4ea4540370283e07d143245b954dfd4fc0141415b7303934cc2d9f369cdf6ea037608ecd200000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fd64ec18e725cf4f87c8e3f8ec899634d959380fb0df049e460df7f5f055f8604444fb9bdb13db7d1cf875f5456d34c39a35e5ca54b944f5a3e1602b0b99b251de5f7c3ba5585cc2e153c43c0f2942cf088d756e4341d3b1c6452af1d3def00e992b323005e4b03793772dd68076a0aa275cf83efbb6832fbc48553d95a3a7de064b65112f70ad4a23cc48739a1593dd5b27c1f113fbf53fb4dfa877e98972b4bc06ff9a3cc31f2a830114f4f8fced0bae1598b48dd65d80c80b5fb19f2490e2eb30c3a21dcd8ec23b0e06517562093329648fa03df9175844750b609b33e650e7d68e94d34cb560042a7ab7f099a49b53e494ff886004adea4f36367dd83aa602cc71c5aa730e5e9acd68b2b26fe14c14a19c80b5897cd918964c5ddc3004546a36fd427eda16d5495896a7dc5bca5848338c9f69b28d9b7e4a1c9f404c3c7ad4b5d6db47c94bf07fc3df83a22c61c70272fe0ac377248354c3e1d694b5606a8826f7099a6070ea34da30297273285d6391b0be4b6410ef618e18b78e09cee5dac05ade5117d31f4162e7bfdd259642d5a982fa8cfad3107a37bacb1d81d5edf42f5dd92b267ef796690123f5f5367be0ed0b033749ea78472b78407d6c5600000228000002240000022007bae3214b527bd12ca186059dd281d1934453ef92a7b8180b2ea0a4b0640f920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022acb2c8bbbbdcd9357f4ceba15e3bd69ad5c7bff0aff9e91aa2911f2fc20d093581aa32b6d59d92c6b1befbbd7a0357b514d1e74431a8e9434548231d5767202c80844524e789fa8acab70fa9a5659e809094de1a3c9cf7a7a43fc379b2187113c92c72124fe7ea69acae673859c9605599989c2a509f59d9a91c70725a6968ed75f0fa70eacd04c4d1281ae4f661131325a785261b49f1d3ad9d39d40154d462b7bdf62b0817af1253007473319b7686e929ecee3cec7b16e46a8502163c90cec8924bada3c9580ce3e7073577bb7aba7a3af4ed223d9273114b9cc26ac291913540dee0c5dcf10e10dc23a7db994ef2080993d77039606996b7779c7cabb52860f592a2775888133a6bc808e539c7bff5d20bd7a1e49fb693bc254dc90d5f3d3b6ab5988200251b2031aa4362e0c13b94c9918f28aa60d9d71bd993f8e050dd7c9354f63b591a1f45f96597382bbbc61288938d37ea71a08d72654cf7c654969b484f88ebe5d825928a4ce900c90f513e3656b87fcf07e8cf41dfbee3c0072a22d75e913e938a5a2e2b19018c928180f5be767b50f27e3b28267b8072fada21e3ed6ff7c29987a4573c5ac7707f57e9ab14b8fb5d4ace2847eb75839bb749000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00219c28d4fb54a95f6e426372f4e21493ce4b43cf5fa539e88aedf42adcb6804b421c45f19b59157ad6e229352431db315a55aabe8ba3461c9e6978720b7b5b1b60215bbc5abbd1b9bd7020acb649237afae5d0d4cc90a7c254c23e13780c941da1700fe2e0dd75ee14601c36de60b7336fbfd84669a4e384f3550b2f48f8230fad400000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b04b8e68bbac07b7ef6537bfdd2f3a2cbf6b998c8b176e436319f00883599be236acc681d7571859a57ebd5a3d19df23df6813d92c0325f4b721118fb1e0aa83c577733e46cef839bb3648cd87fa336465765740fdb959e1e10f8a586b68121fb9e06ea9b5a4cdff8c7c60030a0f25cb7e58f7289046756a8193929cc7ab1e326020739d43eb8e33d04430694e7ef414ed0ac28593309d02afd7e4ca49a1f14007bfebf699831609e7f8ceb5fd02e1c818a533c7b15816c383aee1d65f55013af555a82cf4dd6daefe39fcbd4d937a704b7d18897b4679bffbfc5411e62b9924628df43bb8d8ba164ec5e5cea921d7d83dce323af56c18cbf01bef61554731784bf86fda17596245b05c328dbf129f16e1b275d2a3ee2c6d2b0ab26385532f147e09e4761e6006e95a3109253730597765f7e13d801f38215923526f3d7efbe06fcf139e3c6d49a16013e0ea39af48e2781561a3509d1a32569050e03381181391c4cf53a2335f81fa6b97b611751ea7adf73aa80d766b3ad9438104979cfb867500650ae4297f4aab24d58257ef46642dbaa0239ed61c73295dc39f8cf5fb1d94b1f5fcb78b1eed192b4c92f9641743a2410a080f4a3eb69126f180e822d84000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084a785652124e0a67738860180f82c0c176385623a674fe291a39a0af1c62fbf61616beb7ead8d4f9c8a1297a68ae042ec5684d274cac563337b87828d4ff962a15b4371a4c39596d7bcc7c11b9d18dd0d266fdbf85c15e526b6da5838bdc0800aec0d1aaff476eea6f166062f1d1c02553ea00cc478d698ad1c79a76ffe26c06927d68edd9aa92552e80e69dc533bebfbde3aaff2497b056e50a416d06d38f972deea6f4fbb78e03c60f67d0cec9fe4c775049a07dc60c656b1aa308deea4bd4ff86afefe84c0beb3ac30ea2cd71daf1b4ea370318b1c524fa171f47dcfc2caad8658154deb69096a1aa6fd9bafd284e048704327fe22af66955713e6364c220b9a17c3fb7c59dc636225b927e1608c7729bad880539308937af1a53dd83cfa677630162ffcf4eac5dac1a84754deca8db819611d3b7ac385b33ed8632d884acf9287f125548c26de98c6c3758d65161999601e49bdbbce6314c2f8b9db4a3c783c645b123b091c7a16cd4f036cd46bfc8f14bd0dbe493a256aad6416da1209e6aed3ffd4209e48b3b7265efd4915e79f2d4c96588e729842aecf344627f77f7f6c00b1c6c375d509a8d3ea949657bb3b62f3201b4b27bf209e621d53c570b30000022800000224000002200214d40966cf3b97e9ae96c3edefa64d2a4e65cabfceb18dc213aa17a69f880b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000161677e2af4109f3e91639a93e3ea8455e5cbb4fab9675ac295ac4247200639b7e47b04a4162c1d8d8e7d05799a4ed9e046c4c421671882f5c8a314bd6e99a26dbb325c0db17c911af654e9830dc9221892facc75edece763887c2017bd439627ce9bf582d9bc4b9df4b4a5cc60dce1320dfabf3af03edd900e6488c896eab7dc4852ecc573be64e194450065c00867f92f6bc121c8541f4e716d6a116e8ddc115a3c5b8ee2fc9ce41e96d104802a727250a30b59ca7c3f3ccd75d11820f142aa034bff3547d91499b0a0e05fdbcde650b85b56cf5a5e73e92144edc2998be430006e49d93cb15dd97fa1d8588a9f351bac51c8513d23ee43aaacddacc52fa84baf913f1cdf843734db70024ab6bd015a28f1e4735d053bfefb8e2069005f4fd9d4a777cb8690a4e362616060897a2fb0d92e490839fcd32828c5ca5f805bb4b7faa6ce8f52a5a16bc6fd593d48b7389d0e715abb46c3c63db934d87e431acbc8c735f49e131bbe0f2f47f45a0734d3ff13b695233a9db1ed0a1640db10065d46f90df334da17b54a3b4a4748b7487d99e76f755129fd49b30d90b282bfedd60f3db1cff886441fbad2624a83ab87d45a26bb49c368c0259d3ffd3bfbd574229000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001005d610999ad96217235db10c896f7138f676f604e7f2a9d263c76a7eb921fc50217900f935aaf1c9de9777d4e41ce9ab5d01351c653fb5c7fb4fa89da5bd26ce51a206b7abc0c0fbffe81046c247be966e63a9e34ff3f86428a9163904193c704000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8cc9eda4a41b656b06454edfd60a9e4d6db471326e535d8c60381e9c67c9514af55a6d5ce5601f41486de4f3621fbd1c0d76e8219368867559d265fac53c5278dacdffb3d0b60e180cdfc7269450ee589a7525794eb37501953cc2089c6a183d186ac91ea5748d7781a04568dbb1490d7e09e270b5cd88375a0def917c738a797d569cd549c1e941da298ece8d40eaf04e3b0fdd6b110379d5e6999e81251a046cbc3b2e24fb8022f30e55364a11bb5e291efc1e3f8c373874d6a8eec7e3766e7b260cfcbd7e2cde46ca30d32136cebada86fada3dc1475b8c8e87ae286ee1d439ff451008ccb8de721b28daeec62cf0f67fd9cdc74e8e3d2296b527d94e9eae182fce9b56c842ca778ea66a3d924940c9623a35723758632a140f950feb2d8b96380dc3c98cdc0363c81dc6d0912f48d7770331b92b34f19a33cb61e50613d1b059ca063d39abe2d1eef2655edd09da698a3e889857a7daffba4772a50834aa1b0cc7d0c1439d94716edf02b15808bfc09debd969893d12971ed189a6e8038410f2202d61d160526d1d64a090a9a7c68d22310db53068d090d9a7cd242c8acfda9c53eedf3ed56ab35b2f44b88ac8150961602d0bb76eb03b9ca7f7a37531e000002280000022400000220172c1e4a70b7e28bbfc5b1b06585bcc06c72d14e3e6304a9e4b025ab4f6d819200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2271ec6b1e265b8dd2ab41fd65cc79bc836486f95e61167eab1d555df5a45eab965915d9dc5012ea03b6f52911670788c5fd0b74f34fbf4eb2415ae1d6f7f2314a578b2b6d1f09ea13b14633711e7a8a3f816266c23b5d5f6638e5af86ab45e3134b545fbfaf193f60fb92a2fda0c387426924ba100fa2ad00bcdc7fec5ee87cb42b82da4dfecc5df2dd6933f08c7dd3bc08852b83dcc200443af3a830e30c433fadf9d7e26c73d72cd5d09ab5d0a488c7ab39addd4fc9f28fc8cfa4c975f371cf81f06743b764a2f9a11411a6f4168ddcd8a907fec44030e4ecb8497fcf8587db393872cecbaa7adcac9a3e6f4ba35aa2d3952ab43c1fe59b1a2af337c69f1bf2049d2b0e277cf829dc04b9fa2c7c013a8d2493dac66a4f033f269fba65063e39927de4eeee70f6d238a3b2d94c8e870a3a6e6a8c203fe42cf4e578dc573868404b260e75e77de724add04ecf8c8a029f051002272b18b43005c346a26a5c752072c3e36edaec124a029e090684b9e013e3ab50029b6ba437fb2e0afc0c8d2c43e380e04406ad86618c05ef8ca3b54a698a9618601b24546e5cd69fc9e49b2f8d21ec9fec20ee89d0080caa9414817ad8a8cdcd1afce4b78d4c4aa2aeec57b000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400106c66a044d74d208a8f1d2c68c427d3bdfaa620c863cc2a1775056be05d255e80217a9e428b1022f93d9a87d4ae5d2dde3baf4ad29494179c9ef6b1f7e7a3fadb70b0319fa45df74dfecbcb545f0f661189370b4374aef04d27443d5d5e48adc29000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200408cb8213613df0c3490cd289850a5c2c9c46f2addef496a01ec182537bd3d8812d0c4d4891dfb967cf10b23a7abaab10c6d98d0ea2989daf3c30852602f4e20a7e7b38d82182205b3f8c82f982b964cf171a18205cd4fd743a7a1eeed1b610dabb8bb5b1502debdd2312c1a5b98ff7a73c3080687083c13b83311c25bdf3af7d6c4f4fb8a56d6a9c87aa8d3b367fd0ce36523c48a8a4f0bea4eb37dd1e41408bcd58605a2ff16c4a9b2c2f5dcf4f43a8a51733e466fef7b41cc22f1cd74ca68c7ba8bf3a01d878267c5381d084db54ae96571a6d2d139e7c670e14627b81b65bbd505fe8e0c0ddc943e6cb75d228dace7cb5b2575b7b682e06659bae4be892071365efc80096a4d77a88e01cc2b63edc2400583976c64f5f8859d7ce32d077f12b2647e3e68f3e7766df6cdf6095497a561d1f913ad0a268d5a046618802ab340155c7b167d38b41ccad86ace334e5ceea345032b219fe69fba516ca4e9ea6d28e1f04ca15facb8726e6ec2dffdc534168742b3d0a654ab70a0fc1d956f486032c34f8bebcf2fde61faa2aaaa11fc5672d0483896a3a9e9d7c382d13c66fbc2552ff439bd07d81dec36cf8013e6e1598ce9430579abcd0e6d14f0fc086f10000022800000224000002202d01c685acb946b363a3ff9ee168386004b1e2050687574e93750bc9db934243000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e919c3741a513102ad5fe3a5fe0433055e49da1d3a6cfe576e21a326fdda5940f7a767a8ac4a6e8b12fbbcd501d6f7f61f38341f1372e8526323c66e2870440edc1d7a813cccc156c27bfa3cec96d28454417a59b07b1822705bc967da1b042e933e940f920a8afe085f674c55b38c231003e50c040e401399d28fda4720f3803804b6a93a98ea80d5f2b3178c7965dc37f4793eb161288c7ef7f49e7ce7ee129772d5c5cd3d72592eb30e9f509c3074b519ae66f441657c81de32ec423180b7ae5028f4715dcf3299e7e8fb9753c4c44540421c4248bd05423cf54ac4abcb242355e8dd9eabda88d23a26bc35e4919fb6c05039b6bb370d1cdebe04bae1b42c3755ddecc7b2542df361f0be1ec51fa08e087f79964f31fdeb630f88d6c69f6a51bc31f226ed38fb34eda26634925efd63bde9095103f9d904dd849bdbd8d362d8ec31ea5c550914c74ff38126e80912c58418ffc80b6e9a0e149c688c3cd6d28a5fa9844f2f5b903753931088edc574e5e030d7821469e59cae8e2363b05f24d3a8294e78cc6d6d8a87b33b4206d6aaab6f6d98d0ebb987bab7b5371213690ee007233251573192e6745d79a614bbad03ba5cd15f58f8c8c6b950e1eea609d000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400101d7507ceda1eec9ad93b42d77991a8dc1543bd303e1176c869bd18d37799db1021938b160ff1b3352126222652b9a96a3a6984c4686471dd0ed9e1dae2831f612035590e43197549190117f547650aeeba4ef4ec91b3658342af45360b9e6bd3e0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dc27541054c8667a56aa10493203f394626c64c28f5d511ab4890a8ae987870cd79d83d742a57fc404f9e92461a0a51d684d79feaed7210e6c9c1cba0f15dfe5c59d85fc99e45f2bcea2138fab9b8cae5e0837ba329fc450d15a51d3a8af9da48538db5b501c47658503008ea2b6ead8b0a23741b1f797bb9043a47a71f8675a6b97639f9a7de94cadcef02f31d351bb84af63659049606cbb9ea4ae09758e3490ad4931d2c0c215cda51868289d4c487abdf2445f991741c23a4a563256a757fa6a36033d7be21312df8e68b06cec70bf6ca76d898a62b285cbd75fd281adef42fcdef830fe1ef40b6003c4bc342df9431af36e1fdfee741643bf4b62599d8f2ca3bf45f5bdf420762ffb8553c4a0274245bbd594125d4333531e59a0245294463cf547189f975c96b304783e37e1936d8da20a5a94a532123e88b78512044586daadbabeef7be68aec6d9f34bc0ea36c0c3dd6b024a0e769eb2f4b1875fde76382d48ec40465c5f5b7cd095cce9ced28e64464e4b2111ae73e5cc82a33535311e674ccc3d98749fa2df8308358043abbd25eda76fb862c47f34f7de837e404055943e941eede3b0a25e9e76cd216c1d22b18ac16449404c6523864aee841b00000228000002240000022007c9ed8df02bdc04d4fd5c240857423999dd2f69f1c2d47b111749472b43d0e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b159b9b1ff7325747b5eb02cb2daac948a1613b0427120757698a2a3676c1595a03efef9d2223483a89feab0e1d773fa65a7bc36c641485bf2825ce54b1f8593a18613c155a55983707202999f554a93fae22629c5f1a9e2560bb147b077e72cf946053aeb33892052f5f63cc8d3458619b3fefc4160400836ab58a8f1502358ecea4f2377845833bf84f43ba505efb557a3a33c61f33d97a7802d2aeb0e3fb95fb349eb6f5a3dceb4f26d6634dd91c49adcde19b8b06698b3cef90b9551cd9ba03dbd09012d1ebae7098ae6ca3ba558c6cf6add4a0634296e8c492f70ce54130e8174920108125e1ce43af30b30e8c61847353fb611ec9701d3789e56f5df8e61b2c595da806f025944ace363218598a685cfe5147fa6f8a10fc8d63cae4161645b24203f833b87771104cbca534d48b28cd9810b41ace0cd3f472110898f80b1ee06da4fd28060f6a27eeedabc5fb978117a0d70f89150aad4c9e540aae653e74afd767b126487a5bdf6f3bd83e223b7659abf64d1077adf0d0920b92c658b4930a1f05ac683453cba4d34b346dbb50f121b45f28d21212887b7f9bb016b13a2e711a3749e633a5791d6dc19b9b11762007d9ee208387a31018f009be2ae0000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40013033cdd885f7f0156ceeda9df45dfc6522ee24a1a306623796d4290fee6be45e021b1c7c919dd82bfa8776809976b1ecee4d20a7a9dc619f0b5ea99354ae6a401f1edabee5cd0691af4c3d9e21ff5d41f6634b91a4ae6bdfc537e98741c5145d640000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e27d993eae0fe15011bd2d7191c4c47f2eb6e39281fcb3001f04d9a591332d4ed9a37336052e4a493251bb9463360bcd42525b34530fbc06e8d686f5c7993403e8806ea65a457eaf528e9adedbd49fb0295a5515f1656e7c8b77ee3f8f7960e0263e2fe8e18115b8b6fb0caaceb15bc7ca5ac143d640225965313848dc47f82e4b23435b8aa97692737e596dc15bebfcd1ecd2df6ef6483d35444413fbdf10b184d246e82141a841f59195ad43b521fe90777552bdc1dfc35cb0b3202ed056f84343199b0b8650ca957363730dc8bd78d4c70f4b97f37f40f30a0f9b3be7418c28a946501b6eea2c3e54bf707837daa2b50ad29bd8d0d7ed570bcc7e996b29dee21cec0ce24b7bbd6e539f19db474b60929e100b2d6db347723b95916f5e39a452e2691563e98206f8395528047fe05a97208b8535e45697158c51a14522ba3ce8bc1cb177e5ed0bb28616e1d750d1dce80ea5bd2bf1e99413e1ea2663bd06d61fc8d96c5e358aaaf208f23998e92031cdb8e59ec644ae7005108b2155aab9e3046f53875bae38dc2b55de42429f48a87fe31c3cbcb296ac5b1e55a0bfe57b38b83a0ee7e4f060116872136e948ffcd8f6dde289be1333056da5c815fa466410000022800000224000002200b4f957d073ee8e5899900443151128f51d3d616186c7487bfb0a973fc35697900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000999fe09e71be88977c8847014119287bdbfe45dfdf674694fadd9ef3527b0ebbbdd1ad2b032cf00cfbc4fdb29cdad790a118ec09db8a9919e1b68aa5b05384488b497b68b001c6a04e0df8bc7c4f024246beb8747d1630c27ba86376959e22e2355529a612f502014b65b53a6c78c93364a36f3827da445caf019cd3779ea576692db3b220b08b717257714a23b557e62582e8d155df5db84d79e2f81595f661796920e1011fdfe5267aeeca158356d9349abf69d7c5bdf90e4454bc24e017c075ca5c7c218e91a3875e727746cc8ffc4cb10aa2eaec980c7f7bd19d85bae5c4f98d74743086cb6f94e8466d99ba270d393e709bf578c1e1e00f199dc1d284f4039eed98a49cc5203c87d97e2a5adfea6c30c25db277374fbc0d86f579121c37ec69bb4cc21d3ff910ccfd23318b3087bb9097ae9c449aaa08839e7e0b7edab402b00cea7106530633842a1c6499c35a92311f8c2f2ee3429cdc8489a50b4b92bd5622bd20ed44303490478d5e7c4c8805949c57536c7e268e6acf4901789dcac2ea7e12697c6050b2172a40c4c90842b7fc8de994599e7d0f6865e856f969e59de8653376e12cdf575a14f6cd2aca27d3708c47e44942b255dcf8ab2754fbd3000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011f4efe0de0c1d5af48f2efb6c64f546ef5f7e00a48a5a59c2f8766be4b5280f4021d56ec60d7d92c4fd3e93dd5b5449869814fb78bfcdb57658e5536e8d0c19d3423683555d5f7564eb7b7065b3c85a9ac93070e565312a4d0562771a554d10619000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab9fcf3e23a90d6a173392212faa093fb4561f25e40eed01b11b0e902dbdbf0046111174a733f8e709782bc29d81f86a6875d1ec4d851c9ceeae2166507794fced416ed18ce93a4c57ee5b8f8a3c5b616e0b5f38bc942faae87872ec7f9e63e833a27ff10d2ea680f17ff38ea3621d10f401e9ca42e35ea0ef5d91907ff0a9ed84a4b89d6265a32b99de713a000ececad96637c178c7cd5f3982f4d0e4e02c9eaf7626031019cee290512c166be1b623e90aacb76e430c1b27fdde7d52473aa8f4f0fbd237563445f525f1533d716034cdde9c61a3486e30b23852e99211c7bd3935bccbd1b6240fd6b46bcdc8cac6787c205cd67af2da92c1408b3fb84f149f27e4dc88d51310149b2f05798e69f714a611a62c214c98707cbafa5702cfa7c9e056b214496ce0b8e0586ca5bd3b0e416ed9b7104298a652beb3d0e1794f91ca3737ef5cd5291e92c24fe835eafcef4c0aa76a5fbc0a44e9163be315b27c087c9fbdbca9699be9b39f5d15c946ea4981f45347ec23a83bd503e1190162e6dea093a83288b7478b672a89ab6da4f5b5596be286248d72d53e69229babbc451912cb5f2b6df5244500404cdc60338c0447f18579016e136196757974aa1d35c8230000022800000224000002201e2563aa658de58795b1cbe9ba84c032c583fbe2e94cdd88537eb257f95b4bb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b8922ba60217b894ca124d95781e0e30e136a6a605dd1517a08fce7b512baf0f4d3b662a0490efee67a4dfe42a62370bfd08934e46a3497038a0f4aa82593edef8964859928d442e25ae6bb60378985feab58cc172f9bce5662162d446fe3df4aea5f4b8037cb006532be8c018de423c34254c2c9155ed04880060e408faf7f81b5be5abfbda9cfd496970be63d51241f474e01ffd2434fa78ce84689bcd782cb3befed4a92b7924cdf1dd977fb4fa249747e49e81cf1733fdb50d43d0c99b866180d2c3aad630e54275dd4550cef2de49d6c9f31e23358a8344fea1264315e28d9b556e3092821905fc0cb149b8e243ca7e8ee72f0241af1f1cfdbc332269dbeef0558740662febe919b211b72b01723a08611d0601d72682fce7cd4aedc0b9d09561dc5b1ffe7b721d33494db977e26aff2b97396023b83dc3c08ed7221e3c68da38c57caf5feb9311223237b8ed020ddf7aa3f138f3df39efc5b159100ad46264c777eea8c05acbd1fd0cedc470cfc0def6750b1fef3d3f5e99e82bb60608318a363d674ade92de908c133c23ca79896aef7a495faaae27a2ef10d8fa4e6386b16bcd423301d1298ab59256b472c9bccba9ccce88ebf5af72c12c3c204b2000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001147cfdb43ca58fe7bc14edd7922b62f3f34a1e7719b6406a9668c9df7564d74b021e0810b1444ef37ff148e7ee402129f6755061136a0b76a47026424898211b30112c260a2a81e01a1f8629c7e9d94ec8ef0d04f9739e5607eea506b739045b230000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cce8d5ec7e8dcbc425c0f633ab64db89e85281ffc4e40d476e68d4be27ee9f8cfcba2cf3c13ab75a70596f1ecb3d418b89b69ef9130a2c5d2939418bf5f31f5d2234e3ee59a2e006092406aae0b7d107d08e9a6a5e4d76bf04527cacc4d78d8a3aab99542b6a45369a1af8987b3cbd267ad03f41375d1a44e7abfdd1d0adcb54eaac51e6ee944189f9128effeabba816df9d3b245b278b9881332f957c2f1f0b015680b19f924c77bfafa08f6909601572bc9b0b565d08558bbcdaa0efc058b332fb863cf170c4669e004e9b2df9921a9b94cf38f80125e993509f87b3fb9e0d7c98b0461994858cc987cdc60ddd5eda6ba452de547412adbbdf1c238e4bf5f86d33a79de46b369524ccc58c6814b21dbc4ea502ff0478f28302a0107d195b41d1acf6d28db49727f197803a3207d2bbf9e552159efe1b8b788a2b051b903b4f442b97fc5029cf02eeb8b5d861f9a075f198c87c9571e33ec78ed3693b57b6777a4ecbcd9b65769ace9db4fb0be72342f8d0a11eb63d18ab60cbef2f429042d0395b363c8c0c8bd6f7414cafc2c30c01c45eccde818323800c68809a1a1b0632d65b747b6f6e9129f0b5ca1825f05103a20d25bdcd196c1f39d38742bf1792800000228000002240000022024858ca65c6364ef25d9527e95795ba3a193022a0da07b98a958503e08cdb29a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d8991f5c4830f98eecb961d7f9ab5550d4d07687dd2f724360ff2618884c798b373cc010de01efc6b90733b7db6290ec1a56b52e24ed477af70a4bca270c39c52fb6051585124f0d5c222a4da67c17bb35c331159ff0632fbdfea9408b33349bf1e5815303eb930bc9ae6961040ee9dd7df0bf742e6c06008005192c7962a1e8404a100b25c8b4116167b189dc0afcb35a298d0f49d0b4f351c65e3e87597fce7507da421c78602e15037a3f0c9f86bd49581355353acbe7e6455b5b9c5dfdc3a972481cf6bff4939032c8990c02164c0c1529eff6e6b34dcf96b3aa1cbff03d837285036b2301f55e526225dc9757323ec17c422915c9c9ec8c32612e7edbebef25affe5c5091b50e4ae13217d503c710c42cd15274b7daa4a6fbaec29a895265ee908ca11eb6c3ce5a4438e8a36933725e24f1d524ec71e6945b875727675306193de744dffe43496af25950998c8e4898a62d0a7151d609cd657091f0228b072f810e5fc012b11d68e95117c04a78e6b7b45b6b641846c3c701d4354aa85328cbdd82070f433a29ee1625f08fe2f6f6119875b21d3c5c2758827aa7ab9a4029d045d482c17005b03137d9b2b73487db0c304ca29ad5f00705f8c6dbd3468000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012312389a413fb53ca0e0707b418a8cea56f9f19499fe2e79fc32826330c501f0021f48db8fcd782b5b5c857b7a8048733daf9038ce3c42446547061d6b394b52c5014b623ac4d624202e4438acde427c09cfbdf40038d2593a446a9396161ed3ad0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f12c85cbd8c287a6d199cc1b297e924e5eb13a98fc1e57fbecbca8fae60623d15a35e95d254e4af471ca3187c04133585fa5efa7b74a648787826da12d35b8e5bc835ab1238b17fd3f42ef9d6ef7ee96c47452c126fcb68d4be2249e6ddb62b03a878274f622fd280a4d087846bfcf6d08ba586c7593a3a4b90f2bfb73e57bcfe60f5b7b4966c943a8b6228a5aa16b0084d42c8b634e603556a8d38e14645b9b98cf9c124967990fb019e2c21cd693aba1222ff6c3a44672f59878d04751addb293a03327e754db6c12061f867ab1490c208d435c321f4659654bf753eaf52e69c2d0cf6aa02201dddfd273676e958483372525179324231557bc214677596a68d4e3b18bf4364b5e8e913f17a39f7b5199ef805cc5b7fb53e9b7a4afea0d132c93c69edb1bdcc55d740d7c7c75f3e54617952dcb79a0b6e13eb2c03dbd4bc913e23f9578d851561b2bcd27d2a760ab585093273ab5d274aac826c13e9ae51083e25e8d64f4fffa61f685c0be306859ac1de62398890be6932e5442ac083189ad85073d20033adfb5076df55e44e917a7d481ec08d6e849d31bbb5548dafe0f82b340052b665a922b2caf2ad53d8c8a1f1ae99e12626e5c4e6f90cc2ffdfc9f0000022800000224000002201c1ec432fa1dd1b9e8f79eb873a43cc3a757b96c6002963978dc191dbe579d2600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad129529aea4813985ca97b32c706868b342d54688ce11e6c83342ddb08ef6ffb504c5277fe54465c4c555d6cc9fcc55de24e3e64eddb274c4a9eedc5edeedc49abddd934e54f2c074b721395621dafc9e898ecf4d6c412634e5eff3ad0e9a30c4989cb85daed9dbb344eea6cfc4f7fd675151a5415096cd43d5cc9377731ea9cb30895cf30144f8e11b098cd9aa0a0b435034d547955b767cf176b80b50db321fab987688e903b4b6354ae6056294101f871b9751c68842b8497c7733d855d22bd9da33f4ba212408d6a6fd649f8635d2fdb3f9f042cb0613705f628beeb935271e6bd259f65d194442598bb056efb757fb7fee2173ebfce7a1ee41497d15e154093db137dd27b944bc01d60e23eb3db67ecc1b4aae316d3184d8c7e41c657237f575dbea3c788ad10c96dd5a25f36161547405888f765c061677781a3a4c80be04724f9087627d76f1b1c4b7e7c4323e835638359072f97a8c8334d985157542d8f1f8a370bef19b93d23bd84861d5d231a7facd2dc5cad1c0767281d10f10b0252902dba0b8c3bd340d28e1aa519fcb195d1ecd21165f5d91e5679b7c5d86d6b37c1e0ef9d10ff978fdbcfc8ffacbcf4b80ca55605e867d5edc7cc101f76b000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400127c963f3b9380fa68b7647bdebca3ad2a0a15769be1d194f9e0cca1e65134873021f5291ad81ab5ba473cec847c9bcf1b9fae070d983f825989121580657eb425a1047969234ae864c572ce783c1a5981bdb2d83c62365db47985dc097f1c481cf0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c9fcf686a6c0fd6e7ded33046709ea10116ad03d39aacfa96ad9b6d323a4128aa3c599e92f6ba46bbb98fcc8a3624271b9fac71f6acc2fd9f0b11bdb1576af56639bae0bd82c8b76447fde5c864e9be321076dacb4893c70f76bdb7c46e9fcdefbcc7bceec5964b4efae2355a45e3bf7b0b86d9e36480925e412a6f70c82455cd3f30ecc5074352e90589bfbade0dcf24a7374e358fc367fc42802a1a843978ca84855b2c51f2ae5d78df1efe8d8b29079d863a537234d26c6403ef90783a4cad086dddde4f3ed1970b94dd6d576855a4cfa397e59b927976c2c211c99439c7c87aa4e354adf170d90a4a99d3ecf3d6c989d2a1821fd85b0255b5f91ebfaafdc2e133eed51843c1883fec7f4bc6c3c7f04dd4a5a3987f0ede38ed469890c3f450141116cac4c9856e5ba21ae9a1d99bafc8e03364448e64cdef2245836f8cf2a5bca3e3efc2b58f96dc7bc4c96374c3855c3bb04e58bfecb6caf54944eba54174d14dac4d7ee9848518c768d6adc25461e05ab2ea982d7e4ca58894f13fbeff3990262bf086bd4886d0ddda38b1177ef694e2834a6c664dca88809cddd8a1fc111ae1faa2e1ef57845793378d08c1ca85dc2365f4741c458483dcc8f02363970000022800000224000002201dc3587ecdbb3469e75b54a01729cc83fc87c52d965a3af252bbc0587ff6dc0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010ba6aca3ddbf5c06500248eeba07eb2127a4ed7a2b9b771cdd8d627ad5eee85ac2b8311cedfbb1918ed578fb68bfb201cbbe26b0b84cab7e48b6b6ad90fae317cbebc3cc1b479eb97891d94f3fa36ddd0939399c61df1c2980362f95b85713466579e9588e9805740928fe530e50f9eff744ea8028b6bd2cbae62b4f8277889dbf514fe8d6044e8e49a12018d9a073a45a547418917b6b187c8385a6a4949870879d1bf6630c836b9aea18e80f218c3ae40285ea5a005adc27d412b56b700d4803925173876b8cc83b75ed5b46eb1730d92456afc5455d4c3acfccd71f8cbfe6213170439bc349980c3a90ce9b2d41eb631d2ca4cdfe2f0d3a243e46f9ab013419803f92cb048c432716055f34ce26938fdc44315b30adcfc51d03a527d5cb3a695f710380ade3da2fa9623773cbc34700303f2465c4dee31df4c4c0818e2d9ae61227256cca95f9a6e82c40c5f70d80dc4551560c1fbe09b78a921c7f5a71f9bdba9ae697d575f90fb366ef49dcf61dc82afdbfb9f6705c0cd975db07913d840831762e31fd0fcc6256525c669084028861b36e5311e9d338f7fd4f7d62901e5f1d55b95f656f7333f70dbbf21908bcc5b02c1b2caa521ce174a4feb42000000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002047fd44a75576c14e40939f8f4a770b6fc98754d4c9600991b0e57f11e6326f209dd878b6ee824013d2de70165ee770463bc861459511da0ae85970ff7daa2d0022074d14ed8e462a7b35f13c79068db34ba3db5d8c31acc522ad50fbb6afc84072cfc88faf2e0eb88412cce722b6c55a7e31839071111be97193a98a0eebbd0ed00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000239806a4a248c4e3a3f9e77c42067096a9cb7864fd086ba1e9db65a4ba62a3d57b5eb1d11bd9f50f4362ba23f5620a0fa539c1d92448502c228463a1a0263b27efc5bad0cfab97231735d21436c1d51a12e2b931e0151447ed5140be56b4689df79b1c75e37e7d7eda3612d2ed003258a417932e6d3da4867654877b8746a050d7e0fe16fdf5aeaf959ee56dd306f8d122d872efaa3ef2377f1ba221f5a588863940e207cee2bf6af67b9e8debdde1a7b5b013850f7ced23dd7f97e4945b21ffa314160ce174b88dfc92c562e9613b34e2f2a62d85043ae0ac4f8db9845f65c7e0caabe87413aada619a4e329250aaeda63944acfe89a5ce68ab6c0337c2fefc9a81ae5fd2dfb913afada759c5fcc9ef35b06ea1f0b1f1967beaf358e37b01d178991aed7de28d66802dc822d84cbebd4feac6560f0e8220b243e0b1135c3d0e63dd77ee201cd682945170d7034e56cb6df190f6a50734ec485d09299821d5898a572987aaee366ef520226654ec4cbaf1b90cc69efee42ddcb2bbdc74880b6e377946624a319cda70e4202f69ea51dde5ec3407d552b68cc63ec23c876691a7915a69828281e434e0e7daf99e29db325ce8194b569630bebd7b6a83f20be2e00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000861522c2a4de307b40f2eae830b95f4f5b474ae0ec70fbb42aded58fd9b4068ed473c9466d7231c7b509cf7be8d0411676906a0a94b75c64ac08096fb23a60bfa8befa8b4ef04851b5f6aea8e472a38133ccb84cc5ad84e8ad5972c801952a2995434ac3a6ae567f84e222ba88645dbdcb73c9518ae9af6e753bc589853a001f3bddb87bc8a92a85d685ecdb6c9d99f0f39a764866ca635544a2494f79055d516cb99c724864aa139506b16fe3adde8847973ab6d76116725eb3077f4952513e7249d809d836e3a68734a146a472ac45094fba0f3c3b3fc8a47c35dfbc3e3f147627b989307a801ea655e2798fb836c483c780aebfd08df397861a068a3bf1cde3b9aaae266d132cade098a54e90075847ffe23aef8d715e1b9e44a706b48c8a2d58493c91c2b2be729e3825b62176aa060811ed0c7f37548df51730afe4626d6100d60f20869eb74159f8b2e48fe72a54c3cad556914eb3dfc2041b67e10b68c9afdceadea181a44240395221ed04da8d33a1c815d09bcae6262843b0391def677cfcc689ee19cfaac98f37effbbcc923f0fed42c71337abd8c9518db390a25c14a4fce049e8e012891f55ae09d729363b669e06c27bba163b32a7a823f2dfd000002280000022400000220263dcf5dd5512dbdbdaf7aecca2fc35b94a6c4e0b0a7adfd1f88572b2d49e8ae000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002430c3b8c98ac51a2094e512df8c4383f4e5494722f63a7e6fb31f1111e9d98d42394e7199f4bde3fca8f9f1be24b8aa4397a394b1ffd3007e30f67a35c933a014b741f6aca402cd8b93b34720738f8a06d946ffd18f5b14cbd05535303eb53f55e1d245759380552d0f7aa35dbe9d39781a2313ea0b3c266f113fb715dc0a492ab890834f98dc1ebca0e1164611c64c06911553e4de976014944ea1e671842b21e06ec06ae8e605bfc473b9d7628910a1114fffb28a2944079be73c74b81a07caa7589849d471e70bcb18fd765148d7044f3c90ca3566928689209f7521762c8abe583d00d60d0959ffb56d95b364a26b186c3a02cafd9d3b709c0b39700530c3ed9652de33b2624cfca475215199a251b11d95f239513adfda6210491d0b49b9d27282961ce71b90b8664bce161e9f51433c1c2d6a38f18fbc2af83ef7f270ade4886cf19f2d531ff20954fe63f35bc8811df427665f8ab3ff2d41ff0ac5615c134dac7e2127310b1fdec9284a965e4ddb334484daa91f627cbbf92aa476a15f6da9e4937c78efb40326a3d3c66929159b6860303e43732d72febad3d966b95711d6257b7eba998194f8e04ccaffa501a2413fdf82321e7f6faf886613ee14000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002004fe36c8a61d8417279ea2d1c31f668e6f0105ef8020defb6144353049241d018d6fd8d21d80a1141ee3f5fc4d597213476177eb95bac66c31212b1edaf7dd20220bf819441897ebc70e55e0c13d427dc08e2863598d789e39d075f03443547871f30cc87e108ec69e082f92d56a52bfc649414c27b9f92ef2ae6bf56c553947c00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e52fac87fbe6fc1a3010577f17d11f6a60f451850165d4315001057f54459279f712b46707af8f63777dc560f529d4e14398aa9da29d3d7acde3a121f47ecc33e45919b3db609b06924ab80ab6a01eea62665c2b0898a63c5e05655fca59ba587808be70b101c403a83a1fa2eb2b5f6a9d0f0f80f32ec5c56b6ef0a7c186ae7f67816e807e54dd5595b176668338b0b2de0836e855b94c5fa4355fefcd910e9f6ce5b2fa08e754c0bcc4b50e5352168d25f7e162fb5639de4a2c44f8dde6f643eab733abba7142483d4be985ccf2c5d9dd14666c96aef5a29028fe299cd723b6dbdb8ae3104d87da499ffd968137dbbdad33520dd68626b92fbab106e39ddb46d48d6eece1b3bb951d4256c073cd7874345b65f81d97ab2467a9304ec715a3713a73f6872b023dd27288b7dcc316f2e5b3b07a4af89163f7a294490a23e84c0ce2a2032921f7b647dcfc383b14c23ab5b57cf4a1704923a46123f0eadd75923a1c3270a3351156e03018eede098635827cb813c9610910b21bb3b60ae1e94e1d286dea6ab7f790455afc6b1539c60bba11da9b238bd45a8f4edf76cc76fd0ca74f944c826c9c38ca997a181aa1d5d372ed008a6aa1c4e9cc6e43a94f86a4f220000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ababd816020fca08fc53ed3196bef0bc4167146e895ab1c964d0c4d355303da7bff81b4e4a722e76892a3712dccc3a1be43e5e5143c580544ac65d9992af25a6a46f97e518b9ad67a791687ab848fe22cc93d7768e5fe57ffdb216dd749f4b25c101d68bc986505ccbf676332c8a7653a99bc49605df898200f5975c6bda9f1a8f1175094c337aa031f63d71a2373e283e034042dfea71ff326f17481f967551de41e0a8f46e9b26d7aeb47f9e14b12c9b97ff90165c42a8467d3b455e39ccac4913cf002f86fb336fcd913cb07faa08ed19678d5a7ffc077e2080e4ed86078895beb212ab9021bde83e8937b885661986ed1e8a879ee00202f6bed7f3d3e6a0598ead3f6436f5f66d7b779cb405f5e400a46866fcd7802319810e2c3f65352b89a66b9e5808cfe7c998a180dc856d43642145be86be6bf5345101e917c0d65636edd8b3621b3e1b732da8a960d9324987318e0a53c77a459b75364d8502fab7e118f6fec620365ea8293f893378b8d80cd485942f8a3120939166f6b0615b760cf0875995c852698188aaf70c9ec7d397ec225e981e698bbd4f6f10a4d9130ffd17677063cc3fd5d6c0cb682a7d03aac5decb07ab10429e0659c4d9fe04bc49000002280000022400000220189774aea0d9cc90911b7897c15b40bd401cefaafe6a77c8d1275bb1e49b2918000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009cd7fa0c2200f873cc5850b09f9acda11a34f1438a6ca8f31f58f06002a64851fe48d519782977a8bc6fad02828ac629f1cbc2870c58b640d521d28fece44f518517262742d352493d26e476516eb99acf74da5a0804fe358d33553c9d2d7d22b675a0313d193d122da0ab725e56cd638581ea24775330c4ef5c770c3c88ad9b7d93d335aeac55893d061e9943d4fa00f96108876e2babc1ea7b60ff404b3476280733e975dc1059ea88a1831d1a569e00ba2e7fd1c48687e8a5e003f271182312214607d300da03c347cd2c2decd9e7022a2423ff5ca75228525a8ae3a728446dda6e84000dd67fba08174df14a23daf226c84b66769ff26974fc85b8b2fff1913e216739ee8b813b30d6ea92da235e43d943b426f7e754b19de2f118515db68d37762257da2a6fd0d94ee00a933f0cd51c918db02fc65731815154a257967d3ac6ddcf1e219a9a29af09380de683cc9c676a472db76abb6332de6244a8381616a4a66c95bf4bfb3c94cfbda04848e0b441a6f8f7714b643e9353188328fc7a3fa2a21bd201d541b8e5127d3a79ce6985480d00c64a33ee7a63521b111204385bd8c5a65b67be00d290c833bf3d6749ec2ec1dbb79227292d21a9c08a8746ad000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010499ae4be008eb0414fcf4d5280200432e0202900e7eecd85cdd4ad1190ae2dc02224e00c35e5165367e353531a80f06e2b4e9814e2e9692e3e1d08c4e8459d38c0fda627e43311bda7d2d9cfc732bde03264b43796b080b5f3cb1aecd1d5d1b39000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6f5586c38e747cfa10b14176be9a46182c6329fc6f479b596e16c9f4f04792ab0f82792cc94b88f2a7f2e6f0f71bdf4770afc8e51149de6f2d86819b140fa658cacd26251927b9cade3ab5eba8480e44006628890f2aff2e94160fd879dde1af44b86c35161fe05ef5fdcc01b11de575fb2999e4465c67985627f1249f555bb2ef1f9b7f4b2670adea1343234e12b9a74fdb93ff06b9c5d91d294429f4f02fb531d7a08d8dd32545e4a16a567f0b4d8dbafc044ace1642cd1f20f103a46072408733cf3812c9d995ed34853f03431d597b63bb7b9fa8d1fc53b9aa17f9c4c7874a4f87a930f9a6267f690730cb53a212775617858170ad06433cd6316bf482ba5e840a4cd270234e38c5299b6e14bd017c42357caef5cfbd6324bcdd6e4161061278b270b186d14aeccc42e20ceccbf5ab8bc7516a44cf94ebe0c31ad2bbb341c347b4d3f50e6548f9460f40145a956f72000cc6d4bc68d6c7713c6d82694d90727429b782ce39b5808df6f36ee4a5efff293da4b9467eb87cab48507ffe5724880297eed01a9be57ac64333317ff313b02e86ae287c64824141e3bbf0e355743dac9891543b340b054e5c64c85c7137d6dc743e9a13491df2cfb4d8fe9809d00000228000002240000022000f9e87645714ed5b7b32b986aa29a9a18da964f338486603a22efb103a9de8d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e1034daa36f07bc7f1945d945131ac9b2488e17a68c7842af9595d3798dfb37e0ca32ed8719a0bd7e876fb017160b411c6ba2acd3f4ca45fe88c9410df392f5b6c95c908e84be7869541c5e2934cc8e47f66f02a59fa056b66b1c0c085f6052b85f60dc5522cb0308475bc01c1b75103f2b8776d801234d8c11cedadfb72b331f0ba4d114af9ab77fec8fbb6bbc22972bd6411d2b81788e7715b1ebb30f36aea30677636d1f21b998ab5969aff65ea1a82a0fa544b6f4663283244b3e08ceb7d1a9b0e3bf9adbeb092234c633418aaaeb94828a1deee338b1304519e1a4d668e9ea77df5fca12ded8964eb97e435468d7dd4b2a8d36642075e0ce01f7c0e95c5b431f1bc576753fa822dc05fc271d7b2379db4bceec428f83efb53b448bf8dadd772183cb1d161788aa13b0812356339c58ee37d11faab48872bcdd137f9a7b881cdf02af3eac1a37e67efed58bed543f6f0315066947fb24e13371a8d28284a40230c81576f509df70b54cbac48e0f7f86d6d17ce579637ccda2569e49d3b5249d7a290bea5780e4f4ff20733483366d6b806258903aa9ec083daa4c05241f1e3f66395459ac260b7665a710954443ea9bf9c397c35379062290773bb8b40000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001055da85a2176b9c8427ce614c7689853de02fde71d45144819ba9b3d71ef7dcc02233bd6c43a90a3bafe7ecce61f229c8030a4b4e00b5effb2a42357b2f44607ab2524e20d855bfd08c206e08c58b47f75751827d2efaa7be4f8b729ee68ccb9ff0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b42abf4d1db7d0f0d31b8ddc39e809d820c69208e66c245d2adc8a62e916ff6be75bc5aa84a7bd9e6c719bba581bf91e27fbffdb17c92a133a29bd9c0f24a49b9990221b48519b4ebe810f30d9bcf81babf85d5b97d61f1ace063157dc437a8afa933c436609c4f897397d52d1b6b586eb51995a92f2b928cba9f703b8dcfc60430713edfbf870470ebd2b05bdfd4e5df20abd007d31db9ad39cb9cd2197e54e8bf87253177fb7a0e42acfcb7e55bcf82d3e7985f9afb4768b89b85e2cee4c0b3ab9f6cd1d6f79cbb918b1c6b1860927a6927fdc2d99345035c98df669c0ce69fa76e33c13643fb387280103e09445334336b1208d83aba90c11408bbd3169fe9001348a57903dde5f555ec0a22208b02e4bcc1ff0f44597a444613a4c4dc1a7d9df64bd4f52d02a04ed41a6a7a682e6808c6d8f35777ea1191be64e1359f250dce0c31876929c3fe4c4e5ee64cd2fcf6c1d2ca2bd47c50e37d1ac83dbefa7e2a16ab3c776a761088b29c11aef2a335b0265a2b2963cd3c52bdb71a4cae8748eafafa75f5d5978d75ac85402beb749179080560a1178c4b5d35daa7244637f3b83f426570dd9935329c519ff35b5443208e44813c4501085bfbe9a90c42213300000228000002240000022024541bf867ca27211348ee1e4d43069edaa4747aa5a654546c294232f625058c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000255b85dd7dee98e63b115a6b1c7fcfa7070f1280cfe4b684ae08fed41abca5f10d936e087d63b77e8209a5bb94c615877fc166a12c88f185d616453f24ce31aa215a43ef50bdaf0b62f9a509f8a3ca1d00ca7311b3080c601891811a11f53ccfaf4b0db7145a978c9d597bec3a92a4d64eb8390f33d4c17a29a9d7f138f94dc9a24925f5192912fd7107715a2bcf7c0d0a7807dfa9d15e80e7e4228cb6287557f65a1273c66a9693f4945a8a183a4c3084c85e1b2c17bbf4096902ef09381d85e94a7f1bac2dda17cf8b16d3da1ea59ca96cc16a6aabddfa6ce9a8330b51c5ea3e9027d541f31724576505ca78aaa71c0064bdd0fed76267ca53338df8626d2dc1be2c68331626a6337e5130b28dcfcf54f0a2453313b5c26f2984fbf332cbd6b856b8a96465eff1013759df35bc4278ea038d59efbc5501bdf0467033cc3948ee1a4aca87c668b72754ff2a19a94e19fa8cd16f7c8f507b1ed03a36d12b111e5e95e44da1496c62ac3b9781621dc225f7f9a88f567e526a109550c5d6edb3b6eecf4113916509cd7034ddd87174621d4ce39c104fd4097a4f4293b461a6516fc1552721a7ed514fb53e915ec9787837f4ba4a90140edd10f802f628ab560527000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001196c219a23ae51ae03e7def476c546d2c47f39e17d98f9fd536f0d34f77604940225cbf58495c7d5217df2a7759d93f1f91919671b6aa7a5645e6d181fb4985e7e2fcb3df71dacd34fec5b8fc13b8ce8882961038a999e77454ce9a9d23fd62dea00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087b798ff71ac2a76d870052eca231556867eb4dc2efb0ba1aeb55099c7aa7f5804026f9d7b48fd33340074fdb5ac92b7e4bb10214910b6d7143a02607b99fc3efae2dcc716bdebcf86d8e27ca6d03a1179cf2683ce817ca79bc7c4a03a7de1971f7f68743b1a613ff716e5d1a63ecf1fcb78037392fc7cb1423df4d6979ac722a6f9e87da608ccdf4902898c36408a995202f50b5cebbd5024a6bf70fbb8291658bf2832cae8125195ca289b22328b80035a8a0d83a4dd18c47065e0aaad0dc4ec4d007fcf63a241391f39b36eb5583f3968f921fb04e8112b19c48d2eca2840020687530992906055e24eb46fc767031c98e103de99b02f8fb4bab67bafae5ff0766310d4eecebbace478d85248936e758aaec4ea886c1d037feff01cf3a0bde3edfd866f30901b5abff0bad5cefee44a708e8774eff27d8610a4a1ce4ce67e14bea61dd3865fe7ffdf1449e316a6bae3a5f3b0c5e268e472a2970cc2449465f0a7e8551dec5f45c6f771f31a180d6524a7a062ece13cfef967c0e21dc0d110757f522d9f49b7398a0b0b2a706b30773f6662f33349c7ed35df2de9d57451d6fe2ac8cc460d9ea12ed701bf983bd5ac54a5c7648824132c2291ddfb576710ed000002280000022400000220094113d03aa1e16f85d6f862ecd21c7cc95cb64b01484fb55861ffd8e62ea0ce00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000968866e272515a05d9c00eb610ee07c3c3d44ae985f3f20a1b7172c7c88c4709f8190dd33c3be329109909e2f690678813b0aa4aabb4ba19a890af8bef47ad455c386d2fe4983054df83342abc9f202e1fca648d43b4aa924bfb32225e521dffd424180520609d1716654e0af6f63387b97526333b3349a58d1b4ed7910ac0b543779b3861596c92733356e999b1f322402936bd2c2aa6b714227b8e8d2a786ee0198bc5bb503872cbfb52406aeb3aa1082f7e8bf8e569e48c96cbbe47fb6183a1e288cbeb63d79cedbd372a92d836a212124fc578bf671c7ee52de3894eb30d024ff17d4afe3b76714f8d399a9e12c086d56fea609c700de3589815f10f398ea27e2231cb56d2bf5bf9110fdb5c8afa82518fe26da7a02dafd0b13d05f62a57bcd96b10e68a7db08a062d7f82d1c2ae3a80145a298874d698a7419b006664a2240748eec820ed677784e3ae1c31766d4e13e456ed0375b00316eb0ca50c39eff565eb1f087306bd35950024ed05b75f36c5218b78ae4bd3981f259f2971705f4c8ecbbf9f91c4e3bada136dd749e71802873a95a5d0f2e645ab841e8e5b7bbfc1fc7399af5113ddf2dabee00ec6d6cdab33022985b6c8eacfe8ba7359af058c000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020b5c28e5e3ee04a409159295be0f9d18de192e4bddce5ba087f26019a50398a02190973c33a9d3eca12348eb10c9097eaabe66b748d890ad02d76032fc63f4d50226f5f31d62dac2dfabb76f00bb59d135d6189f86392a5a64ee8e416e697c9913093e1246b2c25d6275f18efc6b9bf788f2c8e0e4c387f00e3de362799ea5741f00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d5eee7117f0443a667b2a167a1d939309bc4deaa0e7879a3087877f41c2d26f88f7d08b1e052e25ca8725f91645e07287c55b8324c26de36a43dd5406cd7255344e8b7c554ca14b84a185b2a12ea77017219f2ccda711e3a8c8a26a0b6f67de41ae8ef8e255dcc4c4999a238c494b29f630c18f86e88de40bcba3d4f63edaa3c6557fdbf7f5f22ebcf0d9554a375a5491c9d320fde7cb13bc8f516114aa1a0c9d597e4d2cf90798868ec925f21050d379a7d9760fb5ccfa2de52aa621dbcc0c93307660fe3c155ecbecb352c00cedb68c3452821f94b2566606bbc4e506c681e83cdc04b68fb26295babe45b1e37dfc11656400e272292755b9eac015fa8925f96f9930556e66e759aa135b0c18125a9bcff49d8f629a36f3ea5d30543f769d1ee1b46dafdfec7a3e2f441db1dc53ff104d4936af8fe8d0665811b3c1f438f8106903c06ac9004f5eb9ac32c58a406e75052f5584a8b91da1b61abad8b8a182d67c3718dd76352b61034d674a89fd160a4cc7a31a9efee00d944a14493ff9db7f9094b591649e42ce99c616c50745fb5b356bbc4ddc5c8641c36dbd4e497761813d76720c91224fc4de30178c795dbb9a14cbfcaa668f47984437436f77912d00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ca5b9da363983a3252fb480d5aaf93229cd9582d4c0c0472346c2e71ddd6d7b4fa56e683cbc2c6feb57c3851aa78846eda6221fb67ace9f0c6319d2e1747300c5d7c46f5f2dcf6cfecb4dac57dca21b0bce85847262fafd5398b00323d96f531f16995c13bfb714d147d7085089fce0d3284a8f4429d0ecbadd8b1865651270431e81f44e99610d41dfe38f42d1704e1f2b85d8a43c3a00b5cce030d6043b5a7cee626256c5407b70075228aa2d7058bffad66193646f896fcfba258ac040169a5dd237bdf90bea6a9b150f96a034bdfee250416390e83ec93a57393ffb295a1f051bf4c9e80f2306b14bfa8a6836349a2a365b9bf80e8a796d04a6dde67852a03f3bde4fe9503f9fddcc9db0af9ad22d94c2b93835c0a7fad592e33d8c247368e9685eb8af7389e5e6bb0021552cfd55517fb2bf62c70565d4942c64a9abf23933b08d454957dd80c81495f68d9c703293288f9d01925fcc8e564f7fc688ee08c8acf250cb87499133f57e8f5115c077888ee9574601dc567e6700144a0294fcefbf41af2c123124ad0a4be7069cbf6b06cd24bafa76eed2801e71497e2f5acd5354552e8fc0b54a4947bbe26c96794a73aeb120d9155781f2f63401f14e8f0000022800000224000002201d85eca52eb39f0eaac3c31dafb8c82c15aeacc636ae5276cef8b6e00e15e36c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096bc5e5f32dfbe8ec0f23dd7b3bb6fabeb35378dae6f77dfdce0ea2fb90abb674da6f547972fc39146cffc3447126583205eb96cf193a179d8decf9daebaecd12f751533bef3cf27b0dc86455b4792a05c30867b3f4cbac305a522e2138d3ad6e3ab4357dfac819babe838539e1c834909d952e11bd2cec7130f9cec2c64593c0e9ea862f1fcd7f6118207f92dd2ba73b574f16b4ee2e67188ce0a1f40c611743b484f0567acb234d054e9a1c477897560a7717e323faa854e38fbce1af82bf4f0d4ac1007f520da10794b9d72a8c98d76c14c26617aacfffbe11f8693004ac436a633d2060a95fa4a3b86c231fbc12b1ba71a6bad8e9912d4a2783eb17101d6f5cb7beff9ac1c2561e939d73dfec204cf5943164cb83819ecdb51e0e1658dd397fe94c4c5b90050831f6e8ccf61a78294ea72b83f44994f107a866fbca91b7e8525a95efbc9bf6b9f63eaabf8ffe9de6b9876f530e1eb9683b88be4026bce4209a1bf4d4a3c7cdda4b3389ad0667bfe0267ac3f26ab3fd747ff2243b7d8d414604d12d744377b6020c9326cbe7831dc1f163e986572cb3539f7a1b304b5fbab491cf7b996c717314825281e0246aca902a60a91c0789747dfb5df733f181202000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020413f2340a80fef338d7b9344daafda565652c92e92ab993bd18a8b9fbff52cc1195496ca514d8834f912926140260b08758c87b6bf4b1f0126b880004452fa002290322c247de3d1d62fa8ab3ecb75808e9e4507bce5b3f356aeaba0ecbf99cdb16f5a3e7d032c4cb360a41be3a4e13c91101796961b25ff64124228eed7fa61600000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000166ea68cfaa2aeddd13efbadf3cbdfb93969867e51965f31f82da95e50b499c9c228bd890c47cb30067ceaee4aa5d4ed51ef3bc7fda85ef75f42f186aa65fa99e1e15be42ed1829d70c6baa785237e58c194a9d851d363521881ad5070ef05215e3d82022f6739dd72147e3a75063e71a7eb40b4b088dc9efd322ec41bb4add59c721c023312c4d2b64547701d73d381bdd6a6913f4f9fcedcd4b50d39ca9d77ca18f7603f681a4ca4ca8f878b45815be800f5b3e08d155c39e67b917db58bf74b882e55b72ff858739223cf28f48cc5125599936bde638493afa663408a0e0cd3fc0412ef425465f2f03682409ecf9b5dd4264bb2b8d9ac5daa9bcd91efadd7082620cbee0d95cb23ba0133819612dd56dbc01e5e577cd6bcdba1f1ab8f71ad97a516ac46f9c37e6272b345eb8b8f23d28460705968a1dfcc266a24a6d62e061d5b5c166fa69357002dda38b693a39391f7b8b0f0aeccc62012f46264a4e4f6db17a490a4f4d5d6329f479b03230bf4692785478d3215692dead622723bbbdc0f2912a126511a5e7c4700c88da916f82c9379dbb5310dfc80be765bf6186706e43f13512c6833fb6762e0e4b5b459a9a153e2c14712e242ffb67ec96e4256d8000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012b2d187714175c2176fff223e8fba068e90b60eea0e5d833a55f070fa58b19783eb05cec7be8c7e381f3f04d1a4694a86887dd88a713a8d46bc320c3677dafcc1731df6ef6ca2bf644f293827399b0ece4e110ca8d979ee867001092416f2cec5d899aeed1030539d31056a7372683d5422c7cb1e5ffade6237d0bb9ff32063c71a9ef16dee64bba397cc763d699e8d86d1fcfac1a9bc48f7c3b0cd31cf929f631048c0704d54766183477e75a176909fd1b2fcc92ef7ea1c6c738ab94e5722d6e548f87f151f20396ba4880f2a60834c7f845cc7b80c63537fca046171b710cb108323dc20a3776a98c228b67e42842f079526446a13ea5fb9bf42e5da9945bf4f67bef5268c62ccde395c3c5d5f9372881b9e9107ef55da61d8033da893b8d8bef997b924654bdc8b7eddecb7dfa29d504af2255eacc9ecc0ab73667b1e589ae3dd4b24cc2433d249a5b58c7fbef5d5c18f5f921c8084c2f6576ca8ca3d603931ca303db8b3b2810ec9f270e7706da6eea69e28caea0293fca625f0754330de13e1fec9413a966bd81915622293a4d80ba3cf5bae49558a919fa99f210d65ff5783d3293adf79b695f6acdbd96efb7e4225659c17ea3c8de72b8f2dfde18b0000022800000224000002201af37b2c92596c9993e4df632401fd9d0633a93c605d4ef868f5b288946781b20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013a475f90a4e97b9137d5b2682393d06b2d19c8bd615dd1e94092ef403f6a929b089c72f6509d8f4d419872fae36f69594f261e12d63f1170d1392ae016c96898976b44fc4b18ce0ff55509ad400b66967c8f8b34ba8dfc21a447779fbc686946ba00b4e48a685d0db45c80b8d837c416635460b44a398558a0dfdd69949e9650a6d63eae94175dbe4e52e7d3e9a092b65238dfa267ab994627634db0cd7c8eb6d96ed50fe2b2532725b9c019e02bf1e0cf6d8288a2d2efdcfb29f30f60fe0302ac7261d90f8b4f1e3d0e7f1740a38eca847304495d7ee4c5be8ac89f071a39d7af6ea5a56a1b95622e215b8717b528aeea4ce89e1cc214a79edbef74b2d47773d0f39d2db1a0cade5ee7b81794dc1b81c712e1b2d4275aa48f83cc209196c9222d27939ad434852ea05033d3004c91f8fd911f35df6b000bbdb7d7186b37cfe5a1073ac2d46250b299a3ac1bec085fa012748ed4be715b1cf5a1ce36f1739a4535c2638db4ddf03af3e6cc4b9a32fc266173ef852d361f7cbac9a1ed09536dc0577522ae9d9635059e41bc27f02afa4e8e53ceaaee40b3d7239f80bb7ca218241f0989dcde4504fb2bec76490891633ad26edae01095d0833c688e15966dffb000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00210df4c485ae30b04308719f8adbead603f69757ac53cb4a752cff1f933d5e70218840c55833e079f015aea8215dc9fe3d4480e0c63971a9f58c2e05a2cdfffd2022a748d55a2b0fbc5efbfc69fad9e35c69d8f360fee580c3cf76040031b5ef49500afb785ef545b5d553415171aa12b39c8a93fff88f71d0dadce959ab444693b00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098681cf6ae327d4c61b43a0dd6f7e542a7a3330358c7dd49bd2f71fb7c160e1dfa4a795589811161dc61047134068d87298c02a6d8c956fcc6fc1dd8b6fb0a6f1c0d2c207d42c7792b205452669a464d56e1056ae50b2beabaff83be2c7be0cef65426d3c75767f250101514b532df0ec8b6695f274e086fc7b4d089fcf8b5da432dc5bee42058d0bacc5410553857b58e1f1cf1c30512b4c0aed1df20f605a212f38810a06a15df1319253d5fd9509971c0f7bff6969161463dfe20872aba4283f6febaf50928b6cd6e827196749353996216ee60eff917a2768e5e2d711b061cb085ca62548f3306d18aaf48f2f001ce64aa177b98a033ef5e7cb07f242e4350efc47b9fe1b60fa44edfe5bc4da2612fab2f139408e9fd2b44ce61bce9794dfe12aa07bad0f7c39855291aba5a1d609049834dbf331c447e003b2a964c9e2f1b8bdfbf91ca4a48d6f570f04016158e50e7aa5045210eb9de80a6893992e8995083e3f1f665c02e4e4d645e43266e2abb3b28bcf92ad58749deea050c0350679716ece0928fa463d40ab16d08398fc7f495e98cb2bc3425923c0829745f739b6c8f765a5ee0672573180851fa5e50e23a2b9ff6bcac578e5f6b6632a895479500000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009dd00403a39eb9dfb201f6e2629e8d2117aec5d2188f6393784c12d49b3f0930e4cb3cb0d5aee59930f1e7be877a45a05e0675cc4bad70d1f4256dee8540f3f0b2436b246e124eb793307fac8ca569764e3b1235a6dd0f38dee36813c812f6bf46b0f171c1ff77d1ecf88c649aeb39115f1a7e8c0c5007d3dbfcecd591867612aaef8851f69922e45788d2ee8b8c5caa246f7777a08f19ddb21c856d1b1c1bd11d80ea3a7be96441db92c8dd9770c738fef7bff878e73bf39fb55b1fac78bb0ea88591adafaa2e2b7e74e5032f3839c69a07bbb7acaceb81452a9457dca7d0e59ecd27c8cc7b6ba395105f7a568b062b45baa0121c4bf4bd30aec3e679e1bde68b1326e8e9db1b50a856109f9de580434da2d00e52a5eb85dd114d29c99d4e8f98656fb9ba1a4a48630e6d23c4efc70e0986693e9deb70633451007bc97d76a68b4ba23c9d445138f1b58e89bff52bb1c43c418c0bcaeb6ac16a8a46e260e1c8a6993ba915bd2fe4c8bf1e07fac08eaebe083b167f9bd1ed53ff636d578a3523af6982679c86bd8e35723502b02a2f06cfebb3f7359b9f348c75f62f9cc0e7b92bc6b5c4cb18cecb3a4cc10ee11a589c1591b62d541dd9a87f884bef49a6e8a900000228000002240000022017610671934dca0dce2ef629c50e7a8bcdbb9f081340561e3f8fb09aa23e9056000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008862b8e521a89b2ca00efe2c2b43c0685c83da7b0986a3aafde17d807e818fbf756b2cecc59b169013ac45311ae3103c982957089ecb57424228f2b94688130fb7fba0a770443d8c9e2d52c9582dcbcd6408777b62b75267ee692db6b410c6ed9a98a08a8e0c8c8347cbea9f19aca492574d2ea996316e087813810209e7615a4d67096ab5cfd0d0d34207e7bbe975a821079e5f56f1ac0d2360dc8055232f0d1d266f49170b08d9b2b43db00085d7a4bfcf088a00d08941757dfdd5e19de8dccd25e1f3778fc38382d234beb00c65431c3e33bc9f56691b1d1980e10c8164c263abd0025d58349efae3d5e26ca223fd031405693f320704bcce55aeb3648dba35e14f4202146ea49466149e84a2ebd08ef834adac0aee6efebb7169b26e6c70b7814178d9be2d86fdebfc60acd162b2f3a83777ffe9ba6c7e2d6fb1cda8d8d89da9fc86a53b01a6d720cd8bd8b3cb742ba5c9298ffb50d031610dd07655d36027ca570bbc4a376331eac128a7e6c88519bc7b2ee3be3874ce52ab163ba9d983b1ea3fcb1d151e3567fb239c3673f8239c4c68c81f79367724f04ea1b5307a3233a8a83de551f396ee03b38d43163f835dbb4def368347670ba055ce1c5f9e6a000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001076326047a7af29d13eaa8becba9cf9f06d6f8a0b8468983ac99ec238a05505f022acb243a1f72c51767727d9ccb786e7915961702e10ab87e0423b616b306be940eb762dccce491148c5fc5bc9d55938de9aee0309b119e9fde7e124aa3356c640000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e51fcf8ee778ac9ea1ba4bfd01a5293a6346d45b25d41ab0c6388289c7c4a75219263c41099d8742ba18dce934e1ff3d570276b09f018b66228b8ed086d2b3727d7e01ab478a15e1ce4ea668fca1433117ad1799193c78820caf3d7bdb9b6fb1ae91c2b1404a006dea105b41fb0849a9a9062e50e916de9a7c83009848ea046af8f14c3e7019f630bd1a0fa7f61c3bf11eff2e6282852b9886de91a7cd854177bb06288c0ec367af6a8f669cdbc31cc51e0f862af22d1517e75b7190a64c6ad34fa99ee896b9a148599960447b459cd3e66ffbbe1cdf650659b43d0d3576edea867276736d39788f5420f01729c709b708198e7e31aeca11ef9374197532c0ec600e6ee5b7f0e64fbf32335b163c16177501b869e967db59c1df6a09d8e93b0b39078c5ecc64c79ffc48d84597d85fbaadd5eaa3451c070cd78403e96dbfd08a6cd33f64cf22c60387b43ae6ebbe345acbcfd1c007c3168a0bf417fd73fb7939d445a1c9998cb5972301b8b9715454382f21362ec7a053f5bc7b1d6ffabb26874b9ab679f65b41035d25dadca1806c269cd10e0fb97247790fb09e25dac5d9adbfce38e3ba1f7fbd09717e8fc73d1ccde5114e6ace38f0bd4057eb8814e38a900000228000002240000022029783f1e794acd2c6c0f07706840db9ccdd7365963f271f7fc713bb9a624437d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000259ffa9c5cf26bdd7e80d5b14414ebd9e3e1124d8252d50e2116ffa086bb2e2c603ed492fc56678feeed6a2ba9150fa4ade3ce69d00a3c9b40cbb96735a17368b73b1985aa984e9e18681fa6115a275904cbda9d904a4122105988adfa90361ecafa31571e84b877446370cbf3fd1802f51f3cdfa94f6e984d48dcc11d619bcd70f828c8a8c0c53f66b759d488371bae0c3c0f912f13f5233b118dd26e58bf8b6718dbe519c10b10756ad165f93aa549272e39be599fd1e981edbea64f4adb6df89bd97d68a2288bdb5d3ec166e1174924537a51028a3b6bd1487d795ee5824ed14c409db109ca37527529eec2b68af4876f3097c518b7c1620f01e0c19858547ffee58871a0580102292f37ce1d5e0b85ee0c65e6a42086e2280e9e1babaadccbf8165a0a5299c083b06f46bcc69a5e36c7a58502172a9a36719264a9b195e66569412a2d6dfa3eb2381a441e07178d73bc6ba744f99c1f735e5a3d94ecba8cf18b75c12b82a16a584fc6b50992394a048512a101b2a4ac2586db04e4e8a949e5f6e9ba1b38db6b142b44995ef9ab9245a17607c4106a989323de634e0684165ede386ab33b9318ad1637298654935aee22360dc77c7c8f588d069aa37e6dc0000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002263bba3d42435b0ffa1f52330e064ac23f4b4492605cef485f49bf64457841ee2f67ce691b4ff16f65035554b9b0eaecb69e9db4362e50b7b54cd0681ef622cd022cb2c61ad95ea43e18f6c089dc043c67ebdf31fe403ce0a10196c7b636d94f97283e3345193438986d00b80334ce664465190ef30db5e632b5d44c430160440e00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a64007ab95a202b76ec73e1e1f563591b98d149232910e6517e182dbe33f629f9bdf60c3b2d491faa29cda2ab9732041442a7ddbba71ad391741c7c6341faf98222ac054c758f910606f7b72936aec20141da380bde27efa15e2177ab6997bb4b27255bf16d1d30b46c311c76e60fd7e39f88bb240dd6f8e48128746922398b71b00a98e408445e416d487731249127a8f9a7d6fd8e938fafe8fdb15b27f16d0cdecb9cdc34d8390c8e451205497614ff57efd6eb0c93d4a6839808f25b6b43c71cb0ec3aae521d8f15c2a8b298054a30e2e1122b82583e4829849c4a3986b72e36342a1903318c2df9b4864b2725a5d8bb969057ae0603ab7414bda3192b8f217d131ed5a57517410ab379acdbe2c1db863cc09a0b16b9843974523d4f0ccf4cedacbdd5b0bf9c23d08f55b111a085d6a1f91f2cb6c476665a3ec89c4535952a59af653e012e9df047e4e596600e299e0ecf14a4ea55670b131067dcb0db77759e04187e6e967b8a4e1e0796469110580947e0944822875277df3f072549af7f1a07ed2dccdcb0f8f605f63b17b615d14d83f8cf8f70c4cca6f5501194924fc4c1735d1ed429b7ac04cf3532a120b18abfac7655822402d92b352de5fe2bbf500000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f4f237f4f4a7a026b3163e7d031a5ef0a33523a335bdb7eaaeaf7ab431a5c64d0fa9032b83a087afe3ceda5a88f9a9c73d64f001474ba28b4b6a65b7fd6e668e7dc31680b90142018ab3f274246653403795a19c7334c45d84a59021935454418e7db69610340714da0ac9936145b25f71962935d12cc457b836e0d9cd55e2a1abd383f2d0906370036e70d2b7fee26240e96f7ba3b011c39823673085ef39de1f4235876cb181277b4f84328c9535882722d492499db71d2aaa1434521ea1617a4f9f89c6e27a614a250ff51c81f59988ca26c3d4934a3479969cd6053b3cba7e32c39035c084f34e2230d8e349e2b2f118346c0ca0fa20e6e07a25c5b6a5c89cac362a54792b7b9ca028255fdff23380a08de0fb6e2e1ebd2cb0e22e170f534a5094da537f404ef9170cec33c1151bdc3543db6f95717ef9aa9468355ff98cfd7187f395160ec74dfe68e7ec26cb6065b66988b623305e34d0070d851fee163a20dacd115ea74b9030634c065cdd6d5216565fe30592a4bfbc38f4779a4bd033822bfe3b3eea02618e23ec2568e6e5221885cf55e735e169f6ab23943cabda74fff50ccbb9d812bad852558c9ec400d5a3444957a71c0137628a3cac6fa78000002280000022400000220159b825d780a29453a730d6123c17ac10d1947974c0404be0414398f637fd51100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa6a7b4e60763f207690e73efddae86e11a69bb020d7c4745c8b6db8783fa75ac5b3434f49912b13b17d727e87cb944e3114fcc7fe917e7ec8b9ec014af5b19c3ca63cbed5bdb79605964812804a884d6e3188ac27a6a37157a069958143f44fa96eb59ce544ac06fdbe2c1cdb26ec6dbd957bb321e54352862f68e48eecde7b9707778e992a9a32e553527cb615f7ef015a4168f171a2855ff040d204f6be996f6d10d48954be00fbf6f30bb4a49fdea96963d2c77ae827170c98ab3adfc1abb4239c956051bdee51c79e96afb2465e1d2de6257c53f97bbb275a5e831303dd87e94e0dc42bfa1be66d2ccbb57ed9a456fedcc780d8b8640cef4a3dfc44baedb2db8b43691ef72b3494140500ae16426068f0351786066caba18a81e8fc5411a8d6ea76c5aa23ab40c8587376ba872ec92bd16b4ed45f18bcd7f7e879c52c678e57996ccb4f67b0f9a4f1c4ca64eac8a3aaaf2be610402de8874359062dadbb231a5fed81d5de6664ec08701a0ca347c19659a016ba2a5355fe20a3e1ad5133735926cbafa7acc40fdc90f1606ec14dd7a1920b36adee9ca26288363dfe040417458620468118ff0718ba2fd2463282ef4b379361fe2f8d9e9294df71b1a3f9000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0021fb1adfc57cef873bb08985323fc0174573891979fc07dd4fc68e445040ce45a005378ce6d99d03fd15f8fa133f0a69ec023ede1000fa71467d475df3864e938022d27adbfb03184753b062f9a21639b0f642876dc5c030cd59e227d0d48545e7e2498099cb65fb4eae6e6bf2e08b766cebee8c19e6566be1186c2198b1f3a60d700000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084d3a87b82b3594da57f167dfc4235e37330861eee396a5e905bf16bd9161a493031af087dfd4bb0a9c255570b8d5e38a88a64ffef11b162b834e69c2d802f08146c764b71d5840f21dd990bce1b6f892103f6b67878391f3c6fbebc65d2ff74853cd04050f2b4baca07dd1bb3bc64c40e53d8c54f7912a046903682cd86f7eac8e38530ba1bfba4bbcec88992358740c4e9cbe2e4808e7d1dae7055ca5965156ed3979374635e6e32ff74260121054225830761e0b06b48cb08374245bfefd352754d5bef1fd70b25398839000976b63970b6c80e5270ce8b9d37b591dab4daae938901f599bcd9174a8ab28ff5a8fa82e41bb378b02fc87c6eaa4320b08c815a180aacb8c4456b9c856c0d38b0c1136d6ac3ec22c1414f30922d1e017d56c66535ec7a29158f10c826d4652c0f44a49f4ec8988993c67367a6495d50a0c863dbdd17c50eb05c867db0bf453643751dad57fe7da5b23c9c84fe61d0266b910f4c4b7b94fa9c42ccd476d1458ba2149a716f7b8ed9feb77a170d3f1265ad860f660ec829b562ffdaecc14c2adfe4d2af450fc472a63959972bea9a9326f0216257cfb98d104cc6d7afa1055a3892cea762f15dd5277b308616b5c05421dfafc000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4b49d89e7ebeb008f6df15fe8e6b5e7a3491a53a2b9fe3ba25989f325ac5d60a7c406aa5709f702ef6a769f6969739a034472def7c10d8e0eb1add5d6885f104bcc22e333caf4f18176ff798160dad836b5ad1f5474ee0541e1e1a93d56cc47851f6170283a4b22e33e20e3df6be3fa427737b6f1b6ddcd189fa52d88bfd2ac2ad3e6bfc382e569725a57a9da3f620ab15e5d19f1e0bf117c15c20a388b5b7809e4dbe1219a146caad07cb6799168c92955eec003e7bbb992e474a31be88a1b242108716818c7f00c636ffc827c08d05c69785d83b1dfff9508aad70d1aba86d1294ccafb0a72b0473ec554326d3bf7cd54c5206d59ab289e9a71f9f3016d63a538248fe3ad0181b7bf68554f498b27f672431c1caef2dd24a3e14c81225b8d6a12f1096c90994860f4b9da594abd8d27ce598d47b876a080cefe3289831b9ded1ea458213a3da28ab0b855930c4043b5c5bea831257aa151c5c259a9aa8caf6bd734ae947221c95e11ff734aa28548e2b8989415ef043db2223c2da8fad0e129c41cb61eaf3b336e11ad104e3b59bfe710075e83e619a7d6e154e3b04d95b5e058a44f3b3a08e421f6c2c1133c9f51adc2083518a59d0544d998d772c99b6000002280000022400000220267fffedf3fab32d968110b3df504f45a80ef12d479f7d7293f189917e0b86f90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d97a73b1977053def53009cc6e2bf88f98cf2bd32e60bee0845f68f111109cb8ec065aaf33864fca4749675bb9aed131f2685ec171ed318bfa2b6904df8c403440e6eafa68ffbff32021469f5a37cd5d628de5af563a7f4518a2125bac70d22e177171139816a5cf51814f2d2856c9560d130c355d932472db3237a1f6d01fc4b57a003edd0a321d11df92c9027e603fc17ba7def65037f8df572a69a67db9947eaf109b16b4580324e464de89d2ccdea1498e7962aeffb9566a7a9fd7ce210bb83f03d63945eac023439e4a8990de0104265715c39243abdc8df43b9ef5ca634d8b0220bba9c29b990f54be4c35f2f36c2f6738fef71aa233e7251a27d42f8afb67d6476296de2f9b2a2f422a177a0e7c7b277ecd49dcc9350b844e2c8dd68253563812323e18caf35aae68e8a1947b120eab8cee656cf8dcd6e0ff6cf7e261fbccfa52fe8947936ac5fb8046074dcc9f3121c8a18ba4b6ee612ec6652e98a6b120e71a81dd5bd579f1ddb53230d8380abb4f0bcf8a48ec15b9e9139d36809ebd523717a6361ac67e2600d6123446c4f3c541afe3e4781f3e2c952878dd7a16f7b1bf778c262f1f68987c598ce8264c90f1d7816019c7d47b8bb664cef157000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002016a3f1a7d7122545672eef99f37d9ac581e2e2685ddca814ceb469185aeff391447b983457271f48647a2a501b147cdd02193d9e941dc191dd15dc7514a59d5022d61bf60895569235a7dd8c71ef9307d8887667d61cefb1cfaac56f33b25f3a02fc51cac6596085144ae69e13f2512c16bf1a974db2c2dc9532139a286702ecc00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026a3ef340d5c23813f6818744b3ec03c49729f1139e6b04c6a002389c16c503b37b9de76fbe69efeea0e42e82e9feecdb9a0c0e228360495459ac5d2580ac323e8767b556170455f8acbae9040e4faeffdcbfc17b3cb2148ba9b9a7da40a2c643408695846420556b2ef6d330293d2ad4f175e2c37bc36e7ec817a7d6ca4ef9ef0c18718fc0fcacd3449c11294acbfcb72d26a55d28b104c18e0403ffbf8c0a7ee756059439b4fa3a7d83b7a40c4008a7f41a20d17db9903f48e7cfc68715eb79350ba9d6a615c7f4078bed96c7a62bb8d32f10b636274c0250b84a2943b2fca04ae916fac54be66e9f376d8895a1c3f03d62da3234292e7ffefcf3783a06fdb898bf1b85c217369e79a752b79b26bf7a9e111573e402487f7f74e5bd248ff0c469f6a849be88a8ef5de2bcbd2bc70eb1f6f62dd1e3bf2f07dd9b53dc12fd3c8b91f3efd4c870689939af22e76a1715c9cf00f8c25d3d5a55440ed45f26e60310df4eeea025b4854e78d3d6b5d76b21ddac0ea8f30303db0a6b4fdf0d7a3bb080417577d93d6a18dd335f4defa2732ebc75673ae9917f1fbe2ac39d9d2fc33006578879541b22416ff7364fbb6161876be34dd01f2b4701dec99d48c8d4790180000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a81a4d5c4151d5907bbc466c8f8e0d422eb8c700a4f3a3c187399cf42cd342f199008697e9e5625f5f71233fff1c3f9bb79753a7b74319491beabfb65185d9457b81dca4e5e4eed431e8537b0c5253660f22d71d126854f9390a5a353c0107753bd0f474a9d861fec6b19a35c032cc6aa3c2d81a228905c24d082da455178a162d0f592ce300d653f2a0b89896a494db5bbac60ed8944dbda7f943db88215d4522bc603cef5fae8fc6b3bf4758a1abe2cf6e05fb9473b804c3a0fffe3d888aeb5296c9b952eb41ac5b5d6f5017d7512b48ab28cd12348afca32a8e824b3c256ffe26dfced1956a45a5c7af6bcf1a65e8b102030c4b3aaa9cc185da9c12ea0a01c9c5d3bca1484cbed93b6f3e937572e074a30dc0d6c389753ff4c99b78fd6b77530bdf393802b240849fdc3bd6c78282e7b4acafe93e5e3345c15a9d3f18e5228f741eb3d208ed115f48f83984e1e44bfd58758d19a66e7ae83c176efb4692ffa54a040b91d4664e8895a760c8713853839e8d55040caedb1ffa53c5bc3d9a06c9de937640ec6c9cc81f8c759c6a578552d378d6e1534d10c4514929f766fc31145b966d6a76bdb7c70d10fa470444faaba118e57c60f8363d6a77b519998c680000022800000224000002201fa613b57931dbb6ade3987d02ddf5e30545522f6ac80b24b2761be47304cad10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009df82888d7c3e87e6da24bcf9474295811edbefd938e22449cc9599074e121e479773ace84ca20e2f600cf0638291e3be030719976b6dab8fc672b3ebe7f200905ad48152d9ce5d92064885b5f3106c622b9451142900326d9a2bd6ac9bde3e79a551924d7abd9edec7814cec9164c5b4aba60205fa0b5fedee50e5a9f687160f7ae5ba0c805a4684e618e6953be71a009bb874dba9ad2610fb54eeef871b856d9e97bfa4a3b6a61f01eb2183f7926b79104bc77858e644969963bfe3dc4fc2484c0b358eeb6fda605f708f84a5036581ccea845e4ba3062878e534fcfeda7a0369c2ead0cc4c63a6d3eb62efdfbe68a047ae0a51c68daca3fedf6bccf8932802f6df1267b1a0de5aaba83963910aec47d83f0e38145ac47a690feccc38bbde54a3922cab4a0660e62113bd4d33ae3dcdc24af81022cbc6fd852425084b634a5e9478211da635b58e0606c3d96300476afb1049e69325c9f7e69fc8f6df1942684ef7be19c578f3223c2e5dbb3952a9614233ab7caee056bb192eb15c81f2a77cf5580ddf4db97829665071f8e08ddce0f30745ae204531306f5c9ca5e38a4d7eafb0ba3be8309b62582e3b01976afa26fe5a0feb33bbd0b360bce24884e0ea000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022415d36048c09a81edabb802de3f6c5694ecec4c41bcc6d2913484bb36757a3a251b303a878419d7d8b962eb3a343d7b273b36ae690de1c119c05f94a1c93938022e60fd1067a32b6ebba3045981f256a457528cbffa211ebfdd1775b82bb6a08a26e0cd4137ebc7e39e73b57973d53a82fc1646dfe064298dd378a02231b7c0f700000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab6a710b9fc35c6cc84cfd19c25545c82454882c35b68d0985f494b8d45fc3167f4797528dbf90538b22527b9c70b4b6e466d9683b49a8a7d9c5b77809d5ffb550e0d1410849f29a21dca8861c0c1e31946ca8965ce1bfb4629e2b76bcfa9983fbb51585cc1985fca2563fe3d18b12234d7c068b2da8836de5882cbf7e16509cb66c466209a1462bbbaea874a76b67ba28d116a8be9b1f22da755dc6a1a65a26516663e9dcf20f31e40b16e5a10bffcca2675c2c983a083eb06b2ccb80f11f003b5d3d9e9b51f7d966b8e77390b437dec4067977d3b09d6107c733b464cd7783b8ae16d89635e315406895e6aae0f971ac566e26965a6f9f9f274fcfc489e8719042bf64600eeec67c8684ad53549bf38c1ea4e495b9c425d4231d8274c00669f2f91b8b6b4ff66c912a1398772e38e5a4cf779e174284f51ede7479e5ee01bb91013d756ccf51410833bcf12ef4fe6f0bd4fc26c9b0809a87f938afd592db7c1b3cd9cb0bb335f45a4f46f71f0aa6b4f16dfb37ebdd2d8dd62034d6c26fc759bb42eba8e20b483d0d99dbc1fbe4f9318b3a7bd0e5e625fcfdf24ba503b3318c785448befeb032e893969de2d54654c098ec2e77a9973e0dc51e72cb9edb909300000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8dcf8aa0de6cbf14d640560cc7848a22d2e1d5d02f8578827c0fc51485e8d4217648df5e7cb669d3fcebd54f11855148f9b1708e96156587062f0d4e66683a1fe023b6fd9cf372030078255a15047fa2d6b1f5303523054619b9affba9d76c42cb73f04b583b8f2b30006046373c78000cca2ecef40e8f9df24ffcef4380944aebee60a88adb43112399c19bc5497976af38629d48b0db320a8a0f3e657150cd0dee1ca97540ab9f0f32077a4ee4627fc2ef3de2e05dc3741ececd0754db84211835b1de8e6094f6204a35ca0b2ab6d46ccfca7de8045e78f1443d708da07ac33c2f801b78899c04da0292726f77fcc3f314e58089365aa61ee10269fd1045f168f6bd1c2f15b02e06439fcdea8a70b6c342d18be33bbce71f30cd6b78961a59fa80942295bd4e81f7c7322ecac2a75ad263fe7de6042ceeb8f8d10573563f5ff6847a5f47712b6caa39e0db520257f1bb60375e69adb174fc54e22b755c931c0ba6728425555e1d72d983a40c0d8629542fa25435f17b8a4b3e784b121752482330b29c3a894485a9a810ac2856ae9936a3975f1c10cea3f846d8c8f1bd7b306d60e6ff9e487d761357722bd65a4b4842f632d0f6e2bb5a80aea4d93bcb0900000228000002240000022009e0c00568d3c1f5589836bedb8f2e2ab45cebdc95dad5339bef6e07faf645d5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000232c5d50d32d43acd096b7ff49e0406741c533a68aa20693fe8bd4cc15025d99bba8a614333a172680e7dd41609033006f006bbfc19b9baf3e7900dd8be6d7d5fe2a574208e0d6701cd52e606b5fdf6f64e470fbf7a01e401c5924a2a271e1068ee807575056d3d0e5a8ff45b9a519b7a3ed6f09851e8263ea82dd9a86ef9929864f8fd5709d0347f31e24bba9222c2dd17bbbee841c0fcf67445c8e2508cb18da8caa6cb5a7bf5ec6321ccdbe472287c8bd46a2278305ce8c733cb23d982be5b07ff42f24d52145138064ee3f60b09c5e1dff84903463938b8d4f923270eb853ca7be66f5787c700dfa336c3f2e8b0dff4651ab72e734d48b06b23e972f94f1b85a53c7e370e78b81983f04fa0ae465f0d92eb00500e8e587ba8eecbab5a22a8a99f7aa6cc5ed2ae0bbf6e114a66f6735e71132008e96591716134cf82b2bcd5f3dbdedf901eac9117375a01730935df157ee627677ae16c05735d7b5f90d8f30ee0eddfbe3d476834cd4fceb54ee39a531da4dcc08e4adf1b4dc0cead9fecac057829e10e3a3d59eed974c2404a4a0d74672a4e8854b47c19b97d8e2c71026103622c85b2b532ef03a974c6ac6a35358a283e714e532105a3a3587da38c57000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001111e2ab69538b3cfaa10ab77ab97614d4dac577e01b3ada1bf0e723099794969022f3da593c287021f79666570a6ed0fa5fefe5c7ba2d1f9dbe88994bfb78bb57324c8247d686969718bba017aad9f3cb8ae465392e4dec8a418d253733187ad7a00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016c02fddb1d6c5c8275632749e6585f2ba54ff6e7a4003663a8a7fc9ef6d5e85766ffe047d258ee1a984dc2139c7c6044138dd5487f02f0579535d1643da0dceb2ea5ed2ba320dffac22e3000fca6c88031869223c524e38ce985f43d81ebd6644f4531019afe4759e8e1048093b54a9983e6ebbb6a5d7424ecda124b372e280e8d5fc25abc9946f1b63c9d5d00829719132ed4066050293cfd729455f0a55db8999524c50eaa7c5eda47b831b800aa4fd1b825137de92005d1c4fd014ccc8a62361aa6aa7394f33ee25f97e0c4d2af8e02bf36ba8fb1392492b3162bb6454f353a61f609de2cdf5d9eea469cc0bc3f8a98728bf0cdff600ec90ae202727d6b1f6fe099a9e1ff4ff66ab3745401f7e2db1c806803048a11348c2a37ca9041ad4e1330efbfdf102440be3bb2ce23ebac6c5a0819808fce7cb6a36e155b4e44019e297f228038ddd43dd52b3ee539fdfb281032aedc6cc023072e367683cef300ef7011c3f37f25fefe3f3d69456579e1690af8a449bc94bdb7a654aa3c9e6efefc04b97be51c1b020a7173a588ed1a45c9b0e12ddaf46a2c00fb3623d8720fa4f78b7561020fa0906937bcfc9c805de01f31550addd2177a06952c5470eff178400000228000002240000022010ea8fe87678088b46b135f25d86e252b94b2171d7cc8995710868b463a6da7600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a56595e5b2b71c4eeb66a2c7b071100a8e50be81bf4282cc8acc4b84b876224444bcf4cf2905a58fb8cc2cc273334f24a03abc92011abad474dec58df689da3205108183095880ab0e7e4a8e2ea89906a09c122564d027227ecf54d9974a49b6a33e5eb05c1d7be53f403900b1463636821f339f6cbd388337ac3acc9faef208a91fef49d9338d367d608c89fde898f66b7878df5b10b22500929644c452215f8ba755b487a6fa63e99a2887bdb0e6db432a785eed56c0e8629ce51af0342ffe0afeb620bbb9d07d58088c5ab7330c4b9b6106ad89ab5055447a7782c9305bda8864090794ada10b2e7897c5e47c7fb2c0c6b37268a9a797b8e0a79d6ab4cbea40da52a3eefb83714874d50a1b1b6577337d15e11e0c7bd74208b1754bc5d07de616bebe2d761ac43789382823cf1982678cd368aef9a1f83377b0d56584d74398bb059982e11a5d4e4eddf0e81c2f1128a44e5136805dab5af793edf7f52d49949c859e3500da6ea101f935223d0eee7f96470c472a70369eba798eaaa985e083519dbfeb6e14fec3c6e70d20047ca843d83cf06db006a17a461ed79b18be1d844a79688fcf54023c614f396872fb38534996c36eabcbb49be8a4f78c2ae072000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001241a90995b26ebb81bee3444b6beca97b27d8f8e9d383a39d8d68c63da46f43f0230341ad0f0601073a59abd16216647076503873d6b1463db8a76463f70b1ad732065b1c2503d99fa8085224b4e7f77b3278479762808005406c5832e703cf9c9000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000285dc6b38c45183d2ad4f839c21244704199df9cac37785ae7b372b6b5ceac967565dbce1e4357f208fd3671f553125c89f69d93bf9c2df8767e3886d5a7a2cb04771924f83af981fdc028b867273e25727256363ece6f5bf1572400c1e3d3352677ce0be0429da4be92949c907df4497ad5f202c471e8b2a7b91efe92e107cf23650b70136dfde3eab0d10531afdf27e0a851ade0b3633dfe789369e7ced9682db06dcc96d6be1225d299e388772be8c5a9efbcae60488a7e72b01a370e5eb2ef4b6468df076dcc4dd5c41565cdf0ba1af24ec739344ddc55c55ac3427fc2e670efa877cf36c773abfb5b73425fa5e1c0b80709702d21f7dcf8091c4e6e188dca7b8ca2d5057a05aaaf463f0ceb2c4e83e7c0cc2c0e0586520fc155433158d730e5d85796ee0698ecb6accd129b34a029b4ee17c9b593d643b1d027befe28d8e281f7a29949e9998952be6340e0c77cd222ce00eee4f4e2bc8bf4d36d5a72b46cc9779251ee3ddacdb1dfa6158a9f9e2c7da26319cdbd670315eb4a1e8e8f2f72702ff9398e9d0c627bd9c52203b3eba7675994de3cfb4572c4acfa7c9152c1fc3c5c6cdf314313107a4968f32704c88beeeedc0e19f6659d327401b3220be20000022800000224000002201d7ccd44f536b7808b964ecbd473e7265560adb4b76acbef210eee994714be2f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000893ce7d9563820f520a3611f1b5ffa389808c7a59e4c2bd749fc96d40c854b0e5103226b2bc4e989451c893c51f838056149779c9eb550501cdf8e25644d663dc0d7dc63fb54afe908e88f850c3686cc8df1beed07ff30e0c5df0e8ed0995bbc3301f58093c37234f62e54126cd5fff81e501b4d0b427d0843074b30fc421693011a084f09b762a2d237d48868d406feec6c874a5597bb252ddc735d5c80a119de09f1aad123bccfdd116a5e3a0fe319309c89eefc0868fc44b841358b971f0f4a3abf35164d4116810b2d0893f4bc7ea4428f30111939274d0a21930d2b04dec7ab051a54dfdee90180c695fabf1a601883bf781507fcda7dfd77c2726dfe92c7d72aabce4f97d37018a3c1bc4c40e53c84c8f91efaa096f17598cee8594665ae0f29e759fec2ff4a27f7cbc624e4987eb6b3c13f302359ad0551d93cf7a2a3f770f6f5a769da869a72e0ddc193072f40988c8d0874a8efe6f25d59c6e1eb734d02e085ac570678949fdbd320b15a4cb697667256ca8745cdf2b5358d759af5ebd8f153f42eea6ac3550ef5003eb1b1eb90992b815a7d67c28475d8f6b95bf35a5db48fcf7c309227a53d031202e5e24935b188f02fbc5f91b51fa3da9199b00000000400000000", - "098fca4f64515a8cd575b3b6fd027ed1043f41ab4ee3c27fe8527d2e38d3a4480000000d000000000000000000000000000000000000000000000000000000000000002400624662bc5d4432f62ba91a79de43b3ab4cf346283c768cb28dffd3d9d7306500089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000d026da24c7d6690c28fc43937c3e14ca2f3da5a7e4f53f02946806a11ebeeeccb200004200061f4934d079da56157a8ce80f1d408c274c9a8e99e6feb4668315822f414839000042800825bed0f04513688a20a73113b41d525a804966b3e35ccf0894be7867dd9f59000042800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000070dbda84000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad3644b003caae76e4950e6afbbbe5c76a2c9c0e4bfead8ba02f3c498d3f52ebd68506450000000d0000002400000000000000000000000000000000000000000000000000000000000bec1d4001018e13fc10bcedbb6455aefe8602c5aea3d92a5ed635e267d26439aea71bd68d0200385e7305b80adfd52a09d1dbe2fe8b98c8700b7aff520880cdce1d94f18df70ae969bfe6db9d9bd2ab98db97d7c8f57642c9f0114bf275a0680db72b7ed39800000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080a3b4d9666d826bdf2e30f98926b11d20f0eb0a8d0f83d5b423995700e6762bed840629000050d373f6eef9b4d5306b6dd0af7ebdafb96f7f4b5c9c072cf0a58e5ece6827203c24907813da32b9ccb6f5f1e14584dbd288894af9c56d7077a6a64e3aab0f7ce38307daccb55914115fdf76a13bc7493ca2165b6c994f7ec93bc02f7755f9bd273b6c73c0bb1985de1428bcebe90488f3504ec76741f0f32b0797f0c7693fe2d68aa2588a4eb0f9bc596909a188da88cfde069516149ecdf0cee13aa5c80b139fe125906a6729b8abaee37806360567f8a69d41de1c92f5e50e89f0697c2331aebace9fb060b05aba78cd9188246a7aef9ee6a6892e3d421658c6630d563808d49350028906d40d5fad468383bae081865a72b983010fe72010643c978b54be52084bb2c80d3cbf20c712933eeb5fab78fe960982120a3d911b71e582d2358feef5f9e63376e5ec81151c96a774bc6b938664150edad830365b549b5ec8462bec65a52fbc32cf340f3763ad7e21080a30e382d8918922619e0fd939ecd71b3b2ff5b61328b67aa003d050d6d73917dad7876aff443d9d58a66468bf1d4f0f620af0770303346f5841efe8c8705d4bab4cc909d6252e5ee1b915000002280000022400000220298d7fe7d6f7ec645d1a8aa7ef8a5d41ccb90c40b1e67e3a3c0c971c9c963367000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001cd5a67beeede267e86a64c2b9c312566900ebab87ff62884f107acc7cc7e8ec4ce8c9a89ee40aabc36739920832a11496430f3345275d15b739b3f6c24d2e54024b7839b2bf9614a3b7c31a34b5ee0af9101e58004ddfc56cfe71b3a3ad2f13b10d7b411f1e0ebb1dcd4b1878896cddb9cfffd14d806a11a9c1fbc5b84a1fe145277fdce9563d989e35be4017f870b3b1c235159ae8e0369711c1611997506f74945cd97323ac889020a485f6991f5b89f71e372a119425a7f4f570042526a69c1fbdbbeee36956fd60cb2848c697141b88f5d62b707123626fb92d8d22a1ae825b115544a3718b44a4aca5cacb5fe73a9acf4bf4d225110947d9cbbe508e948ab1f4c3b607944a3aaae7868e4da44b52b1515d1a0cc8956548a8b4efa1445c25575bb6f0d9d55b55c55d038932f7ec91a289139a99f036765609002719cd88795bf5a231785a75a9940dc0c60d10e54942d0f76be29c4cc9b5945944e72416f12949d5fad6cf6b117c1d5a025818d29d3f7066799eacf4eb28a2b4a4ee6f2f11af7a16f34394c6d0e22385d7f4cf2057f1653f9eb936f34fbdcf02d26f48fde66061ed57ed7482daa1c1173b4b4d027e5fd910d455cdc5503b9bbee90ed8c5000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400129e8af56c8ab6280d7982f6cc45be154260918e58803f3e670a458637670519902008700791768796654fe53aba243e782928c4b268a36409a2323fc1c344b9b7b1f3b749281366555ad524850d80eabb3a8498cdbfdb219cef9337326d8a250a40000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b59eb618e630eb29311b6231415a68540a0bd12940a97cc2ae0cedf778627c35881ed454e99e19bede325a509ca7fba420eab8d6239cd1c5c8004baa5228ce38cc108fb842c227e0145f2cd315b9cb9521cbd0f77e9bde413aad77c14041cb56df358ed01447662406e63822d136736e9643d42a4e4fa922c99e0853482cbebf4aa222895a83fc168a3e85514ccf9fbac49d877a47feb547bb48027b71c1db2c61c256a136a13a6383029e393990d11690196a22102698444126244ce4e6b648b1bca79cd40e72a0fd57ff9e34117add2b108dbc6ad07d24e0609ab2b9564389ecfbd2ac6170038b39016f8cbfb57f28c3be32a4dc278109a60317873c17771db39acc1ab5f41aac5acd14655d7c59f9d556008e9730c383cdd9dc57db6859175c6375b5133b8d2604b66d9fd000323787bddb8657f49aa44b40d102bb6f78f1c30a85ab6d0aed31e4ab856df5b3001f8b7bf40fd9b74d408ef6ac05ef1405df955ed108d916b9d247de5579cc66dfef5028f55d7b21873c80f56940ce0065f2a7a32ef0161cf5350029e451c84f8f0eeba6c3a54ed3f202909a226a2b04753c8a3cc541859a1b022dc05df6a60a44ee66e9601b76d281979fd6c171e261fab000002280000022400000220197c1ced047deae7c9e8a0f98e9797d8f100348d2876e06af0de1259ad49b21800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000271eb57e45a462d2f427c882d15f82743b2700e7e6620b37188976dcaf69b047323b1cb4cceabcc662c1c4397a83066a44bb19ac14685dfcb969206b4ffb13f40d51726cd28228a830ea83b03419663a6fd69ec662e9d09a057fbf15ed01f552846d1373993d8a47d78d47776a810aea73995cb45285cb55de5dbc79c0129ebbe66fbaa8a56217285c85e8f6624284ed6f6ccf418b296065040be99f65428fe9cb9fab8125218fcedc2fe3c0e7e2886024c3e8a6b04a6f54ec38d0b16249d951f3b98aa902826e07f8475c64681507a35797d74a65a10184c4b0140157c19750a6c156ce5959c8068dc63fa84ca91fec2ad10ac9ce9470337606019fa6a1cd61b81629302be2593058d059ec901d1501ede7767741cc3bbff744883c3c5525b92f5105a2a7077370e6125c78d6d7fd233f10bbc995a968aa614d2edb1355bce9187daf5a93d84c2fb0bdf9be308b8d3082f4b47ab3642d39d5476123eefb7811a8901cfdc0e00053aef9cc6bc4dabbb29353e75b8828ed0a1bdc09e8c10b6f530d1e9867adc93d83b5578bc8e099cae77526666206bfde56c7bc9e43c1189fdf04c9e78ff7b648633c3d591fb7658729c9a2f94731f97d311d08c75eca77b0ba000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011bf1bb475c07812589612aeb50cc5dfba0dbf564628f7f96c790a2ea81940c9602009414ffa02b43967c8a68b40aca3bc254337472e17cf13364f6a58f56cd804125fa468083ba6cec510d36995e96d6423159bd2a2caa295bcbe6ab9ff1c54e5a000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ace0ab4a11df4a203d5b3d900245a6718bb02082c7ee707f35c8759ce2607b41a62ee0797b71324c155308dab83779952d46a9ad337f9fd8d228c113e9b672b8702ea390da06eb74cd8215df2196e85819362fba4db613b18b4e426dad2f1b4c82b3f4abeda5765efe043b15b1a56ffb69b7421a45350ce9b9c42c18f16d840ed42e706f2f8a626c9a526644a967952ad2f3328f07663671d73f2f77d0ac2743231b2be522c1504c3c64b55abf9676de3c8f1003721c54f11b8ff1b2a9f5a02752647471334ac22977884cb728fb229cef3edf56d08853bf52389bb286aec8eadb46527ac9870cd6924b6c2f8f7592999d71fba72f9c3747ede2b660ac83704b3b44d376350c597a165831758e1629b0497dfd577a7ea34345925ee16ca5e539a63f58b399cf4d4c57107c1dbc6f09d534d87989fddfca3d25729a9dd2decc9e50a70b3eed38dae2378eb3e3db80ad3a90f64782a678f893fc3ab15594e8fb6600cef77c1790a4cc64db968a002605d51ff827c7331e91afe2f417753cc68e15c8213bf2910f96bbdd083e83507c54811d398cc39171e3a643ed6627241f6bb3c1c0c12822d45f0a9a2a2e884ad838c1b385550c0499b9c1250873df8f3f6c070000022800000224000002202ad4085171f935dc25530eda75740f5caa73811381ac8810fe321ea40749dcb9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e28d8aa92ec6cd41b96a65104dae2ef56a9370337a2d4d9d2fc54c9ac52d135aeb840fb87b28727ebd8c90d602ffc580d04a54d8edac025e5ccee5c368822e0991a395246dd479cef24c5bf072c24f844c5ad70fa63b32e9e0c2bfb97ba355bd7d784d422b51737f4a0c1e6164ab81d399b845f0fb8d1e9b24a823e35a9f3144dd2d82f2413681da134448e442c3e449c56a3df5b5aa3ba03899b54e2c777dd3a87549e1479adde162a4493b3213bdcdf8b45f71b2bfcbb15f5dd0a6e00f6bc609f1dd1a5d8ba9caac7d60d1cfc91ba122633360763396de22f23c4ef054361c535d7fa0472ef000a0d1bd4092b4316dd436409b6920b2243c064a9d48918d05c0d9fc3d3b043a179df3b8f414b8ce67b475212ae7706204f37c4064f7f9ecb23e3955ef3226f6bda8fab19c8822c6e980728273d3557e270b4b1e3a612314168e6e435ac6daeca71f0bbee044b3cd9a00769a4ae7904044251851144aef586a96e5e70640d9b9abf057a7a39156901510161e4644056dc8a80f937afcabc432150df34214f0c35884de163250174bf0a9774209d85d1e0f856b1441121e31dc25c9e3c24ddbed7e75b54cf97785257eb91457b1d36588c542509051fd2d0d9000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001181430588036f8f9dfa7280238209b06f956676165f7a69b5a4c175af16cd96102023f8270b54b9febb62b8e95ab9153dad07692cf208620ebd920a941cf22199126e99707b7c8d65da79e4285834c4a562ddc03acc07092de291495af7165bcaf000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aaa170bdc113ffc184b54bdc22ff63cf1f26672938f4028991ce2219172671442ecd9e13841df5af4661413eda8da462c7a4a8424fff5485849e9cd61e7aea42c80d3cddda17e42b5ff1d636260635ac4ff2d22181ba79f9c8608e3d3ef7ecaa5d587c8f1046d5432c79cda619c03a9d972ab7899fb9e906a96c960a5280707e79d054c905dbc3343a7e5b12d2cf6b69dca081c87e33323ec35f9295762720bfe9fcbb4c6858b0519555e998e5864724fb440dc8574668efacac2cde1483c6e5981760c4002a23f82ba1162b421db5f5b4d6de800fe0a026b0950f7d59efe2e64ea83ec7a2bc64774422e24191f4de88b31c6ff621507826be2e62a1ee252a05bdd6b5263213f79c0368a0c113f5c665e948d42ed90db63426a5c7c54681ea780abf37643565fb0753b5cde8c55ef706c03952ed4a41e8a8ce7f37cd88fa527a1e5686541ae916abb0c36f3e4e3d64bc63464e6237f823cc07d1203a912a526c6e906bc141e6d2ea638e5a91606a4910a76f05ef7880aea00f3181cf00fe2127f2cb8678bf5935ecd915ce52220b07e2dca420561b34b0c040195595b2f403ec6e1daefff2d5a52b5461de31fd432ba6f519af958049b83d8f90ceddfb7acb17000002280000022400000220127f694326e377bfd1f26eb2f0c7dd857ec3a4483499a5c13e599035e03ccf6d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000323ea24582c25e7db7c0838fab55460511f071cad6bd6bb906562c308382275e8421f71c59a459d4c2d7707fdb73dc8e0c460f107ff393a0811c5c293bc4776aef114c24a554c9d3c748378bf8d29287a7d82ae8abdd75f6d366e53b13a1e908b5cf6d051ed441bec753e97fc9e82b9a02c12e3fd93560bd989bff245427362f0bb6541772c06279ef2699041e5caeab040d9c0251a90236e3e755d08e98328295630bf2148d35ad3e99904b86bf0d7d63f907fa65c2f42b264d85e81aeae95e2615af950b086e4cbe34554cbb8e088e1649993d3e656e1b9252de16e1ca03fdd6c208cac7030dea8e142aaddb74fa6ecb147f6aef4df59e07ed3df2ea4ac31011ed2ce4a75868cd3e5d69e92a6230c36f038eaf052deca405ac0dc1f84fe70d9d34c2b37444dc8eac4a71acb43cf0a6027b1eca034afb54d7fa07e51aa5e0b15d00df3bca8cef1a0914d190232346cec7fbb07f9309fcc16fa88701d9dda7d912834d4ba3724e183cb6eaf3a397428026b1702964c512d026804e3e8dff896b48f6ebb91fe86d5573bf7cd649ba591b51fc5b607eb217cf9d70b36305111d29eaf7ab2d049e3317c332bf756738aec549ad51f919a4a9c66dee92b340eb11b000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400119ed458f6f4d6a7f5cdf99e614735df1e10e7c1cb0b2576afa73a9c223ebca570205da8d95b755fe926636fb4079029981a81f75340a7c7daf7a79f727ab2cd8eb2d2da5529678896fd45b64f40630eaefc017b899abd08f12349714df44b1cadd0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6278f9f1933762d32216cb1c240e275bdcf4b04a2da47df6a1151396e10104b7ef24725c647da57487ccd6337902df78c7f4285aae56d81bcd91fea4d51888c39a9336815aa7fd0561e1eaa3bbb763feb146527a4382c1d9228f4ccbd0a214f11a76985a4adb34d680fb892cde8e9e8cc3f662dea2f445e3c556273a9da679b41c362823eea3fc1ad5d4e09baa4178dee8896b7914abf82400fbeaa93f811586c871ec1bad9bdbe40a8d32d2ed110977cb8fc3a24141374c8ccc088790a70600bf17cb5fdda6d7193c1ea3160947e4beb1910325b826ce1ab05d659492b514dd5c27bdd352dffdc9f7cdeeed44bb6c3d97c69b839f0fcacd198712b45f5700ad8bf70c81cf1dbc8356c150151220e9661fe53619e099c4a0a6fd51cd5664a9faf095f2f816c8d62a012dfd453a04c8dcd9668b5ce670626ae30f899816055a2907f5fdb131db64af65b6d7318e237fde6582cbeed8664e8b79ff45a6115fb4ea822cf6d4092fc82220138b412e641ac96580354fcc6f37e7364233160fcecef8092c330147bfcfc485ec08f3fe1bf6980cd788eca3f7492e9d04a4692a483b73a10f08c479914261bde7329ecb30e2ad501a73f2b43831ef4449e01c22dd8f0000022800000224000002201f5c011b06ca1d9e3128ab1e6d7bf5dc56c14ecbfa8e24365a20338657576e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6b08755c73fe29f19b81265a8de227096bc3dc286a7f2c5274724a0f716b31d3385dd5009bbebb6b4e82351c3afe00a50a0cbfb35167e7f77ecd05ff2706c5abe90c10dc242acc4b0bf427212c1b6652bd58ae7d22011f99d579cb8aea70a61db9ecc500fd6ce08633b64f4c8eafe4255689515f16c5f6ff53ff026aa1a060385eeac25a4971627688ce7e6f5245c73e9d9061bc83ed798432d3d651067cd3ed2f9904b78a49bb5125bad84be17d7f1251d75e287c90acece5bd8ee254969f161c737282d536c5e7714f09f113c52c68cca7abf1fb22f113dad3e3a05e2d8a4636fd451968ca439774bc77c95a7ff8203571452a725ef8649f77d7089ee19c4fdd11d4d0009d0be5b9e7c28347497322f5a27c521fb7b469355806ff1e1e7b6ad982c8fdf36296a1bd623c3007fe55e635ebc6213e871dc0d72e46e0d46a4c09c5129d95fce4ceda09ade2343fe972aafe4c01c8d3e4d1462b0bd737d9ac114b5da0faab537e8a25d39f018fd7b9a617cb3fb03aeff0e43bd7bee7ca4706cf173dd66592f5602432b731f6fed6f9b7e8dd34dc18acb8948474093c90aee52a690075b5d53174da90d4bcbd276285d39387334b9c9366710bedf6724f3ac3861000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011016b2cc2ef44bca9453e9d04995da4e9703cd3880a93f57415badf006d1c58b02065d3a0a56a346421ea4ebfa4939d334352c18b25181f3d5743b1f1b0c0f259824a0fb422827c8ac8c02e60d6f1cf0528d9b8b8aa7f2de17f22123ce1244f6e7000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300148b9c94e2389ae16c9be3dbee2552b5c3ee609f02a9070ec41fd4eda5c8150a00a11b10960373b604cd86c3490eaf1fa1618ca7f8e1e081067db209f58a8f537a37fe3ca71f5d2eeb9c5a06c15b3875afad624ac9008ba37223fce6dbc65822c90c5ed35e4565207acd5f97dd8f938fe77858603c57ad85d021078aad70b16f7bfd448ba6fc6bd600de16d037f79d281e8dd4d30c87898a4799eebe0ff89dd3a8043d030d9c1890156cdd4f6fe11acf0eaf57d2e2dcbb33031438905e6dedfe2c7529d3df526f0cc1f93de656cac7fd03bec2a8b5f2c110191e4058770eeaf35262e8313cdc88ed3756cbf58ec094b264893e2ddc9a7337b9591b2cebc7aa34ef4a6857b8ac89488ab2f7016350dd193d2721d3991f11709dd607d8e9fe6ae45427c159cfaf866373608cb7010f369cb50a447638ca983f149516e1b4b0691fd9c564b3bbc8a8fb133086a52dc78cc7af784a81c09503ccabcee78b91d6e7d96709524a1eaa6463d571b1b5b8dee415e05b2b722a2aeb819c04c6cae0e9ffbbdce9c33d09afc042b2fc49c07613ef6668ac8873c7d2612c6c0095cc42306af0910525e3ff2367067a5459e4d1a25e75d12a78623557538241b3fcf330af800000228000002240000022007e50631a921d41f44a8d2ae153ec546181f55874b97ca959f8c82979fa17d7b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055f9f1c68630ad6267ea7f37f8a294ceb1b6631ca598d4dd05dde59ef780fa0fd8d9a480e315ac2f12121e503e14bf078a45d50bf18f238798924d1d53e18fabc66077e125baf4df35a96b259fbf6e968fb55e9e1bcb9d2b0a2e60318ff85b10b402bb70ff0f92ed9c0b136cfd705cf9e855868318154c90d862e9c66a3163b8f550f9585ae007ce7109e2682038b904aa135d2684c7215f724d11054a4c7073cf032d8d083463781745e8317af87fcbb8085e06a7e8b3bc7911aab7d3a22b90182b0b70edf0eefc6d2c7becc741d09b99c7c5d33ff65dc51c27a05c767b904db443dd2ed0b30da1931b55cc6f065cb2380ea6fe02541a89d3e1e3679da87d7a256487d790d3be2a6762f75bbc19c02ff6c08902b17f5c8638fb0e3de217a992b1c84b08b4f1f3ef9d6d5dfcb05a95db0e5ae780cad400386150d81e122149c4a179ff6d32f372df8c280abc46fbdc4b0bd093c3f78439a7eaf379c832f2572600b570d45b5301e2577583ab6522983a765e97b74eac3db4804840b4d19316ef2a7bd5f00c1fc0b7f35e088283f85d93ed7d6bd09e01efe5802d97e29d00ad36225e849ca68efdd6bd0ff10e3b2128f2460f322ad08f1b5cc4c385d98707564000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010d487c6a10a8cc3a6a7a5201bc461fae785b543ba8e3bcfa4abc77c6a5f8f7f80206fbe519522f10c8e25f947c2a2e7cacb8f0f47a76f7891ff960006c8f11d8400e3cccde0bc58a878e930273c1d9649339ac8dbe5e95428f22b295f58349a85c0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000416c6e55d7dbeea579cd0735d3a326651656d881f4ed55cb6aab8d30864289313a122541c304df59d1e3253d470a33555226d59239c16080d673d9851d44b5198db9f7b490311f6e42c3bd35e3540fae705ba347fa171854e19ec52e8e9faa401e4981e936e07599db0150c9494f9c2ab1ee21021c6d25aa11186702820e6967f34c083e429f012c583326e8b23be5093d398b6f74f5cffb5280336734677ffeaa179f9f89f90960ed48ff6e56177114123b82f3b248aafee9636f5b26169470e8e8075f2686b1386b7b239a76f37daa44766e93b474d2e6bb182ba270e6ad9209d86c5671dbaba1481bf797bbb3790bd5918a8e0237c450c2a6058f7f05f527fa61267e7e0a4ee5a1014692a8eeb26ee550c523bd85f567c9bfca4f98d1336dbfa4648683ff189232ccdf6485fb921ef34c769f397fdaf37c1aba1c9f903699bc95d99bd711320e5df767ad80ed9d3aa42c207e0587135a0f81fbf394ab907e1c80b175118a1471c675d554666e8fc735e3326356a83b250185591eaae8709c2b70c97325e36ce0a533b710595063582293de0f505587ae1b974e31e1828646b32454cf9f380e0ec96aa7702abfcbf7e2dbab508400ca663f9c1728e59815e0000022800000224000002202da8994eb6793c0e5bdf659bb5d158169231044d5532038f9c0cc36c5784e7a70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015d209f50ec61a572dcb97684bb1abea44b33606632c707f24257af9ec831cd6b747148ebead574807d51f06363ba4e6ed4d74b68345e4ebf66b18cdfdadfde04466f3a9a269f73d22b682467d03e4bb84eec921ddc23edca921cb3bacfd2946d3e7b5f64309f17b00cd7fafdc0092f6929081bd13baa0ab2cf788937b6796e6e11452345b7e1e23c373f6ab110efbc3d60d2832bcdc848f3432ea2f295d57843df67f2d1d143b3bb55a3f8b94c7f7d0ff24ad45ea50020fb03246338f0ab8f202f17edd777b6229898201287a5ed277d0a2cb075b074baf4df53a6fdd80aa2b2ef7aedd5c6a59dfbeb812f8158559049ce53a70dba6b655972bf33e0ca7ec41ef9649381fcbba245611c1d9d73d374e710a72380dd7d961ed2c4ad826717fd7ea23fa8c20acb91cdec1342d4ec97ba4d95ca84f22f1e0e5d5b7dd94c92fc7e6b182111ad7c90a2ae5b62497ff753a9c36e5acd586e37449bb5f7ce4b17e3be7e8ed8879c0d298270be75600238d4ff7861f7089002cb1d34d1c8bfc5d29182ac9a38b8ff23c7721309124cfc8c15c00cd25641eb2b3022cc99cf83f11577c47835055ede0fd5f2a4f9047ca3f64f0a2399cb75d036c7beaf3060a9ca9708be1000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022a65ca7bb267f321ed6515d9e205327dcef15373a53a4ce4b0ff9bbf6eaff85408da23f13f3a5e54a8ae32ae83bf24820cd2573eee84f9cd3e50f1fc719f0fc10208387cd1df0847c776523e03779e4ea6fa7875e8802351c908244bb396c2de531ccf33dd00cacbe47b86060c6b3068177d6ee9bdd251c7e7d487cb3877f45f3400000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a528e2ab53edb766d166fc2b9d6cc90e0e67b9603b11f75a362a75965702e2d82084f0a9f3e8f4d8d4ef5c46f425b3d6d1d9e86a3e90c82e753aabd4e102a3ceb095e40f6f101843532cdff4c3177100d5d88d467118009d2ad17e04bed807b41bbb54ea80090164b6964ead2922ac083c41a326a91b5530fcaba3e89c9b27461e7e09579a5c9449cf1a511eb28f2585fed77e582c0920045b5d52503afd35e0c522eba195c32b20ac6c543c2014d0dfcb46d889941222a647ffb7148d5cfe0ccd7664873e2c7f9988435fe31f091fbcffb0ea4fa5ad96811bf325cbfec31963f16f79bf443f3b8c0b2fa49853c1fb2f87232dd2668078b7dbdd536ca96b096b9fee252f11a10ed3dfb7a71056ecf755a1786e6d012fc328842e42d771084c15b4822bd265ea3b3c1df17e7cb49b9d76d433628b9b804599e7f6cf424e6d5c591871e76c7fe7b76e5b47ae0190bc6a9e7b87221a451baac3f2f030f9334117bb7b7b7d2e60f61ee628e83e95022a3112999f9dcbf8fdde2305e5e8410caac9c5b14f6d40cfb6bde94c101f93db0188ec941ed3e8c5c1ee2a7a7b848959a1e05815484c9ded1a87751be3d433fe83ec3c12cf46a34f8b7fe56834837add20c1a400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d097c3d08a3ef2ce40ac19e0ba117b02b32585715afc3349324f3e544e2728537732e8e1148bdd4db22894f6d8f7f01d022f6a9fdf94c6390aa31437b925508696926ae1454eff20a32d1057e316198f862ff3069a226eba78a8cf833594956c956ff98b23bcf4c46b272974609ceea68897b919384e3e08b8526962599c24e9dbd32a083e401656178acbad71e05bbb2bea3b5e9715104f13871e2d9275bc00bffa66676089d62d1389d86ff8f3a718c585c6405c26b541b9e83613495116adc89cafb802f17edae01a88ee7a39de1a45b9894556e2950e4e52be4ccd3f5713d237a9c9857a45b21aef02b7896279d5b72396d4aa3906464f108d4fc944dc7f7d4763a564011b69b56e82f7c6731850e2f25d4fbab4a2726a4b389f2d403c1d7332103b4109fd94402ff35a7477935a3665245d37d134bd12bc63b56c319d9a8046eb295eba3ac7dace82e6fda137aec233f2016a32b624c45960463510e5e1f765ef3b25732526129aa34a64aa60e2bff570efdece9a37cd8b819c0719daa3a37d63635d6fec6d80e123bf2ccf2840fafb5d5feffa4c93a3e5fefcdb207de5ee1347ec80e11fa22f478c20ff6b17a5005e9cafd8542713b2c6a8c2492b53f0000022800000224000002201084c3e008a6f0f59ef35207337d3dc2564099bdbe8a681ec9795fd9f214030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aea37f965720b2643bc8e0a6f47e38a7a83e0ccc948da3777498e7286c3d14bd409a871f19844ee481711fafe5850a5590cf12a88b1f40f48d46cde2368564a396ca11ddb7d566b8f526630697b634d0a6029804efc596d98bf0b8c57637e03e50f5ec76c2448ac81b518980ba6ac2357592aa513cdbe916a450353182e0cf5e08baedf909c9b08f1605fba58f0e649f2f64cbac10014759c80cd7688b16fc9255e18a6a51d32ac568fa5b47d1350fd091760fdc9e46585a5044b3783055edfe3e69ac9902cea4a71c1c54dd43016e0289a2ac15204ceb13c06e102d78d8d094af025e598951e2b892ae090ba4e6a70917de9dd14e441a0fa188003e54483533fde476acac89dfeaf53046ad3d5ec4bbf9e79146f0915045073f43d9fe11ed9a29d48b043af28c3f78d4f6a8e2a5c3fb56f0918a501cec2096b6e7f886770db22a213dcb0d207092dd1eb48225a600f4e165c5786665e91a4ade10ffa6b10dc1f5e1dadd5c4dd6f5b69908500b59a7ac3df63fc08a93bc635b53cdb09ac08e67f797bdab1cb9c885abe35a3769a31424410b1f8e9656b243f6945e350ac8c6ed6e3d5c18cbadcfa9692b63ea0937adcec7077878b0a28a45fcafd3d3f5d3959f000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00222d9c3e8025c2c9219eae3ee219670124bff379f5195bf832d3494f4843d505d1691b59b9ba05bb772a4ae60248b62c155fd2d17121e6109ecc122607331b4bd0209457bc17c91955dfda7da7a7bb93f05f7552692c05da67d7b157225b6e31a0e1bcbb68aad2a20e9f33120cb3feadd4a95111147211f30df9a0126c24046ff3e00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c208473f6f05cf2945099ec81379a8b83be118084859fd723fa412a5ab461b9b6e06678f51a3445e173ab3e093e5a48f2800f95d82a8259755b55eeafc4c71da85d0fec93da6f938ce770e0b2f0bf54ea48bcbb0cb8eda1538c702bbd6de568d3e8fda360309f23d1bd7a955b3944364c94845a76ba22fed814341a0028c638331c089a233157faecb996dac1ac965754bb2083704b91eb6de5c294e9293bdd97f4d821ce1e4624dc2ed7883e3cc830c6c8045191185fe74c9a4fc2c053d055e81e1ec02d935afcf09a7c0a02383a8746ed22fbc9664618e4e892b8f96e19c7a1da29ac1635626997f5750b093c904bd9acf3e36b83bcdeeec83b29e89dd8d8d92934a21c2a7395b127dd66b11b3a978693f69fa768e56e9164ff8e0a3b89c8464215a732352be32801bc1140df10b5d8243ed8553d8ec1c8fedff548050696ad0717f52478375ca2b86e2db9cfbf9c8e2ea4c18e89786265e10aff7efa040bf2b67609a977938c9f3c167630adb17b8f346e4f7b76ca13ba5895c6bed0270fcf7a55bde0ca08495fcb4c7ee229a6dc93b389dc3fb430807719738c27d3fac582840c6747a0b32fd4b3dfe0ca897f2f01a7fffdca7d76e313dbeb10ade381fa000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025b5f267eb27a7ec2b4903654835eb31ed8d8ed9da8c71d555914015ebf152a944dd30fbb9527aec6c324f7a96959e305cd669b1e8a8bbf7abb9fc163e17e8dc77f0dfe9ddae650e8044d8e35c82b5b6ab7d4d3eab8dc7fd6cdfbcbc30175f841ad4bca9e7a7f1c73ef130116a0436d4668ad8c67203a6d6831533721f4f35cdff94c9cf51ab5e0b049142d9464a5dabe405431bd581a5dccd0191f3230408186f67cb778ebea3821c3d3528e0390af6345b1230fc201c7bbc7fccc68dc5724cf88141f946b8e37af16b49fd74c26b70337fb5729659bd6617a04c814c6202d60e98dff9a2b1d5ad355c61999a1cc58a58f3c3cc5d598ea476e8510e9d946a3f0333e96c3630de57c4949def891458b1867be01a5050685666b6c40e5c70e72e4cd1420debd8c6d61f827a1c4a816823f2419c10ab28a8a6a499961b48b282e48b0125fcb8c90fef6b53ae23b79ebe746102ad9233ce56349dc623cbce6c408bda350d30d267f063fe1a54dd5f7efe2fae55a1780458d88472c16447235414b1dbbff7d435e00e91c9c9abf2e941f13eb5b9f456a7e799bafe380ee34c63deaf547e8ecc85b64847774727c7031d4ed5b76fc966491831756b32e64c1c60dfac0000022800000224000002202b61391ebec038f65af6cd6e9411b8bd434866f207ee556dba5e12db0129b1f20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029038dd51178f00ce6c17cbfeb0c292b74ac2287906796cb15f4f279be9fd40fb81c90a2950732e0452a4734c841ce79e61c2ba0d0d3a5960b60d444cbb3547a17fb396cb933467a39af08e66f97beda38a66d035fd3c0e8be4ceceeca9b4c1f79bd266315b7f786ed1e6c2267f649e48b76a0e8df6b36a96e10faf3e551bd67a5432eaa87bd6ce2636c1887e63cd0c00dc01d960a83855a5f5605b9ca50d1a998fdfbfe468ec9a12d38602375ed97405028858740be5fbc9856a0968fee5b58a351fcc12343653a02716374363db9fb7ff076487335af134a588b8bc87daee2ffe4378516d73bd3cdef35f7a8c91f41418c9d712047f3c3fd7160f3ee384ecbb3eb96adeab529099cd39d9aea6d5b84ada9996ffa2dbf50be990e6668985708b3c30862efe0f21505f2da148396a7fb9769c16ae48a6c257fe22d09a72d6ebf41e2f496c935d21ee32442c450bb848cc4ba80d3df770c2b9433687fc507c42443a539c0761792812c701ad45808cdec8419245626790a9090568d2e6a42fea9e5c4c492cfb4a2cd9e3cecfb2e5cb44a8e075559dc29cd2c3866d186dc7b700e1faea3861390ce08e12a286db7bbd26353c28e12c910beea69785b0d3a1c5aa2000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012b3c9298b0f1648fe10cdf771751d8d55317cdcde1bee41b253dc587554bd6ec0209966e32db82e69719250b3cfe4f0e8a042cd49c3c85c648c9c71f32991ed25c1ed7778bcddf02bf9123bed5f5017f7e20a17b7d445ed73f6e5bde70fbc524c8000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000950858194932b4b5b95f00d510143edea3bc0c34c021c78ff6d48f177403efc238603b3a7da409649cf0d5fddd06f205e8c63c0ec9217f027bf7efa0a13cc1bd7b99dc41ecdb88ffafd0cba60785ee644b3e3c99f5a3918c8de096c1d3601088f8bdcbd23f2add7adc99aee48aa0753e0d7a45664174aba2b8db688207c92bda2cb11654f1d19d4bb178dab03f858194850461428d8df13d73f578d5d83ca305f726e83cf97540207896d8722b99804599ec751fc00ca2f0a1d724970fd32b4e66031554810b7054eddcddaddeecd7ddd96f3c6a552d07b69434dd539f8981fe58a0db8ed707b315202fe30bf2e4ef4b0340ff694cd2bb6dfec0b3d305316ce3445968dad6e7519590195e2e29f143b11d1768aaa6bd73b5dac820c7ab5d6188b86b5b22500e4120aa6842d82413350ee6bd33dab60933eabf0b3a3dce990dbb1587d714af8b1ca2f585fc91bde751fc8365dde4ccf040e26dc4d5b662a9ca97e0f1ef04d5bab8f03772c31099dc612c0357a5fb00977d868e2f155180695d639d2f3fae8edfa7aec69620ab8c5d693ba14a06db2ef508d4c5626215b190d8316e0059d88d32a958d6d54f15721a6f4beed5f00283911438abefdc15c0c18274000002280000022400000220016991ee62b84a750b5859086bc232ec24c905f59544d35ab84d61ca8b2088910000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088ff0b0b0037a70ea3b3914824508b6010f7e108e92547f8fdea2f182c7e8bbfe02f49b2bda70ec816e750e84dafe4cf42f49c528f074af55f8db9247027269ffca7b22bdd90abd948668a08ad2e9234ac5f0b4b905f6c1fe50fe5eb3fe4f101d5ad725124665203f1ef26c3ad98db12da22aa6d1df38637aaf1e303c5d95f4fed098c68026e7c588901df1921bf6d577d27a4fdc8d8e98f5f486ce9067dae499b2fe2b1e6a5f427993ae34845461ea17678b601fec06c0ffe7bac8926510aa9d2743ae66f66520921ab61d09cbe6e5181236a826e01e326dfa33b8410847ae5715ebf110891be2278ec4c1ae087313e7881b7fda1e061f9ed019de1202992bafa902ee4e8f79b69d58e1d5864671d10c1aff16de4c287fb36b4882dc345e0e3f1575bd9bc7ef520191cd15b80dc2e574fdb7e6f6db3ac20eab1b3dc8719b8a6523a9b23a5e6077ed946c055e06f9f5f299fabb22210319315f35fac7c87d3350af06717db204f8db6781e9083591612b4f95ffa4d2aba62f8bd1d451c8516ba5e43177092766f643d56b48d2adf3beb90a9979ccab4a247d6a822b74cf8d081b12fe4add0943c630f06e95ee2efdaa4d166a83fe1e20780f487153dd8d4f50a000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400122a520b95023bd46c3baba578271deb56afbc6ef37e49454b9320d637d9511e4020b27ff7bdfdf113066dc88158d26e64fde805179feab238940b7dfabc7e2d9d81f43c0043bf10c93c90374d34fdeef63c8dab78a094f7db46386486bed06515e000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000985f73a8ea4f5824902c098777bdc48a29114c5e7a72b485d094005da20a0ada0ecc3e0346a0f2fcc015808504c317d87527e2bb4d139715af83b69dc4c2438afed065f083666a95ad17bc575a865e4bfa42e0096102fbecafd128f95b027be3c5dbeacd8b409cc5d81d39384c1df53e6074659e1a3dd20a78616eeb274236b699fb9e52839597e065e6883e82b960f1a484b5a4f5be4fc1ce02a52b75709c4780b1ac90be1bad7e0d8b165ae5bec11a28907dde8a3c8b79da51afd60abd872c1448d54ade308601af8bd0d0026444c94151cbfc53d0fd53ac5ae134f4507e8135030455a296847ee56645abc5beaa2d8b7efd309ac1f4b7e77abfe186d998ce7fdfc5cfa3bca8cf9e666bc222fb15a9c1eb7426d06bdb8669e74a072c9cc49f4174fc04dda2120bfce90f89c59ff60704132c71881d488cfa57475a5d6f25845a560d8060b86cd92bdff24f9d1b6b7744601cd9e951f56ff4a5ae47e03019e0e5843e025d2a220abae3908e0361249e4cf6ca71782a652e302af5be9e8bd555eb7893a53e7f77129838a1edce9e70161d7d0c64534139fee12006a57d4c4b21edd064bd6d3b81966f2f39f58def278c542697b82f48c39132e573e31801da800000022800000224000002202a047d1422732787b82a4ac046a629ae3cc0482b3ab28c550ec17dfcdb49cfbd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2c648243e09f57cceb5031479926f95dcc991c5bd93aabbcdbd4bdbc13fced9fd71d2b12384b71a95887b08b57eebabfa55873b6eeaa51144c50802f3526541f1f25c89b53a96a7b5e2ee39a992e83b5c94c62f68599efda56d05ea6d63a12badfd1ff3f0e103adf7a1501d2d2c77ca97547341023159edb88febf9f7eeb15d989a596ef513cd98be1c30907a41ad4c5ad0e0b390896a8cd7301527f3b301a59d313d987fb7439506824e281b33bd6f59c1381895d0d47a784f9cc61f372cdc41b5a2809b494306347f113a7b005ecdd88297e50a8076664e9310be6d73c4366f51b1ff28dc84f963f6323c4aaf186949c8a4e207933d300d48ce46ec4fb5ed96e68aaab6e2d088d518889f7e37293651a77f426869c5f085e63bccec2375d8a5dc6e7fa922e02a392fc927372f893488efe9bc1b87da432735ba3b9c225b9e573385b8c7d3675e32a0eed2f610027d32c9c619a817e8a805f2d78883745d64cb7634bbccb9847e9c767a8744582b5528f98a3d1c943f44722df3611c3f460279b81ceafc3cd172734e641741a272ed34f821c1697b692cc6690d55ee73543a4dfd738790a2e15d15b9a10a0dd7249e1ec388d0194339e55c5dd42ad991549e000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020282734be5d744925de887e0583d5063867608cf8a67ac76935b89dbaa0f185502d613608e63de6b218c4f05d7be59bd44994939c979d046a0933a82b06f15ec020b4d02a003dccebc5f0f36accb7e97aba23f6e8f686f4d8b25102f13e6426a6324849f5cfc97f3c4ace9badd70fbbfca203d0b4f72f9fe5f8f1c875f17adc4d700000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011eb172c866995cfd92dd474d8bb161e213244f9d749ea45fa882976c6c635164d3ff01f6fddba68f9f7f524a4261b39c1acbf3acaea230ccb00dfd9d3e23cd37d2414266a3652725085fc99706440d9087c8ed2174711fca18ccd93bca030c77dad8eba3421c2a4334c9debfb4f80edbc5e1a1d3a0fb08e82006964de362e890cfe20a93a43480b02616b8f256820d2b85f87c902b265778bbf2c0e2723c9b245201dea996b5f24057d6029e6d7a8b49c1dc674676f8ffc1c4a4818036035cda508dfc4b23f6e7027693cfce11aa13cbd85109ad5446e20d856fab1651a6b6f95f23a7ea9dfec959b9b38c5d44b11a5b8fa3f357b3de7c22859df75408d0ca2e4b08104de2658794de47d638911cf9bcbc9dbc584e441ae4b1791da96c5f186f1174aaba1ce5c7f435cf30dfd9cb9f4db03c7d07f5fe1182a9b929b456bf060526a6a5262511bc7d3ab77aa42b6ec8d4154dc50bd39e8e7ac7d925fcc21b79028f2a3e848a67c6f0d233e603a622674d15801b044683cd4aacc56c78e89b7e56693f7a625e0f6c9123c9a410610ff7e029847ea8d02d2ae67c4bcab8f1e0f9265370c6a9b7443441ce769e7a829989ea909e4e58170f2ab499ddfaf4b605f8a00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d83cb94eb66d2602a416ddc83de7c0709bc9d30b5da0fbef1cc4e7fab3e407c19b3c16aecd28c00d5e65594e726dea7e9dcd5e4803e7a1d23fd5b2807ee68e5b8fd0f6486f43202972e70183779d8b4a6137b0cdb7ffaadf2c406674e62d3f228bb8bd8dcdd843dbc808f5236716a6eaac208f3b4ca48f1bc003d9ed538d063ae4d9557634bd671144ba1548fdc1dabd6508e5ba74882f7808dbeff420b70ab3904b78420ac858c5aafdfed928005857f5ee3ae015edaeae13e0dc2d42176d68eca391b406a27e4b2e51a3bbd6949ad144d4f7cb781b6d93f3403ae7d2a68b482d3261cfd90c0de4395647d72cffe8b374dcb730858a6a42da89bf9c221639e7d370f9b3508000d0317547542d4ffc3e7942993484187aa03efa4201d7796d8e5122f3326b8c05a837dc3008825d4fb130b598afedb945c71aa72bb472b615c6a6ec9bc03a75634f6f7a744f0c0cf16487dd35c7464afaa016ac6e7a6d47a4dd38965eeb3cf16f1f042a65b5b06dc99742e07a3bcc3ac91f4dd61834db84b93aeee07479328eccb55f99c9f845a4eabb1f42b8eb3b12b6f574fe59a0da9bb56787cd9a9552401281e3d021596c799904b4c94b2348b9666af0448bb5875f4bc0000022800000224000002202a0afe8e79c3869ee0c8f52f6ae19d8a6d8639fb16d160fd80eb66910264cad200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad079e20a412b1ad7496c74e2b57533512284cef95696ea1e22fa6775718399eb2b052c8ea004b52938b380628526c73df4c0b6d90443da7972d454496e8beedc48935de3b870056bf1cce0a879630f9e4374f0c77e2cdcee5c46ff56b17954cea7c73a8801d030569ac9c3bb665f42bab63e15c6301c6fa5cd0f9c50199c1d5692f0a1c6be08a00b228d24a9aa5872bf822daf9a839a89376aea420ac67fdc46bb6f18ff02c03649030ccdb9797804556d12cf772f8ef25aabfeda3c66c957001af130d4f72bc44a9a50195686f3016d47c08eea5128b5822fca0965a251aa52640a8fc9647497823e13a0696848ecdea46fac83987df40c224b833fdcd3d31e1a2e44c3ead81ea9e28341d61cf6282583bc2455aa54f6e9b2f5fe9bcc449fba8c14b392f7b109f574d6d8b0c4fd82ac91118922c973cff2b89054a75832ed38b864445ed67e0c426a6eefb6290d5cd9e6b8c0e8501c9a5da001c2295ddb147d17984aec7b85e4208d0b8c9e926871e6766a8e8f377b1dc51004f0831483826f2575481e73d5b3297ddf9dc7a85a25a5a7ae680a8ca96b83f72ede7fb951be68359cad1eefbaceb20ff7cd9af22729bf9259e8c6238ad93c3b64c21de27a50b000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400119a7637b60b1a8635d8975fc3dbcaf9982e8a149eb341c14aba79b57f0dee1f5020e41b7cbb76a35ed59c58d4fc90ff8c236190b3aa51937e75d41c0f2c08ef0920e5b6277faedbe92eff3933770d78a7f7bfabdbcd3522f871fd202327324bbc00000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d5d310c629a77543c8446b37cb4be483f0c3ccdb426abf020af8566ccdbb837ca92af06f37bbd7b112f63d2dc1730279500ddbbf3af065169360060097638ce6ca44cbdaa11687154ff88657454bcffcc4cec6d5f90598c9cce1f2e864b516965ae1882987142e5539c7d26d013c27dc6921e74ce0a6c9acddf7ce23ad7eb1b0fd6718f0fa7fc446eabdb414a3a9a5174e3416a23c1588ea4c5c4101baca9eafb17ed6269985b7d0e1b59edc819d1b37202a6635ee4e17a1d7cf4c8d9b82d749cda64d777b7c8b7b986379a2e85bd3587f48eaed3a0211da2d2ce9626520114d6becef545ba4630030de455053180b8ef5a416fde560b8b61baa6af6ed97dac3d42eb447e54a03431b74313020ad9dbae88be1ea3584dab83257c06a201953998807e7c1af880cc18d15572bb981706f07e6371042ef158548b8e0d2a194474323ab7a43500bfed3b7f777e48f1934b08dd2bdb3e7593139e9d794e254c34f34dc00bc42c9daa989468f676c3c159564ec347d35f94e355464237b9fc170c1fb4643ba1796f4806f216cf4589390b8157436c9c841d9ec7e81accdaaa9a0cf4fc78699e9f64b2982740a30dc23b9aa548f6370037014d24c9138039f1080a6a0000022800000224000002201fbaf7c56a43d20f8a0e0656301d02c946bc9f86353caa97cd02f5f0dcfbe2d80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080d5aee8946d3e9788bf1779aed44859a322143a288b54e235fee9ced64a3174fab8b6f7417115dee03294c5336d3bfbc1bd9724553a86039c6cafdf6c008cf8b1071721642423035657a8468af7ce6b5ac7e86111a62c157048e184e5c6fcbebba601d082a6ad08bac0f9e62a60a8ff21d10ecdd95fefaae5efada24b4add3f006992590142486a2bbd6777607c77806ad9f442519e6b3e0e1526c3685cdfc5c85410f643546c7db17b2e1e1d2075f53d46fd1a58714ce5c911d3539d3ecd59823a7e19c0180273700a454bdd944a9ea66e0c46f68a0a3c5cbc408d4e8dba175366945b8225df5b47d281452ed2d334814fa28bfa3b865d7129d2104c7d4d29c5c48c91c49ef6b65c62cd23898dab59009230f705f6a07b56dbd295276c5c7002ae3508755726aeceba826839cb7ed0e18bd661835d1b7e3232aff189e28f77a27b7a335e4ff6ee7e0ac9845fb63825785a8da4ffbb4b751b21653860c2dcdf5860230ca673ce4e41b1b0629e0b18f257eb7ff91ad43be6be1af1a1480b8cbc5e1fc3cc123096567b05182ebb648031b95f787e311f7c75959e232c29a8fe6fdd29879260cd2e168ef2b07f3dd5dfaf81c97429c292d562f822eb34c8a92f13000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011e5115f5e2a0be0e4bb6623072080ec13c1a465fe807033505031e30b9880e9b020e64afb534f701fe2c65d4d81c36d5a4b0f9c223d4e9fe59a0623fd1e8841f441f67f037eb839e00cc62d05d7b81c07eeff7b356bf0c178c46983d8878f09e120000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f16305db65d6281400461e0deedff45e8d86c0ce2a36d0fbdd2ce24d00e4baa406f89268450e952e3bc5b3a62ed4a937df591c7f710bad782ea25f5fa6e3db39dc1919f99283cb70c2ebb8d13a8c65dbcadc68c7d1204f881cf5bfb88a374af5d2b80441825d278f4ea1a9df92347a7acbf80aba6a908c5da8cd06be91a8dd204aeaeb258d041a205803275131767f0633ee517eceb253222509276ed0b4544284235b0a663f02e3f523c3288792973550f1d5b9c866da74da770f19802fe2e01a91601586ffe3ed6fdbb000f7b9290bbdd5b8711c5d39b66d1383ba1a09c5f3f53d3aa757495497850473dfdc993800f802639bc3cf7da05f6c9d514f51af6e075ca3ad9d80660068ac19c4bc7fd4365fcc66f19b48f047eca61a0f6d0d21f6f42aae96a78ef4e9069d85b6974af8bd8c2f8b0993ce744511796bd7c2f0b0244cdb59a8db2e519f7f0dd5c3aa19b0fd0d60d005905d2c54c6f41bc291d66282afd21b8364f0655d6de9afc3f417e9cf034dbc0a27b5fa0888b637e11a1069afaeb169debbec34f1148ba88bf0c50d5fcb6bbb4d84c85453d786af84438dd158a52dfea4363e37b78453f282bb465e63d51079337873c04515d704b6b774d1200000228000002240000022021c380798b8017f4e46f17897d62b41d25f075790164d31b6bbbcc34b807798f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002466ad391bd72d4c23d343e411c38a7e9e253f8ae973893d50f699fe3ca0f141d4f37215f13a7b196dbcbe697cbd5eb7cfff64194669d54e68ce9d1f78ff642aa739402e62826e1cd234bc9227d4ef7f954168aa2b2f5587f81e230458d673c432ae88d424d3baaf25d76aeda9ab0ddfb806b548b14276f1acd959a272d791dd92952aaef1168f6a6b524fd28db6e70aa5803fec641d305c15ef063fde009a41b62bb43c3eb330b49747c2b3b69a36c0ec396572a6b8def1d4264800b8c75f365c27f16eed49d121f7a0df0be67bfd9a9a8412fb26e7266adc34d66e1bbbbc65df70c41940218bfbdf1177dc8ab54308b31dc6cffd886644e477a5e1f8cd0091ead4e264df0deb47fbade8860336f3dfda421ba75bbf3b622d8a018f0a7169d21368b252138b2fb809ca7a41b43ae8bec046ed1819bd9957325c05afcf8f4732b747637099b1e2ba38998d327ba6deb92b427b90bccb8ed8cc6e1832a6613f1ecbebc12c8e225fccc09e2bd4251770752b6ba772390e92f5d7c4175af35b707c030c0149eba0684d32e68eab68d21ef674f4477a5c1f0469c04a7c8ced7bec63d85750823b0a720c7286d26d444b15c311e875e56814667ba3028884968da050000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00206f5f7d3c342aedc065ccc4cc58c839d64d9baaaeda3ee3de9a7e2c7a7cb447223c6da751137d5cf1bfea91f5c0f1d421908bd71400589d15c7dc77f156a6dc8020f49c20ed85dbbfefba339a1dc719aa185748dfdfe8aea7261a09309d3b12adf1e16e574effa407b8a791a1089e488311f7ff86a9581024dee53663dc1f10a1d00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024e42304379b52d60ad33487a96010dd38bc178cf63abf6edc465353b55b2efef77353a770b7d8e7c88cffe5f73ffae6821b821e78148467ba583cc377e8e74c244f28b883882626fab913bf2254972b8e25227e60b6e8acdce535fe066dd351e0b84177a66a523659685d06a7c306d0f341871f5b19a40be2b9597a7a24c4150dc693366e2731b841f4508126fb022c85e578381e5d91ffef0e0d6c43df47dce67da105afea17a1d8d9ed8562ec4ac7c5da163cbbff4dd975b2d34ac45ab1036370122ab9a32d0dbb90c2d7ea80b1f6030dad456f1a1bcdba63ec74ad207ac2ff7a3d1b8076475fac2f49269864d47be423312776a58bfccfb3edfbdb23cfd47964c2faf2fb14dd7f4357b3666a0731828316eb15c9260a55c50e09f85bc921ceb9dffd876ce20e8136785f67bc1a8cc10eb0698d48cdf690c249b1864e774b376903a9681dc6e42e9ee4c9488cfd1f45e3dd85b769a11a3477105fccabf2f83bff5bce1a0796e9889d99c5a7ad816cdb2e3f3fcaadf463662627cd555104a1b95ebf1c536ba7387b8310242b38b5fb3fe5ed64f22667e5959aabb3139574be09c92aa3d4b97bafbc5fda58bcdad332b23eca53d3a38cfe718c552f538c46af0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000852649a2785566027507cb2d261a9d4f41f7e2c713f25d2c8eaff06543e78051b05390df3119fead13285de53d6bb6d84d7cd7936aef69c8e3ab2ec1275f3f1494a94726205ea1f63c16a5294ca66c3caf9ebc57f27b826bca06e1d21e58302ebc04895b956a4eb4395e5cedde17464c50b9c44d8c091a945f184a965b6735daaa9598489755895e4d53b35308e5e681f2b32fb98f38f703c090016302fd05d5cd53ddc0b7ce1a6dc71c5260da834608f9f3cf5c19cd517dbb0deaf3e48ebd5cab5898cf8c857609ba4af80efcfcd4d122082bf8042b17387a233d08123ce0809337d410ef0df112392de34b65ac0dc3a8f0e95e5ad28e15e589796b9cf465029f28c0dcf81a9006536f444cb02098547d6ffde24cb85761c7a1ce6d71a62aa0177a822d2cc785ee860a221f170d5659360338fbad2c6dba986421c3c638b54117e25367df35d19342b024e7291e6a55abd81a4270f8585fb38a43f0054137a8c7c11d17d2400e4055b65c0e0814f69234088bca6ec2293f1df140bb2c687d89b3321ce4f904484f4cfe3696a9b93fa25774821c4a5f21560b24f922e6688ec78bd0f9cafe7b4077d591542dfc3afe26b018633e4d8e6db2ceff9a0fb43de3220000022800000224000002202ef66f9d734005eef43e5c190460588d2f316aa16dae66a4f923859a85bc92b100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a321ce57217b414847ea6e727633306a3134fb0c8bf7f88929ed43693fb7d97ffe16ec9785b1b09fca4ea3eb5349636bf13ce1fcf3ad193780ef9999ee47d4ab98ce222740c52bd4aa5ffddeae9f01d06044895018f7807031bc2c409074a8b0ac66fce8d736ff45974ed338f0fccb87a6e0dd9c8b3620ea6a327b1136e751a1d004546e52530f4a25eee16612753f12d3f321fd57de413847d33563fd375b120daa66e43089f7d7956ade191f0aa14cb9ad965cae30835884b1baa48d4da115443538d8c8988341b76799f4b6aeee9e4bbc567184d840fb1ba55c312c36cc41f8bdd0f406c49af0b1cf9c67ddd444c8bae6d63fd377257ce86579608fbb2f1e573b47b328ee7976ef83a1af019b8195f02a0d50570d40f6fe5e3455a3ac20f547d30067739806eb2bc4fa6da9791dc5f02d91c29ddb9601642d362ee248352589a36a8b1bbed65b1dd91c0ea994eb3cdb1c1e01b0506e060ab0a091bd33ba4dbd56df549bbb5f35acd26f92db0808e1d8cc84c2b85a698838dd458d3cf36bf2e67aa8a4a6bbadfbcf3b2c0d255e54397d8b7458f22822c7299e77da01db5132875254b4c926bf2f42b7f3f7899f3e1aa18ce41fbf287655a5dee2749db5657d000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00219c01c1cf4f4b0405e1cc6e057c405ef588684a1af5c0c50ad98fb09d38eeaf123961efdb67ca1f2d7a4c367423123ac3f244acc68a1f4f78de45bd182e00ba30213c4d4e9d4623b9aa0274c220813be31b43272902d11f98b44d30c2b8ee5acae0b9c18957dbe884e34b851c6554bff24051f672b7fbb5360b4bc15f4e7db46d000000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b05a0706a3d02de7c474e64e50b27fdefdadb423a7941eb32270120a989ab45c181dc7bc30cadee957aacbf7e817a32c5fe0be6459b7c6a477b0ea2ae41640f1065684a3ae8816645317e815f278ba523490b5f6404de01c995400c2cde6dbdf47f74f11521fc89b0a018ac5f16e77f67649270cb729ae87b319658cd0fbac0504f8aa872722bfad608306962649a696813c27b2c8893e6161ea60d6b4307dbbb1eeee3105aa25167158bfbaf56811999946a8f4cc1c0f5fd026084f9f83ee8cc7ff740c01eba3b52b62a3b8cd61741ec0050fe22deebc152daa4cb1f0889d37835be98e7fe4ad913f27492acb4531dc0e763c429d80006f2e42006f20351d9bc86687037a9ae133b17ec1807c51c7617437b5d2cafd2d2e74200b4206f8bdd161c3007a49a237c7a0e403524b7d217b04b5a23ef21592edddfa7af2b4bdbb963c603ac289e938f5f86db4bf9591236a4f67e869b9b1ef0b51b47cf0c3e275d95f0c2e257344bf322413ae94377ca3ded7aa3c6c86e8dac66d33cfc867e16fe869ed767a5d722f1594d228a1195a34160a7b2c6dcc0cb61062d26be3d83bfc2a69036bbcc104a660e5766d8edd20691a539ad85aca727bdb28c99414ae1c5dd00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b14336a915b39601b56f3febc77498581970dcb1961ab3f54b7dfe32c6bcfd9b7d041b935bfed552e6b4803c04fdaa8bddcc39c6d9528570bbd01484762fcc11068410ecdfd6e73a224a8b43fc928ca840f138438c271db36e8c36b4c74de533ae67b4b5d9d9f93596f7d53c1468c22acea293291e68928259e7371570692042d29adaf53418dca7b5cd948ef5c015367952ff82a07feac679842b34632bf1857dd56e1a0a847e54e2871ec54b87fb08b5357ca9a771ffe19545c32168b3ff9551443ca141f9fd26a18d9a1a64d67a8644197b04f5bf52696e6f773d9044a6689130976d3c3b833dfd436a82a994b1e7f09ae7986209cc31d033e211426bdfa767191382b6b3b7badde4a3f881a28c43cf6fe3fa279e4d0c3bec8554ddc098e4938d792ae24f2358a396ad7bd185fec67bdf49cd547a2c5da4f4a0ff34fc63ed02bae190929d5a7a4ea926070f938f8073e07d61f2d1c67764b6606867a2d6f1e34c83a0b923b3453de788619c71517e6087cf01167450cc11e9a42df15f67c9ae652211e69f07367072d6e67ace647b657119421c7ec022cd7dc635d70ef1a25ffc45a070adfd9ec6abff65bd33b37ba970baf7d7a27e576b4a8d3213c4d7d000002280000022400000220121541edf276e9eb16201799b9557816b4e92730620da44f403dcce804e80d410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096c6588290a5094fa74741fb113a842c4b7b2889b8966922ae869b30e30e943c5d6a63c4b7c95d735117c0e0033a75318760f65979cadf8f918550d6d5c7e6616f52f2931df8d97175a49aebcdda553d4111270b4b9d7dfac2b82f5bdaf2dd01850801e24d927498bf0fc97fba70545cf03795ba03a92bcca668725f5f4e2e7d7eb69d3167953d5efbe7be12de42e17f472a3e192a15076c60a143e1f2e3953e4f24a769c35dc849dd5ded0bafe0f6e25cd397835f5d04e68c3c537a8f9aa45dc3698f0070d0c4baf501551d8a723b727652466269d00ea3af27df29dec397d5a9417bc971c13532194e8962addd2f057c92dc7c0ab78d97517402b39b1494040c7d12ed8f030218352bc86b1006dd8720d558b16970df06173d310dc58a8a5285219ad659d545b4562421cbafe7e84c36878467969600e1f94315fd2b7a7368a1542e38de0a5075f9a4b0a03af2a7ea254989cd527eedcd622e4660ec568b2a4aa005aac7fe25275e2ba408e337557791c69bea1faea6ddf57d3b487e603f709d724b6720e650ee3d2eae07d245cd18c10d67480f3a94033f0029f746ad8efc9fb2557fb54ba6edb90a58dd1eadbb698593924d1ee356d322d92cfb65b26cc1000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020889ed7dcdd13f3820fca61404980e7df038a68ea604a370421a8cbd8b6654530aedfb79039d0eb35c68f096b58e98ddf9117a8b1c2ce82c58d7e96dcf70fbc10214a49a6e3f98e02ebfa83e4e240d6b85a1e17aaa0845eb9dcc549d94c5911f6216f8a2093ca78223ee184f6c5a30931f5e6e6bed1c4c45e4dbcf40679bf2775e00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f5ea53e5b40cf17cfd72c07eaa8f34fead32062534e831c99d26cd413bc5cf9e2a520018901ceaaa634b89bc10276ddf14a0bab0e33b59a90f89b22c2f8e9f32f4511594081cdd3cba16e2c944589dd81dfab843f9d5903fcdf714c16f5b5b14386bac234a97690b9da20e8cfcafdbcc33f7dbe0b0aceea46d344927e5bd6ae64a3b89e8cdfee2e872c66bd3cbe09be5b20ecfd6e082e64ec93025651a74cb74f7230e22ae99c228dfe208dcf97345582841f7dfaf4a2129aceb040c75d94e5e1c80fa6936a6a5640a5361f7e2573e4462708caeb6b29d89fd207545b96bdf5595f3d27b6bcf2da6bb2b5a44e3f6036464db2f2aa012d942ed2ef6f05d64a279b6a19ee3f6201dff0cbc61be73b1622acdb8148784c250dc5feb5908591f8a00e517421339ed708595642fd9e173a46202dd8d5298032f1c2f4e289e917a167e2d52d80b5fd751d7482af482f36200be01304eb0aede948f87a7822732db1c0cdccdef6d3722040bbd33d0f1142a41f7997ab550192245489bd8f9164f732dfd788d58080cde7123524ad1e6e69dbb51ae5b7fed103534bfb868e61edbe2d84a906237843bce7ce082a229890235596d13d8918bb845300bc645f20c33b25cb000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014ee8f917e584406077c06bb89cb0b419fed22f6bef365d067edb4863454bec783218ecc6e4c5d02f0f002496555f896570ab408cd15f2587a0b10c06e867c2c9a87d6955109f636df2eb71c2665bc7ef7bb907bfa555a45472388fd31c3fc7e977b0710c41f215871ed056ce5f66a8f5074d8eb8c13a324f940038f90160ecf783c3f45dbbc0be511f80a97b9161642f48c3a715c2f70d1283449ef0c61a1b8f2f651812ceefbcad194f56327e4cfff4785bac1a19ac8c6d6cf313856baf3b1feeb549c95319ca1e43518454d83aa414f3e90f03c3cb84604ba6f927d482f97968183f67922f52db682b0d2d88805dd60be8c7c8969b0b62897f1a8d68d6ccf38d96453c9ecbd8c0b1d899b6559356552d221bb322d55571de35bb9b94cc757d0bb875dfcc5c4bdaccfd8ece50987b4a652c8fad2f6b23f9cd008dbaad9f467a55a925bd4578cc5356d20580c0bbd344ca758438ebb767933e53bfebea7b034303f680b79a5e040eb75220f09483555b7470be14c1cda2f06c7aeb24d62dd339146e20edc60b04cf2e0e7d0f25cacbdde0907956709f166bd9a2bc5e9e4b7ad9a7acefad2a6b7954a7a88acf9f6424e47d4bec61b4bd97d6673a5084fbefb050000022800000224000002201b393e71236b7098820b6d74802c4fbd7416c081ca9f0e171c4a813b4b5821030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026433753daaf62c52b4c5d2566cb3511127b0522c27cc6bba545dca76c3f386dab6385c3f893537cbfb3d679efe603cbec9c4a04cbece158ce4d2390d9553c3918016d9ff2828c3ee1ae1e9f2537b6146dc27c48eda55f913c0ba6a0a97cc781f2ecfb5a667b8d3c0118a4c3076e0907bcf40ed2045b47538fa223393564d110169d2c17b06a11d08b0080db17df93277f15b2b3c9d6e183cd88aaa406d38caf6b6678be534d2719778f8e6c07b909771d90d861569808e61e57a93fffd019313159100a6ff17121526f417c511c11923f14479d42ff312dd5210fcb2bb36676d0234a253e29f95f14ef1d42ca08772302c356281a996d2b4ab3fd99da01a2d43f3e7c8990f4377d117de234bc596c68f5262f0e8bddce470ad8ce2207bec32027ea7ea55fe4221cb089b003a74aa567b4e0a55b9dfc0a3932ee5849304376f5a4f919d9813b448697e23ce77a60ea61cc0373a0ff70e515fba107ba4f01ba1348f47855265a45dfb0c9bd99fc412f0fcecb46d4822d53411e2980ae6fa2ebf32e920ac07f3d8a4724fad7add52a6b1bca1c85f1b8e609a0166178de103a90aa2f1dbc85b46ab2326ef5289420a4f792650e57cccd98034f62f8984f38598b50000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010ebd4b3be1dc4c882866df259e2ac8e2c984bdfdb9f6ac9be930f56c1aa1596f0216abca8278cb29da8971e12e89daaa10b17f2cd098615a22d455b92c76c5e0f716b75631324991e896b680625e6864e8dd5c1d9e625f52ba6442b360f4c51f5f000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a94194451d4395b1e0047eb44f575c7e4ef5ffa9582227a9f36dd4063022e6401566947bedd65a3265a4e3154f2b2a0fa0feeaccd0042839d7798959e476ab08e9aa3cafa05b5a366739f00d70c2baa81cf463658ae11ffbffdca151040cee73f9a22eaa32479b6b7fa57eb9131c48fdf2f9318a67412c5d2bba48140ccea46c692eb94f7e696cb3030ce14307866cd10cc4e637c1a29d0fbfc2c9fa640c649599b79ae2a13c9054a9a25957a719164bc99395ac147e43b5a16f4e730235a79e8e72cb4d12b350c7b0040eee7898dd393ebf48f43c01867b27b055ddb3424e06fb44fc3ea50293e2729d31e5336fc334040de2dfd437a9ae295ca7d165626640c8dcb354818739bd4b8e444ed4a439d4fdbe7fb96cb62ea4737556ed9a2cd3f49f5e43339fc8484be7a654be985fce47280b5bdbe4e6cea9f94114206cd687e341d8c6fbdd490d3a6fdbf9e0ead3e75f68378be544c3644a09e692bf70ca24d4c9e5f90ee8c8dc0f1c939cb6ffe6e95c622f06c5ad1cff6e2c3010bd3b02ba614f697baecd495d9efcc0a85badf0f92258665ff12ce40535e72bdb0c306aab02164db4f4812b136927403965e6da083734bf1a212033c4ea2f0ddfd80ea5db9100000228000002240000022026b1e8bffdb49379991d001b610a8921725b6537454dfaced496c0875aeb697d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d31bb65848462cac2cf6cb20a9cc5db2c83092201eb1499d8c3f80d17aa0737a179f17a490eff6deff11452dd44208e31f6964fcb0b4f568a8b77456283baff61ed30f3a262acce481a066765f801f1fba57bd65a465ef192a81eaca5607bf2ecb884f594120f9a450f9f40a42d35c87d0c4e0b51f294f3c40563446ba7612cfa8b5551f703c7c9ca2fb2032a6a5a08d8917fa8cee0a0e1d19568534a4b759f89f3b1ef121511b7defd14ae806565cfcf6006bfdea1fb851d4df94bfe3a557cb56c5e77575591c00ae91aa03c0a66a31368a504806043cca1d2c23e902f126e3aedfa796fea287904e78d8faaf8cf3ef7021cd4b9182a1e8bd4d5ba1ea75df6a4374ad2a01e5e204337db6ace14238e7845c30d60fd76703bd01a2d36d82b56ad4d4dd674b0a76d6d5376f4e9583b3662b00fce4df64d0b0d6c8e79cb71957d537fcb2416b089e52400dfc086aac6117f7742b257f7250df2de847197b83c97092cb3c43ef40febdcd907c28a2576cd034dac2b32f8c22c543ad932e8024727e06d9e9e12409442cbb73844996b658dc79a85a99de6cd8a22eb97bcc48ac65979b7be359b31fca5c8618278547a2e1e5cf8024925d982d8e5eb0d0ddaf3e3d8000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020f2d2ae58aed1c8c15f08688e6bcfbeaa392001cda78e395f72fb9bbadf9abfc204ef8aba610cf24185cd28525d79cbdd8fa87103b0e855148f97f721783aca1021925979b5125a2ae67372a792b08972ab3bf8417e80a2659aff433b9b42ef3e103d8b9656ec508225c812698236e703f28affaca453a4bbfdc7d81da6e4d8d5700000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081572caa2dbede86df3e9224e0324bc73369193b3d71b9f6a39491be0dd1851a72667b2a070c4062b427f44a3cf871b8b84801ac4a18676bbd4c5edda3ccab02703514b046a15b610c3638b91e2c3e1332477d289faab96d0028c085136bdc65fca551fe6956a9ec6909ba5bb710d3b22757f11e5488d06d1eef341468453f3b6a3b66c06dd9c207ae27d6dce1eb4443705931f5c7aa78b00112e679f0d3db512dc4b0e012cda4c28bf337ed825686ca666c34d09aa9717ad38223fa8b38c36668e4881bef4d80449aafbd77b29a02cde807fb210a886cdf149c8de8ca1ee6eb5d99d5e433daf5c452d8d62c1b1ae9958f1db812e9c08d0eb55c227581890f2dfc24f70fc7f902898524ac0cea9f18b4862b11b512ad85b38f1965f1e5fb31fb248562280726d386d20c1c3ae111d97fa535cd4ad1b0abd6a38fb29d7a3f8025c8597fb154eecc4c2561257d3aa3b424650428115042fc2b39813f6f311c2b87ce53bb6061bf4387a882791a279b7308c3c620c4b1565c1ae5e250b2b8c3b6ccb34d723fc45a1ed6a6987bb845e542a5fc4058501e8307985c0473f5e351da0234018137d1d6cdf8a78ac3e4e2f5b59fc7d2107d51ffda11787fd83c410608010000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064bc5c0c0b3f6bb062636a4be435711b4c948758acb275adcd68538f1538f78388a284bce7565adc3e860978ab9be5d04ba3c21ceca1a310a145c8840524778ff9cf7258ab1f6385ae39f6fdcc64571cc68f7fac89d0cc469e8dae31bbd83d78b7248f879c85f390a9380229bb1c8eeb20d28d8bd9647ce18599657ea70964482d43b8fadb3cbd7b163f851705518f727eaf897d2efc715ec9f90a65f4fc62be9b832ae7e154421be1b952761d1c9d9650444de539a982be0bd7e31a0fff4646b323494b65e73f7f0e838507c337eb8e9f307bb4fcef1b8b354358dc99445825ffacc8b0046e25a6ccef04520256f24625f464548750b387b0986da3088a1a52993aad10ec334d02fa8f8765f00bd9fc65c56665937f23e5dab37206be47ffd8a81366db5cbf6f44b6cf7299c5ab3a10046431e582c6556c57887045ca22f1f116c7737495801ac93daf07d50f2b5e32d7331688a0ecade9b7d72ec32cba4b25811020014ed6bb7c960a6744b6039c01300c3dff4f2ead9d265530ecba29b1d80b64fc07c60aa3efc2719d307b8464f37d018f432d786ec91834c87951c1d3439127f3fcbb1636ec26f70c60dcca414213a62e9ebc9634f5bc3f157c45c2f320000022800000224000002201e36fc060eb1b1bead72f70b6089db1cf8d53548a7805ec6fbb35364fb29f796000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b1f59016f3576855d3ecd9c2f936e74e8f76dd03e7d2e476d36f5179d2d39e421bd44c81c0301de6cd2ce0e6562d0771c2273d4512b09f8524ec6242a12eb23044fcd7573ea63044bd48c4c6fb8225bd0c2dc0d2520eed45f8ef61553ebabd5cff9bca0657245957f195cc56da4a1c387919be350c03ef9f4e7da310a723c80a5900224e1c1630f74fa04cfabe3bc39c136494f3fc4ff17e909be1a3b9ae5824ed88699a8530adef9221bc274e2807274127e2b0fe616ef1ed871da97dbbfd463f7dd792f240f81ba8655ef8f97c6f45f593bc668048b87a763d3d83f5cf9b37d5bee704c8a48023b201d4750a8222a4d9a273ea94ac7126858beaa4a4569fc4f9b4d3c3be54a8946f16f6a04b129415ea41cd02aaacf79edf8c53849c7b53d629e3361102089d147f7d6f6592a332d99d0380d0b6352cd3558e1e0f4d62c99d38a4e424c71e85e67bdc2952e6b04b23aad9187477d43daa8d6d5955da7c995df1f56a4fd16c3ebb0a7bb9582d4966916f8de6e6961fd7bac7301416ef5def6d9d5f88ed10062286f98f1cc57f8f4fffc2c2416af98edad094717fcdfb0b80a026692471cd069e70abb1b558a7816bff30d30abd4c23fb041994c35c7fd0946000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400106583f5c96ecd896feb2a6cd27e64058844bd6f009be921b34d3034ca0a057e4021b2f85d1be67b5823cd4dc64eed6c59bc35ff0d0a173a71500adc57f2a8ec9242f18117ae0c54168ee1dd71112576885e98b541b49079e1d2ec7e1e2b66e0f110000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009be6be2f5dd7ae6327ead713ce4ebfc7099a3f453f1c97eccd85c6e728b77f766fce8063ca6f2c686fa3dcf9e8807004fd583ecac72fad6462ba2c8e64a6d166ad062c0094a4e911fbc020c0c90d47b14977b85ca93a8eb27560940ea4dbd03477f754a435c616d2f8784eb6fc948682bb0ea3a9c284233c682ec582b92abf8a0fd82ace6327f740468d95458525bb8167578e9d307b6a933b4a1d494be953b8f30decdb98666c8f4d797891a1812694b51662e2fcef33279df5cd9eb233054b7920d5bc3721896a68a7855199874398795fa10f6c8fdba57959877663696abe468b8ddafcdfcf8288edca23b4a780e5307a8506b5bdb095453f7d3b918b73f04a5e418b8e66982b7a8ee1fcf7968daccab1350965bd6277b1344f23774428c6c682ce7267118ab003e457462fc214d2f122674667fa438ca67072d9880f0f58ad47743e5ef30d21511fe670afa202da52c38f84a962bdfc534c1ff98002704617989d1cffde50122a0a3a94f39ceb06e6d2e3fc2870a1c615bc196b4154745a19c3f0af77555fad93181a2b4d479cedad98b4645c1310f2239b3173571606088683508781e6480f9682c5114dc4aee697c8111bff6cc698bc30a9a89407df4e0000022800000224000002201b2e400cb35205cd72f8d0a943d021ecb890ba29baf28735d783abe2d853a14c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c5d0027ffd60cf504d709790ca52e6301c4ae0253c5d30d5430d9452d1b824a56639e2f2593c89bd16fff86377019375ae655ca5324e002870df86726faabd25f92d454ff61d583bc646c7e40e112cbd4dc04eef3bb5d21f334f63013d993dfb3bdc437b329ee38231e0e2d7ff352c44ec7d631ec8585972f1f26faaeeb28832acf404d5e1ac455a60d856f4e386ced56af7b5ae33a8f53cd4783594f90a6bf9cc17a3368b9a5eceb388da8684687a76543fcf35788aee4f349c45c6bc5c9cd4e4db992ff4314356cf810a66b7c91db0931ad0aa92c07671903feb70432a6cc6c7a1ac852e04b225a3ab7f11a5c47c46c62e524bf7a27dc553d136a01ed94d696ec853c4da0c8f5e842c1513f821da2432f4d9c53ee7d3bddcac6c6088e30e4f8e7b855e2d62f8f181cbe26d27a3300aa8a5f2cfb37645767edca1075e8e942ed3b0719abc8a38292cc79a80836684164a8e9487b7b8096c0d186dd1e0f02770a5d7fd1324722dc4a0b66e9771784e380bd1e789083af2a82f7583f05f9f653be91c6922ca1d6b9a9c41cdd15817109e19398607488d1cf6be0b62625a5679662b69b1c1758bb21eef0f65d7e0dc042f07a1d7fa72198e57434abcead0a296000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00206b986b8784e080a29de2a10c893ca1d8c6daf5e6dc6a79bacde2d935e28bba51e37f2243d1a63bb673dbd820e02cf8cc199a8c947ed6324e3d190061b10542b021bb5318f1930228df7451b0d9a2a0d3471d5ff3c88c41333ed44528ac1df247f160a6c445bcc45ae837577f0c5b7a2a729feaec9f822ce5ca8d6e73595f6272f00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a06beec17be2dc386a921fab793ddb6397aa65a7aaa25a76900b341a24f07ca916a0c8c0e9e6853716ae4bcb5bb526771e7e40e6900163b26f477065a0bda3f80daf88b76973789566beb7c4c86b275cc076cee4d68f63d9a6e9559755ac43c63c4e061bc8b162c52f3acaf90ed2141b8fd606f2be0da4ab044be597200f7bb3cb5b1858bebc3b8f0aac623ca087a042053ad72f2bba4e03486d6789c354c8e937c45c0990e0fa2aaa9978691c2693831488dcf6b8df3cc90e6b308d2e5ac85f5e4a1eec17d76b711c7a33c699251ec92d1a5af46dfb156b51681000ef549821bb9be2decf1afd68fd74c5511dfa3245640d202c7c6345dbd283facbcedf965b9d00b19735f08fcc6253bb057ac145c77f2d24d4ae9b0331bdc43a31df6bf30e784817c4547e13f53a4c9e7c0e88a2253eb504f8023d143b1896fe6fa503f486af223f5ef7b8fc2af048e4b047107ee5318eb8788ca26b4463adfef23102c5ab802e10cef15140c9f0f45c986cab3038c70324eed68dddf2611aaca905dec5ce1aa2e75b105c4931adb3002275670068abd43848e4a3bb064106e9d86d1b86906aa245c5fd048f0053f8f860f00d83a810ac645b20eb48660bf9ed1909d919760000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000113209268fcafd29c5e416c8b6183f4378c4d99c8897290ea8b47741b34700583319da811682a9eb5dd8e2564f74ffbc078e51c80bcc3f9b8d22c1585142ad0cb02c9defea0193ae2504b147258c9a9de8f1b5966bad1dfdc10c22b82b7b4f282ccf69e11caf4c682a11932c4c41239df8b51b10e99eda0224bb11fe7207f56c3aab44c812036e07317971fc70cf9dccfa8130db83232b1295d3f14f18d13e214647b0360295df9d16e469cb09e7ace9032feef26c9cb0b6e4d454e5922b68e0c639c89300de8876ee4097e5d49ed2e6757ec10fde7a53156438699cfb2bdfd1443efab1a6f6afaec1e3ff8f504535cc342eb2c85a8efcea242565255f48499c0dd806aa5a5fd80284c3440f31b74e101caa034ef06d08e48249b72b9a86737fc58852e5116444b4d1b1044ae0b0598596c0da465557c9ae81f67850aa9985940d2c2002f269265cb936b291a993db4913a8ef2f4a078b9596289a7191541bfd8bc0238f36649b956628088a09560dc05fc2ba38dff3bf965179ec96cde256aec3c8318fa002914cddc59f62e013e8a129925de64487f5b52148261b97e1d0bd510f4df43ec26a067b69caec031c3650cb12f4e3c9e7ce6d494affa35848a4310000022800000224000002201c3c3cae7c4089be84a8399260ff11c56454c9edcf63345e82c2a2512d98dcc500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa9c5d195578e64f18958e348afb23be723a3d56171f90724d3a70fe786fedd418065672fa4756db4161860d809f45b0294295c8e43c0e2c8da9bf59edceebc0ff1a972056468d8d8fab14ba3698ddf6be20768d156d2af44881a6109d01a050e131ddc71f070bac2a9dcee94404fc8c3042b3523e8ce69ff0aa4564e5bcede0869c2082f2b557ea6275fbdfa291f4b2f95be5bc3d7a1f318a3d0ebe2d134408391788e0a69b0e09b928ecb95d4f612201d1c9b7173d22f3eb860f00bdcbb668e72b8d75f98b0a399d7fb630305aadb4bd0733b20d32b703bc941726e7dc128e72c50d7ed45b189992115dfaf72d7b2b4b8c82a425b1c30049ba472c720a8d028a66b7124f4a0bd7ba3e3d8dc55e108d9056487a6b0613521fd3d81168b7f467ed4be6cd324cbf80bd3a7e441c7d8fd6b29ba7cda3d46a29cd0af366174cb343174071f1ef8679cfe5fbfb6fa93110cfcdd62b0e78c524a792cea4eeca612e2cd45605d5fb949d3dfffd8d3bf3262fa162dd9a5953b1e29eceee5bbbd91e36c890c3ba03b250fbde1e4ffa0fe09b4523c64c0cba3e0d4c8d0dbbc598e781e94072a88ac873aedcf769574f8936b1588ae2d62a850ea8caa6c8d7d1b095434015000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0021a1a3fe1c0a3ba8aadf6c6e6d65d3e31bd85ad6602cb5e364aea4e179ffe766423edb2f6f8d6b342db346856ff0bb9dc3e9b22587428e452db92733b1a0917da021ccc6af3e8d8fc6e15de374177a8abb39806e9baf0a09237417dce313156ad1f0a84639e637f3654f5b95d7a7503ef0016f7b3ca4a56d54d7a6f3a8a46b82e5500000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a72ae920fa745696cc77e980688bc18f99d095d1fbbeb662e27c896d530e819c5ceb5b9422613a4df4c5bd8c120d8ebec13e382893a8b4d8f6ab696b5f750b1b8efbc1452605a1a281e1d916ff643af120c0d3362f394348c7177d4680c9c179207950b04ac83071e5477aafe214e3682cac39a3ad88db7e7555bbd90f8d2ca418e0970c25da5139022c5521df58bdcaebd566d946d0e1396526087abb8e2f5cbc43518302affb7a84d0bc722665b08d187cb96fb71511dfa1eaea9666c52b0e4ac4f3777563e7621c5aa773c59c3e25f022df5406afb7024821efa46135b400ca059137d11890a4d6cb388c16540fcb7a73cabe95df719e05c07194b543d44d7f9a8cc64a5aefd29bd34a92fe96378388205aaa70124cb9a2cc2edf60c8a9ab19851682e0ca32ef14a50681b59a1e5e4371c75c2defbc1a90c85cf8b3a77e990af45c90f6ea344d3e5ffc71905095463cd00228f43eeba508770a13e49124b8a6ca524504c3f7918e6491fc6572ba00d8200c19887936a18ee7be1cc5d99c34b3c7f0129bd28991ca9800539a8f52c1af1a0c11402fef7335af29cb6608f672e0055c352576542ae7d4bf636e612eaf891784e3a5f24b8e07874c68a1dc7af00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0c321592277c3609f546a9ee8141de3edbf3006aedab2b5120ffe928ae39005a4bdfa1acaa94f621abd858d50fb5fa5535b574ce8564b928989b6078123e86a077b38f7fa23fa219866f5ec969d7fd27b6ee53996a0019a3727f61d3c13f5afb48f1aa330dbd2667d68d4d178f050fa279f51fe687489b4040c8bb53a32e64640221d035e2341a4b434e22fac10c302e4f9c2aa3a78f8f54ae68066469bdb4f0e07713133a579fe1927c3d0a5b7736b815312ea043fa53d0121db82998e89729384ac82ee7cd6548abde5e6f04ed47f08c04b921501a15cc2c9a3eabad25714061e80e97ec6f46e25ca8b1ddf83fb5eda465f3b558b915572b22502010e9394ff3157e03efe5598a84a2adf44b3547e6dde730238c3456a480d424e3de51744185139263e517a3aee99667cd697ab8b7fcd664acc2d6fb1f27571f04a27c5ff12dfc431f2eb87fe62d0e7c792dba5c153deece8397686b9fab56ba8587788493b00180e0b8aae304ca4905dabe117c21b4b110ece3240eb79c4973d2f1e41bc82e277275cb350724e7046bd8f9f2a23592497cd68f6865faa4501688b14ead9aa96673c975ba10dd12baab6a143a643091c5779c44063c3443d1ab8c70b3abf0000022800000224000002201884996f58626673de6ad54d77fb4b381f1f1ea39a2e5946925d27b550ae7e54000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c2280a5fcddbc5f23cdea303a3b077611c0d2c4f823c7b10a976de5366c240e1b89bc3209ff6c61d58997d11436bca14feb9746caed105d4cd48e9056e3c98233bf3c5b4e3e3d3ea2e3fa9a645ca9afba8627c7955f3538f9b732240f3d8571e46e4c85e8d37a14f92098fa239f99cb069e898e6c2d0ebc7e45939b935b9c4187c9f8af552d8b973f5fc1c12ad7e2ef300b812349fd52a100ef19e8ab1022dc994a6106ebcb65116a037d6c74569c8376027237f392ae5563377ab740757ab958757046cab39a6cbc5af0260399b3e6c4aba14c0131bbb9e2a5d6895c6270917b8ee4dfc93841d5a81a85dcafcac8dddf9a913865028828ba63051ff022b7fe3207b9ffb9a2c459b5d3bbfe0cbec8a8d17c4b8657bab87daade5703683552ee081d3db72736010e9e9cc4848d74c97cae5364e0325fd1749a8b548f3c4f989612b95bed406dbc4dc41bc4b4a925843bd69e667cec0fa3a82684935f42dfddaa638d23fe96519964fe2c24a142b7b032ba02e12483be0c41597f420c886b18c17fd7679362051ee30bed800d3cbec84af5e4f0b545366b87103808d3b6924ec097c82f3a07030a894d9fafe760be7e3d9ed4e1b9c910c894d8c07972a2f7a79e000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011692ef6f01bb9ad0d83b7011c07be6ab268dde68da396e25d6d9a7bafdc4d809021e82f3f02dae7250ff685be9a3ad1bd06abccb98287178333fc45b2165dbbad92e05d0ed27d4ae38397eee8523b2190a4b20dba81e264b1b5765dca4692142950000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001846a8570a6596da1e4ccbb68786778070fa89eeec097ed569d6732793b4eb7abbc34073aa553713fd9aef6833667c34af7db8feda6f9119ffc7a00c541ef3ac4eed63b4493937ce0b0fc4bd657774b528aa4c5c9727194028d089fffa8accc2c35b479d9b1a58e03e75284bf80c317535525369c9eaf52e336b22b44daba072f481f24ac44b029895910ac6c03578f1b4b74a3cb287dd42851f6b91e6f2d37307601c67872e895a64cc5c999fcebeb31e908573ed6a83d3346c0fc61cccebe51d2549a2becbfa42aa53a02a6ba8e7f092f6c7d935709ef14ad4980d35ccf409542902772631606fd0a5d3c5274b3a63af1bc7521e91fd9abd7ec579a31d2c265e41d4677b69f5103499241bcefe0314e3f67a3cbb2af591d4b4de24782d5d36b4ffff696cbaf8a0c128f4d7e32bc5a4e249253dfecbf4e32163b1adbbe23849f800d790960b974880cd99ddb49981b8fab830efd778b72f4fb1f809827c238abdc8461228da86e484620f8d35fb0689cac14a28f081dbc270173f6617002e6d83b9b801fbbcfe5dd4aaf439c0b730a7dc05b7ddf1c0a996c2509a26b6d5a65faae144910c424e93a071c363a24d97076174b2834a35ab01633d751de36e06410000022800000224000002200a57adf737f33847153d99de888e8b062165132b316f7ae9a5bd009b44fdb7c1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b3b30b44c479b4ab133144055ad489638b70bbeca6ece9475a285ff46144ea81c4afc82045ea5d1136acc537e332952e01ddeddfa0b3fcfb058e18180570657b7bb73bcff949cc5247b75ac3a2364dd2067e3f79eb0b5526bd73e6faa6ccf36482a8d653c31e88a04962aad6fe86f0e686fb04781a9f462664e5ae5e31b255939e1309faaa80a794a8b78c63393241bfaa4aed10656f75ac39cb416379e908bf5689dd402eed604488724cae8d6a516e17f10dc78b740207dae0d1708e4e1cbefe2e585102ef9e0241fb0a03cbe90b4ce014f90f7d300a91b0cea6ae39bfcb02ea0abd7abe62308cce5ffa2048fece4833cbdd14196284a58540d235c9092c68e79d0d86e2647e9faba1fc44a5708bfd5ca07d6ea24d6a777693616d54ac33af21bc3399133c59e719b4fb388d80c34849be9f8ff40a1c04207d2eb197f06b713284f4c397f3af00e2888bc8dd07bdb7097a896dd3c10579a877e130e401023c67cd774f70f7f4c6bf5654e99d64b148e93bb01e8cd1ac0066c9f3f6a1a315c276dd8382b186210ac314dbdec506bd738561607a2fae687727a522542aa27a0abcf24c88c9a2f03d51e88644d6efb77b31bd0653ba1cea623b32a6e4a87bd02000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022bbbdd338a570aa066b08f7bb49cc439423c6b253616a10902a7d7643d01c10a2a035f6a5a19d6892e03afe6116a872a196c882d575d26afe5d5431c33a4d211021ea72acb4d8bec182e902a93fc5d586d1496996ea3581c1a7f81b31938d182642c9916fd0cf54cc789f8ebd87ed88446c9a0310cc7e9225ad834a0e01420196500000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c7ced2247a9bc1d90f37ae08cf84d6a2b3cd9d940a2a043de1ae289e37ac94b8f0f9b3c087af33a59fee90af75d129deabddac2a919e7314e08259863966aed4129437a53f5f32c8f6d42fc0d2ddafd25350d38e8f78cd158386cfd7e30dc8cc154b7b027848f9ead5afe409f51ac917d39d1d408ae9f79d23db0879a7fc5fda236a68928b9a562d613aedfa6dd622840d33a2f715fcec3c676386b77e55aa5b172ad63108e20f55dbd2071f5f2a0b746313f9fa207c9023a49ae0f22764d522ffb33a255de99839f0200ec587e25cdcee16f57626e21bb29a89b1b4cbfa17b982e3a31f0083873a5fdd05fdb9766e58c908e3f8ee17417e3fdaec797fb2baf7d38c16bda803df2dcf834d9acd135c9a2361187ab79ba95744b14980d12ee60f13396db42367c2faef1ae0fee562fad4c527a082c8dc9d956ad6d9a154837ce981e2397e914c5c6fd93084421987f8337a16674150e8d398673d29a1bb12a93e0bfe40da7e64c83f78a1ddddd343d9ec6510db83f6ddd23dcdabdec31c7f5aa9f28f69f682d41e60bee01122fcf0ae9a9681302de3acf6ef228bc7b3e45283da58aadeba0e6a5f0e25035d3d8409cd841606515ddb1ac81dedaabef477690050000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053020c74617fb2cd9281ef1549f1244115b3c02aaa16e1d58458b8479773f87b9055c9e64acfaa1390b84ff69620e8b59bad14ddd0086c6df5749f127970477ef539d5bdd93ea1cd6b52ff197e60efaee435cbc98b0ccb6c4addc8ec31c62809675e1df7da7c189479825f03086f922b160b1f7d7fc2419bca5f3d20995bf40ffa6d5aa19b8533a9e599a068cf67906910f66dac0caa39d622f147618718c30743082e024eebf96813477cc129f50ab5dffee77f72e2234a3a43e1c5f567b20d299a8d1b9893eed840091f857dc0eb5b629514d2cac7fd5ee9c02cfe2c7b998bd0df038c48f1cbba37340e81ad02a5d83a0544760eec88be91fbda8d3f1f17a979a5b83fd72eae8af13f927b21598d1e2d2989be31288abad0ab7e3414a0f7c65d2b3b299f9a12b4e8b07e90373b724cad4fb1f8b543432478f9d6258244a38014eb3f39abe9183c0017746f58b3945b9b7caa774295ee099d5d41e6485646ddd6448058fb1d80a89dfdccfc9f31bb0344d0b7a919c40f18bced9a1bf67e0bfaebd7296b210d4be1dbdd07424a3e2ab6363ab0a8185d24fde8fa2a4d850034287b26b199904738742c5e6d2676cc69369722f664997d33746a197f2d354f08a0000022800000224000002202313a6881801d87a0af552d058fb227be79e70862495c15713b384bb188638450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095ef36417360f1a8ea3736fb3547c0381369325f4d2e17eb761ea2dfa78266cf5398d13c03469ac9d4bb9f3ee6b1b68442893874af5adfbc97bb6cdc96a077f70d9723beca9cbb70221a6dd2f9fac55a15975da7952ecbf0f0fedef8e4ef018cd2c9ed74887e980204ba9b10aec81548417cc3459fe6cc649c5918e99e02449df18fe56ed0cfde1bfc3a45622896b216b2d92f52d0feee1e8bc274ba0df668557c3622172c368970d553201b8df5d66c0817662b750d2c78c2f5b5a35f52d03cfe2ac268263e15c31ceebe3e181f3abfca496dcd59f41bf2b88ba17ed95d1a26be941572d1f75b42b6fe605ba297a1f0defd13c8c25d519b575a0ea84bcdb3d8253118f655ff8f76f4e5f5db3eb4ea57ce372e9e41ba1d2f0c85c381de79a7684dd8b760246eba697d0af3df59b94f99d64b41fe1350f6534600d3af7355aa0c5033c0a8176684e4ea16370f37b631d3b1e4a01d28ddaddaae54c47468b402610ed568d3e3b5f2e56390546de5b53fd4acff54f7bf83f45756f2ca07946acc65152e0010db787984a62a9b7317be5e28f19c86eeaff0609a1093a200be7aadcc9eaa99b97af0d7db494db237534bd39d3020495c3e71c5d5dd22b7c8d11845d3000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001151db8cb8eda70aafb7168f5c8de681442ef9bfd99a4ae47be61fe4213e18fa1021ff330c81a923382b0f6ed54d9281827633078d8a8e7cf40607fb3cf5f3b94b81bf87f8536e9dcec7ae1eebaf8f4baacfdca1a782627d294b80856eb8a94e02300000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004ca0b8f4b4a2a0314fad4659581d9c3d58079525bb7ab013bb137aa0aa72f5b0716c945d067b0dc1cb231d58c55c637f29115a65d74fe0b6a982fef077a8fde714da1215d83e954581e4e610ae7d88e10b9594418cda4ef3832fd9076610d8242859a308812a031db5f1be4ac30c2ffc25d59394e511d39a43090125c1bc88e095505063cda779b20a94b008e997786e2a31084e2b205cd09e307f6b7bf4fcdc97af4d0c5fd93aa87e659b3dac7127033e49b34799f335fcca4d080752d681a627c042a7074e66d05dfcb55d0f94068fe955db23dc78a4fcc2db01876b18f4f46c4e8c72f2de46eb0825ea511384b20c27b2ec428296e796be56a91c16eeb19d8a9e66be37f7586bd9f0bbdd9bd729e5aa8779b134034a71dad4e947a3a0840f823ee6596eff50a5fbbfddbb9951b7d38fb97a29c23cc97b85377d2d1fc7662d455844a17489fb776fc1f95b188fad864e87859c19bb766a729142a95d19636d9eaecdcdc43c089699addf998fc2d3ec5c6b5629d104b788d44268fc01ae0281a2dd085307bcce267950bddedc69a6c2fca9143a104754e298fe883a24d10a8fb6ad8090c009d93839ea1d22d24642ba1be5a4822094e7219a6964a8370d3e30000022800000224000002200beb4c51a8932cc505ef316ad1d568247a2b238e6f3d260bb62d13c78992d42600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1c5cc86814a23ccba1af15916a14f03c5e1a996822da948bda6307c16e121e3451ef4a155bb7c96f50ed0b820cf8fe66669119e876f8f81e14a91a3e4125e9fe014f785932bdd5edc1b32f0b41516c63cdd61178582aa8ecf3cc8d94428e29ae26e96e9a4460312bff053c612244359bf7dffc912bfca32f910ade285e1e05905b4c64e1b4d0bc76c75731eea91ecdd60c7c61f4946916756104660d1d530928feeb162bd55f85a31f8823ae654ae9a905a4644b2ff7959616f72d7bce8523d49454bf3cd0959dd57b49493f477fa306284de69b8ae2e0762cb6e828d2460e2b14fc44765599ce854c43f5c1f8da086392b5ce966d833721890e065bb06a54703eebd4dbd425e0fe998338c6920970baabd4ed9ce8169a06c98fa5590b425f3ebe9310fe34f9783068e08f766597a03c3c1fa516796101afdacdda0599201f01f8e5690c002f5a9349d7dd7152302397d2f99dc3ff56ddf82074665ea34dfb57185bcc1793707c74e382116688f0d54b1cb2d909f7a4f133c4390be355cce9d4d8b606101a18129d03dcea605f1a07cf212bf98210703497ea87d48c0b7177c4b3e10cccc50a5f524827cea56b4cbeda75f7f3b25310cbf641de632b87b6e5e000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010487fbf8405050aec1da746cf2d28ba50625b38855b0f4cdd7a666e740bb2ac40220292338e82438f30ebdf7e31afc050cf67ef5a7aaf316ced373be0b17dd77c423eeed155928190fb57cf42e865fd476ea1d954f3655364bcd2d5ff300b81d530000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fff136566152dd32369ab678a236074272cbbc24c1ef4a749f6e80e2efa8ec5aba2bac2d8eddde5200b5e450acd7b468771d4f9e94df92f0c249f91e1a2da47d420f3b57a7b113881ead27b38c8c82b4e1bbae9395cef8292638eb6b471fdbfb06c2fe90eb97a2c2452c6a9884d4d756769acd67dde88ee072f8983cc313cdb7e9cbb325db6eb90e9a82c04034e6a12a7fc69e2d9e9e9fdf0a3e1be87cc4b5830ec57ab2b4fe5b772fcabf46de1a0e16143555a40055c7290a8945b3b5a868d44eca4eac73bd9e9652c1168d7d8a5cfb2057b1ac07f44a474ce579a05b86cb743dc92b2c71bff1aba7359664c3ba6f0fa6753431b0a2296babd294e0bf698336d94b0219a57048d94e58a351d0e3371f06155436f16bb6aab96137ae6baebec08617354faa13793d3f0d972f2528fd1472ae7568090261ad0ecf96d2210f4f08a096d82251f1c50a4e5f32a27b86aaf6ab6b1ee83dd4a7387dda95c45f327eec8dc533cd3d30a4b55b3064437213f8eb5aedd80c81682e90496fc1067047392c7ec279976e9aa1a05dba673d714df1e16ab1564c50268553282a18507b400982559678fc1ec4807701bf58c34d6d79340f0c5bca38fa35ab678638a0fc8df8800000228000002240000022025a054ac8a52bcaa97fc5fcba1ac8a69a81a8443b598ea61e887aeb6adf8b55300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ada5b3f15439565d3b91056cb8f425c88d58e2b904e9af20fad1151706f295c9696511eb6b32f9aa7e58ab93b234c38039e284a0325c12cefc576bcfa20528394d6315ea6c3478b1738290a58b70c968d8d0a6f5a593933fd047e7408f51cd152854903021c6767d47495947accb477d68a1fb2416ec1507a34ce709efc1d15d0fa28f5e9196a1efb47d03ae47b6abdce2dbe835490947b3dfd98e7819ccee2ded915c8b98677493e64c141e8c7a4a600adf5e437f51542aeefee105be635d74238894253e3dbe68c51b7036b85a51d1141b8420bffa075d846f56e6e7b5edb74666ac9c52ebabfbd510a0efad6cf6de1c936855cc0cc837ec69c942e341d8c5362f7687553455f33e7e08dc06dc41bfaee83cbd65932ebe02ca62ade434f75541ee4445652983fd048ebcd99f37aaac28e387d6e016bc4e1a6ee90eb81a6348289b00f2a0215178c793aa7f983c198db9918a38e849ab2b5a8d4a7c34e823e6b362481e77607f5f89ef6c8fcc2bcf18df9946e3739218d64f827308554d4aa06087181dbb488a31c35a0efdac11de300db3e968891c9d2ec1610ba69ad54e6700d7791b3478e9928b5bb5400da8d43e1c9e41d753eceb1730652c27261f551f000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002029d421fd0e294ffe2caa3f68320fa4133db2c7279abc0d55ec5425715bf573c17ab4df289a1f5ad6fc2f831fbc81c316acff20ca70a362b6b19530acb9e25ac022092c5f4386deb3f931180916153b87c8926dc7a3cf35046af0b3bc6e949beb704739e28efb4a5e2e93df6deb9bd920c5b2a1032e4cc952b0d04b17016dc11da00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000143995f2dabca5451e177d99fd428e45f35079839b573f8bb7692991fcf226169e9ad6463216b98ea32a7869ffd4a5083ee3eb9179141bb84a58e5453b141ef0a6ba610d7fad5665b5500844d8ca6380ca50ff5c8120d8217bc651b96cc09f3b00928952d217efc0f4c74a74461035f42602179f748da638f63311eb295dd95c6526c8c3490da3fb1b523d1c402b89aa22eb70aae62f0e295da58be67edc2445cce5434584d3a24edf234c6f5d3786ddb9a90947b398b8966d765dfed0b788d9d41c9c5066b7d209070d03d8d5420f3f638d5d7e11b555314e07d4ede8f7f39078b8bb7ae46a0ae5689a5fb635f0333bb46c83ddfa75dce5e03da446b67510b5abffaabfd76476c6a6306097f72667e10684e6b67feb98841d5da0bb77e54e612e37621f576c8bc6d5ba246144fb0ac221c9bd231027898fee18ae0cd4d136d565b0f54b992b3e5f8629af012a08e7b4c52a1dae82c10d7dd70e5aa2e03090a60766bf5f66b095e3b6fb2a121e878652830e8b7bd1c6c15703340e44eca4c7cd52ed55b4fe42bfa6036119bf7da0bde6b2aa8727906c6c43e729f1a12030da2f8108e2dcedd8c2ff0ffd9d35ec0b4d6ea822d74b7c5be8fb079a02bf41bafce500000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008876818cab8e75c8af5497e2ab642b81508df85cd3b8070441c4ffa9d3f64f282d305c6a4463ed2fa1b043ba97e26ce1d9b26def5dc5483d184fbf164ed58b7ab30eded5449449027c3054e681058251bb9106609eac1ef74ec1ad5e1ca1e8b3d298a5fbe8cd29f70610849aac57e10e0af9451d96ae9610111532bf43cf53fe47bedea0536ddd28b7ccc43aec35bf567cf09f420cfc5356f5e785408ea61100ada15bf4186eb56c0d924ef19049984e5816189a255d1ca7ae7d73f53115c785a72efd919a0705e10dca84bf11f5093dacdf5c91d8c9c89c28c3d2ec4a1e62a121edc51c0011dba4459d97375c04f33ca26be3c95185a833702ce2b5e90de1e7154831b37afb9edf4b8845b30c0168d0f1fe5ccb6a621a093faf1534dd68cab1cf66c629c9e0e7a3c04d3331de74133add29534ca0b85461906f73975bb6094608d33e664cb487ab377578b8091e500660a7c208370dfd9951f8c31b96e375cf6c97ffe499686f31860f189b82d56e8cf24fa9fc76f6770aed41f8bb7d19e72adce8dac4baa1bd5100c6eb2d9cb2e9cad58238bb79e878b2a024f4da48b012506b08aaef3bfbfbc133ed50349e4b0cff518ed7a24e57110b2be6d06ee08117590000022800000224000002200f17cacce1e7916f81fa7203e8724be00899e7c4d62fadf98f60c1a5f96f3f9c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc013e755f54a733764743166ea0617528ccfa989092dc250ae73d24cb342f4c1d68fbd4a83d0cfa4d435ab70d4a97923de866f904659f5aacb2856d2182bf21afc7dbd97345274147b11cc8a62f7ed6facc7421af56a9eb95e6c688abfa7e1617e33973d460c73c771f17ad23fa085b45f9116dfadf0d7f9318afab5b0b416e67077134da73a7432f6690d428f1f63031afacfea0556cb6c3c1324b84243a62af0f3ba4e533030bb8583644acf0e4164e18266cd52b80f702594a12a96d523b82694fc734d571f01f6c3a4ac7f1076f45798dd28a2a48d16cbc3ee060e470b24220353db21bc6d4ba361cf62d8eb7053d06540df97bdf761ebcaa8f779bb9e4871ad84cea798cb91b7bfef5629e5a63e842df7455c9af3d874d14220362da2719a6833cdbc323062276af8238ebbae805131691bcca5b58180ef0f0147476639ec9ffc027d946da563d62cd168252542bfabf45db19960276848e06fb6901e3fb1087394111312c6938575499f60c0ed85ac1145ff706087379eb57e7c89ff702cf7a087d5c573348e883b98fe1b7d0848f3b3482a3cfc5766ac4edd7edc045f5d5945e9c541241b2ee61f057b87b460bd15c7bedafdedfd775ede22a92f4f000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020149d843d8dc6bfaf5a9f74b3bf2684af4515c66ab779af3a1223cef2db80cd915299ebfa673ce10aca31b97216225b343b09f8c943ecbb08f8c847e452046da0224818c8bef67dd2cccca2f809a5fdddc4dc608353a6f06dfa1b097821b8366b80f2e934a227ebe89b03c13fefa537147b46d5c5679d057f71cc4d9dbb10dc75900000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000191aafaa33b713b755b9f917310c7abedb36c29410b7820ec6991ce7ebceed6c90e998a080c289a8691a75568f7c576ea212de466e094e4818b260e340c005bde99daf23c3a738df0daf5368fe73e52d6501f0ec95172e6fc3189f2e4d42dccb523c608cc4e4a13abc886736e4070958372f8e3d750ce26378107a5c3e22ca332d513d16d5c2bf480898129549ec00e30d4463d771bc286c054185738141143e885c6ee8a3a8ac259afeb488030ceff704c552ef04431d75cec4582a7db2d2da1380b5c40e3e717270464d87ed2eddd5da15c66c69e8ba8492c1a5fd060c37223306d2b80b7002e4b7083a2b399a98cf29aea0902b10495012a0e11833f8ef8223f5facc549a7483dcbda89ac8893953747571118d85b3f4a7298d2c24b797c7a718e885d93aeae43d05b8b39a102c8accf64addfe2a361179b9664d278a4c958729bd929fc678f209af39477d5c695401dfd9c7976dc3446ef29989df333c39181097589cca3452e1458cd9bc115b0ba308874eede2b22436510d05469ca94d64bea33d1d65cc47dbe094cd25dedc4842765ef306d002837594f44eb9b95c0f43d3bfda875739611ed5350da7d369d705d889b0c82eff717ff98ae9aa5b40230000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af3e680abf639ae726e8ceb2ef81d0abae2996d2f04077181637410de0ff652cc0163713c4940d934c5a4cadd4882681e4b18b0bac8c7ce9491247c20ec3d3c205bebd8bbc11f707ad885dcc1c6209af59a98b33da3b91042831521cbd0e17b77093b3ad93b771f4a5198ccfedc913c15b6f71532175c43b019aff35d4618d4d77836d42112830832d891af940361ae90d4deb03619a01df63c09db44f077b06ea0000d169fe059ac30b6b3d3d8b1020a367716335cab33e99e147a435e590655abe7140da2f5f4b4c0698727948ac2a304d02ec8a8f23c92fb45810f59a18bb577f80ee5e179ad33a36300e34ac6e804445d972a4082f9f1c4b497c0358033e429df4d7d492d39361b075b3d3a85ef167f9ade6f7188b437ee1281153341a253d8055fb9e038b9e1ef57d805747f169128ed4c7ef14014275e185e41f03068d3d2a87c900b8dd69a3b479f870e8df471d7a8a934287527e8169f73a6cb5862d61deb576a7995db550f0c8d1a1ae23ee90e33e1136b5194dc4f3fbf9df0748b541745a1b00a4b7fb50e03bba70b6416aeb3dc045e1158a26962d93a068bda3f700d40224ccd2cebcc8aa86440b5e713eb16ead06844c7f3bef6ce90d9bb38b2600000228000002240000022004561e8af7e883afb6fea62ae16a9c3b38c700873533c75709f2428834faf91c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a910a755cf2814b0431f300efc2f5e9d7e2dd40d30cae8beceaecd8217b7481f0d86bda68efeaaba583e0b366dfbe9a3305cee5c0d5fe3aeec1102ab8851fffc0979d2bfdda180a127eea8a0407fd28dd66cd7907129adac4b1624cb44316c1ec933f3a8cafc9393f6f41fe327569a0f59819ccff25bcda45b96b92b88a057920d2354bc410da030e2eda39308ce3a214d4b8a5eb651d33e9fcd1d0f92e364c9bb72aee68d3e8c0d5b90bdf17a089628e7126f22a1286c14c608d4e5ecf9164421ab7d53015230500c1a32489960c54344d7832ed43873bc7c92861237b5e792277853c45a1d0061aa18c872ae3012804daaf58deca6287abb18b9cdb05657da59ff68a6771241dcede5670f22bfb0fdfe42c27a6022b6ab1af1b24ae021a8e85b8836834c4170bdf0d9549f06afc5327435aa4ff44085c2a4c244f3276dc33d5b6ecbf807c87324131093d956d9209006fc26a2e3ae4751d729d54269386db3cc8455391b65b5ab9aaf2fc904b2c9b65c16286010d56e68306586c182b00a5ade384189fd68e928f5f4354eab07e1477eb314a29bc66e54f08d0d80e166bcf137a0d16e26c901dce810d621beb8e67ca20c05dadc5c854861ccde2188a40361000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400107442f7b24f0a18d804559079f59d41043a2d53e6f6ac9abccec1c87ee1f0206022490e23aa2830d742de3d0b45c2bc0291afdc8ff1b0d741d0218cb9758081e252ee6eb90b150d12ff3fd3820a5b953d6c6f4bb7ea6e9e15df68789abfc3dbc1e00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087cdf50491fc6578ddc06ba025d08f0d68bd141fdeec420447975203089f3286f21ffd2ecd5521592964f168becbc14493e5e013e66cd3b4dd8dd5cad79e9d703eb0cfb61af6b1827060b8c1eb9200ca2eda4fa3a8abd7c4c98d2b322030144b8df8c740d3532c39bde103b3124b12f83da2381329c91fc8c2d5d220c2efbf411fd7f83b3912b1798ec5d0ce7d422a89e6118d21d6e5c4a86dac082c30e8de81749cf05ff2d27fac2b812d9449e2013fd8a66ee7731a471013f73cb0f3f97992fa20e370a32af07b12d2d68fdc9a4cc1379ced19807df320b3f35bf45a9a4c77d41a2ce0c5fa22448207a70db8b24e6c5bbd0a7ee674dc14dee604c46b85081add9447f4fd81bbabeaf4b3b620fd0d893593ee46e093d6612569d2d7132e636df4cb1cb7202f41e52f3d873cafe68ccdbcdbcc501368ac75ea1c9ec5baa4c6f3061629516801698cd2eb34df14307ef239f486acbbe30383b2d2b5ed7336b7bfff2b9047f203f1474aeee844df7cf08fe6509375c859f908df29c64d0835bd90351e7cc01f7d3d81db95903c085833ac31ff862748edbd505d40061baed570426c02244e554a111333e31a1ef3f0b66f4ca81b0a745ea8ab8918e232b7307e930000022800000224000002202663333fb955977dbdaa4c4a62476861d77009df0ff0c3c82f9fb91df82a3eaa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8945485e9584b78e97dad65811a13d2c403b3d0972ebbdef41b0cf5c3583ffd1fcb0084123a778ebc7946a7ae6423f4bd12640044bb36ac69f45abd354f1c9f4bb127f04cd19b809298adfe22edd035c1eeffde36fee98c92cca872abf5e17a8cec86d3db22586a8f557e78c03f667db57235afa06d5a7ef4a389eac61a71e1807ea9b59bc6fd3adbd2b4241dc46472fb13e66baaa77bebdc34c3d3d1e7e5459ff63b56d9ed0e1668f69fec865a0080f821d17b7cb028cbf3ba441c4ea2b78cf1488329a3e6aa0d8a3aa7a1bdd750c5d3af71771575bb55435c0b9c366c6981168e5b8c3c17b29af22b3d44515bbfdbcdb819fccbaf859cb82f33052a46841001ecd0b2e3e4d08fc0b88ebf65246407751fd3901455cc67ea4b9b5b7072da7129df54b240e3a9d509da1cada35db40c23fd16231958ba921ded3d0699d5b13e26c5d72e8d947b303d62f7da3f4f15157a296dea3216ac76a593a38f1997ab6e34ffdccde46fc47cc9127344e30bea286888e37908569987faa0652a19525ac4671374c8e7676587916acc8ef82f28a02373725ec498fec7a3824f239d72531234b6b2dcfc27a6376c855ac3d9c12ec788e373de735dd6c682dd7e2d535f4797000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001027e6683086a19a1b0bf31b213d4fc27508325465e5c4dfa754c029767dd7140022524d2a3b072faa4fd8857876f055579487c7aae5ad0e9d8c70913bc7a48ba2c01d5a05b6bd603d2d69d7938cf2eccce24ebc80dbc4a5906500c434a361f4d0b0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e2e6cfb0a817c6c2d22698db75187d18fdcaa97bcb247bb012f7899198579ecfbcead88cca43e0fc46b76f437271ef1695a8e75e5289a95943aca8af95e978e6ca4bac545033d3c0858c632101d3d0a76634e80a4cb85b2077852b785eee49ceefe75f919d226e04ff81ff9cbb85bf7d8e5696d035caf0c956ef2031a1f0795ede779da5e1e34d5fe1b4a95f474c81cb77245232c03cc82c819ce1952610fcd8ec55da93f77a35dc5d283c5902891a2842baf135a19ef61765e5748bde2d60174f2f1d13468b1b0707293117ef75c8653b7862a831b48e06e267cd7ab74e6da5b9170f9e288d49773127fff388fdf06bcdfa99367520ddd0be239c303eec3376b5a6eb54842e9adc43615749c6e325d1cda7d2d0ebb9116c77e68f32f251361780a3b2a4b1f1cbfaabb578f59fa69d4c1a83e3e65f358553c278d3b9960763503733af810b0bba6489e0f6fd50364422e3eb38ea6f6fcdd38a53dd1188ef41be9f0a653bf124a2499434910f5e1ed224dab91837991183b14b6b45553c92ecd1b6f5272d1aff88c4bd6468d86c8bb58774fce28479adf656e85921a77635c34158c88de248a994cfae26567a1548cb9f87ff771b3928e6b0b54f0eeff3d1e7a000002280000022400000220043e89cf2db0bb2e164c5c73f3cdc2f70d2c747d309ff8a2346b4b6d8d23ed0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d0466014ec7abda6ad4894dbb130e888ecb753258af7f33b9821f56c42255e913eb944d433be60978bad5c2957843c118ea79921b0b30e5cbea6d40118bb86eb27825ecedec1091a2d9b3faa87a5ea20f72e1e656dec5b77e9eff39937db53681499f15f7d2692bc7324b997d2072278f089ead6e76f38051bb1100cc54cf113e34e37d2a312220c5c307e1e11cbb6d0377f1c08032317871130aa28102c58eeef10b1cbef942039ddc630e5e804660ff2fc1b4068119287712b41a65677f15beaeac5535acfe99d77ef0c99c222ee539ffae66ffc8e76ba2f7f1041e8c96b33ff7d13ac6702ee358450e3ce28528d2647649ca34c300d42d5bf1ad2eba7a72a165e56cbfc47638fdd151d9bc41171a9473b9a9ed5ba518c4fc68862b41d2cac052d81a0d07f1109605b99254542c76b85da5cd73eceefebb662b343fc7a829fd418af79b111112cbeb39bb1d021629d44bb937159bc6447756bee7c336c1eb0d5707c81f5f0d73c612b7222109444b6db376bdd9d0d0735a3fcdb3bcf5a51c74c0d449daf81d7f967ea627b610e6c3362fe77ba0b341713a2f009c34fcb831c3dcc5ed110008baac6c2de32e7b3eae0654698c22a4b1b06e400aea47ff2c19000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012b5e6cd8ddf2eb17c50a137e608804ed7fb543830686f0762c15c0c8cf3c8e520225f9fe6f4f7779fb716099d349bf9331d1902cbdc50dfed268476e7ee55d688027625191d39dc0b9bffaa477bc0d1e184c3a7ca5be2b3ccdacea8b9cd16f80f600000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094fa39ecc08d17d443bacf446214b4d08204f913df1bf2cbb1e9b9c6cee4872d1c509b2d5fb19aa111ffeb5cbe2b0c087fdd42005a038b7c3483c31d6d9095a63216c3bb2fb3e5fe6fe8989c9d0521008e0a79ecd1b05cd4b6ad03608866572befd3e679788dc779fa43be31695e489917fd529ec0d80985ea4f7328ea02402f2e3345b2fe56cc5584f865982a0dbdb1c1968b5c42574f8aaea50b11ea1e01da3dac879c0322add6f05862a2644ffd1999fbca3a9669c4d1a430ad988ba284b1d709b049451e307deb3185f71120d050ae8e4b2e5eee1c0fbbb6ea67a55272518ebf527e2854c71064f448ccd76d14dd5939dea4cc40d5b590394cd5d16382da0448edce4c6afa516550c4fe6a298ab353e0d3ff0ed2ea143a06096d3c36eac4f0775c238d12073dd5019658e459d11c6780addf78b806e0eda265ca648e6de21f32ef0b7185b347f7fefa64e75aa1f9647b8e75946a6bc854ff7a7f18245906091c8e5732a0751cb8c4b114fb09b3a0f32c370755b39933f6e497c5a653bc5b8e1f75cd44972c1ff4c6cc1a0a89294a9326f3562f57857d28f7875fe351fcfc0ae883c7dfa9287df550e9bff19b86708679d99203d10edb614226f93b36abb400000228000002240000022023031bb354cc853a704c9a10664143ce0a6399cd651385c35f2ca4ce518e6cc8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f9086bcdf5eaf4da1af56f62db5dbc6d7f23c8ef38fc2678c4ebbe28c2fd6d6814e6e79f192d59a50d2f58aa715b3d5fed50a4ee288fd0ad684ceefc207ce40c053c6a56acee25116a34e93c7efca4f554a824f00a03564035b491e92a7c5cfd6f5ead8702c9932a9aaf0823443dc4598f4c5553c599e1699126f89d1b20934a50d20702d0b910fe16cd4b5d8ec0f108e388d4a217fd9a05875d733a4ece996d49695013a598921921777e5f4c518dc662f58b3e358cb44bffaf6994c1db986221e1ecbea38b3bf4bdd6e10d34098444df30b56c7ce6ace5bbdd4e62359583f916195742773bb3439c8ad13d07e21f9d751caf81da017b912e344896db6fc5052127dba2edd6290efc350d2df16f9d1bb483b31ace69a2d4f0cdc85baaec5e59f606a2a66266b14379d7875e2fa0fae61669854276c8b39ac5a2086bb29bb90f9a3cfa98a47e18ca635a8743edd1fc4906218b77d55a9d9ed0c2253911a8091e59148a1df93c6568cff3a87b14781e00394c2136eddcec3ec8836a5ccc6c22d908db3d03e75d4e6a79ad1a8839bc8608c2001907faa8b3157bc66af4327c20331f3b6e57fe7883a859022c98d42ff6d40f2deb7df920ec1dfb405de9558553f000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001099bb64eb213cf2cf9e54e1bf9f7945b8b7ed5dbaac10b497134bcc4c8a839480228d32af5ffb000a20cfe369f08a4dcaea752419d5b5cb3d0f011518c3baa529c165783eec7e0bea4f0fe49c56075f072577b50de5256291d24bfef51b3f9b6a20000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009762845098ea6fc23de527d3d202517920c2d5b5b2a289728c31e7a26ca8a0ce6b2fc73e75d31e94f2f5357c25bc5a0ee1c2f145677254ca205035582c740953253a3eb509462d2358345c6aef44c52434bb953d4432a314b7322b489fda9e7d2169a8267b11d54d47428da2ea37bf2ad4fc64b2d906f5dc18ae494c3adab07c1cc6c042fd659099380c8cb04a38f2b00e5e2a52ee3f820f515038d9f23624bcd83caad066b0adf09a71384185fffeeedea13a619caacdc1163756d807b7b1d9b80172b1e6eac4f851471d2502d09528d2590ec933fa27b22f00ba974afdbb3e0f8babfb07a8b39e7b3fda3b3cfea92365a54d9d028759e619d81316301bc5f3306c1074292b9af360d48b92a20e4438d16d44588f8acd18f1a44adfc1abcd372f45ae020c8beaad5461718db377a90a95745e30232dafec993f35fc0069a8e1003f2a482a96f5be1f89582facaf71e55021ac01b701188f6f8eaf9e5a4f610b514bcd3979556c9e8e9a99f023c9b48169bf487feb824dc1c5ffb089193e0e468fdff6116ba513c9d2db807ebaa83a434098e8666af6a767fef7ba7eaac4e7418da3281622fef5ed037d8dd5e597a69f86f9cbed167c762ab8cb1dd1de953e4e000002280000022400000220085a61a77919ff66bf17aec14d8cca2b5e4f9d32f2e826d46876b7b7401e2905000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bfa76fd29ce29f4614fb93ba777ef42ed7ab06c9b78ba7bc480a77ec2d92dc1d64cd4e3b0791e1fe810f5aab00266768a961df4e97a1830495fb8fa996dff860f11f5c45f02b0767d4d82f1baadc333280b52762064ea479e5838326c1a4218bb85de6bea432964baa86aad8a4c7eac9d3b6fce2e3ab496819cb70737d7343739936316ed0f30a594cd13d4e90753876269ffe50ab7b2d7fa43151cd6f009053284efc13a570c607d6f00d3774516829b0ef0d3f92e947ac606c08fe445609f8db56ffe5b68f13f1cbb782f40309b77418eba4c953d87fc47bb033ea08b6e720366683179b21436dbf4ef97db5c16e5cf1e04a030102fd0711863487e89b1d668668c12fee77bbc470433e5d04bab088105905fc22abe6325efc4f89c6b01bc9a2f20ab5b86aed1db0634e68d5b800debd7d28afd117f4148bc3c09fffd40271380da9fd0a80b0bd9cf28653fea6b8a01e6ae053da1e4b04cd073ebf0087484201bbdf32b877d4a730f13455c420859d183574f50586f42dedf14ce2f6b74ec1e362c4b6415f1d50cb2cfd96564c10c1472265788bb27fe9c7cdb7ac8088a7139320d8d21c12fc1a7248142664c372678b25494c6b14650a6753a5125879b17000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00209900920afc4de35f1a307257348083adc8b6a83376b39b4b9fc82b34e7c61f22075ce14aa85129830f4d5b161a8951dbd68b9e4a686af2a35e117c1e932dda2022b44f63a460522bdf95d8c589f31f94c2ac2f13462d05afb38ad17167f3b76df0ffe3b43f54ce97de037f84aedcadcfef2623031d4525676ddda0d962516150c00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a060d083ffa1b3198dcee0838dcd15c2714683c0a44c8755d25c23271ea80c0bdd06afe05a338d92912ba70b804a68ec0a558062ed06f4b7a652801463578ff6af526c687c1e8b64b90dcf64475ac02725ad36201bf022a073b21e085435108e30af055eed4c569972038fc3d6dec9253eb1c8a1183932c220c7587a486e68582e9f17082f5e2b8959eb4744ff67d92e67b8fd31b433df2b1e94381d81ca33b1da777880e97847ae8da9d09787dabfcff1ca3b8a00d7fe83833485d593425af2f4a5e45ae1493f3c0548558548ecd3d4fa928c8c74316f78a230cbe967bf3e0062034a97e35b351a8fcffb92281dd0af42376fff7312b58c9ac354ad0d4c8fedcb82e6032ac77f52e0e2e2d67602cfc09f3f38297b4f68b1ed970375c8762f26d5531ccd77cb4ade5bc3f7ede4a2bc7bb943fae622a12370032f90f0e3ce1d40793aa288d9a61fd5c6392d1f054c0d2c98818200dec262e1a350158dfad13eae3a201103d2d9ed9498a07656ca6f08b34cd5c4fda8a539e9ac1a07a9573f2fad43509e912c3ca0315186880d446ee576adece62f185d6d4846b4554a98b6c1fd615f972187a38452e16bf2c67d6c8a12d96e124b23c1071ac568f65e5714ace0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723db393f2a6d77a5e81b693677023173ac03bb539c2e8f70673e149635154f6f2ee8907361357d3c3dd4b9a3d97bf6c1d8e7ca13b5decaf0b4e219953a08f553d15ba63c6a30356a45c82ca6d58fc351f675c0d19f0e2d06445c930ac94f3ba3503a56fac732cf44c3f9587646d24d22f041dfdbcb3548577209d3d41095550124a8918bf28ddcf8d25285e6c23339d97d61bcc7ab7c7b2ed3d9e12859f7984cba24f391353cf43b449567797e55b15e523a3b3f9380d360464b0d0073bd2d7b292fa6782c4c15868e61ccccf732c08bf0c5ab0a8780f999fac7d3393af7c8dc3282f44d12ad15e57ce11578d0fac715c77a1ffc554956ac1646e802fdde30cbec83c9ed314443d35a91e4f6ee9df920ce80503e4030417a0c7a6d9e45e72f1103ed161b0ebf1913eaa5f44b62be80fe5d1f6a0ff6654dcd81e367e7ff03bf686df8a693e9384707fb010bc2e0bd84348541c0022db11322ffd5771869bf1e4121924104196422554b21199b1ecf16a74bad12cf81a7c2cab1cd88ffbad427dddf39f4e89ddda1afee44df8c903804de8fcc7505054d74d16998ba43e80e7fa29a237204f95a29b98e2a7124e24adb009c4a3a41f3a733e2bbe12dd1663d200000228000002240000022022db1c68f5b8bdf2f26a6fb692ad9bda2560272d853da38412582ad119fa1bf600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aea618dcb8c52bb62bd60ddde90b887f9fbf874f1fd16e1d410ba140cd01f5819dac72d1ad84c62264aa8b680fcff37524db9cff431e33bdb210cb11d363062f92ba5e90bbca4a7b0524bd06efd9df54b11a1cd33aca2c2d1cdefef394824a42405c1315a5c60cee06c3b23ac6efd34422faa0a4a97b87dd1fb0584cb7af4cccc1adbea1dd0fc69b23e6af74e1f0e8f6f3d856d6dfe10fd8720ac3570cc99d7288971786370102d7098956dcbf8c599c2e2186c7878f36ba4038ec24e71dceff0bcf58c39c4c284d5155dba325101338396ac85d3b128d4a79bf1238d510f42d3feb951d9bbe5560a4eab812a3286636912f9835193b7c6f12db5cf45215fc0f99bce1de89ccc967247fb2405a5ea2c46f349dec701a3ce37496872fa163569b208742a4f67509eeceae70b99435420445326d56e466a65829c1acab14bec502b5e24c46300037e2c809f8ba66cbc055a6d3f8e8424a6ec4d7186b0adab662aea82ca63490d2416789ca8bd5b3e831e111bb488a04eebedffc75e07a30c6f01b85cc386945508e0e65470b9d448af97fb19840096e2b68feba6cc0b9c6c232be690a4070386ff3a03ccb965ab7ee283200f41e7b70b09cc64246c7e0cab39b67000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400106c9ecfdf3ec9576e0b2a9308f43b4c4102ace5ebd87b998b982760e19c1ceeb022d02cca8caa9640104e9c1df2de189f1416b2f1af101c2bc25b1001ed12b1e1030483ff869a0feaa335025f23daa1017c5c23472cdcf624e30b73c66f4fc989300000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004175629ac82c509f4a256ba3051552d6a19c505d471b00eef6b6895a41bf140944f71814391871b6b0d92f16700ba61d6b7010d5a6766953968267acdb1d82204c5acd679176fa2a8be71518a316931856ceae0153233f3a5a2f9be2df691d9e37393fc19d86c5a7d1c66b384ac3e4fb72126b0ae3afac96225225ad82bdf111b34db443a649d3e6489d2fd8adc06de6aa4f515871a442c9d9f99742072d5271a0536029626a8a302259854d2359321ce2f01f9a57abc689408c95f2aca01bf1a97a5a795fb83d9698f871c9a77eadfbf879982f711b1f90a9bb1de20b03715d2264ee9521f70141057d863853975ad4339f34b324ad71966f643d99af95dc69b91d4a7124592eb938aaf6bdb66663c9556834f2c13cd2b8658a6714cc04b278d84523735c3c7245edbd683290f5a486cb851d1115a360476669b6375776f3c6bd9a9cfa6345d97997180c9866499cbe5a2685222882b46f52c9328412f254c7bc07c60cb2b06efd2e77c7e7ca7435dd2f5e275d7bffdf070f815c1e2b770866ccd6c0086f8457a1c51af5848fb4df96490f90a8f5dba80b641ae1672f808b3e6b4e43e522dec5a3daff500549dbf41be0636c40633f92bf6654f0f8dbea7c80000022800000224000002200816b8a99729f74e352cbbcf8006276fbec883d714433e30b385a9cb5f395063000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cdf4333a1ac55e753fdf3e6055c41eadc95129c935895fe504714b67fbeab16edf11d3b004c0dc177b97ff4dbf08eb2bbacf8ab5b21b1319cbf2d93cefdd83ee4c85a9d3c14b898e8d1131cca045e84c94e742df84b364c93877e3339fea99b3e1aa31d5de6493cedbf4f0886109b957029fe6553323bd97ee7c9782b84667e7c4783af828e38bbe7cc7b2e67742e55a397c154aaf91c9dfc8eea29b207852132e31f50c940b5d749145c3ed5fa861d459cc28bf8206ea6432059a1fa8fe47a78e619cae38f3601328f36ed687159dcab287ecc53a80400204e102ac55a46c690dd4eea124be805b3d60ee26fb6da7acdd4cfb508e9be646c526b19627e702214cfedc4c08b0099f8e503570cabff53e3f54b7029fda1b8a73b5a8a022fd67a2a1933615ea84cc23b15b6ee12599fa9d2b3e89003843175da3a9fa02f0bd7d7fff0cde24bd6bd4ac35744f76a10b1d68fda2cff86df07970a00795b040632725cecee25f08ca2ed8e49812aafd94371e9629842177d17fe8d76752978a3b1e9ee187d2e14ba36ed1fe52c9da65a69ecd789a65023c4566007843abebc0714f9c9b3880742fd2e496a9b2a0ad19f83a82f4a661e97e01f18cfad3aad18b99fe4000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001220632706f6477a6ac03842a35c63e4778186f72ba798d925d56e958feeb08d7022eff33921c7c8f16bda6d91f28359fdc9a8f9c77c932a2ce7f7dfef09465ebbf1974aa569e1c86091dba0aaaf0f1427e171610bb5ac655846d07e712c0667f96000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1b6a8a0cd83be6da16f5871ecc64b5a850439ce793acc862d0244c35a96303a84c200f5f02040856a196884a4186f1b3206c267ddad922743b5306ed08fd3da89e3909951d7cf8101899c7b73648c6d245a52b7523db2ef8aecb190b36689af3c9b3f78ce76dfd470b5657997b5c7c41dbe3c6369209d9a8c31e80325fdfe2d64c063ef1f5eb44e3f23633abd85af3d70171fcc198d1e1683a09dd7c3b36d406aebc4c76a9e530d1e1af789cdbf63f9fa6792f5bec5f2c466b7f03557cf707bfcd7378888e7fc4ee2d6ef84de657921bf1b00d0a61828d17a15e774cf8a285f9f361d06156f62714eb345ed71a1ebeb5a7e78028dc07fe51869894488d0c2ab07f5a0dfbcced5ca41282c8210fd8ae0eb9b0464e3929389acce11c2d734dd48cf8a617417073ec13a432fe6970f10df5a3c749285ab1a5a77bb93402b9bb7071cc57d1e9730a79436103b2dc25dc577dab8a05bebc3ee2dad4d8416f60f05b0431a7265d75e19e0006682c4a890c17b3e68a71a4b9189ec08cfefc002a564823cc35cd4947bf18e660775b8c5163bf0ffffa583d24b5a5370054b18cc2e0c531d0ae3a99927804c62b8dd31175e45f31672d9e29c2f3bb6652fb022c9a711b9000002280000022400000220213cee44adb994a0af662d0110bf3142345d83cf68da8552d6a7af4da3a78b7b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d84f4fe6b25622417a86b74976400b185c2fac437d65b32339d401c64ef2359e428ca75b015d01ebd2de3edcc256ef5f1ce0569c3c07ea160ee093234119421298fccb0bb971f16e1c0a242ea56cfe7eecc03d5c7a6325bc31a51a0a12b58744c2192f0892ea6a7a04a5f6c02108cf6b67040472c597eb7026339ceb7dce8812f3a05000cd2c64952c8cd00e1d9f6c51c9f0b76f4032e923ebe9ad3b03bd93516ff21f2f278d97a29559225d619b43507c3b0e9a3efcb423b852bb946c5b88506fd868d2ef79a91bbf6f88b6f2dae8745ac50711c117b6fcead47dc356790bc4c0b85e2715caa5ad497b8ddec59b46435fd4cd16608c56deac9f62b710571c0ef54f4dbd3fb9d5b9a9e6e94edfbd2ca653a32615f0b84c452d5424793818e57aa03106d403b1812bf19d639f37705bce1022639255485eda206f225e0064355c8fad9bc1dfcbad72b217f09296c170485415eb2c260814ef50a3246a628891a70a3b4f3cf8420e013de8205d6bd911675b723cd846a6a82e62a088853fbc9c77896fcfae1ad24d51b614ecdb6c75f8865ce59f266769e991b163f75023c3f536776d14f89c600c6fde49a3906824cebd48c6e76cc236155854307480603cd7c000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400112ee1f80873a08b98b3c83e8e31c84a04d5e136c527d353f455da2c6020d46a2022f6ebba0626ff1aa4009f63c3dfe3cc7ae5cb11128a8b22c96032731ec5f906a03a29091ba593a977fab73c20ffb6fe178db57d1abfcf5f0a5fc355b1a1f2dba0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001040e432e7c919de53aac869a97eddb53def5bbc5b4917cbd58d1ce4b92fb86e7405de97d043154dfce6b2f42375c7c828bcb6651063ac65f3f14eb3ff8eb0e64ab643ce566500317182939c6dfbe8f6221be6a8db6281e0c167ce00cfbee3987e0b905c080f9e4a4164e850bfdea4522df4bcf62992aca187d0b6d20c48491faab69bc0178f2dbec3b6e2c8c87b76082dd96cda6d8ed085d027f25d18621d681d45ae0600f68c4fce942a2394fd835e849fbff311ddee869418185c2221e127ae73f8d46864d8aa4fae493b83c732a4439802bed2a4ded7d27c7ac92560776988c2fd51c4e3c6a2ac7fd063ef422926ef727060c048b53db4e6d4d37a6eb98fb075c363770e067614a390fa4efe0096871bb6fe01726f9f37c71b7dd3cc6ce5157b2a46ec6b5c064eaf2676281eaa6dc9108f84edb3c1cf307e593413dfb7b3ba30c9fe9c04cabcd4552cc883591679926ccab4314339f9631b30bf522541cccb727b528dd5daa126337b7e5a8fbc259843bf271561fe42816c4d11a740ab775b37f0755509b875d1a884b324510643910c3e0375049e905a7103070dfa11ebb88965ddfb1a38c1166225e46a05b7aacaa13a2390fcea32f4eb378e9c1347140000022800000224000002201e23fbd24bb7627ba662bd443c8f8be9886575ce80a8f0996a9681fccd65c3c20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fc6ff1802a58abe1fd2e692684dba68ac0f584b2d3eac3d4ca738e9612ff6fb3ed1368534a0232ec33a5886b2740d485ba2a618bcd426c5a9478d7890fae27abba89039362e7ff9372e18c6fd7ea6b743f3f171be174c4f8564ae12803eeb25bd29095f39d44489597060a700a184d64b882fc530aef3069a7085a8218474d01272f65983f4e2678e220cadca1b3c316dfbddcafdc0866380e7cef187e34bdaefaaa34bbc723b43947cdcbe67eeccc195deebc7662fb3f7874f99d56832440e3bc842dc8cc28cecd7e95523369850410144fdd4f34a0a7347d1e0ca0c45213f06acec00e596c28f06e7323f94a5f3d96f18a1fd4e0e4754172ee18ef959095e7ceaaa5afbc9da400f17efbdeba170dbfbe1ab325b672b9df2b410e5348d5abd430a9bb0cf7fd30490c22fee49a670576ef76b49499ccfb3a33068dbeafc5366e58f04c1ab8551a624bf143d8d5229b0fceb25fc53464426c3994d31d9ccc2b91b2dca8cb9ab951f1a4d0ebe184bb3162f56c6e31bc4c70bf2a249213c71876ca8c4af0df0cc072d9b6b6dd7e1a0f549316db1d86ce7d3eb68ad50078d58c40f736821547eb2cdfacca7fbf53c480c1ca578c9a90258df3567f19e1bbb4fe870000000400000000", - "03caae76e4950e6afbbbe5c76a2c9c0e4bfead8ba02f3c498d3f52ebd68506450000000e000000000000000000000000000000000000000000000000000000000000002400f9878053ff578dd343b62df1eeadc5dc54842a69b5920b5dba42569adc8bfe00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000e023409003cf11f577d6e3ed0190c24c45a04237528b49263e537bc5fb479d7e3f00004b002aa609da143d3f4454d70937bdc54f1a6618f7a4aad48e99958d92ff4d69f48b00004b800825bed0f04513688a20a73113b41d525a804966b3e35ccf0894be7867dd9f5900004b800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000070dbdaa8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad3644b0302b23faba9ae13e65bcc18b98ad3010fab8a195f85fc1f33fbb02c4a1a314290000000e0000002400000000000000000000000000000000000000000000000000000000000bec1d4001077b2dab06a4e5d1ddca2b2e9161e7d86485c5513613ddbf8b51dc0f78f38da90200312e2a18b4a9e5b8c8319d190b8f2bdc1cdb5c8dfdd74b00081a9e3ec3812114d128eec94626cbec18736f36d24f3dacfb796e1236050723747cd1ff6f197d0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eac570e9d3a12c63b1237e2c02fa1eee7b05a9af4f6331bea767bee8518b3306a6581c67153c367930750ac21792610f2b09224d038c44ae3e96d129a120f60b2ee28dc144b4c4788dcbf1d16658d0a7ad6d3d8919de5e87bcb6cb300068e8e47b698c74ed12b6c6544d67e19d136df031aa72a11f1e18888e8013a5c7d6318980e05f79e5aeb0da1c583d391d515cd3bf3bd4d9c7067bd439abc8c8cd1fda93f9d1d7e3eb95092e67752d97c083af10c2b607089b8fb89a74a45bcce1adf887a7900d2d6cbffd39722d916a12f27b19e86e4737a875ae2272d6aa1cf4da4d5d3b4a9f1c6ac57fae2730f1ec020c50fe15080de5f3bd2ad4abba101835a6b6ed2acb2909f15d7aa92b5c5333296fad69cefe26670466d95360f425e879f64cfee1a015feb916bd21bc35eb27a83336247cb39078ef65bd9cee64324589e884cd9b06300e4faa0bbbb1a06e73b39c7f83b88f8ff2e59c900314bdc028ba8477eefb6f406386803ad66c1c3fa724b25235b1ea163062beda5e0dd61a0dd746fe296d49f370551e7986d2537b873a4a1da067331ae1f7a54be65207a89fe6cb98c22eeddd36c0a49736931525afa364e4232ac2a3cb729155a89a4c61f569ff58000000228000002240000022018cf3878490c5a4094f730dd7185f723a0990319d60a45da4b55084d9fbcb9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096e137c95c953ca8c57ff972e1ce053e090cdc38c1c78b903d95d5ed03eff0ae6b3f4bd1cf7c0038daa0d679e1e0cddeef66466b21cdbb6c932394c3a5866bb64291379be5242a95b054e83ccd415627ec8f9c4645142fddaa60a8c096cadc6eed858851aa431600eed90366684887654fe99dd858b740212c6d9eff5f5b11b9a7ee8b56aa2455f6c9013065842345a439997932fdd4d7abb3ffd79c294b74d69678f8edb5a4892581bb05e99fbd9dc8bc541fc8f12d2537d5bfd7bc393ee0295bab5e7c5cf005d18b6d2a437fd65eb4d757273b7acf60214055bb65cf908850325f0f2c0e1655b3f5c995ccfcbd373f6e0cb45ab2c559bd7d11211a0b4dc55af35fa5a5d20832538776660e03a9168f401736a4f0be0a44b638af9673d01d604b002e27a479d156d1fdc18de45705027510595fed4cf68a6cdd7c27f5fda56fee32b3dd1d16ac09a299ce438d09210d0b90cab7a00da8d062f0448b41ab6b4110d20167f570e12636ff6f3eaf0d855129cfc4f79f075fb3041a8e7b2a08a41b51b255c8a8b7af4ca717cc9f5164d39f821baa1d338c5dd81fe35cb52d702b6c23f42063d1bad9af387b25ad129a304b04b0d78f084445a26b0487e01f873a05000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020c7465cdf07f92e67a7c210f186ae7ca04e183c3995ed2553a22f7931109d1b60f8cf387f9c805c9bfe50eaaa6d88c4c1786121c5b4f1df44b9c1998e865aa1a0200d345c3bd13ecaf86305d3cceb44cc4058ebe9d989b94c5084251edc5cc035809974929344f76112159d05a4438974878e5f93a7cd784808a92390c71ba411400000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9b8847d3bfb5187e2d9320f10288a9027d7e6252afc5939bcd40191735778d89f031115b145acb2bc7a9a5c5d7f5e6a43d68823427bc04cd5cd0fc08671bb7c578492c99e3d2a92ecb3ec08ca783777f06e94c7fb63651b372c997a46ef8da85c8d1d6f0c47c4ae52f0cecf7b59f6418b06fd4dbcb8ca76160cc9ff2090f2308c7a6e906d47abe4a5778a415127e493173a46f212662fb656f8564b97c30af267a22780fdc4cd8a52f71b70fe63f9e92fce03a59458ffe6b3d10127e0329fca45f3876751e53ef24b952a4c934a0936d95e512a7d3da80c0487c124d6bdd49c39a89d8b09cb33a1374517330f172a5e1c59eb5ccfa75873407b0c1f05ec591a63983dbe65da6d0c0a776b4af1ef47c1ee559d8822c3d984e56509da1304136a4c04325a304f1a6b202f26636136a524bc3d625664c376820ca4732787bb2f7a7ad5bbd242e62dc4b5560a37742a074b6e6969ade7117af13da16003ddeb9ec04426ce6e76a0c65427a662b7e1c173677813b206ac11165c8eb7b3f9cdb39b7434d94b75c70ea2c1adc8170bf1c5c0d3872f0266f58ce906daa1551a96c849ca18036da7067a177ceb542f2388ad51c34f40e1d4899854af020fb2d21ce93fa00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002587c4341a524a240b2513d30f9164275ae19fa9123b768b757e6790aef648b27adcb42f98c0af9357ec016d62515ea8938a91567d67bdd2d22af3eaac209f36bdcdeeca783a53418125a95dcd6b418397d8ad51c9281134e678eab893986ea219e96cc6942f0a1f7a497bd03860bdf80d60bb6f5693a515fd25f802442308153c1e785634a431bd94a8b05c25adc79f433914e75d2119ebdb049e09d620b555a7c73d2fb1a3baa99c6e18b9bac4e5f462970da64ca05aeecd85006d899ad04944c2599e2d79fd8b83cc67256c48cf36c9d91b99f46a2d84c94334fa964fe57e84e54b54b4aab0888f406a27ef327f150e005fc79457cff0edf18f1444d0c1f752a18fd60c1062c511b6eab183a5083f8b58f40820208fa1653348664523e0801dde397ecd970b11d6e09fc0cd0f9a1173d7e24215f33761c61e6e7846569e183a56c1e3661c0af35a7bea5516c5d317b3751418a917021315f25869bebff6d421a643f371ec79f02985a0752d4ca57b6cf870dff2254c92c03fd50ad7293acae3ca36c993bb9a36ca8825276856b3dfa61dc89704119c2552fd87999f2748c52b9fdd3da78ab8948ce6163c1f92dab08b67067a64dd63d35b859adba1e862610000022800000224000002202ced08187be90ea53d4233ab1e94517051d8ab1304602efc51265da28d1e100100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052ab5d35e6a5ef3267d8a041a538ee684d5e1054850688a7ca5d3c9382991ac0caf151d5a7063aa598cf7dbf74d8fd259e0f514787d3b850e1393a679e8d533e5ce1defed6f208757af99da7ba980033b9ee33551547e3098271d37345b2923a60f6e4ec557112719971e9b33255d6408244bc24a3d182f7c953791fa61982a08edd186a8deb552de9d9c6d085ddea2af0b9d2d3bd72b7dc1410b71a01bb6527cc24e7c0d1e0274d4f7d97262b72e04a1b66efc9b3c7dd34b2b9d5ca05b853a398266ddcddca1cdcce6f21f3710c2917ba7923ba67a425c80ba76283c2132ae61a83f50184ea60322f1463500595efeace7ab874c1e2ec2fa718b9147af34d7c1706ff0da4691299887e3aa967798e6bb4784672680764d7bc7ddb5672312595fdd04b930e95de8f3f9e945ccb16240090c3091e931254d5475a75a68f623c299243527a6fae67adf50096b49d0675b73ece843d5aa44576998175ac1aa656f1a87e16378bb586bd69d0b678027e294ed0c3b07e8898488b229a7e7b4f784cc3038522e2ed351946cd1407202e82a5985fb31c33dac04aef231dbdb06f9e52e65b6435fc75ba5c59b1afaa5e6887fa3ace5c7677a3161ff4f5e7cb190944d39000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022806d3e17a233330cb80a21a9eeeebbfba4fa7243c57bc05ea66ec642d7b6d391eede8455f654da31f3d44845f0fcb3cd4c1c31d87b5fc8f581de034d99e4b7602017376c97fe253833f2999e4c1284d24a997dc7792a4d0e7f4d078110c787c1717f0c0bef4d589a4424f9ff84728de2f6d0c2cbeb38e2d54aebe2993ccac5f5000000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084e2dba5976bc12b4bc03845072b9f90eb90888582cb3a8b26573bb2c73109385c1fd51511d5d71c7bce22defb0979c9822f4d90db97616ded31e06e62fd53f418de1753ea5163814d001681dcf9222c5506e853a0ff6aa9582bcabd817242c0278be56c8bd2519fbb82b5f53ed4aae3bb5749b566e1341bd2d3ad391b7faf4d51728622aa58b97666498cd7e85f53b22d8ccce8f7172585e38cd15fa5e38b0d93d608e219cc4a9b10fd17d53ac1943102704b49563b149fb29763be76cc2c5ae73bf4cebf3cdd07a9d29556261da7e6dfdc8e09f481773faa3c997aeb07fb21316b6b0f20d4d0928c541d10339b86413897b86540a7aae9fe0f3828b8b6cfe7e8df4d0c444a93430d840dbbf487fa6559c1c7519ff8a39c95391f9778836108cea3b458fce103423e78a655f23628f5ce943b1dea4d458b29a5ac500e17078520db247b3be976348047b9a5b13c4ab91d7906168fdfdb6019770df108226aea84993f2f612e41b41423928862f36e584544f2e3148dfb3fab550255ec1274f36711fc88ff479f165c19acb02d356b75dd09a948ae03366e3c20030eadad063005603a8b84184afc28b3098b627e5d7072405f6806ff10b8c03c124bc155ab2200000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fcca72db24bb0b180c4a674d57815072267497eb17ef9293054d58bc68afd30a0ae8536170f73cbce87bfca1ae5791d7870b6991e155fcbb285cb137c69f298b14247716d0545ba71c78335dadbd74f61e19f088a1395d86cd1dbea1edce3a56d3c1dc9e6aef0ef8f71ece7bb0a2dbcde7cb36ea60b13d31736728bfe11ee7fdfb8cd04203c9735e5ef37fe59dd093539883c4f19f1c3428ff6636551655cf16e3cf9cb6f907ebda28b9ac43ea6f98e3f4ef9fc3ea1ad5aeac2b2f7387738424d580c9068304ba5b0ddc35d9f191bc2802efbd7b9e2254d6dc1f72e6352d60a9e08f8e33896f398960e696004876481702760717f3e8095f25dd186d8ec5269cf13e1abca1dbfe52bbbadf58bac921b10576032eaaeab143acc1f54485f1cbde141d3cf54157d8366c8a1df3241333af17da8dd38582d506fe2bb6093b21d41babc1c27ff8c5d2dce37c231d46f10d969f334b2253afa205a7427d326433d9c5cd3467ceb981396ecdfe10bac14765d835a45e94dc8182bc1161effec7e4a2a57677e4186ff6d698ecc76edcc75ec415dedfb0e2deb71a29f6f92c3a5390f91eb1bbc358209b4464a6966ffd083f446e47510d297aeec097d9703da04a546d900000228000002240000022005150282f51a6095673ee1fc79eeaaa0a40643c5b53aa9a65e27c62ebcfe9bad000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b165f90c78ee638a3d402e11e70b1305193cd385b2ea68ee171b14c5b7dcce51958151cb62cbe89fed31760e5f622e4476b5b67a54d476864331d07f47084f630d4585fac4304c39cdfe4dc8a89796703a96c3751ce7855d11d01fa88e29083cb69547924619c3eda05071ca70907cbd95792090f05089d5d65955451f05f9aa81b7c52c5148d3c1e08669cf3649b810e3db0d7b2c2b0ee538875e3cd42a9a7848de763f3926944030399173d8bb19c6d4543a3fe09b72c38f02aec634cf3e1c6a902657d1380b591c4e50a8fee29ae428e3089e1ae3846b725b6d5acbb8badbeccf313e7b7e30a38de72f423f42f5e6f77234319dc3507a75db80dcc59d715ff8f559826d4728e69baa11a9e3b6d6d78110d0c0f0ef690b0d6db8c967edca24e32a81abdeb46995280f60730c0fa1f77a971c3f948561b1135f5d19eee455441d6d181b5220374fefd83844baf81e66cc7372bcaf5d29f88f9b249ddbe2a5f5834de13b08ac6b866865bbc86f6219beea070a6e6a67949bfa6f698614f261519eae89e6e54169450d4e422e8b2bf854dede2d3d9df50cc4b25f3d28912d45a9be201f13b3d54cbf6957fa24c1492426f52c76d77fafcdf686edf432bacc1b0000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012251a84261180797f646e778d211ec74bbcd3b28b7d14d07e8b3d6535f8b6f8c0201eac9c3a248755c9c0bd20e0939601e94c27a2a04be098e5059fe2a4b037f5e22336807d614bded87087720711189bd8f3bdf707c865ff649ec0d4238ac276100000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090e93dcc537918439fdb93999a538543a6acbc41c9c4e33d05a3406fdf6cb9d64d7e6a2dcb4ba4e66e6404ecb6f9206c48d9b55bb34a20fea259ca65bf7f2d4d0fcfee9cad9f086b37e9a689b3452940254dfe04ada0839abe6ebef9463f518fdcdcd431b74fd069ba901ed74148a416538f610bebc901909d37b4ea5e6ad7ca4caa49da7e7d074f2aefc7c74d7e8f13cb0b80b6892f96f8385357001dfba590f7690d61d8042b63552867dd426fe17a8663c1a545d582ce3df034ff41c5deb997bd1236084c54b21ed7106132651c9c3ce82bc4eb43a8fc4a29250a4ea4dc7c46d22565c2725f84fd48493fc00c54c687da26da7d06f58c8dbdac6023ffe7feaac49832f9cd96c5619ded743baa36c898054e2634177a312dfe2688d2c41a2897e4fde13647d245b769618c21f6c7032dd258d3801b32b287dfef17b6fc6aaff3e65f5942cb4d826a6c90868194632b7eac4d2794046db73bf3515d4642904ee6967daa58b64d9ed3052386c76ad794268e400c3ae1db45ac8e653959a5e98c373b212ad6501e7f6d4eb90188118bf51d3a63e3ebd73c875bf2c7705527c9e4aa53df767100f851eb5529c60a1124397b8be5d195df3933d9cf23ccf4d6378a0000022800000224000002200dbaced240b9f1edd3aba53163a7161ec1c451d8394a3055cb68efcbb7c88bdf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000264b9cddffe1ba944fe3db4b9ead84ebe2d08714a92cfb7a59fe82672cc9a705cc11a48b42506ee8fb17bf80a2f17415f0c72c06177fa4f75350d9c76770630e5a355a2d9d0a6bee04086544f662699a836c81a7f5192ddc5f437a99d5a724087225eae75fc96f3c4f6bce01c6556277376d73c6d75ba78756dc490bcb29853ee08743a53bff7d38fd6082d639f399943f2b8e45ff8114c24ca2d1a4d9c36a4c238f98248bfd3321cac3c8c071e2b642fc6f53f3ba24c009c94816e114020ef9b0c511077398c1f6681226f5480a06e04dac3b5b71a2b12729801fb57329a3bf7cdcb0ded65e93261e7ae30b3923f36882965ccf8dec0fd7429f6531d38ad9ec8841bde27e3be2c3bcc7e04d6d602df776b78dd841a8c1c89c0870ee94320e5c9486843605b35a6443ba0d35a6c9d1710711c7731ac6a6581d63349177fe30735e379f06d7f6cebc948bef5326095481304cec5a438f49746f41193045ab96eccf120fc3bafd91c60c6221290765623a622c37386920d13605e48382157f1e646618f9294d88f28f0e5e3a88a20de3dc9073bfb494406a6c22a5a53c814cb28e021b2aeb0c5ab23916eb30b51957588192a0fe33db4a4cfecba9ad25e5bece30000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001071f052e086b8260967a3e5bbb96b9111d371fb3c249571f3eea2989c386bff70201fddac23361a0bcadaf5e6107f8f5f8f310f47ca3e9416ea7755a7bebab3b630c7613276bf74c3c4d2eed8eae96c4f312e3d18888754a9a6c76635e2b907420000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000935fc8b6814a66c0a8b65f6412e6b10a54761bf9e43b531aaea9a65c5ba46621a870bcc6b30658ba0af136fbd8446a86d047735d8d8d04bed7a20c49241881d2c3bd796c93ffc8dff48e4b6043c38eeaf5f2ab12c5fed6eb55d23fb6b7b4f43470a88809de39ff4586f8649a8c5b1de53bd9fbde29f5ac40c8ed5873361adf0b170fa4bd51b6afb98fca90dc9537bdb4d41632685427bc37df1637dd00d56eb3f0eb95ce47f4ca91fe577d0b58209b36f83b299a71740e02dbe2414265a7bff844b3987101648234474a262deb03c923c0eba689216ad9d18433d6300fec43d990721534fd7dfa541ac5e5f0254e8cb3c308a3f40c82c870a89363eb91d9e0c5cf29e76bf39867ce75c2661fb4b8e8a66c3ec870ecb3f05a56df5686fd4827173e8e177eeccd3c0d79174ef56f2145d45a8e2f813f193e37d1f5d448d5424c4ab76ebcfe8a02fc4d76518be8e49dcf8eada2afb93083f4ad289273d01f2bf4a6883628b98eb5e46e5566d8ac474cb9f742970e4d4213ac11a78a3ceda86d28c7b2b94dc38e1340e40fd30698a5f53c6736edc6b075c519503b549a67d6426dfdd6e76dc79a4df6cf46bb8585336b2888d7832a4fb5c29016d7be4b5ced4c5e280000022800000224000002202b88ac320aed617fd5a5a043137eb8bdd845eb5b56dcb013304d5fc62804a4500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086a47f0c624f6f869ade6d40280c622aaa584ead637bcc3d61b5b6ec50380f224f9321b08d810eeb716af9e04f57af77149132bb24ce6b51789635c150805d566cb56852384048d33180a11999237f831cc200eb867866f0dd6befd9806130ecc722a61aee000f81a47b4b56beb3145ecfc337abaee624ebeca637c343e76154bd9c607635961768092c543b001e18d203c238082fa08cd38cb4137ba9dc8cb37ed6ac83c880b4c405e790f6d1de98dd1df293df4a76c318ad721823ff21378834387fd09058747f158cf93346c678f47349c17bc0eca38cb963e93e2147a3a399d7c1749da9703d40d69ae1b312750cb1039b21a615a8a40b117afede8141a0de22267df4ff4bc202318d09e451e8fe6d0f2ae6ad5a11c1bbd1dc49f0e31ffeb6ca357f9f5a3146904355b87ddb4b58872064f22c1b2ce3a2632b7553249f3aeba11896a4e10cf408dee534ffa5eebab163c8a07b8b72e80755b607dddcdff37f9f1c98dd1a12537ea214413eedc9868d6d83c08d34672f4a86b70192b818176ab470f64051a60cedcb5a4b486c90d0242b1d38cab35ba8dad48f270333c8a863914060f791461ef17fbdcd33fbe6f56be684364257dd1d1c2dee914377eca7000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011040324f1629a0aef73bfa817ce606d084113a3532f3b8475ab8d7c230620b8702037e2a2dd55bfdb04ef4e934796856a08c1daa46d8b0636072732d779be6e1531304c0bb07f0ce540065823b88dd9d30cb4d692d8dd4b26d8ff7b819cdf0b39e00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013821a07ef35959e914bcc28b1f885bf543ff7e09086f592777aa63ada5f6c85b6c21f45c6d913a697921783ed1db6f43936abcf923241c3c8710a0e4e783c1ae70ab2505df83e6cc10975e90fb61b20355f9d113abc089e578e2a8a6802aa38a94f73f804cc183e21e0d05713ad543abb996078011fad5e6513cd64fc500da98176f83fe37d75417ce7603b8117dced155d43011813f90571e86cca33f6a34149c6ed95e1f11dee71008e226b605e6174d5c4f043fba3e7d3feb92e5a9d59d2fe1262e80092f9315c0f8c6f07771042c313b8c0cec811c1381c388697f686c20a66a6f51bdb6d2e8ee37e7cd8294d282b33eb9a709a95de74dd4130d7ec144c735724256d5fa3bbec36d41e918452980f2a0ffb95d0496b972c8cc9128792cb80f50112fedb67683db316aeb8498b06600d496a2978410ed36c870bcd8a976b9edd3f84f6fcda9c83f645c04360a81e8551f6dd5be42430b8996b5b13f2ffd3c1c4ab6b469a050da56793048476c0b6cb2094fd85852bca42b9d9d141c84be69f893e5c605dc9fb47f78d9e57146fecec0f81b66f134cffd9b7d0087037316425928841c30a8fb972ff144855ab168ca0839004a8ce2387327ec69a9ffce4f300000228000002240000022016312e02cc83de609af159c540c014680aaa20af2f43608b5d607baf3aa7b739000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009cb2d21b673c40deeef1113e898a4f91936ab0713f5e859d130cd260f285a4251f934be2f925a157f733ea8aa761e5c87ed6d204fb6299a940157e0fd04939b2b53881d2bac406602f37072294042a28f51b0864edce4a311b286323862efb667f4a5f83a7be03d98e513dd72dd16011ed6fff8cd7f7c388137cb24429f90c87970997206ad593ba31df6f8637ae89c1ef262229d8fee31f2ab3ed9547e7cd7ed51d009db5c3c4a70a31c04f207aced6d5b13f9740b80762b0f95dec7a44db5daa90cc4e4f1b95705f70baf7f20f9bd63b65449eb4839983644af3df48a1e270ba6049a39c8758ed349740a0b26095eadf345b0a8f768331ee8824f2b7291ae62b2b937ce7921c233530b70732a2d038a600bfc3688582d9a2f5dd3b453b0debd027c1664f0f300e0bfeb4ee5c3b4a07f34ef68c715e53afa8b5b12c826d2de885de372c3112137d27d31c4f6e843cdd0bef1f8ba74b8150b0023fd2f9262df55ef25a1d99ddcbefb77c1ea8db2891309c069ae5c1365f85e921a2d05515cf493e50bfb456715343ee9808b99276c2e99d58b495538444cfc7868e18e10f726cb520a0338c647ed78ef90d7559c556d9916a5f3a5d686656b477dfbfbc59053a000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011cae4aa2cf3bcd947efae4e8e4d98b828b502ddb475cb843a969089bfdd30c340204c8cb75a925545ecdc98272bf57a1621eead8b7bdb82723f975b4aed5b4cbed2a0472df002d548f6763c238ffcd618cd83ebb261946c860dad325ee65e6fd20000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000294341fd9f857a2c7804b222a0bafb59837b8a5184b4093b3bfd20afd4acc114f5efce57de6f29f66d860c1d0d30a3651484d0cb4522c06424e0d0e502cccd1c0ea51c92c6dc4ae41f2d8ef035e8c403b74bb6bfa798a45111f69028eb5d8758213ee45396509dd5ddd0033612344fda3869b9dadebed9c71ac0495ab43cbcde72216997424a0e3c94651e5987f6d329d672418421a459673f3c9add82738d030d4b817616ed0e7f1594e54e7379140932381aa1a64f5d3ba997d7dc54fc7035c3ac71b24f9ac4e57d06ac8f9323f7bfc3388603ac1315f806f5ffdfc1a71bee180d3947868432ead4a09d326aab5ee7b15e4f703f7c262b5cfffbcf5c33c2edf96c13360571ee2aa9eea8eaa7110d0ed5cbd6df5e979a9d9f66fdf801c41b6eface02673530abfc1585dc20d7f5b183f1af2f4b9cced773377c77d9f86a42d2938d394788b54faa45a95b0be5e2f9fa841bea377c055c181b869e5a374043e91fd9eff028c9e2127c217234536b12233b0daf14c04815f52825193b75c7c5cfbc80ce684d6db3c40fc2c1a2e2050e1c79d23b7312e7e07c6003b27a69b4f79a6a4ff2bc3254d15f23dc6cc3ad96e35789d5c648b6f317a28883e0a8b52780cd0000022800000224000002202e6b8a9377023b6a6e10f117d9113789f6b89abb17d4559fdcf21646f08ce54000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a914987f1f8400c37a2c367d6c153c5ae8a1232db429da3014fa28cafdf8e5820409c33c67a14c5b7c5ddeeb26f0752827fe09f902e9dea0c5292f4603c41ed3c6289c9b096fb98b4cc340ca4022ef29ca310105af7374e911b9d92bf56506f5909e1ec933f9dc39790facafdfdc99634ccd0bd901b271e00e59cba92bc069dc37f3d03484481d1b072728d5924fe50caf89ab51586f9679ce7374f7012a53f4e178b650472d673bf03feb3714be4867fb866a62cf0df9b5f73e16c0c66d88eaf0ca120f143f154dc9864630210fa327f13e7763c79e8c3ed300b148961126c46d4c7d4377dea062687f278162a0291efb971416492b1ecac269e4f5679d9c72f565d393e9df439d2ef41a939cc15353bb8a6a5348ed5b19163a1ecaed9389a21c050bd2f5fb91fb54acb2d6fb91876087a6ba06d7dfeb7c4fe356c44b9a49f4a0be1da7eae9b4dc2d061017e987c9454a9681ec375192b1f00d2d064cf3a9f96bcaff284c86704437b68db5b97cb0aed10d6c3c5de78dbbc6ed569b6cd2a608e38cf16b961ef02cf3318657613976431cfa7188e0c57f20cacc9fad43e60e73ecfc681d37e6332a6403c2c2d489b38695d8f1bc7980fa550cc63f62ef815032000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012ac09a859e775603e69343330c269418b44a5ece57a3de49adbf3a987da27c160205101b2e13e4488075c6d2c47e12e612410fd19ef6f985c878e2fce40cf56e3b283dfd3a61319626fc6c0843d817e1aeb53bc94ff4edda6ed98f0b96f7a82eac0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001cab4b0f15290c398e441daa2bdbf6b9228ad7bd2a3340ca6a851db5dc4b228eb7f4d3714004101f6d9e7f2b3b6f0358ed01f46c8631c57ac331dcd60d3ff943f70280562774a85b5a3c408db9daba6ab7ea1b28a79fd1af81c4527d7166ba452ab19349db8834fe7b0da957531055fcde2cfb0eaf82c678a386bce9476f8ae93c0975062bcfd1e19c39bd957ba722bac544101648e7f5ab26008560b2421c8371912da477a21318b066da79570c8f312f9c83efa5e1665cd910c700f9405fae416c6309beea70cf8d08d987c2d00000b46ffd0132ee177e07205b177b970f7954ff374beb8d2ba07b06984b61f7d43f3cad58f3801f34adb9970df388e58583004c28425366a85a462f1899d9a5aba8fbff704448c49e2ad8e7dab25ed8103348a02f5679257a832d8c52736ce31e6e4e2e43139b21611273b601f910b98680e4183f79972ae2c6a74604e0afa44ac91877c16f738e5c9472bbd3441f70b45f5cfa71a198f8a042d7f051bef895af2f33921e4f7339c730f920148a6c5686812cbf3459910dd8de488d0c09dc1daa65a4d8750ff3f956bd9022f51b006808c71e81f213b51f31c418e767ade741a0a98ce62391d97b7d67bc80c500d1d370970000022800000224000002202d36e00aeae51e0ee6376cc8f112ca6d7bde8ec12c928e3db34fcc7e0330558e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015a7f4046712bfdef64eb278ca89b6716b58475902d3a9913aaaff36bf0ca0aba3410c48aa07ae3683307f03abdbf518c184dcd922aa1f9ee0f78bf2d4d5c0cfc8087127fcd75e2847e8c7d01bdd429c3cf8e66c6e4a21521aefb1cd55c8f7893657ae217bcf0ab0093c0b3263fc41f8ab4ac16d2bf59e8849622f34dc0efcb419432228b6e1e811c67ee1af139deb5239ac42d1ac2618a9c2304a43cfe4dd38ead2b1edef060069c8e37a2a7b159913cb9113a302ce95cbaa1e38f41d32fe6fc50960a15b29544c7453c7545469df16ba582db05bd1864b472c7c03d6aea731c05fd554ea5f782e3cfd1fda9302b2fc26bdc28ea9db0e7535106f37c418446ad283502910419b08d9206abc7d7bf83fa5d29b7e50c3f95525205baf613deb6a427ce7273b0189b454b5299c0a73977909af60cae42f9217ba7d090b26c1573c91691bf0ebd4bebefe420eaf504281761a916dcba56099e0f867824ea0c761d238ecc5fce5e013c5c873a303f8c188fe335d1c25678fd05928cd32cb8024f8b3fb39c04ffee870b182e5edebbd81d6b2ba15df0142870b1b2fe542d65d3d47083b1d2d2689625fa122b5ceae80c1ee57a59ae89b397b3fab73988f557dc91120000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001144d9acb56498d47ff8f64ae788e90291bd281d269597fbe25e0284dd488a7cf02070cee4f5588c23a6e6c140b3b6b36948da858cf62c0bee4b1770dd44fb1acd007999b66e6f6807326c5ee54c20b13573dcffeaf7c3ffc601778ad13d7164651000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab7077a91689705491372ecf4d6c72a7f89804669b4fb107205ee37478936d4cc2a82723e2b7cec8e0897e4b05c29143a15fe214225e5a2032d3bda66539e1b15f61417d5817f2a11b30455397ceb9c95d79590aca005b9f446c03f58467de6d7ebcddc09511f33939e320e997ac68e68d11b311c8dba1abf467fd73fa3202901a5b1f12116a2109854fdffc377c69748de1df47827a5264e4eb3aab7c50eb6433f91d066d696f901dc2d07fc29cf5c0d26d504addfdd44b70de6394f78782c21ad9faa67faee5be94b5a87857bc981d9bebf8b89698f81fed4adbb5111c42a9ebba49d4d49140b73f3a3b0238dc295e72245cbb76ed033f0236e1fe9427bf8727b1c6f38fd4ce2946f26a4ddbe0d08ed02515ef4b34b8115b8c9d6e314aab3e91bf107726638c4111b7271a1dc6ea715a535f67e830a60977dbeff5697d081e9b2dc64b9759a073d995328583885242e5260ba15cc22b893300c2b0514a4dfa1b24546b3575a24d50b79878e5b9864b487a76c90568b5fb3018e716f2938757e6922ce1cfa844329dbf242900526277a00eaeaadf383b4ab4f9bf623eca98a1af792c0c6c9fd3fbd0222bde8b9dd4be7d07ab0316c5e6a2f7c8723c684a426900000228000002240000022015be9bc35b72694864153dea5eaca5dc862ed6560d264336b60b160bc77fe10800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad7011a38db2ae1213f396a5bc5c9ffc4d258ce033a2cd6a0c59c688125abf118a90ed49412aa4e709fcfe42b3fad1fdf2e3ebc54eb36fe86b9676d551647c72bac1beaefda12fd9fecbd126fa515aa28ab6fbfb358f05585426bb82f14981364b245bf2c479bf1535aa715f1c825f7b46b8f3c7d3a49312c54600af9164d1dafe7d29d082a94d1109fab6241c92a00898ad5ac0a2326d0de7b0c44d00e7ea7646e7aea59e7779187409a536b9a26cd2625d7a96d8deac3c9e2f45a00d6de757d5ea821fd3291d939492f39b40d395ab65a6951076fe03eb97e060870e70073e2a4392d65b59b18b84ae923dc6ae3e01d3675aeec678690e766ec5561f80fd36666f63d28df0fdb971977357c472a86a56d29a26055e57462fd3e4ec405649659f89941b506b7d91d63acee046442d1542126218474693be4388d02b54b2bcba7cf27cbda00b53595fc0c85ef6b2261d322e83dff207469cfa21ef7b0f5ba817d848c724cfbb9a31b1679175ba4d4ceb53a4023f8513dfda0e40236d53e1bef21f67f47736db6f663b835d2290824bb6edf86d6945cda2cc2e1814657d9b2a1fc8536d8f5d2b1f20ad56904460e789c6d24ceb252ff6a9847d5ee99a4e1fef21000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00200cc5f90624b250f8f74f70ea1fa409d7973eacbfcc09145a734e8ee95414ba72f5014911ead486a037a43bea6c34b158d767d2cde0063f878e4eddbf4cf707c0207f9e829efe1c185c83b7d639ad7c5566275e8f445e6c4629c163ee89973c46c1cfce2dba275c45aecfebf95a37ce41531811471ee8c04ee5d9a61a5b74e075000000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad1d14ad9b0830ce376bc548eb4978d7df0c898eba8358af344d8adb1781be8c7fd0bc2541bb40b5b87896b5071bb1e9fa5951e3124e2672ca6f9b76f261c9c8308eb5d95f2a42c837e9627c740bf6d3220d05dceaa243890c04f5d3e997beeb7028b618df01e851ff905da7f5b7e0f560da6365b0658ec37cd30462cd016d4a634d31f4eb39566e05be93fde05b6e6777afabbbf693dc53c00695c18946e2ed72432edfa9987b05d5a9aa71dcb5d725630fc4642e9f7d5cabf0fff63c543c91fd5ec3ec1ffffd27314e5e5a35c2e2536f3238a90332f6a19ed42026eac8f1d82c21cab038c7f9a4bbeadb21c04abca7ea124e02c4d14ff61f552bbcbfb6d505b70a7b8c9e2615db1109102481d5fe2e9310df5926c81f0a91760bfc4a2801bdbbc1005f74654a1f2b6a045c2f68a567fbfc58c080d3a7c8de53b3392b066c8b42fefb92514f4516f0b4cdd054e5dcb48e153fb27d4436259c8388b5aaa28f750147d2857bd4fc981999c14075dc06da26f98cb240a43393d9d005e4e181c92da7aed5adecaec1b313560a580e1c3c0066c0d73e6cfdff283892522928afbca40820194bf07ea1a1146fde321c4bc58314834c5870409faa3304c6388400dc8e00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c32a3b76a8cc6e5f5fa3c265e07934cae22fe4547cf836da79b93103122926de7c2080c8d4684e81dd64e0dd9db389ec7c60102d4f57d9249fb10cb60b5f269a92d2679186acba696ce743efa2de891d053cb37821676a2c3e36aee37ab18482a5d99f752286d170fd06e7be32fac15805ba0d8a7da377c983e53167680a05dd6e0094d89c243f82861530686d7c33e9c5e464546cc597c3317fd9d90042d5af1f0d6675792aef4b14056f124c3c858879786f2aacce5aa38310b9540506b2888d15ceebbf04dd7f2ecc12cfc0e881e82e98ce8bd3d29666d7fef3a72e1fea2a226d42fce11a1b07455f175563f0f025e8b32cde9bcdf20d026e7ea15e795b724d41680306bf959b51050c0826bf824db7d55b68342c5742dbd81b4ebbe5866b06662f81332bb1810d49f81f8b2422861b98e97794d88e4c742aa488370bb60452340d479ffe7f210fe3898b058bdc70b29f151ab6aede7a1565f7c6650bd6a949e029631b82bf8ed8a4739ff1d6ae63428f666aedb820f9900d9aafc34e85f6dc0cd73d24f253566e250453be07a38303d09c593ffbbfb5991c1f3f83296ad9d3d963449b2107e59ced779bc10d9b929eb07bc66847487ebeb4ebb74b2272e0000022800000224000002201cb8ea065eb2081cb9fb1d7c2aed74baded2262ee48cae0acb28d1f9479fb86e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002de325d814d6dfd76bb15a57591fe8973aceb484533f2b0ccf635e664b04bd72d092f8f77e1b7f4a009c6d885ca0ac59003f6ccc5f4530b196556c381495b82fe8b5bdedd273b751077b4f8db98db2b00b4c978bb63884a3d69bb6bff91bdd2b9f674192e30b45c4116a0919127ee3d06e93d17e81310ad9ff4e880256d90b879abbc4f9a56e24f89c9eafa13ce16a790d4f43ce3872cc551f4eca3b88b7b989422fdba6bc8ecfe3eacd05316f3ca5db2730259ccd0eb8c5f8f608a72228f07f3dafb908101bca24a247ec1f4418bee01c0c9b086be0185f1d2cd2df90efc2fac4ab570bfb1c58690d62d9a5de3694fb6e133763e24325c9f32da019e96bfe6c3fe61deba3897cd7f8482ea44f23f47fd08484bcf43e4193d1f67e04130ab4d624221267f30311a0493c4163e4b535b0a6808ca2ba6a668dbec92590421b9c31aa2d8db174ce5a9cbc228a1e7ac7c7d68983eace00f81e903d6424cafaf3848204defc54862911f392083d9d3c39502d517ec9bd79701dd87f861b3b0a863c3ae241bbd3c665701188463f10e0d944c6632d5cc2ff91fe3d8ed8b51c61090db34d9f4da714257d6f5769a4fbfa66ebc728174e12d8aaba77b5bb5e38f18b0605000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022faa989fef5fb54023659010c5d88abe140ac79fc7e87b23f743ef0aa62c9b26054b47f05531f4f37182250f5f8d694ccc2de2db697fbacaa17846beded3a19102087992214131c028580ac2a16c456546b14f9e25acf3612cf1c12c45e75e27df2ff01b72327d50a33462aea333d457b8da7b57bcbe7e7845fd7a4e4e1450777600000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000854ee9c4bf0a814c2ed2f8469ca55e9f600b7601783cf907e9857264bf4edbf0f361075fec36099371e0ec4e2379d9d89d8537d2a987e563370c6e8a2404933f0ab9f93ce7c7f9f64504a8a9c011eaa13022866e24de6b7c288f64710bab64113089c2dc6e842e7e6b6ebad05e03d6defc530848427425eeed45a92484ff6728721875ed16af444e95130b36c41b3987d480520be6b6229d94798fcfc4560a8a533c96edac070262df06a94791b64fbda07dbcbb0d64b6c8aa1fe2a389cea3969f638acc2c8d77264676b053075bad3ffb88fda211d985fab11e540f4412c47e8a3a3513b91e892c6b8afdcabe8ec44b39e446b0d1b9ceefc1c26c45a2e84dc26db5ae35b52eb55b8b498e6059543ae666df8b30d7f7e480b015429bf94ed6f3b1872bcbcee756dda3932e06f57087127c9a7aee9af0ea6de195c3563e0c4e54795184f295b9b7f4c0139e00adca606a5bf72c3c29cdb2873e35ef85217e21b9f5f54ff2adce6b4808fa75fce7caa2d72ae9d50fc8024eca8858f3865112b5942d5389835aaf6674507038798ea028f37cc760796eb6328d870ede215e7b4d0695ffa05c5ec368794c9fecd13aebb7c5069532a236066c414d091aa231f0bf4f000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bbd370e7619d349b899cea1f06ef27919a54ba99c8b351291f962177bf1b5cc89ae0fc3a38324a6c875451bcea57a9f3ae5c0bc4f29477c281977fdc8e35608692309995564c9d341ab6c9589b08bf0a6901195e5d4717c5a15f3efb47e1be55314c51f6e658f4c361e96244512ce286f081ab0832e2a3b1d2b0943795472f588f45ef41313f707fa033d0699ac142cd34867436a5ebec73d52d49a0c6e3100e2a5d25597fe0753f38ca5646a9c1ad3304953ab1774caf1091c9b21b4131b10f007d0acae4241e5ca93bc091afa20e19c0f3b59f401001583c425d1da66077c76757ee703e4ab7a3f200953cd9d4e722902b6f8b6f1a9c7e3d95619fee121ce2f303ea80258b7e2a29ba55a828b52b824d86bcdb3fda1473a567e12f00715c9685dfc3d77ea52bae44130ee725326997f658dde1700a9e1ec356e6fc21c346f237dceb9a8e166b4e5915b5e33a28219f8098f236bb9215a139f5c7d9bf5c9424a5ff2111c69ff9f1848a18cdee36476c3bab6806c39aaa2b579abbd4c7dbeb05b06bd84510397585609459fa7a38ebcb5c0aa6648b9628ef4e22c1f7a9ae3b1018aefe13ae34618ed1dc715f00af04de5d96b30d11d5f09e85197f5467d2820000022800000224000002202cd4991f6842dc69f8e1f42e57e631c069aca423b9dacfe7ee0df6565ae89d43000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d1d628586ead2edd138c65308470daf6851284c0e60082a55a5a8481af54e00cd62099f0516d8fb9ccd9c0dfbabeb6b5e453e12b836b06d24f795b731dfb1cf97090ae386b4d75a579772398e4a84a10483de02079408ae74f30e055cf0ca7e97b8da13d50f972eeb6d3954fd74d0ecea044c14c124db347a2dc714e601f66f27198916ef8f629fbe34f7cabdb632ae25f5d97178faa72e9b8386ea6a367d3258c46788d1c620d080b41ab5312c2df26a1642f6cf5c2e6e760cabfcc5eedf778815badbd5fd9f02bb3014765f5581c6841b4561cefc8978f5325433adaa2a02f327e53b89fc5b09b888cc4ba866e8cdcfe00a8636e1cf81ca8e02199cc38a7acf91b18ce7e1da6c3f10e75b1907fa369d65f701caec7126ac8cb2f934a2f37cdb7150d29a45463131055897b5a9e48561a951f0ae458c6a7eb2b0b1e7d07afbb82395bbd20fab8e24e866fb9e616571b34eb18d8ca249d35acc876d59f721af3e243c6848571c33dcea35693e6ec9c81673a4d29790e967fba005567f3b211af7ba2c3cbfd64e9505ce0ca09452d5b972acf953a91d138d2ee1eeca8d853cb8e24c19e3221d58ad5bc3410a8d7e9a837322ff6adfa5c21a6aaa5b7684760c8a000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010b77eae034028c66fedcb53ae14abea4e0024a9edee3c286129952d6ebba3546020a7f0399e9e3de3bbb1f28c5a6780e4dc9df4f32c8366e867225fda011a24ff30c64163ca6b9168c4c97dda4941b0e38408927dbb12039013e7dcdfb6a0abcf80000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009904ca7be58956ccbd89c219278a779cb3ca8c6aaefaf7a60e1b808c334cf1ccd5feb3c318aa5c08dbf4404a348c88393d70b0e57cc8a0cb2873b5a2e5ae7f5d259a43e1c3fc25c5321215ca25f10181d79b4c08f6790fa9e48cf0781f43cc157c3147c794a2fa71c736499ad9466cd559ce8a7acbc4291ee18509ac0651bff75493edbe5c67b1e512a44b1f16242db4ca8ecf714097f7233ebbd1d32a61d529c5a71af18fad17f2fd7e1711fefe24f83dac025e433f467f3fc12b0fc646726fba23458bab633575a6ae15de8174e759d3bf0d02b1fea2dc9a77d3dbebd82f50fd3de13a001aacd765969bd9b04570f1dffe87eefb8e95ead17f3cf3f3738ad893b24b3aee1d433ed998388aa92f81d262b69924ebbecc5903f042ce998ae07996da18743e10a42f59e98e798586ea6ae9f0b8c419e86717541a54bfea5ea65b8b2a9f01469afea71de460e1b68157b834edc43a8b03a9e4f2cee9f8c5dc858580c42f69e87e5a756b3fa953f7599edda687a4981e228901a14d172357367c876cf89f66b6f00449c20348dc1f00dec7dc969ba5c730dc1cf022610cb309009300ff1f4d0afe1e17c28de9deb4b808e32d7f7d18bba522bfa7fac97d5110f48700000228000002240000022028bd03213c7151a62b9f2c8d479e6b5b424592adf25630dc51b38c65461b91e90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d2142ae5192e9d1d75c85d8c5ff3bb9df4f98f956b3bba4813a8b003a789a304e9e68294b42d6e2711db44c24372955907fa9a7cf44e6c56c501be5054ecaaea45ca85ec4e7fbcbc5b45b09c5cc73038b6fd3bb2a2261c9faa4ce0be76ba6dc857a7e4f131f870986058166fa1b9873c8a33fe264938e912b05691666495fddf2fcd3016e719f3b9ba6f6e5337dc10933badf78cb6981109f932229b390b7739e610d7c09285f663aa8703ae3b114690c0746cb92efaab27641a8707123f5556e1b7ce2f28d0747a3055e991b8495a314f02adf251caed080c53d0c6c342720642b1e075e898039e69611642639e0acd9dfe0e27c3330ca6f096a6e1c748c072c5be407bf238b882a8b8aff77db750abc687e98230f79ed45e828e579967bbb88f356b9b415d5dfbcdf0d4d669acb99b9463c07d0655a2982d7f830ed8f7fdf059dd5ce4f92697f4eaa4848658d1b5b0f04587669556031f7ea2588b8c557d5f114dbec73eac7928ee94d750204622a3859397a2d638ceffa787c7d480fa51269418ec4db5766dd4c7dc72a13a339cbc017347a00ea9bf90b1739d786989fb5f585f0968dc3f96ee4d493edc5967fb75e05015143fe85a4394ba6f4ebee719000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002278e7e2e025f015798183f46118011c17f9e6bd4d69534a849cacec588d7912326df6d2d308c4ba06d942e0194ced70623fdbbdae99b09b0081a0cce14335608020c34b2fb6c70431763da5241375df4ba55cc266b8c9250a1e524af365e61a289147daf25dcb16d86d4e867069956330097de4a9141adabe88a710b88fe721a5400000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bdedae5dd0b9a725f4bfd38fbf034155a851678329ffa9908b86d555db99785d2bd82672bf42659aa5d12e055e2b18e03a949109bbf8bde2fed5a661a21a78025ec96a8fa4fd8472d98e371cfa8f9c608303c8354fd321844d7e1edd3860f990f0bc61e18dc79f34c49cc1ec323bce94d329c8750f7861c87fcf7f41eb52da83097ce9904df53caeb9c364ea5a6cb79d956df628b3171e0d7091920261bb6862428cfb77de8a390787f39757d123d09f7369d2284384b1e00b7a1bedcdb08e003bd224dcda564a4306b40db272ec0e5fd0a7ffb439bb70ce744767e1e5764fe44962914309c2a5d00a1f0297061a701b5335427d8b3eed2150635f6a685b000f66b5688fde7e9610aab72c93f52466526220fcad60db1afe1740d11a2473785050be79ffe85e79bb3b2efd79b88d3379e1ee58648f9bd142c0fa01255cd4b60b9f15c186285d13221e2ea769831377b662e0afab124db04588204c5c634acdcbeb7da41eaf547717b3b18d37980955b0565dbb0b0657cfa5d117e9b25b3254d7029ff18acc9a3834603b8d636c1bd1f0ddd40ca72be8bb14082b8970f32bf9f80eca67d72d7b4d14cf0230cf96b42ec9d8f13f76fbdfe0eb5f80b09de65d17b000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093741ca3d8f4ea366c8bd9467dc7ef43e8e5eb7f416cc1693efb067f9784d42462953a2107a3d279e1d08d18027ad0ae7b46861b1f7fa7ae15aeadcc4aee3ce20f6eb2d391d8aa1e56b37bb336d8f91985684cfe175ff8c58b190236bbc8144ca997da45a6c0f74b55394924c19186423830871a89177e8cc6b211edd62d4d8310de897f81cf4a8e17fc433406377ff00d17d1b40fef68ae7af5fbf7147be0ea77a36f5dd84854cb40fa7eb28d99133d01ac308827af4637557f6193fd7360ac98cb1f9f7549586b692ada1a6f615bce707814a9da67910bfcb755284d351dd0480131970ab86ca193b19e91920721d4c5d57e8daaaacee238fbc2535813ca27d08adc369bcd28cc1e948dc5db492a50810313a070df092beb6410fa0c9cdf33ca1a67d2a6130d16fa6f2920b4bcac4ce0ac66acd6c1c93a4507a1a413b4ca3960b6a6c3ab95b0740b9480758d94ea2a8ab73992d037a5b8a7c514a59d3ef4959e9e24c676c8d691d46265d7e6a0c0665d4c3e5df30f5e0c061f5fdec551f2ec151c311ab81058927d16f630222b6fcf8708869031d0eb5e839199b75500f77267bcb0f18491b7ddd175e6f11cd566685ea0507e4f7d94aed388d6e0dccd3c54000002280000022400000220199061c83eb7623e46fe753260c9d648e7242370cc5c00bd4abdd8ed63e8a9d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000195f20bd24a8bb5f80dff81f434049ff7ec58f2a3b1bc2a8bd4eb0dd86317309adcfb312ef24f4b95c3086c551cefc5bbea9a2fe22ef7e23e4aa7ebe3038019f4c20a201338d21f1bc5558f87d5823719c15a983a9077db0ad1205de02a744fea86131a9e55c4b2cc7902d58c371dd82e135880a4c7aa3d71d44beccec9ac6f57281e8c59864d533de9de1b744f70dfaf89428d60202caf398e084446703dd904f6f49917fef740b60bdcc3933c91d1b8b2115d3f0e59c9594a9c4e3586106b9e0f6903ea7f152bee371007ce52ad2b32632f7437ccec36445f9054ec1811f32c50bc11850bb4fe2da359540ef94fa7e8073ccbdae8600905ae53d4262751bef914e7d659ddddcd0af36a974f74425e0e06c31ca9dd8c8f369e0e25f007c50eb88a7d091a261dff0672f74cb13285fe758cda3bc4258cc7c1e164764c861c47cd86c42d900491bac2f23d852cfb129ad24598b20845919546ffdab0e23515ff05aab5112a2f3e01e7fc76ad0962c9d7261093862909f9dd7ff6627b888f844904ca26d6b62e98557b193179d4a4029dad43ad03338fcbe94939bd60ea20a2a35ad97f775fb9e0965a027cd6e07c5b97170ec115a4392a131fd56b7d6c46585cb000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022c3143766e3782fd0195934f76885ff9579d3f5c0236fe49e9fe0f12a6fbcad82f282d91eea4b4826104b2aab2465af3a0c0e25d48404ffb3adebae9952d9d05020c78cf9ba83293e66b76381d97fde93d6c0807d4c2039b70891a5c1ba9b7877c0bb6a9e49e1f88c666a2a256dbb3d67c18bba2fc1f4dd54a24c92b664c0acff600000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f8160425faa1e8b48fce54fd94932226048b2091a9dab06dd367302c39a24d75b777707414ca2aee23620691682b30b8d47e50b0dc81c63c383e898907add50a91f32f458f15b1b5020d246a0e6cc88e015e6e8f24a5642ff89f7e9fc2bb1f2f98c92352ce000cdb448c2643c6804869b322e06ae54bb2bf949ae5385e17a289e31a3bbf292de20d7038ad5846a62b60c4adeed4dee407597c8d734476d579ef35c9cd750e39d68198be009ac0f8732e8ac4ffd8e99d4801e08bc823c54169fbd25f9ce610dd73ebdf4e4d141d24b0b90130b43a92551520b6ec3648afcffe81421ca9ce7aa41492689c8911adefbe9f2735c226bea955dfe50c22eaf58661c9d6773f74be4a5d2744be022b21cc8d3874a4edeebd3240c25992a66c2166e69c0e6db81714f4be8428ef4c8d01bd9be24d9e28353934b4c1a33c76478a9fd7df9976f797aa373e3d162e3e9bc74e7b09c611fa7226613a4da284b77fc9388f886a7ac50cce08e23f10625f3ac9f1f11ea151c58bb0bd95c7b0adfc9ef8542e4ac95031daed3890d9b12b16745da54305007bb11d4713fe7e69fc71bc9448ab7cc0da2100d24c29e0c81fe38a24d2d4f05ad76f618cbad4638d2048e27e95477000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089da54cf39f80d993da3c5b87ea64b5a362b282a29aaa8c2b82456fed78678afb89775c349ab783f38573a95c1fd6e66d35c4200f45c6dd4e0d12adc054d43b10a3b390fb8ce3fd2533ad91a479b08308f507b076e6cacaa65c0ab755a4773421a110cbe93d3982b6294ea9cb0225b6e3198a4b0df3fe715f10b058c4100874ec227e2210c4f9ab316a85cca5a7b786d86d194e99c04502a0eb5ffee721fc9b5da2ec32f21732c5fcac64dd28aea1ffa0b4ad40d941994ac2e62a729da1965bfba0d6a66b5095d1389be687114d68ec50bdf20c1a5422f33d098b599ed24601af4d387fffbad2903b5af6635983df5a6ce1815c0c569c3206c2ad7b43d15d4d5d6217d5734912595cdaaa15d38fbd7788900426f3b660b0dad7633cdd30c111851d77d57fdb6d70e4364472006d848d21b4c82578064f279926f36a47306b8e0d1c1f86a8e7b6dcb6258e881d1c1dcec523497e0488623425e208b38df9fda55c6ac7c874d477ffefbaa20ffe86fa1118d6c9ff1cfbbd7e4aa0733bc2dfe8c17633858498caafc3aa0829253ec88ca5cce6f1fc7d1e1e707055df953e4f44a6d02bde75f5ca83617cd079e90099fcf794c3ce83734f2f6617d7a18e239324b5d0000022800000224000002201bd118a7edb2edec2235d3cd5c91f8af227725fbb71950e2b2fe482d1f30bf660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d33eba54c1d1388b5eaca8b0761f78f8413fd3dbecea6f06c7e61bbe94290f7a350a0ca7bc43789f6b9f99addd9eaab930d2a3ea6b7da26b50e443d266cfd55e0af2a63faf7bedf6343688f60d0eb3fa4d1bc6583abd40307151998b454c8fecee57508888e75cc5e30c1ffa1ac76136f60b97fedcb6dd763826cdc55eb0e7ae41a502e34c3c1c002d34316b3815111729367fa262028578b89902f452faef72215226fe73b1d72e552d3d1937299d7e77cac08d77965e2bcc3ccd17a202351a9ca29aab7d41a275caf57de935114314c880e0f19430887e0ff51d35caf1590ec97b47ee037e495c685aa6be8075f7307a2165efa14a525c81323c043f3057523f50ae297d9e09d0645f32e5b1ccf44bb310d41a0746f77a9f9e5abce4c5437cff12e81335a010b67d1de2ddbb41b04e3f0da0716bc097dc30fc2a362b40445801595d539568e4fcaae0777bc87747c0dad907e454b6c88d38a0d990757a3c880e9209524c3ff69ef93073c90aeeee28f7e3deb2d43fa7a7313a381e4f9ecc21fe84769adfeb67fd045675d3d45b8b65b6302e072efaf0e0afaa32612af523cd1f7b274ceb92e0e3f64019e804f91eb665cc4f99cfaf1175978e1a9ed45203000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011f022fc61140b39a442b4f111605585ff224fdc0bd9b84d2bce75706472cf6a6020d318016676493d72f7d7b369000b5edf40e56b1a36c64af43d20d31c9e53aa5213b4c696ce5dfa8fd7e2cb479322ed8cce8669a776125f9f74263ed7908577600000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014d16a4c6534277ef7abfef95024c0ad76bbf031de866a90d5baa1a88987a416d71f2a459545cda0f09219e315c18619b8bb5b13eebb846f32cbfb596d95c45b276fc242ba50223dab9fb6c407401ca353310e46b01529662dc180b84f121e6e57788f91503abb2b3760ae36641895b4b4532eb8ee978dd84eda1224e447f0899a3b6c3987264926069b662c9d86bb7c9857c1ff687566cd5f77a46b82380e69336ff0c180a35cac1716d72e98314bbaa1fb33c38a135a5c80917ee8274ae24a0a5b9e36b897e34692420fa94920c6fc26fd502c2f12a3c9f1d87053f5bda52e89c8e1505ebdb412a7fab358ff5a4df5582f7876d01d0710e64579c3648c7d6f60382f67fb86540e2077aef27a36330f8741e7c5621bd68e38a5e39337bf24f9196f27bebec42a326d8228c8887221a1c30b6c4cf70a9e3fef4f604ab693ac4569ba04a11da378a6f771bead9776c3bff89bb8b867bd51a16987480a052cd548e8801dec59311cfb823b1d49437de2921728dddad62675be8e1ba0499c58341c9a204739ebbcc3cd9180beaf685d278272651e3ffad749341b8287d4630df64fbc440bf64a68272eda02bb017574a5ca7d8c00b2f3077b2ad4bed8738260487500000228000002240000022015ca2724f274a9f48da6d7ccde2a0b8090b0249c878b2d73eb1e0217778711cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ae1b7f9d2652e3612760d3487002ff5ea981cfbb6dadeaff131bc8b03e9395fc5c5bd54ff77146bc255d7f3e78af1b535a09d4a1652b0f7b27a478cf70c2b6bcf7e7b41b07e99d649561f0fc70d55e11af4ceed23cf18b3ee0b36069b65701b63be9b4317278ecf84c7f2a0694ff689d11822d66689cfef5829d455f937e9b63377ba1645c1a13d8f3e5115a73885a64d9f92c86b48eb3666863521bdf37a8cd2c92e1e4de0eddd34dbcaf4ba9ce319164a4c3a76e5cb6293d5e02ea72c6787460afd604edaf3932e5efdcceb387e32e6838ab24dd24ecf5f5ca5b940cbf32f8191fa83982d609a31dc9ad2be5163de8f13754612681dc5a848b8f394289f2b8d9d52bafdf87f7730f7e26f0a1ccf9f8e10b478c6dbc59ae04ad5704d54270ba840f14a97ef03a3a4c745ff1deed4daecaea87a92961b87166ed3fdef3891e071703fa304234f0c8c9456edc2b683a9b66e65e1353a1b35c9d28110f12a5642cba9e1a69e6b17fa848fbb3a4139f96d4fb1109c050a95141332c14adbb40e0eae7ef3302c096f5e1cef74aca1125835992f7e44e894f8b668c827e47ae31d11cb29b7f22857e7cea730a602717a7f6aee3ded7f29bb3f9a3a2bbf20ce7c3bb4000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00207e97618f30d51bc6abb8cc6ed50bddd9df856160e98ecb7a2a82541eeccf66d28548275ce1efb37c3019390b61c39ffdddab54c40cf01eb0a477e1e5d2cdd32020dba1876fd0e87763e31a2f807284139eae0ad40e140bf8793d2522ab97314561bf3a157c3c56e42f81e4a5e054b8b287bb9f971f40b3b8156e87d01a09f413500000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000917313aaf761d352df4fe842be4f7a205bbeda83cf7828ae61ad89870a3c7c7564c072ea7bcdc75ac1d187db9c551768c020c56f354db936ae3fe497f3de403c9663138379f629b132031c66878742fab8227e155235bd1a946caca8ce1752ccde2701752453f5bce1ec48555f9e5fcc74e84665110c30b17398ed4fc6ae3e6f2166b182ce17f3579a1565717f40bae0f6df8d4bcaa27007ce7477a4e94a2920c01fc271addace2655b81ff0a900512aa1b02577206a9096c0c3d5cfd519fcdd9362de469e7a6cc68ab20b2dd15d2246b65b13cae199daeba5a98cbc57925189caeb44b3f7e825473609786191dafbfdd6d8e3776e49fc41f0a91652bd21f0e8158e850f42a49e073357e150ba4af9e74c858cc087dec212b8e6c0783cd378c448525224e2a0de693cd60c006b77defba2381d9a78fb0e00f8c1db44cb0e67a43972f6a049e26d143a6301c5dc2c7fe772b185cf0ed23ec8fd888fa968a5f6e060cacf3c47c3eac11159c71e70d7d7ee1ec9a92dedc6c74b85efe83a7e7a62ac6e3891fbea8a70bcf6decdd776ccd182cbf3d2ef01686b94fb8dfb726e3f48e5c7d871bc768f1a722bf6ef6bb33bd03ffe1e25c67e58f17d4339df1ec42ac68000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084e104c0b3ee111672b320e0988eca78d61de269f3fa94e1fdfbf56746269d4e5ecb47cd22575dfc3630b080f3aabc0d8938fc61463d48be5a4aea49850ec7ce8a61d509cefbda265ba03e8ff1ee4f78d8a37e55bb113e2a99fe234ecfbaf6cd9eaa689eac68a80218d8b32b9c06addecc985bf39b8e3ad518ae523bd0b2ed7f8542ab8a951365a5f3bd444b79e57ce8d751bd8380cfe35e57005f029f871a7675350ca08759c78b2115c12be50bac3c70574a79d872e44beba44dc29cc9a85b7b8d5b8fbe0b00ce75d671546af657764f909e0cd3ce7ceecc54afb6081a4caeb15300973eca958d0c8b89671aba2883d08e7e5f9931d8c5cf2eaa38b3e46ae9a0df97cbc0751fa4147ea6f7be91a5d43163879c7b85a626acac270d8b9d3050dcae439811b4d252636e6e572d3a5963079f0f675571d38e87460b455d29adfa685e63ce24a7cf6dc2421da6f1848562728b28cf28951237cfa2ee572af443b5cf2267fb519a83e41488c400f51b3fd52e1114baaacd7623af5265daadd9a584fca60d65a53b69867410e26eb90e440f8aaca7468762db5953202340f764a79db250bdd0b6e6003d350f96dbdebb7aacd3539cb2ec6b032c73a54f7d6d7e860700000228000002240000022015f74b259f08c2e4cb727993306534e82b83dbf0b73797f8fb12fb40c6f50fbc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cc2e172ddc5703840e0a5a1e74e4604e1849619b3959b75d1954df12397af3685760face3def102d57a85ca28e5ce6155ff0324013c0ff1b7728beeb5c6e142d77ff6d33776ed6d5775ce7930a91bfde28185b1ad4fb26e23c8fedffda540f174a2b10a4e87905c97da3633820dff3ab3d8e3a7a9c961e60b8108e28129694c9fcc570fa461a0d9d3e548ab61d1deb7a7bbf3148c6de973964eb8b57e5842fd2fa80a2771ce73b05b69a91d24b34e004884761ed7895cd44f401b072e39dcdb604a11d00ca01c79089b37074e554e1b25db5654fb4701fef8715e8bf090e34b825ae5e1464fae9cceab3b3c2432b22b17029041a6a6b8d5cada3fe90d3fea39ca8fd1d79958de6fb73d27e7c323d70cebe21c90937e3251d1e3e1a402cdf825a9eed789cdda6408567414570633ccda65a06680a73e370ad13673347af20faf3a3fad558d0e7950fbf61ec653b8bcd939639707729ef3a5755a2fed5399eb3d5b1022af29f0745777cde33670cd3369a0ef9e9449f5248b62598b43c55aa6128589cd1c936677e2e20e155b6dfcfa6a71195204e566528ca8edd01b4c4664c88a0c53475fcb1515eb046b65158d006eac0822c936c27b4f9ccec7b33e758ef6000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012f768b68400a9b39cb965e69b7938cc49b80dcf519fe683c06c3c69db692d925020ea7077e4ec0cb44939c8f90abe0620aa43f4ff1734611ece8eddf89d85f390b189e1720ae9656d7a35076f15220fdfda4c3cc35b6b4a3bca2b11be84c8ea87c000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000188cd3f16c01fa72d55b209b87bead0c0f50e05c77c8ae2572a889250e765e2aa19a8183ab8c029e0a2c223acf8f1f16fbe3eb738cecf775d6a66ea124280a310d6933fcfbfa37c2ad419c639203e5174318d03d313d243d7fa9d6d9cb500c7ae903ff6846c34e484bc319b5ee640ba77ea4a3c2f9aa6012e3893790bbd4673c136a070de8ce811c5ee5e5179f4bcff2dde85691b4a3743ef9722415c1ee99431f235b10810c5d37aca1d50069e0a24ce7daa844053207948942746381182dc773f859e09f4bff58bd7193764974ec017283e3605a1e9659a70977bc212d55e7574b295235106bf784f5372fc9d37fd3a1cca0269896d8f7a30f69f2eb7f494a5b2f1233411815bb402392335f1cb922f949a3387cf3b646aee479a33d137d7e645600bfb7db6761fa7b076309022427948d4db65f1b1f4dcca859130e74ceeb53ce370730c9f4d96cff2786a38a13dfe767fe9c8b9c91c13bbf65e2ee20ab06bdc7f64963f30a3271c2ea0a381a8bb34eb42051e0f9ad4ead540873ac3664a8d332a334b5acdd771204dd816c0c9402038b49dfc4995d284e109b4ae9b4f5b3a4b8dc0535ab6379c69268592f62f803cb1095226a483edc8947b0719a5257940000022800000224000002201d19ff918d6d3250bfaffe625fe02a319644658dd045bc634d7588f60ecd2df50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027bd3d4d2f0a739ee2fcae4a48eb8df6da6dda267f1bf0b64ac193593d99546dbb4f2b6fce80c98e435df4b1754bfeacaaddcc595832c8172ecffaaa1bb19a2f58be111277ea994c1276fd61c60710fd47ec1e8eacbe3f7c9cf6da0febdae1e30594d429605a0f3be0142fb4f088942a88e5c9f5c52e30ab0a806beb41ab298545d368a9ca9e64c36dd0f37c337adb21b54bef0a99c699bb15d83637981ab8ebb7455a9215e6d77b805de35d8173ecdfece538f18e6720ed5466844543751e6745679879f84579a0048112b9b8bb27bfb4da2bb0cb6bedf985ff3472bad0b04328223912b410954f578cc5fb0834b277ea3728acafc032f8b3f4b8946ba025f35ff17058c3a1dee0aab3be7783df18ba57b8ec05c7ffb0f941677aa94aa1c835774103321205b3f88d3e3210ab7c927295c8242bbe57483eed73ebec36d0e12814e5f8e749a2b0159d46c9ce418a57f469ead85f8c10f7d5c8ae4da2c7a948ba7f5c3de20f88f441bd9d685956aaab4d2a3e8195fffe797b848fd09ac37a1bb28775e0a4a3b0c1f16fe4f98a6edec7b5a9c523ddd10a49574c70ba0c1ad64f8393ef62a31f6355a192da29f860f8012eb6b95b8b826d55dc65035b3e799240c6000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020b004f12d20f06bd56273f9fccc0323af27944596e8eb4d606b0d2f142ec859e0899d05e69e53d9be6224ba6c4a7763efc41026d83d3d40a7d0a6cd33999c7f102109ac524fa93745b311d935a93f26cdd05d7ca24a69c9b19462a315604d627041b0ef05da7ea893bde08c0019597ba91a79e68508a43b1105d037748c1a5e23900000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f85b329aa28fa2e984950f76fe30ea737332021ded45ca23ba4fe6bb8fe688a32ebccb903b6ca3fe4dfbd64ab9e61df7ddc7124c438e1d4456398e2af0883d0577fc002273c505b86d9ca9748073690be8c5fcbf4ec3b8c88c4a348f2a4340339bc140042384fa15d59d1cd53eeb442d6734fe37e51f48473abca323692dc1447e8d32e0672329cb5b8dec7ce9e710a6d11f9ca25372d48443570973108be910aa0d365468e9873dbce208425962adfe1d1416e6b00e629b775778d25d3be41d70bb0720d5bb9153cb9b51bf6f0e47e26a7f543ed2b9535b897fd0ddf881ca535763ec2167d979e216d3c67be5ca2472b347c4a2196db935c12deee25466b6cf93a3f5d95b490657aa8081366b2008ab0c0a290cdf5e769b38a9f50bce5699cb4d07d396e35b57272739640c3ad07f966c3700276c90f2db0b390a97bb9cfa99c1d233a97b58b9cd0e90d6e91e4725d95513eb10dfe37e630a65ee8fffc52cfaaa6efc7dae224a67dc320f5385907386f4f4bb3f38be02151ef09079768c101c7acae2fd5a9dd9d1054069496a088a934b38096c50f6757b986ff8310a36e3a0e0debcb5a42925ca608217925bcfdbc3063de72c202e00fe50fb464c5b4635b00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008883ee257cdb12ab7a2c273a70f245a340967a7d907622e66ae51da8183f0bd579416833793a5c3f89dda4cdc3a56a8a5f133d70d3fde05cebd1d1bde1cf5682f22130af01cbd02e25fd318fdbb254fd002f60f20364fedff29bfa0011c95e4f65c6c4efe5d1ddae8fb943f561649b76c027b2d5893c3ca2c7a7aecb930cecadc9d6e7b4004e78aa6c9100e9372af67bf5cb4a2d5cc42da841580d5058373886338e49337b9310c6658a318fea19d71e7450df15277b4c526b8a828c952f541a2c067b55dc5a28102a68115c8bd49d15fa97f0f9f2b728fd6dd23ee9a01208691b001f3fed6da50690e2d708c4d3d5616b32da9c0510f401063559bde88825391c25f74142dce7ce3961d3a670b1e723f59128839f3d1f36504091692bbad1cb783d9a8171ca38f71e8af792608ccde50692662fe86c0cba102b52fe02ca9775346578123a258256723fd133312fc34fb5ecd11319db9fbaf0a4684d86162bb0c7ee1f1254c480f3046805297079e2698de855dd2c6daf1b9c976e1b24821e52de6b0c50a7804903306d49feb993142d24e7908ebbc7cc703dd6fbd9d93c9681d5d8a7d4873f54218f935b66c656f6fd891a1d8df0ef5b18028a1054a8aef08f0000022800000224000002200685cc69a566fc737565890b86f1505ef2a710ff767b032df9b5de12fe6f68c1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eef0fa370d23c402f5d45e5f039002443fc63879055026605a5d805f49db93ba80c42a982a0266e1eaa88e2330bd7f63d0b71e5d20db106dd4af4173da5bdcd70bee78336da93edbe8ecb238170503352e8eda9baa90a428831cdd412b97dbe081317f76c1921d9b8d76489217558c6a6d4d99f58cd5e7b10ac35293506bcc553f24daecda9692b50dcd50885c4108acac716dfcc04d89a16ec2d20c6c24453368e134c67a3f7f1068423aa46e1e3286ce96c730bb1e58cdca73ef801b471d90622464b964e5b480cbf6fd9a82abb86873f5a1b275bc5d0bcb7041e76d0b8a9d2897adb592b50f9ff802a6e39c92ce455d0090d9dd47e73028658ad243d4ef1c632542c74143ba21084d6d930503a22e7f5c7d0f6593e719c335133999f51afb8f9dc98aed6fa1a2fe8e686c481401344ebeabad3487a3c39da45edb5b76634c6b7e589616b15d6cc9a267abeddbb2cedc3ad17e9551fd961c5611b16a338f78334ec56861c2deb626429539872336c4562fe4c159e26a47a1e1b386e981d628bb2435de8fa672c19660ccfa08413d62e4a2556f5ee98bffe8b8782741112ad07e39420eec8405ac1d2da0ac8bc3017e23bba96139a1759e30fa3c2fda2de69000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020eaa96eb88a8bc428faaefb4cdb3bfdfeaddce68dbc787e8592c6c512a77be8c20d07eb6f20b89e4307a597996c2cf79539bf87d6f3bbde6733f5c0468f57381021121dad3bd7882a2c9498c3713b48a082c9c143d62beee698c8ec6370c973d251a44d5caf1a5cc825d3cecbd57a85b0fbab730dfa84f40fd19802595fb6c861000000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000acbe6891f813abf8bcd26c6b96a37da00879adcc24206915649e8b2f6b677eff6e21211d101dfce425616b7391ed943bb8343629f62cc7d44aa42fe744fc50839505ffcc526091207afd8ded25e525309fc25225e417128c93120bf31d9ac9df1fd9bb7f6e0cc91a46e114f3f011dc728087049ef0275378cab703e2bc80a061f2aca82d5a11ae449bb852e75383ee10ad09faa137b865b7155b40288bc1c679aa9fa7060d903b661d1ea84c04ad1b588b1d619e71b219b0a04a0099a17bbe215940ad5189fef0dd04c07ef737442e039c780eaeb19f9d36ded7c2aa514d178bf77f29352372de978bd44d682d0662fabd20dcf242cb42f20587021045b877adcb404dd60e3218f8fe1c8319150a796372734bf89ecaa0995fe689f91b605d1e70389f93afe81a9c71483fdde4b8972e27587f6469d36bc5758a4844ed630bca30a5bee90ab9c9640a5e4837694ac1b916d9650bd7bb968810e45b8286b49415edd5b6e8b4354c29f45b2aeac7449a32b4fa715fcf3202de30a30d3be2850c5ba330aa3e965380082917fb1d9323e9e371fdaf45887e469936a45e6e2137736e92cb62d0a2daf610d4145954f1776e3d5accedf9c3a92150a332a1137ee04bb00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c86bdb5c68b6ce024413717db11603249ee7b392d1b6f49d5efb24206bda48c9829f730540e1b9f2e734326d6e6f8306a90dda7546057b37bdebd661af505770486b3f1c188944ab1142abcda8b34e0fe9538004fc7e1dc5d7d08b84625a5e3dba84d2cb174423dc98c9a99f8b1d303540f3f6f67a4ef834fc779becc254f00efdef993d6055eba0acfa56d72240cab12eb6a4ba26605af35d77c49060c162ffac25717749ec141386750ec091c589fc80de1ce6638ee1c0f935ec27c54055cd71aef67bdcdf7d054403f970a85c236d5992a440a2d4ea7fccc52c9a2a0b6a481a6dc6802855219a52573878e0ef9e9e10fe6d3a3c52aefa4815856f6d98b48b938b20c1c580f9b32f2eb4febcf54416653a30ae30b0930528704332eec6fb23f2c76878d947742208c8c7d280c63146df9996fb38c0eace1c84d945324fac0cbf98231c664840d5f46ca16a1f4eae98105763da3463f6dcc7d02837dd0586dbf2320621663b0bb37cfa14ee8489c80d9c29b16196b87bb4f62baff2c161da832424c776557a025a35cec6e7247401bc596bd4abd584a3c06b905f7d920bd35019fba25708f4c8dd18273d1f434d4fb75eb29958c2d6a1743671cd4c2618b2a000002280000022400000220185c5e22ff9f37dac2d3d0819f0bcbb26308473140b2a1ae3cffba1a3a17a4a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e2e8e1e81484ff653441b30e1924b77ea6c3319a1129bbc8ede2ad87eb1c24417096c9f3127cf510d4caa65f4c9e6dcfc9527ea7224b8dc0fe278106c241f00821d664aa699b02db42980cd68435351558b9d2b9db251121a49dc7db68cb8ee6e65d1fcda6bb1f7d78e7250f5c6557293abd754e26f5bb41c1352ec112d06d4f80f8c8fec54af5685cc2e2941d6cb44c6c9f7f4a6991738e6f2753d1e7e788132fb7dc561b0688ca18ea4a4d7202d165d2df43210ae6d4e15dfaa0008b85aa60c79ba46bfd860b677e2209b14e4c68359146df0b069eb946d439bc8a4e0b020c6dd81da816f18b48a1db1185be68abd33cdb7be707610b1a1379ba1d57a1d526a7bda7f4a8e943330f898eb26ddc933406bd7eef71d9e9b8a23a4d491ea5da4a89bce884eb0be1f476aab6c8351a3b00452313f8106d91189ec94e22e8ef041b7bea11437326ba69f9063cb4fdd91bc222dd9bce0396c4621cf492e6787a63fb0a8c101d821feb0ba819d093252d40e11758cb52b600a24702738a3a9f42aba785a692f3f07788446151ee8d3ef9b5fe58c307a44464e162b2c3d682d7cf631ac908f23879b67705af941e8efdcfcf13585afbb229abb124e7c4bbc1d8e8aae000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400123697e294d9eb40cc8fc3f670f271224c31a7b0ede7e063afda793071fa40f6a02118d666af5bc1a155eef840d708aac1fbe8c8a8379d30fb889abf8e069f1ef7622744486489a20b9c995d4ad85e6e702d6fd5d9cd6e8802036fc47cfed5b012e00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083692c43efba757dbb2603291ab4c190ccd058e3513cfadae198546aebb9fcba8ac94a4d8b91a2fdded95b68fa26e100e05ca2aeff8278a8d6b7b7b223139797e1f58450301ef4b863b3c901b32fcaf3c57c7282354684a694281340f4eb23df37b913b7fe2f62e96575cd7e56e358a519855217e522e83bcdb6528390cf446b39f15d3f32e822673fd965975691a7d1e1c6d1dbaefdb658c15a9827cc1688787757898241196618ea9d06f48b16c8925e267ea7511f09e1f8d9152e55af72dece6cf1e36f0eb84a54d2215ab19ab984f50304353534fc3f43511f98faf753f5908a99ff10c9edc19a43be32d0942c27434a8be6a8791dec9dc6c609d21400bbe6b359058c5011f5979ac383abcb754fe1bdca334f3d1a5be559d973aac041b65901edfbc68b252a309f3f564ed67d2b257e79b27b3b0f7ff3673d8378051cdfe0332b95b3f1dd5b014d2e730e77c3c3d860cf863a75063ed6eccf7cd78df71b100fa97c8261663a1780f8498b274c1adcc3c9690a70c7cef2f18edb141d5e1110dfb053c2895debf9194c9096b00adbd2dd9375c653b53d1c7eb5ae251159bebec63b4f2967aca3b3a7f86b56bfc1ed781b769467770306dff0ddfd9710bcc10000022800000224000002200309b790406b406fa0c2ab80d3545acc83a8dacb86fa2a6b36a481dcbef745d6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008add4816373c92b1f1c22bb363c8066726852cec0cbc6ab434ce47cd52ea29bac5709cea1f7b8b09c6f039e926a2687842128d5ff608446a1341692a6a7bf79716a06bfb3f0363868b4b081c8d90e8a451378e20370d1f44a8b95b166c41290643f45d1ad1363e36f45b41b77fe4d3aa0c5bcd17a7260408a4d54b3850431bc924abf0455628ce1f212b08c8e12a4d92057d3115dee123b63e4923f79fa3989ca2e35d80097f05caaa01fc7fd588ab16b69da1a63511a775fab241c82f58ef67bda23fb27ec2b4a266a97290acc0e451c9d07d8d7a8e398c68020bdd67596aa36daa930ee27bf83147099e6d3a95ad3bab54371e80aada24e329cbaa3ff891bf751166231d52f1be308c147c5ad07d2e40b869b2b38b9e4cd8fe72e9b56268c1c6ac8f182d9439dbaae03e8a19f81b179784f3ebfe149b2dc325c453960f0159211d7b6cb24f071c3d026e279cdd4fd7b8afac5350dceda0d465d1a664a67f005ac3bb680cad381dad596cbea1ce975998d66279a2978a754d10b8a2b5d2765f4e5676a4dfd11b8c0ba23b4ef0427f7d234765dd518c38de735ab09d106aec835091b45fd8bf20a5fe586b8dd976000e12956635901922b21844d4fe2f8914d9000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011b1dce861074d0e8b090fc39f5a12a140c74a42c733c4aca889576ba7427eaf10211ee42fc8d4d68b7cb1c7a584150bc45a7339e0999a60b16728d3a7313f2f80108e8fe4f86a9c4db73b93276bbaa517abd6fa0b40e836c910376d0ab051116d1000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6a45495955c3a08e6b9fd486fcaa9764f203a22027f169d63ea5433dbec6b73a1acea774ee0cd964a03a9ef74e3b7ce96645ead3854baf16a9ef5a663ac3968e697198960ecf4178df22d6d750e4d830879942f77adc715a65f22bfd691c3381ba6598834ac9c322d270944f3374b8e720775b1fa56575ef70cc521cf3b309a8ac63da50b3da5578be8371b21367c584f1e2840061a24ba505c50ff4c700ceca38172fde4375f0fd4d2dbd2ab9790f720a8169fe1ce62e358cba3969921cd64e9f9e5c3d842727285ce746eac4aba5e830996cc401b078f23d0fa8589cef9a27d1378d1fe06f37ab46586a0cbd79d5f2c23a3b390c51ea9f019d3680801d2ce0f0a0d55d6d6de22c337abec90e0414b8ab36c3fb10328cbdb4498aaf76cfcbaea59598ed6b31763b33d486d628852431507d3ef9f1e4ddad8f5b32265fae9d393ee21f6d041983c1bf36df0b05dfe84c425be92a45bc5c8fcd0dcfdc3681c7716928a274627070ea94347bbc7d4e1b6f485f10de2d23fb777f1cbf790f72767f2f0618b99904d59d593d704b8d680e147f73a26d1e0e9c0f486bffbd8497d4853cf6a66418cc02dc8c99e7c86008f847c104bfa1c1bfacdbf29a40fae5e71a500000228000002240000022004cdf8ca5af826eadc59e8f3f8cbf9d26e4dc3f6e5a647be26cb3af25b66b8260000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086f19b4ceb19da4ec79443731b0a7f3cb5c9ad0694776d793b2fc78027ba92096ff88b898dbaf7e975138792ae97b0f09251e07a2bb687ead801d2ecfbf2223fe1eb976cb1142ddafd87961c4670b7da195b2700bc84e39ef7929700c05bbad5c27c004ae2104a8d7c1b9e3e673cb1265f9b4a1235d6639990fa79b6bcab323c22b15dbbb5a1acabffabba6e93b787ae7a054ecb5f6ba12e675bec88283d6b585d74eb1beb827033cd586d6968097dde6dd6887efec9ace9dbffed49568fc18f7555c5a704ebd0b0e31c604ddbc4eb352a2a3447bc7e702a07bc4291cbaf0d5b1becd972dcf306f4917c6c19d5fccd0a825a11750a2b7fafebb73c6c19859768af38a7f0d0ad63a925b48c812177a966038dbf7d96bff9f99c1412c5bbef0ebe1d572920ebc337883048c65a9a8b333450a16eceacbee065ca482d01a2e3893e3f9da24d12d46e8b4b14c6164fa9d05528cf5d04255fa74995b7ceb3f6132ef81b8f9db6158fc2b0c36850bfcdf2983650ffae0b12b1f9b8117ef10aeca750dc72e3dc56222cc577fc6f865856c8afcaf3c609585395616dbfbd169e53e28a82f2812598a5d81ac2df8b4f782a1a71de5c4ebd94c7206cb629333dde31006e62000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020419ca9ffa01de71344a037e1636487f7154ccf7e55e4bc5d5ea214c6f40f56a152fb85a3c31f43777fe153c4a5e9531ab16c10a4f41b9806a02250b8e5d65ce02126d6ad9db965a7ae79ca9804354c2e6e43764908d7ddf0b86f4161191ebff4f1582baa2bf13741d93f5838e225eb4f2873be95939c5ea660a070a6fa335602300000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b193a6ac089945c037d4498e7875858bbdf915111d27387461793edde8d969f4f13a89cb266ca0db6470d287df7e6777347f2111f8a407605a2840b99cf225bfe06f9144d2b69624e8208a670c5d0992f9be2dd06a5d8491876798408b5342eba851900b3fb3acaa899e40c4f6747bd8bf176f42d5ddb3d08878a9a0d86fb25dcd70d823f31405f411e20f76adabd4ef98bfc15c74a54ef338509676c41e792d231efcd842517b988fba6da17f2f912c563361546055a355a3b6ead6389b522b87a265bcacfdb01a7a00b61d8897be07ec6c972bb451bbf258a62e770272a6744845bee8ec73db9de265112fb1e0902a7db84f69e4bd3413af289c6c3fd969036c759649d2d2fda520cb119a310ce5e3c1ac694cce9bd2a49bb071d7118f5eef9e7896c3eef170d0b3958e4acc250eee7ee046e298d683bdd2324fd88e216f4ece83bbe933ab07ac3e1a4ef8a015dce923e5a24f6e755ebe3aa9a082a9fee0a5b9bdf87f76e598be195e729c6156b302ae88952d1251b00401b4530e4f32409076506b32dddf5de19d6f306c3188faaf8230647ab0d669799639a409ee6d6d27dec60e46274d3d1c92329595847c8fa19b6058efb9b97deb843fcb3d8879b320000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000242e191586193ea27e20028c6e532c73f029fe4edb5af411df121bac68f8009329dd66ac4b8cc9f31c1e0c2602250b2f1ce47c0bbaeaecac00e99ac3e6ac1f1c6b8572e11ea72b46e7964d4c475e398e79d02f6465265154264c86826a6e1c6b2db09a37b5b09f40fae202f89301295ae79730348be92610a44fca6a88eee6fb29e4f173acd00332415cc53d841cf17f34238e9fb153348ba8f5b75954e7feea433d6e062b691dabdbd72d4d44f6408c1724434f0d2a1e395f30c5f876a79d1b49ffea8484e8c5c752f2900873ceccb2b727a20b4188005cdb5a7b4a8413beaff8a491c50269fad43c76bb8ac77ce700c71b4c2fd75967e27b70f81a67b446dfb5cca63d8179858ed1cedc483d13809fa82eca490dbbd748310f7984e6c16d14f4d7814e823722bc9e9265939d8e1dbcf4632004fffe358a0293674505418249e0176d9101a72b14db2de044f85645eca4aa2a31cebc19f5d0b37e45c3baf4324e07e3a4da8474055829f1ab0bf379657fb59da942c9d6be84b4479714b17bfdf118d87b24135242ba06c8cf0d8137d62fb7c9e34a388615a3230f2960fa8700137f8fe66debc274763556c67a017b01101d249f1a207f21c77313408d990517000002280000022400000220293d8e2d2412f97d9a1553347667ada56b023a9a8b7f08855063beaf43e3488300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000afecc3fc238afa7c5766024716a98dc1ccaebfabda1017066e1ff6c4903763b37d28267ab96d6d12a9d25334271b6b4a277523abc384048e08c85090043075115963a49e0c18eebe476e4045119e2d80aab697dbfd958b5e6289b22d679166c9ef7642d2c9f3ed9827fe7cc4de4281aabf3f3794433247ab29ddb3bf023c76d4e8abcb5ad0d92e964f0f600bbcd07ef95da2ead0e751092630bd90da4a1e0230253d8eab583558df43aa34303b8d3e72cc8c11f980afb0bf2282f7d52cc2f41c19dfe4723b93d9c2f461fdf49ec1bc29d71f19ee2b3fb1176c3223518d39d9c115c15bc679d3f713cd1046a1611573cc9e9f685ad8ba764bab28d382ab6e23628148311584747644d2030f55000ea1a55ca5845edb758385ab3e172a9e97d877c93ac770c97d1728d1923d6ac13021128a39b0e487b124cc1ff3f7616d68de0ab774f6fadc46168c0b35f51eb484550125d68e213228ec650dfe3da74984b70fbb16ea02279e355392b0b0553df438c72d0fc78bfe983a5f7b5164a8642896aad71d55f0e9af63b0cb75c9d6cded79091c19b892c3a29058003ca4be3485b7b3097d9f276955b6ed0c03290095c1a14d4e8ecaaabba32717f440498685296180000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011a941c9657c87090483f7f0b59fbfe81b5cf389a5fb6f8d89271081c789a91000212e6aa93dfeaea0b6cbdf92eba2987a8f3106f96ad0c55791ab06c0a599378811dd5e9819683eda4c2384b077f2f47f1c33ea5be287a525fed5ee0e3cf9e278800000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093142bf6b4782b74b5d6d5301b92995b73559d60ac3d5d8dd411b8ce1326f4ccf8ef32a31906c02b722693cadce6fcca1ba0203d7e147ca19dd945876b572b35a5d2f823b3421f768e6111ab63127d16197d24696fd12b344d3ad5e1145680c89b6179bed292e2b7ba7d8652537be9adb7e66a633e40793116fa50cc6e6c102f4ec6ea8c4639f2901082395dd826d13a0c7cc3afd0f648962d39ed69a9845226378fba7d7d9a49af7fda1fc578af3b530f0259ee158b2fdb594e31b1f06ba64a2c4f4d8e04b626cc58c0e52bfa4257f42215d9f871f8ed19a5510692fa2ca49bd7b5d7c5179e957db90a78d82cfaae97fac172c35149aee17ba4481fe9f22e373e0f00a20e9eda6e632ad0a860aa7644e3e18d439b2af679fdf3bba3608309c4efc1f7a4a1585d97001b57e758b6f38e467cf3ef9e7964bc3e00e523c7d81a5286fbf612337642d33bfa5ae0d4c73463b906469d96a1e72f09c9dfead716c5956f332700de7103c7367f532eed3f9f2ff302b01cdb82d8c85feb895f0462abbe93e66f23639cacb349371e7579f4d0b91397daf1715e1fa5a16ffc67c9cafc30e8a128fb1a2537e21469dc9f4cdd4c67799adabaf2fdafdde0d744310a35aeb0000002280000022400000220280f8438957114c7530e81e26a8d4eb697ecc4f73f8a889418a5a189a2a5140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000172ffbcc192391bcf1be517d25a172a97fa7efa90191a7d17c241897667a7ffce9e29b3eb4b01878d06e811dc73e24a22f7f2333cd656849fa8f33c3fc38c5debe4f3df06d7b1efce855b688f75e8598d49a43c97b54ce614b3ab1841a9bc75b4df66c84a700a65e930a30e79bc2272f34910159f2a1e26d748752c14d21a1bccd49ce8c74a3987a236fcbac65855bd055069796e348bbd140f8d3b1db75f22ffc2de9f271528411a9b4150a7ff17bb5ffe12e9e2acf8dd18b2d28d4f0eedc5eee48d44c6535376d32c2fca20285ab179ee0d952fe2dd93389d43908cb76b540f2d5ef38f90d9090fd8dfec9be9600b7c3eeeaa9cb18ab5b2539f66c1207f4e88ffe5d9fa9f257cb5806c2b8f61185c8b158d58133e57e847c72a2d5874e5cb34c26fd806c006545593fea522857811d936a0afe54a3960e4b4e150cf183c337916f5744b6eeb08449ae963675775b4dc32c4a5d7d24876ccaf08550e895b6b2ae65cf1860cf3aefb5e5a9e662d26512adc10fe2825e8df2d8e301f10a027f96a061b78e070cc2dd124c08d092dd582db10c4afb6067dd11b967985186ccaf4cc55f9c2e0a725789f5d3479510d8bd26dbd62fa6889424741e32e5f794579d31000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010b377cfd2e99e2d928f0ed6c7c4fa19a7fb3e60fb73300a740bb0ee8933952c40217aa6c047eac36a9614734bc66d54d3a894ebf9c66a6a936166de3a0082e51b51f9787a36bf3f8aaa9964f638e4efe8967fe6c6801dd4169901a193b2ac1dd140000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d023abb0bc82b4963358e1841460a708ad0b24393c993949068af61c260d83ad95cab46072f2381e0678a5add54bde9f1ebca843238f10ea4e2ef5fe6bff7024437e2b2cde921d78b4f6cd760d00f6047c2b84064b881cbb2b5fb1bd8adee16957e94b10b3ad7bad0fef709ed5e29e678fea21724b0aaec47d470f52c5d6246d91f10dc1ced5756256f1a6e150000cc5533f2f36671d4d224f959161c6e1c032f8223e28bd5abfef9b8cc533292e395430aba5a914a25140536915fdb8a8382cc8a68cc16a83d666c60b569dd064b387c980387e26bdf9f06dce980abeb74757fe29c5ed92d79ac76e64f19b92a955d3614349e847fe529a20034ebd4deacc7b11491f498e018e828e55e4ebd1cd6438df7328f4d7ae086a15a330c0c4f4b522a30e5c16d1e9d42a0c6d06319f4d2c9882d0c6e270f67c892023a48bcd211f90a9d7e60b613d4e9f9c931fb2a1bddc367895061d35db246881c6ffb50487198d16dbcfde7ff090baa8f0d5ef42ca524e9bce91fe32debef834fe81b6a6b04fee232f972ac55d9daf51e1abd9cbe23b1eeb97ff4faa6e2f3e0e5d18889ae58d44a93fe36752b938844c7742e3c95e6d1fce6f9f1009afefcd655385b1949157e00000228000002240000022008e1014cc9d22a3e7790258016b1f70457dbee161ebfcd9c7ee43a8ea1eb7bc900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a570b8574ac2b54a0bb46eeba5e39e0ab2512e1e92120265306e784c725c29800005a33203945ab63b0e556e83523d482f6b502b2c67e8d314befd3ee97f873911b1e992e34cb1d7d890d7a53f8ea348beeb317cbdc87c75a179df6357b5fc949789e81578a4514ede9bad54c6ee70e5cc2012bdbf740a89155300efb45032cc1f46b84cd7afc6df498eb844d690f1e52a83f703f9bde5e3913d2c48955a935f2b824e527c97427be6ad10a123963ea0e584e251d059117178f88dee35767af5813f3cfe28a535c372a41502dd0891a9cf06d5120151270c6f15019239c4ca32d9e1111d41d7626510000028b81b197990d37d53ac74c889d8c2c3a9bee00f4aa41f74646f584d460cee1ac42444d4831acdf42fedb925e185baf9ba7e447801f6bdb7171c0e19a37de14f56b14c7449ac58d3ae27ddaf298ca3ec33b08f45fab75231b3aa5c47cb8c1bac766c44ec0fd8bf4524ab35adf9f5316cb19e22fa201d601781e7299883a47a9f80fe1bb6e49bc1906c9064ac3e617082153febc8594a8a0443bcf363e13a59a3790425ac7abef67068caa0f1f553e9c70958a5d54b338c076d2caf6c082260d9b73aeca5dda530c7c7196e9ae60b30e02a8dbf002d000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002152164ccdfa363c9b51d5809a01ea663869054a6db00dd12c51db9698f848aa917422dcc212cd2c14a0efccb92e1de6d66bf8725d6cf4338579b851c9770b4c30217f2e47552bc8e3820a756f6ed8f8d6316bcc2ab02520412b4e9f5c3500b90142c0c264965867e99e9695c4374cb3bc3e68bb846efc3c4ec9e66323900642c2a00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084ed1a36a8b843e37bdcf29171e13e490d21c18fe713b43f9524aa8cdb80063c6918f2fa3b59b89b56e8406918606482aad01cdb5ffafd452d996b8342a3832bc4d3c97aeed03282f1b53542d4131a4279116f19230361c487b4f8809d51891023f9b5ea02f61e51a9b1ccce9ae1ceda5649d6274eef2fcbd5c5c5cc666a918721852eaff1626258bc8920738e0ca3bba56b6bae88b5b9cdce181123c7dd2549c3095bfdd7c5e253e6d7245a7e8b67fb61f26cd37a53d74d138990c7d8ca9fb66ebe8525d047c68579fc9f04e43502eec09941789758a8273be9f9073f881b3cdedfe98473d11e5fd5f870da2dc890605aa1f9f7a98d4da0f42b9afd4ad635e983fec729a9ba3eb3179f3c934695c19401994ea691099e51c0a488832fd0bd4852fc20f342c02a1c2665220db5594785d71d5b85231b42646d9d883e0b60165275b1669120c675169a6e95d6e4f2462743e5cbb6c92ccb904651d774b187293102ee84bb68080f6cba4ae9d3a5959f489dc050a10bd021d757e6bf0ccd160b4dcc04d9b582c85fa4e55d91cff8e51fd0f401f7b3bd950e33329f7814a389e96d87559c20785b4af9d9f4b40238152631aee62d94cac4fcf560d7cc2341ae190000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000167de5e782a8c3ab17f0db7ae822a60f1e8d6303ce57a163116cb9c0cfbf2a31d12099b997af844809a1113931566add3f5ce9252bc114ab710c5759fdcce66164468653891c2625b99398f7fc3019b8b8b534eaff78de639b49470deef20c41b8eb98ba7ac0826e5c51ec151c94fca6641186d48365d77aa600c5942f1a5a3123f61711b6e8221b71e77084b43cb87c327b8aecc29fcbe4328d771421fbac3f2203550351f1e946ac79997384c935461fc5a0a25e388f09ba0ba53809f0cd3c8e36cc0217251df028b58bc96b56ca3d4d28d7169ca3ea2169a411d6767fe437af187d61e84a2733f1f67ac58961082abdf407f355a8946e5944584a7ccaec5d637e980d17a01da4c022e5adaef07d3eba8f6528e1d44cae51659eba53d90b381389de0f667dcf505247ca27d6bbe4c845a6adc34af6510a7f6ddf3bf136158ee9a0e0b0ea68e18023263c30659ceb7d0649eafd3824a8e6e08992a7c024982cd3756c63e386e796231f34e660ba855114112fc8704cf85b18bd3770e37952e4f482cefcb24aad06183faadfd18e8a901db943babd1f7b47230abce62e8049ef21485d06621ba93edc0657d9317c96be6e57c3a9e10ad97a982cda17cad8523200000228000002240000022014fcdb56a79e2dc6aacdc5ef250dfd07c6122732e2e869378a36212c4232043200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5324a52c029e39bf01a5f8ae637c1398da76c6cfbf16f65239d146bba7c82756160ba77f37bcc3b07388be93a3babf8e15e35ec4786afc6c5c1c9d3e2cb2cbfad1f3d4025f3833953c9fd1ba85a6209a6a75c390b94974de7e6b4d4423bf89f17f09b2f045bf92009c8cd42b6598302d44e71e03d9cc4e948cb06a50df5eba4db292a2b19e90512d4c6c186c3bd3f742e87bbc1b761cdf366269434dbc386e31ff26519478d64d54148b35195c532b3019445601825c9d5effb841c7873d0366a94981ed5ddd18a8c797b2f6f6f2c3eb2f08f3e5ad646b769bfc93b0412a2c133a088d0488ee512c3354cc69cc207080daf5c4294eb9916ae0be36965d1b679d366a7542528c99078298a47f7be3a9584374a83b9146eed796837a6ffdee64b9a5bbd99f85b9a192682c71dc64cf1449b8e2e52ec0a3f1f09dd54c3262ee3def900bf627b5c33d3aebf8494bc6d6d3a7db1846508cd88d2f7bb7370ffa1f134781f30cac8b2c097715cc54b81d1756c3eed585e8378737a6798a3ef681d35b011f6ba702f1e7d7a937101f98bb5158b164971d904df4f13f20204d73c04cfa9f1103e86381815f4d6085aad55f7484e7c5f45c5014faf66304be2275658ba88000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001028e243caccb8f2af59d67850bdfac59a6618ae17939467fb94697b3049d3efb02185e1b92450517d72e858915432ef360338b7ba4d988f4321c3db3149183b3752a0ebb6a5cdcac81880d69c4dffb85b04911be2087da6849dab04d38978fbce30000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b33e7d5c7ae2e1d616f5f6d2205cc7f3eb7faedc8505e7c21b7ecfd8eedfae2266e35979f3540e8467df4d157835f4e6bcecea277ab7f26008768389adce813e533070cb66154c1604d556eb41d50dea3fb790731879b81fcefd0696d493cdc884d763fa280d366c02aefc96abcee7fdcb685c4f13205d431a9c8926c936e0f77f553d1b521127cbcd2f58523effe55721e5c1ec7e3173b93289c439cf6d8c1848c4309d999f873819c7cefb8c32a6e3575f5afbd0ebbfe9d24742eeb351a7d32a0e3ddc3649b101d5f5502fc20e6957e5290e836d5a26aefc3532ef9c1e05ae08cc4116a0413365371b38e867f0b2c3544f5d785b0fa6eb888b0b791a1df8ac963f5477baadc382d1392eef8eda843da0297d31ff596fbb8076696cdab0465572fc744ba14c52172093dc9e19b80bc72c28fa8c10489199454c0b24fbfe61a4c35b36567684592cf58844348d16c7c1ac5674abc74d9778a1fdf95c3762b4027b58f4565ed3532237d6a9fcdf1d2abc88e87e4556363c8a80ff550dda7eb8b7494485d733dbecc64e2ef044d4f33031d19dd33688a246c84446dfdc65c76d841b81d33609240f17308a9af5148d57b106fe6b2a98a3d7c65e077b0aedd9d2c0000022800000224000002201a5ae5b49b1fca851d2cdabab7c262ad4dba97f90951b0b30a81622b36c192e50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082f41e002a9f260da32aaecbc1a35ae3020d2e53c8088959691dfc928191d710100cc30d3f48c81d759aac940181887b5609e70a0dd241f6a3b820478822d100f451abd3018a2785a0483dc89e527679bab0aaf20dfef475bdd475bd8709e850ffb7f1bbf18a7436fb8e897a29b43991696d97c8d09fb54e4e27d45d451886763b18f54b011d886608638f56e27d685386f5377635d5fbbe568137cab9e473f0f64967e249a04547b92d97f4543e932d74356b166f49e98b92f35d2a0c3d66fd2412d7402e5bcf6d458df7b7ac112f1aa7a18385e09df2a1616680d2ba4ca2940178403bbc10b63184398fbc775222d82b74e9dbb6ad021a9482b35c8885567a03604489c4e75a34382746b30046e3087fdfce7501fef9c8aaa3bebb326ee3ca58fd766776965849f0bb0e428a26e3d6cf539ef36dd7b696ef8839ba64b3572dd62df2a19b82b6a9fbe6af422bdc27bdae9a9d2258c003c54b901fad6a343dcfaaaf93406276f1bb0f331397e4d0f1231afbc36fa661247fe16cd208ce2dd26b7fb8c108a47b382877ddfd2888b81fca09761709f7338918b7596fdc85ef2d5ce9c46e89f98ae4e682464097c2dc9ce39038daabe0dd3a8aeb1e23978ea58dfa000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012ef20e00ccb49ca7d375071d29d31a2b593769b30e19ab1134c244d7ce97a997021a866a7cbe1125b68c39eb4155b7989f315c57d67850f1e7b4148d0bcfa3cff31e7d35d7ed7f76d89d40ad0b9ea12646fdbb6747ab57ad8d59afeae092a08bfd0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a4aba406b341036f799c01a5635c82c1627fe3e45c74ac8b73b87f3b3392e8cb0eb0c52fa844c689f3ef32bcc846085fd0b3a87e4a21096da63eddb6e238e7c9eafa660210a865821e783cea47759c638b572ae1bea93ff7ff856efdda474bcb0bc8864765a13367725386e36d568bc976a4335305b8c77e8ae8a9bed3289472cf19ed9f5392d69a0855a45eef2483b726f71372a450bfea30cadab47a9743238247599df6d09a5e3370fb22875416fb507a5ee1e97717155db6cc71ecfd691a5968e4b53faaf7d1c5908a7b331da1663b7bf8ccbfd9efead28c70c64f73fe9e83d692aecd9a0df13be1dd53d56e2c37fc95d8511d0755305ce2afe438b1d707971398958b1ec6e567401e730345dc940bdd4d010f150d81eca3e37605536a34d982c8ae086d96e1412fdd9719b20d079568dc34b6816e31105003413f400183d6a2219108c4bcf395ad467667dd77f5da8efe7324205ed0188d2a8ec2b366f2742900c0b1d9f4a6eaa6df1ff05fcab3693f8c1333036c10f03863ff6033c395a5acd434eea1ee7a3e8dbf90aae36775c18f5d38db0d90fbd13ef0acefa26b7c123e8f74b6568385edea978d6c9893bb0430083ae328b30f1b2d196a630d2ea00000228000002240000022022d7ec51fd092a05227d09756a747e7c04a419b6dc5e40a06558afe12566d4550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015ba46a8703333d4690eaed0c347b1041a0c75ffb8a59569f3809688ae43646bc78c1eed7671e808b423125179781bcaeed1871c3c50eb05ce47a1f1082841d7635721d1d019c13c58ca49678fe686baefd016a3aebcbfc0026a5bd0abe8d9e7457f6cfc2b02e67cddd1fa1bc494a7013fcc447c62ba91618a8080545c216cf7f68d26061eafee8446dd60741405625b1d4e4767647151103ea8234c294dc5e96cc7a59563763dc853666a0c54f200af474f83dadbd98c0f19604dc82e77c674b85ae58909a074b8cb05dd3cb314326f45d2efcf70955d0c6e5df104f74187389105d4c6e72c1573d7254bafbdac0e1aca04551cbf3acc53a5955210abaa3126715285a4d85b2fc3320b88f976851c6bcd8cc819630a4064e8c64046c59182f2658214963e6b7fe87f9f8880f0e4ca5bddb27ec1f49e45cf7f79bd32a765059d9eac3f13f60e5513b8351637cc27b4508e84c3d9ce4c5de9411a903dd25efd2f868c4d42e53679e19f356430f768576a929eb13ef79ddc9f2740fd551eac6e4f6ba68c73bf7eb1dd5844d72901d1844cb74c798dfb65fba1a01f51d0a7cf5a22910660df82b682873b96231896b47e87d8fc26a3d6081e85e9588d9df28c3ea4000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012411c669869ee66b5d4a8d9b070e07be2b17f9ce15caee24486677bfab074e7b021b5031b2f81bac416f4cb560e7aafba98a1417a0d96ed414f9cbbdc733f7e5c72304b09721a561ea012db920badd671117a8607997a6861f3071bda31522a6df00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f4206bf9f6ec58da98477a75155850192d3e42b44aa12b221329990d22c115e350485514eef20e44dda29ba42196988d563e562a8a8410a1186a7e31c7f1a23d6eca5b7bb5f192b51a9ed366c785ec82fb7c7d47007336ed28fdafd6d14b56f62e55d46717659f6d44d17e532f2309eb4c7fe456a4de271322bd04d7703e81ee5f1acb6c65829d5ebe935127b854a3eda60d82fe2ba0ee8333d6912cdc6560c18c84224a7644df17af1095e1042fd518ffaa36dda5163ca0c986f90e62f376d121f2637d0eb9954b30aa342cacccdde15614f776478f2e93de67f6fc7fddcd35fc83070ed835067c7c80bbfd789692042c6041a21cb1bdabd167e0b1495152f18deefd7236ef589f6f56ba039e04f27119aed33a7371604b1ef54aa3d6a9730ea721a60e1fcf7cd6505bd9f967a121d68423435a802903613886df1ec04102352197187aecf2469f4ad073b0e1160de3bcbd9838c0ad7ddb0e1cb094d746216e9deb64227d55eafe55e63b57e3938c679ba1458fa12bebda85c60243b55a654ad9c22ed596ba0e8f953be5b266cc5df62028808141d58d5207a5a2911a95548633e873f26e3013aba16918c9a2be98d0a4adae2a9f18f1bec7caa236de16500000022800000224000002200e905011616492b8b27648aa3647744a181bf42f082b9f2f27d7d6e8469a18ce00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9c64aedf446bbc1abf19c54755685a8d54e32a53c280cfc97cf4268254de64e80983f36b3d8de27996f82e1b1d81b60aacbdf1b7bb3c9e9ac36411a5620c8904f279f25ef10a61eda08d6361455912477455ea6477b279785ca3cbf89ab65e77782d02db3607d5162e49d40d54d7f3444cf6801d3ace3e1cd9c0fceec9aa0881709cd1d8bdcea258bff3f97671f1648572f38fd7425db1110158d6a38237790ee3dd8b09390e12005f315daac63eb57a7f845e61ccd8d3ccb61c4a46aacd7fae7cbba044bb5bc7ea07667c332de70dc5cdc0015152c8e5753dfd6c762efe7e1f6c423580bbfdc995f289deff925ae221990c7e8dcd42830a01f1895eca193dc06fa2c0c2910856033d13e17897fc567bc449431ee5ccb33b4cea845af84fede97eac7a89f353e3b9cd3eafd2ef5b60772835076e65511dca236c0c1a303d20ec9bd39ad6d8e09404cee6f91d5e46ad11cf2d56c83927cfe7d8abdce7bdb11892293e0ec5c77a33bbd4340ceecf23d8eb8b2c16c5d0c54e77a627c537909029a02cdd3d8a719a3910e2aa7219abcddda75cb007baae2ac2c9588b553c4559d245fcca824184e8895c8de0382ce155a1a84f063c583d507a895b34a0f9aa90f72000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011cfe343e5f16b4cdf6896c268f2accc73b923589b8f4653b7467d18a3928588f02276a334c0f0d29e63c1c63cf5b9d0ce68f0df3b35f94e615655b75b439d1e9330535bb398ce6311b3104ae6f52f131effe9e798563b16525f826e08f7e5b991f0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b394d35baa302a3b93a5009ef14707a3f2833ba8fa0ab7e0d01c16ce7841f2dbaebbc0ae84e507f6b94c21bc1c667dd03aebec64a46446dee070fd36a5bcb63232fa945b5cea628f8718459a691233a3d83c39ce248fbce93dde45a583a3c1b0196d515b25508f7648e67ec59e403be2dd27f8f5f09ea97abaecdd8cd96e7adb31e65f2cad932083ebe0ed7470337566efa8484a0f35c173913312020d81e678e88ffe9e58ea9e4fd1a32891b49a8757b3baecaac490e064e11c8452bc4c47eb8c0edd8e047605448eaeeed891fb8f0dd7238b2ab3fc95c7312ab1f31742bba0f33570424326d90bdb0b7cd4517d7044f0d6d7e1d60f111348e48d2a206ef39f8daee46c47e754f340d6953ab4a83ad50b2a1961bfb6bb2a927ed5c400eb840854385280870c6a66556dd03224917e9d0607b4ed14c149fd3b904b38c7af75abd9639f3f0f5636e825e2cb02f0fa225df3812e81d7e9bcce09e8ad86af6211181fbe1975b75d001339fb3b14b21189c6217ae71d0775af422a489fe8f6e48380150dd56da79378f68df6f415371797fca603f528cd5a116824a75afcc2a348bb5a69793d1ec6b409b19d99415f48298998ee800cfd8dca4561ea4aa4d33d50200000228000002240000022019722e85515933d1cd8e98311dc7c1745e3cfac4e586df6ed858769c9dea708b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008553754ee5caa5c3a0c71ae2bc91154a059af54c4d155a37e27462476eceb7f2f45f1fc561e3cd24790343952e8c669559dbaddaac7739040b0f1abc4705781ebfc3bf8c4e39ad950de2cdf55f8f488a9ebc18c030d6a5bb6c5fd1157222ab29949994a18b2d2155e113617ce929df212e3260e277122bb50e13e3d01c57565eaaafaeea15fd06c3c537598a0d9262c387b4f78a99e8ade957b58fc90aa16893f302fb16761652a5cc10aa279b3097761f1fc77b150cf931c6ca9a927a09ab3a7e30b05da4eaa07fd2dbfb73cde361da6d71384033a9e130587734ecbad4542f54d610a4f2acf69680cd27e601cd56001a828acc9e91f3c5b20666b6f38ea9dec158dd48c28222dcbc67e100db88bed77a11ea7d839d41ac8593df3bcddbe30ed56b21cd57f2ccb68016e255dbe49d7470f5a64800f41b14abd4d95b958e31ec3b2ffa6d1375147349e8da31289495053d704169f84a916813c1b86ea3d615cbf38d87efe4fbe589ac662a9e88def77df073c7f06553879cc42e49ed933b9ece499c97d035ebdb6418ff309b0cd2b09c2d33d5a772f91a946f859093fe593b80b71b2ce594e47526b2eb71ca7bbf7e961609d0986ccfe5f20c0ca566c64089f8000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012ad992ac45ecd04659acdf0ab1cf9a07a329ae176237b6befae9850bc1a97b4c02279600e367c3351cb6e3087a37dc3e0a577fe672c8edbc045ba973d320d911f009dc0127b49c417329c08a1211490eba23401b8c42146e06add2bd60ac837f9500000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086369528837d7ed5aa6bc24bab4d3f0ef55e4293b086a605758759a70d359ebb30b7c559b9f6e918d4c9ecd4fe461aa0b4305e33664b91c661f27c5feeadd942fcabf991c4925a778ed2efe5ae783fbe78dc3d88368bdd7c6fab76998eaf2d128285087c86ff3a7ea445187914dff81df8f6a8494a7e8e8ddfc066cb8dcb113160a55de0a0580bf390d1146e9d730edb96c224e3a04c42134c9eb4cd80771b88e83078c8f18de61c6a74df7db4fa9c180d8ebe1108323e0344acf39a488f02339416c5d114d42bb4badc70e6c956bd31f9d9a05257cebdcaef73856df60d29c56f03b196bd70dec74d72375afb29ec126da2d6cca0c4a68c461dad7dd93de5d95f3c7ea5f94909b8a2b50257a4ac40bee50e2f88f9195913bb84d3b92d082e99d782078192b61d912319a5853cb5560056074d1e8ceb5e96b131fe16a16b071a8a95bad5e938ad40b0cb074bf0f96b5191ce0e5e76dfc88b793322f04d34b40b739963528ae99e71de08e585381fd8c5f42017d3328cc2918e7f590cd5449d47e6d74ca0bb1811a086bbc3e19df16104b9214b5dec77874cbc7e031712780de466b0833eac852153d50292fbfb3e55eec126b0fc629b4ea0740c67244c0936e20000022800000224000002201575df16df6c7f267b838f024383444430669b6507993bcbfc19456b1630df7a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002fa1431ba2192c13104308c574e35f9f8d7932c1297a88a48ee642cb94efb10825dea869f5d25b12a97d331f64857d341a6d0028f9aff5f166c69b9c7f77efd62f2038888607f1a74bc96be6e6d14655159bf19623329a4001c4497e25ccf6bed4fe254c8b1bf198cdab00761e419baee79ed3ec44203f83d25d912410746e3fb99ef00c9a95a76335a7e95fa590ea26a034c0ce03c02768fafc8b31180bc7d467723735b95a57f9b04bd93392b3cd1c817d33330f8bde1a101e4e3e5aa351bac80d5e363c18e71193a49307206a28066efec0bccba9ea13c73250ddadb440fd4fd8757c39f93c985d3c1a5b32671f870db898d007927727d4628c92d2962337839d0ecea4d089b34ce852004671ce48574ec2d30940a7c8c3050060375c548b1964cce666c09db3a188ae9917aa9c78e897a10e6804ce1175f783471d70be2eaed721360fe9fe8a42ad93c8049100acf4612573624ecf785277daca1d39df723b27a00ed5841e42ee87a97a6c5fed71d23b928947cc988016da082b50e4bef253cafeebeac744d89bd41df945a14f6884e0069af6b271963bdd22e52ea07959eef2decf4fec36beaa7d8193bf0a1add1d31c13adb035c3af1e2883485adeb74000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010be7a75b8c04a2bc5cb19219ca122c00aebe985531a2a8c940eb97359fc3da45022a06fcd094d14f0d7a705f57da696d6070ca8aee1b2b007fd8a72c8753efcdca02ef742abfd3b4400f6a84f380ec10d3c45bea0773120eadcc1fdc4bb4c9f6f900000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016472f7d9b9063842d2b761ab00cbce3e49e031d62e905339e936aeba718db17640597bbb6e7c1d40db872d4eebb5ff909951ea656ee13ed579d404301a442f027ea6a8bd709d34cc4daac1d6cd7e213fec74ed68c30eb1bde0023fa683408324de956007f7f5504a469d894b4ae1fef5fa227aaaceb9f0ea85c7327201a84e443d7f1e7a2ee23c743669e4d9db9a8239045d4075f56af3642d42be81f361840c5b6800a6baa3c6c280c2cd90fb8bb11f6fb671259b3b9215bd77d4a00e4c8ea9b7f9d3cdf29487f66f32fcb339ca3cd731b0dc2c5a746345ba30af8cc4c65fda417d6443881b30987c5bd331425ba5645682f778aaa6905a25ab9dd26ca90eca6e808009bbf05295632c0eac0a149a260931858221d1e65900afba3222e0520dff26c26731c98a3a11f4cdabe8035d61377dad26b7abfdd4b4b4d4ac9e4d6130bf32bbfed1c8a0b562c785ff1e6258200a7cd0e7c39e188de10a7598a832c7432f94a8df061c7994446ef15d61be72a3d223b8886503f9e95883c269d20f509e64c475f8b8244b03e81e4b757739bd0e46a9adf87a4fb336b2355c0bec5605b4fa8cee16da1b54a036e5e0dc748bfda3123e85b4d8aa5adef3bb872c46856bd000002280000022400000220126584ebeb8c550b97f33c758bdbc6e606ce1e69e3fa902f296d1d6dad62f990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e56bf67ef83f815bc5c991c261637f9c08ac190e2124953044f22c7ddce21e324dc1f88ac2211b54d0b3ffe17c116be54d5f64d74d17c5d67afbee8b9044be86bb534d1a22d7acaaa5bd4a97f9318fd7dec5227c24b509f6703c9c8a807fb25ea5d0db2bf979365cdcde57e294de13d144b3845e76818c7fc1291bfeab354fa7c868612564db0386d784a9d92b7743d9fb27ebef78bb02b35dafe8f381b57054358b9b236270fba1bbce3158da9a68b60b377f3e0c890589a55dd2a80b832f40fab156d04e0d3bcccc4c49d87f39e814121ae33bd7de185383cf4814272272e3b2a79494a1309851f0fb340d26e2d4eaf5d2c86aeaaf583f19c4fb7b667e53367c01428814c594aa6a50e245b1fba7755ecf40006f102b3376f0f3d9c1514f09a5d52aeead7d37d79c131082b23a4a4f34b52d0ca90463fac085e3453107c2e29e12782606ab1a63f8e7699e2c682df603ce60d61446e67ca07f9c6600c570231c8cc9d44871b973559a9c1e3d61a9f86b51940c4a64ef4899cf23d6897c13ce37fd5330d91ed849991577fcd413a94a74ab02bd0528d78ca2b1bbc34ba5861c35ae764d4bf47ca86d1778937bd1d3146aee449dcc1d9d2a6146912ce89e352000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001284b86d172ad448d3cebfcbd5c471a182b316772b38398fc890bb2807199d0dc022a1991c9b551017cf7ca8c7039606635ffc15465a1fa53db9aae3a3fbf1dde862e4c35c1973126766b74e472e8d8d0e3770e2a795ae61cd4b9dc7bd7f8fc35cc000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a697a66d11615ac5442a7d7ff6ae7a1553802ac20956329e7156859ebcc48d8436ca6b0b535c8c575d7ae6769fc3774bf3d27055c028d97db10909483f6ce82788283b25dcfbe99b2cce67fdd296db6ad6daf66b83e40ce3cb9ca4129de8b907043c40f03643b7686731518335be87ab7dc5c2a1168dd5015121fce5c0565e9aad0402752471e97aa63095b4d86db443565b7ce076ee894891411a3bbc6dc0cee0f4b7a129b60a2fcdfa96085bae48ecade59fc90ea53e00c252c0b3cb48edabeddaef1576b286c5129d47340f89deb5400a771e98ae0d2621770a84007872618af7c74e2846f828cd8ee2d2838429c710fdb0e427aea6b1865a12e2ecac744a638387999d9a4a9da36cb50eacea94f2be2050a534100ce8233e0430eca52fb4fb2392fc4ffd94e0f0ed614208b2794d5a1af5fdcf640b6cc5b767618ce58fcd92a7359bfc4dae58389865573e3310e4d546dedfa24b87e1c6b915f87e87c88428e1f1c7a7b823d121d51f067d90ae5537c5bd0d031a9aec6676cd8f6a976f318e7bea9b09df41cb03b4b15e0d465249566e5e0dda747adc56f29ed58253e7e3e35293d7bfcd0f21ce5393af186946cf54e61696b04daed0b5fa1f432270139c0000022800000224000002200dc721068c3bbf69e96532fbf411a3efd1ca14fcde899277bce0aec457622bd60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081ac5f6a0abeec44b7619c079c30f9010298d5d3647daec8d1038a4de920b158c4bf941d2d9c3b13e27ecb6c9dbb1adcd3ab87de1fa6e8822ab92b9d84990b44804f7c95c14afbe24c5778d3fe52eea1767662442bb297a815a1bbc5e89e38099dc081aed5cafaf160ad433f043691f2491ad0221558540747abd037d6368c24006f336c69292af3ca66cf28d3cc489058f25fbbf37b876abdbd0d6ca36c038ceb188364fd6a423837be02833cb9d63c309c70becb8d3dd8fd06c6a6974a47c00a144524b51ac54ed8d5be1ac5d215c290c886d6fb9ecf75bf227c440bcebe9c1a1374be77c5699d1e98b809105dd437b91bb2c4794cdb1b4b36ebb1e1597b38f013cda967c1b57623a68f373872ecdfc9e149850a2816b339dc62fb07939d91ff09a840a3bb5521f0fab3420b4637a78bb1d0fde926f604de32ba5ed16836159dffd9c0092b979182973fe6cbba68be6309b65a40671896497bb13520afe6bb96e0af6619351d600709a81cda471a68efe4b3873f138caff6e3d1a99a2adc1a2597445c87b8eecc4ef195c5d61a38476c9735fadb46122761bb50a54f9333f67ed02d38aad214ca5dc682e260911179388963eafbf065a345da95f223eada13000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400106cb03274567636a4ca06f83d7b8ce6faf7f02a6c53fccb5ebe5d61012e5a0b3022a4ac23cb3a55df59a84942668c7a907b3e4b687337613de8d41655a428c7f5024fa074499c0ee538f66a3defb4c4b74c8106c66802186f7491158b32ea6f0390000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002618057d2a1dec5c603a14a9dad587f5545f917ae6874d0f713c424b66c862dc85b08f509eb7d1109261f87fe03a50a7c800cf4eb3c4e0220ac4435cc3e6f3ec7a49fec21ba692956fec9c275b5baad1db9e40ef19bf674335ada6e8fb19e622d5de6c016a195fee9b66f376e20ba9514bd3a6180ead87f28df4f89d611d986bd9dc89def5dfc7701489ffc09b91d5977c4f356ac5e367dd063f861a72a138beb342d1321de6a37e9fe7023ce4e5606cb92d6db1d44cca188c5adb026660a1e6cdbfe96bba1de978b50b43ad9b1b4baec6918ef8f436157f0b55d534bc2077dc64c5935b322f2a3937abe878d211eb190c80e97ded503bd16592aa185d3066ab5d925dd32074b459baddac8d727916ed794f3525b3d5f8dd19dfa23d86d6eceb2cc7e7d95d0a1d553ca5210cadf8bb01bc2e307b91378f0ed2dd86fa6809e241c1887b98c6b0a679a04edce6a98ea2710eba68322f163ffd7035e90de92ae65830d1fe90b694f74eb538899aa5b2da34544adb124800125a77de6ac995539a916e46f5b25f2af899d4618fedfef03b35e5781a3ad2d7976d722989a00346d1d142bf5e2758a6264db96aea2baefdf946387fe357d73fca6e9db5f0aeae0f375a00000228000002240000022015ad97340b99a5dc95f389b64e7418fbedb3b0a94178ea2497971fcf4a7cfa8d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001607703d00d24139e5a5c8726560f2084b6aefd09c34670a81bfe0cf461ed9401f940f924b62e40849e8f801ef85e76b017c35d6e46dd9beac66faa73711ccddf14e6ac28c4a14fed11119e0f5d8ceadb548a4f28cc5c466b2de4334fece8e95616edcfcf1aad1511cbf6a3d42b9936b63c19330e15c4be36a5ecb0a56f8352e77ad6c91cac9fb5cf32761961f303f2ad4d40862491ccfa82939cb6b920f13f66481154606fb42c66ae5a825e5ad18acc65f9f47c53b04359411a8adbde0c9e859eb797bb4206c0a137431dbce29014ef87d59bfbfc7dcf41f4048210220a484372f7dfb40b438b837957803b897d536e94696fd678b0c26e5133cf3eda805713d91f0df4bbac2ddb1bf8810fe79c18ea9e276235c1fea1037386578b2586eefe9988a721994ffc55f213e6174514f3c4489c13302b953277e45c0e19831867bec929ef9fd248c8f38aac7d130403d4ce1a5872e13c36f26db3883bb8e478c4a8e08d1d77823840147320ad30b5126b18bf27d42e9d8e112837f4399b6782a496b29021e85369467e292d960365471edef5f4331e30a0867a7016ef7f6d8a6d1a5fa24046760c2a123c636a40a441ac907f2391371bbd25956a33c5bc47f95c6000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022b91d08b7b43ec5981bdbe57f3c848d2521b1d70b6902d88a35b6d54c2edab2628dcb4668b4d1892c0c919ac9cede7f5381c51216eeb6417307d2ed0b4304d54022d547ba82d32b3974b9f053442d89cffb37d097e4cda225e8f5179f1e7bdf7892040beaa67037291ef1c0372d67877a6b46d9c847cb4b906b2d7130286ef713b00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0491a0827e716b780f85d805e081afba0806e45fc9f70c46780618ac87d202737cd6219911a4ffd922cd9615a8e6dfef865f0fe37343b898ea027ebb6acc7772cbb27b594195181c2dc4e2e90e316e268415c2158bd3e7f21c986ccdea468e1bbbeab2a09e6217e6d81b1fbfda9fe41daa2c57d633964d273a084d2fd69ac1dffd096c4083e4deba6c83d6885a7e06b26d9122257f316b86fb0993251a1a17e30192cd9ca5fb484b408d2284ec7cd00fa0ee8f6a32592dd1051f50a4b7cfa0587b5b5863dd9e211160d2ee203b491693e8facd268abbecf6003a43e3e3b5ed909703d164d80f234015c73707057740bc42d7e79500412afc1de6d2d6fe827003bb9041ea43d46a7940daccdb33c2a93b0cd2714eb2f0868b2a2cad72ffc69e90d07b20f87f0d0a7ef1040cb6967a1b49b9c9d2c562ebda96e94e2aabab07de12d1f78bb9cf86d45f5cdea486703b1acbe5cea00903d92be2f85bbe76b3d8dd5a2d319eaa313c1ea99a4f07afc381e5e95b896db57e765269fb0ee7d3c5d426df571af4c74fd0bc5ba662d6b4f9ac78accc8fa1b9cca2ab994cb97f746d974d0bed30a29dd1136688f720e2931ca10db08442b8893fe1e9079ad1e74f0aca9800000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810764072873d970f00c27b0a4cb4cd19a64d8815044a4791fdf95d7115c8b2e288600293c79714d2779f8f9438cd63d66e03d7db0c5326f702327ff3a14906b06239ab4c17d4d5121a2eae0f6da1c89812bb5f9dd592ecf9dcd6ebeb6c16351881407533b424b2a0a46431d64ea815c677042e9ae57c27f5a4566c7762b897f8b1f7d749ee8d65716c7fe1c73db168dea72771bb7456f8e0472d99e4f2af3cd6d692fd0b53c583749f4f9412d51f06f9e58ba0ad3cc9b575bc5f2113ae2e5f326ac147f80858610b2cc2cc05466ff86bd62f7e829e916eaef4a7247b4af8bb7fea2a9d606ce9ee56300194aa416bd7b0195abfa02ad6de3e8160ba6cc302080b87df427f3468f0f9fc58b29bc3aaf20614509a9149fe26bef1860d215feb6698ef7f2b7825d7263dbf6b9cacbbe74370bd1547a7d63da21f557556a1ee607431a583348f36f9f44f68768d869fecf3838c1aadccb6a0b5fd6e927af49b33623e29b4fae46df4b3f711ca95657f51ffe74ca15758e38f8f3abe5b06f87705cc2f6be9b89f69b85798a969996bf38924e1dd266a3a04221425c6a71368f3a96f83a7c2b3b007968920bc79b54dd3a816fc3ae4f5684dbfb0cee64b6db605ec367000002280000022400000220295a93cd9e11bd67e4159fa5363660cb57d81b84bf18f689c723a82b7af7047f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa52b7d73c8e38ec6088febb3d868b0b9e6b78d7c959fafe2659e333508303c6f1569c96d3f756e9b7f82c178e62fb93f1fd9e7eb3c842de2adfc82df3d733723753634f407b0381b98025ae7a224f6a291670dff02dd798eaeb8770132743af1e9b69f7060d879827af1c515e943544fe675d07021951a729b0773f7f077ac40b587ace568c440dc5b841889bd918753ebea8f1b8ea0c26f70c1fe2061ea6a8edbd5f058b2e4e678e06ac9422a55352f2b650fe2ad944b99f3d96353ecf450679759e53b55c01b6f63642a63a9225790f2aaae17f0e88d8e1e8dffda24a2bc5252fbccb893d2702a92c2be3f79a34deef63a3ed6f2ce5c8d9a5d21b46b7dde5111cd25d1c7c100630424bdd26128c73de36c83a11980a0eb3e853f7f9f37841d383b90d6490389ba18ff02368adfe02658a6fc93fce30ae6ef3135a75f3da7ce1c0f57ba5586ed2688922e4e85b439c0068e59fdd9721411f193ee1edbebb6af62007eca698be24356d09a69f14bbff047b9620e7d1d2ebaed39c38f861737e00117b3bcc90228f0913128071d0aadd332601e1ec5c9b8dcb8a2bbe60dd90b119b4933cbff5d5965dd9e70b5c1a48ecd95b411e7e597f67df5522588ecb0e61000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022b2b8e693d57c9e085d935ae689e760c78b9ce43fce3e680bed66d2eeb0a5c3608e10e7687a748cd3a1525ccef39cb84d0c7f769751162b1d7d3bb77a50103de022ec0d9f91890a660ef335182bfc29ed92adbe52798ab7f542547d9992d660fc1245d53d6ea497310d59f7c6d3e7144b00d4abbf4d0202521aaa7804f18be5c1100000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1492581b178fc6af5ae21d1621dd455d8f8aae043b9194b1f952c9fb4d79bc63597c4c9657d44957743f61995ab0d98f9ffb86257f02e2a6a074b45fa5ad8b19b065d56df0a2b6f9cb1911d854657ee9cd1194b95671f0563b9275b5af2df759528371aba731ef86cee803052e34656f1db41da45c887d963067c7388d5b592e8192e40ca028c8bd1d5e18b577ec6c1aac6b02563017b3a2ae0358e1c8c7d128f69e802d8a5bd9a73f1eaf98fda9cd027e840419a9b0becdb6c272bd2ae3728b397b185262a3ba468be49ccee00868dded29a7eb1592d537cea8d1b6ab8e8d1c9b0172db77a568657a7461e4954c6699389de11a1c82b61b3882a2a27ff6a07f1b490acde88493f2b121a9a8f39c5980c5a2a998d279f2f2d59e83829484aa70ea20230c9b5e04e6212b53ba929a0929b9e945c29963f738d64ae8f1a0319e2f533fe95538f2e95d3cbf1d506973326c58519d518e92aab38147a7c8a80c25aa7389de6518aa209fd50ca4536c5566dc2150fa4c3d73e425237253813866a1e1aa885c6c145cd272bdc953db6eb44dcbe61be9737a536c91f539473b0d200ccd6dd8d4d9f5e8b49a8aa74327d771669e9637eacc4b5286b16eb7e5dabb1c5be0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a58cb9a5ada8fb492436ac9557c38f52c2ccd7e31a23f01f77ce943f794a18816a59596f815d61eacb89a22915263ef01c434d6ca427508f6bd45b7e295679906eebaae822cbe5c22cc82e6b8ae6e2ca0fd4a471329717ed99715419706d80d97f775f6ddfd884e2dd8dc89523790c0f81c8cfd9c0f2bf2c9ba3730a0a82c5a41acfa9953a08fbd55f272936096c11083bda19bf24ad7c18695d51e1c24d38801b2799f0861eb74856af9d3050593ecaf3dc462ac2a9951db1f490ad3a6c16d333a5ba2c6a0e418c8888c7755c50cbd3ea8f22b8f6f15ad32a1770f7862e52f750b49c9b79e72e4f3a556229bfbc08f4a95909716351fa5e990d2c4ab7b5021cafcfd56ebdcaf2fb3185e98aa6d4e0cf4c1793be9c421844487883056fb39dd5ab233bc3e2797e5472afd442150397ff089bed74c51957b246890df606ee6ae6e5263430110ab2b2c2ca6030e103591c9182d52c5b482b86274876587c9e57841f9a33e0bba4a1e6b47cda6d1fde88334fcaa3f637b0b744a6981086c33767fd98d83c8b71e57f14f734f5e34eb0e04158dd53f5fd7293c1761a32fe444840388cb30d6639716ac63725d3c9f2f7e4b91c39a7a473e797571987bc312d479bf200000228000002240000022015c16e65f1d85705b8b9e322324fe214b74e64af00e9f77f2802b11ef272164e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002372c654e1c1776dde0f4b6c20ad553f840bf118053da4cb8c059f2ed161fac0838b8843a3267d93cc9cc775c3add193669844e49db077ef1c6a51fd8c5edec380a398b51ef5ec677af57b1a0ba686d4f20fd580cc25421fed83ddca72dc7ee0d80cb04c79336ad109b628f2a94fff261bfb8b622b53e1e56ccd172f233b3a91d9341f5f1e002d4b9bb9c58601799a20bcd0b409dc481bdf3fbbbe94060eac6776d58081acafe7921a72454e3df22f6424bcd6dd27768ba0d4bdd8dcc6f6ab5285c98dc2c7bd8615d8ae3255ea4fed6a308677deb1dc6e0b3310a017f83984ff55f2d84a03058f8c18af6939ed62f019c61571a72450570e3e4b270a4458a0bd90aae0e1f2dd1f5a38124e34f581acd5f6a10b0354e20e153157413b2e1e034ba16458b96d05468c4df9b20886f926d25db4dfc330a65e8dc22b4145769c78cadeb5170be89125d86cccefad9a39136cb662e01b7e39cd45c5b74354657c5f6daea2349d9f425955e10b47aa8b6bf32f9a6c714bae083e26b842de794cc8e092d7137656660524a703058c1c4d9a1c8d617b537cdae37bddf33593759a85e715ff43f581c17e36c1284f92496293cdde209a595e4cf585e43bc02caa83aa863d000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400108140112b7a3666d39b4cd72824ac202682468d337f5cee9d217c6d79939fb39022f0ad4ad6ca3f7f2958b296d751b21530d287977c66e621eb43e18e1843cb50e060f143d0b3d42c6bf83898175db103cb06bce737713addf436b3e3cd6172a580000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003038b428afef1546d2160af0da1fbe070ee730014da06c3de013f0247c483b49beb860fc6317698f9159d6717ee01490b9b3ebbdd41f71175d3c22ee77d3bab4dc9228442296f7f2cd332ffcd56d092bd333defa735eefa93d394416b4f2033536385f68bb13f4bcc5e66b46f6b24ffdd057c081905921a1485b9c23e5cd48dc3513ba9e0eb052f2251ea3e800526c965d1b230e3dd48091f3124c137a4405c8bf2c64f8d0bafd9a311b1197144e3b8a666e26e906b78030a7ff3f92699745d77c57f5eff6cc24bec1963e14dc5ce9e57f97a2ef8d44bf918f90749634f66e92f35fa38cc0bb14805f6ad141a3f6b1c7516542020648d661419e6047efe25226b39ac52d360a751b754adbdcba6854788ca9712f780f5a00247aa80fa51da814baf5971f6a755cf3ab97db09d23e4910bb82be89f59ec8dcb63e8075fe3ae67f4ba310137362c82915912f273ba53b5bbba68880d20fe0d665ce1f839c481caf791477211c8ba569394899023b332eb5386f4a18de8ec756c9b64eea40d8d5e3841df9763c7c3ed19e7b6aec0e905e672589ff2212ed22b069d51b7cf5a4a430e73eecabe718623c0ff5b9f93dff11beb318d2c424f4e05f60a27c6c8bb703070000022800000224000002200abb8c4a0016d436a4026824a867ec1b8bc2a87fbe09477cc6fb3f10ed07175e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cb9585a9e81ce230403756f0ce534c5e62546b4bdae8524b92870326a3998afbc94c56d96dcfe2878b2a26ca30bfd5fbfc6e359313df048b8a603ffd0bd1897436f74c94600fc0d2f14a78b31a3518c3287cb16282fb0161dd9999c86811f29c7e98f51374d67b768a998412b590dcf47801c211e14193f84978b79c8cc0fa64d235aa1a17926f5ba88e452faa5bc375388c2fc1663ed3b50e9a1435e1d54b92234971d99573c1a23115efb876138cca4721f66721ef83f49dcb7c3cb42e550fa0f7579b496f9d692f735aa06887a53991f8f60a8f4381da88b0a88de0906307d0a63f59770790cfd250c8c348176ad8bb112aad5d1c281dfde6db4080f615f1b0e409a2e26243270a861ceb4ad3142264d76b52d0ad719b0439c8199c34fe2059a7dbeac9fd71b48b3d174e04540b2624565e4615114f4d6c8107ebba1451adcfbb38afa9c4ea4499187214b428afbe780158b861527f6105298ba740d60e2a239178d2b6e266c67ab552dc1cde40c0eac1b2d27fa73505acd0882c0f6689655bac5ffbdb4c8a1caace7e9703bc0bb02a36992e1d73d4c8f155b08251fbf35e47344dce605bd1a1cdc0ce71693cec2f83ede066937579d772b3e791a9cef150000000400000000", - "302b23faba9ae13e65bcc18b98ad3010fab8a195f85fc1f33fbb02c4a1a314290000000f000000000000000000000000000000000000000000000000000000000000002400314d07723100f223131ef60763c3a37267a260a53dbe4f1dde5901c07f6e8700089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000f00f41c29dbe5abe950a6c6a131f5b0b3314d0cf7eabf2813a060b06a83a987cf20000540004d1219c9924deb8261e20f8b9328ccc7df30601e0ab43a5ae2a5e3851d805fd000054800825bed0f04513688a20a73113b41d525a804966b3e35ccf0894be7867dd9f59000054800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000070dbdacc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad35c5602b547601172d909d17552d9f9481617e2b6b2d07aebc1916e81f7d6a78eb1b800000000f0000002400000000000000000000000000000000000000000000000000000000000bec1d40010b4bbb4f9ba5ea9596a4acd5db5f4a4ca0aed936e90bf1d1ed5f87d9fc1a7a8002001a79d01772125058a18f32b7f82a2bf6c4026ea53747cb910d4b9fffd1f93304cd77943f247039f32c4614c44ca80e2c586fb368430ec09fa8e548e8fc121400000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d4950c79c84e10ef3e5dd71c541d4c9ab1adcb3d508ae1765c41f1b06404c7d4c7535cfd40a048aaa95cff7f2af1879f9e93676bdb3d3b43243eeadef39150ad55d19ba7ddd2e3ed3f1f8a2bafd7fb3edfd4b240d9f97aa31c21e3c86f307dc759bd150b602d0d156c372928180fc759f7e7a98d767407bc8d01a9c5a04e0f2d4fec84095c4c137653ee18d786a72eebc4dac3169d4eb5a8b04438745785825bea4ac1fe1aa8b09692a82ad7327c049bf1dd438c22fac7a76ab0192b8cc2d8b09e21e381e896a6c546108bbe3b729bb9bd6bce7dac4e171e58aa2ff1babe0fd3b2ab11c4e251100030e4f8c3993c9e5acb5570db33ea0702bd928ed4d8775219160e5d85254b3c5ecb607972a0fb5b2aecd17aa6dad371aa4ade3291cc2e517b3cb05dbe3c33cbb044e632ae6c631120e283d2a2430a7d62ba325d37e4a24fbbab4bf6a55a3f4112300492c9839fb3c3beae1fcac9a9715d7e38dc48602b8ff38f982eb380b4548212841e2283266cbcf1ef09306db2803ae2041840ae2750904f50616aa8411eadfebc2ad89a55b3c2610ed78074a76000ea1b309da829fdce1f2e86673b6bc7ed017c9cf6e6113a7e3043ebb0713737905e3ad473baf659000002280000022400000220063cae0aa5a20ad1636e4a6e8f5ccc5838abf440054463ca28172d85e94ffad7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d2926997422cdeadca4ef4d0445aab95415db66afc38dfb32d7933369ad4d3efd01cc24d0273edaf3c535de3affc6afa1d7e7134829223db7c40c4ec3eeff063ec4664cb1a0fb913bde00fa0a052ee74c935ec1926472e5cfb134d583fc58349b91259159296b5e263b06d059e0bf5328b90703b4506fe0c3bbdd5243f335357c3004ac4f5fc8e18c5bd35ca447e712c8db3c0e646980793fdfc665b3243066301493032fc588c98888f05264545265157956ec37319ff09f5ba112603f076f529a6fa080ce5dd79916a6550b487f1498ab9db92d697f3bcac75377ccc7a98dc1e10c427a5aaeedccf1feddaddf22a4f7b79c01acca7b65235db8b03e62cce1928a6477202ab3a4db05a935f1f0af5a5359c19b8833d2515dee1fb4ea0c542111af072b9a99907a3b5a0d102e7661ea9483c52ff33d62c1c2fd42917ea626c662556a70cc4a08e9481f137d522751c4df2c0e0ce4c7e36ed496610bacd669d49dae8b8a31e9823a8dc77f0676678b12c37baa64d392ef267ec932c17311fb6d3ee72bf572fbeb8dcd9dce89f6923c2e481b0471f21976bcc581fa0b74bef569500dc9f327a762eb486ccdd71b57bf82e264a7d79d7b0e5b23b47bd061dd917c000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022fce59aeae8c1e5a1c16a98ef2d1d74ca3b8ae9feabefd020036094b61bea8de2fdaeafebc131bb08df98e5831b9cb8a5d9570d53ee5282e55367e0cb31afdf50200a76ea2115f8f305b70d4fc890770f50506eb46760cb297dd9ffd5ec8bca0bf187bfbef2e03187f18d6b6762d169cda5b4a9ebbbe6ed94648c11193da4582c400000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f38924b048fa145fdf5e1642e38239eef7d6e1e71f6e4eb977a2c784505358c58dd13ea737c1c98f69acc80ea6c7c7fe97c508481c79810b9ebc6d4509f1aefd2c28c9654cf3587f3d5619f7e3ba8a963fe94dca5264cd692fb79be553bb8f3a4be691b7dd0ea469e020cf789aede5799e4f55f04000a903476d87621dbf827bcad5b3d15b23a1e747a19678243761351b336601b4eda54629768ffd6c9182b77360ff5e644e6fa9fac1d8b13bb904095aae623f20f82b0cbd83eb601d4eb23dd58df40b4be40750cfb7722494ecb1075a59917e21ed73472dc2faa7db7fdb2fce8e7af72250002300d9c421a56c12f1c06675741efc393e5798a050964795f1803230ce39b5e87e3590ac18af4d52d3e73abc850718f063765e6e8994833050ac9e3b03d0b1474a347bf48ba8d0778bc8ea4b3f0f35d06f6634edd8667d03628954424eaf9b63bffd89d4f0616c5507067fc7dfbd4c83ffa627975d8a02595fd223838d9d1a9be579671828c3d6efc7dc33b98f57a8c70a00b68740a21a6ee32dc85750c5eabfe0dd7603742579b395288f9aec4bac3405154c4b2e7b5c4c5ffd77313a1b2d825679b2f027c8ead5e6d8b726737f3fc039288bb5f56c81c21000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003884c594c641121653b8774255be5ced67e9f33d1d64ac21302eac221c3f23c85358b195e288a2c6848610ec541b75698a193ea9205e0aa031ce5eb93bfbfd9ba22a814faa26ce2cb42d44346eb9ca3648d3b8674bce1a82f1ff25db8029fe70ca5932cc62af9df8e78a93ca978917829ab4defda3bbe277ab90bb9835f13ea731577096da775988e45cf6fdae0e68ebe8a46f0128c5ae71a5f5f65f21cb2c77f215ae08b73919c119cb79236b40812a53b929503d492bdc1e8405c5e08643508004aeee095cba3fc1be2c90700135ea6d06debc217222904d7173ab18ee7a4763374f1878ee866be3ec472585466bb10f0cf9b4bc75e8a3a0403c82a2a51ca7a7b61a7cb4349c09b713533d9b97b239ab6942eddab8d38196a1ed120b90600c0988f6e259242f8e23bb8156fc7cf519520bac3d9a50bdfdf1e11a784112bb4db85520e31f0ff777881b61d60edc4ce262015b01e9bfd3d896ce480f689f2863a0892e10281e0c8cd606f96e1784575154564558d058284d6db2bc171a2518daaa5395114904a953df0177f04cdb8f9ae01dea783b56b8e4d167f72f4cb826e4e97bc5398337ed2d854533be05ca15beae64023819ee17085dff60e069b22550000022800000224000002201c7d81e05b0bf7bfaaa5ad3134047878171e61e9a5911b853ce9ba844c9eeab600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f45cfc7852d5441ba239e47e0cd23014596c26bc30a9943c77f71d2e7cd7893a917dfcdf2be1cc63aa1846f850f3ddc787c0d73ded9c9e1647793c6deb194dfad03da0ecb7f18b7c19445d8655f44edb8d10964596fb0f3f686c3cf0e6d2cbd989a3513589fbdb3ac6dd2d7df0ceec367ad1f3c66ec4c06fb69f29c8e4241d101b97f298d424a308a035dc8dc8caab87aab52ff17b44cf889a3818c4dadd829e01c080a59775b308e274102b7bfaf597c508db721190cf621ab80805a475408010784ba5ddd0020674ccea18cb670cc8fd3ce2ec2b69e020173819f7ae793e1157bcc02ad7c424408ad744a43d9e9936c26418bbe84026d46de289dd75ec410270c4fb917559bce494f9c395dabc546700289bb91ef9ee1e0f2124196f5ab8993fc2d02c6ebeddcbb2992414b9098bfcbfccc15e9185bfb86a297e02ec7163e18fdef85bb766a869a8764dc1bb976b7742466cb79bdff4d9b2829ba8ca65b3ef0ab766b2f00d46e752ff961fa3a5e2609266e833a6449b1dcabf972e2a5cb48e4c903ef26a6fb9321a02f53eca8353c0579c5cf92807f7d25618e4e8ec376c7a3d3c41dc4f686c740e02c8f24706e067fba58c2bd46c4b715c63e63bf1a2e000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400117edb9ea4da17b4518ed68832fa317ef010b6e8f88521ba21c64544e4090b9bc0200b4e0e7058ccb4c8cd331a9399ef1be8c350641dcbeb7ce05eb842ce31a5f4e21194f08a1ae407001b012472422a4a3ccf5234153773ed9881d6a4734a3d875000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1a2097068da86dd1cfe64c28aa55ee1b551232850140659cc6820c64bac495d56f7793aeded42a0badd2305216f23996a7205ad1c90abaf50f88635a55ecd591a2b01462be84863f3e814b5fa9e016daff29aa4298302ffc11e45f701dd8b9f7e19979456ca87300eeac69d6cc606513bf0a720555b642a930b58790e94cbb804de1e573efa2884f93f43193294d8a6cf7ad4a053907c04809f1c25677e9ea38b998382e9ff6f9b791fa522f7bdab10f3b7cae31cc1eb55a30fd59086a3e5ea6b2109899a12022b8d36162c36d39f02fceea22a016795696c31b7cd28ea63f33b4662ee86932e15b48f46e93ce38fa8a69512d83fec5987b2a01e2a228e4c20b999807014155d602dd5663b24d2e3c493a468eedfc5042fe3d2cd264b40f2bca72b4542a62baae41c174c6b87ad36aa0de5776823efd1e0cb80f86a7c2249fbe1e5fc242b860404baab16c5638bfbf7fd78acf6583f504e4ae85b6b44e7df0bc7897c14eb755559e23d0fc8fc8993ee238d7f39110aa0fb62acf2f73fc5fea0b67929fb540589cf2e217759b7a05278cadbe26cf2db737f827ab0c1b5f9583c2cf4ba9c40ce3d59ff8b17cf5598f93fc0c3afe79a6e91590fb159943d43fde10000022800000224000002200f56cef35f4bd23741d34d31140f678cbbbc0ad9ee81a65b90e7ba5ec64c6f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017c9fe93b9006e11c763c66ee8ab60c646cd923392986668b12e581bf8cb49036e14cc2ea0005169e80363453b547036b28ab2609e151cc0f1c06725ee3a8c620b57846471a5e60d527a9febcdf2a6d5dc16e30538bc950e11c12ec443aea2dc86e8939f682b9d8f6e31a06f2cb23c60b6aecebcdba592c4fda4f29840a1e2009c5be05bd89085d17e1972d2cbd9249cd1b6007e8abff90d3053d86697f3108acebd9b72d614b3558da8085ec736c0e7fba712d1e833f3d49346cf3f7977823dcaf69bb50753ca7a5da90f5352f055ab7701d91ef9f54cb61bcaa00111a5e2e702dc583d569dd868655bfcefe266ab7f3087bbaad30ac4126c15885c159039335d890ab0cd5d0de92dbdc6d782bff234f19b053a3e143d981fb4ff7713fecdfde35a261e790aa97ed4febc640fb93366b292c05a19a955bafb4216eb4b0d07d2bb3919f6dfae8b8ccfbdf0689fb0f08b0a0e80d72177a7cd3c088e45e5b8c1cab6d90b85bef161e33ff33573bddeca7c4273753b6e6871337e5b5c2fc6c2bdbd665e17aab1f2b39abbf9b3cd92b8e75016ddaea29364e84de9e25e6ac384df397f4644cf982042d9a809adf21088769b10d710def7d27cff3b3f922acbde730c000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010796b764d89ea7469073f750ac311e525386fdba088a266a4668290a24e8f2d802026118e5f0107065ff7f2ca07bfe8e9508959ac9b71f651d65193d4602a6193b134ee0d10235f1e9f446f7679d4d018ae689e45b5ea44d6116f2a92586029b4e0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc6087d5324bb6c51b10d8c5af74b352de28997c262e0926a072cd0d80a8431677b06f1baf58172d0aaf011ce8267e335854a84dd6706703e3177df8d6a702deac954fd614fe6b1dbbe0dc24ccdc22c41b14fb748a88be60efa0897d5dc55ea9b75c9a193ae2fd4b9c5341c9ab187683c3a753025c8fbbe57574a615c69c43395f4c6c7cc4af4d85e78ad0bf41fdc81b090fd03c9b64db51cc6b8b1e7108d3521593355bdf012bd1978d1e51e3df098830c40429b051160b79f936a45cbb842d8f406301f8bca083ad3512ac09be96d1da7bb2dcbf810bc88144a17b990ab5c3dae6294364f6031f8825c911ba877b2f1cd2e267c00f346c2ecfbcc90dd9b6e08cf7e8b6e0dd6fb94b9b56ebdaa70917a54fb09c99cbe78d41839814dd638d0ab9c5d36b2ab8f95f9208c8ab9aa431dcb1083199ae3a8aac2641f7287ad1769372d71328a96230b6b2549b2e0a74bbc677247a7d30f7bab24abd8776de5a8ff58fd560a260aecd0008a50c36012a558823a81f4fef36fba9af75a6b85d8c42f5fcecc88b0cfdcb9cc2eb175fd2eb5b362c012087a54d67b3a3cb90077081df9f1ad4c625e6fa68669845b104bce683ec966e05b1a5bfb0688c684c3d43d44ce0000022800000224000002202ef4a86aa94b4c5a91d360da62346d9ec88f08e2bdf3f8aedc593edf99621a28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ef91ff53851d967209891653ff028248f92eb7e0df04687790689ce403b16d9ed59dd85b2243c858e5bdf968a3c3c8319a9734be41a5f70fe131a04a940daf5387df43bdfb30e87a401c62061c8cbac10a6248f2bca76a29f6384d186ecab7a1ace52ab807176c220686ee92123b6d4da4edccfd413a2b493fb9337b39c650841d07bcee80c646f5c4c83057bb9a58d5e3683cb96ef6222ddf3612f57244699d67013fcc74229566988e6f1c845ea315f3ffef0366b6ecd28992cc4535319d4f5e61892b56f13a2f1f2f2b8d017a8f4a570dac7e92c6393ed2c7cd3fc008bb2b96f5d45ad63d4322bfb847fa205065515a8835cb2cdedca37cf2cd8798b3711b9e5122316e8c9dcb7919e937c8d258278681b39e1e39a4675a02003f8c6d9c71bfa90931eb146620366a3b41f48e557ea0db714baeec25ce69a06d3bce5eea147b61652835d4c3badbdef58b82d9e91a14f7f6e98f85e20a79fc7df9b0960533346cdbb5fb3a908765ae10ad84e7e72f413c31942ee463d3d66a8c8b6aa2ccee961efff74f002829d8df09fca3a9f87e00157dbac73caa2617c0a15a954d3349dbd49a1b2445e969e058b9c9a73e28d7ed010ead124bb6665c9ffe48f3ceeb6000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00217e04ed49df825e8a195720b568df1345f3d73eab23de90762ea0cf145ac664d2d63c1562f11563c7cb6586020a3c2d9d8623e87d25e7398b166a0d7007b63c402032bad36b6eb9ae58f3d8ed7b95e6a1eeefba7940b6c8b5fa4be2fd52adc8cdd1145e560dbe68e180125dcf109ed75fd10d06f871b101b25aafb56527fc8fec900000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001919ab6105c8c210d7507c2daf73eff2269456dd23c9b433b500f372cf166a7e9a13355d8f561b615e7ed17c3b6e7afe2a42669a539f902923689e2cc38ac26f0678e7631e48537217592f13da09725594f46455e82e5df882e5fe5f78e3951f0f21b301622e3b7b46d45aeb64ff9574766cc2c6bef51830933550ba4c143d2e1c3085d39626c575d38e9663703c100fc6bbd9d67c15ff128c1c1476c33d54de948927f173019e7df53465825ab72de69e079fd84dbb754772c7ef48d2c2c90a2460635fe7864f193573ec4974f28595ae49a323f14aac815bc9d7cb8f04800e0e0be8940d40e21d870260ee0c42404f0dda03c492548798f6176d0b8cf6b5727ef070de30fb1d6e0c88ab2f13df0fa575d8702bbd19994d1dfec30aa15af5d68cb0b09b370dca8f2a7fd17f869c527a816446824241767d5126943ea07d1c0862767f09eda09c2f7bcd7c23f55d040ceb82346bdb99b8d2a2bce2a10c9f227ee69521d17f1a4e1bf15dddc2d460fed844ee48687c0711b59226494ed0b95be6673fe63b22ebeeb151985dab3bac71af0300516cbabe44f71b40e6580af7fbd8b2edb9f27ce1d051662aacf6818d69a045e1d8000e3ff195fa5e791f427acb8e00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a399b8419f74332579c03c14cb4e930bc34383dd2feeb76b4ca785df2aaa10413a80f21efbce85daf365800e70a9fedce92619478e06e78d7f5cbe0c2d763bacbfc74e2421ecee87be0e54c1367cb8adee4269272fca46b7e60dacb386473c1461209ef81b8420e0d7f23dcddb134cc09060834cde28f6057e1e02f4c598559b8f74e294acae5932b3bddc01c8be394a8a9a753c9a908d22d099f9393f5f758a3ea76e146f95804d01f7592efb5053cc251e435f3a9a0806544d256c87622ac98e815d94a5f6535092edfe4730464ae1136539cb5297d71b9aab0ab0e71260e4e68410f8429ee58e5740a708d5148be1498523b634099090c016f71739593a9dd50835684e175199dab107e431eb313af79dead692c4577f272b9f5a6abcc5b3795b778c43c65265921543cbe454bf07125634994db58690917555bc60a7d57d9a070757c0de533f6787b7388a7659b49cb7021a247c82b32966f7fe982c99c675d29b3ca0685ee73b4208f44fb3a90dadda43d64cc2a67268044830fe678374b6ec57f0770ca1142813bc97f720699a56f83648d33e2d4f91ebf4de2d5d07008b26ece64ff1b99714d23bf61335474273cb1c9800a81617dcb31f2f7261d390000022800000224000002200422dbae64fa7f1c08ab8b14526e7793dc09ce16e6f9eb9a72041b9677143d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c3b9b51e02ce274df4d8a939ccdb54eae00f93db0ff4b11cd20af7181a5d9593e21c8add7c4b782ebcb921b5f64f0694cf3ca39b21ae5867b6fb41893d60be4df4e832bd729a0a6e9fead3a1f30c4cc7d4a8e3a84c47579fda458875efe0019be4d52fc89d69ebf64399c8ba2b6097172a925a9ca881d8a7f2da7e451fb67084fe504bb5db71fb0513c0d659261a3a69fec1b3358bc9aec95a87ea08087c76652b99fffc40e4490fb2dee85c7f34523b0041304921f041b9dd0d7fb89c5d1f523c6a02d22bc10777cc2448b0696b2126e58610fe9c97960291172c106fd5ce662a396468be7899ec5a5628bc7b1a41c0cf31c45693b6f5bea33bae52a14d0e058308c57d7f7e8aaeff02d762bf7a08556b2e1d1d949ba89b298a50bc729e28ca23d9debbc7eba44a010320e80a9ccd806675ab95fc6c2f4ec4de2048ce0635f054ac514f4c6f31a35a160341ca8718db8f7062b4ed824b4f781c514dc31febfdf4aecefc9a10a663d5c8e5327a098e19b59f0dfc9f1ac215ab9f347042595d9b924acefa572abe7d435a897684a3dc9e297bb51ef1b68f655b4e47a10748485e8062999e77a7293716597144762edfd5823ceeeb294f40655fb644ec99d80b1000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010ddd9ad4f4428a937591908ca1a193f1f71d5d409758405cd94464af16cfe5230203efb91c6c751f7108ce76f3b2725f048eacadd19537b191555f036bd872b0fc04e1cc2f239e4ea6590c4e7afa592757e0f099ca1798f159c6abe5b9b4faa918000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae4e88de1813d6add72b128c8d7a24805757bcb42a45bea8b7abb1d43736560a489bf968b4b067e439421c22f8d239afbda81e1fbf49e1e63c05ed9bfc9dca69176b99f9ad8bcc07d765b8f3e2fe7b769307fe8d8d5e6a2bf340a07c75abd5c5c099ad878a39f5b0628352346e115dceea08e43b26ac7fd159c6a0b206d96ba3f197cbec4c0181ac6a8743c226e472ce30be42180782abb3461c79ca9d48346c562c16c119e707ce300d0a27ed3f055aab2d5380aa8f1c45e0ef28ff2d9148b3476e668a76d7967a84dd62cfa267979327a28ceb352834db82177a4c8a37a2cb1ae7e973f53aec2de2909a4f1e177c3e2a04efbf862dcfb771e81545a768e8efbac94753046682249eb39902467b608a6869343de8b370d0d7b8071e860c5f23b21ca3a5621f47e3b36263e6bdf638b6828bae010e38cd4b0f7b863c08d6a193da32c170cadb6c13db9b92050dcd52602552e3877287d374e3aabd3072d7a68a8d4c4cb95a69375a269c9add084df526f12edb84e942462d5bc2c16be15f9c37edeea93c4dd1ab62e8bcb52f926fdd6278aad4bedd6407427312c9843f3177d62746b7f084ef75b096dbeaa19d0151a62283a23ab1b7c97fd490e502f59742dc0000022800000224000002202f0f8232f459d0a0e8053d7ff432b3277726c18e683ea74e70a775fa3239d38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae3ac950ebc15ed41a7cb346ab31188d28b0c5c6975c836e090dc0a7e0c5ddd5afcde60cc97cef41fd06583f2db125a400fdd7d6a91da4eaf762a8cd583889e984390bc5b02d91c985bd4f91dfe8836d4a32bcbca719fe29b613b1b7c433e201d4e24dd79a7be13e14f7b0e0a458fed4d47ee5657da49519e685c8785cdea4f2360440e952a44cf576299d90cd58360d74cd39742cc165167ea2b716cb8e83d01d3d508779054409db110e1c2c2f0fc66e9eb22cc65a985c0871267bcb2836497230553f2fced4b38456b33cca87cb35ed0c895d4b91f4dad011061b75de0de48d016f1e35916bc7e996308e693beb27b571d81466a7e754ab721e792402e045206750742313594bb6d0d386fa4eaa14e5f472b189a9c67d798e71f7749f17fa555a578de19f22ff00559f132e448c62a865be2e1019531f82e6d1d70d0cf4663b6a630b36efd9726b4f6f24ae46225e394026e91501395b163a066dd89d4925f4bfdd8ed31f9382b68bb8f01d0b46939510b606115fef00f19518209ba7ac8ca49aeeaa42d62695ef920a3431b3e013c07e19deb9a3ccf931226361d076db6548e54127bc1c30785f93fe0b5f7ad988a8ba5077e53ac72a71ca3560820218d2000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011874ffc2c8016a729316eb25929fc7f7d5753acab651e245b00e0c6c8798dc340205624e4c008b33e1445559f425170e2bc40ea1bcbe88af75ad5453c48833d80f06d714626e3de130adf15e0df089241a40325f7118dbbd320a421cd5e2a9efde00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f38715d43e7a2f436d47dd475455706705f2efebe621e838581bf70952e19a7666ea506bfa7bbb231bfc1573d408cdd51b5f37e6d1d0ad5a4b0f101a05d92327d4a4f3263db2331d7f029312c784a840322db6d3414b620955f625abd41825b1d5b6a9e28e270670d75593f19b2063ed809e2965d45a2be07dc7b6d0eb5f5006e529ddc987ddc8cde3c95bce114eeb38b5df9e38dba23ab8de423569845271d088760beafc66a326ca1576cbc908bc25ce3279955b1265485db659e91490de81188bd22d7b5a834a011a7fa2df81189171bd6d411380c89078dab6475a63f11ba04a0bd196e40e88e57edaba45a8bb731c5e8e51dc565b15493cad1becfc69181f5843b108335ab0b470e0b650fb2feb8bfb8a0d0918b40eaca123d22ba9a0909f3f39b0d078541b384962499f0947eee28b1610fbbdd198c93d0ae8e54c79abf634a2b8d70d668f10ed310eadc44e322a679a9142eb9e5dd6e3d582afc2c507da921d31d748990199d75c5f5b6729d78ab43d813aa8cd43c8bcb2a964c40e0a203c32015aff987acf905c891468a09e1f364dddd41c9dfddd116c174c881c6a055feed63dec277415a311ec98eb44c7f9bb4d122d50f3d986d254dc1d08fa00000228000002240000022016961ae679f9a2c2f276423377f7bcf54378ce33814a26f545bac3dbf7465436000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000967a89cab98bef7fe981cd388a08e40e360e8e3140c10cf206c671106bfa53d199aa5197207ee53a488e999514f5f9278b0bc1888516e1b127c6489f149c7b63cc6e3d29c59cfc2b4cc4940aa170bc1966fcb21dbf7fdea2dac1116c15ce4f9f1d90bd9c61d9ad23b668320293afb9ab323497f1402034272f90a694d4415db55cfefc8a57b87c3ff610a91c60f62528d4ba5c1c091d341771dfc5550e4643922086144006272df41988aa5aaa20275547390b77fab02ca468bb8e46575e2813e9fe12f8562d8b1f0fa8e5fdaa1bc8ceed7d4d27847930f76d7944bddbe0533bc66b1bcb3f162ef0752abb5f4c02c8059ef795aa74ef238cecddd10f0f02b4775f3cfee726126488b347b69f36da3aa90affab29a28cc36dc80636d1bbc98ea4e1603bd3201c049119111271e6b0f83bafc5146ce7a877cd02eb92362b4b18e508c0d561cb1303e140ad9eca02e4273efbdb7a6f11c5af6e4bfc927d76c54ae4fbb526e862473297b502416e716c47aecc3f949ab3452256504e18c4563ca4dee22edb3d9c2d7f730a6826b278d61c8967022af1d17d0eed2021f49958ad06ad57bc5309c99e1a0348b4b73ec1fa917941f30c26a05229466fc9ac354660f79000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400118b54e97e653249b892cd042a8577fdce3ebb542c9e302358c5b48ac06e54d060205c1e2c956b9933b2bfb19aa8488738087f4b11d96f2bf536fe5022c62f52ee527240dc7d6578071f5516ad5b2c2cf41dca123c730f47d24ea7e150edf9cbda7000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000acb68a76286a30473ad982692564cfe031fb5ce5e35b0b20c656af0851374585ea20c52ccd4ecb34ac67a7879e06ddd61c89f9041d095f6165893f60bda27dd9d6fb0dfec394a5ceb37ae5d6baf2fe2e7977c6102e7f33323b1d06a077d5b9e382c1d6110dea0399324b4034b74ad7ba0913db4c4c3c689971b0f8bb91715edcca06207bf10af7df23baf06db5f3736881a5a280d57c1d044c04d42191d1d1f1b683ca42264d79169112c750d6ee8e88470e501d39deb419e092fa3588c62bc7a75b9791ad071a106faf7e5b46f7bf993c87cbe6241f6e7cc06fae518c3b369efafbeebdb5d67435f9adb3fc02c3f65c4fc383233abb6de32e9929e93dc7e2932623e2a06b1fe4f75cd6f08e26c49318f22ccfa779cf8af88e6111fbcc3b16128b467ceaf7ff7e4eff4250d7e900c433a2fa66280c091b2dab8dcdf465f538eeaaaa9b55b627b2f3d928a49878861d1c9bb6a5166c8140c8d5657c02372abb972037874a894bd7e016e4543b03fc6d896beffec388675679ff7643981aced080d6d7280cab577eebc3168ca0d3c7eeb497ce70ee92c60a98b0955d325e32ba787853d91bfbb16b3bbb96ade26e717c9e4339997f57991235a8a2abf35e5b2b7d00000228000002240000022015be11c65cdcac6526ed30bfeeeb2dba8e97d1947fdcf06c6df2f59dd5e72fc8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d48d88fb5729130eb9850101299d2e8c1e67ba8b3ab8141e92d37a5ca75eef613ba70f9cb6a85238ed24948bed0e93652be48bf0b51035fc928bf5abe5222982efdf1a9f556e3ea290b522038e05ef933023528048ba5afc94be39012a21793691c08e50bff9938988e2e349554bca94383309d0033a04c4fac38f17a0c2ca0f42d125657b76856e783dd4990fcca396ddf0e3c69b53af503793b0f2094609d63a7c1209f7c5dfbaaea34a9e7a18bcb694c2ec806585d847bf464bb888600b3c58cd43cc519c977cbf506b3535ea8065e87bd839558bdeeb961074eccc26d823f5e076d2c3ee4d7155114ee92e21f45383e322ca1b780ffb2e5c8287d52acdbdcc8dfcf7db2c3f26dafa4bf3015a38145bf9b8c52363305c8750dbfa9e4e4d04aa946c06d41346a4de213de10e8b9dbbdc785d50ce2deed5d730f0a4b49dea62bc62c279d8c44f77ec0f34b96ac1526d7e60f958ebe868f0a8ce6e70a9ce406eaf298fe9148074d70dae134c33e2747c6f5c5ad926b297e71c9cdd8ea3b1c6cb749473c535e4565a556b4f268539e735b7cfe36086924b2ec3460f8d58eec10f077cee20abc44fa1352d390c01da0dbe80b6e4ad5e7ae2bf30253f442bdbf27000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012005bc3281f9014ce2ca27f8957ba347dd99279b222d7984d3009efc8a2d3bd00206f3e56986d2f60e7caf622fb823f030063bae9a9078d5f61bd66d19583917f1277c488114555c14ed903464f1b40175e8c37543b236acf9423806dbda8ddcdb0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f794acdab0ec6c5e8c588418b537fbe7dcf7af84c64409372e22fb1e9bacafd7620d603306cc675f04b30705089cec7ec141a105b9a3e31dcba0eb23e86bdfa9a8af8a460d429b3e97612a234dfe37ce83359f96dd1321081ded4882e99bf72725a2e25b7606248615fdefacb9f2fa4684e57d99db8c594bb49ad3f49833d32bb9a4301b163e86812cffb2249368e1e4f2cc92599ae82013da7531329476c8b0ec3191cb5822d1902ad4178c88e30c835b4d700ab0af7a3d3fc12edc8f23bb3786c245e317c793a617d3aec1fdbee7aed9dede0a20400d3ee6d216bc93a96ea13a171c9bd34416dfdb1f89b1467e7d876a7b620e048b938d73ec3c0c72fac3022b26bb15c80cc7e61a7426455765d19eed1429e6b10ab7418eb63dfbaa14a8f6c43fae8f903524eef55759c5590c3ef63e5e272a5b2f3a9fdd4202f52d0cf907595902a537eadb84a53801fe80a04440cc68c85c25c3aef08081525ccdda4c76ec9ca882cc5903237ed6653a331a8ab89475515a8dcf0ee8b6c31e4e15d852e561a738c0e4c94e78e7fe5a7ac27a880bfe468e1caf1d1899e9e5b8273da8e5076baa9c847c45dbef7ef3d4565ba7fd9f60fae59d2137f5885b4bc21e4b2d3ed00000228000002240000022003557cd949d2e65a1c7b76d69e592923e944fdfb2dd591fe636fd5d0e5849963000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008fed0f315e9a7e86c66878e53947662dad94a62e775791f6d5611dadfc0873ba01ba64534a62a2b66264e67d6d8c4bf479488fced8a7e064c9622df9cc03e26754936d4f804e7c1500b6c348f442b0f7d025a4f9abc8beabf7c0462bda6cad87ff2d8f5c6fb93ad9ccff40fa851beaaf03090ddb849a3d0e1f71f9bf9a76fcc482032baa659b8c2de9b71cf164fc4dcf33b06d2f8c5ddd46ac7107a52e5683362d42d428b79825180a93aee342d9677d5df177f07a0efd0a312d39847a3c312c92fa78768aba8bf703be6288447d1b725f9b1c3e426d34387b520ad3be4c8bedf227cd9542ad6e7ba329bc37bbadc11f9599bdd5b63c61618b8026e3bd3eb1bb7c3e75630d1807b6521550b7cd5e8d8ae27aa219b1f48d0a61a01b512742f8683a48b6a475a566bb8e19a262d6d40480e75ec0a3afad9b82da2f5b8f8fa200cbc107908ba1f8e4907d60089e76db92d752a20826c5ea253343cff98d445877cf01e563a683970c21c3ab3098e31fe87a16a811aef10af0d59e030800319b7069cf02b3bef644773d3e5a52707523cc706fa1959ef827920e1c5c7c9cb25f1890e123a6df24ad4c0f27af737be1ef5e1f758fd6c7d5a715dcafa8f8a515fbabfb000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400115deb14b37c509899c06ba7b0ae6545398483a26321c93041562153adbaa369b020708d9a5a998a3c6464492bd708fe0072e7d3cbb3f6cfb283b22c30b5351dbb9283ca8dc655dcced0cb633164c844b77f0f54ad8281b284a8f475d0e7162a005000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808ba0a597f4c8297c2b5095e1d2505ef91508ce13cac851c6fab0dba971fae37ae40b636a14adc58dcbfe2bbb9f8847d4c60ba8967415f58029f5acc294fa28bdaae5859b9cdda378a150bd670febac83a764e70b6bd970d6299b90c8fc0fce4bcd92416e8b3ba137128135fd47957173cc86d2dac4b1ed0d605f95495be6b7b990c6dc717d5f332fbb0d91f576d301b1a758a099cbd89b199338f9d69cb1bc14f216caaa9f8b2630c9b8f3ffa7b78dd41d925c7f1f871876f6a265733b8d2160e03e432714c60ecdb214d52b0e9950b94dcd468d0324af78e667745b603d972303297c84bac3e9506012d312ec96d48018136b783545fd5288c7545736e8a3df704c509aaf3af35bd5169eff3e3c7daedf2f33f7a6d1b7dbe516f309611e8b766e2d86be7308eb8f34230730a7c08415bc5a90214a846725c1761e79dc2a68ce1f844c606ca2f7e6efcc634ebfdd848616aa17343a2805a15adc3145a1a195072198baccb5ee3f7dbcde665178a14c90e70f2d09287ec66567de1099177bb918e1492dfdccc6e987e2cab34f2f27c888a59cede70089f26b2b84d5b74e6360b023321701a47ac2664787b9f4469f9a041d49943dd6f59b09602c60a67e1c4f0000022800000224000002200568e8ec508293cdadfb543b70f2b37d5a0dad444e21fc47f978cc15239c280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000975ed97514a3735c2995a2b11d21116db3b509baf2113078a86230be0b61bdceb7f33618870de641ffbb5a0cc8e11e443a5ceb0a262795cd90324d06e05ffda731a9e2ac38fc87f73941e2ed2aadb74c77ff8e02ce2859d8f71f7ad369d12ebe33b74ff487005311f403c4a87facb38403926ff0061b19af56395ff8ef6a178fb663a1c57827077cfdfddee25d86f0781c20f9b6cee258f3b9e6a1267189b743f5144d996060d9f5bff20afd2167075393bbf115d8a0ffe1fc6302462e5c135f21b65de3209fa09a4cf993addb2d16273724c8373372b7f0e550e57bc9f90b4d5570c31e8e9dacd34d1f9d2704418869c8d342672ad330aad819675e452298cdf2c00286b19b51cad5925c9cf1149cbc16d2410a64e8af73fd6fa590fd4055c698f26af60e6f9ab90c9d10841947ad227e1e31e5e6191a8bed46704ec19741e1003f61bc178acacaeb55daedd3d6913833b717319560f66d1fe62827e1402e61c1d43f7ca1bfb961d8e7381ccdd092bcc92787c843651b595547943009418a80bd174f658822dc2548fcd6f8c358c471986659b186555414d63db9d2868ca40045933202f8228e96b5a3d8b99c0d31ca41df249cf9cf4e7cbc5583eb6d9ae493000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010bcf3325a3d3651b148c22eef7f35eb989181b1d328a4409508a0dfa7f4112530207233175db5f2cfe57d9b3af0e5a2f9b50183c53e5ffa602b51e0fc211a78e660fc35803c856770ae38dc9e91cd18eedba4e32a856a128075351825e43e407a20000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b6d44fd7ea3a471a17843c4932232ca86b85589ab588830e779ac138e23d5b8d856fc8c084f4e7dc49e62090bf0d507cfe9470939009992431171019070cb2f2c67d7cd865fd7b194774bb0eb3856be0507b0b9cadf6273cc7a18161ff56dae664ae599f886e261f90712ee27c34ea5bcb552de2069cb2471839d0ec4225284fa3343d3eec5293719f5791f1f07d0b311c13238d4cea0e8f5080b08e40a86282278b54c69662007286eeae7c112079b29b589315e815961cdecdb203b00b8cdca732cd79554cfdf262116b8b4c6cc02ad78839c4463143ac9ef5d4a113c5de7766c194b867a03509fbb7a6860800a457f5d34336eb442debcb4d64fd4c651e91bf603432c84138f8bf72cb4b70e54f212bbb5bdfb63db82f0e0e15a7da9c56aee6e89e09a71ccc0aa90ce535a45cefb9554197e7025404b3ff5dfa00d168eb9bf213cd3cf0fb3c980335581e8fcb3625645122ad888deff2aa3d6dbd10e85a2f983cdddc75ee72c2565bb12895c86e436aa0bed97d998644e211e86106bd7a5213cca489059706ba6112f4868af5c305bedb85f6154932f8c85df326ed4553c772a729bd1d1618601e32e8a0610e7cee764c92b02b21cad1051b14fa011238800000228000002240000022010478ac23754053413cd0724a81a8866c28b6e78dd99796816ad8635a8678f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000302cb23a29ce59b489f40c92dc1d99f9bf7511adc4eea03388c6f2228f2e3d3fa0cf176d5dbff9cce476bb18184853a63d4634cdc5f11794a77efcfe231d8fefc31917cec5fd8bf33150e81081631897d63eb7c5d4f4e80fe494425229697f1306135c3c147abaf91aed6a663a2cf0b6f63648cedf0ef264d439ffa167bb343325bad9f0c29f16bed7fc3dfe75906b10240ac676adbfab443d1ca849e0b538885194bb84db4372cddcc6e226dd8d69d2edb48cb88ea699e944d77c005cdd04c227674465c6f9de98569774a9f86828c8d33b6a12aac07d508f3036d88a3cce2e155a8c905bc168ff098cce8deef4824706c8de5afdfd48ad17ef91f7b917fabb05b7b89c7191cf5d7d79465c4aa8e0b5b0cbf786a11c87eb48d5ea78ae1a04fa1daeb32df8c448f9e2de3d737c6e61a9b53a51332bb31ae4548e99e16f9b31383e7d52a80c13daa5281dde7ece6874e3690d6537f6674fedb84fb47605c995e1c75d05893948407a20366eee05b3445232a4207ce01c3a174ad2ba26cb3407636f47afdcc2b0d3d173779efd3032b1ba83c0363e015d6ebe4c83039da515720721e0f9da5c337a7466e90bfc61d88e80e3d745475f56b508b723111ba4b9a9c7000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400103b15613acfae3d226468682c258eda3ad4b6a7942c1b88af734a45de46d608a02072feea79da39b6d4ce12a3dac76c8596bacc8cf01351cdee70031cf8d96ad540d6b79158221ce98907a80fd6bc66407bc4730c63ba35056f91ef25a1381bd9b0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ce70c8facde4c1466ebc0c550520bde871bda6b28f56290b2c39369fb2e211a1ca43f02b0e552b44de99aa3e8f459b76f8f33328246f44d3dd2d8c58202b5aa94a657724c6f3cc5a366406c43aa111e8c2a61315f9dff06481c17fd238b8c555f16e3e576f1e80530fc1466c64f66e73a1c820190d1a8363f19a42fcea281fe6cfc119ed9251176d0bdac93b7d9880a096adc8ab8faddaff3d8fc28ade24b0c0927dc82fcf21a79a74530fb8df4eada02fea80179f796e2990958a861c7b29f0179a344082772c370c7bf629fe8b7622da764cbe55f9e119bcac527da1c84f45dd0a97b4d65b524b647a878b9ad40aa2c221a7efe29ad648bd6610bea1e3c4307508516998be492a230cc8ae5abc484a242b6d3a4dce74ee230944b0a7e662f2e3719ae194c9f7080d9704c3804ca6222a5e0b42568051e98b93c3284f6a8d395de2b2a52877a9541061799da5a78325efd4bdd7c86f7678f2bb5cea74e48ca00b3508e312a02b5a1e25414c8ef64363a052b89f368601aad5df6edc65075233d6294925058c6cce29e3480a3618bc35c62ea4300e2a363d0d27d58ca0ceca41fdf1141be7149bf9af9ca17cad4fd224a77a9699b5b15120a464869588247be00000228000002240000022000ba3271e33b5662cb6927fcaa299252c8083dfd16ed252180107a44fdde810600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062401912799fb118ee5f8d03d0e77836d3feaf2931d68be0f8e0803b5b88c3fe4c8e2b7b8aeae6183bc3df7832af3d8b89b8c53bacbb08f9348b306c00e323d36e1c1925ddcc16fe74a0de0bff8f71377e369a85ba4d4923616ef2d51c3e393818f13b739706f786434692e940323b81316b44a9d4c983ce0604fae4e8c227df0160794a3eb8181b3e3ce944a5b7afc8358c35b00aa6eabaad076436522605d7f4aa4941132055631aa19935fe86a2670c43460e753dea930e7a8d8f6668554daae2189c8855a100ba8f2dc3ee9477135934cbce965687362e9d205224dcd0034fa82809b8998002c3c09c20fe164bbbe8c628431c4a17e7ccc10d4bab4c22278dc48b4a75a6ddc4d8ca6acc3e7422d81a37259deaabd20d7415c3c3c9d1b312039457230fdd25f041f226b725bca97d091aeffd0586908274de6d7abb6f012f206e5ed2ba02933c50c021bf47abc8b782750b0d472d34a9e4e708dd9678399ac59cb077f57b43e3c33873ca8b5d863c7f6b566469350956fc0448d295385728b981e37e27f9f8eb6c0ae7139ae7477cf9cc968cc3aec0bb33a9687440e799f3e21915f2b38a665ec00fbfb282d35fd36d6da62b27c31e116972959b3eaa380000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012aa10da5258dd99a5b8ab4ebd5d97723301549415eaefc284592046e4868a66a020c7cf2ca10cf51102273b2045842f839db7e1bce9d3768ab9847725bf558454203054184e4d64064d0c417e0543d7a9ce1b3375e761eb725fb6e06d837b9470e0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009dcb0be510d0ec11a01600b81493867e42cedccabbf466f0a5b480aede22d001c0c0b7e3efaff5c4c5eced362cda7d3d7464491e46ed4b9958b5310570d2894d255bf7a104f8741d508239fa057812cc5a9c574af2de2d16964b17e897a4330feb790de383469d6c3017f58022720cec6ee1d1f0c5f51b764a846d41a58a83d81a5d1aa24b294c475d6251070356cad911627543423941859cdda03e26f63320d20805007719c98824a5319ff438850ab2b5b172d43b685ca1f940595513eb437dd9793deece1752446651676654f2b9e4c35b18e770cdba6c64b1fb7c943695c440ba2e609eff2467aea4332a8b88d8bb0c2f3ece77281ed8c3c7a2ee5b6a3a40b57bd5e68bc2beff1d4e4c46bb472740ae80303865fc9b262839160ed36b1ec9a667877cb45203a25c8cb4f6850a9a3f80dcf679f58038b242732c977dae57a435482ed93ecf413d41655af7902f8a50e78aadce28cc1499a38da3e378b74c0c10526eb9d9bcd8471456f7bc06116baaf139c35341b804539187d99b606467f3324dadde396711dc5f9c9d8ffb74303e6cdd5e427baf6201ca8959e95f5cfa614dacb66cb253cc4d95a70a0869e5090811f02e2932617608eabde9c4569e7e000002280000022400000220040b1ba3aa36253a5caba5151998e74adf081c72cdbf5ee13fd56b7a7599dd0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f8cd1ec952dec8f9068d77ad710a2e296130f78c93c48e49daa334de3c190198899c320e9a17383cfaf85be1fb174775c3d1bd08205dde2bef328a3e31092e5d19f7dd96c76fd921fa5d1ba506be4e2ac8e41d6f5b709f6039c145b0ada7ee1805039632468ddaa9a27ac349725a9ecf986308b8aa3d987a2490ced5ffdc5544e093ef1b7f38391b8bb9cdb332cba5f59a6345a50cc0ed8960d3331a5270eb013862c2a9b36b015cd2f56785bc0c1af99b3001a5f8cf4566790d72f09db025849d04a7f1528df0312b19b6697717bc01f7ef42c9f0814be6e715864e72a8c01b0d415f7f9ad15bac6636c3eecc504fdf5101afdfb52b7d5928c0cf2a92dc07326038f87126b312c43846e9be85679fd0f097fee803c5b8cfa89e9590d8197275cf07a1920d611568ffaa7a5880bd9e054ee108269010646f8f1a6b8f34c0e472d5bf772e5c3955cc5beb133639b0e54b4063bf41f4421e48f7f851c54c7959b726de6034244a2aa30489ebaec096b3de97c6f7aa67d8d272ce9c1eed4c68259a8c95534b13314127b9c8a73fa0840ac511df7a93996fc35f8209eb1a70313932828faf4ba2beb55732988f4e3298ae8ec0302b3ee8cc15bdf6c88a9df6ecc2000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400104a78d9cd6eb6d6cef53cc1aa43bb5628742feb54f117bf0d14fe4bd4e916b97020d0a9bb490cf06b1fa6652e39c099feb64f4f03c1638a3d579fd70fb5d9bf5c8068b83b53d29ae49dad2a690d7b062038d3c2d5b928f1fb54c3c94cc832746cf00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093194692a00c901afedac70760f4e77e3618dad7835f2ce3f1d582cc6f1b74b5eca2522d7616c9d9c62d06c8cdba18491a53b1b436d166cf4eca90e630d6c5201fcad53a4a8bbfeff97f72984db851b24eaefaca73107f8a144d4ebae2f344656b24a362bc70ec139ea026fa4920560de4bb89e0a5f475111331488bfd7aeca7007c4b0f4e03c006056038eb06b33410cc047cbdf99a4edb4962c80e910135ab0f17857877a5f6a7269e5abdf51088b5a10d56f834c5d8dff93841e86dcbdc74a4110b653060f0aea07e62d59b95d49a818f692672316f33fc1b1f2ac2f69aa57a7c8f17b86d460008a024d8fe9802fcc1932407681a5d6b8c3cd88ed08303b6acd5ac644f59247f6a9af30dfc7474d474ab8c5c5774b5fd6269ffa0b78ca49a74d44214dec5ab35b71ea9065acaaf4cc093fffc5c41093f9fb4a47177b6d9e5549cb8c9071ff5134c0c557791b1a48fe090128800d8e1b1ba3aaa09404ee7f6a471429047fdf3a6707bb9fddce2814d1287128ed31e32da1ce605a5dcf6fe30d489fa8b3009bcf1ab054ac0abc27029e2c7dcb480228f54e58e9c19e6bf33ec96d2de4f5a0b85a19451c29e70f995d84ceb195a4448338830d1d1f4737104ca0000022800000224000002200e30cdaca4afe3301c650cf1e24cbb4cb0b506a06e21ecbe722b784fcc6e942d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ec47634f29e98f093f4fce2f30b78cf4cb324743d07d224051b7dc20edd53211f43f01564387e25b2608caf27d0dd900801cc34c11e5df13a969ce8305fa0073fe67383a901ad99d5c023a60d44ec3498e23dd51bb5dd7b1ae1ec73cf074d8bd33e250e34f74de44745beeaa5afdc70dd1b7c129cdfbfa7641a176d951b9493f658fc691e3645b7447971b747bd15f1d39de4503651a04fe1bd060fd233defa08cea975f35f68b96b42e897deabfcfef816279a24c6d59bea1b90b622ea1d4ac494ace731cd6eff5ff5a0c457d4b66bfb3a45c012ed60b7a23654a78146dba9ced8346798a6c290b6e26e537d1702f350545884e9799223ccec22098f3b0da8c7470894b80a2c95e0831aa6a1565728f9548217e16f5886aee09f62163e74018c1965cca12b64abe0cd76a66204c2b7e9ed3ec7cd451dd6bda9d9ea0e61ece551741f37512167cdbe49ccaa0c454966d0b20c169209016ec018b64f192e2ceb914fb6893f19c6f525db50db863ca94da2caae67c6d1e5b9f0d37468bb77b166833d162fc4665e0345d55e3f890ffc66b45c033497dd6a7b6e198fde3533391170017781e667a4a8dd7598c4698938e71ad99f157257ec46227e4bcd4e44629b000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00215232c4e0b60bd301a6c09074c1b72fc177963a8c7d197e534989967dbaa4fb11607776a1eaa07effa33bbf46ac89274f8a79c3ebb75a2d88fa98960e7f629e4020f8281e1a0f42983ba9c088b825e1b2ad0a043da72ff54a0cae0f3439cadff8e282c05dc747099ae0bdedf3b611e7aba84e6e039693ed524ec6a02d7e927a59300000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c8352bd0888a042baad5713c25af923cd3499030358c3869153646806238bba37117f5a360da7ad5ed2d856a60fefbc32bb5bffa090a9987782bfc7441cabb93adcaeb69ac8dd922bc7d43637cf64b7e68450daec5dddc3fcecca62d97b48022c8e929af01f27dcf6433eb76d9d1f8e01ae7f4a8385d7929b74ecd96dd429d3c5c8058cd3966efca51205c2d1741f0db2a63ffa4201d84ac174253ee4dc49fc4dd63d251ee45ceff71ad16be8785b80ef46fb7a10367a13b64767de2866f28274bc1b9f97b493f78376ed135fb8a4bcf56f273c71f99d680b9d0cb288b684bb2f4256be1d576e8575931bcfaa3e04a1d0a749b1b6caf80ba33459eeac23942d25013b1a33043f3e39dd1a22010adada1b09c07b44438d520cf228aada8f4dc5fdce9bd8678221a2a725c312aec7d91d3cb17f8005630bcc2e80e1551cc49951193277843ce57cbe4668d29be9e6e807010816cd386c8bfb5cd5f405232349b2aabccb76628214e7842beb4288dcb3ebb9ee6939e1dab8180fcfa876748a852576fb96d7e5851bd10b3d8e779135a36191d327438c01b1109293f741be71080831f840125579762bdca172736d87a7ffa48bab85ec2e41131ad5b09330a81a9300000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000758f8a354e5a68040cdcf3be78460aba3fe887a6848f5be079541fee568f406a444d63f21a2ae79779ef14bff5978904e7fe74ce5e0030bca24741664786820c833fba6fb71990370052ae2d8dd2f1eb8454da6c46de1c9907e7f0fe825d074f553c83383c6f81661bc2f8f8c9e9608303d33c567be494d631652ca8bdb40deeb1cdd1fdb09ff108b025b1e3c93926a97119099b6bd026357cb95406c617f144f28a38a20a445485fb127352831e316bc3e1c7d42743b983cff39082d3785a2640150386d0500c9ebf82ec2cd950cb54e63564e5f7c919b8a7ca7f4d9b47db2e7aee2ca9500eebf668edea4fd87be8d4871bba2030e952b49f774675c4cb99f895c26962323d8919072d8e0f08557d4b076b73265fe742933a2f3c05b0a5d633bebc7ff966d78ccd47fbc8cc4412e44febfb8219779e2890b93c00c99e2a890318c2ea0c1591b1cd3d3b4df68e92ee4564d89ddbcc1ce8640c68ae0c1a980ed64cff37a315c9b2e3bfb703c6d92c6d3f06ec9e95431886e63f8dd8c371d2ffc77f667d6a3600ae3ee1e78c3689b40836b21d4a7544597ab6dac942369ec8de28dd118391f4e846549490b769bace319ea28183d3b86a7788df0b1ae47880f2c000002280000022400000220019caaa4d26c14ba3aaf75a8cf21e9c8287fde84fa2b4fc099063134a87f45ca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008271ca8e99a9bfbd1f8832fec3cc9d1604ab3672590fa1617fc115d00d8870effacb390884c361f371f8cbc7bab9a269a23719e106029ef9d94d14fe8670748f1bcb462bc1a900d07a77023db496bc676de2a3e66d506212e0f15cb1ab241b51a7b6a437867292d41af858d5c90e9428770e2cfdd4a4efd29246f9f21cd9eb52acb34b1f0bb695171181ccaeda064a478fd98068aca62c8c8bcf8d5ac7cb720c0792fd9b45a48741cec17b5b4c4038667d84d31f5ff095115943f7b8be5a123f816cce9d4d663d2b289344ea3a3de63b9f514ec589471389182b8a8321fb096a58aef4bf14ab84eb830083e7d77208f81fb3a406a6132fa13e04211e9b86a31f45a203be92244fad3964fb50a7597a1c77696cda9dcb03b06bcc063310a47ad1e3bd6a541d291d71913249b9228cc6500bdc5b27f614252ebe2f8cacef8d63e8fabb0062a78206bc4f48e41141a04446329de6c7def803ff47d9582c782799277f10a813425a06a76945b3e7efea279873d44796807d052ec6da26ecf2c98c9770a01b16311d93f4e3ddb9a43c61197a24a5af5311aac2df794133c74f0cf619c2c7847427647138566533ce3f7b880baba4201d1cfcd9d6493922726ee7e5f8000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011b84241953adb6fd00081a41c913341a592821e36e7b610c9ec960df99e46ae9020fc0b7ab457d938b54281bd72ecbc2c3f910c89b71c7caeadc17a61ef3ff461a0582a80215801b1567cefb8505b691aa9b9b116ececf62bc58534b1db76cbffd000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a127864fdb3dd0b87d4b1684f2786fbfc7962b5c2bf7adbb49545eda27aacf9e01cc2dc75459ecf0ac99324d4dd288a8982e33da8f1cc2313e6dbb1d1725fbd303fd203fb00d0a3989c5e70c70d5f31fe59e10e86fa9e1299000eccbf82249cdcd2e73130982d34cea50fd7f56d3cca5bbe03fcea7acbd89829f1768ca007da1cf5cce8ecd143c6e37371e738358eb92ecfa85c3193a7e91b34ef1722432eea5f096c7cf8b3aac61725678a8a07a60616c42424b1d99e34131d8957931c7a94a89ebde4843557ae660a20fdef53446801155c83c18a3337bac35e5730106ae37c4efa838803a320196a42d8ed4b1b36fb6268f7de4230e18c03b5332f4d04b95a0c8e47c9bb95716c74ef32ccedc80c1227ed2746ff8a61e0d98e720f92903ab59ad7914c7dd07cebdc9bc81a7aa799b89f29fc8056a60fdcabcf0a13d73f0d2ea735b21d11be61497be497ef4f11a94b2ed5c74903e097d01e3a371c56361f273b47f1eff1f8b8d4f83a3ca42fe54d91df0947206c351a99dd85d7f68ec398ce15c85586c23481f088df5bd89616a0185301284d4ba60a3bb3380378fa21b90d1524c265a4a2eebf8dcf6fe996a8cb0e254eedf9851585d00433663524b66e10000022800000224000002202835fe7b51af98bb61b71378903527775fb40b8460f3f2b84aa7db9675180b8a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c6382ac99ca5be94cf061177b7aa786e44bb1078fde5682bb12145b63f131968f9bef8869d110957afb0befa0635f1582672fca34565d986bbe12fb63fb18e64f6a3731199d4ddc4dbfd57aa616e8a29eff8c5c34ef6444cf82a3121d3c3640cc395cd070f12de455f481aabc2d25c6a07e5d154cbef0d073f2aba3784eec95d7e7b144adb32840dd6ede461ad1ebdfddabd24f44f5b245245eb51960336be2a635fb990cb3fb6f3a44b0ee8602258beeacb33e1b8cd8abee88d1369687f8ab7c9ae9bd720d840c5e0ccac3b308cfb0a496c0d3e9f9c8e921da4664f2215dfeb4dccdaf420ab893abd449c8d6ac4e647fee1c75943500860d1d32c797a70e95ff85d8ec42b84c6afa0e0c7f1b49689e4c85bd82dcae364352596a68d604388370d8405ed88e72144400c86cc3b2c7cb144295a2047921fff7dab3de2bb3e0949f3d0f6b0eb53dc1953bec45b29ac07877fcb9c01a7d42a7c49aee07ccf098a3f081fbddbe7c0382e79fa044f68a268efd350747bdf646f35c863d5b7eccf8f4fe0b6af4ea8148d4483de95fcebce36e0b5cc8bd6cfcac4fcd75aeed39b7a366c7056cbc2b0f1b3b8fd8c0b06b36249c4ef496d0ec9ee76fc6f46ff62a14ddad000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010fd19ce9c78e705da7bb9293be8a2cf50c9d56b9eddaab7c6abe524da362147e02104010b69dc9a0479fbf0a371d09d5233574a224408051554f60b3a3f9016ac101fa9c909d989dce5b4312f50261cf403bd5c35e6be83ce9ea058c402447dfd80000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ef00ab3b58429323d6038a3aa6cb1a942d1d82fac991533a9e840637ecfd1767a190000d2886a812fd4cc760e10e602687ab6d3f12f242d6a2e8a5030ffc206f48f34f261605f1380497abffbcc5a891e75ed4f9485ff6e16d20a853bf57f4a98e997702d05867c50411a029673ceb1ea9ec6b1007799626d04fb62c74b36ef3b1247b988b4e7e54f0c5a55128fc33438930bb4ea0268deaf53e03a104a11c9b55149b7bda47068da4b7ae232e0d0b78680b6052600ce3cd3d1d7e58b439ca8ed0912b4f3ca32fda398ee2be6910240fad91643f4afb8d9d0973eed72044a8e82a8405ed041c2e9daed8e0b8252b7e471abe319086606e5fe049ee976869ca1873a0f541a8b7cd212def917e0b157c777416dce41f4f6255dfe8b8e0579e082400f7b73bcf02034423e7833ea958b13df07ec6cb9f03bdaba5f04664891a669771ec005ed89a3e4d5859986e54fa99b14950af67e55a03c41246a93cf1f94773c69a4f80dc00232cbd5bf767fc35478ffe37e737527c1262a0309d2a9453032917315d4d40c89abfdd1f6c02ae3c2335c582b88f05eefa2fdac59939d5147df5cf8979a9cbf9f3fae2f7a16bd0507ce95f49e9a7d1733b5854fb5a57864b6900000022800000224000002202c8af824ecab3d1058f12503de766ef18a771fef9876e0c98c953ff1ec0fce35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ae8ab5c4e92e31888107b0c9c9adfc6c04eab07f87f6919109939e56c177d47e43de240d0f380c686554e9bccc1b09c4c68536afc8243bfa86a049e27b58f2ab81ce206e6282b9cdd8456f327b6d2292dbbca03d33fe253e362ddda8714cbe28f941c8915e1b1f2341e6d219e881f516cb4678cd6153b6832d44b100540d98817adb5290731203a416d9c94087fd836ee0b0fa411c4d71663d30fcbd638a7d80b2646b9a601a89d07028eb7439acba3d589178ecfdbeccdf181bbd62a2d8f4b6a38c182a3abbceacf05d3cfcda134f56f648fbbdfd59f7f7236d64f72660cf7e5aff26b5551cca2239ef7d778a32635d516ce4d6c0fcc3997d1353193cd0a3f75163761059ce0c2eccc9ca73b3ffef9f3cb7aed8408ab9bffbe70d6093d849d778fc0a6f94a6d7178a702a8d62cffa04943491c2d660bf77a2941b57b9b7a1fe5ee78b0cf1b2625d319452c23fd58fc64300904a60aa6d117a9ab380d3388f2b192a6d99a6f54180ff9f04e1329adc3414759f2075c9bdaea01070b76d8660c8d78fd1e2aa62cbde8de74d744e925cae4bd4344eb0fbba265b931e60e85c977a81e63ddaa2f89f1613c6d1b495b99e63959aed096ae2ef3035022742d4adb8f000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010cbd0b8bdadbed4a3a50678b7183024e8087035b86c3ef4f84ddd1c9c3ce6c7e02115ed3caf9a1c8066e9aa0c9706c3d93717ef8fad95dc8a10aa5f66334530a031dc7206768586f89969c4e8eacd4a0253ba5f952da9f5fa14c501b00fc289e6a0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be7ab5842b4c0b59f1b514da46776984006ef69eb51675c4a98814fd4c1fbebe6e36b11aa8d000ba6da507f33217b4e87633d7df3bcb165151393bb2c6b3d851708e3c7debbbb3618e2a334affe050c57f597aaa694dccecff83c9348b7306e6d1c5cc7e4fd11eaef834d5883b0422200fc72c90ddb9bf2185236ed5ad286caecb006159a51d2cc737187cc2bb3168d4ae080d424bc5e4eecae66b2be920ceccd08ea18e5ea340a87ac88b06a737204eeb1f499560a10c099575c71b4ffdcfe332073e87e043e53360d9c7f936e943f1769033058bdfbf3264c7810247e2574be1d64d2614bf8a5d674f65b55e43644a9d195ad29795839ae499a77dffb39e167b1dd8fd2243f60bf848ec5ae133fb9c9ffd7b2cab68577d81140b198b9218bf172a082269622129ea17a87d5030e34ccef57cfa5180487878e0c7617fc2063e9b33189ac139f3cef1e8295893cf3816d5142d30f4d893a8805b2842aecbd9efc9497b050232df2cc6ff87cd650b63531e2d8b0a0986fd7ced6179e2410038647f0721244608a1aa07461b5bf07388264106e57ba284288ec4bb65d626ce73eb4f84e80228393b94868e2698b570107432c9a699ba651a714cf0c0ec9209d3300000228000002240000022018ac1a2cf226b158b763a05e289a1201e431fd1e5463ef6b397de736bba4ac6f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6005c0b9ca1466959d28e6441c526e2ca273fb15e6f5c9fa36646b6b48dddd59c3b10fcb24aa113e082c84add14b6c4b0288bd42f43713407e82aa97ca82f35eff376ca8024ea6e79d3cd6a7c41d3349f3d021eeab1ad6caadc46e1828dfad4be342292e6e81aeae4bbcfa4dffde04f41ad3bbce2b672985b599190841c0b2246e2d58bda64d128d20c8940115d57309f4661e051519474e5de708d82778736f74c18db61d23b0c3566fc3be432f49c0982cfcd226b4395081bbeea991b0157c36b7ff9029c9d6f743f294cf49f72a8bcf94d82764107d4b434e5c2c56eaae34208f2d3e2e10259a2d0fab45c734fd004d4e81007e7c9832ad0ee40caf870d72dcdd7dba52ba6035d5984140ec8db3d132a6c3231367fe579bb0dcd4d08b2d32a6218f1e6fd303ea4a02f3cc705a476ad0f646505b7627454d30354469a5158eaa32c89594b28b4942725c9574e6be57567fed84fa2cd438b16543ffe50d2e778a2d86095de666fe6ea82238fe16a7a9cc2a24df0c138b39ec72e2fba8bf69afb6658b9ef5df6432fb18cbc1a64d4b87dc7a44b5b7295cc4541c3b4ba0a364c36878eb656c1dbdfd41855dd546c6b8859586f504c49135f07c12e5dad505b9c000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001060b23c75a9bda4245d0adac92d837ad1384e3211316ec68f3b4eab3c9796cc1021284b62e3a6dbd544b052ee1a68a14a1133c34751491b06271756eb767580146092c4cfcfea0756831e22133f8fcf83acdb93bb8635fe29c4978ab829a6993c20000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b243737fb6536962e306d7f1a3f8f8e90335c79791e4202b22049ad3bbc3c43d7e0d23f4dfdbcf167c57005bee7d7e81de64171e35521b56bde0748d65919a22f8e4170344744da3fe6efb3dabd53623350a6b3e830aaaa7953c2e0fdabeab830e260cc3fee2224264c475a96c7959c3f9a988b2986347ee6d9e724b9443e4a856c7ba4389180a1a5f37ad84eba7700100d2d075fa18fa9404312099d0a481d0a5f0e9c94c91f35f4348346d426cc71a9f387eeeb27086839dfc75c6b2639e95e8d2c3b00818c6d46b4c87a28d75e2a7d897f6c4f0dc05e6436976693c231ce031e942c6bd687a4c5953a03743cd06275217e526de6a73589370da95f3180d8e74b15e096098200ac68049c7894775b45b96b25d1ade680666b21c77d535982cc962ba5a48f3cc813fab393952094f6324b01cd022c552a367fc78b40504d7fb7dd6f0f5500cc1aa1b97e7b62bede3e446b3aef825cbab230ae827c59e338a7602c1f77280e57183c403bc566d4d817ae808ee4113d1af56ecffbad78bf26125a89a91fe95e86dd573eb66c9f6399ba583a93d7a9d8e8095f2ebf02dc8e12b6a0b822ad40cca867d9e7e9666fd7db6f5c1304b3f0dba5008dbe70c36ca52915000002280000022400000220041185819e94de874aecef59c294dd3e6791cbc0907114fca7dab51d5cc35f970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015162d2a16d189aa7af9a458acb159ae50fd07d1fd67a25ffa785b4006a2cbd42c06bcf6639bdc19486f65220066c36234574190fe51a106eb68fc518e63b15daae3705d64de49b3b35303afda4a2b1d8d818b1908d099a0b3ecb19f8d08a13153652344b504b66ac0b17f6ceb0d112a35105b9de68eca0d9e9a4dde84ab29c50436b120ea85edf1498f2f19ec73c790c45fbafca9ccf45f3e4ad0dc244885d08cc743afd4603c067a8cbc333e5eb4530199eab9c2c002dbbd67e68426a7aac8e4ce50042402139fe7e1b1a1f0a50356b742e89f7ce148904c587fe374daee8cc32c9a26c39522051bde1e8c89dcf1f56e597cd80fde8968f8b8d9891046b8a657daae3ba89e310d3f78495bac4b337977300cf2b87a1dacdf6154b7dc63411a61c07dfcfe249fae3fb36589e37b5c2a112b1404608067feef6d13e99fa04013f576ddbc40055febf37f29d549d4f6cc9fa42abd679f3c4c3810d2860940144b1a5b3f143c6550ad6a687a7204bf029088a3831eea08f1fb6e48b7565cfb4d0e8c1a088be8c9a44ee3e54fbef7071b1a6bfbc8f0bcbb74d66f66435de9d0130ea6759a44c3e07bf17669037803f13587d150c74f9d02970a59f27041cc296e30000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001197da02cc648aa2a67f67f222c13dab883d8cc8043be8ffd1dcde32091d431680212e2cb68fe640853a96cfbd27299925927796916e146d6d6a8020108a5767cbc0186f9166c7d96aec4770612f30f1c3a3dc4b137dc05235642cddff09e14176700000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099a13750fa58de7be111e654d260d1e71cedab118eb883e8bfa50a039c681d82e79a2e35cc0749210e65400eb12134acefc1e3fb99e36ba8504231cbfe6c9e25d9e680aa0bb57e7cd1c31add5978fa95bdb77aee71c10433905f670af22ef8f78bf1e813b8df03f78aa4e9ae3a49d671fa5581d66659af2ba3141272b1f2b4ebfc269c0468c33baee20fa8610836695ce7fa7ea6db9d938289bc21762729a4e02da766f27239018039996910a4e4296662cdf3ed1769733d5455f668b3588835daa713080f20413fe6df4c2e936ce331a9486763d58561fdb8373baca1fadf024d1cfa13ba0b56fcdb6c875167912681e0bf463039dd6a65f9b1410afef75e36f61c3a7290d4a1de701f60ff01208b8736ab73204be47ad090f9f3162d27abddc65b29639dd27ef9308420279070194776d660578fcb30da3ccfb6128d1e63f5039ea94f162d71c3c19f3e5f21509537bf42110624f83e5abc6526d03730398396610df31f181ca0f404936229d0b6bfb2bf0242297f68238265e7fef4eefbb63e793befffc74125670eade8b9d21233c5c11ef83ab6f08cb9e25999383addeafd715618dc27e5f5277df086a120a2217bf7ac3b94e0be8800ce30d5b0e644110000022800000224000002200eb2572ead9a6d36cf62c8593b0b08a4f18c6dd8eac9075e92aa870362825d0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000967d469737b7adf47de0ec3a13bddf866d3caf1cd9c7bf30c7f81942126b392d792e5f02ca32185e4236cbea06cf62f367d1315d27914e3daa175152475c1dacf5d333bc1cda45550d1e4d02fb3bbc569adedd2b51d7cd86b5ffa31e8910f80d9412cfff4d2396148531bb38c7bebd6d3e19caf56bdbf1dd2ca239180e03f0060721448de9752cc6073838438031f8708703a9ea52f56d2c53c70173ccc313b828ce47bdc9587e6f4c876871105c5ebf9204b5f6b270c1964b6be8b9bdbfa6631a1fb04d9080583b7958ed032e2591f7817a76be41ad85b875dd46d7c25a9bad53c6b1e1677341ad8cd02e644647db7cf8885d030875ac35b842f538615bb179965490b8926e65059ed8d1c8cff4ab9566c451668adf8cee109d87307ba9dc3f761f04bf21843eb6b31de17b1f9e81ac74eff570cf08089796349dedd058eb03dcb7faea801dfb41081cecf311ec1904bb8f9df7c241d135b517d4f94e7fdf74a37e7985906a23bf222402f14cb5ea81703c426b073aa0b46c2dcbfd1937edab881fde37302127fe6654d7feeb939e298cd9c09d763b9d8f9a8b6b4fb44237bb430a9e82be379361df40fe0fe0ff55e49bfa1feb46dd042b83b4284907be13fc000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00206efdb600523ede54f07ba69c4732438b907021292a590f293ebd45d701cb74d05728d12ebe65cd397ea104f35acf1e444f3d13e8373583ea06dfe894e9daa130213f76e32ccaecb179fc3070363132b5c0a2e9436867db01dbcdd3fbab65dad3927f9887b4ed236f7a02e88bb484bbabc76d2748bd3cfb13767d818c9905cac6b00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002fb3f724c50873023041cd940349f8c89caa658273e66e3e6990f5ccf0706f984b67020d99a7e9f2fe85242d2ef23c0c2b87e0a782ba77faa372dc2dcea7b2e2d81b4d59bacd5bfc3c08bb96c61527ea0a733df9fc9dcb61630b3a10c74b0e83faff4200a5158aa55c6c3fa9019793672ec9acd1719b7319d3d1557a1c71c6205fbcc68847f6f8f9a3f43a60203321c63fd0f36e7dade115be3e50a058cec36409edf82329c1fc6a896e50de9b31fd33348705d5f5d3c19010855954293b3ecfb1a45690f85fcfa648d021170f4c4794354f571b5dc0911d83cd394720a2445b33ffec7579a21da7711a8e561c3fae967c0a714a136b87e8d8f97a4aea32367c960a00e3f11fcd404ca0f0bb30952b7510b7facf7301a093588170434826128c3c36a493141b1b22a594e5c5e52e7d1fe7f31752068ec3564f1c5fd827e6cc1dde2bcf52a15e6a66085367b95ef29682eb931952ea6e923f5e2ad59c1d3107f719b7e6156b18d776ca41cae40a361c9b2fc1a427635371ddb00b39271ce65ae8df21c8ce68406ce736dce2ee1bda5f22197871cb2bfd5cedca2f2e978717f65dad2e825f8a4a5d0ec3d40dc948eb5af2641a7f504e4f6eb4d1190081882fe9b70000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab37197045d0f8bc256c614f1c3d38facff07ef8e836a0aa985e7ee8134e3df3a0f34f2cb92395001e02905a2439e222dc33399489f8be59825e7382e1c9828f23564a592b61221b98d10546619f6cd9261d1c01fb0ca30a85009c626cc6db79bf182c3d2af51a6772ed3a7197808fa8f6cc70fddd6195908ce6147c5a790859cd523334abf7cb54f6a2a967643ca572dac6a8c27ca7c4ec06f10ef914f10cc36edb2919b2c0cee798109c85648ab36412d789c30f57c00798fa57dc88ef345cc4eb4d59e675955a58cd8f72fb2404c5372d4c13d4da692b9ba35709063fbecee8ca3c181a7384db80eb1a61549b98800c40d41b4cdecaad1aaf7ddb87cf18854c19259a14125f4d16109f8ce2d0b48d07ed3aa6e0cba902389243123b909a1ce111c6070b9c7f39252ba99e036e72af5e512a8bff1a1e2ca3a3708400d8ab064ce4df96820abce817c4eb1ceb7f3f1c2e3723cb71f8381f2a57ac3c8fb8bbd9755a8f6f04ab7b46f2c5c7b6ed2a4344333bd90a3a8466c62424a1b57e299efbcc27808e683d6e1fe0638cef26ae37b9e4c7dcea7e5fc32c367477512272d5a5835da95271cac1aef9273270bbefdea82b507f75c0cf0d0c4925f3fc04202b090000022800000224000002200bd2cf7c09d42712f30279d908dd81edce5feda8beb199c29b7fbfc7b25bfa26000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009398f6a01ecfe3791fe7f5ffb1287593b543c8ee729efa90a54ae78fe829fabfd199bb2bef7772f6c7018b0383092375cf8fe8fa80c4496976e5de5a221ffceadf2557bea43bd130512b8533c6dd6bf9bd7b70abc46bd2f586c5a96fc123162bc11610460ff222ec9313739aecaf296184614af7654460be8c363d8795ded506407980d3be633d7d9d38fe29bcd79175070db47512dcc660933422e65d4b5e2a715e7ace4f85a21ddf243ff4c7fd7587a14da90219c41e8563db0cd92abea64b5e3113f73c7cbb1336adcca04535b51eea442c7092f832bf145fbeb827b6e04cc7477f562d3f4bfc935b1577e727d6ca03f0a0b24f75a951991e9fdbb04324e982edae5a82bb154bd4b381c2dbb9c1fadecdfc8c3e772d4199ae9d8f5523d11f94811d72fcca4735e771c3a2863680b3af70ac268b8f5791754d2bae11c3faeb1221a89febe52714916374388e8734310dd5740f500395f40846696c13c667cc300498b8f3d2df9879ff0438221f0dbdbe94fe23c93300976daf995886fab801558c7c03937ea82f9dcf8b947b6af330cf87f67f1b291172b19490057ea63d82517fac9d47dd232324f6f2710c211091667f5646934271203e07b85b71345c2c000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002112ecb044bcd7e3aa99f2f32ed43806e3c0a8d6c45b1f928c7243881506a1e1e1349bc3c99f1465395ba78e2237a0b69c94bf16e6f0e0c5ed8b8d87f0292c9430215cfe288ddcc80884744671662ee96d67dfcb22428a5777b0cc77c8b8c94e5230557ee36aca8aac162790ebd83e89fd34d0a49551a58058c2508c2f12a0266f400000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008536bfd6c158f35693287143dbbe19945360c4aa483eef75819f7b94d1366e8214ee6034df05b78ce86ea86ee7086911f4a7b19af8107eaae5652521237669cd485a05e96f6990f33098a84a35c34d316de59f96cf572ff23d417a3754c0d220a6a14472f32ad8432cb4505b834661cadfcaa4aa514bff8a6a91e9f1ce5ebda07578701d1bc99b08b84a9d678a876fe1d55ed19e58c628e43f36ebc27eb9e24c19a5d92b5d66c39a191e10fd79d7e315d291f4247984b4b08c0c386ed461eaaded98a2fca5bbd6f80d7b636de25004ee040b0d1f7685ab5e5e8bbaee6ed47c7e08d7520cd7d2c5e2810c5fb59d23953c0f3c07e60ccc9ec65c200f4ce04a37b96114d82bbc73096914bb16e51be551500f74cc68ec3523c0050267979215cb56dda5dcb338ceecf833b65d42ddfba018c6c73fee27e6acefbab699ed23be87cf033d62a26df4bb188d2c2faf617957b98b64b6a894ab83cbaf054dca22255a28e407eb882608c341c960fba0e3df01d3cc7c14092c88e0ba32afe9b6a1f2657f80fb491084ddc673f38f7ed99d332816adffc2c0815ea5aeb38004173b381fb0073f90d70d96ab9927e8a90a8cf5a25e5f7cabdb4f902fe8de461b29b961042000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002eed6cdc412db59b10393f845bc4734b2e9c871bd15507e804e4ff6189dfa45da2f70bb0168b112e0a434ec6b5aa9dc7e2ae06daaf04a21b7424fb099e7c8de1d28dd6fa12fe78a9265675e27b110276c5351a7eb9e4f951c9249692c78b19953ff73a017ab26f06ccf2f94c272613cdf719df169a44d555e33b9065771b25cbef4da450f42ba8572f2ca036333f21a37823f5e8d0484c674981bc36c136ea3b4d802e445808d2f5534905273a200fce12b9572869ccd822b2172b55722d40a04a532c940fe02802ffb917b7da1120d74cc0f2f5eb9f80fdf07507c3fa20b0a471184233cc267a3b7d19f283c1811f3c6e17eceaf3b7aca03c66c4cb936e8025cb9b61099fb480dff59ffecf66808d046ee07370af679168f48f9db5569c5a852d4f98279fbf934a54d6291f5bb9d94e2d0ff9b233a1d109b7812cc0740ac2b803c6f02666b38c8ebc86646ae0b27f41ac2a74e73915d885672efb9122604d8b58a52f26a2b8da60aa01dc745233ef50664f1d229ca5a3923975d4bccc5d827da593784928606cc4c69e83137da516b0423a57d8c4cd1269384d3e35e0cc68bd57aa22b2a33481912affd69c28693c00eb6ec097a06eec1702db8b3ae2c3dc810000022800000224000002201a6b2ea6f77fd58bab66ea9607e61c8e9ccd3823875cee055f4c15a2a011137100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a973c7a0c44f9f93546e2e7762d98f22b1be77e650ffb35f10c5f7d0b4af4e8d26a8b3c1ab4ccd711f83c777ff4cc5bfa5477c42668198f2a2f3596e073c367447c5574b72bd382b8925d9494477db246848032cff379e12f03ef275345a8ac20c2fea6a63974aa412f2df74e8404d0361e3567f795e622a62b15f4d87ba2be0ebff3fae569c65b163b60d7fa727ad0efcb890568452cb7b6a9d8392fdc78dc0d256a1b18590a8b61899ba7701463d5f2d199ee3cde1d824d164effb83a79c14d5973d4af89349cca4ec00a37c918da25c18a4caa2116c4815eb0870c39cf0214fbbce90c8d2e82c55b31739ec0040067614018f28c530bdab099c12c6a5c08700cbf97ca55bec5dd8e3d18253100d732cb04743bd78e527e498db91b017485b922e7fe70f37c9ded6faebb625c781d518a8ce8009afc1655d1bc41e1dc043ca02a5df0592758a6fc9de17e220d1f18490ac73bcb164b88b631c7b64e5e3e0a38a6af1e3abc524ccc81b4ddecc057d28436d474d8231c8fca739ff4f768ae63931e45fd74221909b65d189fbea5df820f84fed584e47e3b87b0c58fd6e5e1b6abd4eb5669737a3db9e8d4c24ff4bf34418a04bea42d5011ab3c040770425bb3b000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400121809716c4f3900e941c227911670fe733bd1ce2bc483875f29b8b0343db7efe02176188c5123d25b8d89114e3e0fb1c7276a263a5308d7f26a20e7ada95410ea3022673f1a426a7e6b04c1fb7be75b8a8debb340edae3633c03d42f34bf701a5c00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085415e88d19d29f89a5b1a22c8ccf00a6660d0c67a3f176a77c0354d88ab7d0c390d8534ee9373d3b2544344f148d7aed28234cdec1a0e0760ed7f2c57a56f17f0185469f7e35d1f336ca8f462f588cf25367fd780443c8eb650b1ceecd678e3412cc73c635a7ab76fd2d96ea8ece3952cc26104df6d291a54aa061af94878ca0b3fac3a275eab8453b738fedc8571fb8a9865297afd5583189fe460e5484b9f1f2a4cf3d362cd21c4a5922609ceef4f4af9a3cdd8b947590eb83b525b641a83587131c17e34c4257f8d7cc52c910f3b9960a68d867f791e20f95e8afbf9423a2d5d16888146c5cbee1bca5e76d26f5cf4b3dab8562f6b28e7bf60db75f1477fc0e1a2fca9af8246e8931fbbb2055e9428cf65278cd43fdb3ea38d2f34e03b0d679c70aeeb72d526a66fb23e52f345533fc98a9df5f02d8adaa44af5286d497a03cdfc2928f28e43bf9bd84e043d3a1f44f21e00a6742ac5aa9471e7a868a8fa26091f650a281f4b2018e0c6bf4aa306646b7167818bf948d49f7a90b30795c48dea4ddd4aed0f14809381e7e5410eb36d75def61397ded19f6679d3eaaba5be986a60084b62b53e6d7e8e7e5adb74cfab4cd3930c965b9119d796fc1a0b25620000022800000224000002201bc901c808cbdaa5ffcbc3442b6eb31f2879fedd5b17e920bcc6436bd9aab271000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500cb18b189e86e1d19dc86135a61cd7fb796a6c21e89c2e4a43f5fe6d2ca77f8328dff0df2ab553e4406458a01a778f788cef60c278bcb1a7d6baa84abc0a4062efe2da5825fe09c2018984fa1bfafc86afa7790be8f3b46043a08ee02f733d98ba74fb14eaf38ef197d8d350586637d5fa63072d98065e3ebfe23f2806abd5c86e4134c5a4a12ad57ed318bf0f4d332d46f5b1bbfa0ad500ce3965cc658411dd5be8e4c2ab60ae7eabc683b63ab14a6dce0d9131cc4e3a3df61b30dc939e9d6a4a7cb35685c4c89d59ece6a679fb29a899ea2c5111574bc9072061426a119893f8c102003139c477854755bb93891319242e8b4e1f4ce46ee1335fe0b4453e2046a9c3a518b507768ac38dceda6f4f22c7c6f53e9883d8ee417b5c89d8ab8e2319fdf3095bbe138be383f96f6710b8f2ed8c442c87f74bc2e916e391f457029682ced19646c4f20313ff4d0de68fa2f4f766284b9aa97761d2e6a8dc13bc286905e9576655b4a31b345d92c9db6d06f9756d8628ab1b7e148275ef3b8dafe0c955f1aae070708dcd568c2ca0225f346ef991698f56b47d5f8c9b2f31feaa22a849050f6ae2e7863079f30f54d143012bb72e97e7b5eca2dad881e544fc2f6000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012d499cb456867c6925879135f40be6e69bb4fcb08dd11dd7b8104a80882224d00217d5f2e05ba2d4e46e1d26b5df491bc65cd340253dc4f009dd7ef5dbca0940190aa91b49dc8e6fcbf2e5fccd51b12fc6f2f5d5d70cc470b39bbf79a1eed237710000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d6bc74b74d75df1d6de673a0b44f33b32ea034c0166d0364a49558a92359decb225589a603dd6feb7c85499fada1a6030139640e3288417e1a54aa10a75f9c437944c737e8025d901a399164c196d2b7deab5203336763081074da317b6e014ca7aee7ea7d1364e92c510468571fcdc794b591c2fdae72f8f19f998c476878eee2f7f822a41cbe71d373217078cf36f92049f744fd318b80322f5ed56ca3d603a7a657a13c7854b2d339d2f87b11c73a966af7fad8364a68c274b6214654bd81e916bd2ae40bf64199655cd94a23c64cef90c636b700f4f27009c75a80023075b03b6f919c9477d870d4407b549b0fd0259c41a6c65f2fdc197f22466cfdf3edc470351094a7eb6579c75ef79cdb85e029890ee0dee227e2bd6cc0159861746322cd0ea801b9a7d0ebf2b2ec2501e0b9408a1eba953d124cb19145c1ed251cc2de2e77ce2104b0ca240fcf36d32049009e0ae9a879eabcf637b7ef05ff0d4a269f42f8448c1912b6e435bae11928e8a30b335133db1c7547b68bcb5c70011b08652e44382dff7b8524426589af91d014f51d1a8888157c78ba10cb033a85a7502e16185d78c4050a78cb75e5cf8f5451ffa593938c8cbd3c59d1ac2b114e02a0000022800000224000002202bacfb3c07ba309738d2ebac83c886f3913a5a51aa15a28e7a0a150bfca1b1b70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014f31af910a12c0a59b9125318bed8178f0c96ef3c8e1ba6ef3eda8cd1e311824fda363fb3e83212d5e83494f6c1ec32d810f6adfe300dd57ccf9d921e1572c8e7846ed532ce4f9c2c2446fc2f25f48d79b2279d78ae769764844e35a4a5e598fba51cc65f4ceef0b1d74bcb17095b4d2bc9ce4c1f9a768a2baa362f021e98c8541ae7c41c444f408e19269bb68627af51fc1b3f53561ad8c7ed88d5b361de5bd0c06155bb0a341aca4efbfba3f44d76e248290b4070bae4ea418bc371e39f1ae6b4f100b31ddc00b37e682db1e13dac402a1077d9bf3ec7c2ac31d0ca2d310f0c3c4d0044c5490a8ecfdca7369bb033b348a8435eaf38e34d894237b5528e6c1d6e3e42593616dbb1ced82f8efed24547cfb51b2e88f5d60dbd8a5a2003c42228dad2fe6b447c5c5b1c2974127ea0a2562ec12669fd860a88937f2671777968a67a0e9b5d63db785eb006bf5781d5eb8db2b122196fd2ea260e3b7fffdbee8094cb11660af2b6a1fed8068f6ed771fd51adc4f61eddb54bdc07ff79036b1e1d377d06364ad0f95281dc25cdee14d507fa5f25f9a53ad76616902c896bf4d7fe3e87f682590b71aa8f7fec78541e740d9dd3233dbabf61045918083778102b68000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012865aaedca8c2755958e5207d5183e12ca16da56078973a320acb56303caeb24021d5caf1e920bc884610e94b76e87df1f2be74e567463d102cf3cef1497b6a9302822ed60404bbe70d0cafeafd94f7964ee52529ef74f3c45b08d33e89cc34fb70000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a336b715b534724e181588eaad4e24b3743ccf29f0562b6003558ed120f8f4355bb1d1352d2f54381f76c9ec789e6b8db41dbddd9ae4925023d692eb44eb0287699a576559eadae6c379b2b139578ffe02e0227b5903b5344b5fe7d8e5b10b2bbfd22cc0a4331b8afa14c57aebf43037b954718141225321b9002c9791f1469ac35634ef6a2b404f3ff93bcbf2b5609f72643a818b144a8323f172a2980a58b8543a7a376f0f807f42daf853a40d7187a0a19b72a2c7eb1054c2c64fcd4fa3b4d762e941b853054cfb5445338b2220e21bd7c2574215f5ec15d4fab0e106242d31595551ac45063b49ef7d4f79bf41346a45c2d74266dbe64afe542a55ed4e1506fc76d3079c4f6047ab2c2bd0426159c741b35de40e66d34a5a89dd5561291e8f9c85bf3cd8ea92b9955fd31b3540f6014f375817a5a2dc153fd8d51e1fdce75984dd750ac91766ece095799206b4990708f85783c7d3a9e441aab6d53770446459c79bcf826d360ec55ccd27fcb0a64ac8cd0e4bac38c98f77cde8f18f270c3632ab2b9b449021231a8d424b0e7c1f2032f742e7209e186e665dde508fbee53da9a23a0fe8cddcfa4739746f3aa69ddbe1f4a025bffa9bc150857a018895600000228000002240000022028338a4a497ebf6abe87ebc0e26e0af9bef3f02fc5ab716e2ee2ebe58c3df849000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b5aa275c8a43403376f6fb25c4618cab66ff2abd7b22db2548dabef0dc43845a7ce5778e9032df3aab3c310b79cf3182899870cb0d85553e7c71552ffdd0629d9912144e0b477c6cf7689bbcd26f34a9bd5ca31c518f26dc03e571392387ffd9d21db84a1da6ae71ab7493ab108064973c0b0441373d05587580120bb17466f2dd5351d7179d7a7c10996ea5bd61bac95c40814fd7ddf45dc5dd7807ad21325b4eb08a161a50d4b9d9707730ef11a0501dabaf2798b33a2b3b47df936e7c52f107af50a7750f8a5f4348c34e55224442571338c960895e6a010f81fbb2c20a81397cd57d23369449a5a616df18e335fddec7d64645092af69b738ae1c32aa7b62d4cf76f500e0fe21627f9ea89044252459022fdb0633bae6281a9b67b50991a487e7f910b45f90fbf5b48ab37317d227b8bf69ccaca5f95c4af03dd58391f46b4ea3ece1447c41bcc14eb58df206bbfb6b725ed0a6e6a4634845e0ef7cb633df9cb4fee8e1b68b5500e4efdcd1a18f5c5250ae5412ca167d8996d2b79038c380f61f189454f8bfdb30e9d10e24568eeffbf3db4cdcba209e7f0f013f5558ad323912d4bef3effd6ea2e50c9715b9865f03f877668849af84f622e9e2e28b45000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400115a8bff479463b0383337eb2d0799d3e3674c12feee8a6c66b6ebbe269d2256a021e8af92aef97b09da5aeedbd801a6cd122c4546263c35b76fe1938f7b10239ec1f7ba3a32442dbdc5f82b9add819510aaabf297a9bd6f6b4c0fb83da5480225f0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c17b1b7c76ebc5070064171881b6a3cf091e5629027cc95536622d6875450cc29333c8ce49e762dd803fd7083970d3eab0977dfe7b38f371c5e54ae512209dd9ec925c5a854103f8dd2521d9c1242d3bc74ec8f8a0469f8ca89c669bdcf736e7a1daaf04cfeec75056417226327c4c39dabd9cd26e7362a9664e87588c92b1ae225fc268076f4764782b7e2e76304ebe032fc2d8c8f150cf39014643f69f448fb0ccc4c0d9d8b2dd7ed94251fa123359bb1f3c0dc8aae5136dbe7e1921429d8dce4ec77d5e5c0230850ce59d824e7b5744ecfee341932ca51997f43bd9842150098dfe6839d3eb19dc9cb33721f11613804fc41f3e5b38e140331312f3946c4cf31bf37124f9e0c9d10d68ba2859160a7282d7f026474da7b40b3d3543b3b387f3c477a685db865309e79ec1c1705060e0921f1c79fa58760255812edc731d881f6b4838dcd137c96d271ad05aac0a305baf2b9b7e865761c45716a50fdc4a1aafc760ac06571d52865a81cfcb0230b230111006edd3ea1bb8126192b961caac58e9a45016171c49176a073104e9500253a02221d832b0923ff96a137702b0db004c5a5f1e5099b9b3989838ea2af15d4a3dbd83cb818e8dcdafb429eae60c70000022800000224000002201ecc1d238375bd216d6dc0adf25e7b5f69827aa728e67658e50ff75a2feea18b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b82cfc42e2ed58f2144f6d20cef23fe7b668548958a52a40f6e8050f5d4457555f8c93d67d4f84be228c38b0cfc50e8f931becd0993018c022aa72a4b97fd092b1ea8db9afe6c7bfc47300230f1bffb2ce05afe7a7485703e4712a99ae9f89011720f7bb043e1987c92e81312dd86071dd667edcfc153ca78ffe18e3c31e420bf54a901ec4f6f7124be6d6d19efe299da775de80e1028590169caa1a6409bd3a64ff47827a1eeecc471ed3bec5246df81311adc5afd5f39fedb0719973e253c487cc6751db8eba8ad7f3b54769aa2a25e20d19bf79fa52bc6a66821e3b930f348a611091493f6ede39695a10a095cd40ec039c871ab184f720150073e54ddb9f7266f45491dec6953df2d2f33cea33f6068cc6558deb7a45a69a8b7ace9625847cc3e9d2ae7566bbcc19014abd1fa51f72d88208ed189818af67c5c9c7bee1b7b03eff4e93f2046cd5c2198af39aeea412436dbdfff583c52923920acedf8bdb5b483b214f049b82fe19884ad034d87da58f8747cab8f9c9392a022ac8b0c4c3e1e42d7379873ea1683e300bf7beeb0c79b1fda73f9c58e8207bff84d5688b6c39b565f13c3cd24dd70806be298008e3ffa369667fd2ded0ba64bf83d490b0e000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400108a056abaa798e77b4986554cb9d24dd6e124562d7acaf5fc1072f567a169ff30223c1cf669bc956dc128589e0f81f5a677927b948e5d7ab6edeb319a6eb7e07110af68aca0b150561de398d6709ccc54cca8061bcd7262caeb37041c90007c176000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aedb376207df9e214e2b0153a3d14f413ea7fbc29c1bc61587535e3f58a0104936b555d1c1281c67b4cdb86f1c7d66364aa8baec1ffb8ea501dfebf8d18180d88a8b6fce26b5baa73d4c8b224d8b7211dbe77745025f4db59d47062ada8663d368dce2fbaebe178ae14a5ff0217880781cf2319ecb87a9a3d09ef3add47891738f3d475024670e33b148c83f93be98a1cf5eac9d7a7a21a6e406c1ec65ab7a9032ef21ea5b762866c86150b5ca13a9a62012d81f889e3457cb3d425d27150af01edbbbd770a37a2b89f778e35ce77f740bb30eabb52a69e4c9ee44971d1c162c5efe74e5d5c3764ac1d13af56c910477182de29b298c35fb038d7d7c593f57b07d6bb09d874dd66643756e7c9192d34daaf6fe512bf7a1309f6a95065ad5cc11fd836ab89cce8ffcc638937835ecfa4e24cf3cbce86aa620090403be9a78415f61f4a018754632fe5a8ecc1c66b34f21d8836dd4f380bef7f7bb879eef3496c75c0996b308bba96349f24ffe79eb02dc83c44b6561c2f16b1ece37d964db9ce32e8a7d7b901bec50360c2f70d775c139d4abe249c54bc5aac24166b4c36a45da21472f514b134a710f060f60b4ef645d8b8ac8b88288b686d98126abee3d7c270000022800000224000002201fc7dff195a5b3d2dac08daf1bdcc3e062e8a035fa369b732b795a33608a3ab700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000990fe54ca4d57ef8ff409103d68d5837007c5a3f2dd941d1b5bd970ef59a47d949348a62895b23d743711e3668305300030ef7da11c09b21d361bbc884b3b8254724c0d3a3c7f76a34f05331dad9a1574635a6ce1d6cc872a5bca95826679a9a1a553d2779ba66cdea9cb82e30ae6e1fb2a8a3925e58d0fa4009ad2cf24e6f9baa12ab67daeed989ba9b1dab85f81695b023acf983e966b795bf0389e761f8064736d21ba4e8de057dffe8c478593594c3f71b8e89d4564c080d5b23f0d1b2c0abd03ce6caf6796126f080c5e5e2520f68493acec619f4d51d56b7c54ed3695fe30ece522d4c15c55e4aaf89cd48dd35de55cf7807f60d1dc06e7c66d36016a08096cda821972e8aa8b6898695e0484f205f74c17c19f84de893ce1e16177774ae173604e95cf3beeae9be3bd44393a0144b79ead4ff2dbc1df841e43771acd9b94ab67aebf49b29b445f5494a648586339f62613e8b126b26d59530eafe4e7ac3dec210e3c4b71850714a167ad1508c564d185cfd0d76de90ec98be9cc5c47286a6e789ce735a4d2ec059d03667309575463bfae17adc1ecee22b450a956f386b713b5e5d1e8be2bd32d43ae992fe48aa13955c08f798854b3b54100feb8e9d000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00207f877f271762a576b233230b7222a71a3f7a97496c46500022c2d971515dd6b129e9256dda0087afd10ab040034e65abaea563a7e79d5eddeffd27ea1fc0bfc02250c47315d328f9220df8d4abfc286f23f018e5281deaf77345d051b18d387811749b071d82502d3d837e5de82d1909be0b9ddf34f21753f0ffd6728f03e9f1900000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d07bb89947c6c80c01c81cbd1f8b9bc697aefd92cb31f36228e16d1b5e6259c7016f57fba74b32df41a310fc966da4870bc810ebdde3f84ee62b40d1876878d918ac29e3f2ca2ee9c7b1be269b252a4c8813dbe5b94a557c7d26ca649b5d1161ad2e4ca688cf9bb7643f456fea44e2416e8e8f202428460cb8e3c18e4946809cd3b3e5a28e1878d31b9b72cbb3e1110dceb67a7194bf548eb432160fad38a87757c409fc71bd18a3ee43a788a46e57d0b47ff659928694eb8331c4b902f83868a7624b81494593404916c2588bcb0d03ade2e895aa466f652d09fd91f871c231419c4af29cf78359f14eaa6fd079fbc9a719bd4bb2e1e746a01a14f23369af99bb6994235a544d7ecfba742f2681ba4b1d544f8fa5df4d9a06cb2cf927d8c8233c45f8817da9b9db53baec773204c732a30e463623bacc896b0d9cb13146b818a225e5b5f8704fec1694d801c14feb3cc50079d751875cadc0dcc8292c3ed58c171b735d4fd74bfa4075886611bd7a76c8fac631cb7d5125d55daa174302e768e6ca38fe3a497f8b3f169e931af6e516b501f6576ba59772af565b3d75cc394b1af0d7894040a1b5de863306b123b21edb3678b930812ed776ec13b7a1ae46400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001935426561d9e1bffe507aa5cc8fe4bb236e7b18dcf3d5c1d1feef693ec7acb3035d5daa613b7c105a35584bf68bd2bf1feed56f13c9199d47713b9c1b03160fcd220861c4a064e079a5fba5a4394a3e64d76a4c57956b3fe675eee2f3f43bce17118e9a27bd43aff12c1aee5660b4088824a9348be1bb719fca99567536cbf3a0eaa4a69471b4479b3e8952a45b57a25afea3d07476bfa626e169ae51904c0948b25a592f6b55425044ea7220967862ad397bac97b8c12093f18f8fa458657ba419d251648d16724f869e88a39ef6f45fb1c9665c5dca5f5e9fcbd25324322607561db4fd48aa8bed721512747f52d60ea647788b93644685a6d2efa597eb2f92d4f333ff38393b25b32a2477d59c716a5fe9e329612a34d7c7fbdcd6f04d97c4f44a241f40ef4167caa0efb5a9dcc137b1bc4e85b3cda77be9c5040b0127f5908b9daa6da4b009040dd1aa0fcc64edc365e8cfcc7bb1e0c6081d04279fe0e7a7bbd48a62dc1c06e9221f6274a2f8171f42bd55128edae557e27083786b201c862133dfe9fbad7298965805cc0a64ad9761eec88578feb9a8f8a365d3540a9df7ee0a91e0d9578ea6f82eaabd50deea4ab19310c8a7148b715a156bd9355b090000022800000224000002202dc8dfc458e23b24eef01668844b3635d63b5c8acba72a0c268dc75bb60e88f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009182dcd31456bf76034e3f66527ee491060c75cf2e1b21dc2384e6a72bdcc8ea8845158f9267461f28afc4b6cad7648d8f5a01326db8e3145881e4d9b96fac0f6dbc66c45e34ce104cc78b24176161994a6f66ecc2799ec7a94f19c81f8cb9d7bd846ce94a9f36312cbf5f5539102aa0ba699787ceffc8e216d1636d7df38f4e480bd502313e1f7647f86cb2a221f3d716429f90d11c8a641e06fe76809a92b012f715883392a2844583559b1e12b1c6263fb2aa537400989505b3b83781cf8e2e7b8af89c2dc9e1a110b6ccecd65612fd0607065b3be0993b2349ffd29bb924d7e9fe3084bdbaff9ce61344b9e8353f23dfe5e09eba0b57df36660e573b827b157d50d1ce0474773db3ef39c2a7bf986fd436dc69a59564df88b8b51a88af4f5ec9eba967aa3ca6b47df1fd33d8aae772308231174b49a52a17d42fa16bfc2813cd6f745b8bbc5090fa05dc31a46620e1786a565db381fa7406213e2dc2361473079e76aff13955ad75fbb486af6110512da1391c5bdd5a1f41861b0cc7f7f449f4beecc3ce00640d40c020339886d103c5226dc3c0dfb6e6bed9cf657026ff7f31f48713e40df4e8e6bbab70fcb9db19cf4269516d66b4e9b73882befec495000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400102c7e5b9fdca14559f6e8aaa99057e6307acc3874458775c6b316cc45e9823940225dbe92f98c98ced00bfae7f87645eb1e7062a4c3e090fd6922264ff2e6970922bdd7815b1a2457c4a9e478ae73c86970cb8f6728377bf66f9e9862f97b3dc37000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000919d72257c187cfb712d6b7f7ee2cd2c1270329b5481fd00f079b2572e3ede78bf917beb9b6bc92db0a16b414cc279cde10b838d65e065b2ebb9d07035c3f1ed5426249ae69b8a82f05e71581c46a7c3a541c620aca6f75de0d6376e9ac2772d2e2dd1fd3d380b6beb6ee1f93da936f96952967f109936346cb0c17a3e4752f6de658ca035bbe89eb586a9bc8dc5b544720d3745db1c804595bfba8b27b16edeb8f07a5d5ccf4ac1ff9516fbcb0e0d5ea95498fe3b2d9f20aa65f5dc824699ba82fa35b823cde8277f1c816e9c49216303c183a01657d55e298d2ca5529431ed10975475e8a1ac3a0ae5e1491d6f61ce492b8825addc13d5229887d1522ab8861df5b2b7bfeae4270e097a19ee8d3b43a5534689fd9de459fab6326389a57b7a91a9fe79b43deae9730ab9f95183445678191444ac4e04cc0631a9a7c78ebb8f9eaf378fcb7abfc2e6c26a0d84262530fa594fcefdabdbf67b36b160ea182d94e5626662e2478e174552325a57b11730e444f432742947a4da4118d14c5f00b4aa3aa1311be303fc0f7f75c55dcd9d7394cacd6e4355386e1cca40abd2fab6d5309a231a3657ae7d7b02cb4aa2410b4cba0ba63d6b130ec216ff27f6b4590a5c000002280000022400000220175deda7636b39029918e64244004e1d2f84a7fe0c74825456c333ff8ba91eff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009098e2bda6c45137e2d4f92cd863913de682379664f5383387d0c6dcfb9eb209d166aaff0cf35b036820b60b0743e843cf080e0932a8b2b20e13fc7796310aea8cc4b28f076f42866de234dfb5d6e4c8085c86bcf391824ffd610ae3c07442b2d3196a70dafd628b8cfe978190815905b907082b5e9db025d094e356a7d8d9b7a81793716a0b1d6ff66321c067e96c55cf062ca9fc30c62f64c06472cad66d15eec5835c97e3f702306f81698cec6b00c77dc963511b6c5360f1df35205ea056f18ef7f7742dba9ede232c528964fb51badc0bf87c575df05b41ae5bded61846536fc265bc30d72a59883c8ce1c105ca6c5a2726474b8b66a084c85f49801fad56d44b4086e4e255ee259362c03021d9502046ebc22a671c432498ee4ca647fa9e228eb9fcb149011c4cc913a7b372894a1a37d887330c6475b969fa5c30a9e79d6d8fbc3b01eb362225479ee0a1518cb22762e22f45946eab95eeb4affaca24e8224933813ec98226d909c2c6af1080918429cca30d4866a16a6c66852b6add591f29de0697ecf00bb88e331d703af671dad1e424d914bc691e9847dc08102f94fe98ed7787b2df34db4b6490d2b9ea8065f9948b3b03de40cc283c69a0a7db000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022ff97ec121cfea9007dc3e2bcfd4ae081f6f5c528bb04b9d4ed47f385f03bf862315bf277d8a7a305ff7b139bbd96a3b621b2599e7fc51337102ce84c5e66f0d0227d2090c66070ecb1055c19115c8a683206a721f4c275651d8de7f200bc71a3a2376b06be7bb8ca4d6ae53889f0d40f9d7a585cc4f66ea499de133cd5f44167300000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009468e667d83e8ad1617467992c961dd62ee35a19b9f9c6c5e5a51bf23f3d4e5690c5cb79e364dca63a427d33280264098a758c07dbe79995215eefed8d65ed24b08c12cd033f40f98df98c1ab37a86e5d11f3b0776794702f25be5c058a82285fad2108bf770a3f4ce2b8fbb112dde8dac3ba4b14744ab4ce580b36b6a76c4ddf298e06145a6ec874bc581405e33609a75d053f12b85732c764c8ccbd72f0fde3629a836fffbd7909090afdccd433a61f71c3147f9b34ed8d4b388f6b83b4ecdd0dbec7955dd2eb74bf3f99cd82c9f83790b69042f840990d2971bcd64b8f6e2d66ac21f5ddc941cd0fcdbc2b9b219ec70e3905590839d1034fcc10f4273b06378c0a5c19c0edb40803b7145d16f5217ef338eea665f043e408bb538fd546162269d7e2f13f2bbbb81a1c653b5b25d05423c8e441a0b70eb29d5e7365459da2aef3004edebc9692599ee0fd5c149c10e9b5cdb2977a95d9a7c6d6015f132732984d1603b97962c53af08bbcf0cc4355077fc04cca950766b039e000459df77ae132b0c192c89b2f9a061831490323521ba6d498e69763207f41090eea06ccc7e58d4785e8673d10f6d2251a2bf3108220927db61bae6e4edaea87692ed5a45f500000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001893d0e30b040cf1662c559ee5edc8573f04e223829f54bf16360585f16aec38bd177fc7a81d9bc97b75bce7934e7344c8848c6698b3f6eed7cacc7de94cc290ae732120f1afa2b977eb7dd67ef2f1112c58e694d5d22aa842e02e27d376a2294f2812867e22b6198f76bafb09d30c90e4b5df9e1c8ff953cd6402fef3b92ff8be370951fa5cd452548c607eaada262f585c50579dc254fedec52f7d6abaf8a737f37df888a496b64c5c7b6a693f7c5841414e1a943c4e21b1d075ae6ea897a75290adbfe870635e4d04c89f6303148f279ced553c34942f7a67c463c1c5c694b21b11ded6a783810eb6859d1b16a88a570557168b51245aed2b72815dce7a89cc260e1d8b66411ca15183c3a689a361f8a0049b247aca5b8c9511aaf3254a661a15a2c3e3ae1491be295b0afb25129b0ea9e12b9ef84c37cd5f8450eb17b4771935092b44e3ee044a6458d17ca50e3c1123a781c209d2476210478a56fe74c6ff0563e8cc467c4f252e84b42772366713db1b138b1503be701036c000d6b24c95d9be26278d3d85597e1f5a4c5281dde66fbda121f5cac05e563c2db17d27adfebe7dc6d2fa71b589c06dfb8baaab2a6e5802986608a9f5a91bf87dadfc2edc00000228000002240000022012bb1272ebfab41f2102ad2e2799b73a1eb0a7dbb5ea6bb6c174a680e9e954e2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ca14c1ef85025e4f989c184d9e962fb35f64544b2c7fcf437270bbfd355d263a8757d07632f33e985a22311b7ad7410bfbef98bbae21112b3a84b3c6320dc43e9a17a11a42b1021aa9ca5b880a206da19584f7a76b683c13b4b834ee6f65e68f967a88d63d95895e6365e2a7d83900f3e8cf1f2aefcca461451f7d8c3ab984bb1c41c5ca63fdf306d83e3006926b23c2432fee98efb2a6a3e37a03e40414372d46505d55db694f3972a0c635f00c91e66925cbe08ed450efbbd071ab9f5adcf5524cf7182cdeb1b3d8122c5d3381caaea0ab20e40b724cecea4da83e2321dabc15fb25f20e44f93ef949703ef6eedfac1b31fc12f940c9fd130509541e724c447ba682d393873c0e21f1244310616cd64a653333ace99e72e585967757c5cdef715841d844c5197bfdbe4c7f6a8f3fde252f6f8b45148cacbd231cb6e29caf974e4691b044a9a427243fa58908523787d100a89ee728c631a666b3a1f30e8818781fe3039615d91f510b4a386e96ee137c0967925489ee1f4a67c55c7cd63115097d0a33e46ba5cfeef483ecf1c5a687a949535c1e92d105b439af688cde82853bd89a9f31e089570e58bf2a779400736254d605193510a7fd9cdea49c5cfde000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011a28924f19aca9b1e551b2b16c7ccb3e28d748a100accdfaf7ef7e69d6802365022a87c8ef50e08c48ef04ac610985dd6352b9e57ca48b48f24e435dbeb66765a61498d16f94b712f292494874135afacc799c2b77be8284f6a44349341266131600000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087cad626a4f3b87671340cdac18c985c65cc1713dbb8cc6cf1533ab0f049f33d2d8e4fbc2150f52dd01f506002263b2db228552bcfd108270e6a2be22cbf2de8ee5b79c4ac3e8d9f824ed970febea75c21e95f68db52a4ead7599b1a81e170294965bdd225adf550897e2698aea94bd25dbc9cd3ea2af2a7211ce8adbd62c1faaf3a3a9bc7ed87df75751de3697c880025b2225b2a110a865eeae4397b5de66b56899a4d426868508c6f6fef674f30f6c75eba173eeeb7ecaa515b1fa5233687c5a9b5d0b4a3fe165b62eb01545612af560a5b2fff3f3b8d63d92484d8cf256309683285f45c9a7423a25a96d14c061c7a15ef38f0854bc0e86d22d037495122deaec38892da7506d012f8eefa816b15698b8d6a04698d0591ec739b7b00769e935bce2d6c3a5d3a3547d80d08884fbd015be2d46584d29f4879fdd1bc333da23facedbd46000510218a9fa1b54bdaea089754178a709e94bcfbe32c644e837f67f91e78a989f15bea4e60fa2b17b993bf2b0218073d19a57ecffd6bff45a9f5a79b93f79c0bd99f3c43f04bf9ece11a80a32534ce6a95175312089e11b43838eff20cd77f3c78c8029c4f737e6ad0106639c27ea33cadd50e9f06a3b65da33100000228000002240000022011276279d625e68b51be5227037248dec2f0cd0c7c1034fb9d005ef66680457c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d6629561a67c37ebbf6bea7a540d6b51d49a22fe7e7ea0ab9df32ca5f75ebe79252928638c11bbdbaa39e50fbb6fa3fd168ca0f1f04b1805a924a5ee8dce8fbbcbb0910f20ae505484098694bb7ff8894ed7ee3c47e9337c7352baf60052fd56eddbb1d7e35ec587ac47baac98aa07e738714339e26235336f1c9a4ee83861ce9917806162c44e5e4e69177b089949e3e4c7e2d011e01a707e1c26b5f9bc48eebcb82684de0acf26aeaa4916581658bd043703d2bc927799aa2e2d3dac131add82dd0e83f421a247067b33738a821b3cc7d67f5a1f2c32ab66a9af843b11b70af4dbb86b302309ed03bd6c75ec1b21045c600de20de73d28e2e5672afb5cde32a92f5143842f60b1602676589ccbc380559b1672202634fbbc1d1f65aa5a6f34cc537405dc15da2537b5eced95fd2c9412db72a721d23a09f4c80c428a7ccafe35764c5871ac7e7a35f6c2980fcd9617b0724576565ef3af7feda062cd59803b37c3b5546f3687402b62c44c505d4f74b1528e40a884a60d8d2077a26548904716116d747495ac3981e90f89ea976363e5879761804a9d1eee734e95f395da3d14bef24c5e14835acbac5e918f5ce10d1c3c5844931c9b57592542553f2f932000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001083833a5527f64200d60c3339b2f12f270f1cf5075ec0a1eac54cb4e51c2fba9022b9d94d815d3cdefa021be2f3ee75007eec48694f3a58c6d57f6704543e0a19203a48f7e6c9b882a22ab30eb02914c26dc0ba44a379e441606a0693f17d871630000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001dffc67241d264ce661c8a87bc0f13da7f20bfbe0404d7a353dca1e957da07c7693763da464bc3c56f2eeff38f50de2da2115f608166a273e8c0f98db4e9c8612d1362d9caf207e99bf3812567118503a81a722f3471a47dec45620cdefad47a4791be85bd380cdc85e739b74da8aeea971bd111d48e052f8641cbe0ae4b5ad34bff21b4566f8aabf487ae50223b04fefe2143c683b933f41de909f024c68561f85b69f76d9c10cb1631f1a7266e85a15072580d5749390a267a3c8e0ba1f1cd8b815eb2209358b068d0b083d787de8a0edc45707adc0e7535284aa5fbb10ce4df2a391e6bb324513cf3ecd5d56edd85ece2a809a1e52110aa9c15c5bcb08ad6859707ed05df3eabfc68e6ac4498ef4e75eef9b3456fc3c63fd47b954e5b3a690fd0685936b327bdc5bcef85e74d6bfb9e6e830fc6fb6cdb2beded1cb70a80c8390f23b9b508ebd7a4b0d326bff679d776c078dbda41bbac458d31dcc0178fe6fb4faa11ddf06b0dab815928956be53b25bf975450e3b4c2145feb357f4bd68451b72e26dd83d4103dc2613b2e50e880237cf7554f5dbe1d7507ff5d991f9cfd0fc926e054e550e2f37250c7197a8f63d5cc392d174b259629b54f05b3ebcb4900000228000002240000022008b1981a4dd516ee514f94e0a14da781220b7e4267750a98b4d8f06a6c9a5aaf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008812eb7013f2a6cb49087e50267371baf574bc33b7b740079ecaacb2d84c453e3661ef21e914e4456fc2bbf0645ceb51dfbdd973044847ce51b80e9e73ecc5927209112aaa0b9382306bef7ad036e9b8362d3fa6c548f5561b6016f6ba4fc1d80f2dd271fc12301575d90b9dc7e5fe23f21c13f7fc509193aea9cd8d78ce30541a6b72415abd0808a8eaefe5bae1d0dcc170e1c0b7d02b03f4f7354093af684a4efd349101de822812c51a9db44b58a9689ed535f972b0998ed1386a3ef4f2a81d9ceb6a1f26ab2b2e6a9075b21343f11df92bd79205703b570e2ffdef0a0ed9256aad243e45ae3443b1b60c70d18ad5113f9a7290cc200c1183c44aa64ec0ab0947163c5ebdc2845983bb85c13010e28e7d614edd24cfc6d0f4ca652ae7e44b98f209f2a43b3243e981ea6ebdfd59d7ec043c1155d201d18797ea1882815e0165f89a4eedc0bd68063f46dd07c5487b9c103bea7717e742e62635a60f31dfb190dbcf35ee8a554d65f2b9c971889e4158718cd10f6a2b4a92e910f037a4d7de2e3f977edbaf2fb9fef5dae5f997636a3a56ee077598b9cecf5857b3d0af7ac03ec96bae6836796536489b372db83ec207dce36bd539e3e270686cde791c6de8000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00200721be2c571cb6f6c25d4890b3f79fd21ac0f38b0cac1815b5c3f78962fa0d60dd95398a419475b5513edbd00ede5b91996b62a3617bce04d70481fc3e602f1022c88ee8cc394388f213ab86d1ed8a28504cda3549e043283230ebf3a8ad6d9122fca7a29c924671622cad2b4512b7aee97d3dc231a70a9428628cc082285506200000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a68713497b7f247f92037598bad975a13554a4bb7e2a11b778b4098c47a723d5d996480abe5054574ac024a24ac34baf6be289da9f5189dd51ac48a90e82eceac7c3f73a819c58005cf5bb5473fd377dad06b2196a0a2e9bed25eba4ee992750adebf18044af101f8f1913566b53327b7fb6e1e11acbbd318c257ff7a9ecd6be791239190919dc30656a960ca87357dc600cab5ca7e8438c72d54d4bb4a031db50429ae19519ff801ff9fe8dfc1b0bae3f566282551f8e449df83dfdd9e6d740dcf7fd03c35c629d1f4e5e943b65b1dc835c4e7deeeaeb208828362a7574a2e1dbf0e51e505250d63cc93ef7b09a4359e38b0eba527dedc6233fec6d981d2026beab9c46ce8504046680981c0da6a85b93aab023b5d2a0980d358f7680e8a5abad14caa116835e8660f8662179a8fdae8b92d79cb132907954d15768646759a8b56580ff6f848a01be0656f0f09ba2b71e4a3f0b2e7f315d659531ecfb43b6ea3535d96bcc438c137700688d4939397489a850994c43d3d80d6e0930ac2b76267be9880e9766856fa37ce3e8101e42ccd302133450bc3fd0fbad00cb6c4f574d2002d3ad5bbe07a3de8744adc5e2f8b8670d5c0ae1db8abc20b321d0bfe0267a00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009cb6c9cab0fc4c31a84878dd333c76369fede5988d52f3b92ac9138972978d3403749ad34822dc3c2b38aca1ee2aeaaf5d7031c900dfe4d8d50a30a1552d8271baabfa676100eccd3abe7105105fad655c24c5612cf47fb4b6479c92a04c3f5b8730d2346a90e25a16939a03320470407dc7740427f7a5aa2de081efd27a5dbd597e304b4f6e3561cd345ee2f7ac44a3ea7187d76a2a7db6ac6cba9a446fdb59a908dca1c5251899de711896a33e6a62a80e81e5d8c30d241e96e8f7d53b0a52e76b85a3d235e124504e26a54d82b2f3322ae35c9303ce0f1f5e1dd9839c4c55ac350af7c36d626e25bd4b579cc7b5f42d2913a25c7259abb429953e7107407895e4e834d572185fd7bf7b53883519a03f4ff8767e4a13613e392b8da25315e94aa852fb096f940cec99e3d51a177f6f7a0af06453ecb63b4c496363a5a1e9a06a77d0820d100dac557f7b273e5cfb08932a3b6490b9bf798b155ed533731fdd4e6e009db4c001f4769302be2360daf24ce2f4ab5478d7e5e6486fb96bf52916ad7308c23140fbd1ad7cb0009150ea283a0566ce10c84e14f4e0a5d2a9a5eed12ef144952ecea1e7951617752713ada8efda1bd68e24ddc3d974c304c0b758600000022800000224000002200b7488e83680df252355302ca7810c3d6b7a119c242c5dc1c04c360e36deb89300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000895f2cfc30af065fb9e61833cf647530417e45c11a7ba838fe2bdb8b416d37ffa493ab64ae05f243507a9b133a15a7283b34262cbf9cbf5f53f2fce257a94edc7b4492d39ba49b4757172edd059c7bef37a72ad7e9fa51c13a84f25cf8799ea5d11eb2fb2bfdc755baf959da4413b5fad8a340eeee9ed1b11d6b1cd9082139309371c4d5ecb8871ec73d678dc2716e6c1ae5d67d89d2e6e731fb6ba85ebdff2017e66de2fe5a91086ada0d8ab7d1fdf2ecb433d1b31177efa161a2b2399b4ca438d7186c9eefe56b51db794e5f7b463eb03cbe4c1f8e29a36977ab3c1eb0e22741c793819ac4cfc3714e015a379c3af30c07b4d9ccda18d89e9fd7426ad9a8b532629d68730d96083d31f2b0cb7c6e640b9ff752566cb4ea610830adba025155f55dddf43af76b67472bf211f7c41bf06fdbc70d410bb37b3a2aef8512b970388a07f2994855f5275e310d1f8a0bd8e9cedfac2d34901e036c8c2217e1212196b72674b97843e4813b5261e43099bd3927b759c1ea3a6ac7d4bd17aa760a0223852e20bd96be7d5290bcb02adad0cc2de9677a3f77c20bb73b80ccd65125e5f77a63dbd577f1c8971ae851689563a8fd4f6c8e99eb1f2cac6335999360f641a0000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001154effe1613360c57b13f328f0f80ad79d34816b63c94306861e16e289a30842022ccf298a33955dd808b38162d3e96c9eb2413fbdef44c3f0248acdf5e67d87541b7f8a0508f34522910293e9b20ae39acf4d9182fbf80295828f3c489e5f3baf00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097d3d9638435473109c5ab98f853de8e5f04743c3985180de5f15e624fdd03f32a0e4a0d2eeafe4f15b1cf87b16b4946ae49079c0ed782339fadf755a468bb5d96b723048e71aa43072bb03e4650f440b9bff5919bec51f8e74133eeb8978ecc9f0d0e64f8b83fcc8216bfb46c0fe361e07dfb6b2692894db95b2cd772cdd50ac8cf57f9be6548ad3b6aa028ac01ce5ade3adbabb001afb4d03565e28600e78abfcec2243fdc1456c8b677fae951916983882a65dc98fb02bdf91d3caa5bd600cbcc880fbc25c7e9dce675f67fa5cfa1f36b14c858918d6f4b083c6faf47f4666fb1da9b0c3833e05324df5c733a5141d73667a2205e9cb670da882a9153968beaf1b2e0f0ae70d6cd60a79dbbef2efaf9c95bb472f5233cd6b8832587806c3625c7e2a79ad7a96b1df0a702b44c8ddfff71d72e74ee4b14710549ca94fd5ec561b4bef7454e883ded446d51676e84f017f789337f16a47c4f096c14b1951aac5f495b513bd99a11b76711e2cd13134feefc04a1d57cb82c209c3cb78093d42ded59329f6289c78a54369751ac3fdf0610eaa2295185cb2859186b020d825926c9e6b7f3c4bf7dcf50c2a60e67698604e5c38ac003f9d0bb6c5d98b31a46f3840000022800000224000002202c79384e1678772735aeb8b0ea9b2f7462719e917a27a23b7f18e019da168b0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a752a9f5bee5830a1fe970f099cef4d9b9114b2a7131561bc795a262e36cbcd34236586a972d999caf806fe30a2ecce505d4754b62963cacba97161f1a9dda6e1b8a96a68146f8f6b3e53b255fc7f2eb4a677ca0e81de52d3ef059e8a035bf39ab418e372f25bb55b450e4f049dcc3ce47070c78836b737717aa70e2d50ff38668f1e5794dcb5e29c96e2159e8e3bede322383dfa0bf7022d1c83f82d43e4525dc9a414357c248297e2fe8d6532c630339e7a96dc318a3c21c3eb1c4aead9c217127792260aab50b76f9fce850bb250265f035ebfa37573c2cdc1b1f749a582a2d4927dddb7fb72142d307932c08f71949bdfa25974d3e46afc3532949b0b0b40e3d60212a03e0fd1f588eb94188d0c462d959a0975ad6bc4ef81c74f9db7fc51d36b1540dc928990d76b8fa16204d37254edf99bbb8e3cdba0afc4f12ee699260b3f19df5191c22bbcceacadaf544207ec6e05df92b3d37621b5b1a972e621359afcfd9f041918588f84603ec4875b550f39e9839ce1bbed3dfe236a90f6725f794083e0e3560c0985509937353c4f32cac3c9dc71a2d8280dec31e450530ebbc545454c5d8d9c79e886f3c29b3b5b7860c3e4fdec4b427cc4008ab2f53417b000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002083f06753679537bcefb8699ad051f3c73a84a96261f8313dea5bd89313833f22c7b032b13fedc4e458f0501b5d17347cd6532620083d2287d4943b4804720de022ecbd2b26f57578ec3269e56d778386b48f86a5cd60652396375f029df3465fa0f73d3d4e9724dfc158b518e939e4a670701c151b17e034992a38e6a1caaa0f200000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ee52c55ebb27371c65e239f916d517deee958d990bdd1d722c415599ddd40d7d488bea8b1b18d08cfb7e57ef0083f71b0c23b4f4b5cc3a350892f182ec44063d6a729d0ddcfccc32add48a62ec475f65030badb769593ba6f0ff26394ca9dac23c377051130b3e4bb1658fe9aed3665c317cbae23d58464420d24d6b64f3a58cf05df85dfb7d5f5a875cd780c88546b6e00b908e1ec6269291ba71fe56499a18c30807baa7c2bc131834257fc4d2060a107cfe8740f64ef865cfb3fbb1c5b12bb7f75e70f3448070b5f2994c806a59a5559be883b17703a2e292ec43a2398a58d3a2ba058172436bf4462ebfa13dd431728f3a5379b44733539ed3d2bc18e168d56241f829723220f6a8771e3111e7332c64ca5e056cc09d21d3cc05cef028c1b8e6edd1a4dd7806e44e12a18717d3f285d055d483fd565a846af3e5a69282eb8bbde7c6576babf69ab9fe32be66fb712d760c23892942e0ba971e63bfac5a42a60b98373d967957abb0e7b2c409bca2744368db4a957fe13c1299e612e9f3d022581f33f4c5f4497d51f873cdc3175c7d15d84d8b39d7c399415d6091f869afa6950af9c26fd6e0a14cd72d9bde7e682484d7df713f65050e788f159ef82a7000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016627da100165957f240e794912b74bf6b2ee8e831bb8b6056f229bd9eb0a3a1f70e7ecc61f2a4d44191518bd3b2d0bdae08ba2787d1f600d6856146b69f674ffb8e9b5e7bc1f5af10a508432f9576510926f945ebb4aef8ee0b4a48f12f165bc7521dee98d18af1a034133fc14e5fdafd8af62196abb5175ac27774fc02a628b1ea4afec8e1a4dbad235e8d221ac2a677f3514c2fb40442c5e15c62dd52b663e6417dc0894dbac9a9ed75b74853f34728df82cf630afd322962fad4122206e6df1eb8a2e98b3edc8ef26c5340c005d0ed032eeab442a77bbc09f01ff83cd290b6d7a4d65809acbaaa8bd5ea05a55dab3be80eb9d2ba21e9d32f5629fa5e93a8a869cab73078384f5a1566d7223baebe782f3e2ca796a3707c541bb874c5eb9a40afd615d7e58e8855ee29b3cc6ad4db392c3743b5eb71cafdfbe62026abbacee058bcb6ef50b6c3df7285a416809be23fcbdd0128911ba777cf925a0da91e7453dba1a7dc0c40a104f46464324fe554418448a3bfae6c9d73ecd93c04622e7ec2e1942310435bc25c443a83a66e4cfd7ef3b5e015dec75c38a950c6bc5bc1fae73cfc29b574cd399369e483504de6a35e121531dfa47513d657ba94486744b50000022800000224000002201a54a435e23dcf5e199192ebcad798f1076e91848fdfe2699f0167634d28456400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042f693e32ffd6d9d14526919d7af166e590bb1344295a29f0e045a14199ff5f19ee0ef9334f0012c653fdd199ebd07bf485acbaa46edf9f11b201474706257801dd7d16cb33c053352316b8064b1fcc736e59bda3de26d567d7cff2cb8c036d1506746e71ca5bf8423d0c5327d26a37fd148cfb3cb4046f842d18707039bc9a6c3c7b7cdb1390869f54e2b79b087b79bbbd075b3097c2527eecbb76282e276fb7020e434626cea18538f1c2f6b88cb8028f2ac0b87c14b079d60c2f5d95a4063b9205d5d60bd7e6ee9ec6f1a45c8ac89cc0df3c595bdb105cf3581be64ab1546bfee16b2377bf5e1fd76c6553333bb53eb238e544f0eef4636669b17113e4999cd6f27ff72153c9732532a3c71eb3659c698bbd25895b41fdf3a94279267aeb197bce0df7ea022ce8ab91b8f8297d657658d32d8c37a1bfad2b5430c6f17c555b3ede74f79dd26280f58a5409faf1dbbec66e9626cf0442cef1e0b4f4aa99c8c94b0f93bba7d614554ae8321d604d6e89f50ef2b1fef2efa252e8dea321eab66ab907045f2cf8057db9717b98d6a478c6a5a6ce83199d10151c7ffc44c5c44c5a590f054813099a751a76d4229d9fe28e4ce5f843fb68625dc971f0dc39b87f000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0021aa1034b5f4c74aa2af654cee0092e732e334f06d9ccd332a439e4113cebb96c11aa75b3e5339ef76fee728ef86c3af813fcd7fdc9fa71b56d5903e84f3dada7022f4b646c616bdfed5e80ef8d791d95a467d1cf356782135da5904033cce098b20e52281331fcf13b5c3ffb823760474d7f773a4e24efce89b4eda2e3a88d739e00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000877fa0ff572f76bb82e9b346f3e9f115e2450476a061487f3d04a4bb47508fbb0536b3af19814deb062cf919ae6f08b6648262a4a06831492ea045b1a5a2eaca1e8d33cd2c62b6f4363963d7c882879401f98e5f7bc7d0359f0eb7d4f788bb79f70166d12d0c8864e84e50ab77fe7aaf839832c352e9f049c08b18690f3b9e487a1eac583e45a0c8275b29999cdd81cd2ea940c653c8c0b7a9c037093caa0946315c62728b3eda06fed047a6947cb02581dc8211fb3bf7fc108c12f460acb74947d4c25ca2a0980c611215a533a34fb6e19cc662a06b28b9e966a06ae0b1e7bd8ddcf9c381e588971163d74995aea3bca10fc443503e38c5d11173ee39b7fcaeeb76beda469e24536554678ba02ad38a240d888800339b648f1363b96651c06faedc8bb4a66b896382bb0934b2e2f4201e4e6b789f319c363993119df17ce728a8e7f34fc8a314bdbfc482d5e0889b298be9e26d545dcbdce4e6de79d66265c48aa152b4f643233be34b3c899dd73b1e2f41fc9afd0cd762079b919dbe4d102d9b9818386c54e8e4acda1ff8219afddefe91638738f676547cde40eadeb52a6f47f6a8e86058f776e1012876cd6a081eafba409f2aeaeb74838723d77cb198bd0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000931780aa2dced7899ab150a3dfa9923903f409a5892879e46a15206c5e5ef0e7ea44eb07a4aa804ed3aad93d6e94e9552d558a3188381204a633f5794e47836f34fa9ae8de1b913ceddfd5d3d5ee779b816df774d7fbdec45e289b6b269a729c384468f71c3be0fcc31f0dc5af9ca98e23bf4db08884979a450857b94cf21a8eb8a526b5ad4fc7998a357bbd0ce82840686b6256308dd745401df3211256ed3b79da84446421a559b16d9c52dc2c9ee76d8d8e7f877c9da61cc12d3a7cd3383f4bdd42874d09dcfb897ae64cdea99bbf71a8b49c2dd45d097e049c5d50d16512cdc8f07fb8c1482e38252abcba90017efeeccb3199a3166f8e5134040a7d27cbc45d0740e2000a36b4c115e4191654843de4de67e24c78ee56aa111c29cdc54de327f855c886e5f0bc908a9dd16505c15ab05293460bb5ed0c6404a8253af2b1caab664f10a47df582e4338d37d087db046c397c0fcec779c8f3377c5b6834356d73c9267ffd711c36d92fafb224b1b4286aa9ceeb7ce7f19173b4bb15bf24e13740fddfd4b4988712263003dce8dd0762d059a50026580647ffcd221097c67b4f5dbe03e2cc96cb2ed3be0b3939fbfbe9d732c9f00e0e69c2aed21d26df00010000022800000224000002202a441961efc1674e641b62d826dfa1ab57e170a95ed1966b9702fe942ec97b0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000afea899c8b7649bc0051ee0806a4ae2edfdea850a76eb65c6a989b7060f59bc6f0b85257afa87d26cb110cce0a7998153ce382b7e5b2a60ec6db9021d86dfbb08be7fa1a90ff4fba672aa0d1925f32d9a2423d2e9e76acde017e355c6ced7519dcaec23de88bde74a27db9fda1e50c67b5f30b1ca0b93569ebea9e43e8b2f8a227614e2c1611a7f07a80710f4226cd05ab01547a1ba360808d8c922ef537d61a7529d97382ab087333cdeafb98c4d813889e65e825f1cd9d77234c7efd36fdb3199ec9aee30e5c86a764e90f71f81b146934201799a6996359bcc2e472ce31236a04912532e286135313e172738cc621636e6f08b8c524991517193cc587fd6ef4dd1fcfa5daaa2654e2bb3e1fb00f07ad2364e5ee7df5a9009e967297f507041c64bf417222bc4a018c871375673fa4b89c7b7f9791e48d1bd792d1df2b1cd7226c32cde301438f90df5f902182c764fc414e3928fc7543b4bd244a5670505bb09d58ff2fee0ad9f1d33891a78e1adf1d22a26d54d68845e59801542777cffb2356f376372c6ad217abfda69b1f52a2b4bec8cc9ecd89b44d502f257df07df6f6bb5abb6c2e12d107710c7e9296d7aeedc4f53b215beee0fd76cb2ae987e61b0000000400000000", - "2b547601172d909d17552d9f9481617e2b6b2d07aebc1916e81f7d6a78eb1b80000000100000000000000000000000000000000000000000000000000000000000000024000123fc582ece096fc9d55b5436dc3b8a408342e6736ee4cc4b69922ccae79000089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb30000010011cad1b6b7ee5c32c27a19cc98558177f4e19931c642cd6187afb65da67d88d600005d000983bcb60af0112e8d6840a54b6753850d404c47ec233df9c8794d3b46ff5fa900005d800825bed0f04513688a20a73113b41d525a804966b3e35ccf0894be7867dd9f5900005d800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000070dbdaf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad34c6c017e8d911084d0cb2be711a4f24e6eb7ac0adf18f27ff6ed91ebec635730d3852000000100000002400000000000000000000000000000000000000000000000000000000000bec1d400124f9dd0c172063ae4023258449debcceac7859ac22e69ca9b174b8106c3a03720200bb15eac4b97684eb0a19b6fdb01cf05ddfa1156a22c1a800780fde5af93c6018a559e3d5a5958e0369145b344f5c7de386728ac90eef32e5103c0dbfd1e07800000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082168f34a8e051e9f7ab2c6bbf72c7cdabb003f705aed82f6173e905d1306b6ce0b7dbef87d04292a592cd5c30e951acf3581fe43e615918cda134a294d17647bcf53211aec7561df80114e976e456efdc789c2f1edf8a8b9b79407957ba15a777103a8c580e895fe9fe77a60f92fc502e43cb418082796def040d89897a601769afbc2aea9c6fb30feb3bb7c50ecea7a5ebcaa55b89e11d788c4f3e66f8e5a760dc580b5f1a2e03d3cbaa60fcefec3e6d38890f74f0cfbffe8fa78c3bad0e27d1570cf7c9aaf41be3384d3549a139478e6408330c799225a56eeedfbffffab84c5d0aab13d49ca2dc77e2be89b8107fd6d45535750f6ba7bff7a5449eb76d4f5e6eda7e3ee1184a20b6bea4a1908a2c260e2468889d59e75c2b651ff7dd8c48532b016550948978064b77c02a3e07915a861f39a29ebaba4653a5c4f52b41588dcfc0c6443a8e55da3a2593a91c64534b17575a6bc8e292b3038e64093e8ae366718141c5aacc104bfd17a1d56fa2050e23bcb250063a50403bba19ce2011f4a0ca6c2f50c84254976a050063b81efcfdc2f4130bc2c3e67fadb5451e7d51a2827a6aeb763f8a5a651527d4e582b9b4a92e08a61798196537612f19303fce0a00000228000002240000022021e4950711dbe2960736c40c4ecf05396384f59d70436fb0776889a51f6b588e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000861fe6185a2f1d00609132ad6ffff88e862733d046cc5ddec21ceab8995cefdcd342437bb26acb29bc359a559c5a8d10d97392d8dd39dca8d9d8f23cadb3c77dfc696afbf908f9eccb0680ba492829f11c355e47fc9f8401f5df2fc63c2b587fbe7e05707e3a7706bc5c1e8d7b41ffa9b43574c23710527bbabf15dfb8ae31ec01aa76dbdb7807bc9f529507c116fe1282a5a37bd208af235893844476ca7cd58ba7d13bb179fce470f63e09a9409d55d9b4d71ca8105bee2ebfaef0226b89835bbd201585fe6f0b6edc5bff8397d84e70ef5b7a46b77cabe4d3bd0d049f4594ef2bd12253bbf48daff3ec2bba67be9efbea50cafc2ae8cf7611b1c2b0d5080ad6ef4eec6a06acadcaf82451f54c7929eb2c75381a107284187d2cc30fe141bf74c2eb74731d95dbbb4f66299848bc4b34a66403899fdae8756e48c96242f115ebe0fee78297c5c3b8a65d9ae2606f4d40a4e4ba3ac6cf86e8e903add3818c9ddbfc37bf6d06e591667161dcefb524618a667e40e3c984a2c39387d5c0eeb3264ef39a1189f6a29ae1690757c64a58af4b6c6e21fa6873980f9878adab472d43c2424e2a96222938ee3ee1ec2ee4afaa7f6d3d9036ed91ff0315f8330f390651000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400116295b3f233623860fa7215b0afb28e5d5ff256609de89a330856f6f8930cfc40201f65957b1828936cada858600c055b878a3f1abb084a852541ebadb3e4c946914a218b2666d64af93f6d84c7906c37c75d0b72bd5d04e3b8b236563366f90400000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc165e3b87659a306234339afdaa30548b23d1390b688e3229359b0accea32ad23ec0f3418b28b119e33e5c314ec44566aa905f5b33d92ebb29bd7ce689e8a0edb1f28e274163e271a3673ab09afa7ed28b47254a56c71b4e3c319aac913d795199201a4ef3d3ef48dea0748e892dfc106af7623ade1d0344f1ede5c91ba693798167cac6e11080eaffe4ae84bfdcaff08cff7a337a869b2c9821009350b2c15bb59b736274f14ada83cec83b90994e71d73dae071410726f9c11cc066b3696be8837a754ab0c1095e58345ea7755398ca4557dd7afa367738b2f5686b64500970ba083dc8e146185d8fa33af97c70832fe5a49090b0ef11411b33ac9084a0b273ce85f25a45c1eb2d8537d186941c91dae9a3ad1c699c6cfe02455f870fe1d2f994eec9ae880c768675a9c0ac5c07c074869658074af75ae4a0ec84783b45d56bdd3dbd96f1322a51939f1864641d854400a17a65460b5f450787b560ebd64d2c41aa17de763d4ebbf8a4fae88a8f1c19f03f12cb2a72d609c2fc1afce8e0dfaf954cbe3487c281a626aed9aa8770f060020f582eb018f5b9020911cb82f8834439d003802d7ee8184c2e34c328c6cfc155b0f04db9fd4b028cc0e368ae7470000022800000224000002200d60d66a157b517833ccb695546947a6d3b816cd389f92f44bff80921dce92430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090b5ccc03f903ddc4b44d92d8cf2af9f7390623c3706fbed359f72ec281e82393611c79083c1c33555b57713b314709041d58ddf02e7173968d1e25ad9fdf560329782fa39f22f631c186e435ddc1692917a009a06f6cde7ce400322a4d0912cc15e222fc786ac219277528bae0a8a77c486f08c74b8d493fdac171fdd6b7bb95d73e8c5570b6563e5a3557dec28572017b12f19c8e234aa0ef904ee7a463fb1c2ccf3a51a07f3d5e97d0267b86e943f75fcc5e7c33a77a69eb64a18cd7ce5e33ae74782af37e26db7a78de27fab1aeb463f7e4813223b2ff039a498f68448e248909884cc77c7fefd2453cfdc46965f31ee8a4da91e7a48910ef99d46aaa5949b2519f1047432e8a9ebb50b37c4747979a3023738458ead8887a696390ebff6743d6fbed45c407c4d865fe01e8a3deb15007a9fcd2505a69567789fafc488f6317bd4250b5b5983f4db13d3f61eea40752620d092f13ed08982affd044a494e85e0dd687295cedcc808ea89342710e578cdf9e19c1b5c29953d2a14b3d518e2e3a2c490d4bc8801f49f0687a82aa6a80afe97cf44bac3f4906d4ff083671122fd919b84bd7518e1e41a62d2a25cb19d26eb39df45cd6cb79959afbc526eecf0000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001147ffcc0b98a7f2db4e16fdc18840fa3a271df6f966a1ad3f6f078ee1639e9a402038802b2f7250e761a741599f969ae7633cb2d083055063250a68d8d0d2cf34f1b4bffc5719b0296ba1130e1f149d6fd94325bcfae2ff6e903099d02aad8d7f200000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016c47f1d69d7e4368f5e28b180f05f784f1a1b2a2f99aa67b7fd69647a77d8f7404d217078a0155ee1d26f7e5ef3738b111c3a7dc160e07d118291676c6efe45f86f547a413fec6166eeeb109b83e3c97b5e6918c1b53a939590ffa1268e2a31fb466848fd207998b01eae42033693d0ddb301fa2ffacc16a7d6885725d3c29941770d52b767878de1102b65db08fd4ba284bf068957c7c80b917607efb310a8300f420c08a2267e367597925955a778f9e4e921135572fb82b4ed86275d6bedf4a4cd5b64fba2ccba1007a25fd6b90ce8f807221edd447b5a79f282319bdc043261c1607f927a00d63df5491270a01247869bd57f07af79d083b47f664eea54ba8c2ad18482066c9c62defb7ca1c3081cf84e2550551b1daad5f0743bffa005a315211634e112530274e87a95dd5d7e2826257207c81932747cc2898b731811f72e17fa9ae44f537696fcc4b966caa7e401917ddd07d673a4186aa0936e0c4bfc5c4d28600c0088e719f63f26aca08d88d86ef870d39b0abbf66bfbfc5774fbdebf60372278862eaf77783d120d3bc994ca1233679344dc2d87246b83399ae38803b02346ad1a3665c7e0d66c2a0c93fb3f2d6ef146806f81b4051b8365306c00000228000002240000022007ef3037d1d9f317622e7e12e0026bdd2d1c66adb6ae8b29179236c539a7d4140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084e39a8da6b269cf3deecd16c90a46a1e055c1f2d8fd6d1f62ff5afe9396bbafd4a87827f8305c7a97341ec8b9206674741db8d2779dcb8f134f61816dc49c494b60392965ae530d68a6d87cdacfcc8e8344eadc2e2bbe856642c129f79721c758e88c44f269cf317e77878a1c32522fd680b2c0d9a1b90727cec2419a4b92ff514035cdd7b996ad19a7ba0476b74c2cdb8f64fd9af73a0274af67c09d2c6c0c6c5a882e96ffb25463d4dddd7a0900e0c2833687f3c10443b2d6bead68834db3a20857a10c43ed4818c34819a97ece69bf19ff1df80aa3ed928b9c5bc19ceaf0cf277bbbe22e7f3a061d82b0886c4f81bd5d2129745cb830cd3fabb65fc056d6aa326dad4affe9f3dd529108026fefa7338f499b0046aa6c1ab18c38e1505859ff26d320629159566e1d7113cdc537b8bfffba2d1cf06b767904eaf4dfe2a43e70ce5d139f476f43bf7dbe609760282590ed0facb2529555e0635eabca2df97aa02fbc7254b15686f97907e72541dfcaf40b9bdd6128235bd512b3fe6f82b0fa9947ba42603e8f0825358d3d1d1f4d7c50a07e2a65676ba0981a50586a1ffdb291e46a21973c30813e663c6c0ff9c37dc07f4fd79bdd93c1d6d4470ae7d7024b000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400122fa5ef7475a69f2b94c4348185b0f5086dc6a3aa5b85f6c898264ac2187dc490204a050e940c1bdec273e680d0e9a57e0caca174609e22dbbbc935f2c093b9547197e34266633b96f59d75b590024034289f3835956e9100a75deaee8d878eb8f0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c678153c6a2be4b4e04376d6b8a82229c9e0a550422c39cec8b74653b499cd5ea290060f6515aeb19dd6a6bb7bda2b4feb3bede55fbd920234e450cbb1727ddf7bc5d3e6b18bf9c8c4f2bfa4995067dbf1d5ddafad86fe3c4742223118114d7992c4bf2582cce771b9b40e1795c9327eb4316982d6fca82703239b639d967694832d84761991ef27627fa558f54d9e0216de9de69023b72e787e01f7b1b68c7714417eadbba623797def22008671a19f54cf458d019e608ba5b0c3ba426a9c2dc1fc7b01013ad276155388b36cf7c934c1fe306ca91befa3c9315e8290203fd4e9e94f8cf40324a657594dc22f76b4b06f44236e7d0b21cd96f9cec2c28790307ae70cb6b816a8915e98ea70bd23a4832df5055861437a4afabe26f3ad2b1255b1bbb6de87f3f8ea35cd3d0a080d3990177fb11f2335d02f74d227780ba6b12d67693d0fd8f122af8b20c5231bc2318502f80bdbc87b69de693e14e534811357a87c855fb96b5a5ab55eb40cac3f96c4b78fa9cfd581c575323cd5ae612e421022addf38ffc2df24e1fb6b31e1b81a815f1c56f44fe8df8211aa7952c1f7d4a94c7c9ce71aa5b73c99af85249d9aa1e4c1985944a8d2187dd66d502d3b438570000022800000224000002202e7658b70273bf5d86ceedcd103c9d551bf1da4444ceaf2fb83432817b841f8600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a26b0f40adf0560d69eed91a0d5b89612a5a2d36a7c176d4726cabae23a1bc78c9b85d0b518cfe176667b0259b84ff8d01b011d5675a0632a7e23e1854dcf12a9f7cfb096645ae33aceee9aa9f80c5ec276d6e5f71468fd3fd13b8217e7ef6a725b110fa21e39f3abb8c39070b7025b979dd4fc1b80a0f6812bf318087a46e8ff35c2ed46c374a63dfa763de4133e4bd88a151aaf162635945942a6e7dd283d7f718e3e954083490091719d2ba1ded002bfc68a77efb88e1132e7491287870629638be5d74d4deec8f33f025f7fed4b8451c327fdfe7e9c29eb51ebfad12144a5c8c56653648f40348dae11614c058df2c89e76be6976b73baca9da1867d879ebbec74198162353719bd1f0a19e6e4b6e5e21fa7ccd403a1f9ceeb96007431f47fd8d9febb4eca3b567ccb9a77d68f90a49a1c72360175e3d707c3d998fff76f113ff845d303f1bc38635d87edf73ef41b8835c7054e7bdd0610b023febc28ca8e9119e5784eb7fac2cb5c11ef66a0c47ea01f3b4915610a6f33045af5f6c52921a4f952b328bf32fbf06dcf9e51665f26ecaa04348bdf1bfb1853998ea3ba8f9978a8a5eb7fbd89921e231be29f72dce6aaa851d93b51f564dc990f5a01b61a000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400122a980d984f42dd67be63e4bc8b3cd840ac99049d3aaaf7d2e0f7ed85c00b09c020953fadec9665cef384775f48b1bd9eac1e27bb8a285e229bedb627962859914250172f9f2ce6a57aca9c40821a71a5ed719c4cf303e54c9418d5a517fac45380000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d37f66696aa515070af066327867249f5ee191bb2e9f9c6dc6a8b2e0b7816507aedec46be88f99baad9ce6824fd082ed038c89699f4d915ded87227ef84c982b23f94926aa5317c752e0c92fd7be2fe738fdeab6ce96b3b8ef833ce84044a0ac8b09e22c501e256116b9832a64ee1238a433119e299863f697bd2c9ee605b652b31415307e089e2c41f5797e64d13ff550966aeabd573ac97617279a43d6a4b0bb41556191a1b4267d0e98fd551fe35d8538cff89661c9859373139426ffe087a6fc0aab56e4fec6e57db1e8253f6b994b565a831566b3e118ed8f21d76f8cee5bc8f08cb32444bc1c1df7204bed125e1933d4d6a5650b12512db6ab3cec63c85d7c64876d027b79d0eddf5f4c16a904019aef82ca3822c1923555fa72af1d4bf102128e73d890ff4ef7d33b7c625e67c71e9f154fdf1791291c2bae998e9f378def98f7c1b3f47e365867385333f446b3b4b3e36f02832a9dd426aada6c335f6d9c4a47cb05b76b9431076eddd4991214907ef63a1f449e138b30a3f47c2f2ad310cb0841975f0025d7389c03be7707c2a9971f6669f5ca33f9bd2d42815de1726b73c7fae1814b92e52ba10367f05fd70ace8a5575e43a475c6ecd1dc28570000022800000224000002200b19d69f38fe44d0b765dd1e9341ac3cc656dcd62817f757af6c08434b01da190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a992c6a5fcb3c98dd55291d67b846604c822d562958bbf35852027fb461eaaff6a305d3fb52f06dc753688a97c660f09f79de6929d8127731e4368e9462955d688881975d8d4ab4ed643be3da2ca2b6517e4c8f3ba91b0f83ba5feb47abdc2d9ea49e481b117de394bd5530b054a9b56a548c02d3a24cda231149e301d9b37bcbe044904d010ffb91d42be37fbef1fdcaec5f366b51382a7f10c84f4a7409f875471a23287768c094eb137d2900a0eb398a3c9f0b10055b7311708ff84e3dbef2d6f07d64cffa6050127382e22b904405c858456166bc1d5e40b71f6764093e3b163f17575e4f89a89a1a146c7204f63abde5609693fa93a976cbdb7036bf4518393ae747e9c1087173bf724ffe285df7f644fe134f85b7e283604ef6d7eb38d70bf66a0028d05a7f4faff087e4fea16d4ff39c9466807b81462b1e35e9e89c1a9ddb12921aec2942def19021bc00b322df35d5245358338a23e9169cba151c8122e899e59c0ee82fcaa77b4624ff768ded1bb79a0d31ff1ddb23a6226a32333b899b0d474097e15630d0bfd63ab5f085d504e7c136323ac1ba6a6d23c7d45ab754c7b997c75bc5f3e6ddc56fbcd03bb27ca87e8563dec3ee781714313916a000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0021eed7e3701321ed6110710ec5211c518dba50ceb371e813a21d0d5da1773cda12d576824c23a6ca4914efacfb629d1a4cc0faeedc69888fc52ffc17040ce281f02095ddafa61ada93a1102f6e13095969a53cb82e8e25f8e97973b32433162e94600ba8044f9fc4849ea3e4195dc7769974ce9664baddb61bee8b66487f4501f5600000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6807651e152d6a1f2198b4e8069a8ea83506acadd01dbf9db99e54bf95d7e49d732198159f865b8381ab03918d75e73636a8df807f37271740a3cb397fef089ec01f8456989921d80033532b9444d84103580826e6daeed19309df48097025e18e819bb1f1b042420a48d426c1ca68434ab0d7c3144fac5249b476895615dcb63691f466d4320c2407454f014a777c808c50840e8ac697ec015eb0ebb89b22097e22d70b07ae1619b4cfcc8019333879062c2dd14436dfb44bfc2da4e6ebec1a97213fdbba364874de60bd8fabf50cfefd2f46cf18ff098ec835b2ac05acbc4de1c44942efcecea8472990b61ece2d802bcc6ee72f1d19a0fa68b2440abb8c47444f06f4b85a0203f920db3f825c323382cfa588e2daa4e34358cedbf105eec73df26cc840d3d871b3b684bb1f0e958ed57a95a448897ce5376da60ffc088e0fb3c61c0a3fe9c93946a01823a40ba23bb9fa2b4d0a02e4d77f289a2c6bca9e1ff00cf7dafc1c90b9aa8edffdab189ac3bcd144f26496b84687d05d2310b164f06485e0091261ca81013acd5934b441f6db5a8e9561ce8a7cb488b4defdec94581ceb2cd4a20a97e544d0b5885635048eac82ad754ce3f4d2eccbaec87d430d1000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020af956e9adfa02318abd39a71e4d6cc8a9f77909190ec21b9805424e2e8e1c8c65cbb5acc1078827f54e97a1a5ba02e166ea19758990203c84e4a375162ef27ee3de9dc4356f9fffbe9d5a58ed235f0ed702e8e4eaeb83551c416e0eae8d4394d8f6b4681d4b2811266c28278a1bea30a0b645cdb9ccdf16ca0237ccf1e5210a0f320510f63e148e2a500d8337d7cdd817a8ef223df87a4e692790c9dff1e0ccd9df6ca2fe0c70c887f0bea8c06ba13d1604a5d0dd7354b0b4d96a2ea0ab38ddb3c8506fd55ecbfeba559b3f6b7faf6269f82db6cb6c1adad5bcbda288aae49e6c9e045e2837dce860bd67048d344f90900026927289013b508ec7a372ff6675246d1118788a5df3f136f4ba7590e6f1c8d66222204f2021be77781e8faf8a9f4db546a11554bf89a60ec5156d967099488e99be27d6ef65e5aa405d0a6ce965d3cf0a7c80bece8fc3ee86b7580fd54ccebff0f494009b86442aeceb500022b19055d6b0b3bc2d4a9b23a4121a9d9e2418df5102cc04fe0e432c8b6ae1d0c10b17c9c091487b4b3ad558f427d9469c00f06277c7f8806d927e8077810712df70809514cd643c8102ccccc3b947f9b20433c425a9ec0dcbeab201eccc6186d110000022800000224000002200816c46600684d1a90ce20c7e702081a0dae93a9886a850f6078acea4de3293200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af19a644a51f293d7533f0578c2c2528c41579f452f915f779811608305269052b14d9d121659262ca640a3a62e309080cb429766a26988408eb511578067646bbb976fa8ff14b5ff708318b650dd2712a53ce6ce76ce0d01176502ee65fd4bebf7cbf3f208cd221db9bd76ccf8158e596feeb9e6150dff8036cd3accedb915a7e1dfd51143bbbfb7331b0dfc727359bdcd638e89a2be95232ee5f0f0aaa5278f9800e4ef6648024021b9bf087d610d8c35faa83764c1ca8801e02364bf0a98b9c195a9ff8949422dc7c79878e9b43e1f8bc0c37b1e78d9425c9f65f2e76ac13b389ea7b64ec703613d52278581d25f47dd1eb7c35e9f5d827a77214c39893ed813f67ec9e2a06f4123dc3f96bcbed0ff7459f77344ef8fa4a153fc69871ddda91d4d64a5328da82fcd97c9c984e8d8c1df9ab189cf77409d7931f89f6b80d383a519211e33e7fec563a17b68baa94aebdf2afa992c36a11211075397d9030c661f3ee3ce357c9b9e95e7b7e40c0d80d17547ed6b512af101d9a524150f2ee5293b3c843ab11293fb1993b37d66d2fa6abd32c369ea6875310042da5e3da11876adadfd016e971dd00d607ed4fa4f2fd35f7092e547b1afbf268752305ae6114000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400129b29faff8211bc0dff9f689245f7a060e958fc5be7895f502550cd1199afec6020a5ec9de1eb9baec2c1e9f314d094fc2e0d02e69f95f8e1b4bf826e84e6fa14e1d38f5dfd45e5d33e852352de54f3fc5b5cb77dce2fb242d9d958b8787dfab3c00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094aca11e546d44de2baae4e4c5d095369247fce972b6fe77d37ae49da26ea7b5b77b3a7e3ecf12ef308a8e26dc2b4faab64eed526cd8cd3284f7af93f7f1ed16f5ecea1ea8f3282f3a1ccd34740cdae2f65f64698dd69485d20bcb869b7fd00a9117dd8c56da8e5134ebbac589999f7f3bb37b36df0900e6759a278146c5beff0085d1fa342e595e64ac2f3e99d65ef63cf28d8d7669495cf5995fb10d1fb482992ef3e6c6ba021cd41bc25f145b8f6db56caa8de13c291f21a8ca4287f1216a815bc4f94efc1fceeaaa0639a8aecd569a460591027a240aa8360b49d4cc0dba7895a4f4ec8d025800e615f9eddb806411ea0afda9d08a720390c3096c4492d61cae71f98a1a998492266f36d3af08f051d5c4042d6434081433ff2703e180deb708503a79988a5ad44826ada0b1dce8eb9b4f4c9f69096061dd9fde63d03f794acf2bdb97eaae05067bc51c1831f0aa46b061235b1f5f410826704727b5d4c9fdfec26f672f00f7bb64b526a6ac10e7149b54d2ed5bcbd600537c1596c16a7f9d6824d6c14620b1411a325879033e6ce9ad0fed80f7cebf18df35bf514a70a249ef9343f274f98916210a319243a9d69a8feed540677a8bd66802d1a7ed7cb20000022800000224000002202dc7c01de6d2be84720504dd4847af9e26b6049901c070fc05bf1641db15b01a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c9b0c98274de5cdd81554fbf5094abbaa61fc939f6ffb6126498320c8387ee182d398ee607ae23260dd08ed7c9faa7db02d84a5c1ef2700a8f69183524f95b4a234ed44549a0bbf4a2fe330ee742dc9ccd9281c81094e6cff977e71626967cd8db1eef82f2cd609cf9d20f735c4c4d237e38a098a182d425e412c04b934a07b81f1808ecba32748d1809ca033654927be1773dbd40663ee6bd4688adae6b6bf63c8184c89bd3b86cee9ef8b3483a31ec9a805fa56f4d8c5888ffb418f1113756f89472bb708af7566ba05670a34746e7075e024b4ba14cc842a6e11be7f4ba6cb8450469380169e594fe464370fe713ce5347adae48bc6fea4c1053ebc98323d7c8edc55af0113e01ba499e0d2d2b71d8182442c396eecea7ce513fa04b44fad71fb40b2fc062c90ed6e4553147051404956c2e192ab676ecd38e68c0972180c29adea952a4f8d10fa19ebb2f380cc5596e9e10d5379679d6086dcfcf5b07818e6c0b718d53c13482935f30428422a80d6a96e7c50487124ee4f7e4722176566ea48e256ecec84ac75e8b7426c3afb106e6c1430e2ed662ce18eabe06217536eb9bb4ba6102160d034531a00c8aebed97d01e786cdf8930b87a5a3dddc22e6b000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010e44420e646ae6f5cc3345b4e00da4702c6b761b9756dae6ecc0292eaef13ff5020bbcb41d52f1e52956df541b072ce0986902bddcc17dd94d1fac215cd2cf6c920692eb83998899d8186c7393f8e45ad1316b58dc942347a01188c671edc0c4a10000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001304f329a5a8e463f3360072d5b9e5ab3e206591eb44ff59acdf498f962c7851bacb5c543ec7a5c8a4226eeefb3bbe28ed2345ffc20c660f6fadbb37b59d75b38fa3007a762cee9752d1817326680a07c64d5ab828dc7c466ae6741a33b0a78867125da576887d22af74f186ecee563db116f0593575cf1842e59480581e2e3c26648d81eca3c0f4085fc632202d3607f9cdf0dbb090e4929a4a7c869096bb9d1197c5ad6f694e164a23991800d35b79f4bdfe144e10932d8522bf614b7a4a514ce0ff01cc09afbc6e0893492d0ac6d0754b7cd5af424aa6168c6474c01f2b438447ea2c2e0c820c69f4a83a22c42cba07265d2bc3168ca352281ca29dc9c9c58590949133deeb2338059af76d4ce49d476659d3df018540f243235401e449a263cfd39cb549803911fead8a512c91a1f100fd98a8d86cb8e30f4f78872265c4d460fbbfb2d3a874f9f607a9f6c04fddba64b6745a48d07503eb7a2e22b70eb10ded84ef63faba250a1855d6b62c788f84cbcee8305117d73d494e24e0798afaf07594e64449576564cc1526fb050ef4af31e84bbb2e34e5883b3b0d60c1c457cf4e3b3b7aec6c258804e6caf0b8f05ba6a5618d9c8340570ed19faa39bf9d16000002280000022400000220090ce4dbde23d7fc7424d2f4eb933c85881bfccd1df4e80cac6b9c462ce39e3b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002877411a397d2d2bfe910ccdf06e389c4d077960a2298c93d82223a79d732cc257a549606d31b1922d17c2474d29d546afa8ba64b5a918c9007a42ea78bc7b68f1958240f5aba254794734ef3855f5dbc0c071657332955cc2a873c3a080b1fb54f70520fa88d7c9b29b3b6b66cde7752501434b4ca9cd7a392a1c46b68e1d80aa89b1e338aba8a4d0b02f0c3c259f8c8477acebfcbcc8fcc224573933b03489c1ab3b97b8810fb83a76fca4e266f379c99bece2a1e8b4ee02506b898639a4378c459b934dbf127b1c2664ca69d850a3ebf3047f70b2217128a3f3e7da214f008c696d9c92bf9595e263411a976ede39dba2e47e561379ef15e059d514bc321acddc1c6018b2536aa1283fb24f5b6a661476d49eaba2a51b88196bb0abd95ff773e9c207acd623c0edb21ebcbc4475e0a34923d0a33b3d14c36d6e2d432a657cc0fdb020ef17a181e737a89b53d78eda341f0c01bce4dab308cd618e8a6dd7aa960202d4e16d28dae6e50ea500d53e90c11a24261f8c97054cfb18c3fa838a43021402ff77e67eb098a1cdef0fa8500f07cbfa2847fd0f0f2d317e55792a35dc481677f3e85437d4482d08d3b27d7bc754861b3927953921a697c544cb496ff000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010911c12c5eaa5ba80c23cce48a7d8fd01aba39d729eb4d98693f2d24fde231c0020e552b5b929e687b59f2ea0232922002a7135c71de97888b80431dc37d50804c26c10608d2c55ddbd1daebfe9219c9d8f1a33abf4df287e2713487127943b22300000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087641f25fb4d6af002453d8ad164a2e9467a46f63c20160e5b344892614578d3fb09429c7337cd71b4f8a4c7fab38f7644bda7c14da897a0d1231aabbef3547799db999bb6f96148ebf2538a295a34b0bedea25837e5bac9668ba4a37a7e3b6afa5d3658d9e04f808b1a8db2e08888f98584d22244f5e46ee6670f1951c2b93d6cbe80f8fd39f50bed09879d64a2abd7b2428e5f2c3341464dd0ff2373224896523dcbcd8891c37e0645286dde94e9aeba695d3bb33e6e56fe2da009fb865f5eb30114c71123a09426395513d0822d248e0d4568711e22390589cf3be62077eaa927c42470238b5a8fa8e65342d222d18d12296ce77a4d18a47dd5d2f2eeb369a3f25ccd3561ce7090aa27b7ad952310ea0433e12a4c224b57dcca67399fbfc40b6db515cb0d490bb0068fc59e0f7890cbfae532013058a00875dcc70b652a7b9b41d6bbe54a4d28e4a0cfcbd8ae88e78cdb080a4781b55c7a43cada09489640411890219570459bc566d101e9abace936a1814ebfa8374c9aba67c475ac0a29787a6779a73b526fa56e29eae3ddad8151006f5dc5f68d5a5e5030a7811e5bb7990dfe42803abbafb50019ec20f3fd1f9632b3a85d4beaa96ee9139218c6076e00000228000002240000022011f314b0c93aad0265cdc1dc9945211c35b2a9e1936c293b5f8b1ff9ba68dbbe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f394631d92da9be92211f77e10a86cc0d490dd8842ae9cbd0f91c5a27b2551d25342dcd6864ef4bec65e98cc619689599ab5c67263f1e8246458c166c4634db570d7234507d9e1bfa9f29b7d0d7d2984dd73bf3c5ce37b2ed68b047ac777de78484174f37370cf584ee77b882d0af858f30e052e81fb06dce56730a8ac7d7303d4636922cee1886348809633215b2b0b9f0f01bd7e663d8ab4ecd4eaa5ed503287abd2177f9cd4af551bb6db7bab6151f9c991e7a86f628cec2006b04e97cc9e177e414209c9087556f8f5956e872fcdd7138df29261ea3b965ca12b2956a3ce61d68a6d5414c9bb839507d6373c441a3f67e55b354965321b28c02105d3bc67700ed2a8b6eccf9fe7429117ee134abab31f4f6dfb752503c22b341986709b55f653364cd2be74975c457555477f51751652e740e894df697081ac82b140e3908bc5fb196b276cdc6ebe48f77f5c3e2ec1d25342dcaa7ea98f508a3ef3c6c5a54e897e767c2125f7af89ecf5ce4ccfe1d9bfa1bca1e8883be3faf17df7076cee3837b48ef049ff4741dfb08129427e7f311a22e4bfff5c8f824203f71df4f94d045cce4d2ff3c8c308debe3a218b01acfa03557e79891b79fb207e78932fcb9000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001164a1cac0b5a3e89e9789decf306d15e544c96d13614c87f328d757c340d5778020ea0180768936a7a330d29e308ff2fd946f93cbedac18ec73b871b916faee8f11f8d955891e92bb3e673ef4c2a61c237cb169edbd9427b8b85b032fa2add4e3e000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000161671dffadffb47840855183b7e3a925d9bfb24ef5e6836499a11ae4c4e606de5762226330f4025c8f099c8efede15c32e9ab342ac590974b5ef52506460e0b6affc2d44c6187651d6008937799467e9d62ecf9691dd03ebed5041ae18d9fc44e6b22cb467d2bc5ad75cf36ef2124205bf2ef2918c0954368bd5ce08f8365357ed679d630577b41ffec7298bcd15afa0c3528a7798717316d098a55d3f332eef02c082cd721fa734ea9d978d7d59844caf37dbaa9a323c375560b6c6befa34782d913e762bb55028ddb978a53e2f2bb649a01c1a4cd42b1b8e8140448cb26da90d576dea9a7cf6ee467670e85c3003dc1ad4d8d9479c64ac03503e879a498cd3aad9cf7b7831c88cfe961d1b1fadb693ae85fc480d50fa51a0e2395fe8cfa7073ac031d10264f002cba4b7287da2404a024b3f76d244083af3ef8867655a6b50e36f1763fa88e3a9bb26d119f9dfb28b3ff33252bf6307b74d8976543f8b0f400f5dfe6816fed2d84aa6aa32ecc201d7b277dbd24ee3a816d8ab50ba5f43b4e32477018a6e85a4748c9a773031a0ff3031b9214858b799df2344a5aedee9516d3193979e91bc9afef05451507566094fb0e7d29d5cb9142fd5ed0d78752afa500000228000002240000022016e36647093c5a4e24834389aa62ed974a92e47064a792d4bac33da63d74ecc1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008123b038bf89dab828b50b441c9c4d6e61264816354838e9ad678dd5e0418a7248285d3559ac4ed38272555d0a5464998541d8bc48824affd626b4c5becf19db9d568a555ff2d10413073a6bf8814ef4955297782e1a955dfe890be369673174dff966afb3f81b488fc993747ab6d6a0e4b9f34f3f991badd879b12a290851b7594c6650b7c5cd2496884c16abea1b4fd0a4cdca4c7caf1d88ce0d628a30cc1b372e64fdcb106adaf061ef9497345ea477a50324405c97fc9922f22929f5ee60cf8cb6d90fb7a2eadb68fa9314470bcd5c14d9ffae2616739315fb52ed6728c4411733a74ae3d1c7faf0917de6f72cce31c567628ec821a04254f251db28f55973faba8612df9e4a0c75cd07ecede81b884f92e3c79a52ee138f9db3876508bff74ddabdc148e34a09698ef1fbff22b7aa93896da6d1e286e37b7378719904bf704b43832adbc66824cb3a25cdf7d9dcbd9a2aeaed1653a28c0a086046d86dc2c1ed9b1c70d1cdbcaa70e16bcce71551dd1d7e608cda03af18a1f2818317c7c45d583dc0b1354dd89732467d162e69d4a9d1705dbf4052d5e264736f213677b9be4945272b0e007fd86b865e70fd5af8fe9fa170548930ef1f87ce27b7e976a5000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400127b481f31f71b1ff6b711a62f01e4f8efc22762ec1ef2f963478fdc9610e86e2020ecf67c8be9fa35a534ed2cfedc08cc59e3cd0c72af930abe019e5d21c9ee990171c5b7f985a4dbd6a60cd7dead602b75e17692f3008a12284daca6b4da014d40000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008679a5211fac9b45f725a9486587e7f6ea2c56c4b0b720c2df2d2cc44bc557b61f1fc5788b9212ce901329449566e520b61050232b62a933288ddbc291fadefc46813090f9de092066c5549ce73f1bb61da635638033e86ee72834198b0f0a4341dddce823a277bcd37ce90c10e32a142b42d8ee62f93c2e4d8c928078288cc44ce09bfcd7452b48e0d7134dae632a71f434e4dcc0462f8364cc748680c5f1527bd1136441136974b5ea536c23d8d3d6432eb6a839f87cfb08417a4506cca3d6d5ab2af4a30ddf5ea501ea95f5a19d6cec0b9ef62fd28c681e09c6426c7c017534d983e99f92a070beb8b56be4367a4d015d5a81cb18721dc5b6701574ace1cba1b03f4a3cb260fbeb6c7f5c2e38c0ae198aa9d6d44231e2bc7ed6679cba1d74af9ee7a4d4dca88a5457bac2ffed4f28ef2edd7bac3cfb07b991885341643dcd7bd51aedadc2939c7adadb402136acdb0662af34af6bc62741ef0c7da775b3885a9740f6417a850451fee2e3c8bea98ed217c7c942a60b869097b151a4186817e3e9599ce732c7dfb7621b5e2302f49ecd603a1d71e9a2481f6c440d3b49004f5a266f77b72348547d78c353327c765a3e0404dcb59c54952ea4f7bb3d0695db0000022800000224000002202b83f221b47ffbee006472f7b697163df1f94aa9f8cd6890935bef6d144da59700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000183d3ca2a57e15bcbfdf1a62b3a0c27bf1a937ce4c1b59a3f58d635ae7b594bd542bd87f5c14c85580f9d5d974cefd093d4de00708087bb71a8aeba775ad8428b7ab49f6c8bd5478f3ddc29d69f48ac8650cd841588150f68b3cac62dff5c642cddac2e259e3ecb19a7f5fcfd30448fd1e7364066db79a8141c58a433118d0a535c7357cd2a798ca585f7d79db296eab446ced3eb02434792463f58aa48962fe11324c3b18ed3a5b3e001634f9ade428c21811238f4abc4deefe2d773d7ee4d9fe01e18548f2c29407ec0ed2c488195f211702b25e31ebb704244d1040c3ef344506cfca9a8854d31113790ebc28d59e39c1f755b93dc9fd3cd1b37c99350b4ab3ca8b95cbf6cdc3fd5aeba4017bc1a7340acb5035bb8b90ba78deaf245e9fbdf26c6eb2cd2509d152bb191386c378ae124ff6f231daa20f8b6b97a88eacadb26c11743b1eacf22d9f4cbccddc87d562b0ca10a9da7ab386b7c94706fa167af4106e42bcbaff6da27449e7cb0d5622fdfe8ec5a6de8dd8283c1571d9524533b8c5e795243212bde469556e0de35337aadec5afc7aed918001f94316cc1829418cf43efb00de238acc5eb39e49d6a01892200458017e50bc55a111ec2d67df1df000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001240703d1fb75830008a68e29d018ea37dafc09efd13628c0ee7853b7d26511e5020fc4c95637ca0cc26c9158919516d4dd62c404a194cd50e9b924263e16ad759f2ed226906fd75c4088c065c46b4f1cce2d02b719b582040e4d62d878de9ce2bf0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008efee7225162a88f35e128641b566abaf24d71ed09a1fc65da1adcd0c92f3fd1520fd1ba4c5942807317bf7c284fd1036e6d59c033d3ccf031f4721baecc9b4c07b1490c54a96b0ef8f3beeb55838fdd888418707a2b8981ce829f939bc51b58789f9a387e4bc496ffb6c127497627d80033dfe82c0f3fcbefa2be1cac1279fe1e2a1f8d40dcb93393c653202a5847b8aac3be66bf7656d06f9ab5f2c7460a8a776131dd1d5e9f9205efc1e468943f5f0da6ed40ad4972f12b0a159d420489f2ce9c4f9f2659c6f511e4aa9881c58977f5d2e50d13a9b54d56de827df7fc2fd8733ace6bf6c06f6cf8f424330d87d7fd0a48c9a8c18c0499ad96fb32d6261f10bac26abfbe0c1076f09dba6f9180601b395b5ce3d64e1cb77840fb0afb59a17bda0b75ad3c9d218975e9fd56354eaea6cef5c9d1ea97982f7af788a53d3b606175aadf579b9c2ec5b5aa7bc1672ae183eacca1ab3d02d014e634173ad2e60828fac450cde9301c0f55809b86ef5f25fb6d51a9f11094ba0056648d827baec4ad304586eea5991c87c25b76ed44296919489c9372bac75b7892e7ad5f90cd1334694df041c0da1c6bd8052dbb4277b3ebd56e5f3eb070169be837e174a8c7845f000002280000022400000220193898f15e43c08aa361ba6d8ee5f82018d6b6bba1d86bd856fb209404156cac000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c951f0316837dfb141188f863e6145c14553c33ae945192efed60f63b743105d091f71ab7169e4974b7fe4134c01fb10935862490d3b5f4ad455b2ae8c2f34a5a1e167f34110b144a9e860e4085fddd412f99373243b54b9104b223ea3634606aa1bdc88643992c6e7e98f49c9d4a1159c136c1b2f296a555edbb9b5e9c79d8b3fd6ffba8daa913a9fc0da4b3e663b588a994254fd205b6566a05af8effb61ef546d720953885193c6834b62b0cdc4482d55b18caa872a9958aee7f90248633dbb008f4ae64a50e3c4939734d42c569ccce298b5bfdcfd814ab8cce0de2dab67a762f7d4533dcae057a81d84f218f6f17449ca693967752932f30455ba813d73bcef66541159cac5515f071d8f3f8b7d10b3717f9c92ef27e72d2048a2749ffa440f5afc6b537d3c9ef0bd7a79685f85955d33a78997b375585bbf40172689af414309694b5ad08202d8815fa06236fcaefc9d6d56747e172cb011ad382196db477ce4eda91bfde1e551c177d8c5ad6696004d3123dd218cbd6514536e34f9ae8f03328e5dae91b48bb4504aa9e8b124550039617dca76997e9cfb1d20dcd3ff8bfe45942c34eae328a46804b2f848e752b3bdf909427de546c29e3361d6bf9000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00211775a57b2f7a91ec8e9f901665f7443095ff3ded6121d8a3ed61ec13defca65202265226d94aed4b67bec822dece211b5f92cec6fd6a10518ba0086dbcff596020fd367b21050e49339045b8c60adbc37a2c8e4e80e0240a4dc2f2cef4e53dc00288fc01ac45afad8c6e92beb8eb48f4860527309f65ca4deb95f301ed5fb6d6b00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026718dedfe8bccd9d9a7a11367e8777012d4c51d477f0414f7531f5087835010df671d71990d693b7290372e9f0ff4ead7825b2f091b142ba4a8f9b92964e4a723ca998c0bdd72e908cb17549c6b0d30155f5b28b19daeacc46c525869d502a9cbf2a986c35e6b776e9cdfce90f0f0fc57baad9f09f0413bdbd8a835a55e84e5c2f2e26ffff077047aaede127e0a7e330e8006f8808d97a0f42a3d96aea30438872529b07fe09d024c4200574cb0804ff9bb8f4d2de11ab1a90498271724ab3d1477d62bdd915a96958a7360f1f8629662dc97f8d6d1b361a66c30a920228f758a643b0adce7461b1a32b941b0aa366c566be243bcd5c3b3e3136526686944d52c9815d8afb919d7bb60a8f0e5f6dd4152d56414f32976a85bd13f562bd293311dd0d564d412c097196ca81c16dc94c47a8f7d7f33633777da5695e263f8914d6edf8dd68ae30aacd7a95b5200885b3182b82559c5ec9f58ea412ce3cc9c571cf07152bbe7aefeb2b0466e86de647dd3c572a8b2c61d01adb62cd403825370c06276a7749a43c1500708a66df51b1abc141cd7a60fa25f689892f7a53d29417a320a5f434060912a35ac796420c20366b238ef78e97777db1f262202edbc6e9900000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e2b2030163d8dede0bb01872ccc1620aff70d367073b5026bdcbcd8397163819243112d7dca87d13544d9a16daaa767cde054610d390a25b95b77030b89d499cc41c3e0b12a7c5fbd229abfc85c8802859715678d43e81cf17fd89ae403cac752e7d662dba3989d142d02bb9274117ebe15c7c0fcb72b4ffcc924746365f3dc086999f16a9754c88c7c26a639fc84a7e146446bb6d72806c70191aff371f1e0e8f3724a11d84adfa2597c601a6b98bd1bc5351e9317989e6c2c037d68d65c462b898295a90479da129ba10e42ae6900e9b2940db0af69a56d30bef78882ee75012dd35dedd8ebd5d83470670e16bcb5c89bae728cef705aa3a9cc161024b92c49c0f2a2685606c0d7429459f3c71370e0ed5a8efc14b2fbd15708c80b67749715ddb5b92ea3e92110af9707811edfa847e635e3eb918042c55dffd23a0e6b5eb094c664c4d7b039055f3cf155a5ed068a5f995d75d30e4dc097a18d0b0912595f6058cedeb71d94d129c66fee42bc3d5afde42db19647c2d7f3f70b154d595db5a253ddaa6b12589718202923b2aaaef6bd14d63bddbfc682f10f8dcdef8fdea71714c4110db62a56ff8358ce86b4fe20a81a493e3c83e82ad315a5e49493e80000022800000224000002202913150bb442d552b664e374d06b0989a820ddab031a2ced51ded40b3f718f4e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b16262f19f0b1ca1c7b75ab4865671c218cfa30855092b9cf44a0c7bdb0a98c13106742c4d0389183fa0cc2f014e40c5e6d1e4c3c673b8ded1d566f76bf422f52c2591480b67544a6e23e2dfb9e811669077ab7a25f8a916dedbda8efcdc25a40556ac5e19237a7fd981a10e9a9f12e5fcb3920f9c84b14c9660ed494e9eacdccdf3b19a1b2aa119ecc4f3cc622a4922da82e8b61a175202c13ba1239aba98971d5c64406a877a70e10b111ceebe935497f0c3572c6253fbe01bcda04a94f384fda2644a5432f6c5356f86ae6c6d9db8671ca76b1aafb1c0c1a7ab443e062a40c49977ffddcda0dfa12f4b79e57d27ebe68d38be4799729d25344760deafe2f5008d501eb4a6a3179993a054e808847d13aab18db2bd70f28dedf84738bc94c267bbb104e1a29a34b68a0a7ec0dba583d9c04da832ba4540f635092e9e98f73978f6ae543a1669fcbde8bf90260b95b3587a19372922b105809080f6e62bfd12fbf2126a4ce5fc777823d83edf20af2bde1aa399075cc2dfa132a8bc5178981767cae6692b130cf065393a0b445ba88afede8706562eeaae59a3b4805a5edc63c6b45925745311f2a9ed2768d6197522da569d3268b6297f9bea6d3d850a11e000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001031d7fd0c862e523c4452d07af377a4ac878fca6b68da929154c70494c58854d021191c0dba439b48170415d19f9036d80a45f61fb6f8654a5cb7d5baa16143aba2e1ff87087eba6611a77f3ed653f9940126d2dd399fa493072a4a71ecc6dfc2e0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f622fc14027b1617c9637f119ad01ba2369e1530ad1217831d631d7b46d0fae901a87831b01b349699a75d57432fa75a7ac2b390396f4a771f2fd15954e913067f3ba8f9db94a773fe02e893e6d504f2d0bde5190444d59d38212d56e94b1b253dc7646e5ecc1f9f0699df5e52e5669c205c5787622fab3513b7013ff6916c279e93d188ce64a2f0432753da9b106271d31981048c623e3923675b085e14c7454af0f449a395d46c9bca6f3d2dc717a0e64d16d6fca8555fd7cc46b3be5a61237fd54b1854213b8a1897817d1b838523a6eabf55efee0b6b0bc63ca21432bd087fbbc77daddd5ac9842b2b197961063b533b6575745caca082268cc3d154e34afda4c33d72fe92e22a361ebfc212f611b652b45478afec3c006979061759a06645611fa0fb1db1ed16840e8b7b0ca53c9cf5d83dd032bc348253a00336c60f75db4edb169974fdf71de3366d08697c71bbf62f38b7dc2615e3b66c1196959a030a887f10b8b7d33372cb8b1ed847e567bafad60bf2235b2b4d91eb52805631a3cf15bdd64ce57872b6c42f933cb7490c0de76c9a8302a5fa98770315229792b3ee77f568a5eb005a46f629e73b81596fba5ade74eb62815e464b88b5167baaa000002280000022400000220105273a0c096f74c308bde3a7d4a0305d17adda5c5a1ad7fc9fd429ce4c5e8380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093f2d793fe16f0e62d8336164a2a11692c5188a1fccbb262b43f7259bc1b14988001875582bef0fadcdc91441f63e665ef7292b6256796a64d11b0f8929a7256c7acdf3f7dafc37bd966cfcce743f0fd88ac83af42fe6d7f3c7cc4b2b28b6981ce24c66e94810dae975576074bbc52615df7af6bc25df77f3889626a4c6d084c545f0f8104866bbb9e87f8552cc6e18b06088ac2993e78f2474a8b889ca69dd3dd193b746964bd0c519f02fc3acf44ad68a567d01025421906f3c555a2627cb7428185e6baa4a367b8a83d07035560f6e80792d8c5e562b0610f5e7b4885b67f461f4b3138aaf6f50378027f340d471c9a938b3c6ae1fb13694082e7c039d00e82a9f2591c085be56a22af7fa3da071f21a0f0a0e62c78e7f629e661fd46bd7233a386f2af7ed0b76ed2a67f46da166743b9c1354f7e208108105aba6be2ea78e20d8b0b4ad654fce26816d2666be08493736122e500eebbb6fcfcb5baf24663ff19981281c5f9be058ea8c1bfc770fe8596e2f91e9c5a6976dc8bfad6b0068e7a10949a6a7758ed142115e0b8e1f46d802156851de5233c7e76b3e338bd37fabd11cdb7d4367b7ff054d31b907ffa73b588fd363d309787e8b31c739e62c6fc000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400123f756bda8e20c29bcbca59a31abb5d2e99b0327863a0046ab6cdca8e642acd402128d6ac743afd33e60460f1826e944e69dfb2de30d59a8f1956ab820e7f4409923f8c8cd1d12ae61346d2f0e999d12b924f3fa46bb1d2690d176b47723a36c61000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000301989d4b97dfdbe463678a39dfcc4b73fbaf697885e08c7a4f14d36d2c547d54ae0fc781e3ff4a4955c020833a8dee95551d8c96ed3a3abe730ca2a78eda1e989364d64a1e2b3173589b498a9fe1371d44cf099fb73fa4b079598c878e1f54785fc79e9d9d217373c3006a87e6c70d93bf23f51ed5310a981e3b328ce3b13f6fac640ea3d6138f8f6177c79e18497ef4910351a2577edf255812e1b9381616ab2a6ca98459bab2d49ee2afed029cbcfd0cb6a1dd7a062d0de73b987ec8dacfcb24e69199ad5b7941d5973f8b873079e658b1476bffd96dacd8e04560c4001691f8d8a84dfa116d905e4230e0d069e96eedf34436ed2ba81aa2fdf24390128efbf558dd6f625ff450688f7d10d868dd8f83c9927310f52eb784029b73b971deb1cb56d0e26939fe2e82b905683d0b4381ff948067d81028175cb823e8e578214a3117b7a1edd96e019a0a3c5ae24b30df68a3deb980d09e6e6deadaae1a73bb051db04ea9bb88deb03a15c10c56cf90388b836f21a8cce5d0a5194efc8a4657e37da55b5324c1e2fc43c1e118b5212947ade3df2a5b2185198f769930c860296ba37400f31454f093e01ee58c104e4c39cc205017d18e3047bb39de1c8bb247f000002280000022400000220000976a0f39a64eef6db85c06d74c549cb87152fae3e97109ff56641cdfd6a1d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8df8b293f477ba0ea96b540a56c5a17105fd17a60473aeb22e2466637eb14ccf1145fb352130d080abcc8d1e5850b4ef92979dc14011694d5b04f6ae561ebfd6a0f0d484db8aa711685658fe77cc03f48da5ff638f3b36c5aab430ae291ce7eda376e7f76141a827abd02757d0bbfae879e5fb65c88ed1ec3094ab32ff5664c6d4a91ddf8454efc42ccc636d1ee1853e02ac9c216c91ddc645d3876349c4675d0b06d0e4a0443c445ffcde4466935ebfd4e0fa815d035fda1f5ac8a5dc8202f1778a5f8ebd05522a6cb0e5a08941fcea3decef943f5ded91c04dc71f9c575e01d187f90bc06ae713e0f7a8f85aec0ff2972b1aa31d7bfc0675a6692ea2f38c7f10be0fc69fc923de9db69e2baebf0a006ec3541347f8e049bc7e0fecc126e6d7c2f9af81659277ec0fdec0b911b7a7f96ef2c7988dae3b5ffd3e9df95a8302b9d402128c1f760437ae967259ec97916c5e9e24172f04c011cbb907107d918913dfd3d9aea67137213f1d31e430ed106dc4034c17b07b192986ddcfd1252607ec177e6b4f455fd96fefce14aa1351c3782a96cb0456b7a65298152327f3c2961d8cf4081d5079602a5e550279c2f46636a602559350d37118cd0a779d5a1c213000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0021be81f14dd16f2692d00915574b1881a6fbe8a8883df768fabe667e4db7bb7a3289e091ab018c4fbc3b6d3d7da6e2d941a0902c4d8d807854008bb85afae86c802134ef7b0927463ef4a9c8c8cdab0cf3f3fc6c01629cc7cda4851f9bb35e02570175c8fe62ef9e8a11e97e7e7c2ae16f9d357d48dd15de75034ed6b20307a8ef300000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083692da3f1991ce5b02e63424181b13d082c134f88a630805e4792a1d876d5585f5f11e0c05701120f977e36565297b19b59612ce7dc66277221de41ab8c8fffaa13ec9d3d5b1f7330d3b09d550c2f61a9ac7d7f80c964c8913751188aff0f116cce5583477a4e333d786f23c927ef0d69cb81ecaadfbed3c700e8c9c059ce70441fdf059aad7ad40f56cdee87f45e71035e7e9d3b010f2a4bb0c5d8fce659c4cb2508c7a8368aab058088f22f432f6cd8e7e35ed6b4eda5967d2acd715e74d4245408a8e8d4ccc8a089ca418493ce5b064322243bcd91e3244d1bde59ccffe79e8886ef63c18d83b243e18e994703e8662c54843c9070a6fbe7f7dc36e9fe1cd8d57f99e75f5a19d77944ce46fff0eea5c313d306279c03876f3a95eb2880a5cf73da4c868402067efa3d895a54f161ca4c6a4542fa167f8df65dbe203f4fc4bece83fc11b8bea85ed2c0ae212f9c60013441383d6585d5bb942977197e8c78d767344743181e81bd0b00f0becdb7c8f350ce6ba3dbc0d72aeccab447f5f0a6b64549d9d791a52bcff0148e72fc047c4eb6b537638179b83361f105c0eaa46f373d3519f9ecc3372d9f3d255a74ab15e961603b27bf714dcba34fa3ccc208810000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000874ea9b87f71574fbca491dbe7996e6f1d4e520db081193c3f0dcf99b286b8b313221fc74eb67bf50c30423bf9ea6325e107f32bf0ef3cdeb026cd59e3017a097933258e4893ded2b317d4dbd860ffc94cc32fe0ebe08f12d34ffd9fb3b9ee7df05aad5c0ce10738fc637bea9ce321f1ced6b0d1f8383ad1715b70a7659504f224da47601ff8fe9294a49ab777155d13be070871e79ae59a6be5be402c7d5e6049f322e82954c1eb56523d66a47b8ffe2577a7827e27c5261cda12fb031142a73c6db3030a91428a9d9b567f43d67193e402d18f8a3b5f907ef5cacbb187b9acdd8c9e3e74de1235b6ad91ab7f0bf91baa37e3d79db9ab1f98585871ce142501d5e2b6c96ca5cdf3f1bc1ac0201c2f7c2d368585a7cc794a0b39c3a5b4a630a0f00a758cefc33eb08e8fe9373c307f33409d8b5b197725f802d581466ace7a07404bec5ce3e6945261255dd31c93b17d0ebff49f4cb5c5a5268492dfd2f74f55e704bf300aaea10c97a5b5a033e80044d453e4eba39a86e11460ea3ec33dfe88cd105150da6fe9d0fb74a09d15fd317fed1b4f7f50ae9259f5bb79349805b9374c576307c43bb8614c49da7c5e01cd8217ed910fd25e348e91ed9aa4b0193a8a0000022800000224000002202f5574ed500f5508f695670496ec4f8295d293e9c7222b304c7d52609337c3670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006203c8a6b9efc2f0cdb3fbbc9f25340d36b8a8abdafadc3bc059bd9358807117136ebcec6a7a3cafb853b8fd2102b932f330606ceeac41331ad4cd8c7f92532f18387f52f94e521b9b990bb0aa7861763ac0064af3082aa5e5c731366608ed333a78956f3b318e96fed0e8f5e60d6dd9deca919a889c1a5a8f3e277d9bf824957821c20404fef415b7670ad82f899d100f6d1b342681a694dcd93982b4ef5c5dfaa615d41d9f15a19c61bf79a601ae7933a1867a50213109e798403833c85aaf14005b6ac6bb20e0c79a8f2dacfc53f7c96d62075210f2726162cbddbd59a35b884ba36008190681ccb988a97da4d218a2e16171fbaf86f64f16f11b3deb15caa2ee4e5aa4a9c17879a7e2fcef9a7a93cc18517eae66f5d7a6ef87ae39bf5aabd8fe04835d45335d11d75224d85845ac27ea226b8cae2f1cb63b7ac31e16d3996c7f8067b7fc45aff6f8f5cfe8491890af8fc26c24d822fcd93742ef437852355407e6a4def2ec7bc32bbfafcf197d4538e4efe1eb63e77cb950ed88fe32fedf4e21a7dad082f5e007498998db6c99842b05d19d7ca94968ee59731f2d0fc678dbe5a05c1ef912d4a7e58e4d806d52098b5f1faa7a1fe37b30c72ccbdc23218000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011c1a16f71281bc92ca32b0091293c370dd7aaf30a7aed6c3d8ec29a9aaee939d0218be0abd9297dfc865bddf19422a698d8ce067b52b43c3ef0aad91eb2387f395032913e84abd144c6970806c7729d8ac19f0875781f5a1e6187e80eeb81ffabc000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab3a219cea37b1ddaa603c27614b11e04755932aab9b13f6977d20138b396b854176434de28016846b727ad56f934e74de4cb7a37bd6357fc27804cdfb546a4d8831ebd9904e772d298982f888e5464dac0e2e94674e7df93bf3caa6c8ef13a8d00d425aa43c5472aaa5591152c3bbe0652a5882c223c5d06cc6b4c149beb44f83cb14c3a014e7ca4f98dd2ede3af01bb0f565d69675cdf31a19ad7691ca02d15668f5d38a93db4d1a6e60196fe88956b81ae5f6724418dc60235da18dd55fea5d1da8afd00f807fe0bd473b00f326fae04a210d9a18fbb5fcfee4ecc6ae71df3e7e215e6e1fb92e3be704d5e821570e9af2f71b68475d5465488b47ca4ea4787d50afd7c8e7789f6a0ff9b3b281cbf537387991d166e5f1c123c1e371c237be9bea0ffe593620f023cdb4ca157944ed9ea302bca6afee0f6c724bb08f29ce3354593cf9618c054c7cb1d662604094814112ee84724fb75d4ad7d3d4f0effb3b8559e874a3da2e7713056a2fd6e1b96a2d83a4d5fdfd58a7e1d66596c955e0af1f8ccdeb87a40c25fad7028ddf451d73d60a7642c7e9cc7ca1650e77d618aac3e15d03de8666a0c589d013cd323ccb4e2a362edaa1c9b34621b42f3d2772b8f30000022800000224000002200e5f2763b3b51e98fe5f03e69964b59461c27a2e7a72f3e4525c45f5a9928aa800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073d807be3df10058b736a55b9a2558d7f0949996ba5b466cee600b84e8306ba6353dfa78f40162f24479f898b651596872510fde2c8663a153131eff6fe66fd15d2f7de58a36a49ab306d9fc97c93cd72edd4f7c532d555f14e497289636b8619b993091247fc3f49c2edaac0172ad1fce744d5687898504b5478bab64709c6491d0939ef6721269df0d7b110ac7e07f2da4a265c1c63213fa4d726f8e431843aa961dd5984f550ee268d8efda62b9a1b0e7896568e114fb804e40a2fb1a1fb3ca02e9e22a3d46f5540b28fb68b925c2cbdaffdcc4494b556664abb2a5974cc61264cac52102cdc4da043fe857965a69971b53c9e0b8e9657fedb770ac0764f4d38bac5033e93cfdd335182daa0c8c214d02eb1b7c0750d6a14f35f76e7598eabad7459ffc37346b8f160727a581a908fc3ff29491731b6c27c819d8200a639da0e42e27635813eeffef14065ff4365349b26a0ab7fd5c15d20b69c23faadaf67ecded909c9d93c93949e24a70902c4d927b0385383c20fa932c2251f5170db9d8e0f206ca88444f6511c4b5be0000fc8facf1986070c74ba665d8248bee56d139a7fff4b20e63f3e044bdf717a180e7ed61a745c062634c3b9c2ac8ea30bd6000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011b821f477d13efa580d07ffcb82f2d98f42165d091d1262adace0e63d652da5f021999124a2e5b9bcfd9e5c5dc46f90d3c4c5daf5fd120a3177ee7bef38ccf5aa030411aa57c95a89728116c45f1ccf9b3ffad07a95aedeea125291e23c1e71f4e0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a9f4d38563235aadce4ee470cc1c32d309b8f25ddb8b4925243762eb12c8594f6dfb9e51528a488e2d8dc0e04776007437b141ebd9f191df4536d197c99ea704c3cf87f263163c34d10559e0ba3cfdb0c6082eea051247fa01c4a83953cdaaf336d0753dfeeb749dceb412a46daec4619d3ffd3855d1f5a6077d54add7459cfea4f2a97341a9e0d43e71565e07f981e3fabc678eafedf701a8def9bcceeb129269c95eaa6f32f0bbb659f3f87deaf654c7b03e480d89a02398e17625be0b9044dcdbeaf4b542353af878705c46ab2c46efa07af0a321e120ce1741adaa0a044fe455723fe65d1dfcf30f08557778402feb097940a1ba0549fd2d6fc9138ced128090d552ac4882edec5decf2674d16f7a87e88c55932be533c0ba07114783baab6c72a016259a89a2939846e5ad16bed569e44f86cfead21fceb1d7d1f2416298ba13ae4d0ad7e159bb5e89f472b5dfe49e09a3fedd2608632fa9ae337137be5b6e70bfb3d4dd18311f616794c32a48ebb18f8b51f9ef15c576963e608162e00750a7f260cb04ac79935404574452d460f897efdbdef304b35e461d13c3f5d2babeca21d476495d01e18375dcc43b90d274263ad023c7a4b2c2945a82b4eab100000228000002240000022028b0f4c7018092ec01f5ed657afa9a6152f2755f7e875c3fbe77e0eef39ec7cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e5e881c8a61cf08a3ca5b13d704b1f0fea574a68d232ced88e45d5ff9c32e34c5e0e9203f28ae3ea567d7704b561cd5ba5f3d790344f690f09c773f53c7ba17804cb84c9167418041c478ba9cfd0ea5e6520c59c2cb436e1a71448ca0573382de9b23d7e8f5481563edec08b214a32ef90c72a367af75617c63d9c5155839c59971a4c9d5396c6eefeb5a2f8a1cceb63e14907f3cf8ab69abcf4fe0c1e83b1863d6ca00b7b752064f18f711c22308a338413d4962f72127342be95339b74aa7bbc814dd786fc1b66a8b1ed386331261f9e73b1d58d14691268f5c8f89300cb886dc666a070ae50cb2fe288fdb4b3d4895ae88b6c96f5c7440bba32dacca9ffe3ed7e31c2af89c369d85982e7a0bad5d6189ccac45c0eb10ae0857386788c458ddd58c07c87c6ed5d1cfeea5720ecfc58b27a11809ec2996c40e5b9a559b42b491f9a8a67d791a75adccefc8da15e3a60c146786cab3dd6a6580149755d742dac3c28da5373b4ecef91d7e7fef6613803af23715904d3b6e2f9c0f3f99c0c9c992eba94d929cd299c9929cc565443851308958fa38b98b19cf12fe9ead1e0261e913441498e4b074180432ab464f8c3d18b6e40cd81872ca0cfa5607d4d7b073000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400118fc56c8032f1949216197507c1827d0dbd191263e423dac8e1e6f1db29a31720219c64f7786da9891cde0f5ebee2dd824f6bb8b8774aab0e27f5a6b0044041c1026efbc2ec72f1af9bc761f613b7ba057f917eea9222286b0d7316294ca0ab09900000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085862cb15f16da894f10c8d6a103a9f36d83d15ea651b906e19cae6e1419a538a36d4997a9e9e87052d638652118dfed0d27901393874ed76169d384d1791ce7493a9868221ddae794fd9c96e879a197da18e779095f9fe1194fc84337b9eff9406ae02651609773ae4ab220907d9919c3ebc4bda55a40e5a77c7b4c4bbff318938d213c537fcc3ee589e0e9d669abe0542b0608fc05a537040e02a43a13a14461389c38e4ceed5ec70b67cf327408e1e3ef3cce6e019e8d31aa88366fb8b3ce91717aa09112a8f68cd4b5523dd8826449891c0b7430d89ad8dac346a70280782535e675815712987d1ee5cbbc39467ee108230ce977aa8b59e6b974443b6d8d586b75e5fa3b50b51b4b6f99c07b78621bca01d61f907c592b99eba16a5cb7d230c103417fb8bea14c1be01fca2a5e3ecc3ed5e7dd204743ea0ac6ad32bbbd9dfd38dba973fa3bce3dc65afcd9314086fc00852620fba48076d025dec3f6f819e38bf069fc419867cd5135c98c53614b43f11d1c14f8b4c4850eab9905ff57d278169829c3406b47bb505ed0d86890c03943e0225462728c31275c224166c90c5eab55e20d1d765cf0382a9bea9883abd80180eb43b00a65f295570e60417c070000022800000224000002201466c6a3616fb6b800df2e5318ef10882bada9c455e9b7f362116ae485c4fed100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070cc9ca5bc5f01c1c1993f451c797b1be7985206d7e287723f3b48afdd43d89de14971aa2e1b4fd58b10aa5e2ef1724e28fc0970fa63f5323258cde50d4f4f3376d121deac56228897c0b213565d4cb104dfddb77e4b50b0d484f43b8b995dbd2fd0eb0813ce6204e6b6c3cb0d6aee45dc68b1aae7188baf5e0978e9a803dd5844e93fd297ef47b140a106a788cabea2ea389a203b0f5b828041690e2f4e6113d1031a127af6643572ba267211833b7978e7faa5ede82b8ae0c0b5f2056a124f728245ad7f9aac1a0528ec193e3ea13c28a8aed604ba563d90526162267c11bf50c8526f2d5a8eebd94091905477ced1d48a88098c940191e093a2a939442464118278a81fa7660958d2014c97de90933aaede81f136f584bff19116e2a178813ca0a5b88b676e92b982306bbdcdc80514f1ed2f4744107d80bdb52437702733be231fa3cb9956d8699fecf8f7322c5116e4fc0eaa99ca1b92383d32177ac0ce9542769b46dda260d4badca2602b6cbefb73fc487cd6e1a8ef2bc716885bd50a48afc504da18c2b9c709c06f18368d6a46d380dc4372ac61011e2d95f0c028ec0e44285195514fcd3e7ff745f7b4c55a231f127e38c1b3e7e139dbc057fd502000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00203a7294523052b7b14d7d812be4824440b6bd736ac88256b0fbf69bdfc5a47ff1e69e2ab5829cde2edd099d1df5cd78c0c8e11210be85b6d82ae00faeae520dc021c00dd188f4d1dd81c07ecd33b814eed1d76bb3279ef3b1f66d8852d700b08ec286e05d6c3eca85098959569224c6cb65696b7d1d81f9742544e26e4976b089b00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a7b2f606e5cf214e93c31cddca40498461c4f77f2308d3267475c4585e9268c88028b8775585f81b3d71d4f0be6f803e27456c42902e8dadce6a18aad7f7cc3ea04609410d73eb83bf7a7c913e8ff60115780a95780b8b7c745bf7d7db8b413fdc5c47147791c8c346c4b504e874ae0c786ea4832d9ce319e14f23e4e4a5d8909b669c961a7af2c05d2007ee49df361a1c44a5c8848c03211f5c02e3333e229f02a26761ebafb555075e62c03a3af2dcd42e4b43e798723a7ccbbf3ed4540f87fef8048d247c36df9ffff2819c395f6646f806549bad11bf3568b7abcb9ab04a6abc49da540681b04708ba3cc2ea54f8087b52f5a3eddae755330be86e27526854632bd83b5d0e735f314f837a08d06b142345087cd761f354c4866d07dfc34102db80f3e812e16c410b014fcfdaea4f5097e635eedc5affbaf55139cca9e992eb86fe34a5bb0ed9ede323bbdaba94a9fa3f72ccd87c7419e4b23a7f485fab316b44450c8f46ff7da78c114847e4e8c04c5d6993339df6268f876891315d479a4a1fa9432ea9e83f1cbd1fc579a9f4edf08c96e2c406c7dc9c3435fa3357b2dac8f3b378bda7caa70872e4812710cbd9dec4129920b5180ca03a4ceffe91a290000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000accbcbc19b2129d49cbed1f894911a2402b0f4ce23838d3ad990d64dae7b9804c9588271696f90895b4798a095e803a68a7a5787e0d273ba4aa12f09758ad13c0335e39c70b2bd40cd2156f05a29998dc48ba96ac8de8d410dc25fc453b2256c6a5fb32ef5067d129a17a49fd4e45cfba4b8e3f101f0c2c96bb94da0e9d97fb4ab58e1d786aa064470857f0a5b7d489cf5084d38bc081112f390ca25461afca8698ad1ba417d6ecadd2c26cbaca99c6fa630269a50f5075d09f5c88fb69176f1193c5b29cba9facb3e18a6db6a97d37a86124bb0a2701d7e787992809661e1d35b3dc3b7914a8be2d3a7d82e51bfc262d13054ba6355618c823aa76f324337338c068c70add21b9500273e193443d176546e8effd8b2c7e0b5b1ecdbba74fb37d68ca85d52ac2aca550812e07eaa778b841cabfde2b709db57a908bd3fdbd86e562ea99dc4665396bd4a90d8d0cad4d10d457c98d4f9ac99d85978649b21e18c4bd1932da176c35b167064cd17613fc4d560a10aff9d3a329cb57b7b120391258475c9e4e310ae8d757f81c536031f33eb8e422c42d94af06bee9eada00e26fefa4f1fd1ff3ba055933a9ad365ee476b2ac65b3b0aaf4e53a1529b75bc75077f0000022800000224000002202716f2748b7c28a8c125581493b416a1117829f7fb2bcddcdaa52803ff8bd3be000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b91249a2d4a351e2510908e711560453f01e195433f7b04cedf26f9153f031b998e5e4d43596a74955299f561021d674afc4db0d82c81a69bcce4bd8b468fb6095d83cc304295a6d1a564096cf609305d5af4fd833114f47e5728bb0f7e1d8a4750d5c6d2778fd1ec78b4f065f67c3b7089d5fdfa16181f071e4a73e343468a9bb740982eaf3b1eb12447cfe28dfdd4caf011f7bd133e186b6b0ce85314c494628102bf761b5a91f25e72fd91880fb16df3f965bc615b520098757360ac36b2ac58fef5ef4b009b28830e7db3f97eeacf42165ec8880635c5a1081c4655bded147af8455d0280dc00ceed99313947bbe2aa6b88003edc65b7ea297bc01eda0ccd546234e9888df4eb61e90090570512a8d93ce1f54432ab6318395dbb0487477249b1912dd8e8c3ce752e634ebb7176feb5d8392218e44cbed142affaeeac5865d1ba7db6b624d40b65459e9f3fd9f44befde5b0da5bdad714877fa47de0f62f252522424721fb9cdcf1b03741ad427412a546c1199b11c3b1236238b4f44a5633d837abe7515349b2926e1558ca42f7185061a4cc8b528f99ef98c0882610aa2454d590abd035e517ab4a94993085df4b7e3632fce0856c2c589da8244a86a000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400106f93770a6d7961c29527e52a2bd56ba0335238b723f400b5ba7b4fcf068665c022041f68b894561b9e3a6da569a3adc3b669836c039a031f41ce1edc609ae0ec62a12aefd440299020e3f4a8dc0a2c6caeac1671fd861bfeae1b76df90757ebb100000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012922eef4859d44c4286b70a2735aad2ac7f688902ea16823541d125c6b57b4001b7ebcdcbdb7ff2e87a68a80f457d155bc41d76b39b9cf4e81901f4eaa32ac58a699ee2dff0eccddc7b2c71909461624b0b154361bed911cc00a665c357bfde30a533d3489cfea24290e26370c5c5c4e46e5fba3c61fbc423a1fc3ab4a08fe04e46e31e377a59783dfc44dadcfd38b5c14837d26d83c63a07ebcdc2dab4d29e32d5525da02717d0202273345dd6926d35545fcfc39627c11641cd4065afb1b59ddddec3c8b796598387ba55cf3430fb84d05126a329e55bde6bb860c0238047955afda68d5191bc615ed749f20a2ceb898e270905cf4145e71ed3d85d5ca0ac7cf5117cc4922672ccfc887cc1b97aa3901b1d0771d0565826470360f19d48a6c2a1db18cffc2e53c4c82447fe2de7146d712409ce3626bbb2260bdd21d8a5b6a4e34247e2a74afc95e7f12391c60cadd9e022f9efbad9c15171d77ed5b97207f877bad768330612505ccb947ad2dd37e33e4899038d7e2cecb1eab7de093a23b90a6cb49e6c45f8144eadae823d4c5f6af4b667add0a1a8da9691432626277eeb1bac7e7f0bb2e9a3439cb6ca06bff3f9471f26092541f7e9c1e76c964f27be0000022800000224000002201ba48154be49827949da633648376b679bba548af2445fdee4bf6047fd9762f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801c05131bf65a2d831c3e597462b1f72bc66f5d134503407b8671bda183449c1f5f77ec51021a10abb3a971989a61434c625a81e34b87c0275ec094ca27595a4311ff3ee9db1542a2cdf0362fa2ace3afb1f79bcd8bc0fb1adfdca4c38d191f1b82efa7f32ef4fec64ab9f8417addaa08c5463e826c0e9bad852c30be04179ff33efed5af149d7644a9d2b34f7acf0445dc9b237e1c6cc3d542ecc18ad5a10b5e61a6fc068880299fd25fb40d4b4a72884adf80a938ab7a5107e439e68b022d73d24b7815da5dda64eef6b68e749a197251d4e05d9db90f84938650616efca2de1ee0581e5269cdcc679bd60f958e7cdd2f6e4b049313aa953e128c7a7a6444910789f43bfee322ac6b2a3350241f9c0576b929c4371b6f3420ab588b7fe2508585bbfd79e5ab2383ecb4e6e402c29b77e23afc2db67b4b3c035ef403d45889b0f11765e654b907f5154631bece7f6d899eee8dc41294f2519de2e87bff99ebd66d7dfbed7641a9e40af6d71948e56a998d838415f49265b3fc6b69c89d05703e9960e3d8a1a9cc002e4e17391201d2b59c1245c936cd865c5c54b899936c1275978514f9843e80ca8f100c9c751d0c04eae31d276b04b929a62341956ba743000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400128af19ad3cdf08adfb355467148bf52f222bf980f7867a85e1857bf2f56201010220e1e502a4731b1dfc1eeab39829c57c66f585cd53588edd439b8b18409a5b3d19c502a705563a39b4429b68bab9dcb51f6f70e806afa9f018f9fba847b1d66500000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028f08b438050c832f5bbfe70c73d2e76f2d431d198e63c19f96fb35b8c171e2237565a1c76fff6d573c9f1dc601206678fc53f9ddc762cb8c010082ea35edd6bb527846886bac81400449daacf0a1a7477bf2b70941a6013c6298aefe897f8fd3c12f713033e18907f5a2f6a4ee69be7dcd885c501fe41485d5a90c8f35af3b7cc5d2ae7f589731d443e3f3e8cf3d773dfbb879b9b13506a8331757688449d1916239ae2af7f6af7674a9dadc04083075f6bd342d3f27e9a89e05e42832b5d2f14a1f5c858e38e30b533c57dbbd1791f717b4ea1adde4a85bb7287ad8da6e1b595eb807cab0f8f3839d26e9cec87b34848a8622fad6b49810b8bc12ccf861f4ab6031a688fa925bbbedfad2933f4e57985cc1ad8c89a0ec4b7e8933ea268bbc912f1134281234a98efd09d93e190ecc8f88ae9525e31d75ec0d206a9024ecd01444463dc5a2a28ab1972328cc901aed1a18b39b5a77dd7579c3eb18e9d83dc423091767cd605dabad8a1f3d766c4590896e229742b907b88b433c14531c9edb82ec963762b2ccc8814376ed1ba4746640617219b1e29a61c1cab8ea22f2772089a18876700a73eb85549acfeaae22833e3adfae477b8db9e03fa6ece1234a60e0000022800000224000002200c170887686cc54c11b993dec024017c40a2e0900d72d43542da1c0f1e5032c3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001806c37b34a6156900e3058a802b2a179ebcf35e0873042c874b645e7b267f697ddaf8feb8c90b2e993f7d3db06446573998937876c152a651fb6e4e3f61542037ca2a02bdd36597727219943ffad8c4ddf5853f1860985fb351225e52fc4fa95c68d2a56ed0f695afebf33da2646a36de6ae9fb118925fde6a8f0b590b5422aa4fee752a06689af8fd7ed36b628b6af0b3a08196a23918c9f4773afdc3276a3dbd72ca73cd6a0cc8a96e118af885dbe6323e9459fd55eae2f79ead3590888eea8cc573d5b4af2d41fcf8e694708551426526d903e4ff0d85baa9bc331ba644802b260f6ce04a8900ac73b418fcfe90f42c5f748a07937fc2a866d19550f826674749a6d1e473645ca01c71984e90782ba23f5bf953549bf06029e6ee117c4075083309a93765e8008a36bdbc7b088aaa548aea6834aa2e0bda2dc99d04d3d6c35651594bbb85fa19419f19b0425c0a4447eefe4245deeaf70928f729a46799b95de97ddbe3d562a914f39874abdb914853fa8a3d0c43ce57193c69ce44e9de06f884e703b4dd8121ac1b87b6dd9f5951fd2cc00373a90685a2fac680d7f27e56d9c69cd93e3d1acc737e1b887fde3cb7a0d4786d8dd114c284d1a8ff95f16ad000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400101d3ea09f43dd6886a20d3bb5df07fb23e8b46294b7cba3a633412d44e4bcb5602222a46f92a219c7f8e7a9b53a5ba23a8977bb6fa68afa7c21949ceb24c39162f09db899e8056586008e56545911938d2e11abc0eb0c8d12bc3a86894fb6c42e1000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000196077f04af3ce24b860bd21593d8ec668a259dc64cc8911fcec4a803fb228a98a710457e9ae06424d3cb1b967528a0a5df73d2d7c82b404cd84ef5824f2a9aa0c334dd943f7631e132f835662a616a8689aa412995abadb3fe1a0b8755c94747f18c5b2d6afa1cea8c6cb08baa9d71a36a5b862d5746a75e7f9bc7a9c3c3b5a681221c4b6bebf8785d7f4bbfe9a65358a688716ff666f099da57f0bd0c2924fdfea0e8ca3d180642972963daea50d373e42134e70379474dd379bfb06d7bd12c78e4bbff4de12c81fe345f37c769785909a4b2a528cad8b0338b66bf311d08aab9ac2cc105e9f2cf3852fcfe88e70c3971d482be9acf29969207fd9f05f601fdba086572a79a2d4786c3fe86db131f28f19009a73ec49d2ff34081fe4ddc6903fba4f503c01d7d2c0f0afd9b785bc81917dc27479381d1389064598cf3ac71eda9c4b777b199aead68a43bb346668ddfdd6448c30ba186304c3094c7085c51616748f582a3147cfbb468cc393aabd2c5d8cecb5ae2c5e4b69460926fc2969918c586a3726ab5553859834969323aa21871637516dc4d06b8c44acc4f3fc797e4469acef2061f7862312246bf811dd5b49850c6ec7bcd1a135f0b9c5ee3f707f00000228000002240000022026fc8f39598f105c1b03ebee0e0fb40dcdc7b7dba3e0aa69d985f70c653977d700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057bc4133a796ebde6b7ac6306a8626367af490057e95be4b94ff66d90067a90c5ea7b8a4db63507a99f278baac82f6461f99fb3136787053a3d25a0da85f3b3f77f8bb825c09006184e243bbac8c4e70e3d91fe746af8ace3db2abc628965443503d822c1984f39d33aef16657656aa41df63f7f6d7d4ae7fc04dc62e8942a9e8334209968cde691f9f5f0984e062f623e969b64fbdcb6fea7f48536f45e2b50dead0ac8332a7cf051fae23a5a9c446cc601a34324b93f3b01b3f064a026551d759f45f759836c015efb0c554d270ba4a5be88c8df2c7eac8d22fc5b234d4dca907d4757e3b9edc88a056220ebb7c59a587d71b748e291552874be23f4758f099f803e9a7dc7baee22b0c4187fb069a0f3582e787807d1f115342cead6969ec5df32f4464ceb0804e9b4d3b0806328a3d008e794b8a78b4601b25c7e43b917508df528a01c6d9f81ce5494382b3e4122ee62ee05a7d079c5bec7942a59f717aa49f1acfeddec6c5add374d45bcd604d3aac241369003630e645a00ab9ddf89cab3b343ea3fb841179146b594d0409de77efcebc3a61e76b9a912b9a3e8aaa44edcd5cda12ce4fd89e1a26aabec277f0017456f730b69afc6839fbad4b533ac5000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012e637854851df7cf3970dfd1aaae26d2435877864ba71ee454af3cd1cf2b829002231c3ff76d8bb73892613fb9dc00cb29cf0eb0561e560ecc6180c82c07580a430bc0ab2c0efb3b357a73383ae9d05f773fa5f9bd30d2726b51e2785b3f0ca7680000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009afebf2762478f112c526a31c9fc930b6cfeabdd3bc4b4d42f856d7b6b78791d59f00000ba41703b9976d015597c41fade0a6a0cda3b6500e3d741633a2a921a45c3fd8f5d6b69d7f7662945e195b451bcef904cd940745d03e299ccbeeb510a5ef685db0a4ebaea40123bcf54342618ca9ebb073681b18a3c4e10b699d5582249a90b02b3cfb4ab5d6cc38777519f8201b5295d2994b00c87490af802e3636b959debc418586e61262107cc0c8291c1de3507b1159080a7813798acfe698570daf4eb843d581d27d675729ac48a8704b528a92cb9a736dc3882d89a4310178cd4b23d45f26467e1cba96f0232be16c753ad5450a9b50f6a34ab142c0a6d020e58c76cf69eae12c389f2cacb24b48f8658f5e7b321d3766cb0708a5d912fa96d0eb6a7ecc04dfba8d23050bfcb5cbc3367576879b961312b76168d91208f4a8ced7958e9a99a85bb2c951dc337407e2a6ee9dda8fd703df03189eeed0776f8476bc44a1b70e6a5fc8dfade1494b1ea4e61b738829af835d55c395f7ef1fa4b919c66cd1d3786664c869b3e9f90be96234e0f999281e3e59c49b22f50c2beb949dd4754038c0d9040b70d1a47751313ab2f3ca62af1f658571f4efb525f7ad25e000002280000022400000220202c01b7e001c2fe7374e93739e94352dfc3f4fdeadcd8816d217e890d6c49ad000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cf7c2de566ad572d45b7cd9216810683f5b8914052d288cc0fc2bb5d0db6525436ca0aef6ff40e5e268dd915370e249622d48e4ac82bf7d11b463cf2fb2613f0b38dc2ac4def004142fb3c5c9655d932bacb0d3fb304c15b254713fd0e8eecbfb98dca935f6da882a95f9514689e70a870a91a7cde4e5bc3d30ce244d2c4964281cbbae15e1d0677c84454b93917ef16492eb2f16c742704bbc22699e312111fff8739729fdb568d9673df58a3ea369ef0c1f1bd99eca0d6508f8f042f54d1362bb779788572d1192e1a1b3dc24c1e8d0846f4851c2df5ebe071e8ef42a6b16d7ef950c3954d112cd8edeb3fabfcf5c3809e1425468d92e009530dc94cd2adf6b6067163fde7d12c3de6e7ad6ed425bb46fd27ed7384c0b4335816fd4b4e072d18b4dab3f5c6da7c0bc3141879bb974ccecc4b6c7417f4196361302d4e34b5dfd8c20bc616fc24a166bb4f07d35e501e47cc37a05ee700aecff0f290d6759e0311fff8e645e7ebaa0e8f6098922d285c253884e2a5986fe5fd7040c80e40c4d95444d40dee9a2eba9569e6afcb7455f731c9d3daff7b0af144642483d11d364ab7c9302c79e1f46efa2a2d2c6d7c6b751434fa79149f5a9bf52f24e604e9e01000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012677ece35880135bd124c89f55dc3bf9d5bf4f3ac86e1a2c06b3e08139aa6dbd0223b04b0be79715e2035d2afa915d3227c34fede3544b7d11ce6638e4d3cf473d1a65113b33572ff3d6d21494b4408ca4c9d7f9da108b17bd70e8cc1998d9c0e50000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002db49e69bf9c15775551cf745d328d24ab352c04cf3b966eca037db59d14d9ec2cd2937c3903496602770479721453dfa26c8faca07ac76990104ee47a308f5b8ac626ee964ec74da31090263103ed98c218e5c651c52bb464433da650b96e7ea672b2e1813fcb74edcc42ee860b5ce5ec61842d0b9ca59d9497c9109a374c1f615cf6cd67b4b41782edfe77145d884367e51703a0a016da84e1cb590cde50afd48749bad6e1ce12e33b79f5fb58c8b975a029197048655e6ec8f058c282bb645d3763e59205e78dab8ab31d0b5966ecf5d926c4b43653ecfbb180b6e5491361b0512eb930a791f7625bf5d98f474f3b924776d2651280480f48afdfce85b26fe0a019e519f43197b75f4c68786597c11cb195dc0e34361e99abee86258864ff21a33b70c1e7a8e117d7bdd26cb15bb5c75e49572bfbe1ecd55a5a8d3727570b01d1b1a6f8a2f83d8052d76fd319b62785238e02679821c9b1c94f5b80ae757af8c0aa75fa4d536f026611ea53f1da28fd010d798be243f7169b1b513c2dfc6eadf45751260399e5c14e1c80ad30ea56e99f3daad005ff27400172bfc08d2f596e2d507a08f080735ed89a21d6f957a6aa526c0b724c1a9a8e3f6d1417bfd3a8000002280000022400000220043c350b4e4c6c506765a3bcc253d1e93c8f10bec76df9f28129dadc61a19b7a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005648e362ba89aed3e36803a9ea5fccfa8f1286021a2e621585055730b7eb466233c9d637c31b3e96d5b04a66b2fc75e90ceafcc617b28a8bfe98f82d3447f92ba554908afec93242c277989dfc1532bb330e9351e0b43dfe71481c812b03616972883f53d36dcc001deb15c6cd8ebb012b8380033ad75a5b1d69e72363cd1f33fc1de0552a372c052ee6f0a647dc32ee81a28685bdb13174f89920aaafa440d853b93665e0bfc47612aca21b2598840c2e5a55030ebdb86b15a8f96c3498de24481b74ed33607674ba9f30bb92088bf55e6de0677482d935ad70c15e0f74c205f90713549517348e9114e9c5745d2bd09a59d0ccd5b2e4ce9e4257cfbfc59fccd690832eeee5812d6d8d0bef25d453da4b8b86aae423177d76da307160b41b18482af518b727e789dae658f4987d3b6787c89d1f4fb14f0e9c85638b6b136aeca16a0c2df199819dc12bfa1f37ded94a14a2e9a17a9bd3ab21c5106474ad58507b2c6549ad9a0bf19ceebb61319f7286fa53a2fefbdefd7de718f9a9bef4c8a38b1be955f79ec9eed7dad6fc1dffb81dc07c20cd94a154aac019047f9637346ca506195a8a5e31aeb52d9347d2aa5dfd3fef13fcb48860fa44507bf48b1441c000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400109b7cbbe52bc97f67c35ff0b17c64e351a05d02e2d28739d7e91931418e3cc0c02254c9fa97122df06992937b141cf0424566c83603bc4582307a3f1b20901cde30c61ce6e99d61c9caf25c2b23c6c6620e5bc6fd3a4cd467a9d465ef003a8661800000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015e3a6502655cf1d45e1dfe6f74e59bc0163e92ebc4a213ff9b0d5143d85cc52517152b8928201e1dabdae3a9a5207af0c5e5a3a4f27bf0fa3e36adbe47acd9aea5d9e78aba4d84b22553c5045525bbeb954af07da70a892714269e97faf1b5a83f71992b39d8b6c6f9c2ac54c615f12ac8b6088bf3c20f4fa9a91c72fe4b0bae995be7c6f13ed09ea57ac1521518045228385b6c27ebfe85228d44ddae5f6520aa7a49c50b7db46f48b5da22d96ca37cbdb57c0048a1a2dcfb3be79ab072ca8a88ab5b142fb7f491351eabc2bdc95d25ce116d93fa109d1ed6137c786f8de3ff313138b167efeeeabdce21ba352bcefb18ce6a7e4cc97ef38b87aff511afcdc155653e0f26278ed6c50511fed30304362b47c17a6b624e641afa6dde19fe13aa2529a171216489e88f7ebff8b7a8d002aba54637bf79c921db8ad7b0306d7e86430990279824aaf5f9330aa3d40ad5fe78f4374df815536a5897a7dacaaf5ecc23aaaa0881db22cbd3002c41c0747aa9bf6e654d90b4e35b62e6c12c108432b414c4a199b17674b9096d8e558f5b35ce6dd79cd6c84c14c05a141dea3458ac2004ebc87de2bf8ed3350a2a301ef3fb3e24e05e6c42112056e023f6522e6f04d000002280000022400000220021a865c53a54194569d56763a3c8cb0e1167109936742f91ef737b32e03d69d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c70219194703f4390417321c0aae17bb5ba47241d99a3b52884829bd631107e81311d8be7000c6b6cad14cad8537aaac9ac6bf1e5d9eff1cc06e57ad6acd5a489e0dfce9e529a85c1d6df0ed5004dbe8e920d7dd6554f9315201fd8fa29fe4ae54df4a7db9f3d0fdbb5b855d685c2dee78db3f9c14627c874cdaabe54948b71bd6fe02f34c6efbdb76617a02fdb3fbe927b1574ec17b9b6ab9e38cb7ef124e9a3b1a642f95272ff5419ff797de76cdc76780aafa043973e8b3a6b88359e64eb0d195571ec1d8d1b96fd815b5b893fe8e40fec9955c44bfd9d56fb75341cf7f7fc0d79bc704c4cab1007f0f0813eb463ef8c8c923468441e19bd9a7109e37ecce059bef3e61b0f357a1f4f568b35fa78a66160d4c65dfacf3bade75e5f7449a3df6505fc64637520f941794453f9bc0cf00437559cf500dfa3ccecc0c3612f96349006f8992d3da49f593511ddd05abea4644b4b156fd66b0a555c5bad4a9c3c0a0afc7179214bda5746ce8e8988ac9b01579e50637a3923fc58984c9f99e1a477894f8b866b5753988599e071051c91dfc1b9ba8098bdd0276e5e83ab86c0c017a6bef678b698b1a23c6865db42bbbba488c34d3f05d5b244f2bd3591b9fe4000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011d992a97586c95546105fcc4014069416aab9a4b6af70fc9de6cb4096d28aedb022570a73277f9f5ef641ad4c340278cef78c974705b4a79fc192bbc4712389a940301ec419d645d5eac6eca0e9a834d6e25ddfb319467b70d8af99cf8a470e7a100000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000694bd1695d11377cb43fda2a9ba8e115a85647913ad91116ee7b57ad067cd8ae826b7c0ea2b4667cce1689d75407416fd54077526c9d29e109f8685743d1a5d70c441fbab084e921d1e58e2962e0fb57576b240e6c2acd313c618664f655785e1933f548ac6e9be9531069de51e3286f92e8e79fcd4089ba9322be4252fef91b37eb4c81cc623402fb69f66c4ec6ecadd05b533292e47e13c4c6488eb42050369274ff1091e2e33ce8b1f2983744e1355cc746e65f9a1382b0784a231a7322ef06081bbb3ea71842f6f697815f452fc47d330a5ca8a8d485afb7dab6c1de6d199e73c30bac6c93de4f2432c7661d7b9b3d2f541db2ceec116a3b73503444841fb34f2ffaf0e254d09880facf98cc154270e62fed518069a57408804090d4545b50ddbb4b4df7b59a92a2ea0a3e0ad0aca4a5b42f5e00b9f20e5c531f6183fc9f63af676653cd81e9dfba07993c6ac83bd644c6abf63874f671570d1eebb0b1156d0605f2b0d153cdca8703734b090f97d6bb9b9562e52c8ae3eea549ba01cdf14f252086d3609f46e47cd34cbb9cc7a66fb581d176c0d0826704311998846d93a9b011bdc81f232e85714fbe6ca7c797a7815e772d103a81dcbc1f4ed0db970000022800000224000002202287e11e11df81e77c98e2d9559e805c94c6427106a9abcd423399c1199aa33200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000affef0e0cc8fa9ee020e193b399bcea46d46bb15843a0e68034777dd24df8823b5692a4e43fc649d2c4033a1257cfbbbbee67afc93d92717cbeb15ff17647b050347c42830b379b19042c554771801d5cd5a7b71ac418bf3b93d603bf98bd4e49d721dce7467b62ef1a4e7a6c8936107f77bfcd1e032e9864e284502339488989926fd00ebadb7cfc0f095994209c711ed3813ea2da9ad214c216581399e0de6f1ae9c015ddae3e1cfb6cd059c0dd65903a6a4f2b4eb1da607b3607aa5ec71bcabf1e6e5e3706d7efbee76bf1dd9aac09587fa3e926bf57131fa8acad06f79391321d49a3bd414ceeb9e63131980d7fb764bd6cc057c8f470d434ffee268121ce3ba1df2847ed05560c81333b277a930d8d0b0405da45d6e458f4011c99e4dc49359a48a523c6d0782de31681067ce39842215cc6d6d1ce5c6af3c9a2c130298d2b8ed9134e46adcfc58791d1979618b28667d11061dff4055460ae9a9a1c27363cb1c12188e6ffcfabb0691e7f8af1170b6140e46fea854d6cde7274ebbf0dcdbad4611420b6133dd3eb2274b479a3192f94a596bce236bd4af30de5ff29527d0b6bf81ed79630bdc063c8b41fb71eb81d8511649bb61988e96ae8a845c18a8000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400119613d7e78579075f92b5a52a0e87c902926d3b4122b459e7dea3c8b39a94e93022593fbd30add5a57d9445963c4ebeb1c3f31e0433071015d43f8a583626701511e9f30d0bfd2fb96aa74f4fb083758d9aa1f2e9c2fc3edd24ca0f5da63e6ae86000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000198b1d4ecc22c3038b1d766686bea1684064ee81705e9cd051b0550fae9640b81a72030331e81e33a1991dd9a6ce689d7ddababb9e68605f47e160ada65ccf25f17c504bc68676bf97ad182c5dfa022a88d2e5c9b3ebe7c63ca7d6691fc4f43f350ce1c3d921630e66ef8acb8eefa9d474159f3994c28fdb26518fd7739df094988a17b1f5837fc7c9a1d0ce1c788fc74259c83d962900e5faf0e3c4a1c612fe888f29985c9bf6d90ee5e206ccbbc60f68093b5f3d8db8d4ce5a42b6ca63037c360d115682378f64b43cae8fb4c9cc539a32b4776291ade319b0ac5a150fb013ed4d3ede4bddf787ab15cbea3ceccb7a513a2948496dbafa0f84665ba55c1850a31c3f6ddb1235735b0d5feca8215864fb0c95d29d1b7800b8505b25ec32c13342903d2d65fc6dbdafc2597530e7c4332f58cefe8f5d65ec15af23d7007fe39b92651c49c3cd0c9a0a51be6c64ab5b5b9d708c9c2bcc7bf653c1e93054c27d297cc4230975b0f8bb0d3acddc49562fe6529601010a8cb1b8bfdf51ad356c58edb61903a8c63677647101ca434a80f1bd569acbbc489c18c1d0f5fa278de2586d7004caab6c04e1cef34935646c521217790bf9fd206cb34eda4bf762532b7cad00000228000002240000022003d00b1cdb8a898e347f2eb071bf9fff2fdbc8343f29022150f70e5ebecb63ad000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000133090f0baa4894a6bc495d9261526fd2cb4231e206a9611c65ec51b43eea748af51c2029f3c128bac66abec80bfe1d357994ddc8a0859bde283380d9b383eec77e77bab3460d82f39ba635e0d34523d164a339913612aac0d366c725f775179203b21d10d7611de5258d72ee481d7c958879f608f94df04652eaea8d8aab16a8a51b79593c560e6e2f0b7aedefa39704be64bec29a73bdaa96472f5d6ea44c102a9e951f6db8e288c694be1d405d7981623f0a1b2e7ffb3048fecc69f3f1ac12f4441cac326136c549d7caff5106b7f4147c9c31778369fa2607a639c74902c9eadac5f41e24442a63d732857b79fd98512886b73c275c9332520f27ff9518675eb2d152949cfe237db694005efa1ee4521bd605c73084815045a1dbcabbdbda2a2cccfbc497b39bdc366e7b6d668dc424bd7d2b6335fcde41a505dae5cb1bc5ae0282e740af09ede6648ab9179d88581a911dac3e7f3523b8830b1a1573caa47c821f37d33ecdbee5be5c78a7e62c850c90e051a723510b30f8e8b899a650d0671f9855117e85c3ecba6eed13b13708795680e1b955e5c381e3bcba259486840237a6cee95941b68ce26d0ad4c244c7de97d8c8b786f09fca88cf7bc8da68000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400101f3e9ede92f964c0d82f2b3053d4a27786d5d434184c9e5bed0437d4eedbf440225ba256d74bf5d3d2185311bd0428a95365cf4d94a2e069611d77611a85c345225c3b3e85b8657ebf8e99434b4865876955152440c8672be399a4b9ece908306000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a863d34f708d6b0bbadd3a8944f06b5adbbe5151fcfbaa2fdedb90352b899934e317cdffd371f716f35c6b86eebffbb499a27d380c4c00a691860b9f2f682ac69f4e01d2e8808031637e3bbc3a8b4f29164e8b52879b4ffc9cfedeadf64a4a5c560e36925a0b88a92ce73b67c18718cf717901c944c77b47ea0c1a645e08c0c0c93b5dfac91751271c679dbedff2a2e9f68b1c24c1cd344689de773dd81625fbd22a0e317fcaa1d59cadc61960df5239e0a60616a6a0fc96ae10b9672c61e0d50b8c6d8e1560cc1b3bb97fe502a27842ef938d8010d3df951de47fc32e615f35d9ecca39bb22ec5635180c0255a024a38ea2159f7dbb3d24f9114328dd750ca83b4556453886fa26f0e60f661e44636cfb33caf8ffc92e70a23fc558d0b6ec4d4cc5be900b96d6c8a70f9bfc2396a630db3ddce179e33dc8bf2c98207d52c364c4322a46b2b2c60638c69ad44fd89600be82a6cca25a78cd6841f4f249bfe0c2d1a481a4f75db32bb380d03bc0197451b3f484d3b85cbab9191d9ccfe570dc3e43cc38edb9ee215efa98739d9f129dfa96cc8b51bb344bd9231e33b2f9363a6fc0c51841efec05a8b322e75052ed12b01839028fdbfb111cc8a1b00c62d34a820000022800000224000002202543b7da78b7a99f4948bc7252672640fb9fa80dbba1fbbe70f37affb331bb96000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b4d72b254dce997e46b059e9e575b326edcda8d17d8dedb9b5a5504b895c4db268c3eecc79f12b02d8b7e5e246ddac76c65ca82fb9cc40329da1cc7bff9347761168618d2c336b19aeb69ce7cbc87b42d540677074cd7ac3f9905cf969840c5f67ab4c524d1c573705a7728c403f98361407b61bd3f7ab21eab21804b5565f9835bf0607a6c9a2161438487368f8c6181123d3a456d56cc063773045f8f71a3cb766b94ffd2d75af47e554273b2a9b8f0b6ad41f7762c9700d6010d1777a0da02e5eb074112929fb969ab2312e20b0828ee4def83d12117e4d915716c39bab8bd5894ad54e5403c932591f4926352003d2dcc2ebb621ec77e1ad5d1cf2be6951648049685cc68334442990cfefe2800b5804efe7815033694a96c78fadbb9aef10cd02c0f7ea0adf38075cdede42f23503d44a4a7c0dec53e1bb5741b0aef5024c862893dc614e9ece388afec2295e3f5bf27e689c63fd274820b5affb5d57d31e22ffcb5ddd353c9a54bd6d12761afea4be8c52b9cc6bf46745c68097f800086fd8694ad4b6787b7c7e4e49fd16451195d642775022d2f7b8b6267f0f5845c3200047a9dea0aa85673e0c242e13b147dfa646df823b582feb7102826d51fab000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001216705539784fd36ee60b7c79e8168d6ef2a9c7ed98892e9ddd46b9fa46fa36c0227b802178fb754c997cc0c2521c37506ca47a7792ec71d1223f4457287aec7d52b5a3a8d5966330aacc6a959311c48c6450b2309a2648a73509e66a3f4479b1f000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094ef266b741836adccb829d99c5e5abb617aeecdfda50a5a4b075a3baed3a06362f82316b15fe60f88df5aab0cc564862bf342a153b5aad5d68bbe1d9c423c7516769872270c5b0615c1083b618c34d844779bbdc79b9e01d9d5f12f0b26ce18340461f7326a099d9a8844c007d79118b9e2db9b3a9e34e657f40e3fa0e920919008ff5047cc169416f55beb6bd2f35c918ab0fba2340bdf3ecdad37d92fd4e8f13a41a1fac6869d9fd58a82c426d2440417db6be0c439be81727513d6378bec819579433f658a7b13b462bd5ff64e1fcc4bd2389e64a2064294b32dac8fc4d90d6f39f6998575294a63a890f6d75d14d16af3e20beb1907913927f61d18233844a08a6fed5be2dba741fbf9737294f82467da2f9092654ccab852966a66abd50185caf8c9b5522e3d48726067a156c8c673d789aafe8d953f61acfc699daca08a79774b3c2614469dbf905c7f6d4e22716f42a559371e68d21c8f818c4553a3e7fbde8fef9740731e632bef2670c4a358dc72ae0149884c1ff96d94dd1c1aba245d2da279f4afd4cc1e1e9799b4eefb77d78e046e13d11cb004d1551c3fed452878de2cacd95573e5ea85a453ebfc0bca5885c0fc16995c9b99262ae6eb8d20000022800000224000002200d9e725691e1a02c799728c558e83ef250739d7a65eab896e5fd3cbfb8da99340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093b36e386000567722bac16cbbf998fff2ab53be3f08ead60bb4ef86e9d3ae94fe159d1898dc5f6a7c17346fe6f7d2896858b8c679f36e33c4660dbf8089c6770092e1116073cf964d62c45cb140d14aad3326fc11dd3ff5701f02b6a77026b13ba189d29de52fe91d92ae0fb268aacf42bfc45fcd5956086edbf85df4c0da82fb4afad2b6d8efe3eaf2fd5ca4ec3dfe801ec8c30700d8b5bd8ee71a99a601203be91e69552f3c677268defe693cd30b33d8a1bacd856f0cf10aecd5c6454717a3178cda42ad606a71ba153d4371b2261120fb729014a8bdb123cec40a0dda6c2ff182b62a620ca5207c58246c14a62386cd2467efb3ad8f13e7dd98d93c6315405c1b0015613c97636f3a1bd5d5d2c7f36d314e2df157c53d94f2b1696ce2230bd657d7662eb981ae794ec66be939cf75e0ca231b5beafd1336969dc64ee9da55fde0508aeb5bc18dd3b7e5fdaa18faa0a8a2af6c0852e8b07059a42a0642cfa5a15f3ebcc7f99d462bfd6f4198fc9d9e0fd2bc88778c31925f0968ba390cbe94dbca58cfdb2766da971b048b1263dbb79da04293d4f12eb7d4410cf0bf946dae524800175fc6451dda0f1cd2efd6dfe874337beb660153eaf806329ef911a8000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012a1361746c7aa7eac337af5e4be1ca64ef2295c9f1625dc788ef83ea79bd8466022ab098a8dfb2e283b7e05aca21967a379f6b30b07a96d1cd0adb6d620b9f131a0b3bb8b7c64245ac4b4687cb071953f73c4a8ffe8284afc5f9a06e9e7eaaec00000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6c3fb9997c2038fe4fe39e3a0c9f06f0badf2ce96500a0b3201bf531e07d6a3d77ffe8bb7587eba01673c25b1507d1647be04334ed3ce8d7adce666e11b2840686a6461d6b197648d5deface98075470658b9f1681513c5b4a3c9eb1e45455dd297fbe45b552978724083a5c6d427c5fe935b62b6d43c8ca625844416d870db2f391e79fd656a43c504c65c968669ab212ff866efb07c1d232fbac7d40c16f007d506ef490fa2028e7446a0a774e4f30c1f177a8f47f62ff98b3d5882ac4eb8c32e7f044c0678a8505e6db5440bd8a2fdf5d3a46471766c75d6b52ead5d486ca1637146d4a4dd1f16688f703ec9a582130a2e9c16d805ec802a02e17f8f60e57d6cf7115c2724912e5cf798178418b075c350e5be350e68b2a71098e748532974079620aab2f4bada3802fb601502dcbf20ba7b93dbca0b6f62363ec27aeaebe2a353d721d74227e873cab8f14cb281e7d1fb8579743142b9f70b9da56fed3e752976fa63e6eeda8bf5777429681bfb509719418bb2d1d02b891b35e52bd99844e868cd48e47d7b6f7b261da72a3448b8bb429abf700d5efd5fe6a71b2e9a1bdf18340a39ef87fc594b3ab15226869877d0cb5e56a77375d0b8a195d90474b20000022800000224000002200956eeff217bacb8e69142ac922f34f324dfe8d5b0f3ddd2e5da648202a057720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099cc29caff2d11e25356d16f02bb46118b203fc6d7b4ac79dc68266e2ac657dea6be809c6bfd6fe20db661016dda382e911f618450eb77d53e18edd8cf7b0cc1a156c2b54801a4133c1a5a471f5b712518201adbc877188ed6b3d975ef03dbc53b50adef869a1d5a3e825552ee5c7bc49f0b06fa8bb3872cd0ab711e7cfe46faae6a0ab5e597a92f40d11493ca3f08b94c864ea8a32330d3dee9bdf639b49f1da69a1bf2f97fc6dca3733ffa1412f31396e7a3dc78984860f6991c612c53882c3811909e39e3b061abefc205dc3a8c9f2f3eb1796b2fed9db48c996de0b029ae46f78fa6e0a37c603bc265c6f518f26c7ef301f11ffa59c2d6b2497c7e904dce998b8872125474702eae49982a36360b822642365caca897de359d6f4be556c0d5bb703725c202bb93511dcc28dc41f84f9a2b5c76003ee139aedce56e07eff59be03ce9dbf69b092df833127005d9379e5bfc2d4af6711546720a0f77bb50fb6f25f1484734752930db1d2a63f9e80f4a6979da18c5150d96e65623dfa512d907bc88df5c3253c2f6f53dc3961e21fceb77a679d2200972782180d61022104d2b518ecebd722ab27b11812d5b0ff33cb2b1dbd2260ad1ed0cbf81383395b39b000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010b21f7cf8db8b41315f033eed1d0ef13ad019ba373b004aa7e89ad393d807db8022cf18bdaf585bcd6159e5cf05d1128475acc9f3fb87ba3afcc929d49ffa75358079072b6f674c1c83583e16b48c5049b20a90de1612d7903bac818d721ed91bd00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082d6628d425c3793bb880aef5e38675b694a689816bce32f1e7a80e746b3f47b22f217ca3d70ab0f631d2bdeb4c9d4de2c9f320e65c53bd35f58752b1151c85e869511a1527af196d87ab6c0f1605eba8d7d2793989299ca2b7f4ac4a1aa3b556cc48d55a88261bf57b6418c29a4d59c3bf4ffa778a4a83b1ea843af7fd4508f03d589f85386df4367ce1f7464c9d1ec477c298c0aa6ee215ecbd8adeecb403469cb4acece005464fcb39a562e7a8b56f76f0addcd32734e9785eda9b54fc496572255ca34e5ecc8bad7fe424932954039955db98d87099ab7e4b6ac7f2bfbf9e3872598e3ba8081204a3972a78ff4b5739425a34fa0bce27cab6926f963c3d52e6de9c5fa62e9da213bd6105ca9fe38186d157ca6ff224cb692f0b70586629db5492183848e4a7bfc6dd181e48f3c92a69925e89c65eaa21df8cf2a27233838ce9465932f54a0495b6a9b8eda7326835bc0052932b9c65d0fddf4bba65c0082a3314eb0b59cdfbc0f45247d30cb5924422733bdc6d8acd513de1fe858e3b73ceac84648ae79af6c31f7130ca9e2a399a0a9cecf8de2becc609aeb216aab60b4328a2158a969e904076fb19924adb4e3003057428f151672e5e7109fd258daea00000228000002240000022028bd814d8ff18256045189af1f2bb21968c2f158fa8c137e5add037277acb399000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b00405f6ceec9c3875f894d496d49980c168443e2701d8e5a40324ca8e0db95ba0095126bc727c5da1c0c6c2288c63764b59b5b32e470cf2e6b8436a0b8cc4ea6ed9da37fbad704a136af5308c9c08aac97e1f1bd96f2a4a3895b98304a3561f3acbb2ba2dfda6d81ffd712e829d09f0d1faef74c0a54e803d0b2c2c1164cdfecbd60a5f008dc73cdb719b1065be0841807a2d2912e7f07d0a53ff34e5f1322987a936296a35c833e705a8c4bd74df8d58e6ebb3bdbb6278867b326e8ab5bb2869ec9a063390a0d4634b542e7be2d4b90c6030324403f29db3c73de6f9f1195513b0ee1bb0a13d7ccf4b69de005140f0d34ceffae169b68a97315f76d55885802b85587f79029d6a3eee425484ef57f7d19b915718d161c5eaf2f2fdb577bae7a54544182e1eb3e19ab7c657f113d4d14e8d3952509c3e1e4f1d6607dd0705afc303a29183c77860315652b946afd3261060d1099ac52b54e584c5ed2a1aa5d3e43ca4a664920c991ed7d765f98208072241170fe858e3b73be23eeff6fc2cfcfc25e45076526ccead548e955bd666747e051e3ac73554da0afe050e4466d6154d73f9c4dfd9439c4ab82ff827a57bf973ebaa83e07eb73bbf12a392e741bbd000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010b73a69b42cfbb1661b646c9ba6403f488296284aa4e86a5ef4c0c5b096d2a7f022cfaf938474fc34bca9ea17e5395370118a6804f1cf490ca3fef937f8c2966f80b7aac6a238927496b340df9edb7cf496e140e7ebb952a2feb66657c2d1ecb56000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad7a6cfd7e6cb9c0cb8bd3fd7b2018102010984e0c11600b55a11d9635acf10bb6d9108d0dcf803bec7a7a27071c5b9934637b386c6644856720f823439d45c612dca5e2bb14cbedbd5d259d971586a77b25bad99196eb40e078cbb2b0e7d1345bd0c539541a8a6a7c8fe670cbe1caa8cf41a8a90355858e9a4e2217c90d78729a802d7b31adfe1d2581daab71b57338d3416db90cf0b0016216b41556a74066207828b7b305d9b2e185500c0c224503e3fc0b983813992db9aa4fa7cfb2aea779f86624e8f995252085f40c0b56f4781ae411eb621d244cbf2ac60d8e7c96640f0d67cb432822f0e27ca9b4b9fe66ac8206f288ca5e2813ee7b6992618d4546abb268718332c0d2349a72d16f5d15f96d81cdf44a92af41721c3be82622f50c8c8d6b6e2576a63c5b0a2d0536ae8b4c7be727ec37a1b3a2eaed0583ae9de10fcb6a6817be4fcd15921f759e2f5701d1ddbff7adca8486d47a8804f262fb56168acf5e06ae2021bfc8d4540911c3cec44a93393523268a307bbad6d57b900784999d323ec25f2f75ce3d2e8e1ed50e99ad8f266bb170cebbbdbd849f86b49c7ad1c7263ad3433b51ff01c18fa3b2197f03e91c7bd75aaa5066bf62b54ce999190000022800000224000002201933fba94ab53270a861d360ad4f24da0ad6e7cbbd421a4bd7f5ee74cd4b4c970000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015688a660e7ade089e95b60f3c4c44e654b2df16d70d7acfc0c32f919c504ebd01dac5b77c3545490b3954ca04b425a91c3d70c21589520a33040b8c9235b3f008d7a6149ef1ff8ee2bd44ee958d8015de9616b825a7667dc853079f5bea494492f993c0f459510ad20c5a639e98bcb13653f1664da81d7bfe916c1da00b400ba081f49eecbf3ac466f8ddbf6c8cbd6c09982ae34bff87f381529246775838a5f769fed30556fc8845f4c23d76aba187598bf8bd122a9e01cf41c05ac73090a27d5b7ee4f722352ee2932aec083c1d7c0608577379d5fb37bec1e0a17d26d16e75ae8b77d640c3f0fe77dbd3c607c91645e1affaed0cb568835c5e629dac340525ee911c8fc0ea8b1aa41fb701d56a44a614d67e8475cd4d9441c3bac1b1404b9036307f99d16c9a4f41ebac66dc423b7bd606fec99c44fbc22a0334fde8969675176c58cfab130a0b09933a32050453b00975256d26e17f5018bc7588752b3d4f898eedcadaa8ccf5ee7549cf14124f3526c64c3c7d90236e61ba2b669398347f99df8c13683f219f6e83ce6026419af27dfd413f0d0bb0f94eaa4b7c0cfe1c7b5a8200a1f5bed38f86549b0abaf77f1f6e18e7349a698ab17ae2a54345f3b7000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012b8e5d03314acadd836d3628008c9c14ded326399ce1f7eeaa37de136fc400ad022d44484771b22a6220e28c7281cf72ff8bc8cc18e4ee3344668fd6cd9db2b5d80d33fb788b23f689f31a7e4ca9e4c86e2f0ea3dab95dbd4ec989072b476bc29b000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa9e022059b09175d8084a8ba1ef2b92b548a221049e705542f47fb316f77b50d9b8a60dd4ccfea2e00ac296270abe345546a97db1236b979e400681689ea276bbacafa21613d724b362528205200f624a0ff694da7426186b3beb1d6e152c9c424e4cbb9076416f5ed860d0cf54c9e9dcaa74a95ae4900325616c092456a880619e23ed43ccbcbea2b8aa6dd4ac62793cdce5c57b8acc6e4b7a4e139527b5ef00bf9a5cf1d188e45ca87edead5e0ce2b75677ae506c91264463d1283d52e4b953ef9217941f37fb3631b0938f20369966d130ca5b005b9303bc984919927460977c8852dd33f4337721180ab1ab1937b26a98be6a6fe23bc9d132a0600eb21c8c330a2ff5e0cb3078bc7aa224b642561d8c263785596973a3ca689c6ede05d11e0d2ff82c2d7740326dfcd718155ee1793419ca5770cec64223f4dfb62feb48f38f6e70d1c8a2d8610fd45f691891f606f1b14d9bbb8ae2a6bcd1cffe8b74b96c6b76f348f1c92a6b11b5a40a6f45cdd02e924291f0cf1de8b6ecfa99a5a1b270936c8f770ad0af82184f4b5b8bbc8c91f262348ce74e82bcdf65836514a65d5eeea3e0efeec72f732020f7850adf98897047fc9348d92d9a8ca6257bd517fc0000022800000224000002201f9ff3cf077d913dc38158e03b8877ed9c027ad32f2ed9651a1abc2610a009020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007250d8472d76fcdf2c12f726900cbdd936b3f0a35f0b79e4f439a66fda2eae3b2725f09503c83afa267e9517334f2e9048b51621f40205b1273faa10fd449bfc00280ca885da3ce75b5a5c6f8b54a80d9b123598ca76ea604b7949a82e511d842df097bbdafc815be70ddcb292bef6cdfa4eae8cef910b42ff4aa36ac7dc7a51c07bb6277f3c11930e135e5782b8301cf534fa5bc4fc8a602adf4ca40f4927b417c00200f5dd09754c0258aff696a77b11774f049004b48701caa066bd3dc5bda4aa635953e1e177e8690a152f25e34e5a4595b2b10110d21acade5730acd5aea35e27eeacb22b5083d14b26a87c68bd081481db5db32cd723d4b023a8af96a5426a03ce8c0c1a209904da8fb7361ee3e5353c631fd4b6f6384a6071d9d022942392ee5228e4efe919ca2faca02e90628db9b9aabc49c9cae2d0d58f9e7405495ac27b28b089789d9cf20913855b3617cb413317a40da951ec474453db02896a763ef163b60233ec3e41478f3c96d85382b9c4cf633cae254912410713fa4e8519e976e2ea9884b6985340c1e81216fef2ff493460b00521376933f6b56901ca891306434879cf62c7f469dd04456cea13a02784b2618f72a811a45a159dae9000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400127e265234ac9a4f6527be7336562f94d7857a9676eeabe26d0be63ef5cde8f60022e7206f3ccda9dff4bfd16964c5fe95c1e6203eca10dec5d17957d008fdc8841161cf5274f1bbb6426ba5ffde04c58ca5231972bf29bc587a22d4d2411b8b5f900000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081f9bf4d861836cee1cfad26925547274a9df68fa6d0cd2ce9bf96f33ca05ecadcc37bcd05e9f9f59460ebbbe478340e78368e3e209357ae0ab51a97f95c05358f97990434642b982f8b99555bf1c2db4baffb22a37868040925df2da55b95f9697033c19f02094837418c3b099d60ffd370f5227cc175edaab8300f93e06e48aedad2eac80a20f0944eb9d142bf22edb1a591efa635074194bea9da0be7ab7960d6735628f48a99a7e7c31a2874fb5e5daa9f588df5433d8aa3859e69800d927397ecad27acb2dfcffe613d36b3f2a81f747589c8a5eb05d2b867035fef072e1e43db164af4562e9c68fb8ef46b040e643519a89fd33c97a5bae825fdf8d644d2bd038b2c663fb291dafcdcfece0861fc872c4f8281d7079895a7eaf73db1512fa0ada2aaa0752036893f5e60a50e1711ed7260482ae8c0b1dae105218a672a1d43d416102466f40fe235c7514b911edf7225bf64f26b4d3553725641564be3a4ba037dd8b6e3fa517fbf0138df75e6104af1dad541b9930064b5cb15bfdb6a2474f0740ee069959cd2e682c7ed9dfcd64698a21257f2775e7a155c466b52a3b964e5c329c351e0ea57fab869357a79eaa7028b8920bac60747781459ab8f81000002280000022400000220163e871aca9a008b2782ad0be6d88a72961227fa2a0ed7c7ab6360f4e49b30db000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fbeffda44975b3bf56dc6ade9d76c534d18a75d2ce2be56de500ad2c9ce1a066cc5d90e310f7edb5b644493d2cf570efe8ef1dffe6f84ab4ff985fc26d80d0b5661e7715b2c0bcaf3741df9443efb1f4e1db7fa5c47d517ea97f4d278e862564ebd971a3fcdf709f1102193065da4a1ab868d95a81f6f625c8875a231b26fbced4c97c1a0fbc8e2f36e30643c8b4c878595bc6c711d93cb697722912a5a78102ba0fc06c2ba0b02efb6278f8b6a94d27efdf043a3ae3744cda395d3d9c5ec3ff8b63b689dac5c7a0fa50f2d9a930d3688cc5cceff53f476055549afefc0c113ba132aebc45badff20357ef0a85587082bc8e7e638a152c33b7b0f8e6bee88685c99737d155ee6e4d226980839937be215a1b543e94dd2df262f8cb8b7f812bd0ea1cabbbd3a21bfa74243242c2cdb17f4801b614f444012030e8d6a345403cf8a604d93ea614ae45732c7e8f6fc02bc1d39884fa4e841b03e82e90a7cde373a19a0c5cdc1eb3f6338391afe4aa6614b26bd0e2f6b4827c695fbd8975465b029f0b5f2072eee5206655191fe4795349b6d6b7c355941d84f6d9805c3989e18a4536934530e36bc8883963f906703e2d96bd1b09386dcaca4ecf0accfd4726136000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400120dfcdc04d1d8bc72279437190fc5f74a7910a742617288497e814aba1519b5a023056b613c162b273f788860d0b8c2e1e877494b8dc407d8723a66ebde51471d621254b9b45057d9cf85ba00948666dff79f43fcaf4c4e35ecbae81e1ed5d82e30000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001dbfe9276a85e855f2988bbf793f09dbdccf9289623e8aee8fa4a0d40ac7f79753c5a5c607839d51f3c824791908d7da8393067a3a1e908f26bd66394c34a4076c133ed87f792856b9a2c1815b7172d8a5469bdf5d293dc1e022f2dd675cca96bdf9ddb25c3fbd30b5cd2f01ec7cdb8b84c65910e690dd103e74ab1d5631bfa016fbe355905047fabfe67fd6ea8fab38e41e7e92cd51b11815a0d5079dca4dc84e7e5e39a974c6f74b6d384a748b42c1550e3868189a82a30b7843bd6bfec61bb70ba2572e00e450579efc93203d6fd24084283f20f1286da75b531dad215f3f97ede2d9bca6a0795ba2ac9a74271e8b2dd3175d159c36143953683423ec9f074b752e9e131923f9b0c64c5f1348f41475874e637a02411b677f9fec2c85c5ab9d7dc2f9b7e661a6fa05dd1e1da2fe2318be6398b780f8d2d116d517ae3ff4db666c9f0a0e52f94cd4ba56270baada628eb1382df9ff3b6c2296dc4d3dfd4d9a0a54836b674a47ee7183171c0398735650329cde17a7bc74dc92a979af415ff7e089998c7cafc829edce48c052d4d16521edf80046a0578f84a77813ae6f1f1c5ed5eb7dfabb581fb20d17c395e4aecaaa8331d66b962a8dad4568d0b2fb24260000022800000224000002201c5fcfb6c3258c9c4447a823735a4c82d33b9386fd464cdcebd3d9b4109917bb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000226e09e4a6d95e817ae3cf038ee50e859321f2074e95817397fc660dc42e289305e19244c48057ab97f090379971e661ce9509ccfaacd2bee608ea74c4a9e569f08226500541715539b531bb80333f5be6abe1443fc4270c2440007dc3fde5b94106a7906a8548bde065fb484a823f09a5247f0b9830fa32da1c4866b4c6b31969c7a515df702ba04b7ab6a59a32a227fdb53ae9072218564b4b2a6eeca845436827838968341f5f8b2152019dc3db387d2a49ee1f459a63ff5e69fbb758a09a38b9e2478667e42cb27ed1e84433d784ea41eb6e33bf9f414850a5cc675574fbf666fe59f868062943b45cd2ebd9c34c7669b1df75e1a2ecdc26d885e2d3538a104661397dabe0ad92e615da642a62d827129404bc687ebc27f01da33c818d0cc758ba549d6b9348a4ea04d7d532de6c6c6eb28ad4ca9dbbc4130bd431ab46c28fd893f7017ea03205f6f2bb9a3032cd0ce7c683a5ee62170a60a7119a90b2b54e5827e4c99959513735ce6e73ced73072256a4844bd7d408057c6bb6962a98582f46cff044ad4269971c69140d796486efe6edb16cf2ac120e4124e982a4b15c6de9c3180e7088c767654c0d4aac08b4517b9d89ea42f5416fa11370f5f42470000000400000000", - "17e8d911084d0cb2be711a4f24e6eb7ac0adf18f27ff6ed91ebec635730d38520000001100000000000000000000000000000000000000000000000000000000000000240088028b090b1f5d2bc147db2b1e680ffd4ed51ef03e1bc3faa425d5c85e990700089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb300000110272889d42d692e365506d9ec23731c1c367c4561f0bd3438edc8e9a7ba2dbf5b00006600050c8a68b279656825d336c92c0b596cc0c3cecac5f52edfaf159f5bf07ab5f4000066800825bed0f04513688a20a73113b41d525a804966b3e35ccf0894be7867dd9f59000066800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000070dbdb14000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad36ee701019f1fafdb75f212142e78b345fdc0ce2101b3ae95aa6a4b03b12e8e2152164000000110000002400000000000000000000000000000000000000000000000000000000000bec47b00204a60847df8ffdf6fc53d5e9ead7ab6f776d35d658099058d64c18efa9d360e92199bc60ebc44c6b77f26650f4524babaf5393405eb178f80e4abd361757c03102002c70267126b2dd65bdbdda26f5a263db6b92217411667b43416f8ed37a97f30352c741204d4e8341c372b6df33ef3d1ef862940c2e73f4b053d3c95d6d927400000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029fcd0947fbf356438beee00e66ea6b7c4fa8cef411f4cecedfffbf4b1f7389b40e500b05212a874ecfc82ddd195763ecfd5798e14c6eacb9c16d935edae078922b9a33efdff03a32efd723867617ac83cd629b00cbd483cd06eec97bcdd2d8691d2cf495dac685237c40ba0dda7d5ffb52905adae48ed144d240e4a118c11fd76f0a7fbe530cefe95cb75d7d1a6b755b3fc2c45ef449001ec5f734a9e04febb76ea39e8d9acf781998d2ec7bb35de544225b4d56be158d82b108496b7eda6d84446003b6f0bc06ddf8cc92110397f2b5d996f702388ff3cb58cb708ac23d3a758c368be2b54440089fd7b31957c5d718b1518cd011ee17e6c71fd2ccf2ca7a8b14bf16fcaf4e67e633d1785d10a20b48a850afeedf3e290b3edc5c80812ebe72fd65c3288e1b97311e2f18ca2b814360d2c1881c587600eba920d8660233f5e159f5bffe6ea84fabc04f90bf6c8cb12b93f9855c693e8ff4dfa468fec88b15413b620cd36b865df67932292e14bb122edee1f154da5a97e1ad5c195c72a273731c3f2c42891ffaae509946d354d256a56c973bf637a398a6cd624c33a020ef3c4fbb882d3c347f92b8d6c7de8e1c39da1fd9074982f51b1e5af569e4457570c00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e7362c3365047c71294d8d9e2d1e5262c4af9fed65840885d5edb95a33bd9af806095a4a80c25a175530acd0c6937a41fbb0282379e001a15a57bd4a943d703b19d7347a83e3587c2d337c05d694794a6a891f239b73933b9af3cf5b39ca138a25eae38123100b41c00aecb43bdde4525def1f1bce2967da7c2424dfb09c40da78a756155d2eef25a583c8484bc0472852cf255bb5441d73e7c4d058fae8ddd6ee7b72d73f4b935f57cea5c76cf486f5e76cc5d32db9e58878bb3d78245fc4ee0c5c000bf8858f76583e969a102a99fe749fc2c73c0dc2f1294b276696d91f8b61494a8017446e974bd6a8ace5d919deea8874a4a8ee9bab78e6632a7ea69d6e8b3376fe07676f2b6d9bcd17f31925a020db55f5957d74440fe8f8b5dd0f4a5a964f1278f660275f68743d277d1a5e17245da070284940584a9696706984ce733c24e917cd3520a6b7bca29e11721d4db789ec589479a9ed0903d502ebb1378f6b35426f7326d870c525f3f0a97e6cca53051d881d14ccc0aa8fcf7da7ba6bfe6c88ba8726749ce71b5a8965013246397e4e4dc68ccedf404a6c9ef15225fcd1faa284f26c62b41d1dff2dbd0a29d2bcd4e75fb241c663ceaa00f675f67587300000228000002240000022027b4a0e624f325f33f9c0311fef203e085bf581a8b47363cd25bede040eb0dd800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000afa06b30e0e6757e30ca1198d1e3d41aa2e683f15fc6ce3ec2867843ee6ffab64512599e94e21457e8674cfa44a1f8e987ade3eefba4cf0e69a2e44d6e387206bdf49f7fc11f8263bf5b495ed127c81f14f34dc4a324b3e9308b4b2caaea07dd387302c8d073c3e3f722bc7065954bc59e660f2cba5f6d7e8b19e19b2fd295b8481e528431eea901f33816b4578b1d5fa8a3aa3890f996f4e4caac558f28440b2b3ab87294bc84b88dbf5cda64793d1fc6b32a867d76ef9b594130b29d814e353bcd197edad7203f96ce9f6b27204b12afef91132b60d84a445ac0cab6381c63354e5ac730fd3d533c0885468d607028181e9f4a8ecc6b752ea5e3dcfb63f890de6a85fce545ec010372637a15899c0732f90802273f8a89926ff8e3611aa9f9bb6e49e83b91d496ba6f19cb7747cbc693662752875eacd3b0ad2ce620bf2583b6252b77c72e4899d13e6eb170d48a7abc87a4b17c08948e7b5ba032eed05821b8231041542924a4339040a4d9b0dc781759086c241d1064278fb0a6cbf3d636a57e89ae063fdfa1133b0c71a89a9ca83e7c769ed8be14015540de063b931e74e93cf644cce4e8f44a77380a3e2956266cfd96c60700682ff7d9daba0a3d281a000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001157f9bc3ee797cf8b5f31ba7d4534d978ea1311fedf41f168794e54ae03080370201a435a6fb6938c755131643f8a44dbdb07b6109cde385af03acaaeb63811be201d69644407fd13bd5bb8f4d24271f81cc6c1dd409dde1c66cb9ee647fd1f53800000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003044f6026eb173fa9c9b535cc01e8fd81471483e1187741ca102d884825f34bc438db595f8e4b8767464ab6d74d228a75ae83997e02c35d6d280ab7833b466da666f9d42b3620b334f1675262d27d15f7479076dd9303b03ea648516e4f3de8ff360ea65b4b85042de2049582be3c79971fb5ac942449cc02740385ff4eafb2c92b36945517ce00fee752f32d9081f3bac1faf5a82bd3ebef6b3568824ad3116f3bc0d3cfb681fe6bb5ff57ca35fb1b8d38001a34ef2c2b22f930dacfe23ed913394ec3231b8977969053eed5254d65648684654be936748919364de34127c551229f825c885d19a517aa74017f56bd31e50cef96b31e517f461dfe609286f80625b17dbb8cab0536c116f338aefec1b39b1e09f2907fdf77fdd6eca5ba16efa87830ceb6501dcaa373cd55248b76ae1cd2f53bcad3bc41d4b47a0d1d9385cf7a702517b07101c91e6727a025c851e0d47cc63a122fea3e981cb27636ed6bdf93fe44f4efc58082e1319b2833e77fa047ee7b9ed81cf538d7665d134617d1f1376b7d99784051d295419f9be9360346d7461059d8d493b066c09b08f2751e75d2a5817fa5f85376d68b97b9d6d599c989e21cff57fb963774594fef36efd1f60000022800000224000002200af9183328870d92a4fe4076e85087bedf057ed3ab578ab5bb631dfe45f3ee420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080479fb1f9de9c9aafd24774dda1f292404072959672721f2c59722f87357d2d455fce08671d9a051c4cf38a56939f06b1f80a0614841227ed1ab80088bd2c7a5f1bbf9b32a19ccf481b7b31f47881be4243d1aa7ba89b2e0f6a818a9b2310809c319372cf7670e3f1d8fd9bc11e2fc39062be226e4de76054e3d336edd5091c63e18646f408a6626db2d5930c0f40488ef13b66cf5c01d993a27be344291c6777909e36b348de8de5be767201178bd4eb640f53c877c81a5c9791c3a0e09b60f487a492c4f37a2b9a0f309c905d1a461c3ec974ef39cabf3250d72916e194e7a544e94c9d30e55f375da706a5660791e8daf34d6755124887b292497f00165236ef946ef9536a737b5818808416a34670e887463bcc0ad0df74b4008c74d442e3b0f447c87fbe940bc052b5c1b17142b8458427a098e9609049ac662474b103f83c509c8c8a96a6b03b9d4b38bb47bef73ba0b00053325a06bb525a7f3581f6d7c151be4f95d69b3108ee008b52a5736b638fa1718f103900ce58e03fbf4e54cc05230b4703ca728c680ee257b0ae7f5ab8951743feaa1d044d6835c2342d1a850dc7bd4b0e712f4f20e1635a28b162812e3a3a142e7ca634ea0b90f2809943000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012dc37cbff87751eca682b22291d9bb663afffda116ef1b12f5389878d1188f680202afe45a24111defa1555dfdc74e0f750759e92e8cb10bfe4d21a1044d0357381377f1fcc322f91687abca0e0f9b5f16967f4e54a76f4f9ffc37128eb2eebf170000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000efaf0701c3ed4c9944e7b14af382ab5b8c92ef08b1693539da78c6c1103a163617957de217a0c74e6f7bfb18d24f35d5d526d21db64e76c03cc31c91015c367a05a0281962ea5f25d82a7f329b790cd6f67e07bf8a78b9275203ee55a943dda7b3a8fa203f18c2078176f248fcf78b4166163cd7ed16c6c08f0383dda43ff18dfec733046fbbb8ea41d3b41ab6b187668400e4d27f0fd60e11d24c4c118f12bb977261c832c7eab311c3c3a26bb9b964cd55e3fa3d1d6ff37c6aedfa2a8e8afc550f83237f9248c5754d3658c29b469a588dc76f661a7a6f4a544113d090131b7fdf14353e06686375c027cd369e96473b420dfe2f68944650165dbf252a249a86b44df3390930b7814f9f29f8a5654e9854ce47a19f3fa8ea1a8bed68221722ee85034daeb4333ad6338018af1cb43bcdaaf39d5c55ac9bce6d06ae5d072a8af7b93920df1d0a88fdf7e79e052a0d38ee8db756eba6452956099e559679b17c66a506db48a9cfcde31360388cf42e7662057d2a2559e3ec38756212b19431cff5da48ce6f098098f5efbbf57b08b498df4dd9b43fd61b158bfe4ca114e406bc7e0893e67f61cb1b64d493df17e2a181797fc8bce74eb1500ac6a258078b721000002280000022400000220241beae313183dc9bab57d7c1a4d14e06ea6bb52de2b386ba1b348620c00c27f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2da5d8c66b6a7c3241dd290c34c0f1aca896e36c56cf847184238bd0b6d5c1d1fa09c3f4ad4e9ddf4d9aab10ac7fcd181507ab2958bbff03edadeade016c37e1880468cfe348556573e8db9db6b2ffa7a2ea60b69fae32408e220525dffa5bdf2354e4105fb190110e2b57bf9e1dabd0bc9d99df122d988fc2407104aca1d03f30074d1808c4f136d28b7c81c3581245804c54051e5041a7783f295ef59e1315368b934b844463ef562a4a09bc5d1b1608deaca30601cd5d46eff3b26bb1420670c0e1da0d027c7cad04b738fc4c43f56e8f085dece807b8cbad8728c7476702f0c526c6bcdef5f67df66b77c3195e82f6fe161c371b2a6f9c912f40c3e2d88d9f065e464a3682e62637bf36e5c51595bd65cabe8a97e712c746e0ca8af3f1dfac403fd16b3bf81168e466917d5afc306a21b3f813c03a8bae842db485d01757253064f0cc98f6bb55caf25be706976e3f894cde8ff8c0ccbad195a2cc0e8ba60e73e61de5ea1308542509b63c76b4b8087a161be4e6877a0bf3e0b3ae193a1ca45c13f78411c18f8c15facb62bdb4d36186ea1d345c38beac103f94d8bce871ca404fb2a93acb73ad85f4f6d221a2b476d428eefc3585e60c6200aeee9c0dc000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012d0676af7fe9c7f271d4fbe509fd98455bbc19a681d31646bb1f1dcb11d4ff790202da75e0a1b21cf7e2720e81c9389e2a1bd827be94402d2d5b5f7391b25caf0b1f06da12e237e27d44a935d5558c8be3cab626702c8b2c764f069eb7cf7bd17c00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086059c5a28d752dd7b23bb5f565c832bfcb378d553731b8993ea34cbdf8c56f00ddb1b22a35774d5a91a9a4800b28524e575a64275b0c16997206db61547162306e2fd7993c8f1155fc9cd50188edfef88b94521c366f1aa59ba478754cd903ba147d124b632159ebc07dc888f98fdc406b8944a721f64f81a20a2e53aa943259c78637dd78416e3492c3232c5706bb854ead40be1839088dc8ad97aeb63175f09bc48ca23c11e3382047782668db07b1b3764ade35f5233d40758fd71219a6e1f3e54c4a119e31868fcf0f2910d4e969f689b95e429c85636b9c48b64d3a70e2fc00080a4f2dd972de941e35057956e9f81180a864e34b79215ca5c5b3bac6b63ca4c7dab44ff4c33641d4c9911e2aa0c172a27e49a777f48c0db1c00fe1ff25e451850981cbdb377cd9d77d1935a6fa9aed2c57f949f61936c7c8e1720a8d06bb4661356c573b4af45e8e26aa052095f006f30ac168fe299fe965d0064051c959152913af428e833b5c329d332f90b421b0ac4966ef6c47f4e9e16f6372a85561404d827830b0b694b157808d946cc7f249fdb2c2451d4939896128072fd5a2bf3d26e54745787b889c063b167dcbe2ac3d349a305dd178ea9a11376617eda0000022800000224000002200383eaf3f7cb73df7a3d012c68520a9ef3c9bc8f00b2685ec2af8d7527261b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e123c86fe899d961b011bcaf02d604b6c0eabbc17a66ac421e26c90fb82115dc5460720e6e681ea4c82d3c30a7100b69b814d0c25ab0bac51e3623326ef36097fd768be9bfc51a9ba72adae7f96438e610237903878c704a3a36626bf764f11091d7e7375967bfa6735bd9406b192b06ee70c3c7eb10b130295a23ad5c96cba59259e923555ad37d3263fed4a57f41c7ae76820a746d92ba61f51591ada967fe4f10e0fe9c4da32076b09480f414d41332215c8ed568291bf6be5b19173ee34516713f686d5dd260c56e540c19a73844a5cda0b9b4373551205a1ab4783763148492c0bb388704a769ac62c027550de1c9a9b2796f4c1dbc093336f352086d0d9dbfb0d27692ee4f0a47dcdb713ee6d36be344d4d34317e3dde94b0a47558da7ca291feec5c92f8512662071f40115dabf0953aa89ca38b22f91c0fe96a0e463b204dca67561fa0ffe009c92da47b567bf8b0f7a53979580f10d4bbccda075b9ded0d45cc0735530101a592c74ae9db6a5c83367c58d7a01e69ddbbc18e9c2e6308127f205168eec9c1b9c897c675840ddca94f5cc3515f44065844e95e08837e0487b4d767a16b1fe706f4bbbede5e0a04c666d65fcd96642b3a20bdfb6703000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00227cf04c48191a94852d0522e983897ccb812020f31171dc87961133dd8b8bae32df24360a6fba7629dbacc13f57a5291493f1ffe6e908041040c24e844c6054302042e46e26ac0426ea273fa5735efd5127aa9dffb6aeca943a67aba0f4b4044cb2e4d8c0cd6f81fa06217310d57ccc5e28ef915cb61e6e76d77e677e86f37056000000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5a7a6b8dd6e6971da755cfb747e66c6404a80e1c01386d015a7815aa15fea0e024f1deb584a48f718238718a2c976d619f0cc22def832d5981e75e5dc6c954b0df6805daff4b3aa00054854d5e630d8393c41efd56c566b72e36148817092a79a1279c0adde3643790b47f43b040f62493106c1454482eb3b9655f9d3e38da62bf10524010fc0947cfa727c0bc6c506d89440039b723989de5e0ac9dc5587b175b83c25c4b2711cd9bd898329518d5e346e61efc27276537c1510bbc8b8d3f2b85416b09a9ef9c8e24cc4958d79fa5282ccedc3c6e1bf1c1e7288690f81ff4c847ca4cb450c37913385b1a402b055dbac5ab9b195a61981312098ffa31f3dc4d565a1c22ed46499ef2a1f34dcbacc109a1b850f55bb2833139ff0923e7efc4e7fbd25a214f3c49713331320f1a5db9598a0eec01b8054d4314725c37fbf49d59be94f2fec71baa211212752e73359e694863f946f104112231aac274d1f1e594bb4b1977705ad1079eedb817c93a2deb08e97190d839e900a49016b76390761b3bb953437d12c9d3fb6923088ddf698c7455108b0ac89b5fda793f950f87ac91cdb2a2f3539e81a2c5d7ad08b124beda20660b219436a71bc03fd2f08e219fb0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000918ab60f19a09834a60e22fa0d109ee2ce9389fe03421e90f34a4fa336050f3d49f60dcffd66176ac9a6941f7d3d27acd7f6eb79cb9fb92aa9ca1455b9ff0196b9ed203f86116640edffc3c5a17181e154b802fb439f2824868aa210c2698f60dcf992c123f15e22a8d567a26aa6ed62aadfa7cc7b20c0f4a157529d8b6190bc87f212d7491e83d145d4aa99b6dc6bacb794eba39762b0edd06834c5a32beb70f3e1ac4cb92ef8a15940bd5cc1793fb06849bfe8c27fb05174b2519824e0ff8b11a5c57c4f6e52f61ff762162bb8e425dcc07e0355eb4fc2687a789f3dfda471cf5831889c5c9d7f784d9d69b2e1f495a199f99b86fe1f6f56b9838723927839f782fbcf138ef6b73aca74fd191b1cc6eaa17d05e33b392d774706bf8c4b5d8cd9f0d9ade5bc6181f90b68dda11624d17b4de6365ff6f68b2b69016180bc65d7ebef9b38fbcbd656a4e26d3d6ccc162db6edadec30562535e326c46ae3f1e7102faf527ac445decee8410ef2fee5f20b8c565ff89eabc0c5f7c8594b4f7f6d2ac65269529aab623a6294a03f80a1a0fc3cc42329c1e0b866dcadeb263354d8f4f25bf269f143282b36d8e5d33eb66302f63696ab3fabe605dd84820db7ec261800000228000002240000022007ec792c59bf8b797ebbf9d111587c965b27a1294d1eaa200d2ba99d7129522d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000428b9828691f183fcacd77e1ea1780bccba1798a0af04e6f684cb7d706da785887e9a0013e35d45d23b633bfcfeca4f759dcbb660eb861ee765580d139b2a5c3ad4831269e95ef3a4f1e189603bc85a6a111a0b3858beb90247362111cf62d16de4be4fc1059d85cd46cb44f1b78f0dbab93cabc5b7d7afc6526c5ef4b8ea5b0c86c439ba46bc709b355fe46c784382330f541cee2bc1fbb09be9dc1105eb39e09af41f12983a8d088c962872dbb0b144af5d957bbdb665355269ccd286af8cd76fcb9b83d9db538dc7bd1ad64e0e877fee2847849de4be5103c42f011c6cc279ad49443492e391b141c6ee2f6021cf5ab5e9b92f56d2ff021e9fc39dbc7379654854721e49e71b4c49e7deedf1113d228ed4fe1e108335482f594e8dbbfa299c87d595badb12d4f9833cb3a73f2b3ada39c3ef42812041ee8996a47db82e779411c5ed31f6e024d3d7e09f5a068f51d2445a4baad77f597ccbb11751fa2dd20b5e2e05de9a2517e28470acaf0dcc8f0ab61fae5e80dfbd912959ae170eb4d8edacecb1c11a9f0266b0137ebc511e6ff01c8bf2722e571e1267bb8fc764bc89b07ea9a0bbc2fd0bbbf1acccf94f53020e8dd1120c9c15e8a79e98c111e43526000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011bb1a94d4f7449fd1e1dd048162855629192f0334d9f6d144dbdf546e860a1680204c00b59ae55be0baed842ce2fb094ac7e0c0501548a8a74ee313ece71bb947029f57136ba181aae1470411568881be1313d7da348bb8353b5becfee0674c4fd0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009dd505edcf75816f47d343247b49fc79c44eeaffbff5b1e916917dc8ce012baf7daaac3f116551815192e79f779b9423296275cd2c64282ad3f8f3fc928602d8c20f1987d3e7a398b0bcb1f0187dc699881ee189efd18975a2083555fbd868922d8edcb185a744bdd428f3669a1ba4e8322247c876784b7755e8f60bc5988b72876c5d0e7626fd005da687fbd96d4b0461d839587981acd073d79ba98e40cb75b0236ff5692a9fee194ae43946ee01208584e97fd796d063d4cf9b8a956df84fb5c8535eb91bc98025ed0e0531c8123e13c756a71353ab3267c70705f155258ce61e360b3cde562967fb212c3143f494201ef9e79aa030a433bbfbce43ca100b2e421f239a360455bc7accd7e1194efeeec53917a909d2bfa77f493a30c2811ab3521babd30932a8a6c8a4b05c30980fc7d220de000035ac6459979bf03825b6c40aec42f20a9bd0fc43131ec933f129840521cc08b87d7aa4365b6ff76ac235ce75290394193b1c2c9586a3c8c2e74ce4dfa7ce5327d5bb9914b774366d81900df026ed8d549241daa9df42684ea8ccda0f556090c4b783372538c8c129e1d4cae5a1b29535dd2d8d27a0211445d187908d60a76c481c4a6c85574d4593ca920000022800000224000002201c0c9a279504f560be331bbb1667456ca34713f9a88ec63aa832bc71b50b61d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002eae287f5cc150fe7fd4307c71f830e28dc0370e5a734a64eda35ee6f3538c221ca24536e7d67c5c00dd61c6303df1bf65112916aea04bcb0c56ade0ad03f7079468376f06d30502699ab775bdb6ecd51f74a0cf0cb66e3f2e77a36ae9e4323521eb07db3fb6b093f53388eecd8b69a7a9edd313a50e6e9590f942d9c894d56e5dff2b53cafd941791a61b99cb18e0b9ab37ddedb74fd56578454dcefd6aeb91849e0b090d1df661d796ceb3e9941e52aec7291bb612294c9d2cece296e55e5ac9d19bcaf19cb6e909dacbf4961218417e83818be685093b96c579228046bacb7c1c964a993e676ca4084c84ea09fd6e6cad8b09e1e0827b247625e5a1f8eabee12c6d5e421886b612b3838197f6705aa40a5ed3e5286e6dfc9dece27ba1fb4f5a6c92a4dc192448b622f83d524bd56d5dc5809120323fcd1fba00d8a34cbbb6dbb47d39e4beef5ba7244809e05e881554ec685784cc46b9dd5a82858e0b355ecdb24c310da95d51a12e7ffd649b05f1b2f1fc034847bdebaefc7b9b29b5869a63a54496c6d9331a5e2cdb022a75369bbb2f55f165ac12d1eb51c30b7e98cf30cd8bca43093cff26937c9870a1e06ea11031366a742af5b5782f7e571b2176ff000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00225662835b1e4e095e700405d8ae86ebc8f81b19e7e8d37f2823cc1b45cbf88c30b37fee946845919071b5b2b3a8a9002546c867d8fefcef5e1a3c3a1c3fdd5480205178f917ac5e7cdccd57678db633ec0c07189cff5fd0e9347246112009c55da2d74444b10679d215d0561aedba7e7c77202130ba2fc65d82d8c43983f50aff300000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa1f489cc6548cb84be2699367808a732ec0603094c8a80058b172f5eaf07183d7849f368ff45f25770742d15831efae22f7c36e3238323be589ad9478f7a9beba55b8c0ceec1248a5e365bf452abe545b6113c10e00792de1278beaca30cd54a692bf55f341586005a09508f7bd6cf15e89ebae8f3204ebaeb6e561ad29e762468fe4da39174bb8818ec7b34adb91c1e54d4dcd5034deb81b8e5b41cb23de1c9c4118c462775f2f43d003b8f282ebcf2cf7ecfc86a0489bdc5f00dea7631deb028448d9339b496ffc689f754aa08787f6772053804f96c4912c249c736a3024bb8a141b9b6920f9e6715e0abdf80542e2ce82f6821cbdfdfced87ad4a75131a308bfb3170def93f5407b3b992b9ec77ed8b210ec9577bfbfc8e3f2953c8ad53cf7b7a018884b64bc6af638b14f8d9550f7fa480faa8090c774ff75f6567c0e5bc0b9a8900d7bc5c532078cb85f04f51ec9e5a8928380c66b7263fe50ae510280da1bff9c8f65a6051b032108ed47856a78309502dffaf7b6b82bd864aeb2905d4aad9b413c57fc82313db5ea8cacfd91d67558cd4f6b4aff19c8cf0f7f7eeaa5b640d9813137453bd683af875e3c72c4f0afb361dd0497a8b1ed24ad6191dde00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a11c491c7385fd2ade0b661a082e63099dffa4681c4adc09b179e3eaf351178483370b3303697b22307cc0e0393e3260dd1050e9972bc7c9919d58fa9678f6531c9f38f268995118d4e6b2d27fa5a0215649399240392e1301770977ab924f183e62320a8ae2bcd932fa714e6b17f15e4abb04075ec2f4a91dec577f405561dca9ad6d0ab2a077d73b3312c9171093232303bbb790ba315b1345caa0f19d6ea865e81af89d5d318810e7252ac87a8eead10cb5234bf4bf49c05e0fd90cfa0ec8b27e1cdeddb2890a84a641393ed5292f622b0d775789a1f221769eae0020585dfe0bfd153a1549c863d6be25a29007f50b0c625c90e869e039c3e7814b8f23dd866b91ab569b90a3b71ae181167d6e24f86c748347d5e33af7a47ca70fe1a0e7cec46aa28fb946d015980bdc0a7e37b974847ad3dd40cbaed9afe4c85924cebb05cb3ed0977450d1d1b237a6b31afed360d9cf2040b8c5f4a7a8418fd3943e3435ba7832d6598496ea08c251b4b33c50b17b588b30aaa4a8dd77a732f60708a5d626f3169f01fc903dc7621f96ce2b99f1d55681c1fb36dea0b253f67f310841accc45a0c13553e2e4d6dd677f9913bcef7c55e286de717a1069a1a5bda522d00000228000002240000022002b27cd0de685531fe8a2a44e134cfb8a8a76de581ea3d936f289e22836cf4dd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dae95842de5fff5a88cc7debb050c0b1ba276f2ad2f05bb340c697e363458fb937e413c82a890040130badaefdd54ba6253212425f54153664a98e963ea9a281072400813524e071a979236a0bca0a5c7535c2879b98327fd52c3c11b3b77d46dfa957857727429df85986b47ff03141a819cdcb9dccb7087812efd160f9b4ac8d2df677eccfd988d716c2a19030764f73eb6f687dd9e2f43c3e56d709412f114321d822a3473b28fbe8ed2c24a73a40f2a0f31edcefe94cccc2f6eeb2b82035ca1cb844d13e3ecca2dfc7e3ebf49d3cca385ef34e566aa4bd471a95badaf501797c374988419254f9f96814b2ad1d874661732b9c1acd900011d4fc4389bae2e3d722ce7685359919a9143a4ca035a89d3c98c083e32180e648552b748d63547fda36e8cf7f97468598c756b358789ef367557a5d18bc973e6e9414fd9261965e7cce1c8abcbe85023d3c6b1c80baf1d9dfed05e96ede712f012ea273993287b9c80b3eb8aaa98582450789650e48d8f85f0611f036375e8d1dfcdcf3390abbbc292359ba1942f61b758ce2bd0ef98b4a026b940b47624ba02c0bba8f661766425df2d681c1450c8fbac6a7fa16d4dc36ee26a32c9aa4b8607a0419b478470000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011e143c8947bff399d6c9e12d8b72a9c30c0e643292f813c555305492b0948bc202061e945fd0f0a58f6ad38e978039dc1775638d58987912134da3b1a8bc6e2fa11b65742b67626684c5326049338288dd20b2d02a243be8baf29fd3dd122062d50000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e5ffe4cae3ebbaa1388eb07a5d6366f8f8715f29e34a536efab3cc3e24e85d44fcf819567e6086d9dbf62f03fca6cbf5fb9dd0b786ae2ae4369f2b793a1e5bf49bb40ad3bdb05d06b08156aad658aec9b481a1eed247ccebabae6a220aab6d4fa172d584ac97c9ff64933388b2ce2c8627e301bb3bdcec538b7f304d3df37388bceaa043ac8ea1c3718d6b2402f24ae71fee02a1db325ebfbdb8fa483a2385d452ba6f306ab6821e8116501377b8811b9540fd7a8df41dcd1054630be4a602fee4304e167a11167cddb7a385f6ec94c189faacb9c001e00c35a58f150614c56e6ac65763e5a77fadd06e46f61b9dc39a2c0de760fdde3b480820935eafa44ab7c64db358b7be4ca29d11158553b7e1d259b4096c2448b18fd6dc3fdb2d49c25e4444c195f876611e3d452077b4468251e2d7aff8b660788b3607cb092b3c22347245764832a5f42535976783e39dcc01c1b168c91221d3d36664d73ab3c749f09467196aba6ce28126a075200171dd8a9b942d3b2fd3b56f0bd13a1eefa2000a9fb41ceea9b8762dd0e8e7ad6165b59b690e8d1628b7d0ca5e5e6ae06c6a1646cf831cb9022034660994adc0aa299de1a42149c0da4d4d9ca2226c1987394c700000228000002240000022019dc9394e22a100fad2ae13e23bbc3db8a83f9bdc8281bdcb9b7d8492bc622fc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002fab32173a0ad6db3118fcd212452a09364ee337118cbb9285efeddcfaf64884d7baa2864ed8512350f32aa8f106e620c6d4348b0bd6f26a6dc3c56666a1bc82a4b35674b32c591db5603c60e4f4009069ebfa4c2a8ef7ed4ac26bc7cc72cf83ff90c1457bcc12bd63b8ad31a185da24cc2f3e9446cda0717abdca978e67b1343b1c4f46870255e20c511605961c6a262e3b4f1b639cc2557cad1488b6b2e15544f59cde458b3a197a41457422bb11378ae5ca98dc25dce2660cee39adfa749b7a9287cf2bc745554d91c1581e39df9537fe353d2c4d6d0453e0cfdc1da9b74e327a0759615e04eae124f5be80b41fdc6c694e45deaef240bb723875c1fc05c20bb1380bf0276516fef9f2bcbbd248d45276a2a2cdf702b5493d0fe71ae85b388e123f0d31ab28365bf015f274e49dd820ff995961d26be88df04c839807a00c19920d66573e2873f9445acb57f4cca445c32e55daf3b3ce80202e581615ac212c25d54a8a94995a87353d99174494fee6d9c6ba020bfffb91e56f7b555bf876f464a532a892b75c77beb9c3b7f636be49a19c9e60108180a2e5213ded413bbc616d17c5ad4878dd028bae510fac60297792a04bc45dd95589a64d5499cb7312000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020bc5a6f35b0a4a0161e88395ac696c830c1d72cbe39e2d937797b1e682298f0719796339473baa5cd0e171f30209aee4a17174a42fcf562aeec5b4b234b8a3410208650d0c57462a8df4569ff047a5925f26b04c7b1ee5d707a30de34c2a2f31a10ebd31dcd3f8e40de97ba70bbe2bc67fb1c9639f7faa4effe9b92f4aee0cd8dd00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008012145a1e6aed99837e5b49884d3461c9eaa8e5f0dcbc94adb481587836a7eecdb899b8e413c989e9bfaead4aa9b5470c1119323eb98c41963961cfb27004d96ba7103934d23dc81447a6186703aba480dba8920e288358cdacbdcf2eca9df99024f2061e4ad2e05d14782bb8a5c41236945f8b0bc46ab3d669f7f5c074a77093aadeac308c56e7f7b14543cf541238ef8526ae437ad9b7c45f90b38bc7eb65b0882eec7b2f3defc6fb46b8e7d0ef0862f1904cce0908a6702f728735c26997d587d34f61669a78b9851c7a40cb007970b26a4d088ecafb74670e8714282e6a5fe6a79b3f1f41ec92970d08b5157a93f2c453cd8a0cfac5a40bd032424177b5db82132ac0219d04066ba38aafd2b64d3693af3179f90fd67e9ac2ca0eeae1bcc653c3535c6c2d25d8616fce682bf37560b5dedecb82ee149fe0405b4a37a13d1026227de101191b6901c13e2ce0c642f224e2313e9082a866342bb7fec12ae9f595804b72053cb1e3084d1fa1c3f20b5dac9d64818febf8a554e77aa7c0a2eecf4662230f5e24c0364e741d21aca4cf865dff6925c4a4d6545b6c9d7799a183771b1e7d32e8e0a431d19a84943bf50b1629100b1c91c0e11f3aca797141c2280000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2b2ab1e49bd7fb335f885af2e68a4c7db704a77c6a49ffc199151d6ff4107201a770ceed2bda651bf279935a715ec82dc4c717d8a0c8cf8c5a3a5c58fd0421e11a99fac598b53835dc1e1bddad674870ea69b9c5b1633be79c0b4f296a8965db30df613034a734901365b316bccb746dc12625bca30a4bc1fe4b1d2c3b3b9986dd59dc649ade4b95f32cd23f661fd1696f14bcd4c6c51f4c5dab0eaa218e084a8f1796729c6ad3e7ee46f382e35f444a3e89ecb85281462faa1d886a175e2ddc30a87ae3874b9d079a0f3159aa5142f31eb3c7c6899103ce4fe465aa5cfc53b18b99292ab2760c4f94fef2e774e20a48f5d13a0da676e9d497580e59de9e32486ca6fef55ef816272df049541a7905ff15c862f26545be1adc85150d810acbbf1a4ff753e8305220c072e5d8cbf63c3e0542632181d95ca0e37e294c9cd350e732efbc159f3a48181c83a2645fc5b4cf90d984505067a37cabf7b943a6d834b4446996f436a4f53651010eb22684002483d6a05f9cfeca4f1b106372fa324a8fa1100dc0fedf1253477bb1aeb569eb18927d2055291eee86b4a535253d7f9aed1001434e0e6882c31ede7f5a0315140224d22325e9086bd10d9532a8c3f485800000228000002240000022005fa91574c164069d549bbee054363075111182976681b8b2aa745f44a9fe44300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000191ad251a87e61fdf5e3d1895a1c763ecdf1d05a8cd9c91a2282f9b46445d631928c3025c35a95e6aefc912553b179447aefacf080299ffc954b3dcdd2cdabb7e3e51864550bc63c22c4927a6aa011fdc43183e39d4d356ae4bdcb4300786ab5b2cd2c6e7eb3a72cc55a7e4d654d3e4b8fe366cb14b409b495a80bcaaae7aea90670661f59cb47ac3a9df3ac5a98ffdc3ebfd6cd8cdb1524947cca1272a953ce7129c7b9446cbe3afd1428a397943b04ef6478d5843524e329578ee0a16cac08ca5217d8d89717382e8e4c368f5af33cbdc4f8f05238ac37c26623fe451c9ba45a701a6630bd495f613f2680e11143053b62d6ea424456c1f2e933c51ba26e219c0352a0ca9b9ded235bf58bff81ca8f99be8a1c2bd6ee70ab6a69aecdaac532d0207ace9922d5efe50dfc855708620a938c5002b75cf396e975ada769e7fae73c1aa330d40b2a0b2f5fd2c5d5ff1fdd33fddcf514c0884eb14568fd751fc544be275a3f34175d9aadfb7a404f53c737c75fa8257d1ffecca149e71b3c6c6e8cc96fe22216e79bf7cc4c0237a77b32b426d25ef4219864d581596ba5ef3c86d351d4b964e0a98f455eb13d272cdc0535ebc660b457298395bf4b497741a219f7000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020244d18cd12a6dc10b795dace30c26a171e782bd23e7dde3ed9bf3ca534bac070c19b08977cbb25ae0bc4309a063ae16c3022dce3e26fa99958d9231dd210a880208751c7398be8fc02dd89fe03be5db60f596d2a7df2b4b55048b1751b07c72a72867e4c97402b81fffb4148a0977dd051787eb52026c7c2c043edb463c29bf6e00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ad473d169b541cac21c21375d3b0b149c6d5851f61a055690dd7d91165ee9d55b06560e741db6d588c2ec1158f1dafe9bbc506f2ad1bb2f217afd246ac03c96c88abf1a28d59767e95a96706d61406a208411ed41a16b65cbfe99ccdfe9d688d89fab4815e3eb739ed7baa4c831924515ba1505055939d9b587a0d88c6b909adfb4a7c4486eea8180b22840dbb4a41e973a9a38e93aa298a1885bfbdd14d05efad8b021c573f3bc5f0db45d7abe6d88702be3086678c8ffc24f359ed33b30df702d3e8689ecdfab2aff6e64995e3f030cbb8bec659a03940b94b8f606c9ea1ceed355507907e17ce5875beefc601a1bb79c0c5f032afc4acc808173704faaeb5351ee0cd616c71bb8ea81f32f5b62a4da108f94de7372439f0b42a6dc176c7c2ac9b6adacaf53d72d2f0f9787ff29388852658a479f7396bddf22b26692c1cc7ae14b85e797427d91066ae88c2712973805c21e285a612fa368c8b80794de66266493c37d4d54da07fa9893a0d7c5cca028f13aa518f4a23ac8e72df66bee68fce3226c6c4ebf9eb71acdf6262b676161a231a671b8e4b86a5e555a5bf83a3b5397f2f2e6ccdbaf7f962f5b8eb0ce939ec89e9fc616754580cc552b8b8bfbd70000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a75e0d8e0c2fc0df27f138b6538a83c3d88eacf9044fbebb8600dcc5ebaae0a302b357adde3207b51b48e5184f5a95a13c52b324c701276852292149735361d1e3266434433f534900c331d9071c282f76ee5f769e040518183a7d08df452ec4de4fd689083fc048f9cc7a9f11e6b6ad3e164a9987a6fec7482750e71417e1ce7c380998ed2a122dacb1ff37e2acf731ff4939e34f5924271dce05588f0d5664bd518028181b672d0046bef6cd1ab056e1436529731359b3b320b307d2923db0ed9414cb1dab71ff5fb52b153c5866c14371d05012b072f3edbbdc2164ca1647794aacf5ba4736a32d4b7f481d46ab18640e76442bfdec0c02786f8d294e13eba904a47e602ee7be2a0bf7c8e184e77dd7c4990a3756555d2e316c3a09603e556cf3cd2d14e5200ee9f0eebeff81dfa8f8be6cd455c4f172bd243d1463e35684d023581a4d355efa7f0df59ee32da90fb6f423e5ed4fef0a6e89d76b913ff46ef7458876f52fc45441f1ced55807531ed5fa6b7b010bb7681825305a085b6e1f9de2e1e27efc2a3151fe0ae9ebf2a9639eaf34a589b16b09aed768454a19057d8a45518b4470e0888ce0f34e495af0f4a2e74b316274aa72febf7cf7579ae7e000000228000002240000022012e2c17c05781a2bf8d8053bed8ab841a34913110853298244e4a5ae99b486ff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a21e8aba8e599955cfeb16d6cf5346fe375e6206dc9fdc3c67f43173df24e4cfb819826741017c810bee83c6b00b1c91dfae5310682d62f9bfad86ec097f30620c97288f8508d3de80280de984de6283216fda967878a8ede781097c9e47ccca0cfd51c9fc39e217d4b047b68ffcf8ebd58c7a3e5e1b404fee417e6af659998c0131d286605a6c1efa740bc4a6cba8d149f2d67e316765c870d67b744dda91ddbe97c6eab7ee5068fb233b08de03bc759fd3d283b086e955a77da7fddb8126ca3443baa27a802d6edcac40562ebf6a1235f246cae7b916f8809beb17fc1b03513b5fe0e44c35ea9efb9847dfef192c067fce386855a73e2bfc35142e3050827a93ad9a4fb28850eaf4dd39eec782139d4c52be698956c584ecbf509e58c5a126bfdcb7faab50334c0c6cd7ca615300e0929e7eb38fb5ba9ee1e4fd7a5ca8f4c536e42024eb21c0b2b7ce8052d24643ef88d13da7e676ee90269bd2fa1ac31adb7b277b4f0a0dd84cafd3b108328dca29c517ce4aa944f688c1a7898cac1da8c88ea66334a363e62730a03f70300bbf942a9317036f04cff7fc18ce76a418eba63d4ff0136c7bb64be05029030ebd8fa9c3aa1651747d05bb5f728f3f08dfc59e000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00214703b9901e29384b3af28072604d10b234a1712bdfec2872ed127b143b8a14b09592570ab3a13010c4c950d980d885bd1050c10a0bb0bbaca09176425b2eacb020a40a00c7358a67b754694acf92a9647b55ad1a58e6e5ff78e18771d40336f3020fd06f46a1c22d85d01b02f29368530e967dbf8f91b9899e20da36e2490775800000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015d55a07296a8aa67e0a145963d542e159cc9ca6d17c816f4b6a112a3e4c05957bbf2bdb178fe55b67a17d2984413a4b070ef27b6ea21bdc162e869ed671483c115083f9d5e34e478936e68b6578c2c5b4a60b5e28078a5a31f60cc96e35c9c0f81a53c94566baa1464bc3cb82385048b7ce0d47e696bca7c539436f087b1fb4211b850a41f5af8bbefa22e56aa880ddd8b084b05cbca8d1635f177f12002c0e88102e20b2283b245d3216e520b6fbd6677a5579e9f2b2b828cc3ec47cf37e4f96a068b238450a32049978cbd39c0521ed842d6db8effa683b07a9ec5d39c73621d784dcdd44151a84e435255b498325a4b95c590ba0286fd5bc7ef70c0737fa7f4f466543e003c306af94868c1471ee3dce91d109c312b336920de97db0ef5c1b2814b2bd1a122b0f33ddc609ef355fd677439753ef53495db576d603164c2374a92ca8efbda95955d9cae97e55395963dc9fc6792558f52f3f7db7925c9b1b4f876646d7cd0b032b2c9603ea04e5107790656d8feac18bd3f919b2021cacf5e039f61e56064a0a8d826e88f81753194596fe9a23b5776b5c693a0c0041ef2fa4d51d14deaa49bcda40e0c4aee4f3258704673d44fe0ba4df0cd7e1ce3d842a00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2b9b2b204400d0c0edf0325c553ce9848dab15c3184a429fc31da050edbe41d03793889af346490aa33b02e3d7242c6f6dde2a29b6ddc805df68c06e9ee5e8a70c7b07979815d053891579d6411d713137db2edca50ce75f669936fbe865f08200770c2d7e4e9bdca8119734b09eecfd9dbae0611f563093a150cc31e549046b06f64db2d75d6a1df86b099df3ebceec8648b3518bd7352f21d889e00c6cace259e85475d43f7ffcf334eb44a4c56fee24a98984b5f0d4a60f46979db453fa44e0d2b2fb8b4da680c7a46938023d747ef1c6bd4dc3ccefa815ec6d4f4e18625908236c76530c67e86794bde05261f24d561e206cca1f4f9e876bad17b2932be7347112fcadc6b6e973219747af93ae4db1de3414c02d9b8cae4014a0af9cf4af2bc28674a4b61e03492cbc4928796d148691ea7bb94e902f3aa34c8b3b5c8ff0e39a8b8b57bdf41fc3745990073c651cdd377993ea7c3c4461cf222e6aa9ec94b8f6a3016ac6659b63a201985e15b4db7a36e7f621c44eb17223d4daf6f1fd354f4400e71322c2d1497145fe21acf0ba0b1c6b4bd6039ec0db5baf2169cac1f0e4a516f680b85ceb6aaaf530300ea9f91c3010a4b13556e4a002c2d46e332b0000022800000224000002202ea8efd4c99c0967d4057b1d1419cc7d8d0f4573f4a0823cf56b20249379f7050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c8febaef07cc38f8531c809a2400392427a938ddfee40bfe27bfa71526832c9765ca67cdc3273dda91f07d65aa6fc89774078876cf00ee62e0ecbc578b25eb0a95b7f11802cc96eb192bdbdf7efad91209eaa41c1ab28d4f771caffc7c010fd8acbbf255857a7ee00aafa5601dbaf3bdb75d8b78a43b29e4a4c2c53e803c2c5f6379aef32b7023d8762f79fd31ebef72d3b484327ebcdf5df6c7f85b613e7c0f4fccc6215b1ef3f7061b6167a7f1138b0d1596ff369f51ed8faea565dd86892de566170a7e8c67a6cabd2419c7d1da7df9703fec46f8170047ce548d66eb70a42ae2e698a11d343828d8c8529ec4aee6ce35fa9673ba1ebfd5b19f23f32b41d17a059be47536c48ad305671a455992485e098067523744014da215dadebfe397cfcb5f3b94416336ddc37e06de09f880aa1d7fad06399fceaa8c08557fc8d359ed60c834ff85158b1c9c2ea9c8730b77c192559cb6bd07cc80e628e88acef5768364ef4a3a04a8b3f90d058c25aff9330d94058fedd08bba33a500b4a499e2ba205e8db4a4b19d04d2fb8ff3652df20d1dd085c932b9f6098e7f443aa3073da644eb6c677bd5b7f559b6a68eaf755be2797c3eba116186cb2a38c99dee1f08000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400109c09959992a4de76c140bad9cab473ae1bc1b6b2598e9ddc49c4b4e3ace9075020be3aa06cc5e91f68c7d6a8ea213ff4959fd6063f1ef20c4182046300342f16f2b19e945cac75a40db91caf8e6acc44585cc38ce835119c1f9ac84109b2530640000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2965fe674a6d117b6bfd8a9bcaa075015e3744a0779f97853c62697d8aa4b69c71ace7a1d494824d04af6c2ae8a422c3906255766677d44d711fd1a64c78db42bdf542a8dd8e33181fec3b26cc4ac1fd622792876d2feb750dbda70fb2ca39a238c628d1ab3e596a8ce2326e0ff6a4be0da57cffd7185827b27b90fef6c93d8fb00d698e7e4adf0ad9f103bc362f2ae27815fbeea7607034f029506eef6992eff088fd7f8097c63f12b99b0c4b054d570190aa5252ec3d8432470e7f2305a149e1076e09174a5285937f6603823db3ec1795d519a8f4e4b3ee6b920b2e3b370f8fa6c7d14bf04825c9f026bec5997cd4f0ab14d13bcbfaae4271db0a1cc5a968b0f693521ff65e9a670e2b431191774935e6245e1192d79ddd0293f37169817c62d6337b5cb0b7ba896d0b3e10fda146d072a7c080af053b9eebe0352a3f85e3335ad86f588f77cd88b30c8b8a6923af867fc88dd18d51a7f00251cbba0bd98cbe3fa6badf58487a987dd8833c2f4b5917a802cab999d01ca5321a6b4c0904c23a750920a8878aed3a20f08e979ed13bb46fd1516a2d557b77640543ba34faf74719121675b2ca916133c0a29516e8faebe08183413863a12bc9e25c25c7b90000022800000224000002202f3a90d3127a12a23319c68c2c8c9aa38961fc8e68cfd7e2b6ad94b21f71ceea0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011dfd27fd8322888f8dea81458dd380a1484f40485f3dbef68aa6f7998d9102f3bf43154e45403f288969d4dc50935c8f7b1bc8d69c9395272c59fb460df92eb5b66b0dc47dd8b577a7349b0a2112586b8d26fd6b805fe8560853ecd51cebe97965ce65817f137fd552010d4d8ad916a006ceb3a00ec315f184ea1d29ee994e7ad8bec84e7d19ed5526386969d48560f7618d3b8828e40271d72ffb544b45441cc9f262218dd68d64f1474cfa307e22ab602ea8cd742a8d7532dfe2bbaebf0abb5e6d616cc60c6349b3ffe31f2fcb385822e138aa4eb67b3787dc08fd46b863065a2037e27eedd197451d5ba1a52bf6eb58384a38281bd1150b9a9963f63c7b21ab65bade4bdfdc0bbca24e4fe6311865cdae8895441c2e41ccfcf3d3f636171edd99881703bd1c17d276ee17389d9fb93acf6c4b09ccd41162db2e3b76759d7bbae23b01ec6f9b8aff92fddbd32df00f41d5ac7899f6d89fde57f9f2f3c33b878da8046374b9cd4923ec2641e63f9fdb4310ec68ab97eb14aac20507c7e40ba243d8c4504661041c3281e0e7c6cebb1e587a04a12401cc5662cb0772eae44be33a094d0f9a844718ff876801504d1c2e232fd6b6c391dd9f39057886006111f000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00202455c9c0a1ff98a5ad79d02108f7fd00c14f259bab22308ae94eb263ebc9dfc2e44e45fdd39bdbdf9e3bf9c7f610a651054298996955c57f3af57be2d3ba7d6020cb49bcbbd0de83807cd99a952766f852ba14523016e9d2f34110601a6537bf10787e6d35a99261ea7d4d2a7b75f06efb7b4ec8b892fddf1b905fabe5fdc96cd00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088833756361d954b571253df929697c772e398dcb518f010dd89714121b5a920af2c6951c50aa0ca147c9100f19d80442861783285fcd150e3dfff0c0736351e1eed6d6471a39f5b0d124589ad82bb7e8fc4a28cd22a07206335644ee201f0841dd3af86cb4bcc67781f4ba4b92567cd412da403e5ababe6ef9f14e666d2fce120e6c7bda33956461b941a9e2e4a46b38676e00eb2e5096cdd4647c2fae3ea066046643b53e03986df2f3991f6befb09008a8733b3a86e9b9ff148a1e7ec0e5efbbcfdacbe892e5ed2e4e04cd67e260ef53a3cd49fdf18339062072ed73bb13bf4bc08f9f7b723ec86d9db60768e2b4e345def2222560507629a6633b48e7fdfa462b0dc74433d9f3d7504772740b39464e4da71edb78af0e1783b33ebd4892f22881c52f3f351ab481f43ff42305c4db4db1780e036006a8c9573d6f8796b49308eddd11705a5de2a3a15fd190d21434a0c6edde3f6c28e737a2d25c44ebdca576b055f9bc7bad06e7266ebb3fa9e2d06caaccf3c43392d56ee31f5baee2901a1cff95596b77fa1a4b25d19a5ef947ea9a5681a232e5095ab6d521b7a8c4d59b5bf6cf1183c942b940ffcaeb21ac642477f2e7aad4186fd05da513949029e7a0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a43d56ac7869eae088dd997851ca64f315c2c87435089e829902609ba0ae85af07f70f0186ecfd2113dcf225586f7ecde1bd7111b8d30023ad7b728ea775d2d66d42e99568e8c095e809d7daf37d81f933f71eafa4e6ec12c943b42274276957e0f0782592ce73ed3ff49a3c433912f277c44a7115b0789d11ac5ced371f487e0ff8cd3eec1d93164207073172ae0cf8c3e92298f6865a7184e94cad304de83a0f76a463e34e310b67270ba0eefc256b856d7ddb2701de3b946d7e02da1ffd6fa839ecac1aead9cad41ef85724db2b4b172b661f725b5f155b475b231c32bb8d0aefc8ebf7832552708c33ec203a57b44775d61977b96929aaeff81a15cae27df83b8a2b6aed79049da95ef783bd1d6d115d79c5068e2f9edc28c65a251f99a7d76dfbdebb3c9f097e93da10bb5cc5ea3ffdfd9bdd02394b0b76d506392de16479f01a29434a23cd9322a9104a385aac6327e021f3467214d530bc032394769a1ce2fdd4601a8b03f8167f3428fd9e04a2df7bf24fa41a10f1d33ffd18aa99b3d362263f4fda3a9c1c96615ef546dc082f2e9c1a5578125746a885d1cba43a75f3dbcfa66d49266ed4f45af4e2338f1817f9d09c69120760f063e8db8ea83a650000022800000224000002201449659c4365d931857d8e602acee1c10f155e31322bb4c46f5a8bd4beebfe8f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029123b869729f1edacd30fe0ab38356d8aefa2c07e912be1b137e69635779e88e229af6fbe7eb7b2a53a5a15c0a41025fdbcaf1c463653c541f981dfdc1b4badc0be5f7f5f639136b7157d16537f20ebc37fa74c95047b9411474b74c398f9b3084f07bee336a8d47f3ee7ad006896dc8f3ce30a20a8ee6c4ecae40951f68d3f21a8c0a87257ae264b2524165dee5eabce1e77851ec105ee1e0b37bbf2591a33ed3ebf199f4b363676b6d99a142bb072359218c45b30b8091647f8eb26f12adfb692d35b252221089fd4aee0ed9aa772cdf5604156dfe825da5e2a539d109e4d1fadc42d18c7215eee1fbd396f60fdb5fbc2582b604c90790d4ebb7b088c133ee3e70cc3a96f94b3b79f2213c0ddaf0e522abc3ba1e129c87f0c922471fd9cd565efb4afb30b3faa1680d3bc523fbfb291412132145f1dbfae1d5716ab2c2b6528367dc8fbb994ea3f93343afb288ee7833fa760431a6bfeaf3f291a398569b45fc89cd5d200817d8dd79db0bbf830db4f432356c1147034507ff190855aded40957acb254a09d2908e22974388178580b817018fc241a5e4ec68626655851f4a5e0cb11ac11cdfe3be82216bcbffc058e7ee6fd3c46261999e2acbc4af36fd000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010d34c342053c17cfc051e91cc44089621dcb8438d4cc998ddd757c5c4ec5e5d9020e4701a4ba6cde02bf99942713c05d5a3ecf3c57db7b7c09b5b9c5fef2bf2e3b1b5fed4ab190349e9a2c822d8c14e0f857103f16799223c5e4bbe462214f7ff000000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096210e86e6a882258322a030655b437b7d073464a585cb57a732850978086e41e251c4698ecd477a122d3a2c52b81466b669d084037d87ef5bab253e4fe68cdebb3109d9975c2b12214d995f117d6b77807d34f117319929ee68d9b9ec0df5520b75c26129a01b44877b483683d6e26872178191d224c7e9a0cd8e7d1a7323fe50a26bf6470ce8a62cb628dc073d78f93a9932a52438522a59eae2d3295af5da2e3bb0872c0dc22e0e0a5edaec0474a15c7da73585115fd7b8a8a794f2c864023938e63957271ac01d5d6a9e18b5725cef1519be197fc3ebbc2be5bfba7102b69c6fed9ea8e85ff8d9fab7454b2326550f13fc225af1223435784f08fc4c6a6ca7d4d4574bb57dcdac7138cfde44abc93c2ae1114f3b58af8237ff48c02e24dc5945850c2e09f74ba4a25c0947d63dd94a72289a5a8299779f72080a04a52cadb6926a7913d291e638b9d75b2294846131b537d5bb625789372880f405e93e5292440997b2310b94ef34505b966d1e7d5ef35400f45cb46e04a22ed1ee4095142def85298c0213c166017992b453d3691a9b38258ab55c0e64ab869def6768c4c26a1979f55b126c3560f7ab4fa7f4c667cb258b8afe948e1c6b49005cffa3d30000022800000224000002201e4011f3b1dd372b078db8d6cfec7cbde326ce58c899e8fe4ec684cebe8bd2da00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000884b04a1b422b373764c94cf2c04ca9b5d8809a2f3bcc50629b062f198bf1a62dac6c0de523a6970431f9bb7cb4181a432494dd0367f7a95bea37e1ea7dc5651f4aabc1f179bbfe68df2817d04e03a764a98576c83c5798cdf820024d20b7c9f2cdfc79e244b271fcab4cc773baaf4bdc9f94d6db957907c17cea7875f8fe97f052e5c16cbb59945c9c5256a24eaeda87d1c141a857b03046df180d53f0e47d2eb2705ae3389318aad591041f9952abd76fa9fb8d3f8d71a96abc78b0a9ad3c32e6e2b30e7f4949d28a59ad8cea22c2cc5f20e3f6dde81ab85f32d81e11ab74855f6a51a2e8ece80a4b7fb3f10854ace09487e524f9e4c83d3598635b932115520a3d73605d6a5018352cabca4237ca5035f56e4c7479cb8d9b6e3824493fb0fc47ccc0be40edd1cac82c005a263e480f14311bf826cfbdef155851a5484c25de46744844e18f6f27807096db198b46baa8166ca7d5dd35dce1c17a5f3a210119fe692e23388ac87cc67516c7fb2acf75d83ae56b6941e5b63d7c8861a90b213c0a954f8991c46088ae2d2a995f5aa3252e6c07f73d98e2898b909dfabca67aa5607355b2cec4b7aad3b1ac7a15b6c0ef35348eb7e346ced7838db617ce85282000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400102ab1184bd04d7e0c18313e5f8b1ade24300e372cfb8b9664d0831560d2513c00210430594ec9f5bf1aa936d517b00b7efe8fce115ca926c68d37b5becb12342442eb15270dd50b76b7127879fd6eb72cffcf9d80d2d8ae6674ff68f3c778c6593000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa8aa5eeb28a807d6fba7298bb2adc7d75db9f89fa7473ed6acccdf9f9631e5128d34243751c2ab8fd9c2a486b1aaa0e50631e2a270ae32f846161a5a9686394cfe09834ed77b3ee4429075e1fb937b86ef51817ab05ef590874b8729469596cf138fc761aaf8c7644745e32c515da20fc5f0b893fd08926416fffced684d238ebd709063092ad98d2b29521b72316c2e8ac84f2fb24cf52954652188dd1303a293b829a01ea402d7cca2d1a2272a440c44f0e4108bac0d3fa5c588b081b68bc0b6b102722cc208dde96391b65f9bb28fd90e165606da1f9dad1a9cbca0f10d351c8ae5379ac5164b759393052c108e017991ca38ae28e565cf29aeaf576a689a1e5fa8d599ef2b490665e8063888ca177275ed8686bcada3d13fab21e9b028f9b6b6c76ad359bdb2c46b98da71f3bf7a0032b77fe3c0e66a8ed555d57d048d4f0372530287186137221f0b2eac440677bc4cc6fddef9564e2373e6b01d135d6c3faf04f2f2cb7ce204936738d57eba6e1f9af81bb2427eb0e35dab6b2f2ca408c2cb55d2942e11434bdeeed9c2c72a5b72e9505616ba8166c5382d4e85d8247640db0517cd32eb161f5402854f9351a5e89fb6b2d1b58598598ae55765f39340000022800000224000002200950e0e2d5580b5d6c765373ae8e3a4edce26dd815a1b299e1ed98235c4ac66a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087070b5d414da8d65cad0d4941a905bada202fe263084e1aa9c1fe409430fbd66579a632ff0f0e5ba88d7c5e7070631bb99a7a09979470983d34a253b252bedb5dc1f0348af5d1f101fb134976a404b8e9c977c0cf073274b6941cbd79f5f6bfb7cb8147c85ab41f01c883d312c4521f39dbe90fb7452366b4bd4040dd51854e61ab64a3ef5d443bdd2f8934b63763f73502a68153d2230d0b89dab4e95ca79299a774ac09d66d43b946a7a20ed56ee721c95d99dd192d17c7c0d5149417b35d9e7c61869c825c13463fceb43a0ef6d584da77503c52230f47a5f917e40cd54f57132b2d26109a9cdade687bccaff4c8966bfa5294ec39589a8b24a9da13d6cb889ac2d179658868ac55e121110caf34c435285cf330448a3f78c419315d6f642f464c0f4a89885f0497dc17e7405e3cd1a5c0f3e191440077b07fb526a62d853addfbf91e3cf7e81c32120450be4c650e25ca12a1f207fd50187725ecd81f7763cdc05dbe9eccb1ac1d7a9a1f534b133bef2f2f31461879e7077714f5ebd9cad47b976230202f00f835994427bf81fddb37bf2cca72b267cd37caaa0dbd2c16c16ffe7c1bb188bfa5696a38480974686d4dc5ad709f3fe6bdfb124e319d0491000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0021614e4681f830d172a7cd32aaa250888214cb072c1894d5c58e77077b6dc020115f3c1ce243f2634cf5edec2067447c78c9be57e6a7278d7d9907c97805b14d802148f49bd9a75f44e123a845f4f580caad4553b3b29d7dd0f82712b2f3f6f55111bf8e7c164d8f28c96f4a252419acda877ede2b94fb7a378cf0031b27d5f4b9d00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0d27acdb07b20fad7bdb1a982d5861e7fa2c4e772a480c20375edac23e764c221a8bf96bc01aaeed2788b9b9b0e4722e4fc3fd4d98d8c72a35494a69d080a456c87afe91696faf1b69c7ad829ccc6608f5e454169aa4de3d6dff3a59740b1db94f3b156f12787377f058179aff4bbe583e228fb622570eaf8c8f32fcb273afffa961ed5c123eaaae3fe732cfa695e886220d81320ac7a840802f2d30bb099c173c4b6d0ebfb82fbaf92b99870c844bfa22b019d92d3e5a1eb24720cbe89d5265fed169611e6d3c43bc4c5149ca1c2de8d5c6dcc6f8f2943a7349f7aa3d490e5d1b417d36d3e4632920c6b21a32c9f23b8fe912d8d699b8c8045454acecb0a6af366d82ac4bc15093c475422d278e445e8cdb5497fe2518989a50c030179263907fb7c40c605a2f009ad26b86a20ea4f62bc672a1fefabc21885a4e7e9b083ced1db0ab6fc163cdf8dd6ed21b9c3410f740efcf005788a12af4f3bf9ba46a25ef3f25dd4dbeec11bba185c98e87bda5faa5b07ca6958886b3598fa70dc6b98c2f636d0d7f8814bb31462c45552b4ff418ee87127b048c2773ec1ae27390af183638f94a8f138f01470780835cefd306fd828762d003c1f41dbe3955a48d48ddd000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021b6f7a37fb1918a6f33c0a9ebfe4e97454f5aa5b9ae304ea0a5768e8d56343b891c67c64765fb8799ecad88dd58a4fe04125e9f30b1d87acf27fd12f5b9b290b3d14a980efccd1e8b282765331b9cc94c08325f077217906c5196f51a4a9785faadae488a6f05f959b7297054af7896f1d2815ff3acefb8fcf331621544d08cdf35cf6d1e52ee7324bf9c0a456b9335e1f26d019ea7856441217492ca1dfba6b1b137080da2731114d7b47fe694c26fd871f03c37486ae8586e25894f7880e521413e790dca0e3ddff61810b18b1f2198ad0078f62e6a295edc147e11592b6d649de7fe58d37a9352e8eed9023e964921c49b8588e1dc6b81bd261863c0944a9f870017ac669cf7ccee0d6ae1ba6a459487b381099d73f6f5f0d9ba046b04b711ba15a060cf767b1f0e2ff4939ee421d2921a02972a799e638f836f9d4ab8c79d689c60fa28068fd547e95dc40dbf3988a4252cb1d48620178db79502961f9ae4fa32f84d1be3228c1aa19429a7e6b020d462251516679f7f5fab08704c07f9e973e5bb47c5d6b0b19d5b05f24cdfe3d6da4b563eea22995c36512ee0017bf686f08e5a6899512a2c4f063a849605092ec26320ca858c38539ba173bbe99df90000022800000224000002200b7090972bfb6cf10a750c53eb0f2810ed8a73b24e2678b7cd3fe8d4926645d3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f8872ca0f6accb93fec72a24d852853d70830b25c09ed5ff2343aca1318c613d8c8d1bd06f75040fb6147a8f258c601d6a8f866d490ba108946cfe993cbf21ec20f95987b0e925052343783c1454544a00422d59c7202ab77e73fbd28e7be0eb24ab5752cbfd5da66055a568ed8f0cbdb94b6d86a3d78d4926b0f8feba6de62059f6e214a40e7e14ea102e49ea63d4570c6c0472a6c1b00ba640fff8c66141497a76884ff1fa0d81b03bbd5a94953e38657f725d6fc16188fc22a89fe5f21b3ff3a370c550c308a436be086fa61661da765c07944e5a521439bd4d8ff24b94d7b40cc32bc97da635834d8db688a8c7610306754848c2aa99ff40448d1e70a0db72767ae01b1ab0ff695b3bd78dc9b00fd9677027cce1e21ba9b47d778c7e223bb2b90736d68c1b8160bee1b014cb93a36cb86f6325a51ade288198b54960f5a67d0008c6ff71ff2355c5f760b95426d0edf478a7800f65b80940ed385273d8d07e097ec6567360223e619cd6f6546436f583475e82336c8e442a3ff39779c0182f777a9a82c33ee2b513d35ebf2a053f843963b4ddc3abda3c0ad27d008a086e4766e5e62c97498850ab11477bb6f3012c6f4416759e83bfb377432a693731f000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00216f6044d5e475835d31f8fcc6b9cf837f69e3139311bb7b6f7879f421bd50baa0a244b96a1844cd48e910e782ca82843d5493f19b292c32ef60f4ab0cc328c5102168bf77c77cbbfb3158f38198c86528c6d5709470f621bf4fc0495225e05ff1c12ac409f7ec80f7eeacfba6714f10c77c9e436658a7539d9eb3dfec226cdc8dc00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a707d0e6affe8f744f7409bd6afa55b0f4cdbdf896cc466b488d75cb5c5bbedc03a47ea321395eb2d0f9c22f32f49444c780e58ceb72e6b3a67872daadfd2214bd9d23031658173cd7c9d46d9596026348ad0722530a9748b87da68428d7aeefb0d2bbe0d8f43db3235ddef23f83f442edf06bb354752708678add81dc125fa49b7c54f980db0cc04c7f4ccb8ce1d76931b7a6205b8e0ac69f0b4940f79dde07f0bad6d0afe98edec16b857d83c08df6e48ada7d9d4fa3575bead8dfcd062b26c3d97bad6f16d275b08c41453c7e760502646a7d9c433b389ef045015637d647a5083fe5e69c7a7078364501f04cceecd2e4cd9e2e6c584dae228bf912631bb958cb45f259a8c9f7b1fa7dfeba284597d61b0f0c0b61ca15dfcd8a7e332b11eab8a2ee35687729566865a67c86b6e44ca3175b42ded97fc638dc4ec9eddbe066471a8b6f4ce9d4aa6be7338a8a7f13c395e7a1ee5730ecf7c19fb043006be3cf63d1b15cf960c6f22b807862777bf293c37f691ae3d329341877552703b06b749ea8f297678b0d0b12d358ffd7ad5b923f8b89d636d2232cdbd4187de5af03017b6dfe88ebb132ef1591251c3318da59f5748415a4606ea8a1cafe1f40db884000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a6748b0600064b48dffbb3d3a6c8ebede41f30d994e6c88078e35e062a2e40b8f5103b0b7eaf4d213be062a41d0b980aa79bedf20fd7849b770efb9f9c72014e326e4dc3fc73012281aef0616038979cec88bcdc28420cb88f3211d07f1f9da0c65f196da501a6fe21a927809eb47bc5611398bf342d97f89c5443c13461dfef2f21e7479e4426f07582aea8171499d0a0d44d32f9e495ef48845c7a37d5028dc08d23164192add6e21b4c773202585010325a7b2a706c5fcca7dca1f26dcc5658dda54e50b2e6a4e685ad1e21b8a7c3635430d8ce090a17ca32ddbd4e643ec63058900d742080fc01eab5a0fd2f4700d2c8484c06daf77deebe9a212d2a307e69d1a42e4de01bd5134cc19c440f115d196ad82cb8b626f53b7d60db4daddc19f7eb88fd9a156f265ad4f89c62accd7cce04e63c064d329cca110e86b5623729bc4d8c20f4527d3a28415c7d99e34d9b2ce64914c9062bc029af607a8e1693240d4573afc61b4543a7e773b201bd332a0dba5398bac9770e070e4b9be07a501b864602ef2e68763c46595f9e65588a42cb8c65f3bafe6368c8c30ae34fae95fb766413d4348bdaec963c7c6c1791dee98ef8f10d1cf06813543821ea57545b000000228000002240000022015b850d712bfbaa2beaa5e2419fa105d9d856561ceb4338832379b780e1c0465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fba237e1ed25a54eacb129e750779d3b3cefc651476c7e16faec7a141c6649e084abca6983251539dc9468ed41ebe98e588f6bc8cf50315f53a3ccc720a463c02793573c2cf74901c86a0a9d5a6907e6ea512dfe5116cc689fd6139cddd83a7f8f3a1dd0a6f4c2d460c3316605e63b4e9bada82b959f18be450ef7ab03c5eba24d926b43791a48f222667d72751aa1d28b522523ee6521f5d379435fc796e487a94b52e5b6155efdfc7bc5cf473eb761a6ba32d97cd00da8faf5aa6c9a8f578da9c0a40784e614ec58a9a154208d741fce21657a4de9063f2cb68c592bc1a2e2aa2a6fd939119897fcbae8e6a1ed52910eaf4ca2f5ba405e0534d2d54c200ab03605a1d2697ed7781d47ba48f32187e12fe56f5c053ff94e0f1a77f889ef48b41038518a0f7e2cdbb71887fbbf1b07364fe46706d7599bac06c8ef22180eedddfa9c54ea8ca15d3472fef907379bcdcae661490ae86743c28a8cd1ced4a0a7f77585bcbce7dca50eabc9c40268f9d315df0908226cb78d3f77a8872778bbb20825da4b96de788dc0135a988ab93017f42454aa382c4fae36d63e45b913bd6af81232b835846687bbce81c18bb29fccc4dee99f6191546b93b74f8393d3dc277000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00200c862493492ea316abfe0d737484224551dbe11cb3fb4d5fe94b843a81a61151ed70c4031f7dca44b3132621f71de16325687737cb3b58ebca95990878f98dc0217409c4746a0e5a5417bdb4db388c786881075533d2997e6fcfd5e9e79ba519d248111079a82a543356065fae5da36675cd8ad777017d1cc635199e60464d6aa00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000222faa0eb21fd5e4d6939b88c07f845dbd3ed1f853fee76959bcd2bfe6d852e7be0a3b1015573324633240321482d7ca29bd5e74f98f7a3a78b7bf691dbf39114445a97e6f308c25cce63496c72a96e62955d9059a364b4116d4b10595c3509856dc31c8caafbd7cc67a56799e79ad805547788a29d10c3016b8187bc37b8820d721e90cdb4661dc78c2dfc10bb928542798e31e691b936f4dbac088e70c041e43de2c5fbb6a0cf2337f57f6a6156b5f605be3e9ff801c7a7eeea532b0fe917e349fce76d1a3b24e459e2aab2f78290db2dd626d76e131fe9582ce6d178447ae14f401933f207021cee0bd9c51eeb8715c9efc0494da90f85f5671c28598cb570c04f775e4cf5c9ea51e9873d51bbb5b3a02995cdca6f71cb699500f64bece734d74a11c71acae60860ad93abe755b834cff1d05e156c5573e7df27c6b882c62099430beb8e67ef61dedb855060d00dc4288b776a51d159073453fe1b73a1be0bf335f5bc072b72f5377337e72fd65db1ffc387aca31ab709574b1c2235e322729f339814bd7d6efc9f0676ebd951c0d6cbfba131ddd8d11d2b23b9335ce7e02f2b0163b11e0555363e3ce1ab07cca4f71124571c424ac2d31b07b600f08e226000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024317c19ba3d16125a1169ea30f4c61f10d22322e883907d484f41adb0cb008dd34063ee740e255f88cfae29953630ba5ad277c5b9c61768a61b81127d8d4423e00041332948377d4a84b69d0ebcdb52e8d485e2e7842e05aedb9a994e26e042ff52e7c6dbe0518cd182f3470b305f8d4d3e220559b8c1eb2dbc946d3b3c1051563f0857e03edea3ce7787a472b2de520fb2a3b1dfcd335c092b2b06c0c719ee1d2484e0e1034376a676a35f341735dfa373c4748940a5e103cc561049a264067227b9b5761e6029d98f22a04ee55c51514e66a96248eadff3a0e8fdecbc7fac4467dca25cec2b6d543facbcf30bd1f965685a7f6c033b6c75b20226516b530cb24c2dce63f40553681480c8159151733494c8eb07a9cff28420c06ec4287adc20cfa10eb5020713b847ed26dced5d76ef94e78336d396fa7b8d0856632c77c6f21feabdc39c3f01e1f9b75acb93405a2a76e61818cf7bc408f9c69d31f5b49c073bd5fef96d1d5583bf6f38e3e3034d2d781c2774c778050c005f7e8d760693384457f3079b9d83028d3ec7059a4325f7df137d548dd1a2e0aaffe2da246ac2ff7508062680a28490dba1072623a5a5bde7a7db0fbc5ac139ba976ca9661a8f00000228000002240000022007c46ee3d44ce52024deb59a820c3c7d2427c28f36652cd1b14477bb50f1363d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b90db79da109ead370279b26953bae6b7cbca1be0efcf7a399bea2e0f01b6b7b412af79bceec16ac5d4a4194fa3b93aef3dcb3e5616b779831e37952a700487f5881d3a355f39bd674842c3b76cfb8b21e5f3b28a9ff3a3d167450108306b0a4294b67de7fddb357602e2ad55096f9ac5f6d66a24e3d7831ae6c9b91b69148825a765bbdf1f60b86da71aade72d9e2a4a21c907eaa08fa62b459ee8554ad5f8c3ccc7999b5186e3e8e980c7682e96b3308916139e685304052a546d760925d365dabf280e7682d68a1a62b6bf1866f5cbdcf7f940da131bba54ec1f27cb1a10a3c361645b93153dcaac336980fb021b6b2ed99a179ecfb30f277d69aedf5ce9710aeb4745b05039f0b1ebccfed7e77bd1b893743777c8038dd4963506621af6d3491e24c0c23f4cc1f399023ec394724e07ecc74b814b905a9f1d4c45ab96ee015d0d419e8ea84c182cf354a2b2ae3e7f11f27414b44b20e52a4a63abec1f35dca215a08b033359e30c53981fb6ef7a6cebd037f9a9f665afb85bb39553c304b0c09b6fffa1fb3666dd725a677ae07b004b5bf4765fdc0b6eb1f51639a759ee43a63da9310b33a031dff43b4810ef246a3af1fe8c78489eb4b40772bc0457e2000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012a55048af1e9acc1a7029b57f02657f8ad1e4f7f5dfb8b71936fa650830e44d402179016d9234dcb52198773f16bb861e1587086ad02332bfa14d0721195949fe51a9023e4b268bbf50f3968daf7edb89be17f7b6e9e6db888bc85695c4fecd11d0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e86fd2d6f4b4d88e0d92e2f833de3d9be6723ca7969c0c50db414d015c913834c93f1322b5f14e5a676f051a4d8d8a2c4e552d48c958c197ef8ad01a6275ef1cf20c8e264138a9acbebe8fee210481a230d8e56ba3d7d1255eab09454eb4dca5d1c6d1fdb1ef264ceb5f2d03463db6eef01ec2601ce8fe66335e4e3fc7909902153e5417f3ec3b42aba54d4c3c6ac6cea3b91b421e2f9fcfb803e6557f5b32e95f8e180dfb4de13c3aa19048be19fc4738c4354833f7398a0032071fe98005876859d5b85933f1a31198dab4b80e86358fcbd8f6cc260157d76ad27a0a01ceeb91d1e032ba742b06b8abc05211d53e3e939bd1358fa31f4d1402c5dfd938bffa8e8acfeca12ae0950891a84d452936aa0be756f49104528f28504accc54910a5fcdda8fd00fa951762012a9b81aa5639db1e21e383af7bc3d1ac95fa76c82a0d843831ea770a7a7930d0a07b19faa6d1d3880835d6953d27e0ef21876fcb33aafe3d231b790ad77191bab12391bef5ad1adee944f4f96d9138d620089ed526df3caca2acfec52b9267e0b1eeb76ac3faf004e2735736ce52034a60f7038d2e3896a7a363779d7fd6a8bee7959045e5cf481ab724a190e3e3a23e31862ce528e0000022800000224000002202d061563d1786ceeba4f6263d05bc7e50d6f53b0eff7d1c592525ed516982891000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d8b714a93c22dd5bf98a5b759d5064f463a851c953b78e2c4cc72f7fa2a03c9124874d1c1fd4a8b149d90b3b1d94facb9d88b134379714e009c40da30269a0f18a9aef6b03b5798f6996f616bb1d865242b58c2c71ae88fb84e4a74574abce640e0750a5df9f213576c8c12b3ada9ccf4f14606d7c19427949e1466805282c79a995a595633e1acfbc69f4a9e09b55bbd873af89cf3d46346d6fa534d2a5e14c96373fa377ae61121fdda51bb938a4c0535a5b41619f853c6eafa7c7c534615f8c37b3ca8bd5ea46910767c5e37cb3ebcc24077db2936d36fc9f198ec671a2b68a69a0230ee1e69454ff468cf4af180f466c14f9dc6f8925e40b14dbece03bbfeaeb085dc08b891b474147a0289f687b5760b8eae93e45ab16e0f46aa31475906e7a9a68d42b198a4bcdeea310f34d9099eb05a829c276ce0f382068a3cd0435b585990cf362a861be208b202cdfd29327894f4c5720cc07f3401319e8dd4e95a855f7314c7480d997fea615afd9c29cf707df3f6b8fa6de0fdafd153638bf31b783a801b5dda45f9be679f6efcfc3bec125fd3451540f853196d75224b72b78871761302eb9c30f511facbf184d3e898689860735c307d892138de251a1486000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00201744fa3b26310248aeaa9be177a87c1010d29d4221cdbdfbc26e8e165548a2e2042ebc2da5f9f26b8e3d131be358624c47b570d0b6d45c912b4b8f817bef8ba021a56b8ecd3eac947d6d18ebefe3fa607007c07be1b671840c4e732fb8de620e206cf663f295bc2f6caedf76541c06b6e5c41e2e3f22301e0638fcc45c179480500000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab4e074ae6d34a0cfd1455e13ca71cdf3973d4b37af666bc2d890b7e06bfcc844df166b1e37099c1e3b790c00ed1737e931b022650786dab9dfc4179a861d1d619b5df3a7fa1f5ecb9fc3e4e1c6f676ba78b4f40149f45472c4f41c2520419cd08506461811e744b7b811b09a314ddf9c41793000872a08cac7d4377c08c2b13d6639fc1377adb14f9f40336b4e6a77a3642f12e36bff572e527b1b24c17b24615efbd27b33c1c038df9c11c6c848c275883805866f8b9cc524bcf3e4294533ca8293b47469abe4f0699a30e9d1aee6b189c18a7d6447674f1ccbe8bded75037930188bc52879ff58d102afe570f3c82cf54f5ae040c242ae5c78271ac8e580d8feca20a83ba98bdf5fefadada70ce81e90cca8241bb1ade688ef86b8f9897df2ce81bd9cdbda4ba395f48fd03a5f08b8bc30e3b2946fd95a3cb55b96c640557f67b542f0fde904d6cfe64b51a1dbadd4fd46824eed82b54c9f83c54b5b14aeba2d576aa1629286ca4c4166e7692f4363d3e4e61f031005fbcbf2b9a244ed79cc09f948e2040bd841d6f71fef94642e7df80591c3372d29a0ef9086b73ba786605eda9471fa57bd9da1839d6f2d421921a8861430824813bd6696e3bf093fb8d00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c64173dcba7dc75aea94cc95bda6914123521653afd6be401c48b035ecc033b55c351b1f48aaf349e527ac4ac9bb529642e9a92fee99013682d06fc1eb811e2443aa684040fc69d5724ab292bf3fe00c1f4dde5ce6be121cd26b8fc7981e5fa7802511ba6d280c5e100ac4978cc03a5a1aef5e096924413903851d9daa29a025c5f6518dfbf75c6a98ed42565481cc8b2fbcd7f84557cca162a299a22f38646897fd1df7c6718f53755e4d7b4caa55b39d9e4f87bb4b53359badaae1036ab78dc3d273d7c2ff156f116ec3b07cf20a9f7543980c182a4a41c5f03e2000b0f1ef6ccb06b7b411eec24f9eeb766f3f5eef0c412bfb1333e51f2225714e9af76c5f1d804844e91a04734433c29248050f226d5d0ed527d7058b6f11a01ac108e21b5cbdd6e925146948f0f2507ecbbbe86a698e041c723b3c55a6a04038cdfa4480b1b924d304e2d8c35cb135558e06053ad5efe6956e32ac01732a8f3f9f618755008f6dee29df5851feb1802a5df0cb2d6b109c430a26b277b4413ab02c4fa9d4700a4aa4767f193bf2c42e78eeb31e03173bb359c5b904ead59fdecbb1a6b57d58533b1d930d20e29b54747b8b6d07c83173d7ac16aa6cc8446fc4d068f7e3900000228000002240000022003da5c515b26db2d2fadc751dc1cf56d4d5f2e8051fb622eff17a6d94c921a0b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e2a614ba20d2d9cc63e1c5fdbdb5073b5c06a2fb74c94c56418f00870614bf3b71dcb48a7cd806ea06e735adf854f1e7a946240074326aa4ffb323729a99f31e30b5b3addcc3c647f795bb6bd3e338a090ad34405b114e26cf9c9510d211d7e1ab8c284aab9a8705774fd04099daf4746fd96a32492fae2ecd4929e7619693fa6def68f9fb7ee13eb4877db4dcedbd9407f312dbea4e06b95ef2c55e7789f06e1bcc007d44dea8f60c4421397fbbd2250e166e33c96abce211eb5523f07d4245105343a08e4ac8145d594182208004d4528ab46abb7a12387bcd814eb087dddd24e476bf49d909f462b2cd6904a02440252e15abd6e592b5565f9ded1d6b161545d307163b73d0ffddf59f8fb493e1f2bc261aeb24d3a005a45ace7947ebd140fdd95d2bae1a34ce26cf4b474102fc3edabc7ffdb8f59dca6d8737340cc8117ab079f5205c6f2273eefa80bfbefd2d93b2266749163684bd32e635ae43d93d484d4528ddbae79a80a508ced21aa489feead81254d951140f56c257ab7c72e998995a5ab40dbdc8509083bac15e7fae80414c76ca8e4e301a369119ea8e18130d72a3e1f80212a861ebb471ef0fe08ac8c529026b6be76e31e27b947772244c1000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010cd176a0742fdf0a65904808bfcce02a648dad7736e99c5df39ec43c19e6adbd021aa1a0e517c8082826e7b50eb6d12c661ea7f900f66f694270c0fb1751a0d36410063fc59779654c2909cea1f95544260a1e320e2470753f07331026f8affd60000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000985c8eaf14d1a10a2c086c694c5237dc39492d74063fa92508b32c56312940ad4fc7ef0960902d1ca45f28b3891a2bdb0309219e0345956ab221410a86731a4c42caba18b1b413199b1d369a79668e0dc406dfebb04d7dd4a46d225f914928039850eb6b9b7ccf6ee1e0a019b14efb60c04908a1233ac07ff4d16c338e7e6b47488a11ac92b6a179801b5677998c033edf7946e5d4d629b1cd54b6c3628f81dca8eec527c47a6715479de1f89bad477727566327de408c254bd3cc0468a42b7c91b065eab18308b2cd8439909e4a01dfe6209fba70d69d62d798ff508a086409717ed581370fe128520bc3011cdc910ef32a6f12803ab00e5b67fd9e228125a88427d48ceeecab6c7aab12c170dce742b41b966dd6fed41961edb3e9f33efc3e1a3aca55c813c3b01226271e04b1ee45214a359b5acca12815fedaa60e0a1a6617cd3e524499c7449ef162a275b617dfd12c109210393b46c0b4b9d64370c9c8108ddd49c78a8efa62599823bfb736454176ec5dcfe6bb57ac74e6f20a8899dd0ddd175e3a4842a49703d445eb035e0ea4a28b5f728ccf3d7dad932e5788f05aaf5d6f7ae9fa761709825a233737635fb28d12e05a16166bfaa8fb9627924abb00000228000002240000022006fae39584a7e111707ad8488e489e53a478b5549f8c3960d4c825d3a1225a71000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e066e0c776fe09a7ca7b585f42fe8f54123df47225e164a7233aab380ec76f35819234145b2905d55ba8c709af3722f1784ee0a6b1dc9c05b13a66b6cf2ea9cb3b8f297cf692a9a5e45f653c32beb21619ff5ab46ce625c9c0214bcbece824976feb28075db16414f4ab1e1a4a7660f73751125ed2d656db75ed5ec5d3b8bef14fa8b5c278478c8e1ea05a65e8c8d5da37280da098779ae25e8916ef1d98cd06264f8f4de1680c3a3a46c535ab544938dfe3092a77add1bd7fe459650c0c882e38f55393069a00519445d582cbe06931182493f7d69c5bb7af54c7743836b72713fd5a009c0d46d599320e566e50d056333493143a76e473827126df373b01c0ba00f6c444d3aaef8c04962dfc2d68496abe2caf86819c165da6b8147b51f78e20d2aa8e34d4a3dd9964c9e7495451974369703aba5d648b037a8baccf6c68d8b78d9a4dc13671ebfcf4b932dbd9f492a09e97ba12322db01ccf798d91475d5dfd7c2301ae6f56ad9a1636999a3fc403222a8cd2b243e1e846d805b69d5156666886290948031e2146a6379b55914889bff5d4af95d4c443f08133ed5fda081f49d4a118532c106aabe8835ea35a1c4402988053210ec35bf8c47a92c4a5aee000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002277ff1a28439ba8812444e49ba039bc63f7d90842ea2f23f2105087c4da98493029db72be63e67ecf80bcb09a00dfdfe20d88a5d74175bca935baeae0b79082c021c71bcfc570a0fce92e0cdf9ae172c76e82a1b30ce09c5f3c9eefc8e0e342097221926fa5e3db6a96cbcd9fe8336c38971397d2d4704cb051cb5949774fcabc400000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010114ca1d46091d908df2c7ab5f89bc88ec082243c0a20ba389cf4b3acb77ed0313596c2f28493da86a8dcb233365edfe2b054f1831206db1bb24fb627a0df173891ab3b7c08c12f2dd5682793f6769950a798caf8b6728ab3b330ee83b63fde736a9976cb444039fb89a81de440bb5faccbecae7fa96ae9a82d251a91f8eac507badc1d598bc56eeb01a2346bdc072ea7c10dd085b2acc2bd712c4dbebb61fdbbdb84a584e3451a509bedc8b59273c861286411e465efdc4b71a9deb434dd721f67e61ef9d9515d386b8c166310597eb88dfd2287102a7d1a3948c9d456a1399102892a0c4f44f761224af56d43890f23eafe4e7fcb63cd058bc215cd959ca4ac770cface62fb4e26f473464d8f0dd78617467e2528c4bdaa51c3294cb4e291fc0c1b525fce1b47013a281d197248c98ec9ab15f204d03f162a59bbdf4b923db84f494b15b85f2ea205422aa6b4b4173e6f0a8ce65753901e23f0d6d744d6cb236b61a93ef288bc9a63b62d9725522cda09fcead60d7a08d55e1261946e89deab1455793617dab60f4eeeb2f6ca19602754085eba6eb2e8ace5ef1eefe4d18bbc96ad8cff8a6f3a3476d5070570e8a077f39c0ecb3cc01b750b9b121491c0b00000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2342c2f75eb49f7cc74d7200f732eb5e2dccbd43c3a01d37443b37c8c0c585abf3f4c7eb6007c025997e4954cfa4b90f002ea6910807c70b35849264c5d76a5b355cc2875a566868c8a79b1a8695f405c89156005559a8143cd8ed1072abc9e7947d61c54b46f1edc2e5d12492f5edbfe163686a916b441683837af5547021fefe29d337c2be33e77023ba3a6a3aba8aa085c9508580f5b058e63b37c47908304122c5b884494c44f76e885a7d0efb28c44a564e5a7236a309a74beb15106ffb3c6bfa2370cbcc0708f8cce0e03279b4bf13f5c056bd8537ded3ae06b07582b613d9a6789948205a7a2bb36682d4048c9f0443733e9886260d8db022ed2fefb270396e0d45dc4f64bb446fcdecc116c4c68be0713319b1462c506aa01ed57912a523b0ffcb65b8f8555d7c876c741b257673ae26c49d96e5f4a59a54d3b8de29c193eb2273bf176a92009d682165910f29a73d2a4b9623eac1569776e84913d9868d07fd837073f016f8cacc658ee0407979d2f9612a226174ce76cd5724f94a1cad611a779d37168924f3149461e58cd8aa29a042c23c9c18159015606da0f7b8f954020f12c7f813e22be2a76d3b8e3a5fd01f231f40973cc4dd7663b95ab0000022800000224000002201f1c8421a89a89ee902395b9bc6fafe4e8b82eaa3cd3c970b7c2095da10782ad000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002fb3161b66481c2424eef1228e98ba06b72de6d215153d9d8867e07c06e802ebc75599adf549b32b75ce360e1b0e3f63944b5057351ffefc9552616ed73bbb6ffb7a3cd4d5bf5696fcf6896148810424a2ef62ecc53d834fbd725d95f15a60991a9b56796537c732e586c787ec6b155026a0ab8598d17a93faedd6d45b558ee66809aab14bc2a76dfa1900cb2057070aae26e49df116d472aea34c5e519136c095cdcf7c4fcabdf64f53b4d81d35d671ca834ad8dbd9af40209e44148160db6378dc53cc481334a7d928a2c2ab50dd52bb4356c6ffda71fada06719de92c1719e902852e8c676b427cc88ec41bde4aa14122a67d2fd36ce5a5cf8f02c48ca0edc1c763e230aac9b6ac93c84754d840c544998a5869124d3c72aca31a2e8843d42b4a4df4dfd43657efc028009fc4675f9325f2ed0bb1d72c1bc9ba6cfe7c1d90db7d1dbb8103ffa0797f45786f990dd309ca15d49f1f2283f409f89cf39bf4117d6d95682ef4532eaaa8f2899239721212d8f4feb1b13e0e1c6f3ad3dff9031576f4ab0d451b7b376a5edd0de9bad416f20d656676a347e0ffdb26874e28ffa4a3c406a3743e5a83ed90ed161d77ffd5def58b4930776746e549e5a6085024bd000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010f5c3af04696ee1d072f7e9af0330688fe38bb8517094b1e6274200d1afcb1c5021c7d140340988d90a81540e1ebe7796aaa2477365b287ae420b5c1e207fe83840ba130b03137ec0623ecb2dce493c5269d3bf3fd12260e584eb7ed96adb0d3de00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085cea7b05ddedb33261cbbe72d6d0ac1baa8f642321d58091cae7dde1c18c847d977b7477098df9fe39b079c9ce31547b81b949d9fc85e03b1fe62540864c7c238106765c0947c1d1bddcc13e625954414d756f508d5e464a538ba1bd4e897cb1e42b785ef843063da9f0c9f9acfb42a2bac09b741be51b340f39677a13149687c0371b49694d7329556785601d1773d155e0bcad9a2d077d0386d020f6610ff929850fe31c9bc750cc44f0478f6f3d52a205a3a59ec2402de537d27a54552003b6430e89a9b81620887f9a63e37fe851fa127debce8fa4bdc35038c30874e67507066e5c004ea72c3b93a1d5fa056da3b2d9c0512f69ac67c5a2011db60be2e200aa34f9e88edfb2155e8f2f8470f75449369f0be888c25fe98b1990ddea4700c69a7c446fb516c6b765bf0e6cd5685205398b0b9323c04bdf543a2bd356e281d3e07e8a8090a3f23a5807a6718dd519c7e5a386f2142f22cd774c73a8e2eec0968018034999f6c27584677281bae3d3abb0c51f604f066ba5625e9295cfc7129709ae22a1cc9882948bac3f585b9bb8761b0c13ae47a4c327e28bfcfeba3620f5afd82efb1c45c436bf4d55c8b9fafc44ab624897743d544d69dda581c91480000022800000224000002202c8e465f3edba8fdd33a4871f2dbbd15c3033b1590a0071e038456609b1a63df00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000811fb9ba41afd975ac6438634abd5f76f20449b73a1b48eeef2986ef413749a6fe3b2bc502a8cbaa6bcd3a4abff1b89b6552d2e93bf1c55fda5ab0638b68752e1e2ec41fdcfdc4dea8027f3a2317d310dd44159d07edd74594d6593f26d3a51d421cb9dcda192b73ab976f3599363ea5609910481c83e59c556a9eea196dcd63f9cb601cd5569113aafd6e624c7e5133d71fbf860c834acd4bc4778313be9bf1f3fba109573be92915722067b5404d6a768ab18b5b480249729896b9502bec4d6703eca9ee5bc03b34edff5d3f293594f7bb346fb8f3cda8e88374424c64b75e62fc0f3554318d8971c6b7bf6661f29dfbc177ddbcbb0fccdfb962e9e2c44a5c45d69c0ab38c3acfe97e026a07ce20a79bd9752dbb4d54406aa9212a291a305e3240c619b0896214cf850c16b3770c3a9c5e2ca684b2406207fb4ec6719fdefa3583cf2e3a43fdc27fe25188ce2e954e76f7a69a31fd32b28994f445b0203478702553a3348cb598df83624a730e07e73b31a28f69ddcecfa23801d82c77cd6ba8d62d53fafaff4361e9f1fdcd321eb5d6c16ebca143d8652dcc8fff0ffc9276899aaa6eeac34b3cd289c81696291cb5c89f57dab0182dfd71e54c5ce88dde4b000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020a522bf17c6794001d589dc64938643033beec94b8f8dab897296ed485219829082b53db764b5a241ebc4ac792e131f7b7fb13b7327c96f735c6751ae1fe5784021d4198861fdb0b2759ebb4cf0a20d7be47f7554467bcfd71cba0b8d2a2c8d5ba045c1977478824301d00df6dc098e7fd0018b165816d670e7232b7d7c5a0cc4a00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017548d160caca7dbcfe2f06c49a6714f1b5e8395b893755afb88b3131362bd7419bb48e1089336c4604294fb920d602272b46e88d202369ef3879e036f19d22493e0b949910bec86efca4ef98526291fe5f66d2705c00d1f4d2743e5595ca5ee1aadf371527e0d5a6e8add46493a1671b7d5b0bae5cd871327b61bd22feb02838e7fa8e700ef342d192f96613bb3fba23ec400a24a3f8cfefa18c2211e458f8d0cc14a8b753b8cfcfc6be757d8ba5994e458a1388081792de4a156b1c76c57d9cbe77945454375ec613f623464ececcb0d80bc65b17cf7b3e397d2a932aa7762e395f6867e6fac9885ac3f510a81b8a8a5e7153184eb2287a9bdf91470a240020d4021260c35b5fe84cef2a615a174dac455607a160d74d590e5f2fe0226fc258840751389e591c9e9c43cb11859dabae786590b8a22dbbd007448577030f921f66a1d8c5158ce02e8ea18c11a57291d9e4ad158c1db25bd2bf24d99d3ff40c47675e71ef6db25d7bd40ebfd13b81c1d81f083e6a591c468d7241fee58a334fc3ed399da14ff7dcdbef7a640c1ee0cd0f88a311694f0368ac4b5780469a5d4dd8fe0d6329880c64b38d145380c864c03ee35f1a6b1d64c25cecacac724d5ba33000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028067871df2a02491ef09d879b2a143c80b330a9b62515b588fab0586c7d0aa0c5121b4aa8f35b7529258efe6d99250eec14c3c36dbe7b754c4eede9cd493c9017e7680936b85813734231f2094839aabd88a8fedc137661e39121c5ceb2b893c8612e890c62c0ef1b04b605ec6d4b7c2c4b14479052a2c3dbc46132731678fe4bec3a397519b050727a0542dc2fdad2bbbf9be66914a52fce907e596ae5a42e60225b70feb6576e62b2669b77c64b50842f757cde2410fad0eab3d413027266f122c15ce68c10262f7f587fa8bcdaf864de3c20f2e011b0e89752d6880e80e452bcb05a3102f9d2caa69b4ee2d87da4036ac898d42d8e05f39a812d041db9a9110d40405ebd39e281c54ffb8b14c33c52850c30376eb97bb3f9bddb401c6195500d3354e366b4e32a125e1722f0a433a1e6a3c439a61b6a6ce3aee1c6514eaeb4c9a25d34100791392825741664d70a27bda463fd3e315023b525058f5aecf035380d88a31b5e42752b795851837d100269f05905e10242e7ad5ed54b2796061cdd5827476f18d3656338cee25385ac69b87d9dff2bf045825dfca598e8ed0875e08c4593da2d6574550cc2c006ff96f8ccb90ef4488132478db637df1f75b400000228000002240000022025e1a7657f4a4909166a2d628c87df6e62f2f56f30ff91c4e147dbfb1368790e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022581327d5801765657da770d0ec82a7f520afe710aa6e16897d63049db1be58d137bfc1ed708272cb6d0600820396f841e99357b8590d4156a53e0432a3a77f477b5fa43e003a1ffde60990a3e0e1bd24b7b8cdf37446d3968b8e16e0ea0fce676ba3e84fcff4816f9114e6c2e772d455b81d50b0b3aa86a3d5326a6b2a3387520d8da182885423e2b274705e802a77f1bb365c8b7f17b84c9b4abe328e35c5b365f4e1fc140504c53c010b4dd9ffef121521aa90fa9cbb4d700f53804f25d6870cb10cab2065d43c8eca0c4ef31358d505adfec73a35399b3a155358481c2d93acb20ab898fce2bf868e9b81a144dce109616ee9701ec827568f3f62573bf5f27953a76864f38ff35498b3a4b2d5b8e0114bd92254cfb34a6f6a3f799e396fbc4bd9fc63feae143d87d7d35584e0605ed84ccbb7fb3dccc427c580bf766cbc315234fdc90fb4428bf876c86c5a90773038f1f4f342c9bfbe4b93534a37abf08d1a1114a6b71d28155da9ab475ddf79b8505ebb80ccd4327e3b5fcb5eb0802a96cf490acd8a26dc7e6391b2da6203d379cb50ebc96e5f1371a9c36d142acc71ad55e704c105be80462107674aa455f9c02dec4e8ba9a2280ad86783918d240d000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012aa25a78d6191d9a01d4a99c54a3fbfb071191cdd2da7f4997c3d6d68b0eb65e021e4951e41a7f13a40da2874eb2b69a20376137e8bede87870061f930e5486fe2282db084906f5dd8b4b04f51e45645bd6ffb2d082781b5b67768d3f2dfcc209c00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085c2fac928c6f5b326c64cab50374748b3ed9f61fdb5d96334ebb0ce492fc445f3e5ad0e6fc911e7677bea1bc1c015b85b549311424064bdc4927a28fa7c0f3446c67bd8eb54b76ab8a3a90a5caa40730eb4c07cb5945f0346518deafe4319bcd5e167904ef99b2746394b9c302808c812e268879a863c2c4d8de1c94fea40094b0ba70e944596459ca33556172124b227e9ff5e95feeec5cf1a7eb825c41a37b5d3d106427a1bd74b92d6633cc4fca5eef77db8e1370d058f9bcaada6ae2889d72ad78437535d326197aad25adbcbb73ba117b062e4bf2b9ca79ddb01aa29dfecfdad8a4e8480ac68a5a9c05b02dac9df2a55d9104db0577ede87bfaa3160f8b71c569ab3d036f1c77e62306d8620b69b55f7d5ecd969578f2f4ab2bf13df1aee1ca40d56a7e448a4dfdccc8af18fbbfcae6fa29f9702e0a2c802f78015b2e2665fad51aa46ed8a0a2d3371cb92a8e3f8ab02a330a6990ba58d4f55f97700df11431c5d74d68fa571a92e6fef364ec86a1fdaad39c3666b6877a29fccb2e7123f4e6f37f54f50f3491b517fd99680f743563c172711b689d6bea7da41e97cc237867e5e99ff5b594725cea1719ee76d7070ff43210a7876b880ce8ccf66b8b6000002280000022400000220203ea780f68c2d583f1b53dac19e95cf8b861a7136b07cae882120bbbef025b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094e5104b49d57e929f2edfe6d9af5a4ad1f5b1a2ebee373ab3335696f5fec7667368a5f8d377c1d3e5d0bd6afb1eb1d95f9b22fc7ff4b5ee842e13abf49d6497ffed2224b9e1104620f0b08798014be8ec785d3914c5d8ee864955c9a8b626419021efa55f18e77e0b6d1cf37ecdaf5e4d3c33af6419c3a4011c1a932c61e6782e268abdb4d6f0d8081ccee97573e20f24bea4b8c195522bcc6e0a486882c65a38f1e7c6d14aeb6161ab0c6c8bfebfca2ac4d20d5c5ed44927b0cd5006f5ab460036fd8262fa744dcfc9e56c1f078d91d62d2e6c3d431432e5d4d6ddd61cc6008434256267283675f0e9051ca073cb3d61ceb1c6ab9546256daf1537509a34a729a6adaef201dd328620a88a3b89bb5a7fadbabc0ec3b83fa3c7e00bfade3d3bc5e8441bf800447f593722c8d39e1072b5808c216a358e998d2d441cb0448bce22a25c69f3793266d20ea7638227dfb2cd63563225c4be7338de3bb9dafd6281cb86fcfec05f2a63f7b8c8a2b34cfe479481df6296872045e825d471582b2fddffc56305f302c11e512c1b3ad884602637b0010766228851de823ab449a3e6cbf87960ffe29eb3818ca0a2a69ab638ff27e32f064fa563c721a54029dff174ef000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012edb1ced8ec305af75c7b67a5bf372935741acba9accd701fff7f46efcaca3c7021f218acb98b82f2091bfd15bb3398630c2226c5fcfbbb0d8a83a6db02ef8bad11fd76224c0a431337c160588782c1fa8dbc397bd6ecb879bd94f83e954dd93cb00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011f2653fdcdfa22b21dbc28c1b33e426374fa9cee64e652cacd20724aa234ca4b4c50dc512d4bb06f81ebd64e22ba5462af730e8876a301fe87a7759cc79f97d76df42d347a30c6860a160c3a12a55faf1aa197d84bab196d7fd18ba5c724de7ead6edf274fc7e41f3e3b8ff8a6daca09fc2ac2b95c1bcac1211f3cf4f4a9d9b07e183a13b873d11f65fc1d11b887c8f907abc2cb9602ba06f58021f4cba9cf5a73796a69837a91cebd45e4dc6238b7cd3aba07cdc6a93f2eda65ccede872b3fbfc54b88f1c9e7f53c7b41f22d7ddcc23d2cd6f804f115d3214d9a741f068c3765ea3b65b32d1e782d3a5acefa6a82c5e9f1a927e1eaa611064eb70a6008011ef87e41d57653fb78a7f3c16244a188592f8f303d6594c6f7e12bd1242bdec8e24561f3d21e1026a7ff6cfd6a5c06d14614dfa49243a49a050dd8cf4db58d027a7cb2830589da2500de81f07c091d469600f96aee29b7b63692dad0d3b44c3a1cdeeef3c1eecea17b048187a51bf4e7fbed84a8011d7c3c6f6458505bd5576c5553f4fa736a4b608eeb0795c157983a2e667d197f72b2f9c18cdc192f0c647108d88e2940e23834fbe5ced0af85ca5cb45e0497b109cb4f9aecd76669efc522a1000002280000022400000220123552b220559d3d4830c691d725d55d574de5ebbc80a39b5d85c3c496a22c2d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad60e473a6d3b270bbd51b8c440392c0d780b1494ce11a92f253a2e235bd743324c879c7cfb2f413cc9b3e3e9bfb986e6dc09cc2ba9d4046e81a9a4fd8eb26346788d816f67250b6a6ff85bd4a5a0b3e483144207b45b0a4b06503018d00ee660a8c2311d1a79b657ab5960f9122cccecb439c579c4200bb8ed3ebbb5aab7200fcc4bc0492822252b055c897ec039aaa29e4f5f852e5a065f033fe2a2c552e0ffe84351ee26b27a56431e95ccb29cfbbf34895dd2971a3dbecb3cf2f7eddcef54158256324a23efd45c395c57fcac4a1c37de16231c9eb374e12734cd299718b5c455f0bc972f75bc3237b03e148c799a91666f85b1d3b641713fc1c7349da545c7811e997829fbeabd2ef03993a4b5b20e1ef2583ba81d268698c75ee8b0e72c900f17a71d8889a8352900b8f3a1dba46ec1fb3499a5de68c2ee4e97ad81c0db1353acbc603a7b859a8aba5616e67f479ae12ade802b55ffaf7b722753f7bdb45deaf9032359e74ade11fa0c4784914cbc1cd093e0f77e64461a6a1d62144d1a9ecc62fe469276f9fe8edef91ca3a42b39ff48af32e518b0f42812e1786ae1001a4d4915b367622a7e457b48c4717b86beca0e484cb892a8012a726bfc2df9d000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010b2edb5b1f9604463ab67826cfc0d689df6585702991d95963c6cc7108cd7b5702203b02faa29f5bf79fb0fb9883ea4ddad3e620c0f46c7c18bfbe3b748e24716107db57d4f3a2f92f5446e6e790cf2017a1d46ff2a8639d76e8c87a72825e021900000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024910315d5d3acd81521a8880f217549a889108ec32eef54bd7e2884f26c54ceac09faf926b9197023c5aa34a8bd368d40891f5fc79949142c56049ff7fb26d273a2c5d037f8e9ebfa7c8bf88a172c10508a89c059e7c582b5d7b814c16f2f611382715012b7e1bcca1a89b13755504c0b57baed74b4c5603010972b31bb0b6a193a499646323a00da25be8983baefbc1119fdba04d3aca2a571bfac9084989f356e392e6e0d8fd9f0fdd94a5c39733e5ec61f54eddd2fa7bb056cd2a5435638a50143753392e2f6aad0b75813ecc09edc8dbf1c2c02ce1ff39563983534b011a94d1be95e64ea141d460030353c629b614630a69655164142146f241db74f110e40c19e2f88e86561fd94e9e70656d70e04569a27cb9023279b22772a8880b5c8317ba69e986b4b1a181f1dcaa1cc1260791797caa4cf72f0a76e59edcafa7537db0b482667b941193a433b16f49f3e60e5559aab2ae12313200179de807781c62dc6fef1d84ed44e637756b70c930a447ca90a975e9fe22902bd718c9b51d40379b6ca1567f22d2380ed4bd4e54c16ba8b84cc864eeb2bbf396c68e4166b10fff87115b69757fee7e943e846df22d8de61bcbf46c60c497bdccdb4756511cb00000228000002240000022025706d67dc0464a60b29917c2f0bdaadb26f04675d906bb67670dfc7c9fad42d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085fdee67d8eb520b86bd96b5e83989788143b2d24f3dd4774cddf0816966693e7a036273e3819e914be424e70992694240d09816f9909525b6010dda962d17a14185310ec42bf55672f5a1561479b5c4b5734e634350af7eafd4e3d71974093dceba964f844f6e092f307015ecfad1706eddb91554f33cabe161ba0a5ac720c9806ff7a74359b6051522a3343bbb3e4a213ba291b423c1d02e5fae0500c11338815138d098e78628338259b6fe51af653cbd35f973ea430ab1797362eed5c4f22be6213aaf851efb339c5d06537b02758c776b88f68f81c043ec4b181618a2354d4798b4773d0bf303b957afebfef8158728c921be1e5f91ac41c07be8e596e4f111b7de07f1609833051b09d92dd1e660bb6732b671ae949f849b93d4c7d3d5e91a9012fc9db5dd5fde4ac4718ec3c07cae9a1bf7e5251fb98dce3bf7af3b023b4180d5eed78c1d9a5c8f174a1ee14d9b5ac005ffb53373fc9f9b3b5a098065e01005d39a72a873315427481298f3ee989be16c6484182edd84dd39e88ae802921b5a5a8439e0d51834c2c54e5236f0ce74afc714c64845807c2b67a08a22b827f8995d206b7789017231b4483c6a18c0744a550f9c6a463ba9f36d3322726a000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020dc2f940719f232cd0de228ecd72173601ce22e812b8e3ea4aeb591fcf1c578c0a3c86ddf8406c3d0e923cb49ae41be37405968b5380148120e1a133d9baa6e20223af19f28855f21a087c1caaec9dc559661076c66043da67c2c38388cf4986041eb1a8e5a72deac6508da9dfcd2dada753446b6223c4cb110a52a9d3418f057e00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011d3c2478ef1ccd3c808d45284e01c9a48e9dd34efbfca6ecf49850b897c4bddce29fb0ea377ccab2aeb1fcd69c97f934c76829052e2a989c01a61e39bae978b9a8e00bdecf72f4842f7e9d4e838e9649cb4d8aad54f893fc55e572dd1aae5d6b309f92368ae6922d707e84e82821c0133ac14eb9d4a9784209b0d9c8d2cc687efc814a4aecb29b29e265382b666f2e7d37ddc02a157b07fb17dc7157810900c395d32eb381cdb09c6ecc2d68893078ce0e4d0ec7893637c7b68b26e31dcc28a54a1f768a8b11fcb3b96ae149fe827760dee16f8e931310a94ae4f69b32e2866c32e86c7cdfbbdde470423365ae55ba0249a88c73ca8252934e5382b23e9c12aabb682485e00c44b7b0a8d36ada361bed7a97c827990d84b53b5d73b023edc33e680d70c527c4bc69ed995d0983cc66181d8cf2c16c2360627d5cf9edf9baeb28c5d4d4de3b368b86ec75511f409039029e22a4ddbab0ee51d6bfa1f592606bff1c74e8d1325fd287b637eab0a17096095b64bfc8ec71b7e46375bd9a148fa7b2019461d558a7a90080a6d017d9a9e7a033db8d59fb98844434a5b7a35219829f77ca296e1941f69c7062ef793d72e0a019798b5066f87cdf859ebcc6a5d214b00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ebcc908f496e54f7f6bce013247a57014ec53c32d416c4a1fafb991a7a4863a5a9e538d0e8716b3acc5aac70facfa52a9e6e43522dbb1fabfea72be9418206f201150649104bc40989a0d3290766d65fd2aa69bf204ea1bd07863af6e0f537a2deb2bf93e37a2e097c9d069a0228e60e5bed661a2a772e7aec532322f1128b20692192f040bc149741dfc55857b27a7cc624c9350b2d0835dc0e187cb04a3ad05d7a4a5b421ca1940de03494f676e11aa435db9bcaee40a54ce1cb0bf65abdbe28fec9a98eaa4e47cb6c94d687f7de2959cd01a4477b110ca27f930cf3e6a55a9acb4b083837fe6ff90e653c95cc6d486c4f74ce553c5182099dc0343f567b8d1086230844e3051d1f71477def4f7a0db5c79def38c30fd0f3ecbd8cf1be86a4c5b99fe7e4902958e952b17319f97384c720e24d96ef54e452197d14e48d6dbd889545e77171ad04f5d17148029c426945bb59e492e2995015cfee97321f2274fd331c8d0b71cafca648391c55fec4db303345c94f0df08a351485e68c1830e52029a30c2cc1cc93fafd739aabe9482e4d87263a6e41bc13cc6d51bf59a9f794ae607086ee8b46b30517a34159896f7a7ec5a5f223dec8389496a18627e64aa000002280000022400000220124b0024b4598ad8aaa744f9a60fd588585e9b1558a6e06d0449bbe666f4444e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f6a0ad628ffe9efeb6c3411f253223f6cccb11d1547dd2bbbcf8ea7367f0ae1c72ae1a4001cc1350ef3d2a220c5a8ffb36abf50cf0d959025bcfc2adfaf39f61bc73a4949ac4f483d01070c9c0835579eb2b31b50e5df02aa2784138797cb21a60add172e0a854ae020ecabf64199da49d548a6ffd082411323be3c0e826e1023b82286cac12d9461a2fd601fb36b4c57e1ba4c2c33fd99d8e8c9fb70a13e0a63ea683ab4e13701769189805bd3966faba4041ddaf88b9c9e03e63e98ed78d3536b6caa1dcd86d46fece3e780a61128e1d20e56094d936bdedbb21949ee6ae8e21a234dceaadc770ae3c245b54ba91dde758083093cbc6387c03cbc0dd5a5ebe1eb5324d6715fb2270602018697f77f4ff711ee2c973681b4d4f640b1d4bf84da98609a9530faf94ecfdcf7a07e957fa8d4fea841834f4305fa4f1a650d7395b63073373cecf13186d8efc60050bf9a005c4a9d815baf357789e76005b40e299c394beededad6e4233bf188d335c1fc7dec7779c78fe4198efdc90763e1f3f0086fc2f75959e98e24636e3c12452e6dfed39d03695f4be343214a225caaa9c9b527c5384ca321f97b948c189378272f20c146dbb110d15d73f2763c0e9e1398000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010c07b65999b17fb391795bde4626b6dcf3b8b9f6e5136cab2a361ffd7c572bbc02246c149764aaad4b78aedacd6a68314a234de6d22b6db80cfdda7235941cfa781325c58483adccd35184c5375561b9758795a75c8bf6edf4ca4e4519f01ff2ac00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081ba1d4c08accd3aae6715506453096d7def5b33cbcf76c71c7489dec72059f60c2aa1e82156fe6d0b169350f61d61f486a9b09943ade679eec88042e499484b9f80f55ea9ca98016b5315cff50bd85b58f6ae778e19f60eebb2be069305d05dec16b2adcb57d8e220afeaead212b1ea000f96496bd7697708b00748bb9f3c13f8803e1772c15dd71d3c8e7988423cfcb0502d3be6f9a1915071381266cc5ab5501d2a6e47ca6b4f6b27861e2eb6dc6f6197a376b216c3e265d934d44a795ef8d4e0b9880b62bb8534d97a6e694cbf64d6e49dc4adcb6c89a0274d5a114d6409e7878ae7991c98eeb3c5f965e94836ad7a5fe17b5fd4270656bef5609300225a76c6ace82fe7c176b73bda35677a38d464ea04cdc9557226b0d87c038631c9e3331f6b9e3218ec6c216ab35252e770bda2eeefed94fc1136eab74fef19842e03610702f530bb29518b7bdf9b6398beadb053e55ba2d5d3f7a4f1cf8067be4217a4ef2a24fc8b0e65b2561c8ae4a27f11281f4fea082284bf0ab6e9ac0b29e43b46cc8d9d61f72c3b592d80297b3413397455d2c57fde162861cfac75626ddfed352578e3479c12c05a43295a2ea063d31d919c207e99d34570b56449a0ac1fc30000022800000224000002202b4ab300f545e68f60c84b30bc7eabeb44e490248a67dc7e67819233a4e6b350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000584706df1e43a14cfdfd504de6bdcdfd6e0461a004ceb38e1eacaf478e7ab717003f70517fddfcc39147b4c9650280de0f770bb264a68ab801e38ae604cb0f74029aae9901b8fbc85242c271b4132d7c898165239ce4830906d099c1b4b305c25233d04dd0736e374e3d2dbc911be8322e5ea38a160fb2a27a64460256e2ae079caff3166aef1eda90582ddbed0127b3c5ebcf97c8462ca358b89700b511b94ebc5e4f32eb903bd140d082036e8214adef4b28de9c0723cf2584e54a9bf4f5e9313f016c8cdcbfbe4a574ac5110723d82dccf6b95585e89d2c1eb856359c064763029da9f42e7efdffe7dab885c30b895b3a7df01f06867d8706c9e66bc9d558c30c9060729f85c662c06c48e504e5532b5425ac8e0e2b97b27610e82336094208a8f7273cf25e6de4c1e030c5786980f7f441a1fe69654e4070929b04df2431ffc0dda25da15a43362121f1e229767ffdaca0d461cbbdc817f6fe12b85b77eecb6c57da692e0299f6fe76d39d732c74c0eab778d98b84a0b21600c937c2a7972fcc4c0507356ee6436baf654a5a893ad5994738d095a258fb165d0c581efa7381c8522ab7afdd6069f9ebaa136ac29ca98594ea85117bf9df09df5c4d1f212000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012d0762f3ede05538f296c03563c050fd833e58475f12ac6d351ee3728e3af78f0224bee52e5de87347bbb4a226be7168c55373294346ab523f58e0e07a2feffaa2287ac23ec73624429f44828dca6a6014c1e8c74a14a02309c8385fdfe2f612e9000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7a7fc8d610561142c182c61168c582718e22b141f979cc551715e696266567750d684cef5ad1c2d06b9ba9064cab8d4344244c9a9e6676cbcdae41654cd0a284d0e631b29aa00699e560f359f2f5724f0ae88ea96e2380403e2beba10bf6806496f5122435b17d43971453473f6dd9a63d84ef6a8003f4693e439c3e91443c7d89136cb32dd6e28e16f8367f65f1850f60b005e7ea8c1280f105df9c5442bc3b197e953ba89e056d7af3fd1c753314c46b859e47bfcf0a8a3631836be45128fe09533a01e1330caf125e386d558d10906966a9acecb2d7a8f167543b7388e04e634e079f1c3628ca7e859030f916e49ed6895f681ff32ad06fda0944b072d9caea31ed5b977402547c54395de32a354a1c7c50ae731b60c6688fc7aeb8506a307c93b34aa411ff8bf3b7cc018ba4c34c24472c389c52b7eec46c67f361709474a64b77ece4bf9f28995bd52e139dab5595ae7287709ac05e806909bf049ba84bc72c2331f4979aa842cc284d4dedd452e9c04a0f59fe5dd023d80d2fedea16a8cec7fdcd47773b29097f0b174d54af6a9f52aea8418223526a77f659044407d374a2e1214d054ee10dfc219542ef32f147cd29f303e6237390059ac8b74059000000228000002240000022006b18e145431ada301b8714a94182ee10c8c08f5a1292c886cf60e21c8b7995b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c865ffc3e5cde2f3c589917a4b0f92ab6b869999c7da2e005fd1c154199e603ce3ae1c4461f985e2cdd7f8e98005e505a5b1352f9304ca09aaf1b03bd5d00ca7fd24f97388da5c2a78919d41b22ba436586a0caaada5b19faa542c7c32b14643a056ff903cd4e38ad0c19e07d6a084cb5120f3a7549624dfe0a9f9ea24f0b3f943ae0b36f26b71e12e8c9924aa2bd98d88cc969bb75528bd673dee40f90f28c6d27a4b4495825367beb45fbf05943dbb8cdf7c45de9e78143f30a48922eefc0ccaed9df60fb648f27ba7ab395730bee6724824c760553be1bc0045df9501749e551a3314597ce46e4f96568ca0516bfd1b0506c2d3082b16db88772651b732317c16665f296409fdc3019f90a2d920423c34eeebaa4499f9ca145e4120079f60d2be8b51445ff7d7a7f1e410118731757155eb4ed5aa1fa89dc9bbc95afb0a56984ea65ddc43da7a6d4b3a261ba363402193f412db0044c000962083f42942ff755f0025bdef3d742bfdea2cfa6ad6a9a3d2a6970e66f272a3322245b3fa93efa739bb95a9e8809e84f97c33aeeac74c8169d9dbe3ad790755b720062892f6643a68a4f6ecbf185486d6c5059923052a69d8daabb53b6ab8fefef01d28f7008000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0021425468e07c4b2118b0554e3219f67865f484ce454a6d036d9cf8833e689285029c1d331a041e6452ee929269edcc270021671815639dfdd2ba7297760f49d1302250f54023a8acaebaea72b2609cd79462ccbe95d73dd3fad4acbee164135be720a9b3ecbe914c3a01c334934d5b8ada8e7e829b91f107f4427d3f197b193a9ae00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001906c288ee96dbb5a0ce39212986a1092b93d50a8420920d216041d9a52e85617063500d2b2370e87cbaced5215ad30d9dd68c906ee6c5fd4b36a735d1bc15fadeb1f77dce6b3e824c760b45c7d091bc3039f71ac9f105b1d5fc7f2f141fef1e777e56ee1436ad1ecacfbbc9446c3ad97e03b53855d54293a506997a546c941eec0b21fb17170932a0aa8c7da01125b1d0d841cc7be5c4dd5d5a614d4f69d8d4a913d64a2bb505638f6844e76f7d8c145bc999bba35a4562e5b3692c443985e8f2973896110b558dfe782e8e09bc9941ab31825363ed90dba9ecc59a453bb8e7cc15064377754bf2386bc0b5be9e547e061a043f54f65269994d38fb301b474a8b16a29bc20dcfc5aef5b9750d5b4393b2984d8c420e36ddb1cf3d3dcebf3723fd7705b6e441c7b074ce2bd6e632b46a61433a89f672683babd5d3769ed4b0c2a720dcac415a9a8a642d7a69a9ffd830c2669918d2c0d3ee0fb98e7eb016d43285c32d3b4f2ac391fdc07012a567da1fecc14ac71268806eb25c958f12db9fa0cc271054e0628280d63c4de821ec964cdfce90e349bff48ff7734e01dd41ddb7f0a4cdf906240309abad06a02c230881c21306fe72838fe816e8b4a19d3607840000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000937f22d942b6b40ba94028220a929ef2ad53d6c132c4bbe5c2e551a1afbde6b38d7bbf73d8cd5debcd235891b4c2526c62a63cd960a2f8cf30a5d4bd53dd17f2925725715a09b421f546fd619dbbc76af115dc8f2fadf267350d12d4ca692c651ac77bc81fea05bc6949b265431254261edf8807daddd3f62bc301091f867649cdf70ef1e3a7c6e467d2a11051deda63e4824e00c050daca08f1a2796d8f5efddd563065849de76397e7105b1ec6c1d81b2c630892c4674c58c905bbffe99f758800d054ca578cf9902a72783390a000f767ab32a25c8e99a790ddcc5aa68e97f7330f36e9642661c31a3478e8969b4a96b884b567044ee6110ff7739f984b79e724fb891e2436a1d51bedd9b9ee418ee38a606e32357f66fca1180f619d1e5906a63f26d0e85a326fcdc1bc6cc508918e3e68f7427e951eea105426d4170f6a3e196f83a62ec4e010a43791885bc3b57a0f83a7840f8e7270b6962118403cee5d308a9f6388bb2dfc507c8535b249da19f845a52f92c6772bdc35725a422d93855ee29ab4655f975aa2559da29dc947a1c9a13b461288494cb0094c38875e6712e93f137db60bcacfbe9c3320ec84f07a6f2db013567e8a4a3f425c49457d4d000002280000022400000220204717fb45a2e566745f1f8210f4d415d5a6ccdc72358f9966246bf6a869e630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001812cfd87fa9798aed0a3c75fd892af7f156859560f78d44ada0b46808f98ac272bbd40d9bce5ee17a664c386f71a389de6be7a487e5db2784f2f455cbd94b8edb6f509c8db13eddb1cd988084342aff87c4252809c33cf74e41d74cd14e016bb6ede6c0fbbd8d32e8b4dee1b75a1b6e3b42c1d457932c00ef28ca97e162d33ce62ea33b513fe82ab0face8d79c40129e2835887a086a0e54575857c8875736eaee346bc8e1f8d6a8aa5a09b23c5b2be0640b5feab42b96308117b889a5fa47861ede1ebaa32872859861aabfa609483c4c810d766864fbffaf444befe7b1b099ecfa4c61e155123f347c2beb227a8aa2f19ac1dba84c4de56d2418400d17036fcc16d021a92626f2e17fcde0bcc1959b451972d4ac4a5256bf830d1e26623bcee29ca5500a3bbabdc88ce1edc0cf2af0bc8c05b10e1da03dc117e284801dd9c96e6125e54a1d3686c74773418ddf1a5bc358deff64b9b6a7e4755b478dc37abddda0252ae3512050aba1169d95272d21cd0b68fd31768a43e4220c8dd8e030d5b61407a175a2fa955010fe17234dd7fd6d631c1a1bdbce7900485357e4d88523c6d06ed1be49ef2e9fa194835b390be71cd3c5ce66c5a431133631ac5ef02ed000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012b3b426f96d12e636e686cdd8aceab78fefb81ca62758d47c2aba0b89fab76c00226c1d9a92b171256743d597a717b57c4e839fac30cc7dec9cf7d53d15592c2fc24599ad9002da72d3644efd93fc1e9eee6dcb33e547eff9b3b8d19539080801c0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001697b4acc2a7b9a24bf0df4060f8670d5ce8c6386d5854b48d5be6652b5c30a290f2f869e534c7027fdf19534c17b50b941c662202090a2916a1747d9d00a5c0d139adc456f5c4a39f6769780416092f6d5435a71218b331e96032afb10325336ef9ced067b3cefc7d7c68b97403c9f1ae0283b689b2ff4ff07167ee85bba7ade5bb3f3a74fc3d1bd61cb3de5112c1a95b89c37b33c200b933fda5119dd74809221395ccb9b12a0f34412571586eadc2400eaa00946f9e4ae62566b26032f8ba28d90e8c806bb971d2b13b7aec33e2263c03f4f75ea7c2fa4151d2b5614ea0854808a077266be32dbf1b7ecc7de9c46bcbc83e681f93182e05d7c3b3128c96f055ca4f9a70e4d5a97f968ed1f54cf07833c0903a9b0abb0623d4cfd4ec4d5b6a7d8ff1a461de354ab50751e67eb4d2ab96862b55201a8b6628085411cdb259bf0d5c44c3fabcf020472ca68306b750f649a3f890ccc2990835feae9f6ab574f022abd97c04676cbe3c9a05c3d421e1022cbec934aa2371656873678de596a7163339ad58234b9fcd6fb8974aed2b219de2bbacf41d64c143b1ad818570e317a7cec82253da487af00085d01903a9071e66bdec5aa3aa09efac010f9c0a788b2f0000022800000224000002200e8cb5ce7fa1138564a39092328126380210e848f9d60dc7944bd1e15a9c260c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008620ef8e352a7a5499a4cacf351d11dfb90e824b6c35a94ded0d0b1adb48803cde9d9cb36f143cb086c1eb7e38295b1db5a51febe49fd7b49b7a41d264723dbfd6cdefaa84e7301131cc89f4a09414e5003f934a5387e1b462fefb3e23ad70aca2acc9d15e0ca9d4ebbab5a26e57142c250924ff2e118469fa5e2ce8fcb9915ccfc0b0f34c87366572ab23363eab8bc832aee3ae58dff26c67a27a7c363f9237129c0369ce93ca71327875e92702adb934cbf45bad291d08eed2f5f63be1a4868b895b89773778ea1d85d41cab786efe69958094667c11dbadf857a06727496bd4f88dd9d04dae2f84eb810b4432bbe777ba7d2666d9a953057457ab9058459e2229f8400a54bf6ec3b2f022ca0c1d0734cc6be1d8af30dd2e16ac552aa903be63d714c918d35bb2405187db47503434bd9abf163be3cf03de9460122353cc74b5ed67fd868fa04e0ece2e5bf986cca7c767ee0ba1cae98ae40907e3757e8ebf81ce74f5fcf889573e13eafeed7ba6762a0d9fdf6e7fa5e738f0c6f675cb11fc25311c8e2a3b1c5c555d41580bf750bd339d7f28cc1c1a9bc66f11db0f57f2e9add8ab67c44387dcb942c2d7e7a7b4eb73bf81adf782717703e16d97563a6314000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400120d072ac794c12ee7fd4e5650f2722aa3128adc426142c2d245d67ffa2227a9e02271a1cb940032c7b7bbdd9d586cf0d7ad1428aa253af834edc4ab7d3b27ad5a20a1de292cdf73da1223cff0a889e78fa927a35d582c04446f18094f8279e547f0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002db2b8cfb65a45ed0e590b6d76ac353dff2de7e5ca591f46094b3c91d7d210700155fdd4bc14ad7dd7e1af73560faa0a4e198b13ce8f962e1f3e5980c5b2650f33bd3c4de68838d4af30795178a758273dd7235f0117fa2bc538670d7c5c66734fb0df2787f341db826224fef06a16b978a72ac46b2546115c9b8bcb4eb21296da77b4e2ee40a6ae34bbc382de0d5fc33bda17a95dcf8a003dc33714e259989f88f2af44f11bde281e538dca25f0bffe2bf1482b611ae0373b708512110ba54877cc77482d34ad1cf4133eaac2e379472fc16164f10a7f8da912454b874077f6891b6f1ed94b801daa129bbe8ad55d17690088185497090308b163a041df2c7dfc23f699d714b8edea2fc5839dafc108e04bb38c35b0036b6d2101d0191f5e49f072708d2409cd532361c69b9c817b2524e8675f41a0d03de0fb45ae914e8b7614e18d5e979a8412687f30c006ba9195dfe43b5e401c467e1b81e6ac77dddb1d31921b828d91ac331a13ea8ecd0cf641c6cbb1b96d15df557c04a43c5e98dbdc34888502171983761caa64f9d181d4b214422a6ae28298220031bacab9d902b8471425f45dd6f3709eef6a5443595acfaeefc292c074f3cc14cf32cc2b32d3a2000002280000022400000220057d39067b196f6ac4a77e39d15e67e2f7aa27b6ddb92fe181d229c81fd296a10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091c85a457485c4e6e63b39f739b4de127dcac1d9dc881d00514bbba140ee88577aec38824809e1701c99bce8f9fb821a60770a47087ebc56bb50959b14312e206f90c4362cd1dff17dd1b64392abdbe8d5006bc2725e07b40204881d1b175409b50959209132a266aaee678897ed2ec7eddc9130e6db401921339e69c004a3741c773e21db146c74ae2b2d058f0e2a63228ca2fb6c8f8f1be49bf04453230fd8e650066ba7dbb8ed71238b3d220aeb0d7880f08fceaed94c251de5ee569535c88b6d819cd89c4ba88459df872d96c1859b85248a1ec86dcb268663ad5b77d5c9d44541b779d89fa81456b67de7bb920755f9fea36748ffdb59ab9c69dd316e0f8bff48fcf93968977ff754687c8b3c7255af36ead1d732e15029a8b9175b9badeb79ecc20a32a06e7a6f6c4833e062173c07d2991e7b7fef5e82f3afe84b3c156a5dfb0b2cc50db25781cb44164f1b424503cd348812d28fef8df9a8b46b4d640018d6c8acce5fbf48939b3936cc48a45930a524f32e668875848f23134f0e3b576515f5f2c5e6b221791aaa4852e7b2ae5617589f9e4a2b0970a9ed0c78ca2334cf9daa8d2c3b0c242eaa6a9fb8e47859c429b97b040e35bb6ce5e3483ed92e000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00223686258d6befa2c359e1e70908c35072023d6730abeea5827a1cafc6b509d532abb4d64ecdc68f2876cbea7fd3e8ba5f29accf713590a2a69c31cffc234d5fc0229ba9314d41c1539f98d6f326a988cd82647b18826b50fc9e84ae6aa795c75d3116a789be7733d8bd38a22873e80a6d398df63097c420e940667b43343c5f37d00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000974784afb9e1424f51ac69f32d702faeb9314a8c421edae413b177cdf89bedb1825fcad29d9e199668f0b89646897bb61dbfd62b1202d6dfe29a8a8ba62b4ebb4a070fee95d6fc089fff4261404290c9c64d1ee196324a13edfa4ae147d16c52124c7198b9c6954334009ec521243929d412d31c685a00d3e91e80bb4056c53648843eeffa4fe676c8d322174c2824fc8b6d3d5c9fbfa765a356a565e2ebd857d0dcf1d683d40c11195c014e763679b159b201b4122ea9b4b3d1648ec638ead26358360d476c0fc81eca4b0a2aab7e5a4f8350f7599b401ae50e7664b93fe74a69b2ec431893ed489329fa13072efe93798637f6f39cc00f08a0cb7c7c79cd7e07511bb28ecbe48e6b500ba0ae95f5c225996d9e711310d8856a1de04b9cf784e236a23883c3e65c2d878f3fa94950429e2f2cff54a4e263f7310629ba3daf1cbe6836027ec60bdcd8f937699ee54730829645605830feda07acdc5fcb66796d6e4d3c355e0c0cbcfce82ec2df79e103e611f9d38e682ce91dd8bbf11a589ecac45c0afc6491dfbce0ecad82463fcbc681f226c84dc438026cd1cf4d90cc7ab97c43f616f2ca52e8b2346a6ccc0121a5451856a6e959098dc6d0a56c0e82e1c800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d966036ebf8dfef50993b20376dcffa59e2291df7173d046af88bda18e7c5bddc4fe1cd2dba4d124578cba2019804b4a3430f366729853c5c5853a95301e072478cafdd0d7646fe95d176e6a7a37754d27721c94b8f4a4ab2e8ff6b1e3bf3eb38fb2ba5120ed34740548f32d7d8fc008c84f02e39e62de52b624902a1e3778ee651b4b4d3034cf2bbe160abc5867025b58076aa33742681f5ec429a27649e3b8f774932060fd81c9cb1df0587170ef817a338ba6574b43f6c8779f3fb1fdb297b4e94759a057b2c81b414477ee691b213cd9d754f9e3e8a9cc03c0f854172bc82d2ffac16e61ee71d66eaf4e861df0a3dd7372d3301f0097adb1e3938f15ed05bc01c5af273881e1e72167ee771e2a9c01513c4f40fcff95d176e409699af29f7a55ad79a4b41205b9ee5359f03c37fcb233a195ef02c1c42f9f6c9b2d6313c8452876a913dd7764a2f73b77c2cba45ec08cad1d981a9ada9c32e5f1d9007171cd13b03fcf8cc42561c22b08149cd5a4cdcaa27f7dc3429a870f02fa78beb8fb7c16193c2c272a81d61794144340147be298dd6266889dff113987771fa68d2d89ae20d5eccee1980c4aed3bcf7b5bbe13f67ccc899ac142cc4c3f3ee604ffe0000022800000224000002201b54a23c01b18d9eeebb0189c745de2394cd2357e2feca4811f97655f40a30cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ff2ee64580b06301fed5ac4b03a1cd5f5b166015ffb84628eec3cdf436e57e1fc1276efbc71a156ca6d64fc564a8087872e99fa2534f64366f73ec16090bbebce03196cb5d7ffffcb9ef36ba24a25c7e042c64cfb2c350154863bb5e77502e511be1ac2e49fe5d727c1977e97046df60dbcebc7c0f36f6d15d1678211cf0aecd71e593145e677af9477d5a69170deb8df774aaa7d533515a9f72fc78e90e722512e6c3b3d9af1177b92997877dea2f6c6f84f05a32c437911f261bab72f382379aca34fa3b4545b8653e37e63c8085b62d3607a9443a1f09d867063c65f62a8b3b911f4c562679ff1dfab41ce133235631834115009f1e622dd691fc9be41942ee77f89f89ddb6a803a735cacefd5a610ed62c6418d2e4a3f05a49d6ef482139af6f887110ee2767cead320d40cd1a0836d19761f308a9b29674c690babdf3bc9be708eada033adc20dc06e639a15d4c463cd647a98954bf8f091af39207600af4013809701d1bc1377cc3e57c8e858763531cf55d634e6886cd6aeb3d964122e6e96e155d16161875d1caf76adca40536439a83a11ae98ab7b5598812dd772387bb8fd4e94efeacb29115f8fc2e522988bb80aa4469b19ec413a6c46008f75000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00229e4759b81b3af9c4661fc50dd3debb0af938f7a4cf9959913f3cea73207c8e21c2340824dd7f9f3d353cceace4955cbe71d19a279d245dfa86ef237c7928893022a8d2332d318086bec3bbe52b5c7b43197f5c17ee7a6954800953328e07cb8e81c1e8d6e04d494132ad4904bb88482070e4fb867f1fe175d8c712c02b6c2c7af00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009dae055e8325209f157ffae818072ad136001b7ede10d3aa9828259f1d62859c4bcbd1ce36c288789f58254f433b5d96b26cc6ee48753a2ba2096ee359f78e8d31b36df861a7e1a2dd7de1d11391df626c248d046b5e2a2299b4e111317cf27bf0236e6f5c8771b03810f27522a2f161536b398fe4d2f4b7dd78e5114b4af4c23a3c5282ac30692af48aa14f86673be8dd51dfef1d7c8a1923a34dc69c598b04e5772d0c0a192bc9e52b34760bb81120c7aa84d96456a93c1e8dbd71f1e40a69bb8add5a6e345970f811253a4b06646b77344391d28bad83f5c690498956e389baed57c323f981bc6639c2991b6154154c2665540e654837c89008f9781f87615e703265796758362e784090ec939429abd369a1877cb1adf224efd8bc83930d68c9d5eeb4a151c277e69446ca7c30a4b9a73fc61f35f2d28ceb7d989b4fa2dbb4d7e6a192755e3c91291e22252ce0280a069e4f2715461c9034c3c96da78c80788763bb11a4c203807cc53b6513be32bf5d3cc2f1c6d0725db0c0ee41fbc83e8a119ef49c46e09d71a59d4bf625e8c99b418a87daf488d97efc334ae63b43d7e594e652a3ad02504286648f37ed04aad8ab0f04f9e3249d57870d03383f9bf9000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094122e1877121bb10f5c0646455690834bf4fc250047c6378d17338e31d487e8b02d1b9d127aaf8ed03d8a66f46afaecf032006f8e0f63230b2c8b4ca42644317de358cee0807080ba326cb0e4d00190217afdc2a2d56efd5a050466f6b5bea8ab0ff98c0a5a5b2a2951151f40a154287b99f81ae601dd6d4ebe8807ad9f1da0e319e9648c5bf07e59032cb710276a67f54e82e0f101f972836a7c3d4aee0fed28b99f231f9009b63b21cbe94f319ec172557ab0ab86ca88ea02ccc2920f9bfa5dd0945661b82aaa67172ff90168a8170529e5949f6d64c1437c069aeadb511be54dfe878074d2b7f7fe8abd538af47ee6bdcaf0a3c4f6c7b67bd081bab01d86494de8f8823ec4671531989cf9c0e3595f7cdc5675643a0babb4e0c514c1ef0e53f57bdbf7dff6420034489165e5e3d74f182da907508717cf5d31a676df5bd6659dcf9ee4cf8694fde35d68f0849cdece7d85d1f3e8454afd55b3d1a13375c04a68f2ad0f873827506a495e8bad643fbd643d3a690c67cbbe805a8b19cffed066dcd7502bbbb871d2f9ec41c928764c2b06cb7888c3bb8071c27a0a5c280595c080ab914df80f03fdd434fac067189df0b3a1314660f4d0eb41e7d072efcb3c000002280000022400000220249581723b5a6ebbfc80c9cea3ef7c885bfc22e7a7ecc03dcdb42755a057ebbc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093e627bd3c1f98ed6aaf2f78a137f166cd8c1bceeea47480285e20f75001abc15d378223c868b948f6e8e2b611a60800fc4ef2591d409283c0ef586e109224dd7dcb02c5a690f472224ab825a3a4ca7f9e0a427a73f711a205ff60f2c52ec641bfbe68b0e246c491a1873f59e9873a1ec05cc8799cb5b746c51660a526c5b9f15973ba857024aada6410e5918d45f30b879f25182980df0f2269ae4de012ab232709fb5a9f846797a552962d122d0ad8db831317c14ce6f23bb95ee99bd91b05c34dc882b0960519f0561742cbc0143d974f0925788a9843464bbea45007ff96d12d70ea3956facfe6936c5be220ae1eb9a89adb18862bf253f681e4cacf7fedf93ff2234cada5cceb025546d2fd5b05052aeff888926b43e922cfa0781bf9e9585192bbcf39745fb5b17f7fd827c7340874284743ec3f347530539fe2c09100870a5e943e8d9c6c0e47214390aa1bd6e98b95be3038097f8ecd42d7ea75a3e09b3e2116aaf2f5cb988ea4e8e01c0e3d7b009e3a5bcb152a2ad3dba5f2c58eb4bf5a4dfa3e6e9e061da455e66799e3c29cb939ede594434b0e825a349f272b3d1268879a38ab63a68c6b19dc4c5853faeba7c5ef2c32ef4750b89fd130e9f59c000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012bd05ae6e7781a4f86341d14c94d5193b21ea1deeb298622b6ff8d047b7cab2b022e32d1ed950d0cda4336481740ae7ac81f518c0465abd51a2c5f14e2ca1cd81d0adc84c2f5a44e3cdab9b96468f6cbd48f1d251389a9b9adf4f6bdb91476028d000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a452826919b25e2c07fa2cc50a6ecf18932abcabc303f18e6b93ed1b03e60702b6b690d6b65c77e025dd85adeb02137ea204eb3f5f746f9623b8fae21663c16be7929345de36eb484911e30b03a564da17aeeeaec81979eb0d447adca5c1518b5fb66689ba8c526d631b048a53b5c36f7de04ae99c9a5a471baa72c70a042dec77066cb0c4836ac9aa565a43b9998db5f5d17dd99c2842ff6ed8273021b78a2fd3b38be3a8c059439977b3f439fae2c48aadbb1a20f8b6eafc509710c6729eba042a4c121d6e0efc17afedcb96f4eb382e4b1edaef54eb5a46deef15cc9448e6d7968a955a6528286519982edc8a612b5051d8c7c503492c9f7f8d8cd5db5c861344f0c9be8f9730ebff17e364034c2af6b9eaf5bc93078eca38a72c0628ad5c3d89d75ed9c1ce305a074333b2436d9fc2d5a6bbbdfbe01f904734230fac5443f28144999888ecc185f2933e265d54eaea48daf6869999599720b4a6112cc8f99d0921cda12a1ff3cbf1c564977897cee5153b68ae62e8f2001aafefb6203ec63c0bc806496aa41e4b78903957138c841e32c3d0ca9bd90bad5d71d471fd3feaf1221d02656a0b967eae19a346ab3ac872827eab6de1f6f09468493b416bccb7000002280000022400000220005305fe0efcdb8c6b6311d76d1fece874c7ac1ae2ccc20bfb885599f609a38d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008675fd5b8d317ab064961325b4fe792d99c087d278be0dd76adece8c372d0917ab62eca80b1e7bad243c849345ed791d98b64817886d98584a1a0b49a637dfc441c2a3ddec2366b175ca2776ba8962be1b19363f93ee34929324aaca7fe42262dd96d2bffa6c0891765c2fa2e267304a42601070313c38bcfe2ebb4890b227a9eaef169d8c918d05bc1ffbebca729b3b2001350fbb3a21d800467f61d4306548e8a8e77e87ade8b6a67ce7a35b27ba692c4be37fb6a7250fc5b6136d3f3bd68a7b6b84e236424d1cb0b8aa0a0ed9b502c5194bf1af10fe754ce9cb2772506c5748e3a7322dd25138c89103e07928c34e234e4726a856a8d4fa2956bbe418b657425f5190ddb538ded9658d5bf2450f968ab04c22b4e99cd919ed0e8159468d7e072eed1bedd2af5f7a1d2bd917948cdb844ad444b726a32d23f3f4b80de4f3f03d8e4725b86bd725b6ca5934cf59c95792e4f957e6a9e78ceac8df49b97f7f7e0437fd4968fd58c85350906ac919e7ea995cadc408de08919b056a17c3573c1b35c9fec7efbc88b345812189b5fd0bc5dc965b4b649cdf66d81eafb179797e88144f54227d12f405a7e61ac4617eb4d410c236236651e9f1447ed05929c89ed90000000400000000", - "1019f1fafdb75f212142e78b345fdc0ce2101b3ae95aa6a4b03b12e8e215216400000012000000000000000000000000000000000000000000000000000000000000002400d75ed56dd4fc8749b12feebb9acc2e8cc1b5f472ae52a0e49bf2bf1eff2ac000089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000001202eab8e57e5f0e33138321202c1dadfd7f23618187b8e35e491d596cb6607a75c00006f001eecb62975c92cb1b9e3f8d5a38426014ab661008da5ddab1ffafee89392652200006f800825bed0f04513688a20a73113b41d525a804966b3e35ccf0894be7867dd9f5900006f800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000070dbdb38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad35c5600a99363a05626a1c1626f116dab7230ddc5eb8c1187683419fdf5c1135fe68d2000000120000002400000000000000000000000000000000000000000000000000000000000bec1d40011bad8d250c8db22e422b0261db321679ff126b4625ae6150593d2d3205e33f7a020139cd90940af81feb3d09f077c7f3de4793f6f4ffd50a6ce2758aa73499e0f40e686f5eb45afd5610db2cb5bf789c8f8c86c40df47958b2c106585b74689634000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000883ac626e8b2d5588265d38932c00b8d09db10bc6da3c17f24e710be7912c0744dc9ce5801450d255e3f3ae7a84aea7ab8cdb8614a6740d1b45822e1cfafb376876d03883e3428d6225f91943738ff982d39ad650c919f50dcbc5bda54592dbdf595a32bb3fbe314d4b1251847ced351fb840d8af5ed17f4a1d02d1c669f32e34f00af1b369e52fd532317456714b21493fd81b652cb6ab3b9faea37b97440041b71c55578367669ce0f92c77840aa27566f31eb885424bdd178092c5e88492d57748e265ef4c1aa1f33d9b97fc5556fa2e33e0307a268db4fe27b8bbaf73c87e902062cfa1168a03159cf91bc8a191fc9d8c3b4e410ff3f3ff59a6d7403e73b5bdf043f1fd79a4654787ced848fdaf1e8b13676c97a9853f23a3582a0c63f9d9dd8af418d7a50f81c9b8d2ac784a119f6798d1913d9745cc7d387756790cc78a43acb71915f439762f6bbefb1c7bc3ef245a884719e7c6c72925ad1e70978adccff0998dfba9d26fce637fd16aeba248ac5d80ecccc6cb5e5dcdb15fcc0830b071f5b56b21aa3a8916f4b52167942a7f276eaa6829a0c94674ec8f42ef02d92e00611ba1e44075f8661eaecba010176339b89cbd98fc91feb7d5493e84d5ded00000228000002240000022007ed8084c7072b3ed0430dc63c64b8b1c61ceadc18603977282d1c9514fe8f63000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d8e398bb7ae5025a241aa76c54ea9effba902c07b610badd306d5308dae0a7a80c9bd7803b527b0e63fa20adcf95634bff889d91b9b04eb30041ab167d310779e8c6fe10732c6a1320f7a7023bd9b5dc7e58fd846e261cd019fe8666568bf92aedb594771e4006fcc522172bf8f4cbee8662f970106f7cdcfe8485e0a063b2dec8bf57a315a5a9cdf499dd73c6bf1090e7218fec94982741f29d5f1023a3f76f64b83572c2b5762857f7b750f39498dc514eec33b5b69b7ad1b31be4935b706d63d6bb8238e5be6b58a8b6d034c4286962eeb357aab65cb9f58a356f56d445ce68fd586e653def78574f63fdd55aa7e6e3cea340d41131f30618ea8b991c194f894610fc24c9b415b26faeb946d523fa6a8e8dd27c2486bc9bb19731a92dd4a8c91597bf1c64d9b6d46971e8d1f54ea0f3275ee63566c30dd9614952ee4b959372263a68bca431eeb973ab3525bf7774c3bc512106869387996b159b14de275fbe152ac1eaef89b0f6402ca5d1d00ddb054e301dff691bc23a64417eb7bc71c97d3cf6da5f5d815d81d0e4756be3b3f0dcb1246abaf093ca324ac5422b9e2f0fc987f91f34e4c41cf9ae4ed708a9ae8c03635dffac556f2f7493bd65cb62b13000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010e64b3960368f8068def0dc6e491cb3768c8008b1f4e03fb536b1721ccdac0650201bd80b3782428628dd7d71762c76af24e26c66bb94cbf0b034b0f23ccf141ec2a9a7981c7d4b3f447f364fe229f2a2707d1964f527ec04dabc0301a4b4c320b000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ada2f00954fe25709a16c0403194e9257da64f94cceac39f1a12b1aca44c7b963b547fb08c2f58e8586afc8aeedeb7b1e98369b2a8daad7b763e08ee581c5d68781df8841633915a76991a4044f5c15f86f08711363d6eb684da0871bbba41cf711a7d02fe5e9d5050f211ae9bb0815db21897631bf4450d13793cdcb973f760b99ac5de6137390fda276e760994957adba3aa93183a61a5548f286e058874747bb4943d6b113083ec19b7fa71c2d5c723b592d9cf3191572d0c39996755a0d98c0830e87654a552d4c026036dc10d390c9730e1cde94d2340accda85a55c50d20b22c94da7f2eb66eafca6f665956e5e3a6b48421e02945fc33c3ca2dea836b868b6a5844009ab160908274cba6d538db914bc937952750dea58eae06aeee3728f10b970a98b79fe4af2ad8e2bee598f75056d25d588e6372c8bd1823456ba868dedc2fd65bf76558b02104405c455aac63ca1103e5a5a5f5584d338e71502a79d38844206bb91bad6e84f0f5bd245d46089822f3788fa4056e0af459d8d621b475b0784a2521f80bdd74c23a4af4444df247bdeca1ef09ceb3a70e1e3763d19dc5778df5112cf2e666c6490995069571de73bcd6f51d52a0f86292c7de3c5b000002280000022400000220069beafd9d94185ada7c65fe59b21be23e1ad7c1db69cd11f8c896c5e36dc23700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038b9ec10103cae335b32fcff11d4bd15f2a44d6f3aab361694ec66d335cd3c662e0c76ebb99fae4c503d6b5db80a03245e2a3f013c997e2176ed753e9273bbded68684151c3ee23ceceff3b84593a49c31732b4494425581a2ebe55d10802594bd9cc67eec488b5672248c86612676d36185cbaaa9458ed047b1795eab99157ee77b9d0f615c9aee08bd7a82c1d534ffd0afad1127ee0ed3737978bea646f5f85cd04776bafe429f1f63bd6af843c87cb8ba4352a77e864ff63ba677bf2873ac322c00faa9211fe088718a236abb168adf5a41c97c54b1d6984c67718027a2566ca77c5665d4a0fe1b7b7b4f1bfd5c3dfd876ac1e9d5d704c91851963385a5f901822aca82197a7b798aa62e5af0d4f08a5332530c7820c17b1d2c2b3e287e02b7eda9a0e5e0c449ccde51fa5b55610aa057351f28c3f1122375df9ad8f08b6ddbcbcbeb9df33e570c42fd36cb602f95149ca91bd3b3399b12b0b99265dcc8a10ec201f93de0f9dbae4d51e52119e40306d4f8f3d1419f351c3c6d84d5734ec8502801cd053e887ed5735f25451d3c729753766bc018befd3057660af7ac5165230f1ac6c8a70c007bc99affa88029ec113303fc3ad32af7643e7e56799f5dc000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00215ff7d5bcf924edb6726379860b4960e1c52a7f358dfb50e13ce28d7dac2c81b293569852cfb609fc0fb3fa6a3f1dd1d3d23b0bbf788c422f9ff959d336973cf0202bfaabeef3fa976cdedf4def29821cc660690b5fc86e1b0bb3cc94601ef44fb05b461158f030e1396683e699f3a59a7dd388a0432c171b4bd7526620301febc00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189784eb09957bf663d19a343604495f12b5fa272d7e1121f8df2617dca8316dbc567087e29a05aae38a3e57c8e01e9b56de63169138bb5d47fbd081ee855ab52cafc85b74534fc9e592cf877e5aef01cd9951c1c1374df542605cc3e82dd3c818baba67dd6cc36c3a6304d656ca02f3b5b4e11c13eecdd03a6bb36514e2282b4ad7fdd094a663a726511986c935b0064a5dfa05371349ef85af967dc126ff1829614dd07beb32576456f143b255334a31f8928af90bb675d396a0598db7ce27e585679652ff267af003b5469192d7c67a7cba9e4d9c14657f2e655492d7edf2b0df085ddd1767c0e2170267d875c43683f7a7cb0c13a9ba547b7f6eba0e5ad589d156504651cf4b55b44ebb18fa26757cde4336e45ab0de21c9da566624791b6b991a58f320d393adc5e93beab587513faf49824162877d5fba1ebb218199b5b1f93b99c7883982f3382e0c797b6b463ef8a16a9d4a3265ba2bea45ec137e3c55178549fd8dad50c1f9c5e78ebcc322bd64b5340bf836bb7178df32339d886178e719982ab2480a327fb60846f031922b9ab529ca1142e3a9f58591bedb343f49d7b162fbfcb1a1b3bdc804e063b9d4bf4568fe1b8aa17bb95883b87b93349b000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020903ba5fe3379ed8e5ec1410ee74edb784390f49f7990efb332e24c300e30c00c7b0dcd871858e947f983e7f160f3271b13fac3bd13647849c1e8e3896dc08f7622470ae8f51ea3e0e8455061199862dd21df330ee4925315ced7ed60d9f120b3166fe3c77eb33aecd14b66cad118c5dcf6a9bbfaa424e3ed7c561599a63fc4107a903489e7dadf05670636851f27d86b3af47952aabb0eba32344c23996ad0079550342c34a344243187325cb709d41015e65e3dff974e030bbe6f08d80dd22235fa81a4792dc628438f47dde3ecda392b4c27e4365aa459f079acaf3ff7e635addceebd96977270575aaebd7708fb5d81f5ec23e93e5b6f78c77caf078ee6a2f75567f117c595467f3d8dfd167c98ae013ce544586e61530d3f6f835851286d3e37d4acb14954d87cbae0a2a67eac6888b9f23ff219e74d1f7c81027b53259588bbdf7ef3d08caab9fc4ab6387a0bd3db121d4282ab55d496ef7693ec1cdd4b4782287443a225bde12c734e17105f52e6122209598c66598defbe57e895dbbc0a1a913a421add9b3bd32274434226dce860e6d416bdf600c8f00a6dfb0b29d7522ab8254508fe3b4cb4ec742a5563f78f283629db6c56b11bef4b4e2100310000022800000224000002201a9b8fca5384c1ca8377faae5acf86f54ad5a6dd063d5bc714ca982f4836baa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009bf7c65d3e5f37b8c8c6c638923a144f022257291f54ba25af4e27a1e163e7dd3698972fd9158cb943c365304031a58654a0c1927c5b56473e819577b6afd1ee0de5b586db9dfcffddb76ff117c0672efcd7cebab63ac0666ebd986ffef629622b6ea4ddf049a8162fa671d7b5370007024589037442d78ecb87c8bc24d0484a5cbfa9d026c34414b4cd18082726015ba19e5a0ecd2acdf56f3432f7104bf39771b96f091534586c45d5a19cb0f8c82b6cb077563dc28ae7816a93f790bfaccf07a818a7768e81c4b32e237996bd119a0d949b59ff25c634875d716231dc68d45a09f399ac7472b6db2d21796584037e3931aa4f4f7aa5b843160def688e3b65a1f0b7f8c2334d63f9611d2501781171dbde601109501fd07e4a0e0b963db65490db057d8f75c25efd50a04639917a341afeb93fc30b7f405400f6133464d6390505505c847741ddb7fe51d6856baa76f3ce7fd5d43177f3fb6fa0b7da668bacc6ae2775d081b433479d6da59dcb38c4cad2ec563b14e9d754d0c91e89fe9d93de8efd503eef0d84ff25d2e64d25e1747d8c347861ad0ce0358ba1d2a0830f7c426aa652247d50de23fab2ce7e4cfd3ff604408acaa01f36c77e319497be7aad000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020a52f1de91fb3e9b76d4363a3dcab8d0613fa5cadbc7540f9c70b56eb8ce846e09410f51aa105d10cbf19ab305eeaa75b2ef24edc228d3fb29e6b60e16af3ab40203e16cc62a1bd2f6783d77e442ca4fdff9a0b47b61ffd99a59d3f153d2dec2b32168805960897b91713f2c1fbeae7a5fadbb051f77bbff62281207dad6b3d5e800000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016ab0a6d09b1a8a2d9b6749f246846f24a354b9f7550bd95bef7e267bb8e8033127f42baeaa5c6f462f6cc69c6ac03fe0a396b0f8b44789815daaded087aa3003db8e7d02f70dc281292bc4411ef579395cdaa8626a629c5c643dbcdd25cb8888a0b4b3651ab7cb71c114d3ef86487bf9bda99b0df831316dd74ad89a83c8409283da55fece4280213f96b92244c05c66768a182560fdd0a07bcb3b10a8bad57d0ba905875e0d60de12a5cfb08522dac492e1612d780f49980c9c3efc3d47b17d402b836869ee72e2cbf81b1c0d853e058cd9ae5bef53d41e84d5299eee24ad8ac3c37b22b18c6ea8dcc7ebee2791b14a7df105bb277edf05790324fc2370d2b37113b63667b7e3bb359bd8c7b717c996d7c892f37be0eb7ba34a2abeed9b24bea963d6c57ec8a104b7c8e7cdb2766e50c63d9979b701853741366436913c70e5628012411f792850346f1cfe67886b2bfffdb9556371814420e39e347081e43861ca049e50fb0e416cd0e42bd20c31c4e3e82228590ca6a05234875febe8eb10f3294322f4e9befc767724da4f0e3e7a88dd94b9a80245f5346e0fbc393c2bf42da3c58986ae7fa6d2cb4da3eb9d40043424aebcf42318cdbb04c8694ba17a900000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008620f4d0009210e10b32c91e47bed997b7da61099e2735ec3c6ae34cd43bf9236ca57a20595ad82237d7c5c932b4b030ea5f8bb173046e910b086121bd25183aa61e38116d5e83cab107dcf6feab02a9f60d12c3c9bbbd16d9d7504dab45825beb65d68d577193d4c63cf87ed2d6458689272325037c49f48e74a829ac54cb0667269cad9b3d0dc2f49dc1a10062c3a1cdf80e95d47fa7569eda450624e359a3a459594bb0b600a7f08170ab4456e31445386bbdcb541eb887844e34499e9c1b4046b3cd1b7d1e82fb3c3c1264fda8e03ef883ecd80a7f2f9301bc47a1a2767c94e30aa6f1bc521c9b9d5d1553846ff1a0c51a7c54b31c790d54160641b088490a5d73a2eef6be6fd964aecd97c152306e0efff64381f43b2f601ab185a0919b478c68e79a02cf7bd4e3f4b79d235ebdd6de7515bd88294bd47550001a47d242c31c4a96fedb3bdf6b04b9a8111e9b2bd98ff21f89ec5808e9d950a02a635c6f7166bf652d607ca2ffa48e5d3e7d35952477443a3ca2976caa2b468804e9b6fb6c8d6e6068c3195565cd67d99061f3887db5ba1602cf0c813ca762d5752600e755e3c00c90ed474068aa2a3b0f6cbbccd6c4370a41ad258bbb04d9524f3695cf00000228000002240000022000b2805572cb9dd73fa825b66d20de0af3a72d0bf13e26cb631df5b048fd81f6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e67020a75fc80290b50af8a2284da0fff0cb2daf9d186cc9d6e5b9ca693fffe1b9a5e53a2a9064740db81e1e7cf1435f0b171e39ee36ce2de60f9affa90c36a476ac2cf23b600becc14c18ae66d1ec508457d76cda8ea18f3368af97fbf4b3b5cb67cd857ed4bb2ea3b9f24f78b33c454908332c28cd8130649b4fcaf4359577fea2077a8989284b2ea5d597af1d7453c6bb5e4fa1824a32c7e836f1391955fcd7d91f4646a3d49210f6a9d22c59570f2adc571e756fc3aa4a6b2f38591b36b2375ef28e8bfe5df3348f069d92c3fbddd4e79dffea45295306c1e955f08b50687a7ee8ce3d5f189c502200b7a6c7b557dae0e08b0a59ccd59e378b6969b28322637ee21f875c2f3e881d22357b5483d35b2ab9b34ec479a3fce1ab51aa46fbe896549da79015d7e60b945ccd846bab1e0f89028f322d1477a00632f3e154bf7111083e7b6480f587bd66a778c7d72832028943d56e75492b5d7a4853ab043de89821b17982267b43fa1ef89ebc75584759614bdbbeb78b79fccf2a20c667e73ed4049b596e6a34069878c1cab9b04a34b7bde879e0cd93032d46f5b189949b93d51cf0fc73e3dc01a5ebba0db3e10af012f5e156476600fec4ea8e72a396b42000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010036f01a27e0ae7fdca47b6e14cf500e060f6d22b03510c31b04675ae629068a02061312199d177c5b00fbe79f6b9ab91128b7b82d1a2ef1e0556e7db06371e03e11c943dd8089b8ee705e401fa3235cbf3dabb88219942fca4f851a20e0d157890000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f172777744369170ee50464cd91a731618e58044f3c3c623d12993807237e728b8fd771e0a7b4efdc4b30200ba41f8835da37f9a15cd3eafa25be41ef3c244223a7cdc884f9443ca2260541220c61cc84dc17c81556e5eb92057c59260acac9aa7ccfff4d8b7d8e8bac91219fabd878fd1d9b0857e906bfced5dd251dfd377518e7be0e9f3397c21d9ded5a74ccb8ebd061fb8f802821be10db72101b676e32b73acd8cc3425bc9f572bc853ac0074a66d49a654b925ddfcb4bb4b819687857764abeb6cb007368d57c24970fc35992201736144eb09619b57324e8482543897321589b6a054bdb703cca5d4de2a8bf8ddff8fcd14ee7910d3e0a5b10dd73455f5ce0008934abf2be86c78712a433ba416ee4cff723dafceecf5b6becd9dd3f5e9a80ce4f5af7dee00a52620c449e53a7293bf070cee943195998137c715de49ae720d09a66f5108e2851f1413dcba04e34f4dbdebc09330aa45f874a1b3a16ad899812836db44239d4ac9982e3ee1e73a0777d2eca229d671cf9fce049323d645c2c24c60adc62dfaa479a71293f62a16dd30537de01f39d0add6c90929527193696db3f1c43bf1f8c8cdbcbb5f8ce603649fc20b156802b03bdf8f0341f7100000228000002240000022017ac6b22f8654e28ee24254298cbea2c51fde1937e9623fbbcd65d6552e524880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015cb4895a82b13b6518d0842ca255541ef9fb1a42c8a0aad16a423b2d1bf959d9f68ec49678f1fe6e6b28dd49a1bb07b325e9639326049115804ecb23b8171c023a186d95e924327c1f19b9d33c8a449159458db66cf137aeb2c001f85d556eb6f0eee73d504910cb9dc4cfd589e4305977ee4050ab827207ed57d88079c846d4755d51300307e1abe578cd49e7c59e67cc072555be4a4180d998142b78ff393519d9aedacb6f4888979ed79b0eef7f74f2d13c59595d33c92059ac5216a237577936849c4b0c6179c30f9eff72b98dd0ce34a1d40277dfd9cdc437a4489c34d8cb6f91ee85a6ab5e32b532181862784ebb3d37bc099aa8b6ea0108e44227591ef57da2d8ee5e50632d4ad650508826e5e97eb75320cb6d91815bfda2eaf5ab4f84a3bb4bafdfb97f7c9f41c3d0ac753fe7458a6c54ab48a7a37224e596c0353a4f2c98084a6c5262440a26858e600c8c7cf2aef1710385a983bc9d5b5917f3237da997bb62c471081c3ad917bca2a0aefb8fe9760959965407edcf2516d00fcccf4b83667b6e1ea41724ce21e00543d87bd6c91d8847cc2b78c3af9e8817ff8a6fe816de7d73c9797301ac839fb6c5dea87d1aed75e61384c32ce92e3df725a000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012975955125433b9d34f12dd9decb97491ee4d297d11f14669b6a6f18faee9b7e020928fd1c9323f78b28445b934f1bcb040397852e960f6b93fd2f9f6677e642402f4ed411547f8610999b9f829d80b0264469ff5f480110d30946991696609c7d000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000875b7c3cd0713a5d277dc334bec6c24994eae8b5d439d786dc40f8f40669ed6811446955230ae8bd4178a6da322a595d3c89aa3133d67eb959ee7ed0c52b977369c65a03d87a144fbcb26eda69ef7f09240ed6b198985195e106f759e601a6bfc98160795053f773afd66d3c4454342f6ce483eb6296ae6bfa9ea6e0d5e0e0052ac8b09c9ad6ba917268922cc384fa6a5d9ad1638e4e07e8371db4103815ec851ba449928f14aa817920a3014074344c68f6dae0e1244da6eb5161714c2ddb5bc2fe23c4c719637349a760daf20274c12b4525418397ed2fba4757e450c2eb0aacfe467089997c5717aaf0fc950968afbc79a960285abb140f4270b89768963308c5d50de68cd5b8781359d0113d72f60ee29f781eb14f5b8fbe4395b12a4961902e9737bec8f9092d68427de4d6b8ddefd594d12f68f75ddc4e7f4dcee02b17aedcd2c26f579ff6bf802f3c57f4447ee0b1ca78d734d2757a129a289b6eb33f4bd5c995efb2d09933015fec858cae44a1d1c899751f7804c1374ecc0d8f3843084c0601d92c3218e23cae07c6565e44b63fde446eecb5c30e3780dce6b03221ce4552165c4c04d16dd5debe89d88ce0a8239aa65b8505428ce4d4d807a357960000022800000224000002202f3fc8010d0e60725ad4b881dc177264c353026fe35d7edc36c36349e1c12303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008bcea8df074b75af70b70aa9258881aef50ce523a4f4e9b69f40f05cd56984c1d13f473d7ff6b2c7f6f5c5c27c3391b7cfc09150dd05089287407c1f9ce2c78dae932f19383c9dbc02a62afad92e79e652f996d17d58ea38dcc473ad9fd8ca2e356796effd28d4f4d6a56d636920ac99eaa6adc3b350e423af44a07f1a13ad799202094df3bcda7b455b9a3e195006bab626cf0f06e7ee71a10a9390a911ac3b939c1351795c5a1ede778c3160a2c1d50ad5487fa1a6ed2a4af05c468104e6f55d3758d7959f9f9806b9f991b2be37cff2d1ba3a27fb09b7c794e40f5fa71ec0e8cdc41ec4242568977b9d04c3795726e8dd8272ce4d508e5923b5aedc7532190fe2865f9ff8a244d2627b85038262a1cdd2c8352e8b5e38e18f37430b861816025cd1aa4fb094276d33c3815628abdd20cae1f5ba876dcc6870ccda284da9d663202ffd3db64269b20abfc8472859555bec59e60b7817a0212ea5c066a04b704984e7129be9cbea6e04db2aa23b04e86b7287615746b34af8dafe3c8d1045bb061fa16dc6be05dc0d69445054dfd8c1d986eb04734d922e3f3a6aa9e3173f4cbc1637e1f1360086e488650caf04232ed96cc2ec967df61dbc2ee1963e4ea878000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011213e196cd86d4e4c26531d726ee97db19cbe595725a4e1c499c8f41f694e417020bb00236822aa9639a7776c4d410709e1bdd9755cb302b3facccc8587b93576b210464d972da7a6d3b86010aa8a36ff621f85614eeefdeb1beaf3375730457a70000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000619d875204c7e2b0b6de2353c51a49146b7a5f766cbfe69596ffe9e0e2387f77c62636a16ba41adbaa59200d3bc721c0f807f7749113df1adeb86f5de7707d50b37b93118547399f24cde7a1e1b184c543864bf59800837292dece868d5a28d01971fce6ed973e2ff8e8f1d2b03c8cdea44abadf56cf92e144017d4dfeef4b8fe46ebdcd2ba0d6c935efa9ff1bd79928d5238a466f662175512cf2f77c2a8f9d5f0005a8f731c945beed752b4f4f4b5df349704bb3f2c58fa63c04d8570afd8f82a2d1ab4ca69fd8bd423aeb378bb01e83737b595173bad1ac6eb9c78256e1a494e093a880aaa64be17e7244ac2ebb9abefcec0bdd73b22a1bc7e3affdb49021429462f7d4d9778e876d3ff0272d16c45be198c2d13f45ce465e07eda8babf9b2cb7c6e54c9690d4d50f896e0a47c59d36c46e09f87ddcc291238a4d9b2bdf1806bccd9989f9ec006af0ca4b48f3f584868afcd49ec1833479b150f468f87a72c3bfe72be31833573f529d6efed27b88a463dca7aab80c11df504a64fa2bb0998c8101ceb7f917939b930a6ef8d660644f22e7c059f6ec97b7118e4ffce7beead1c4317185006a7f583ee575345f1cedec2b0272ac8701b6c1b742886c29d33000002280000022400000220206e7c6ca4f9d9fa5e2d445a5060cb2c94b839c46af9a11b5b4ad08534458c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082f2226a77adc7a00b48f536ba119b5e90398733413bbe442a629b42f1dea82f24ef2f0a7335cd83259980c513aac3a59640d04faabcd3c2025336f861c1055f5e8320611c29da8c21e639620ee4727f132b311379fa64bd7e3928297a56786bf6c2feec2a01f9c6dfb0c80b6d4f82fdb5c3bb66614a039615e7e5b2d6160626af06922ee05d58197da52d1750e0024627089b6fa901dcf4efd1c2aecd413a9f7d3daf8570511c25b0f5faaea930a28b8f7a6a92fa69f51f5146a3a90e6468432f08943a7970abf083b4bf6234a57245d1498317843617af780f9dfd2d3f300cab863381d6c910c48230e0604a542e9cefe2014578b4141476c4b57e0c2317617c54a4af0f9226a70b4ef0a907bf8e68c332895ab4475826b9167970ee6fa084128cac78b2d634283bc5b4c932e132baf9c9ee44f7a5039d74c08ce0ec9151caa51cdc3adae86e7c2c0cf1612664cd2180ca8e63b99f388edbd11da0b66e493ea296024ee48fd3456cd8ce89f50669589aadf81c7980a283b42fe1aee713c8ca0e6e05a9c588c84cb91ec3c7d960e79c2972b3edbcc00c79851b2e47bd33298a5894a69a878a70eca6eff8f90e939d590c5b1c15c3b153b8570f89814796db59000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020009763695ffc0200a07ecaf9baca76a79a16d55f8673b2558a5bd25e6fb3fbb2380c65f721b8e2d0e7b5e0006487957d542c5022b2ce63cbb82a32d9b12ac84020d24e5712b56ce0556e8321c4a6e7ed69e2520bfa0256b49e13bb337a63b5eda05a2b34733f1bb759cc8acae1bd6a989150bd9c39b35d2cb96f86bc287fd9afb00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a17cd19fb6f91dfb1e2f1233a4ee76fa8499dd6e252b09d4f206c9efeda694a6b418982be994f0150662271b7be3abbcb618d057ea50de14a97481571c2b976133aedf29d21695e6ef8e83e2d38b39d6c8b33c8522f9d1a2a1b12ddb79a1e5368e36be84e20675e9f651e49665b5b6160720a50eb8068168a6e43f515a4a8f1dd28daa9f818a504699dc6762c16ef47140b8057719e038f145a14a0d9f0b2ae6618efb291f46030f4d3651639a37eaad94a855d04e7c1d1f65a9288532eeffd19a828f3907802cf87183c4802741945a9a12339ca543188ce89508c91791ba5d3adf231512a0654a0161cce46e2a32feb723f0b58d5c60796cdf84aa4866bcedf3de4d381cd0f1b43380ec3df896aa5c1d35e7fc5df8ea8c5e2ed65504e3a5650a20f2d827887550a0ef873fa33476333df1cec85941358b3a24bb392bdfda81aa331af0d583647411d7f63334233d67bc3aea3460bdbd5021f7adc27b259c60658a473a047ab133c8f5fe3dbf2589c9e29ac76ae2138691ddf2970d19b31c315cf56b0dd7f27075399fc9f902ab7c948240398a0e0f8eb414dc148f9105d4237d65a4b87aee1d697755b7d2ca69908100294b663c38716c89d3d3bd3173bc7c00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009641babab2b86b07d129dbafb2420f43414b9d9af24fd621931649e4dab0e4af9a4702d6597346d00391d55c9d45ca02146e81a35d23713f4be066f23920a46f7e4d6a5ad61ffbc24e312871fbad99977ed797f473afbd8f19e5bdb9982938717a2b8ba36e45077cc3b6b709a66e37599c7a78472f54b78b58691a841902255db2537539040ed7d3b6d5ff59b136153f4bbcefc83415388e4dc8996621e65638f4fcbd24dacce90cd068b67bed550b01c4220921c6788d8a174dcbcc9ec0e088916641fee844f07250c740ca0041abdfddc89916a5d84d52e5796c631519ac7c677d1b027b074f4fa0cc98e4cab717e37c361050914413a25d0600168805d323c22da94dc07af71132dabd3a56f0db91d03ba3be0395cc22b0757305ff2527f13537831a8bc0357fc464378606ca34a38aa64f0d5922562a110475a6af7fcac2c11e7ea86eb487e3d1b852d44e5bc4555f4f55511da21ecaed8fec449f57db40bf6ce27d648c304d64bee603262cd32d4fb1bb9fe532a8da29f6e5715b12c71f944fbe6ea3ea857c598264fcabebf8dd46ad5c3517beb951615194d38ab95263d609841d51cc6f648b58ea4cdd525b8f62fa084a4e1709656b5f782fd010f09700000228000002240000022015a0b4a1f89fda11b25192cb564c8b68127c4d71dd03b53779338df77df22498000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b3d9fe083632a6c0ea740ac1f1dffc088b00cfce901903e9253c79c416acfa8f69341f1fa4d683140aa30bec8915c1dc343c56da218ef04b05e93f793f65fbea01854e392b5b6719cc759e1842d2051b9154bf95fcd324dfdf251267fa825c3ec991b311f06e260d4820039aaa611af4e12a1fffbb3394853ac56018d076d6609dac31c7560fdc54a5191aad34241d9ef503e44126cf3f295a0c197484299266a0512eb19756e7cd13b9fd879f8265b6828ffb5397c9f4cc9982d4fb172ad3ea3d1f24202ff0963a7453f01553e853612ceba5457253535d395f579967fd12b1dd8540091d064b1259b206e8b2f97ef3c444762d7e97e9118380d59723fff91f46f2201f0f7c79bd83916db6edb1927e002c782831fbadb58857c49e4b8d3fd3d365f78c65e09798ae4d317e7aaae6fdd473ddaeef691693bd800016f4c62f4e786e5669c6fd00d3c7be24bd7a6e50afb16063186f1eb8d427110500d40df225b1da3db1174993a235c1d7fc535ead848045e0b277feecb17d37bf8fa0be3c8ba8c7023b0be987eada869d551cd740fc232a4de4a5993de6e910b6bb32bd5fa255de3788bf3cde887daa078b6ea0e05ceae3f9d2b7cf18fd7ba520afdbd97d4000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001165b310812210c4ab4082a8f7c1d8dc9f5575d0a9ac5f4a1f82018009737d815020d997c1db09537119ddd6fc20728a84e07e89c1b01b17fd3f3361daa8513efc101590cd16f46c7206cbafc90b2bd30a5840bd7a45442d407db69782ae599465400000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ff47779b3a41e583f0fd4d7d750b68ace767ea45ee09ee5221a8d574da57e4b17568f028e736f0abf37d1b56949c1cdaf55dc3e8956c9b3ad9a4d8a496630b464c76340943bd95d6fa881f0ec2d0b498293d22c671beb7d4eac70fa2dde74a8a56122376116c9d7065a0e7d6b7d3f9389c417c8a62ba4d729b1201c64f4b921b4f944f043a825f704b22b8a6f80acaffbf42b178a4edd4b174e8ef6842b476fded1e759ac5e01b064d13420f402e48039128af2113a0ebe02b8c7656e65f99428e433d8e6fe75e8af26da906b055a20c2acb7f8e8cefc9f89b85b9eb2a23014058ef5a1c67b4c50bc698d38072d15dfed76c736bf5af3969dcb8c333a27c34bf1bc0ca2631f7115d053c80e837b36218734723c3a43e95fcb7818e86b72da00e5e6acf11647061a8a73f5618acbf4d099f5463a36049681a41717b09c19f99a19162c0d9acf3f7ff8dac0de29281b51163520d546b7fd4da2bdff8cf968b99f1fdd796670854fd7b94f232b0ac99da46f963952f6ca5810c2026c2fbd01912bfa2c6170aaa989d405a62fe93500f3e1e0da32fb182efdcf2a60b8a6df3fcf66b35ddc91ae7b910acfa2ab8fcd526b5412d18ff1efcd812caad5c61bf0b61af0000022800000224000002200babe34aa8dd056a1f1685da25621d28dfd339bffa6e68599d5be143997bff4a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d9c4845423922489f83ac4b0f4e8da560e7df426820b93143efed19b4b83cca7c57710d0733be520c22db3cfab04d6cb4971f5edb54c99e71261af1d7e33bf2b79f66edeaef7beb9d7bca2097916e0a8994ed9361e171a93d1948a5951780efba854cf35d472c065e6ba25e1b092d6549deb5e11507e3b5187b6cb9744702a74fa1f2cbc9f28161c67f3c214f3746fce1234a09322075d2f5b80378b3cb59265f0c5c57e8acd8ce158469e512011327f604309ee626f994c566b66cf6980e6dac2df61b17ae451a62bbf904d4e89febde45542dabd3eb42d5d4df103804ce16bf6d44be0347e44bd113b4e6d7dbbc24faac4b8b4fdcf841b45944a1f5498b7af47d71018ae6d8b8bb817fd88b0fb0e6111caa3e47bf6fc57cc4c4686cd5186e0e78e2f505f7fcf6e5c7a56714dd82e8bb5083935cf424e94211c5ccedb2b8429f76912a16a83c6c2afcc014a6002cb4cac1630d960020fd252eb63a67df55f4caa8aab2da5683f3f8784c7568051186a11079cde084b46ea93e5e63e7f5d992d968fcb494b44e53781210cd482bb18c7c91e42338ac38b8b1014e91109c73108439d11174063b033aab9eff2b24c7fee692b7859d7fdffbacb161c8af89a622000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001077b40de939ce167f1de10f80e26bf8e419be7ae45fea613b8f8c7a212d80108020fc2f605a06694592693b18ef7d0afe4c4187bf03f75bba3ca365147ff7280e803a019b69acae3d64af00276dc917284916a3dee4afd6d44d2d401fe213b01d20000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009765761e4efea1ff16ba3de6c5ac6252a3babdcb0c6bb04dcb9dcf5169266e6fc0797d57ad6636ce47c55f4ccdee27e051f106ec004352cbfc699c6f69d115fdfdbc5ef1503d162fbbfb821349f52202f68414d952234164093a5da83e73da8b7e3d3701709c0ad71ea84bb1cd6b553b711224d639bfeab851b8326acaa46d7b406dc4fd329767f455a93a2813ca108790872675e8f8e519c0c3ace3f11ced96d896659ba419b5c5bc6be98faa1c75f8b2a1695a6a3c743c6012b9dffd7aa997087d32c62df2077e97a46608f3ca940f71e5b5e99a61e83dfcc340b64ef318a0dd5882238b15d085cc91ced80a1f91139495a126784421198fe0a6e0f24d3347cc1ec66f4aa01a99b03a03515983fa4ff87f8250f45d44fe5c8e1974d043bd8dfd25503bd733e1093ef780c13feda4d74659fab193e9eb00e8d1fa62545359ebe929ad5cdde7c9e47b932d1d0f9f29920a072f2ac93244f53245e068482709704cb73a6cff1d5096de1c8bdd9c0114bc083628d68c1aa990263d2f0537e773416723dd4db2d4a4b1d1918f07629d88e9658c370200ba8fa8791ddf6f40378c49b207b088a6f5079ee717141382a23626bdae6a5784e09c9395f6d0972cd60cf50000022800000224000002200d53c0bb7c9d8752545ad0f8f202bc7b295cd33b663cd9336943dbb9e2bd8da8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d4242fb7d0aebf5ab25e232a14915ae7d4483a6395b44582c1afd18f7ca3ee9ed7205bdd6a5149c6e3fe210901000ce79e76ffb3a1c9539e8fb3fe02e3fafbe169284dad1e9f5bd4e684358e404b04265b7a3aeb51242e57fef4fd938cf9415faad2950306017db80d4654bcce7f407eecf12c152f503a45b9cf7c3ac740c557e15027479f24bc434e2c35094503714f580dfe12cb8e218066e08d8272c1d41f009d509e0ced263c94677b42629e1bed9357efd20ecf64474e77bb6adf953d1564d299e91ca741573a39b01997211cef16a5e5a77ef84435373c7de3f3a70c8e99efa48e6ed6bb28972f71a0c298cc836e57ea129624e9c024d8f29ec3bd718c08ceec844ea855c772deef76e1aee6f9cf31e1e41ba927129b82c300bd60442d33756070a44553e0356519c3a74e1e4e390007852a57eab5a9d15aaf4b87b0ad9c2cd21191d0987a281233ff995ea093fa3cce3dad7e6f2152e58a5ee0ab985a0aa0eb09e7cfbec03f33f6d984dcb6de4a83c8a5a0b30acfe465d3379ae8c5a84daea081b5e0ad1c8c8caa3bb053868e81c45c72f17a458c2a8e52e0c00e8b1510b7be161556020c596b9a8da5331a58feeccad51d82c9bf8579485caf0adeb000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011bdbabd6e422df0b775c8450e13f1324046237820ec65a07db0c3e8c568f5b8d02131a56e48b008853f09d2bf7ea8d6ba326b68347755fe7422101db13baa4ba8e276ca1a7e2f71b617fe01c26459f3a448cb772b80ffe6053fc2d44ac69f1b6ca0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009652798e7028a528ea3765e0ab9dc6368cbfa4b5183047ae5cb71d5c56945cc72b892545b5ccd91232958fa744fd221db837835f6a0c3aef469a9a5f2aa2d5e9f0deefc4be60e33ba85414325761e223c81b10f6563b211b42f6b8827f4ec3369f3ed91baf314c55d4907f7ee188e09352ef97c12a6522a8b444acb8982443a77fb42545c2371aa111721faf4f09967571a87dc5ccc85960b9bb63f9f8556ae9edc8c14a047a3e283467027450d3e5a23a616d0ee0c201947a6e8ddff9680659ac787ad2ad10633765c47a52bf47cfacdad4ea414c57f80ac47b40e5b3a4467e88922969cb31022615235545683ba93faee6382b6082a13845e3c0f08515aa2fdbe2092a6c53398bcf17ead21c0b1faf51f0fc45aa537f82accf0baeaf94cea495d4c3afdb727104b22cf52f53cd88f1f43a3ae56a17552b50865d5429c5605bc566048d40eb022b315b3f1bb5336ea48663ee9bf24a94bf19576335771c0c6b5c9dad1aba240939434c6fb0416d0bdaf71104ae763d1e5718d5b71b834f1975186f87d2b7bffef32f75a42a3c090479160e67bbd19218894b80dad0fe3e0b7858086bf75ca1f8c3643d8a64291713d0de0169b812c9abce8fc4f093388228530000022800000224000002202778a5b6385f271ad5e5d45755f73d939a6b729fe53bbc723bc041f1909ca8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085e7bbbe19e66de81d1cb537fd1d969da325033afac85826a513bea5d275057f700e738973389a13c044e6347629d326202f39e3f2cfdd99a0cb85f0f1ecf58913c81a500337d865450523a5ce0ac6da275fccbc3a57ef877d3d367adefc05bbbcfad5d75b87876997814b4178eefa05af0bc7ee979689c2f7b77611ab50a91a8d598c9f2cd94b7bafa8ed2c634ed0556e0fbc3432ca59ca46a43d1732e2accb5098ebbe6ead43e2f42ae4c311eefd988868f25d5d7748aa7ea4f11939a18be15fa5689d6fc3b66b3a1d980f4e675cc24bf1d4001936d578fa3a17a75bf991b3f89d185a31f7ee392e582356e4c4944bce931633bfa0a89c3ce876084ca0be28dbc1cd620172622fc9f2436de59fc2f9f5532d71ff9e5d7fe84e4e1ffab6ef569be410d6c675e929d9c055b2f8daa81dc797bebb940cd0ed63b9e679200d96e4fbb5f144e637033d9c19e86b29217e0e15d0d6c79fad0ac2c4d6be2cea5875b6124e462378c417fe1fbdf14e9dc52d2bb1095a2d93ffe2fd4725e9e332602e89b4c92fd62626d935b8bd388255e3035c5c53839b5ac10bbec4e95af3a3c941276d7a38c4e14c15760d896bf0b8819cfd3689c46609b916a2ffbc31110c15b5ab000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400120583b5324462a81d70939a8a9cd2b9ac546162424d9855a51f788ebc464d8cb0213b12fe9b80911bdfa5b8f709239066aa726f24ac27b31994f0ecc39a3d531551dd909a48abaa8b25064fb341d4f2c355e1f5b7b3d1df09a084f65f8e583109c00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024b98d2544c6db4cb3eba5f2fb85da8743703e710cdd37897361ab2c15c68a7ae9964518b1f33f81b2bd6df5c9b0566d5e2156520c827c5c48eb1c2beb822100c1ad5db0a8d09e74e7fa8e564cbe39205fae829b9e12fa9835769c1976199b9c94792c107fe827d0a540e49d7f81dd89ef509d4bfdf855696106e3813a22a441773c3bdc43b58a78d3f6254198b1af803af3bffcd57133849400516d6f84b636c4b30e3bcf9827584f556b7042da898278d36c40836f764b83214af8806012d32609adadefe5bd2522b0af3cb987b5e2c6250307988a102c591f43cb97947b1ae96a63d1d1e599e126a429a67eb1968d04de8abb52ed599733eb20730115d86cd4481d86d2e143816bf1fb925a917a2f85e631b4e8ea19ddb88c4af7a61a14a1fd52f3ce97e3cf28a7a07f0815cb678dd03e37fcceab9a72c544378a927ce1ec7cecbf943f0a134caac3634b43813fd447a8c286ee3f525331f60acfb9eb4f910c320398fa954c157fbac4f4b08eeb4cd47ad33bafe05ee417a05e8719581f5df801845e7326f137ee8c8b4929a3a1c685d93ccb67f976575186831a6c8fbb8ab9bd6c43ab4fc329615b3a952868ec3f60125dc2402905507dcedfb71ea2efdf00000228000002240000022024e2ed255452d387e3e4aad1f41bd2d689745b09e2c997c027d82ddf469bee78000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001462db91a6c8336f7f93b15a9e4243f84ccdf737a2cc0b92b43a29d25939fd082d48e5f8b708c67e6e48b590998a6b6afa0a8f512bb78bcad2f9ca8af61bfb267a5e35ec9589f5a623294c5bd242e9951e08cb9fcf8819e88619a91689a1a62d313da1d84eaead6d6b98308b1194c50feccf459352a11e71b59fad98f039823ce954f399d1e6ff3e42b89421ca96acecbb4ea05fce866e5cbdae263dd0bfa5afece7b38dc13d59111bd0b851e45e58ea4ff8be93d6c2f47455418d2c0935826c1213dcd84d6f1237a8c8bd3d962d080e15a9edc620f5209d8923b62256b85889862e2a388c5e51b0bcd042ed4f0d7badad8ca9910957145061f34076e21169fc29c8fd61934b7fa3c447b18cddf246aec84e3714007b64f3b35f83501779ff0ebea456f46036f7a655e3fc37a52d4dd8e31ce16f71679e03b1e123c99e3d260b7a6e1f87f82cb0c5fb878ebd231ff98604576428c5a7c941eab24bfa13a4c50ae7305f681ca4a2aa413b099894f640ca90110a4b968d39b0bf71293de161aa9fec86a32bf7a603f286f83d9100e24e5861a665d42e0ae356c27086fe18d24e1f7d73cac088f18127f312dc0c8333917e917de7240b6ef0dcd02c0bc861cb85b7000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010009d6818dc884be618ebf80d73a2a42918ed76c082f8a65a5e2d4429099086c0215bc1d39673d91d894246433f89f4aa7aecb54f4c58398566e53df3dbbcf5f4f037085fad46a68561122fa91e5c54214e281585c02e716cd7d8b3738ee60259b000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0e03da47903560cde79f7a319e2175a4da6f181488b2866aa5c0d83cabf3e801c9b4fc3832ebe2c18909f2eb9888046d03776fc452d9dfa17d90cf6640c5fac76af3dc0cc4125121a9d625211faee89332c6586a3ba7a8d6e4d66561c8737fb57a7a0703dc7fa9bab3214c57cf4cc5f52e1e3d9532f7c52a6af2f27d8596aff0fad4b8bdbba26f254a5ef5c3699b7e42253015c31eaa61529c2a1b80d539e3971f911d035d75be6a1bd5aee587c19b0c51183c3cc42c45e9e0e16a5dad9554145b439e2782385d5537b9bd5650b29dcea9e42f3dc6777fdb5726bfcb3f97f973dad020dab1718efde49400d9704d61f2dcbd426787c0475175b24becc3ebcec942c07a02e95e777d121917a9f09370d5cd29f611a0136cedfd4f5eef10d8f24a0b77f5743423eece516630ee176e8a865ec7976204509eebf2650dba942aabe42178f58d9c096887e348b6b884ec0cc6c539e77b338773497c8a1d4131b52e8b8c7447948da24682a4e0b62f504966cc3358a2841d905e0339ed062f250ac54530675040ee593c27a1fedcd7f6160070a11ec086966edbcd3d32ca1a505618a56cbf069eeb97a55f415fe4f56591077178820b4444e3d20a9085a119e900b8d0000022800000224000002200a7c4f97afe0a63e85c8dbe05576aa0c83e174f4309eb8c97c7ec077ab04d86b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009114bb01c87f7c659be146adcea9fece327a88f4187211a0558efdc9f47b10ddaa912614457b459d5dcbab66556adfc0b71a877ae57167d07d797e6d9cb3ec924d6b125d53f0cc474ca5d1eac237764253529551fc099aaa8665cca33fd713746a532218f9b10d215ad05c5469891fe9234e5935bc3b99a90dfa02f23818950bcd8f5681b88a24be451237e3262e68c8010d3786cb12e986749eec52bd87e817578adc72009fc929f0327b00076814884ec50392e9a3e172b6f54948aa7959417ce740a8d6943e0021ebecce8d47d6ce82e2c92fda67cb1b231380d4befc7214db2b12429715aa8b0e855cc1b32db9169e2d390914a782f4e03d83db8bc3c004bd47974eaa6aa42e56e83770367cb78ecff8af1562e2088e7476124988857712178e3e11a6fc22c0c6331551484aaf8589993afe9665443ac5b5cd712780f76e1f2e69d3f363f58a329f3e0a2f569ae7f8d9bb6507534a13fce11a77005fab4eb17259fdb1534eb042ba8aa0e69e5e7d7b8f287845bf6ff22609a2f7249cc27c468f017a187095e9f137a9172ae5c7c3a27317107b43a9249c2d1ea8fa07b43abc4484758fade147e763950ef30118eae291aeb462d203292709520679f55040000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001176ba4bb652661356266d5ffd2074b5103f6cb6699d6fae01cb7ef54d03069400215c89f973883f8237e3b94474c97fed07c3682969518928786fb77345e93a1872bb6ea191cac06febbbc40fc25daa23c88e70e513d5ce287cac41c65a125b01000000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087188d7a06ce9bd32e7d85f88bcca2d103edca531f882c36b31e7148924fda84c5f5ae31a43499985a64d015b5ca8b47d7f9d5879fb7d2116ca92658f35d278994cbc72d91b2dc40525bcec7583af7e688f6d64b6d2cd4da5abeb12fb382aa3e701b573738130ff026ace64a6f9d3aae0ce71f3b167b2f5741ae40bee0d7beb3c2476a43948fd6108d4341331000d0e81096e48aea5c6b5eba3b4eb3efcee7f3fc853e91eada8829a1d6710a5faa5b896da1367327ed535a7ee1fee2c64c9008ef92168da41d36286a23a27f6798784270e959400cc28519a04021689f16bb0880ccc26767acaf508f1d15624cbae57bde0dac7be0a47a656b47a392c075243acedb0407c98917a4cdd5cda014d8d8c4a580a67dc9f1ea714438124566e1517bd8e770bbe779cff24144192160f8e50e34b95b53158644edcfb842df0e98b205c99e86f872e5eeb2971bc71b6fdc521d2f38fe108addf5b21e13d275551383d5f55e59121d88679eb7c6a953fd62db359124a40eefea7838521abfd7f9a4681b59bf80c35135d7b72660eff585d861fc098f54774b79ad58b00fcfdafed48ac307a20ef9ccb93193c39abb72109636ef14ff71fe9d904bb836de03b6f44273df0000022800000224000002200fd5fc3ec9fde54a3bcf368430ffe0e4ee0e8797f35bf1c55eb583b109c8a552000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001142ee5d8f800e61ed42128712f2c2004ec9731c6ac35ef51c5de6e6cf270633c9a829d8dfa89f843bf7b169c83fb9e2558109eee799fc8203ea085efee2fc2fda5a5342c4028ac653d65f5ff767dc9aa9db3a66c81621cba0ece4f4b4e4a618defa5a778df236539cdc0d759a52c29ee8ce2a9a531baad6d170f73485a52d01e01482ea0dd1cf24615191a29db319c49cd261474a7a39522736b5f78b6f049da1c666e447ffea42f4b01e3794f35ba73a69e867c499931422f91afd4319c5c226f209147078129a3dec2e8ccd672a1e1ba1e3f4d6a314d03f019951e86942a6a56d14dbecaf31c11fe485f31954ebcd6395e6e9606cb2062be5e7f28fd2195fdf209461b7f875e7565e20e0aa0b6d285f686877f84b4e4fdbb6a93f76bd5b1845c87323e0d28792544ee5f2bf14127c5a94ecfcae0a5f518bbd807a814a4349a2a21466ca23baf49ee321681c6f226777a87f8e1844bd8f805650c4fad29539f526dcb23766b9e94390b3887705d1c17838ced1193a4116878da699edafb91975585343351a2401a2b93a60fe02ef61cf8e34585eb0b1839324daded72ee4d84359f5a41560dbd9ce6ca7eae2c66f1456f7916e15166d173ce6f6be75a6e728000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400121565947525502ee393598938c3297ca82f722378422765bcb3181d5bcf802650217a997dd84a9e4aa2f35b9ce348bea6f57118523518d130fa8a6163df108a0a21f451a905fbabe60fb42ecdc57914df063112df1584679dcdfdf298ebf501e0300000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030399aa669fee829565b62cdb15934850c04d2928f7b92340942df5f319e0421944c04f82fc0a209cf49561e00746ed85be205eee8483a63d00e0fe7cee88ad0875796b36f095467b620c798f119899f8c6f7948a270242b4b28baa8fc225d47e56472a2645c14d1b2991df25b0a00881c7a5e257bb02a56a7163e403b27693573afca373a3274f1bede11e400e90c657f9a7c15c3ca8da174526afeab759502aad1c8903281feb7500ce3e75d073d6739a7dd9c75dd2e41c52b426535a91337b523d42f499b58eacd750010c30a7eca0101e14360e86f0bf8472b1f9bf204decdb5a7c78f666f6351143f588634bee72933c93f685355972a7742a3160d5b772e3c893c95563797598277fd5933589d980db03c4369cdae99954124ec8a1c6721ecb75fb9882ea4c133d0225a5b1663062719aec9d4e4e3dd607b5f4254334b697d5aed2b66eadf9bf1236e6c24dfc8c9a168ec95de1c90c728e649f8f272ba05265bad14ae06bf8832d65c6e79a60433b8c2b300a7f0049e7e512d69eba0d6f86a7492afa3a4c5a4058afa5d8a9a9b3114f4a02fa811f181df3f5ef221b3f29e6ac11cd35c9630b85681dbb34cf2fc9952450b74e90e6d98b9cb5af2e75da400000228000002240000022028c6910b715037e2ed9751ee99f8309523e47477ecc2c1f166213fe44f7d763a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094ffc5c8a346e710e78d5dbfdb96d294b6f7cfbe16878237d4420c1a6e75e22dc8664f5f6005551c8d7b1e7bb22678e3dfa2a0c51d3dd1f3689fff995016b855ccad1daac6da94b03da9175cd1895be1b3576b08db2d334a59618b42703ca58bf16e89ae0e968d2a356d5412210f9148644acee2ee4adb0b8ae279a51072310a03e2988a3e18529ac5bd203ac35bfd4c72cd708de6ea81272e29dbdb80b8ea0f3f868b9df866cbd4eee9c3127e04ac8278147c474f3747f6445b530300505dc206a8994714c1d189054ec2c7978b99213ed1e38cf3b001063a5958677d5567dc7530290ce4dd0f3712fabab0e19ee28d3646d4191ef86e88042b2773928f5128593e6567c1df5e20c3f26dba114db6cf045b9b87853d6cf6bf51314032a7025a09438bfcbc8fb61dc2c19843aa79e5a12209b5177b6178497cdea69fce35b19cca8884ff482945cf65149351d5449d3b3d89a810c0f4535a48b47da39339973b55806142ccf05ba5bb5d26b2848ecd735f8511b9dc046c70c4f06dc89610ad21683ef18f2ec8b2da0fc44da03c0d5bb368afd588eddbf2097462762cdd36e09f54e89fd7ab5d7d52aee96c207c62e73b9e4d595ed47e62e9a32074060904a98a000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011663e20656831e3d44f3501cc330705702d89302b0852b02851a86de84e4075a021847e19e31dd623da35bf0f8f8510ab119c60f8e9d04b29b5cd078b67efaaea21abe38ff77e8ed0d6c8e20660b302ac3f7c2eba8714d5fd174edf0f9b2ecf0cb0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f529d3788159a81d703fef45cc4de92c1ff2498bb6fabed8e9240f8dbc1ed61cbe5dfb9595f7ef02608882e44f4e180535e277a78f277395a170247797448fa3d3d63a8c46479766e143c119264108e465dca10dfca50fd108290a089250108306af4b1d2faced5de41676daaaa7d4fc8c89b22074a2245963f6d33db82cc73d70a49e70ba3cb7b4aaffa0c5dc77d322b85fb328cdff79eb9238d17e08a53976762be4ba707b6e9f58facd988f20d4e55c41671a96e1b3bdf19c4bc05240ca5e6f21e46809665f7f0ed64d60fe50445293ffd7ee01e8f5256dc2e99e487ad1c35e1533278819b39d0f99ad6c93e213abd9bba3500e76eded0f4106fb98f12c4f5346c40db33886178481c26ae28fa53028406600407da0a348fd4033f55a994376455c3944e78efce3c7fde3850fd89f354af2d8bb6809a9b03f7db52e954851634ff3fed2456ecf3e3901f009da32eb112582a4ea68886e3715656639f4b7a03d6045f6d3919556106c2c32df8366f3dbe95f38515efd25fb699b7e1fd226ee04eec12cd4881a2fcfdd32e7669ad1a29c99914d5a3b865560352cc5b7ca5963044fe907189db4415ce53cf559e65df2e57f5b8397c273fb9516fdfa5faf6480000022800000224000002201ae7eafd60b712759c076cd48c07a3a4357a45d0ea03af97c9aff019d00700d50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ac64d4fc6c5d19a01c5da6e08ee17ebc7afdd66a5828bde01e527705e5bece4a54ea4b01abd00c3c338aa916465e87ab554f2d99eb8116e0bf43ce81c932a9bcb85557b5d658f77974f32ab112a002b7c6316ed7cc8ddd48d5cc6d27dc9e81dcab6de7c296628ec939916a0aee3012f82aa4d40579604848b82f25f277f6d198c5ab6824b4b136a2cf5c8828ec4879b88b05b0e3c9bfdc2c2845d70ad90311cd16f1a68a4160176b12dc5a80699e581a907367278de530cbe0bde00a8b97a1835d676ae38aae0d62fb3655d2e04c6102393de1ace6688a8c88619230b63b3d4f85af31bcfcc588872c57653d4604a14ca56558a5e418933ed75f083723b08d564faa31eb675b0970aca4cc6f8abe72f501ddc3140e2edee35519217d2e83c6fcf7f1414d3f99d993c7527eba531dc0826c5028dbbd265462ea2d12faeffb8f2bcc6ed16a534ec27e95da82ad2ec7bf920e755ef58e59ac78d035837501b88e2f5d4b17b0bd51ddc43718c6adf4b4fe45070d93b3111eb56ad755c6841e7bc84ca2046d3ef1aad27d2ff007c7a33debed4a20f662e2d54362b4ad7ca38b316bdfb2bb960c786628d1fe3c2d04ae32eadca60d3d2c90a472df05b4531f1184fc000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00224b057aabe22af4c0b106d34bac8007e7e80c5588d853bec0a8b4f82f1dd4f72092c2a2284436cee1ebad74f6b2f00fae675ed93ea41cff8a0da6e53f8e5e751021e21e39577ce027123b207db955d42ebe726b36856e64ecaad08db665683b4a90dd0f167293b4b022dac3fd21dc157d673a904993650adbceb6a70ca59d08ad400000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013256c1b16621207e640331a7e577099484121c662a0591c86f0319c09a3c89a0a331c35dc50251b366a486a2a399e5df59f9546a94afb4e59a641db53680647243e3a654fc4ff01d71d345dc03728010b1529c1dbe22e7576b6000611a610c11c9ae78a4a73ba751235127e2fa8d4a781b8b6cd5310cc846a463e0dfeba1490406d35c76217f47b7a3d2e163d97220d6dce1b90db1e5797576d3ba2a273d245422decd6a51476e83fd9d73526748faa08facff5f6a67077e3fe888f7a3ee37f7f66619a1fbaa8d1ac46093a3af3a25483cf3da663448a070b25a2fd66811edfb5935d29a612fe86800032560e52d19e93e60b71ccad63673223f8d403683c1436f3b8017fc3236d6376bdd108d5b75e02d098ffb240cf3aebaa4a0e8560ec376642727d7d3ca95da92f57e809cbd3f38471ba96eb88acc08be90f01542a0cc869302b8f0e43bb52d9129c7db5d9de3349df207000e3884b41d6ffd074faf3cb94d4a06fd933aa3c36bee894ebfdf4c54d6e674eda76af7cf8bf5efa84596d3c3608250d8937ad92ff8073c7f5a52da237f0e4f5a3756a736bea2e7ada9cc7a88c807fbb137ac8e0a0586fbf9da6a4f4bc874bbd666d77fff0edd239f98e14bf00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc876720da8064183d567ffff5b2a9dd774d02a6d2368f7538949f29e8d5e1a375e3ce2a010d4317230e4a0cb9bf82df5deebfaa0ce50a761cb1f706c4786f819a1989a1bed6c6cae233a9bbfd3e79659904f9bc84be561fd681fb950d6e4dea76061a202e8840b864b5c2a3a3da28f8e805f8bcad3ee88d79ab359f7a9cae27b6e0c5059402a521d7c69b6ffabf4ef7ef915f4d8da8040051d0c7ffdf02c9db653f424986df09890fdcb147b5053df620928c76e1a18c4c2b8054cd7fe113bab231d2400a52d34f91c540de47c5f8f6fe7dd3516cf46964ebf6176556b5b1c4ff05dc10114db30d4b1ab4217728178246e72d284c23cfda78f52b72077ecfa2ddc6c27cb2b50743e88a705f3a1911878bfc1bf4408534bf3c4fe0270375fc7778f5864fbb150bcc0c48971822a849b1b0346069311099b4acd84c38b23a1a4cd920d2311205a629950a800f4efe0bcb7230207da898d45d517df8a234ebd2a265ef7c90c0f87a30692bb77272177ff5f95b1f4460fa158781ff7bce975ebd8cd268936ad7362d938df98532c46ed09d4cd9e0b1df504199e068af27bdde1bb7f1982846b6fdd3e3c13a3f533b07f2bd3008c1ed479fc2a9a656013f1c974c10000022800000224000002201f37ebea50a9a1a065fb73f21c455b85360ac10cd497d0e68c6e0b9206531ff80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c5d3bde5a03758355b5809dbe78a800455f50f223b6cb6dd398b8644febb3ec7826b32569b12163e1a99cd0b1f06ee6b0da47d7e5d48ed056591d992c69c9835aecafd24073cb273586544ef51ef19ab59cf0576db2a43a6ff12c76ca9491b1aff96997065ef76415d3d41ef57b1d33565b1829fba74d11d646bea00445f4523e77470bdb31f5706e745ec672008f0290e72cb79676d7fabbc9628a2f9130087237c67b143b5d4c87b39e3f7ddf0946aa8434418bddb3358de2b13807ac00cf5482ea87e4e63151cafdf5c10ae19c3ee1672a94419401b52cbdcf8511e7d81c4cebffe78bf886f06a30e0e06ba63018248dd70101aa02426e34cb13356cfcf32ce00ec8b9368b2cfb626def673f63ea9390dd552c91075f703e3220e28b7fb406c7b49c83492b9dd3b728b4c0a7ac0d43ba2807945d94bcad7eaff1de1dc44d96f2d3e5ced664b6c03fc839fffc3bdb3465178b685420c71668c4cb56be03790dd39ff455c0541c86793464161878aee33b5e964918659ac18a250302081313eb4304acad886e8c47c9bf3e4f5ff30da0cb7d27d55bc3780b6178f53783c180c1a57df8dab3df4ec550cb6814f0e17a5cc984f995410f2c829f7a62dc127eb000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010547afe6f4ba5ad5f04c56f299913520bfc69e32e5f4c9743622d916d2a4a5cf021e41f49177c89c897ebb692f402af84d805b90ead6acd7afbd1691c034422305083665902f2a0af998dee47782c55a9a2482f9cb869d145866d1defcf2adfcb50000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b48bca4bc3b3cc69606c25f1d689d7d0ccba8cd6343648c8c88503c2bda612c495cf1ee42d01b1a3bea265fd0b6566737561d7594e4f28c785ad0b36d87522b16cab03856f062f3728f088b2fa5b113d77cc91e532941e4d2c8962b8ae3fa9a2a8adecd154954c3fc5b3d0e4310e4c3cbcbefe2de397b46bbefd8b24e942deeb57e99061ee7f45a3a5b41cdfeff77e1c08d763d54b8d2b1c18437ca3f5e73d9fa9eacba5756a62cca710253e34414397f6a7537f6594bd79385e857606a8c6d109f10004394c99b0901eb75dbc9f2da42dded215e67fa1e1cb326c9251488bcf1eeb04f43e4ee39af35cefa761d8375aa9c8052c818cc9e5b872e47a4839e62602c50b13b8ddf901d316b3630cd7429fa8bb49a06aff5c08510ffe71a03bc477479cd39e3aea5705de6a98a5848e36c84a7f30286372a9a2d7f272c2aa8b0a3ed7ba61684a62fc6e7b5a15271c9cc4239c460b2138dffda6f467514ffb50df5b1e671572c64b2289a38ccd95881a0483eba182535f9ab235db80f09179a831b48384743eebad7d2c399038c5f1758e1736b40b221cab390e276b2f9f77e140c4a2324e6b61fc188e607235d78a7b9fa7ab8f3734b4c1ee792620b806ce4460500000228000002240000022014e0af4b4fca90563fd2c32997f83e5c98ef91dfcb0e7949f53dda5c773550e9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008aed59d7bf7a0b470249cb995828e4df32d62d170b2317102c376726bcdfe5041f22b53a9d701dcd4cef14e08919cf4326f4c41da96659cbf727334d7136b5653035fe0bc677e35f4a140a2df8836777e6f1ab9008a373427324be91673101ede3cdfd64573474943f04a681957f8bba990a2f837ad4aebd5e5bcc2c1b1e94b361ede5a86d0d48f8f76dc388aea225f2c1bb7b3e50243f3a00f749949eba4050ac53f93110862bda78a5e1d5d4f53bdf6826508510b43f876f66e5f7d197b294f08b024bdabdf3848664ee17fbc103b3d18907bf866ca9ece1578f732d20dde285d2f4a04097f3ea13cfa4118d249327f90ff7a6336a4e538e0fcd408b8a17f73fd468d6764d765e4c87f84dd38d3a13261e1a7bfcd1e3aa72ef7271179fe428e4fa0d6b026cdfb0e9a54400398447b2c34380cb812bee83dbbba1d4807bc01b3a9315637e4a65132c37766470eb394da933cddb429a3c4c615acda3ee1f76a46f8cbdf4feea22eab11a6825c2673acfa6938c693fe89f80fcf12b40cd09c78423d58a7865301c73238f65ad3f1cc3e5b56623b4bc466ae39dfce14e20debec496c4e382daf11fd220b2e7873a76465b1106d25793019a7492aa98b568f0a78f000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400120615f33df196503af0837198f0718aaf758fa7094552f1764f62b50002903b3021fb7b15af22058b0ff0f718c02733c8ba6171e7d9e76e0aa686231d02a8a6ef206d4bafda6e95121722552a33c728e261db7b8fef8b1e55b4dffe7d91e5b84c300000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097b80a323ee529acf32a64762f224d1b6711eb99c435a64f1b5ce985da794cb692c2b063439c0402cfc6d7eb6206bd0b36b913f58021fba28b0ba3e70361b960bfe4d83579f89b580f4696584f1e423ad08b852c5b0caa698e691e04b7f22030669ceb057c249e4a1f02c98f213858a5a5a2d11b8d6d1dc071903df661a9ea7a7d5e61bae0ce95e5750f4283e05b6ad958e62a199a5122f4315342ab018bc999e060b2e3184ad5c7ab8edf007c61aac897ddab6af92c8d974e4a1a3fc0b23cf7f536e8f8a04742838660975efedc720a42444632c8eda4c34eedb64ec7e6c9ce6350e96271a0340ba144c7589a0147096460692176251655945f252ae5937ed211428c3389faafcaf2ca8100d5932d637bea8cbc8f34c49d46b0c2db14028cbd5974d22b055941a0e82c264aab8fb013f68b49cd840e8676580a263094c7541e2f1447b1445183ff567fadb4184fb5e7414250307007d1ea1bfc8952cdea67257c9edb175bf2a474ce8df606aea7b46e438d551d757be3330ed8431311e7b3d691afc3b5addb962c0d1da2d982873e86faf283f95e6d4364218842ef7a69a297d8a6c157ab16167a0600ad21dcb93df473ef1848076c8211a87438200fb78e7f0000022800000224000002202f75eb5298b95cd8edd51e644823ac35bf57cc9f8addac544332310fa551af4900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a70fd69f268efee7e4e245654f8c2755962fb7e7d381d688c3d74c646ce11621e6d2acc4a6f94441f0d35dc342208c456f619f9b82c6f1cb855ea590e7429ba1dad94ab3058738807e4758a23c72bd90b0f1e86bbd88af0d4a3e22da0f81ffa3f33d85f1547795eb5c0c5a12f49dd58c36a7a122bb4205f9ef012a60335b477ad216063b07bddb265350c687fecac10193d4fa1db43ab511953014d49d5be6296262b4a4ce2f67cbf50a224469810729ea71278914ec5b83842099040ab4f9d3123d33a9c2d3470e17432f951f89780b7392560b5264cb62ab66437e111f432f2873f0fd6a26357f71497f2908ea25421b2db6687271190f8412671c6d52a6d7c251d26179bc2bb193371404ea25817b1caa281180120dbef35596c24334526bdef9d6cb26d5a7c4f945f1dccbd1f7831c649178f69ac4ab8012461a3ea1caef75376d96a9805443c504a4e7f312462b7080f11c79f7501e40bc6cafbba6ec1ef067c5d670a1e0f475b818dc58022b35f11ff773b89fdd308ee4a69c36687fe7f7cb9dda6fd6c6be775d0d8b1ac3fd649a5178b34af61afe0f3ed192e41d4d8b3bb3ff53ec670ed9b4a8f5c89184b8a4a79f6d7766b82228760125eec43e19fd000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001060869b006c878ef56f7dcb8a6b64648c7bf10a209f21588f485aaa8469db140021fdcf0ea24dd7680e1cab3be2229c9c838f1e2a3e5ca5bef0e0013b5806e163a1d78a246876c6e538a70c09eb0b6ddec07e7bf1f3c485225566fed7f52e247030000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000567ad7dc2b3637edac4d0c94033a903b5cbcb9f9551164720ca00b82a78ddc1590005cbcd6e378d0ff2dd21c76cf08005ac0963c5aafb5e00c77a1e9258c688b51bbff3bc0cd5fc03462f726ce0982e7a69be44f7a7f2e6be0bfb7daf3d1f06edb1b94eb6ac03b27b05ef9deae801cd404cc93b8e93f099b4123f1d9652bbbf5f93a31914882c7f7182f79bda554d700dba5b33a78f373d87ba534b29b74d638c00b2edf3406d3f9303bd89eefbda261b6d627f2a8c04f7b3f2e4616c33baa086212ba016cae770cb5c5018ad6cbbd4a83a523814d78f8d4c231107ec6f1e801dd38aaf8cbe7a7b3f9cbe9fca79bb492971ed57b720226c99a226a4f55e11454f9f32dd05c2a063ed504eefa436d00e85829e0353fcd19a80022a048ff04aa0d126e463b8a80533454d3693c065743cbf35aa848571e3b364a7f3491d8dc93916ebffc99c1aa7a841ab9cb70731445dcf81af57db211d7ce53a087f03e2c05dcacea9f03829fdd87fcba2e49e68474558982ad5dcf5a58d8501e71a1278243afce8b70d1cef7dadf45bad2aa0e5b944dcdfd74a1d6b8612fe239ad1cfa8e2ad92bcfa9263acfc1dd0b8b2bae15e458c73c7a24f552e7631ab07bef316190c000000022800000224000002202e82064b5f4393c6c95a1295873af7196b2eba16bb21d01d90091afbfa02791e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024be74578651c034665d52390f9aed963cc204512d47ebd58fcb3210b8d2de20bc83b9fa53c055b90b4326da9a2d956528224cf1d590c9fa89bf39b9bc6577798316406b02279f2d785cfca24279c1e162b71564c6ef9cd9a9a0022b037e6ba25c089cf61525831fdd70434f5040efa8221eec30a788189c8a0c2382fa91f077200e57c36aae98f590646656145886acdc3f95ced7697dd897c8be2dd35209dd37bf0abbeaa6ea178d5847aec52f39eedd0cfb370e2345ebd26e1a9a996d6028ed6fac83b49e0d7d26889a9c631473ba9a3838e460988aa46b328417838c752b229c17551c34784d06550714a1362711b048c30cb25fb6bb1f175967fe3b443976a3d7a8309221b23c73b8ddda933ef361f49d9021f92768eea48104819f1beed173123e6adb261ecef1e60980059c27ccb98286a272f611b272509f3a4d871e531d85f7d67e357e84280d8e5267beff370726d218c75d20098272e6a7644e304349ed3c038d01c96fc1e808168c0a15da7399505201b173dd5299ab4a16fc88baa713ba35f03dff46064c93b5d853abbc629caee9972deeb3adc80219a7e0684d36181ca68532df7ce785395bf28e39a1538f865c5c8ab1367b4a6109bd61c4000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0021e343f6291f7864431ac81b6280497467c8bbf9d8f523b39338efac200824ea20b55cf774e677e100d188f330a6d2492871939505e1c070ab36654fa032ba00a0221a1538911a3bcf4e24f40046382645af93464b061a4f7c72522910b28099d1a1a2ff80e17a538c2da11259f97d7f94d240d95ba7793dd2be02d064a4636aa1b00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440443a99e57862b07191a8a9d3b0ea3d2ed9d61abb44916e4bc220efd5ef5f1a0f670f2015cbf19c59a1fb5ae037eaf9104eeb5037d7251dcbda8d181bfae625f201ebffd9d7fe1e8319ef8b8f4ed9f6355fa68706937984f19fdb8e553d2c101dcb3292952aceb149addef43bafb47ff8d7ae4208d155f8356259d78f825a187a88cef1268fbb9fec29563ed16fc3dde1462ec0320b621a9578671d5a12ea3f36dae999bed170fcd48f23f5170c1abca7174ef49803c87044908fe063b3bf05f1b9051c5fc27d6a99af9923b566aa57a250e20aca352a929467c87471f109230448255c514a907a54bb2af22af213ec011cd722247a247243905f35744a83f0dc67c918a2a2a3e72a64fea538e72c55c3f73631fe27f95b8fc6e329cb9b4bc4eeadd9bb5d1b2fa3473c0122b71e4861417ceabe3f498eea5b55fd839f4f8752dba554c2f40557f7c376bf0a550ac0b5c3ce8fc6eb850f347eead96d9ad6f361b1a645be2b09f68bba77260760ac55bcea7b66d3ea0996adfea1713a97c249ab4cc9197f5538d3a3ee26ec163ce06af597fd77c71d8db5dd27ec17cea292b09deabceb2f794cc7cbe82b07886df80fd0b0a8b653c252cf1f9292b81694d280000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000971a4ba97ff16c2b06d54f53a546761b69ba1ec4b0324a687a4c5046fe444f7e33eddf83a165053dd3cc1606d713eeeb9d6755069ce59ca9748649f85745c108ba476f376502f30663a0f9d496aa45ec87a688477fb25b590517e159ef83461f7ba9a53c45ece86c56eca620f9be7fdfb48d971e902c1c16d7c340addd12e69459c553fc8775edd086c28fada4ec02dc36d003607640fcca75cf44bdf51f9bfd3d747b7e513858ecae018ae3e02404954ec4e16faaed976819953dc331b8bc5db525219ca9fe8b7be98e2329a9c5f9be6403d56ddb92d305059bbdc3dd242e2a1c0f85b2143a5fd6ac927faadc21c7d6fa5836a82df73d64b5adcfb6b3062454e96249f4765a12b1c8a65da18e4bf9e95b3b6136ffeaf6cdf328893b4cfe3db914b711651f5203e1b01c27376e2c90ef4bd477c3442c001a238f50bf6924f559a44ca219ebfc512737398e0522a9a3eddd0daa7bd609745904b32a09e768f874b647cf2a3c75e4c917d75e2a820362b8e72b9c92fc2152641eade41e48f268a708c513b06d4e99fc06361d2719b3fc19b3a24451a8e587b782f47592af04a5429912818e69c747818de88722cce9aafbadb2f2f89baae3f127a3688e32a94df20000022800000224000002202cc0cf75c7b87084f1da9e32698f6a12a5243093d4cd2b2434e4c1004af7fb940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023b4fbd2d89eba1fb90fd7227be3b0c8cabf91e07fe3723d63e2f16cb4a77afa9969a84850a5b88da1657c22da31276aea504fb4559c5d574bfc7fc08871c5fd067a893ff314f42a8059dc39f065ab65b3fcda6d5a0354df5e34fe8a3ad51bd753ab508f1ad9ead1b5fa11f6796a6cf3caeb9d7e23fb5cf97593df2d1174a1e879b6fcbd0006cc7f9f71337cdfde39ac42d63cb90b09c07f87af0b37eb7400486fe019dd7fc39e3c2af74fe72708305ad1ea2ff10b3a7ad50a4c736cdd4b50a1ea854142a698bd3ac5a003d5753420751d8d3d927b64cc8d25b06c331075cd66a2286ac2049ecb41ee2aeaf57aa2f0d6326482494ccf708f8729d4fcb55e9dadc861ce8a10ccb073408278cdb7da92ff876f8a7db3fa31e7cbe5423edcc2563327dcbc48fdedfb1b8e2f73d97fce615fb865b783a850216688b8995a902cd76758de8ac678d00b881ccc45660e7de5b776dec516e591771425b8aa344d8c5819a3a2faeb825a35a82c270fdc24e133b75ad66667ddace802b129f11076805f7d520a56f19ed57f121798badb0d30f4c079d15602a390192b9dcb6a495d39f3ea218f3737dc640d46af847ce00dd13569d7822513166c4b7008cf2c1f8ff47687000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00207487932fd6883df99eaee1098c6bda89236db0f4e56ca460d75f0847219e677258e1d89ccaea1019e2da7135fc345a38883f4113e7a94d767f860bdd3a9cdd90222bbae54bb0b7554c71d504d48ca26a8147c9072481de5f85c2a9bf34fd2881d056643e5551408750ade5b40aa7cc84e2b2f76e95fd4bcdea8ffa4269c32cf3000000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081ad9cf6bda55e551f6875c855a10c85029aeef0e2b0ce8b561deb9d62da0acda1e295243bf3c4878a72b92d1046adee8f34a6cb4b68a7f9b10c266712527e52703dba084555892a42fdc4b6eab293d92d1d7592f9bc41f18d309b2778438fb37cec49f14df9c4501a6a1414b501419de2b2ef7d4ebc90622df233339a0997b2dc2c17e36496643c8c581ec84f1c957765f521e93c2bfa120a6b06b32f51e9e119b1f4d3a8f42c33f95c5212d5f9c3061e6bd79177c9fd0088dd4239a1fceef5800c7820026a4a7e3800ba7dcbaa70a833e3124c75be219211f2a3b7f168ef7d075f7eef588f8548dda64463747813d53ac0b0927f38eebaf94d5c47418c437c0678715b44804a60b462f0a44a5c5ae6db28770763aa7b93117396f1c44ae6d46914f0005b9d4db241e640754ec216c56cfe5bdbddbbcbd1b67d5bb446220ee0b41187ef233a98f2b84389110b32c4aab60b7f6957e8f2ae4b1b2a543bf95ff7000415058cd40765517827dad6aa3b9731ab3222ab6d9ff6fb15075e98f9b112dd4130542a2f9fc6acc5ba89c3ee1124ebd6c602bc0dd6f40bce1659495c9c625f391ebd6c688eed214629d9b7e07dc14ad3b47e4d32ff6e96b8486257cea68f0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000302d91d84d67064fc473bfeda84eca32217980d4836c424fd2a5a99ed023e60d94a262a6b21e1b5938bcefb8c9dda31f2917037fd2ebb9f53841e0170c132b6e28a664f917fba05a8e95fd5df2bc424daaf0bfad186869552717596af2721ccf27cd5e265983f999fac3476b1b2d2f472acd22dad35b2a3e450e793523acb84a9722e18f289909c147349bf5b4909f8f01f4eeca839d853303f88dba8ee54bb4d1d35c183f97f0c7aa0e66dcc9d0b616cce38a9750f42e3ae73a639322b53db23531e8a53eec22498e7a614bb67b807727b374a2b3fa0adcb5eec5d27995ee13dfbd01d6305e513e4ce3328c941dcb5e72caa3dcbd7c9608d85ea0f537311869d715dad725d2b41f3dcdf55e2dde43d9bf63a14086d2b98b4d8de5253cd1efdfb86e43ccff835846b9f2fc3329b9c2444c689b8034668568148a4b30e02294c851ee66ab1f78c951d1eeafccdf15d430ea1cc3232f7e73339fae13434176a4e10f23bcaa6f145c99dc62e143bd627141599a29a9fe02d9ac32adc54639f227d57016417449dbdba91bfb187efc3a47f2364604aed5cd4b0cc3ac97efb1db3e4743a3041791f959ec47732fa87fa009052f0d58a6bec7ee949c681e99cab7390a00000228000002240000022006075bc1ad1861d7388afc906f09c8d22d1c5d90fd9fbc85b993d2c77e99d4e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013419e5b12ae4f9afb34f40099317207a9dc9dfd5a1b4dbe6f251b7d11206d07fec78171dfc9861659ea37631fff7365e692306d21df77c79203be184b02d751065616c5568492c72a43a69904c480613223c538b04df97473b4367eb0ba7178280febf03deebecf1e880e236732081a0b92e28dc6dfebc0b080e7cebe671fca211d1eda18c24e103f409cc0424fd53779ebf34ae27459f4fb78324b7e2514d8a5474098a1c6b03f8d67bc07ed4e5a7be2c91bdd600c7454bd4e50873bbad4cc1e6eec04691c6472f28014f57c3cddb8709b0f11b3242e94f99ccbe66eea989334c409c66784f136551eed7f75d263617033ade5c7d880130dbf951acc7954a02f25185dfeb96af98ea91c6cda9cb44045e4d27350d9cbdfaea5f1d200956b9c70c915e863106c96f67b1ba2a51ddd95b30862204135f6222053a4442261246398936658210a8f1fa62db812250b61f8f1cdd4736b36207a84e58710b3d3c9dd177356dd960e6e5e9849caf9395452f60aed7d8f03ebf1e1973dcdb31e896c05afa759c54009a55a82c569cbb5eada7544f9de45290dd6ca7981d72b8f2d1ebe55500acf55aafc6612fed77ad0a25a836f5edcea6648a196c7bb590fe0ccdfdc000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400103f457e07a06c807cddd0c5e6c0abd105a6b0d9936ba0f2dab32f2ef25572d3a0224ab60a3733a51ce8e2158d85cae2d040daaaf5220241a7d43dd9699055142ca11a2377b6ef6ea29e80da44bda7d0782166372cd6743888ff6b86589784f0271000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076bf40e96a1ce15c7c099e1d882f4e4654b9027882538102b346db8c684d72b45524ab9e2517345d89080d71b969c9cc65f2f1a367176030e44309bdf64712c8fb726fd405d441c4ba75c9fba8f617e321d1458935102c3d9271db89abd48624fd8920090c908cc489def95f575c4be159507d98651b33628b9683aca9652f8e1b9089d7264e3fdd5577ea2a44bcdc262a430bbf1994ecaedc87a0036a75e234002d6d6fdef7be35d873f32e2367902fd3c6b8732946a852e4242d99d2c772fa735bdea7093f1ca53ed9f005e4ccb4e88881a7f929f30d08fed6380b2528d9d8125a9bb4d9d43ed8759d8fcd94bcbf4da35198b343b4c20a110b28e1a34e398bffec5c7aeac3f1fe374bbae6005422d0af290bdf1a72eb984548dae4841a794675150cdca974c6d4e822dafcca97619cc9a7e5f398525ef5f5f999e876300d725ddd2bf74e96bda6462f3eb2a57fc0aa7ba259a0154abbe529f8aa98336d236f1fa8a9e34866991a6ea5bbf31575030eaa29663958a260f00899d66346a20b2277c68bb56cbf47ffe5d060acae7a9150884cd028ff7747b99daaa33ee9df286a5c1a7c2439911e629b54fa4dacffb935c2c0ec2df73ce629fd2f45ec89f76000000022800000224000002202c86fc922b0223bceb518c2d5d3c7d2eb642e94ce1cbf571170b51171bcafeff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e19fdb994d692b581b5270ab3b3bc9c7f47d436140b24182598fc8729c167d7523a61b409bddfe03380d213509cf3715ea4aa54751abb59358c3948de090dfddc8481c2a627f17cf275e1c10cdca5c40fb7d93fa47f54f0c281934e852ad73d0589621c5d8b28108f86fc1f503b8c564cb5ce4b590a5df88db34e78ba13fc18b1ae43ff810b8443a85d7ef78f41c1c1585fd53ce610813113f1ac82ba3df6b9772f7394ca67dbbfa7868fe99e91ae23853984a2d858fab6a504bc9ddf69d6389c9e391bb407b2418762b4f0c9f1d6f936185ff670dc28cf2631e4d97fafd8efcd80135d9e88bacb33ec501995828af5d152fdb46453c280044e6c5ab39ae61d77f6cee4ce925ca27ffbaa531c2e49b4dbf37bb97c4dc835f7a441ad88b8b513180847dc73903858860a45adeb6f6de2ee06228efdc3cbbbc7add5e58e89095cb5d3e4caf8a388a23f89dc08620a6a7ad3b2541a10508fb3055eedc45e73e37f82d1dc60f694e82802b5a656b3e4398b42510bae99b389fffd452f516eb8e603325a10fa511b2774c7077a295d9a7622616a81ab2a02ca32d4707769dabd7e1bbb50d57f1fe4d7618b5c30dc2060f3246c4ef71f09ce0ab64361e6d5b3555a3c000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002242e4c5f86b4de8c30bf91a9cb712d008c210ff67555efa011f4735c42ef79e9151b1c62487136922a9422f1ad809ef7842081758264573b356b1d8fa1f2f531022553db05e5212e76ac7404d626955397ab10f52bf57dc8fddf6ea6472e4b7df23055d563bf2563ad9bc8f608cba6c3f6106a2eb4221b2287a20d246b06157edf00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c00000408000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022ace119d45cc48426f9878e154e981ae20bb9bc89527ee42fddacac0a089e1fb2f0a2d0e151bdfa107d5f5c776040e5eeca1ecabc1eb1624c0f0a6a72deab8b0613ebd40db32f378c27a317c82220d4ef0e9a7db39a650c6be9b35fda4fa1c04ae3044be56779c95c240599621c3d90df7effdf022b8eae32a88b1800bfc9bfdb9d7f5508ca48764d76af6607949cf3d572afd842679eed39856dd6e5877ded72d816541fb9f7939bee9d972a8b84748230c5c0e9aea3c06f7c158a462c395557e8b2724ae55e99d279a2b1d8049a0ea8ad7d9e37ca812ff3e35b33a4817a4a025fb4367caebae0778d25cecbe166e3c6e9328b0322596311948c5b0350f9ae0bb01312280e977e274a104b25a319fc538f10ff5a18efa44364c4cf3916293967dd3e1f759eaeb1612c601c3fb8f5354d3f88b63772f6735209413a4cacdc57defba9315ccc6a7c773b996a3c32b55ccfd12f3e20c72cb1b45de206a2f77d8d646c4e3b6b44e6f4e870e5da0f97acabe6f4653693e4f4715470b4bc3998504f47c25004f279829743d11656b77391a79d39ac40ab2f3412f1b5e4a52047dcf734d71ecc0efa7336c4e0aac6e9894c9e08c885053b8f59b7647c6a4b4d9794710000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a52d9546dc6f3065d94da305ff47891e6fc17b5f80e2270f92b999611f4ac4808d3540ad41a059f2a51dc6ff3b03cbda69f49da0e5adbf9c18ad7e53ab3822c7357afba4b4db3c07bc4ea9c4a5a6ff004f3339441d3d685f3b58053e0126540d85f8309f6991ac85d579f5ef48df255910d138d0e2af7f881f721e1628e5077f45bbdb8584c62a90bd24ec183f1f457c7df0f3313552ecacf9e83366e1e35dc1cbf01d0356d098d6be8a52617ba20e5a8e42d74e92771112cef950cd3d2dfa5054690b06a2b22be04afbde10eaf70e81b7ce0dc04937b8e51a4977d43faa7a5b55a1269f335d2daf1d26dc900a27c6f9bc7c00b92b3ab6b74b23b81af4e3f30f48f0038f52a687f8029a505b965efbbf256da69ed11f98748390db55753dc25001adea477f2115a3901db16385987b17040964eb316630dea327164c2c1fad4b720ef47820ac09381c06f8380618a055b4dffd3cc2d72e49228597f25642b192dfc7153080f433f1315de92fc7802fc2c8bc2c018a0a90f6b79e3cba3d9950b45ad4b9771b046df504ccebb52b35bcd83d368a1cbdd053df17e9ca7907f60ac82d36773ba3b51d90b781898444fa8f504f997c2b78203711a0f76a8b43093a8100000228000002240000022024c78d4ad28f18643e1b833ba0b06a58ee014307a7ae1fe228f841b827d87e9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000275caa5a8d2fc1d10d823f67c95e42f4455154b82f033d2fe60bba0b0c25c31d66dbdb31dffc3097ac081909883574c7bac8d80f1ee4e855db0119c4a5bbc04a3b51f1ff545b81bb57d933fbdff9d9e5d9e0743a939876066172884614b12f07264602a7b387de2c749d2f113aa72492027abd2c814ee7ffcd4b76eb8772d7839441c5bf683c0fb043189869ed6945cf95b4c115105bdcddca3194d24500da519ff487a94530ef9b2cc6ebaf757396c884c078d87afb7a6649e8acb2c20c26661a7b1a10759f45909d0f5f8153cbeb06565e241332f71e8deb804ddc64576a9b50d89205b2c6dfb1995627b117d5c098f0f4c35cc13728794e9839ef1ab83ef4ce42d60405c5fa2b0ec5ca67583790fd75bfa22a63250e0d6c1057b45942a0cebe1f497bfa221e46fc534979c5fa9e0b60702f5e1d69ba70a14d282e8c152f38a798431f5bb2c137b3376b7ac4483ee47d361f2329d607ce39988880a4ad150afce556e68e078860c01db31617554a28b2094465d820bd1d3640668897f2fef0c1c428186fd57bc11e65b8cae332dc51cfad8c562f3304023108ee048ed052026a57a863db102b608a48f78282f2adcf12bc6ee1a7792a1eb7f7fa920abeb345000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010418a9eed2f820e20093e27aa334a90d805db103e280e67bf847a9697beba072022581cc24669874dacaca54d532f6379928e51f89d89a7e562cf7b7ee5b66fe7a129f098d8c1828be4e854d00aa3bd6abe58538e35fc5be1a3f0030766dfc768a0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d382cf77492ee5a62f0df65b6618d0a79d072dc46b36b69aaa688172af56226065aa443ec9b5dcfda13d8192df00e1aa1136a8beb1466b2ed33b06a05eebf57dcd7ed7ab9b3854d2f3d6d09e03c3b0d0fed86745823041453ba61efd98d5d693e8aa38eb530523559b1de0eb1b9102dd4e7e57aee5f8a08621cef6e7112e09b43ff4f14ba25e92ae3ccbb3cc3aecee5ba23e1e2f1d339165445eb413b04ed7cdd27ad1a15304493c7b73d20d7ea2fb47316900d39caf58a26e80c62589c181afe2aff3244ca2890438925a199c1c1de5202874976460a5119abd7cd625c086e2c6f0802e1ce9e067af04d1b5a03fa003ec25871ad00e708f105f165ecde4bb9f4ceea043abba57bd2f8f2527892090289f5c83de98d4800e8f4e86ef5342da61dd829db94823d8589716f660dda1ad126b965018fcc391f6b6b220c00610072a7c2c271ebd276990edf7bb91298948d7712819b97b3d4e2d91843cfd403f9c3f2defc1ea6d9396def9eccfb251eead86952efc94194cfa7f8b99bf07ba5e0223531c1d6a59dd4fd4811e7ef4fc177172cb92e6923c63a7f9834ea6f88526f3a55201cb099d8fa731a9184c2a2d847fd0ce5aab60641acf106b42b63cd02ab3900000228000002240000022003cb2f4aaa207ccea72a047583d0fea3abbfcf7e78def17b2cc65e8c474b9e8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049ce3434304dd8c84983cc191d6a5aaeadd1b4117eac3739c1bd2d4ef912c6a59614b725478548723d0801af4cdeef21f01ecb5110373049eddd5454435fbb56d4ddf62ef14130dafd535b44151a215c7e99fefd2312e4ae0da34f0bbf56a0dfe302b18b8b9ab8f69e2d46cb4006a78d3dbd6a887ef0867308593e4fd34025f0568ed175c2d217d9869a21bab983748f6cc2891840afa6335fff267d9c204a08cce9f4a8c25874a66595402c4f5a29c7710be2493cd572e481cc2199dcb47499541a0ab3791c6cd99051edab716eaa2f97fcdbbd36ddba7a16ece1942a3e0c01f771d4b6ea90abd3089acc5ebd6291903ee6965e72dd51160294848dbefa2c64a8086390228cf960c8dce6dc879a413e29f00dae382981204c8e028f582387425e59364ce35de41a660cc68810621f756534f269725fd860d9c39a000940dd849add203d0340cd8bddca61c6d2c9f6fdc2c2924d328b7fc452bf5730c71322d1a5ed2b47dd90f1f8fed4174e80714d034deb5bd74d212e3ba35e543626e1f3851ef4ac3113d7b92ed00392225beea55c9d0a2fa525cb12069b5e7f530fa84cbf55951360eaaf5bfa98a5f5141981604bbefc358064615a0183259b91556def2000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012454accfa3e91205493af3bb36ae7200b1d16feaa1b569f443c8381216fa67a1022737522218bc7b7f93a77a11333616a767893b3536ec392472fe6b9f18e18f5a20d0e8a54cea8c61153737181f031a5ea347de99025a7192069d590ed17409a00000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c80ab37bb4755a91ac07185f4f281416ea963a59687194dd581110c089989775bd1b99bf0641d662da3cb2b148ca28251ca72253c894a4ea9ed7f16e46ea6ea2d59adaed974a036736bd8f0f059f8d303d703e1fba2ef8b5a97a116ba69f7eb16a03499d66519bc806eb727bc4ed1839fb18ca2cc3a250d8ed011fdb91b125eb491b669f82ad8bab007e6d3915f316b2a6f11d640cdc92c96fa898c4764cc2408277c4c3a9620010cacd4d11faa2b196a0a0bad420578eb8eb5f360ea4b0fab3e9ee6064fbbef8af807179d989a5f1585def4aa33398535d11fb5bc3d6d220bd81eeba9315ce510f759f5aacec15f99d8d52525d689bcd18e092c80d6bb3cc1e7c36fe8d001218157ce9e94699b88b4ce8f167cc185350ef26dca9c222744269aac59e61a2d6b04dd2d8d850662a6792a7bfcdd263e84558c3da9e0fe4955d0065922648fdb3465caec7a120ab92c062f9e1fa909cebe6e22e7dc2c583da7fa23772de7aae2fd1c12c41267c0049fa30fd49c039b83f56f597d941c69a7aef80d57e853229f57f6bfdae8bda92919a01fb4231a218dbb765c5122a6cc760eab370e03764b70c671ca5dab095297a9af7d2747ee33921f849e17efb8d5c82f6900000228000002240000022017ab3ba36581714c507798e495bfe185cd8fc6b8d0f3a4676440ad17d2fe3b8f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021a978fd12f598823ba457e73bac9a1641e80711494f79c533e7a1eabff032004dc0aabfe1969e5b4b61f557bd822d89bc42752712cbfb3725c34edfde6a5b05b7f8e69fd321f63bafffa49002dd29de1e3012f75f17211093a371ac8e2cfb2b168178a712cc474399370b252d2402c182fd0322cbfd2372da3593f0330fde63702538e75fc9afee7a8c2795f0ae70ccd08ace1937d798dec36531a1d1b750877fad44912e63749882e04fa86f67f3823e18509696a307407888b5d8ffac6d009526d0b1ec731e49fcb7aec4b17b90a03f4719dacc3f1d483fe8a81ae0c616c224839899ef4e263d296047d2c52116496253b67cacb3337ad0607303bb692c6f76536f1a47e4e8083d10439fdd09b189a0a499328b85d4494e9a9e34b47b9271b1bd10fd4bc5fbbef82b912eff69baf984e509758c205d2d8b168440273531d3dc5c5ceb28547b0c7aacbf16035eafafd07f18c5131187ab1a4f1fbc150bba3f2732007b0010bf86466d3a4f098ada20a1c174283f9aeea1a6403afd919b581f115e77a1069899264cecb6ed488a1db5c2c527d1a9cd771b698bd3064111bc37a581197b3b2e30ebadc6303aed1c947e49be94ee9dd7357130df4b3f7bb03252000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011d517acea531018cda8ae9ee5e70488c562c6363c085f4c26165054f5230df4502278f8f62e42a8d61558241b11734280915b46769465999b0898e23a0d2b33ed52a3d76fe9936e3704c4a56b73da1cc6aabaec7bf9220c7b75113fce202163d2e000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a258c512d057e1643f2fb8253cb1f8ecc245ab54a425a37bf8c519f2102af1d03584e0f27c08a8fbd128f75e7144c02c26ce46259240b8c59efbb26ca53fe211bc19c85b8700b458efe21b84b02634840990c17c62fa8cad97a4998117f38b0f21981dcb883e7cb12a4382fe4fed3a859bcf52f2d9555f97515c60fc6633455f5dd92a10820042e093c605916b279f725adf1d40b0616dd6c6bac269fef619762bfa61c7bc40c78adde09ce3ef262a2d7663c61701c5fdb896c50ce0427465edb54dfce6cfdc2a84425ba5679a962aa58a365b7b6c0a505de5d21bbe37303e61fdc394517a2a0cafe84cacfbbad55607bbbded57b58502f43f4c8ba8a1cd33265f90b159fca79aae8c891f01d32c654a59404ffa9961ddaefe836ca8997715c194c3fee3e70fa87c430e4e18074a68c08eb67ca7273cc012dfd7318bec42f972ae82e12476a988c760d10a065019203aaef25257f614eebc3c7f26b2cfbae49adc2a079b2e5b3616e1caf130b4c6ee7abdfe68a5ce2c001610620566fe694f13fdf44eaf29d971ccde6c814e4053881ca85e93971c512857fb8bfba14d5d14b0642c8e3c8b78f09761fe4751c3f468a36a3f5b2bf860307c3085c8b5a27e10280000022800000224000002202a54fc46e3f90faa85d54897e167a8729977e922b1bde1427b4cb0b6c5c49352000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d933e3fdd8833361d8d8bf7fe58f619c275bd7ebe8d4b633e1c6aa244f4f9e2b5ff73d65b55529c1051c8d15fdb3120d304082589d2895a976d07e5cb4392f72134bd7d5070d6a06b84d665fc4feb22c221241e72610b0f748177f75add7e5f6153233878d263fa939da7cd58f5bdbed0484e7f7dce73892404e24ca94aae09d4922750c159b124b60e993e8d210319764889a2bc7699b9995551c4befc55064d5d27f81c5d54378ad0e0d06b39b8a7dfc3fbfbcde7ea1d636918ce209542144aa92c322150b9e05719d241ea98797bec49115861480899b20b9b2766a35c7fedf1519e392ead1fc0e391a8ac87e559aa88ab1d74491f9bf5bf782acba82074e3505b6214ed60ba88199725491ec3fd9cc627ac81ec69e50889a3a7d4ae3aa385f49ced5cb7b624ed422fef27d4545e2967b5c4efd23ce417ff6fadd79a0d22e721885e350c74f4b9069d917ecacdb4273e3228715260c13966f8038c86fa8e56986103c5f0614e2f6bfb63399ab39439de090a6034da57a685a1d494e1e9fd833e962b90ebeda54cc7536510baeffdb61166eb53421fb3d79f77ff42c7a6dee4b67d8507070dd3aee134d893e465adcf7486308e2d374beaad090fcf59c0a1000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011e55becdc42fa6798dd8b4175ac16d89a7b525c5b78394de97e347f0f48df14a02297ae7615ffaf30790f6e0b76c8499ffc0fb75635cfe1c3e8f214b2acdd77b05195c573e3ef0da4e0e757ba123270a62ca5ac1a8970fa26cd7f826cea1cabc190000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a407fcd4123e4669ec37fc4ec24a605807411e554acae34f5c1bd1b505e24e1495899dd8c75e998a4f0d893446ffbdb69d8df372534cbfca6499eb709f290fecaf2cac8266b7d5e8be7a8cce867b7355df71e5a0c0e1bd8b8aa99fed0ae5b428208f07c47347a98f326643ccf5ccb73ae0fde7e4a3e03c948a4dc7346ea74ac714b2f87d10a4a45f696222fef88a84ce500d8fe20c7073e563b95f3c0b440603ecd59d6b37da983e6705b5336f09997a31f677e0dfb8cd8be6371a43a45c5169037954a6c39ab488fc68d2e30cadd373f2c4de3df74761f0a6ad2e2e3327d55db7a90f075ea791f792dc7e9f2ba0ee9f54e319cf35ea595df268f1a9935965bca6e0ee6022e842063f004e1ebe8775dba83de7f65625c1af62f75562882a3794c440fc0b9cddb262575e706ceddd77dfdd307c03ebb84ce4357cb16ffe13d15a48191d6506979857de67946a959e9c644acfbbf072be666d43e17cc174c3c41b04eba3cf687586a2ab024e7937de0a995f297dce66a27a02045f803ff1462e45ce074faaa7e7c8f7a59be2cfd7d7b094673351e365cc97c030413d73faabb0f30f21b701bbb6948c3fc782273f783f66b64c323af1787ded5039a41e5536c2700000228000002240000022000e6587ec3ba837692368c89735b155490398a894ab78fc3579ad4b3ea8634ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025a185cc9227aa0effb5fa208771503731f4bf52849040d7adaf8955973334d026e21c68f666da21dcc6111ed6ec2ae25bb7571a29c9c65a786f251e8f8f98a8951d2b402b43176edb94a28b61e1437d251dce19af69b118762b9dd6ec5069a166373b9f67f542c6d402ae9b341ef923130c631c07b4a213753f3436797f628cb7a7b305b049fdf8c47106f8f7dc11b899abf7f7f65b497b8450960392a87ab471c3ef8340436b2bcea4ba03ef70106001c571793d37d8623ee8d6af6148b7f0e127cbaf4432b9b317cca0411c1b52de9f455e986e58e8fb1dd0209c575beae474906bbae27ce80292aef2cf96d4d63053cb753b92f58b6c2b687e61823ccc47c402b7202a9cecd2c5d413daa048fc0db5d5e0938c91c2dd84d6ea03694f774abd4da4e17cc1fb7d41717f0abf5455943971f91546a9a3efcda3765fb6125c703c47bef24d903d1fe9c154c211cd1c281efbfa785d020691e3fb0fb3f2196066adbf1b52e5585bdef623e641b875a918ea244ca5ed0f2ac6dffda6466857c025e2ab744031ce4b26a6b5ca85267333fec75d45e4d5736ad2d4dbff0ae5e2dbff571319bbd2530c6bd8e515657351400430e949fa7f2aad2948df54b7155bb107000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400122549a79577e661fe05d9e6e75eea1eb7debd9c80c61dbb621d9b65927f12536022a6247fd8758a5a3075f00ab9b1113018594860d4276cdef7668632a1620f98f12e2b37762a3c8946f112030a146a34874aa3fad955b31caf13573e19a0060b4000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000299ddb09e239bbd598bbbcd0d2064ff03e6e395c132a03e4a5ad611482650bee5a7cf4fb33ac588fa102555effb2c66777f2c5114b6c32eabf8c3ef20a090d63f709fef04614a944ee10cb5d863471596f0537e95e001f8c0cc767381180aae2fc7569486293c07b4d3febe44ca558789cb45a938599ceadcea9be9e9efb226641ddcc81ac85d71fe61a2aabb79123a9970df145a86900d9d546bac285b6e2b3c76332d1f21d20861d13e85b4348f66f2b4ac50f2415d5b6a97cad266402918fdb52316118632c1676b36a59e363d70ed57172aabf8ca5fedbbb0f37c186f20a042b299cdcb206f53741af1315f308c61d45b69e23d7c099922ad84555e7696715227456768964f20de43600848b3d1ec785454cf300addd1c93cb73e6d015aaa29ca535fab4401b77be6c668e7b6ef5047abb28ec056009c80063b66c94baeeb511ec52d6414412af36221dc8a7e62b86412708768a5f2b73cde7b122a273c91a0264848869b17ff3c2683041120f6c1f40bd0d6335f22d12d0594aa34442e88942e445e8ef2d2cffb4838f0702327f2a5d03b2e412582429df7190f253819a53792b07a7f5605e103a8522e7f9e81cef320c80a46b01e1da47361d23841986000002280000022400000220198eeaf3351eddbb3917b0901dd4f4a2ff97d49b4330a93a4a8c6edc802f1211000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001966bb90728249b663180fe1396bc9ef7272a234710b410a1d400cd7b7ea2bea564ad1059a30d9c020647ea011e339c1f6b015f77361768ff6908a0b3b6936b01baae24ff8c1b11b4ba57d8eaeab74ba0c9b18edf976923dcc6366bdbce0bc5c315c596e7d82199adb1b32309a8a8305187dd0853f7eeb96d3d0c766ce8251856acc70a7b0bec07d9bf418d2eed32390d0cd3acf726950bf1aac64ccd9f9ec045a73391d635dcd7f4b9b532a28bc4520e1e87143694e06b81174520634114645f4ed41076b5523a8c64b19982ed6239487449d45dc177c5c74c120d76a68ea6c072bc127f34b70bf873df46de126816e287e5d2ad1ee89e53b8e8a49001144db538a2506fb19339fa4478f411ac512ae73e3aac9c3b7286db48003f317f32c3252ea5b64fa1d608fc2cc7a81c515ca649bc24c409ee62bc073c7f6096503ed41462dc0ff3593979bdf4b079fe5cc70508c2c6fbfac08ea85312477ba7ce7e6ea49353426a652ef8ba53a311e3ff25d30251775c2fe8e7d0af2bcd69bbdab83ef2ec461ce99cab3e954bfb5221ba59b0aefac780d81638e6769398f20dab5b86ce6bd8b71a0788e2dc792ea529aa0de59711d2a2c7666fcdfd9cb6e63970c8b9e000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0020d24e310e4d0079a789d209ec28d3fd488be17d135a0fc1fa32c99290e3622ed0ba2fa7f2593091f83b516b4ce3fbf81f180096e957737819d0d20e756f4b2ad022bc87491cfcdb70b5f9da4ab971fe6d1ae56e434f395844909940471eccf82ff04b5374c82d61c7889616e59ae695a8500b0186ee5fa0e6761afc02c1fdf995e00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a3e4b663482a0a4d81ad467022e77279fec13e395c69933d7161db04d93e7cc6ab241e777427af824c2f4b0741aeb1f0892b982d0103eee15bdc882631894b5064453f5d03c74008318423b7c3f31d03041d8a57e9a2e2572b21f62fd7e30c87d2fc94f01f162a3cd26a7309968b26897ee1cf76ea29286b44742752b911ae34f6207e6bb72fd5cf8c8bea2cb247c96ff9f4173eaf53ba119a37b91af94527600911ff8445ca6be18caba6f379eb01fbded22d1551a6b638c7d170a8ee15463c45efce7c6fe045120642997005b526e08618334709b5b35e3ed3fb9e3cb4dca7df3ede727194891cefc896e07ccfdd67976035401038ae8943dd8bbce015efa8cd666a833f71c8d678f0aaa89ad845e996875aa8c8fd14dd448f6d2d53edfc57ae200146cabb37e570c8c3b8f5f860ed921a2a3e4d2627f85195ddde7c0e6e1a5ed67161bc31aa26b484a1ffa06730a5ae0601f4f9f0e67ebac0e0b3b739e3849aaf9b6a84fa9b0553d7ab4c8af18344180d6c55715f72926400d5483d76eafec4f696319b5d37f6a708cc984fbd0fcfc2c0fa248c530a4fe96b61ae7c91e02a559f25d707650fe002c738ddcff4c3bac4eee4e9f40e540ecc540528ca1bacc000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096f0ee03d3276af218510dd1b49780a2832b88fd012d8cd91102516f9518711333b4c9d82a6f1ed6c002cf3ddcc6611a7be938b9c5c4a141b090f32a4002c6a8f6eea370410caca09d97ed7ebf29c490fc8ab9b936d69d28b765b2205f7e0508688c7cdefe61990114c2c63f01f44a21d81ba0d84f3db3721db917e8fb326d5248dbf69d7e20b149ae93450574aa7ca98fb0337037381571299976e45333b0991814a2836cc7d47c36d0f6d73208fd5f01bd9e3b22cb0a3ce7fa2a78c494a52eebb368ef8dc3ddd9c24016e8819945ba192466d82d89b60fadee87aa7260b50089d9149370d5064c9c0624074df15734a90f418932607ce205d058c39a802b5354dddf23456111f30b615a5d4c7cba25d60efa899285f818d2aab311c7b99ae0daf4e34c575272750b2ebec80b46fd09e47342921d7534f441f68fe2dd689deed52a98106962e0d68ab7635e71759f722befcf76545023165690452ff4ba90ec3e1be3dcb6befb1265a4d47d12b4118141ee0121aa1e79dcbe5e6cf9d71819d1624f1607a1f64a86afb91fb99125ec4f68c55fe04202c8cdbfa81398b1afc5073e930bb53cf8d319906af09e1302720bcd78188dcbaf3d24a9eb70c81d0b645c0000022800000224000002202366df0d029ce086d119e11861e1342499ead635e9b02dff7f92c3d9a95e7bd500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aebe96033b4d0001b59ff23a2c5019530f9db211047ad739310d3dea1b47ec49d29a1eadb946fa3da4a82a3faea041ccda77e8fe4b0bb3c03b1be1a901aa84c9fb3bd27857f17442d306a47c92258a63c2a6a325f62e6ad033fe4a88a73c326b1472824324fe91c8ed115ecb4df60d027f4c37d9250873a7b11d077a01c576e8fe6636f3d6ba04b1b2d873092818c37dc36c469ed1375d15ab477f765557aa2bdddbab4b503ba3e3e96094f67b869ad6bffe74933b2f9aed7bbc96674f569c7178ced85464eeb5a205105debeccd6d82c9d5beede15669f7efde1f0510b3878a3b38011ecc420a9d2504df6e3138a0d0fa09fbab440a4dbce7cae41accc8c44aa0e54a0f9d93079f1c47d522a53c9264c5a9d8a41b2ea25a8d6ce9300bbf7d32a12d03dc0e68e118632836eec36acd659d4a3e35e9dff5fe53b9ca7231f940c73d0d0ff015320f2e27a241db918621a72123a9d632dba822cdc9d7a9c1f2e2e40bc0ca3fa02003d53aafcaa56f36388965854569b4397be5778f184716c0ea9963f6e1a135444a644e47f21e989b00ce1598fc314af85c4313591a4ae3dc63d95f40133efe03b83ad17d31b79daf4284471a0b77118f27f57bc0af5154022005000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00210b82acf79c8298fd11cdcc253cc70a8f354a4a1c010cc4cc57165afbd2a353f2d2e2d8cce7461fbce89e2f7a196a35a5658f57d23264cf4fce9a007b6a1ac2f022c984e61fc4483c41f86bf03048511a78ba8b91848d9cebc469495c199ebd64d133566e11d31079583075a8632044be6b42ad6c0f0b01b9a9464397929fdd7de00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a87d90a182462c992b3987c4f25225f18abd0bbfb067749dbad2ec110e0a7bca0ff6ffe9f76e77dd350c64581070c3c12c98f52f4b73ef4f2208019c7a00990cd2c9e9f669b7b17cfd4aa3796e46e0106206d67fd74916279e7d22df66f00ce1b9c2590bc72e767d9902257ee7ecd889095d1d9f3107ef3050197e537bc7152283f50e1696be896b91a15553263c0ef6c7a99d71140c46065167e860acabffd78bcf04aa55d1ad18ae8c9b8d37aa8e006fa9baefcc4bf637ac4082e5ee136e42710a8dcc9dc15fa857c511eba6afc59a84e3a87a3557c23c0f848aacc8f7e2fe5db9e35c4dba1faac3209592f33dbae2b987f9d337d704afbde1089e15953cf63617bc27d317271fd5a05bda6b4bced829cce386cd5eb0387f240bb87500c7c599e946728c0c8a446b45c10ab29f56c562ec7034be55c9dd06cdce753ebe5d989f4de366480c27ecdf7e026ccb58835589f5986f18c1ca55c7bcfa119712abe073fd09a4d60129d80964870c7d5bc00debe8c506d388b5b84182366ca04ca85407c164617c165e82299fbbd6dfbf2b909aac56924bf1ca2264aece73bf9fda5010895c1d3fdf5c25430bdc319644453d04b2afae2cf4a6b2a91da1b5d6d9530c00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000270e28c5268c9ec8ab5d594ce6f5f3a0684ba27950a94343d09ef106d201f9eca5c9a015617b9286170f0a26ccccc9b608f11c84d5a66fc4c8614994739e7987ec5f13afabad10d7875e88fe14132d49f54bbbb26401de96c9c384927ec2b521a9634cd7d6449c945ae297962502ef84eb05af6e645d005fb1d06730b6e6cea801252dcd7b493f2153bba00ca3dbb5ee67b439b3f8e6b065018a96d417292084175be91f0da733629371e8e00b37a6808f46c7ec10dbba242194cb2815cf4e2080788d1f52dba92066cb85c36b481cf1d778eeaa867d0484d4591d99b7a1bd459b321503893aa9d0b6d86b38d26c02bc77c4fdd8ef54ae302c381f3bc406c9361b8e538cb743270e04176ac98254efc644466eaf572d3399ee2057fa7cd63282d97f30f2a02c18c242402b775e5d5c57d460625fbc6ee75baadb256457e8cea5f22dc6e416d25d53d29c4b3ea3b37801bc14c76a5fbb72071bc939fb5f4f641841d0f781569d51c19bffe7c1e5aec4608aaf80db3db07dba7f5d76e21d3dea0a91ac016a64c2a8b10863f71da5df19a3f5842f1248311d08a7f1e6018f65766cda473d9923d0f946e70f726edb76f0a94bb65d8aa40c8c278f38e7f06d3791c0000022800000224000002202f3fca20047d192bafe44e2a15d7f664a28e2c43a95a77d90b2b60b8c2fcc649000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a42a439672fd4ad3ca88d7be3c0201dca7faa1209782cade0351eb65e3af851708c41d6038ac0c246214b6eff0dd0d0063bab8cfbdd778130b50a931aa5abbc14dfbf7396116a012a48b8453cb1a032aeb3c30b727c86bdba1c010570c60039788d042b06a974bd191215aa90fdb1f048a109c28b2f930b0f0c8beb70e8590c1bc8de7c58042316807f7b1bfe767ef054a049273074b8aee437377e7d04a0be0b7ca73362496209a693c88ea2bfe2a747a02bfb17e73029db56ad49995dc1ef0554b404cccdaf0ea6c0753c164829de596d4a51e30881086864c978fbc5e42848a9a4617aa4c39ee218023b5b7737fb22b6e8d6e2b7f92847a4d72644c7f3b10153430e4ecd3d775cfa807dfd44031dadd8586da83a3d4af7aedd627d192bd6b70dfea0e41452235626a15615fc4f22cb1cf64583f41198f5443a42b8158fa1ad3aafa16b9a9b078b0a63ff0fbc3c24d85bb5a581cf7f3a723794ee18ebfd0888e6b0fe44f2d77ee94b84547752fab990a7ed762eb3239a4b29e7c315623deedc60ec3dca19871b4f80c729e5268e8ace76f27da584b2bd9a50ff406deb893bbba7fa005ace6f437eb6de5bbc34e97b835507ffb1896f4e696a5e3b761e2e8e000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012508a34c37e48cabb4df34f233bb0674a5aa0c865914c54878c7ac76871dfacf022d6707c618c14e2e9077d4fa4fd3e4fc78c96f84b7aa85b6e8261a6fe94357fa109a2380a82dc5fa7c43c00fbcbc19918d24427b9987cd940999fa5a68e9aba30000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c83e999be2ce6499162f538790ad131ca5b2134a02d49d940b64a0440988cdbf3fad3ce56814496d07aecc33653a6ffbdcc97b82bfc62c0294a4c34e168275506db0fb9cecb78df086502d867c53aa39005a41c3853891552bbf6a0d2b992103c86d85cea0dea0e42901465e8e7c7e839d5e2494bcc5e3fc66242a9d2891052f09393e422ffa061b14ba9fe95ff4f8f094cb8b02b56cf612b89a17f4d6f08e859e99fb731319d4a35a3b4c2aa55d51aec0eda853257e4620989d02d6718d906d81a9f8e948434373e77250e347a79f09c07449495532b85353ffefdd3cf215089e3b7ac12db59df75e3c9b493489d7eba128302c1f39b99e3cf23ef5e24f00268780002c502475087b50624547bda5a39de29a9c4c217017f540192aa637496ac5a699beb3b3f7ceb429be271f2641b70d67e8788a4cfb9642e87a3b1d13d40f9fcaf02031d45da1dec8b1455be752e817298fb9e524212b79655ff1afec98d862d1aed3ccd82a3841fc68a08dda82fe6b49df024a765fa08dcf9b31241a4c25439017e2f119e847d8ae2cdd2204f2e25257f49e2ca03db989434bac952633080febd27b650516fa7fd9bbc700a91cd3314baf8a1309fe151ebb9fe45ed1df000000228000002240000022017974591928f9c1ff709874726f36a3b1fef17e52f4325bb05ba0f197eb574180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089ad2e60ef3ce15d86ba9000722c073fea13c159b341e9738b9775af248e9c270eef31ab6c46e7ba8f7ff80116e01015b49f8d804018e4ddcbf15b128a77e84f8a5db8ae6efe51a0b8a130aa298e90035b2dae7900f5a8e532a93e96e5167f11e7dc59e633bec69e3f251c7ced9060861e925003139f1429f1c749b2b3008dfaded4db57ace201535f3df17a7f58d858ee9b1f3f15ffa96e860f56cfe13b16e7547da5897107fc75525007919ca8e094d69a1146f7b5f90b6de39989b232b57b2792f527354e9a688a86651062668fae841289a1569776bd39283c488317bfd96e402173c90c15390e12bb089517884e45408c228c88248762c13440ad6d3f9610ec23bbf062639368b2ce9ef78ef4a67e5513b74214aec9ad1627617e18f9851a2a22d228660d6ae8b3defac2fa84c49ee2d1185177aad7e484ff77e0be3c9260a2e842ed67154fa098647dceea3c4b16a678ed64e3d2410a169e365c11daf61f18520b6801002a854d6ad7b39efdabb1931cc4fbb8ade3ad3dee3e722790e7badecdb578b393472b2dc4d19623fc70b139175f4aa5c62b2401947aa244eb86b4cf5282d607dbf478f9243268378ec3c3656f931045174dcb01bc4d326b5760000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012a386522d742b868310604e476c519cd4914b61a2af1f3a8b74ffccf708ebb9a022dc6b467683d49e7dd3eb8f4b3b24f6169dc1aaa06193683c6e72b1f5a81e91e24dd196eedcd283e25912daf96487485362d9edca21db7296f44178532d728ba000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000159cdc461d0751e087c2453e075a16f0b04bece498bf40effbd08b2e8b034d2f6639693371be7af1a34a55f77e936c9ac394325ee7e22a372fdaffcfa64fb1ce63b531893fc70995d6c0da6ea639e311600fa1eeb9928afe16263258baa5bc8bdaedd36633b7ecd59c3b36a70872a456dbdf4f4682d0310c46a723e2b68c7d237e865094c96811ce579a680ed7633c212672cdc73849e716e06684654c1df9c58a9af5901938f416fb764bc8f9f9b45b7aee272624fc3a4cd998b6c503c93c103ef57d7dfcae027a9803d98d83ed6b67dd956e5ff9bcc1a196084eda6491cd643605d966061c9d6267b99460d06a902b173ddb44822aa3f07953b0a635d4f49f5c6649c9863ea3b0a2ecf1807a1385fa54b71d6aad5d907a06a4320c8c1948268b0a8357b32ea11fc8c72fd57f6b91ccaa8cd7873dd2872b8da8a90c4c4c173528ae0afa2d9c561d77f0e53b3f7301c45e2f59bc54490051b3396b0d0edc34f4c025ad95b0e9a145a00d1a6ecea9db89585d6893f4fa5328cab3133543eabb4a54b854b1618e18921770871d4f841457dc9617ed75efa5278bd6baf60dadca9fe62975920cf3c7d0a1400d1654e44c7c8bb4cc63492f3c3abcb5675f6f34ae240000022800000224000002203027555ae3d2e8ef31dd2d47701a9dd3f15fffa4dd665745339a307fbe5d5094000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009cb14f81b0b13592fa4a29572b0fed33e12b95aaeb846aa5010605fd5a0621531235320f113000cb4d00dc22d09ef5f6d2b3bb336ea52a53c63aecddb0b4f29f5c7966d084a2b6c101538c9be71ea2d00d3a587ae9f30286a0186f02209b8dc2076cdf21ae858e3fa80a2d6a3488396a9033ec8fbc86bd8306710223a61047545aa9b032232eb0ac12108aac20f0025947ea280d176a7b2c5815cc8e55371963b02d465339e6f8813b70dec2f7acb5e025cd7dbb32e66b604db2f5e72abaf40d7b88cc23194db27f65ad249dc718bb3e909ffadc1d022113a6e9af22421029e4708e28a216932e890ebdb56cb787f4001c711ae98213a3a3565e120533a6d298de5c34f8232dbfdd261379e787d3e870ed066b5298d504786abe0bf564364837d49a0743fb3b4cf57e942086675d69d2f93e2e5ab4234c384d9f7240af82c8de794aa3bcc6e684fb21ad99167fbc6a73881f50cd32c911993e07e547a44ae7e188961b651b4c5451866e1dc9936e3fd0d76d66a855714125a9fd7e69e13c3021a0cb2ac9cfadc8b3643657de5767b09026ec709a042941ea69402fa8fce5722723d0cee68fb33bce6acfe469505eb4bd317761c5f9679b3549cfe973d3095493000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011ef62e03eaa630f97e750e4d8205cb0cdaf6ee7cd7b202e066828230a086437f022ecc2b4188dc623ed5379c099e3c64a2280d54bee136005a77bbbcf593c9a5151efa8e6097de6a4d9021818aeb206502a3d727514e714febdb20a269113043f00000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008efcc632dea96f2ae20cd57bb6db95e33f78170b7dba4383f43279f6d4e0d1912613d6a089020d4e500729efeb13625408424e625aa71305a333a7ff710c784cb795d0748e8d0c307caadddb2ee5e871b2539cd9dd163d0a72d94f556a9e25e2ccbef72fbafd725c97f4e637f3be7489129f3048efd234d25f65c5f69c3565f01abb14ac3b900a1fa310ce33a3753faab28ebf5f0142c70abc0c229de5459f34cdc9aee775539bf7389397bc3c471bb4a4fe5743932b00afdb342540423944c3333384c0c08ec0d1f0747fb9d785067e46603a75c601945a63c6ce2eae7bd3551dc798d4a13a47b519bcfbb6f8fc59d2bafff265436a6be1bc6dec2dd515a646a93c2a1de54d54ac3391007a69a58ea63c9d1d48ef1d4a7bafa63b4d44190adb60deda39307d994dcee872d70f83d206bc7934326a53386c89d81269b241d08c3fd2ec74ae95d85038adfd3e66a3164832d5a04a1d2438b5e606953fdb2b13b5cb2bfd9541851ff9a445373679e43ecf576fbc49f5160bb1a23a329822254373bf789f9f28e7b5baa049e6e4452b41c9dda104e214a2733de40b6bb9b25ad65be56875c8eabf472a2343a6d28399615a98ac36473969e5a09b067cb45e496b4c00000228000002240000022020e07ea69612024dd53eaa657b39db2ab1349d30f558f3eb44d0bc9e6685ee370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083f4c8179d39332f747269fb9aebcd6594c530efa8003f73e84aa4decb5ea0294aac3c8f997b737e1baeb5ec39fa2942a5f59f436ab87e21d7e768948bdfc6e8aff0098e7d5185fbcdc83e3bcbae0719f050c2cd1deac7f7bb782a4ace06c9c630b2188f6b2017830d0f10f4b335d332ede1834aae9816680a0b5f42eb299e8ed8c44e6305caba96418d891482d2318d5fab42fed52318bb87f13483fcbbf6c09f368061ce2bd85531799ee6988d2053e5fa33f5913d97d87e84400223df4fdc82be29e38ad3536e91a59e1fc360ac8e947a4b4800d9dab9f36a9385b1707750b11874d596a11b9082b11ab2312d70b269dfa9a09d71d03ee3c1223d3f4e81f6f7609aa5ec6605293324c2823c369572e0ee42f0134083ad133db76966dc57af840d8d88cba8c560c47bef68ff89388043c61480dffbc6ae543bf5fbb729d8be8b14e520ae863098d1f56701c06169a2735401d539e85e2715a87c27ec87603025321837918e104d96fda413190ab6cb04d988b0feb9085f1f246c68fdcf488658a410048eb2c7ac44b15dfae713deb5953b0e5f2ff4bd849bb2c86fcc0298135cf306e4b543a39d50d25767aa6607b9ac3e5f8cafb48b1dce8a8b564c4858a6000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012ca07363880ac3e86e8a295b76c7873c162b94b85854f93f48ebadf7d2e759fc022f2a1e77fe079a6443d75f77e41c72e63d2489ff2009932080ccadabfd3fdf892c6e081ecff53b64d89580db1b66c8502299c716a0ede4494d5e3b082e4450d20000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f586b65b25fb54abc2215014d434fb86a88a5a366fcb4a24903fa69cb34a88395dc3a7096c1487e7b73ecae0f9d2a049a4eda1e4516db13fc610db39dc6e7b1867fc9ced0b939bc285981e7e2f45b1954e984ab7faced063e0153de539b1fde9c27ddf4a158a7606929f92b0ee1cce969890a46ee3a10609b9a2753030be39384baef07a2c0f32fac29f881f5ee33aac29553af1861dbfbc6f2d563928ffbdd2e4bc08f8414c66ec9ef64909cc6d7d3539ac09657a84ebc5d587b2cb56240b26344d10a519babed8148b3fc649e6ef2c13e1109d3c78760264de1ff93c64e64d6edc87356c10638ef393c944c4a7c8ed1c99a5e89cc9067100f8d5da3fc1f81383214569c62579c2f39d80d6a709af7fed6883022e554b4cdaf41a275ed59dfee5c69b1105445730a70e97836b0845ce3f601dcc07e7e383a0539c1491f85d93db7c6d28d5b91e19b38444bab3159f4ebbe366e3e8e3819438ed7713023f1eebf9bc8af86f462a3c15e615817b7c7e43439450bddc7098b7873007731983facc46f04ec20b08c8737204ed2043e2bc22a19797d4cd48e853373b41013bfc8d0bb14988b0b50909ae18a0ee2d33b4513744b706d36e15793f9f53ec069ad586b0000022800000224000002201f3f4ddd833be3767ad07fb161d557398836173ddd1cf728ee41e0211f261f2d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017e51776246c749df7e722d6bfcfc80d279bfab18616553d27ed1563e13f90bc6c24eb0f46cb83ce36adfa72d09c1f6c0b26727d6af6a7b89a882296f79efd5fd91d9b51c2914e2ef971f5ec601930346e2ef7bff945937baf246e0cf166b90d97971c21c82794a023129650724c4ab3b360eeaf5e77b4014fce9db1a5dd6b66d73dbfef8ae0e022412b0ddf2e5b076e4fedfa715719d9c11ca7b2864752d073c1ee3788f132e8e01c6400307aed4a15b679321c2349ea485152e0bc2139a76e4297963583fed6eb75ea91244ade69b97cb8b8d414b25e1bbd8ab395f2231ea6667c91ff92edbb60a765ba6d65e16a5e2d452b4ec9d74f99ee993d498240d59fd225efddc36fd4f1a9bee9363213b78eb29948ea38f89cdf0f7ff80267d5defad03d8547a56a657d9287dfea54e164e5f7cf84aae2e9aa2b87da5fa4ddcc50124636aff7b7d4f6ef5326839cc6e3afa17b59aca99aadb4c4155ff774d6f2cde684597a573814482fc634b6f712925f80acfdfe16a18a10b139d733d4e93e9c91517c50a5735f5538d6de5eac5121fb2a94cbc2da6aac87e0a27fd6d607cd787909fbe9a92b7cf5286d36f8007dbad4746381ccb57d48e6e9767fe58c1ed14f10000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022532485fa1037a70d94b470eac7e3c4eca2506f4be281624aa98926e569a48be299f4d86ef9dd2880c307b176f88bc515d117eb832a8a4eebaa995ae8bf51485022f831b0bee8632d760730b1fd9e50f811cc2285051ade8ef7433c85deaa57ca703085c080934d0886b8e661abff187c3288bb25ec4c04a7cd72046c4839af2a100000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4c6eeb73a55f7e2cd3bc8e8fd4ada047f81a6e87a916e327812228bd50231f2090f1fb5da5f829e473813f8d6e439ae64c76f6779d44f1d832397722a78e478ca4b39fc417247b5bdcde3bb1ee448ce16421bbbafb57ba7d32a5ffa7229dabae5824a0d137c65d1e16ad8cac4c4042ec7f97066c1c445bf1d7d0e658bd3df17c5586fb6908dfe8cc6dbfb391307b5efbbd0d7f0c8c951442f98a3c4b581d6591589bb1896209536475b28a5c597f136949bf320cdff25673073129c2574684678c760a8e931c2f52ec29e39cf83a10619498bfb1aa681a47ea92d43dbc683eddb6998445d4447a9abd55becfac74a076f51316361c1ccf4ee4385600e16b638ef2d640140633110fb76630c72a9d6d1c442f47c2d9dbf10f23339e75de2942c949bc17a5b961437211668be8d0499cfeb1d313ab1ee5774d0d37ae5a7b4ced7909361639b55a3303e511c73d4074629007fae15045c5ca749babf41a85b48f8e5f404a3b5552e9c6ad41c5fc6deff198a80f8be7c40c70a2da15b40d1cf46a93b5bf4afae5568672152b5a2378dbfb3a67eb99ee01f84eba4da55981fb6a941f66139755cef0b28dc938c8ccae85469b8278493be1faf0193406e4fff0f4f930000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000852ee6103f97ce7651e20c4ecc715730f2d1fdfc5462d355d10e9c9166abf2a462d7bbd3cddb542581f3906ce569715d8fac27e90628598c8873e2ef96d6b5d3b57f439192086952ad4f8257aacc0cfb4bfabd4377a7a182cb218a5c48bf40ae2eda13094f20dc72555bb5f57ff9d63f47ba69881f47bd91f6fd76c7c4b87235e21fd38f46849783bd686847023aa5e9065f6e094a56bd0933350fe1f32f47676a088eec9d6f6d2f7304dfb87f9ad2e30dbfd6e16bda56700ba399c5ce8fab8d156bbba1a3025a3a485bf68bd8c7a544f1d39ad895325a4d973423cce0eb8bd69b2f196a4fba9a40ce9d37262cec2e64c51af93cfb683bc2822be29ad8332ef92972468d6477e4f471b5bcf80d40337fa461604e269e2fdee9dfbdc20d02d32ac5e2fdd7ba946c1e53798cd24e3dd817afefbaa93da1b1b801bdbee1c8675709b0b2ea24db2ab44b95ef997681e67dfb5d6434525d0dffa18fe9fe729761f50667c0f6a96eb7979387c489606d2eb935bb8d1482b5516be5243dd7f566c79f4ddb2cec0f04e6cc66a84846c3a6f623ec5c8f5636a98ff9ae198b5d3c0ddcf82540025ebc292be4625780c78ccb6c6230db1a37a60e40704fab008a2948af43470000022800000224000002202c10d9271776c8ff2af13e668ce47ecc44354d7ce86f73b4a05ffadfec3785ba00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2012780bd155cb59ac9e1daffdf5e8ee59cbf1598ac093058c58cbbc2c144daffe3efbc01768cda88a056a7e58f8a320824d5566a933860909732d31971f0918d6c3871df96af020e1a4e103d28b9f395536c9d6c20fbd20d67fdc8bfea05989d15fd8d8ee2613fc7fbc47a052cfe9dc3fcb8038a2085dfc3a13339afc4aea65f37d806c2ec3d0f6db658b4047556f2ca383e2323ba30d62e341fb79cd1bc73d5cf610d951a6b059ff2ecb9acc7a3d6eef6fa8c192536da895c8cd10e90e4f37ecb0d753a84b4ec331887e323ccb43732f66f2ba110f4e2a51a01eb046553f6149bcafb32fab690289b0f07cc7f8bbfcdfbffc1d3942634f29dec5ff8a54073cf6dfc9ba660ef29ee7baa90dc0a5396ec7e683e523c23e65390adf5c19342557511acbbc2be9b319423af0a0e712ea8a9c889c99354a95407b678a0362d8ac90ea46bd5a721489f0a3d442248a408e3988450a3472ed3e79fcc8ca9f6e8fb07fddc2e0adf72b23bb6f10ec81b0ea6d10def22696e884e63d174d9c32ea036c422745ebd733001f44829067cf1ee67f316d4255c54f7040fe52b08fc127a9085ba148a01fb88a02dc7fddf7ef45fa6745161155b021a5116b71f2d91675086db0000000400000000", - "0a99363a05626a1c1626f116dab7230ddc5eb8c1187683419fdf5c1135fe68d20000001300000000000000000000000000000000000000000000000000000000000000240016aa14787003141185be458ae05e133c83cfc4adcb0121bbbb4b201cf396e100089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb30000013014689f2e0abc97c7078ef1acf6d1c627758c9b57c7a1c4224365623b4d3382d5000078000cbc610f801050e082bb00a51699b89c8d22d354f199a5f9ed2f36010d17327e000078800825bed0f04513688a20a73113b41d525a804966b3e35ccf0894be7867dd9f59000078800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000070dbdb5c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad34f13017188bce8e9d851280ea406ee5cddb9ef12cc42013db5eac33b223e3cd4a122f000000130000002400000000000000000000000000000000000000000000000000000000000bec1d40010d9afb76f35c7383297b7a9ea543c3494ba45d85ab518b5b79f9a902b506b87a02007e0149d6e4e1b820826de6d20a71c329afe4217e87bb050fed965199253491070a496d7c0fb1cd4e3f3404877b50a1445d9d2aafaadd2667aa2bbc6c6ff1420000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008445c6269f358f818ec5e72bb2b8cd6934114396bfe6d6fcf6f6fcacb456cd7ccaadd3541bf8f71837091f3e10e13bcdb4b559961a982ca358a2c0bf9e3eda72535d517dfaa5968a7b4f1812530b6f050cf8c412848a579adcbdd6140fe7e4131218154225f3ea83957134398ae04156ba67b511f74ef06420da7278cbfa37ff80f3a19030d6955fda000b25ca11f963e3e2fe73f0f7e2c27267945a9976db2d2361c1fe59ad39408a05ee035922295e24648b1eb86256f882717c53a841a786bde5018c39e958bbf257b6e2382c4d2380ab2d807796a3fbb9c40ac536b8ae333e2881b706c3cdcc8e4e48268dd5fbaebff7dfa523d60662bb2b01c90bdc971335f720b683d79362a3e3e634b05dcd5b424ec3287e72736fe0c8aa7235415f9f7dd8efeffb523b8022de423c2d1cde17decc40e696aee7fcb23d664d6a5d671e05d9a683a715223877b2a35a3130ac19bd3476ed7a55d4e5483c7369ff105a1b269ab9414fece9f6b44f03c0b55ed5471cc7973bc802c711d4d947d79c2574d37531b7c3de19e916044515543fa985d87226cd5cc8b64a06f9ddfea66a6c5a191f1e1e5b80b549ec0e16f0d886750a68f88f554bdc5fa8be79bdf28ff92cd7b60000022800000224000002200bca2ab6fedff993ad09c02d71b467774f84edb3db53fd74787899b50f2796ab0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019a0264c95ddedf60b678f773d9cb805f300954d49f042a7c0187702e28441aa49e68a41ed996a216135461048eaa34b1ddedcc60e5cb08b401b125bf71d5ad60785b585519d75820bd51768ce36f268354bd9e5796918291cc691f90b752c72d156b23548e3b412a7cfdc4e8f23d235b3a2d2a9065c78ec9e9d1a774aa38bc025d2d99598b2243fade9ef44dccba7512eb2f951a78f4bde0125bf3b7ea4944ef0ff498427dc74638d5653c36c8aa2088a882d21a42508123b5a48ebb9162a6bf982221cd7ba1b4159ab9002677c0a30ae74e61aaa734aaea662b2d5356f4717abb23deee59de596063a0d9c5ef7045ba1f6f65103ad8ab1c559ddbb2b000e31ec4556a87a6428f44cbf7dfcfc9a7fdd2d5723fef797a4cedfa1d58ac39b90f57bae8b979049c73f16d0beb9baa3dd2e13be5128ecbb62c40958505b7bbabde7c485fcce359af5ebcb73340049f537e018395deceffdff75871d2d29b46ab8df54b3bc03f576d8c2b1dd8ccb9bb4b30d9ea96ccfc54dd52a2b83f2bbad01b2fdc4336e95dac731cf394afac7581c371f460874a50671aff80ef618bc7c485632ca23275f5dd22a92bbcb5ef32393c3f339c0ed42511dae7f3f40e30697990db8000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400128c5e32a0ddc3c2a4cc54c03b2c14e9b5a8fd12fefa87b40dfdbab4859d631680200fac92b5386e4e0d50929f9a2a628b7916c074730909f6d9678cd831b686c221afdc88ec44f35712e3193857b8cb7fb03da35dea49e659178beb82ba9c41514000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae6ce475ff119a15fd4afadbb20d0cfdb7c550370ce3b80b06362aa846b808d9b9b8a6279958885b41d517474ff69a99d5575bfd0796a6ac328b64ff1f7468b620de097d73da3978194529762b2955287404334bd1ce9f4bd6b0f14608bf71073c7426b0c7945bee2b87f88fca9038287b2a62b2b901cc10f3cb0858a5de1bfc3afe05f77a33618c0fdc09485946f2107ec3e50bdbfa3e0ddf934923c8b9cc83735d22f0869341bb6190f752d5ba1bd9a6a51a33bdd261cd9dd84206073e177f56adb7432dba6c24ae581d495e29b770d6a9032079664547b337dc7508436f9ba51ccc62566c493fc7995f93b3ba9050ba187ee95f7d179653e40308d2c4d77a6f091a5091057bc29cde3faf6ec55c402f78aa5a38bef2c13b726dc7188870e3ac702b56657fea0b2c1a707d3b0e5636463b4f49d5f6d2d5c2014b13e16023c29293cab3fbb01c20f8f084110d993b03cd56fafe84ff85794c3a2206b12223c64257082bb19f458fe852592d195b0d3c53fdfcd869957996361c6b10ab67240378e9b84b7af21f9d2240be354b613b61ada51dbbc2deb75664949eae3a2e106dfb837c62e3a9906ebd70eb18ded124b0a8f2d284c27a2cd4dbaab3b7c80c31f500000228000002240000022018a54066585088fa1a25d10e96fbf37a8f6774b05f7874b0902473ef677f86d40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093a606368239f63968506aa23f1543c89f0868b0c9eaae26c808274bae370b9d130a8e7e1cdc0942f65d6398a62ff91fee4bc88c6d6c85fc4d73fb79312bc10a88d95db88322ee8ad3e240ed9d93442d91e21a1a79ab69d1b597ce5b60e3f5296dcab68211048d1f09ca02c0ab9d13b25c2fc59e80de8f54eeb5394f006b0a1c9c345ede65f33d08444359110a8a7457ba7edf398fa49854046ed7ac7584f088e1d31c0ffe19e0e134814ba9a602ff56f50c37788b1c4e3cac2535d83a6766b62e8c65b8726371e6863ae0501f543abe1a956ab2c480f465b33923653eef85c00237cbc3c86ae1aa04fc943bd5935b2047d456ebc7f99371af3986b3af2f56cb34ec6fb84593a2d46523c97b31e0ddffe7fcd29a966311ed61e92d77ffd559a944f215ad77b24b3f78693a56d2c2d51c795b53e493308cfcfbb939fa861b4f86a782998f673e14e541180dbff9fc6ed7eda54402474c83e06d5065f799055e22b3eecf984e44bffe8a3a496ff603c051a1bdb5cc989c78988420e9b0f1e3e5d8abe36c8571b4a500ac7ed83fd1605a0545acc0f968d76befe1440f103eed7689cfd89d9f0bd26e998b350950124bd3299d468ec64d5f26d46a6ccbaf0a35a0e2000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400108e801654fcc3941a035dcfdb72b3b77fa7bd03630a0660e9df69a686ea7cdb702017a7e865d6df4a62ecfb196cf411c8fabf82a8cf9c8d4d165155cf05c9f7806007e50a84cf5547d80a873477159b96a0bac38dad88facb933e6f3d34021d2e8000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8b44d9eafe9a712da7e3803110b8910d8dbf8ca01df3c6f6fe4897a087614570ecbd63154e0b012ffb1d6c3007746548e21e10ae05262f6c7f8a2ba4b3296c21a039d4a751d62f06dc5d1162206a23abf4c03389bb896ef44f114c1e36fc44c38e6013b52f8c4d2a26ba569009ba5828a0a0a737941025c224f1ff1af1e1e9d711eb560a3297e8aba7903b321121f3744cb32619df50001f093d75a7dfe088b6a0617caa940678c6c586533d0f88448cec65a70c968bc25de07652568bbefe9f4f258ee93f538d4ca776229b41acd549d2a002374cd0479bcb42ef1ac986e083585b09a6dd90f54d0a01aa03e5d7f0135357c09df96dd244cdc29c4ad13dfd2fa25f8ddb5e81cc41f3855b3c92631a092f0121fae0623521c9a1a1b0b61d3fde7c8049fdab634c074267277b73cc530d5988a71d4a7f53df2efe250d2a6a8062942040a51a90a5a391eea068aaea7f8cc1bdac9fa548275a396fb2eefb1797ef9ae5e85e36bdb20c009de00c503314016777666e85d4e5964c308b3a83a721e073ed932598126d0bb71cc7600e1dc0e395c6ac82c23bb06af89ee06881ea045477e009b82427988b6b7b241365c5bd6820680016a72782c7a844fc96ef9525700000228000002240000022025e0c9d6c86dbb9f861127382d277c8bfbbeda01d3a2c045804766facbc2826e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018406bc5f29ff9f8c9e37848c69a0cf173012ae8117cd2a29640f703ecabaa5e1e5b00435e1b22797e83b2bda332cc01baa80c049868589cf17c759ff1d08fdca2829eacf69a6b0985bc5b6b3ae5076f60dab1bfde7313a482d8856bec4d78cbee5cbd8b57aa923539984e7430d8a63d7eaf6f081c96dd858ee315a793e3ce1cf4bf3444d71676c2f8ca232c628d100bf73a4842c3204d8508645115b8f00b0563f34b67a127269b9d105f61a6de3f1b929749c02dbcc2139ef8a27cfe8f7c28e8c1056416a03f14c9e21ad8199e81cf473eb5823c3f1db4f3dae5c495ca4046a9bdd33d80abd41e47e754e1dca195c2409ba8269c9247f8f1281bc223066d5d589bb436d622dff179f0dd2f38c9faa40a661a203925e2ea0792e5ba32416e4ae07e6b0ab75bded648ef13097aefe63403dcbb4c1e7c43bcb352ed17d891a387e2192f97c5cbea47532a54705862d5fb05b0ba8c0f59ba008f0791d55973b62fd0902611450bca0b222305aa2181a1b8bcb91fea6134a60887fa51fe659d517ef24befd5ec475d68b3a1068028bc97df030af392512764410e4c19184d704bd91839f6ced86502c96535a23cdf9a3cba9bd9c34b39afb11fbc71c3090c59019c000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40012f4d8633917c143e25613c97e56c6af501e54777b275131df4dc936dbc2d8ce50202ecfa22a334816af06fb90505ed363e5508e5f9361ee7e641c0c1536173cab31f23eaa1d5a456ec312e049515b80dc503728566a90023e56c0d27d158ac1f6f00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094b5c9bf55cbf8fb3ed7308f3849e72531716cc29d7dcb87442d470baa8d588ebe5ec3cf5eb8c862901403d1dbb2fea98b79a33cbf04c2dd0fd56d590d9edfef2b569fb04be1bc2c7d9eb7a2226233f69a4aba5ee7205638d5c220b96cb35a98c4baead94f4c51c59c6ede209bf0e67e5faf084d0eb88a56199a9def81819a685c27d405d4d5f823a82b9948a82cec4de65c111d7f74e09d23ca949bdf4d03f0db6218585e0bcb573e3c4098bc257334f75f1e27f7f2fa90b9bae61f3a585c95d9c2276d1196c1a366435c4a9cd3d83f8bee83fec7647dbb471b9dcf008402149da5183e6fbd81b17a87a5b52ade7f949215f3de0ca8d0cd988aa4a706a95b5087e8235b7d80600d57093773452312afd9c40fac501f8b4849c5bdcab10d07d40c8b61eb3567a4f65624f8de6c9d197b15a19b8d59175184658f1d0d29320f9b8ff16a4bfb35b01e672094d7aa6b8c3c2973014b771f9d807d95151288f20ce68835930bafa5f09a7ef787630d1418ec912b0de047f224ef039255f84e1064e9f1b8c0e8c61ff190de74e282b3ed57041579f0b205c2646bce2d6465d17dd9fbdbb25469dc8359fd9ad2b839e53fffebe7bae5eb80eadd6be3750499f38a37d60000022800000224000002202e71a8420547853e0c707604d93ad4bf8d01ee70b5a636881ff4c426cbc75bc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002497a7afbb657db9604a36d1e30a00a221a0ff2377920a7f4088d55a72257cb877d04922c63e69ceecfa8b8cde22683277bff9fe86a42fec05718bee7d1a0c30e4d9e92dc07f04f9c61c8e12f18bb21c18c469e956b9db64fb0e4177236a30255498c26dcd305cadefc10b46a5e3407f0b4fecb85ebbb4188009f7f189ed7bf195b5ee17d128544ed7a86a203a07129ced78319dca79e43f20ea95d48877feca62efbd92879d88311f09f6c90b360eea4fd60d40316db4313adcd4f47d8865c6ace018193d094ae1756334632f127823d4cb6721811af5585d25dc9a8a4630738b4edf5a4a8b3fa2c3ef96e55913153536a711986323670412d7688eb6c55d0c7406d64f67b7422493048a28054b484a72e7fbc3e6fecd7e1fe9c4db957bfde5e9b41acadea970de677fa61610454bffa5abe59981a0e237aaa29dad82868eb257415b6edcaa6e66804d07de736b164e7e65b0e8f932d7245a8175bccc6c758465b41ee956912177846458a61b1213e7cf61a8aed8ae135a54ba28c67a4e0d800efc91f3edc7641b5dc25dec0666e360a01a4675c039a202de946fc2ae7bc8cd0222c3d74c36804b1bf708ec8217d5ea484affcf6a400f910562c788ac270356000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400127464d265b213f467dfbe227555d8430d533c6c1c5080a7c9da212a7ecbbe01c0202fea59c678d3e0fd8d0a50e7aa4bd1d70d9e46281faed04bf32bce1472828c527f9c52e2a61bfb78c298c299005ff57ffdbc9e864fb0eb6969f0179696b6245000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abddce9a1e198b6af662abbbb6c7fa53c14a4ae6fd220ad39eb4b1344632a57b6454ea97e42c4cd49b248822c0e47836d722abb2bf1cd2659eaf53442e9914037fbce5cacf494db790ffc55c2265abff0ee20922064d638fdb7e17c4f9fc009d637582e3ea3b04d9d41d2c65d869b9237c5b646c9c211a5508b81e1edb8f547f7421ea723696ceb37bc12b9c39fc136a89f9bbda884f2ffddec166f50951740b613d35c3ab80e5c0f3244dd9fca59365d8fc601142bc1bc6427d67d0d59afbec85a9c3032a144df027bd6dd411f5324a44d42b191e359de2ba3e279b161c5f7e904c851de693fe82c89eadf33d869d05682cff025425e706134e275faba80ae31675d187c911d1d2232161cd1ea7c7d2720b81a41448d39e904c8ef288178dded56f2946eb8d996267dacc039630e9fcf3df51efd70c9ba589a352872af664b0139d16ff35b2af00d3b91cfe033d86f21822d71eb651d4f8b415b7090450f3a2eb6215bd218758b2f60c6430308f769aab723694edf7d6038b4203879a68d682971f96aa2d3e00ed2e79d81abd330ad3846dcf361cc823838d0b376a1b3059e4f40f731d4550e4174fe45e2a028d67d7c5c3c3286571f40facfd68c6f81ee85100000228000002240000022026755deaf8bf8027701a52b393a36888f7643c450da8a90f24e9af8645070e83000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009cd13ae323b8be678acc0ed55c37a11bda2b3d8efbe61de50b211ee76eff403777fb929ad556f5c9ec20e80cd649246fffe10e501fa3d394e5844e90f4591d60ac58fb4c375b712009e2e57d1e5a89b6bc3d971546739a29935db34f0aaa95a71f295c37b832fed9396610d04cdb430be2552b566c1df87230f0f96d3e2aa61a28277e606df2ea96b11d8ef0892efb8576c0370649a3eea32dfdc3f3eb077a82611ed651fce4571cfc8ca0867a03389cc3263c9f790ffa829d9d6030fa9303e50c0cebcd8b78d8c071dc2dbae7ec90bf1679b1d4c63cf804d648084076fc7cfb66b49ef6342fbc28b24afde7f69dd00a71e6926dcaf6aaa65069ade5e7cc670fd94873abd2bc9ec5207bb0ca64d3f385adaa679569598017aa1f4335d6f2eecc98e5a0c2e2fce28a02d2974ca6f3da07dfae8a1681150e173a6e1e48ab793b69646340603296753233d6d580498b27e5eeb97a84097a77f5dc373f73e36d48ff1edd35abc12560735651d9d8ddd5c92e74d75bcfe6abc5c2b670b2d0070deae31f5f4491324f6515c8e2d3b384d9be032343350920bffa241b41ba600ca37b7619659aeeb170cca650c9cee35973dcca7a68feabe13463d37d9202b421688a7a000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011ec4c6be1c72511b96dc02bc087a12713a79850b0bd754257bbdc440e667b9b60204474ba3e14cccdbc0d81ec9c25d1bb525b09b097c9ea9c4ad8b7a8b7488b9922da5021207b10a5a76714e6a09c9867ff0365145f07bdcfee4ec50ba6f7827a100000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099e283a5143c22b094b2cf91e641fc3e5c2dd1099c8bfeaf2c6caff14c34688978ce0a2ba2d4c57c2fae2dfc4a6ff87626ac2e68a45e04b1c06e32aa590e3da7d29066c9953142b9cfc591404fb05f7f50a9da80b01ffc5ec97b669d1de7f28329b237ebe5d991a8774694341117f266fe7fa2c12fa5edb55d7d868308e81b3d1bfdfc1e324d34103fa516f72a2806b6261d20d7b01d13681d9716f99e1a672de6afce526b9b8b41d0ed946231422c7469e411ec5d2bee479c11a46847d5be8b0aefb7ca5877a79a60965d095225e6a9dedea8bdd8f8f2e531692a0b2711a54d40c92c6ce7d87f63f05526889551db07ba97321892f5e3967ace2c4dd28ea77ad96e253b00245b30df275ac50f4d362f190225bdb102da81fcdf390a8300b2083d0e87d8002b490052ecf8b5932368b4c23eb88a50f58c285ef9d78a9966745946123aaf1b9bcc564dd41b66f1f9cd8dd60c48d076fa84101e2c3b11b2a641fc2907a3eeab56b996f6bd635ec8f73e6c533b1b5236be75d58587bcf15d7cb27cf10fc14dbc64e6b1bc52d497616e54935f2dc180eea2921ccc0da5c760556e9627aaf1b2311bdb7f93872cc9d2dda86663f9eada4f18177957c59042f20344940000022800000224000002201a7a1cf41a499ab9d39031b7f7104ad440ad8b6dbec03379cf4842cc0bc541620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b0154e856a69e54fe182387cdcaa37f906408c0e062e696954e6113fc2a0bff8f0db49cdcce9266f1ec4a2ad9a1e7bd0c2d3ff38927c13d5d5c822741133dc03e84cb6a31f6bf2f366eaa5fa999278025bec040d14031767d2880e0f3f826b6ae2e4f647565b973d2939b88c5c5c14569f5d0abc91b2910270b79ac2406b18d10d54b1c6b65e277a024b9497dc60753730d3823ee72eef7bad49a1397b0514fe2019b9bb8f5559a96436dace20568d54f098ccf74e1f3be49849e98651f8bb1b3996d355c609231e4fc0e6e06adc5abefd0f1f02c651cdde7abad1c21573d629f7fe708cf3756f32fe79afdbc818a54280c000321a92f7a49c9465f20a0072f7f258e89ed0662e82a1815fe3cc40300df9ff204b1286065ceb048f8a9f6b1d97aaf3bfc8007e0010b7fdc1bc9e90b93fcf713d10322ef41bc7e1c2b9f09706df39efbcdbedd0aa83b11d89bae1af1492af871b92f67a6b4c056421d2271b426726b2d11b7f930062650eae709c44968d6dd635c4c35e4601e9a6a8d7dfd7634948fdb8cd8ae4e4b0107430d49b8e1d1141279494dc00ca71bf5a191a01b8d04dfda0ee714931bce2a812b8599f5c57ddd1dd535a88c317b86d4cea9f0765bc000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400100f739618d96a8ee6c80c7d63809c08fc750232a5ff11f2ddab7582f7088479002046f56a862a174aba13bf6d495b832a349ae7961870e79353ca49798cf9f2dd624730c0653e5080ac2e6eb787bd7c1f22fade7f5bc95ab8c3dee143d28b85650000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000135644a767937b18c2d44c11acc935ce6d5d0f8d27dab3fcf67dfbfc2f02728357f3645e5d035e313ae87ae17a9770a2129c20b141d1a79a29bbc88be44001547a1a22e72e87d479e99447f985868895057e3d139b0d8384cae5c952961d542739c6281cb22a17f7da737ffe93b76c23ca2ff2108c18cef620fc0f56fc3291c58c48b58bfc6b93fd4eb53051505239180ea73c50472321c4f2b14062d709429706083eb5ba3dfd5fe21b4633fe382a6215e8e36e3ce079051465648d5df792f311dbff7f3f87350a44872cede0f347c53cb23274def619f89b34c17c590d2203bbbe7cdf6e5be0e52b466f2384eab22e842f93a6e8b2b0d391a3ef34bea77b149460616c31aa6e7c331d35c1b463a05dd70774808991bd6534502bdb64cedc95e51037335b546bbebf24ea6d2acfa8ec2c2dce055f0c4b95d566b4a81bf5737995b9e33bc54fac5b8ee1ec462e62619b4ef114ba112165908d79d556ccf9dd97e8d2d8c5a0eedee44bb5806320056ae7d052b3a3bebb19ac26c2e992b521332268904a2800754dfa53401c07a49ee77be7f79815efe6dbfdd339c1cda49fd112f4d862e6f672f2361ff6e9ab7a5c1bec9ada8b5f377582369aa5f57401b303210000022800000224000002201ee498d36f1be842d3ae22b0f3ddc90ecde767e02ed11d957d3dc9a0a598469c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000882525c89859a1ab23bd306b7ba110a7e9b20bf4c1febcf64ef89237cd15924068ed06fa6f4e012d9c188c193b6d573ed36d8ce3fa35204a9f3b46527f76e7ab94642bc32dca18fb1e194b1cd342e8baab4cc0797c5f86049549d4cfae639465b830b35f23e6004cd5734df859bea00487656f78f5a5d2cd59b34a18b9e4651db220d62105d178e46cd31bbbc174b7c445f3eacfa0423f386b4db8b3ea3b2ec2285b184a3b5fb012e3a25515c82aa05b58f81aafb66228ec1a7e8e443f082286a14806076c6893b10c9e5fef4b47667d7a0f91dadfcc3056a9d45a292b2a97c77d16a8c1640a4bc337bfd0e433afc414a6c97025e18d0b43a8b12dc73027b8a1bd6ec7066e75be642701fee1f83444ef05a696f870dda9863e0c80cfd747f4bab8afcdde73884b8091882957e0eb113332183784a924242a001e02f3713d9e85bd36fc1c28ab45a80996add4993ce8abc9019908e71460c9b4897a89e192cf216c6f70a548fb113d50a44e7194697cc02ac625a04d7eec39eb9ac86ab694cfa1cb67409c1dd14d9a1f4e0dddab822285e33fba59467a25409ee455acda5ae711cf77ac09a45e003db40f949b33e83dff4c9484c3eae2d3eb42c865ca7ed98d41000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00210258a17435299879f74d79739a834fb896001e15763f24d5d3e2c4407b4e5ee16c8d838c360ff74fb8f6828595bf58fd85e5ce69f16c1440bb9845a50f52d780205e3936eff39eb42040678780c5e33f447d4cd2f5384552826298ebcf5aa48a41210ea961ee74913637263fbf109afdca5ee1e183fcf6aaa68b0797cdef6c27a00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa133306e6c30713109091d037b085ef01b2405f601bbeb27486e410125c0b1a3f3266e67463add186a7095e29924102d2de1b0d48b90bdabd639b3ab937be793c4664134ed39ee3fbc6df3b23413a859b5716e7951837bdcb028f998f2d64f17e77c212a7f74f91d6bdf01dbf8afe5398ad1123b558ec4bd775141eca32cccf55521d0bac86a039a7630fbb423b579528da8303bb9742fe8bfa4e728f5bde6fd2a3336c43d66e6eb0db8c3157e8ef1845906b01d58d501b74cda3205a84bc11ec22a980d5f4ffe91625a71fce8a3a45e8353ee135be89aa56eb59231b0ccd07bf0aca24446658016895c4fbbc51eb3edbe46ae204370b2174771add17d10ebedcca058c25aa5c4169a156ca33d4c5bc1eb10d96b725bec1b752450f70971782c458dfc4573284136be1dc8f4d1319cde2de351fe40dc146a86e572790f79f09cf8efb94d59bf7fbd86440ece3389462dd6f706c50a9c27c125a9fe0e9d15324780743d53acc03611589fed29a0bece7dfa62e96809a5ec562a4b7f525dfc00784aa2286be4827926418cb7a6717ff137cdce234999f0dc4f2c99ad9e3a72d1f8e636d486712fea2a8aae2996cd3f762e034e75c037094c5dca6b92bfe211fdd0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073472398eb1ed231a65277f5c5c938242f79687431fdde0a84da11c1b04206908cdac27dc8b744d5504bf4e5127469d6b89fadfa073099c591856b38da0e92e072d96e8b342d72641593b9295e570bfa4b0cdb16125bfddad19b460505640b0450f4e73c394ed7bfb8d165531fc2e0bc220ac9020b9e8f6c1146a65171f217f6f8edf49979d56b1431c808a88c52d94d172e206109f4f50e474e420f8ff78b8e0008c8f77e6c332cd3098b4433f03962112e748501326b188fa101490431db03ca3ac749cb4e0cc74c1c06ce6cdf6aee6f409945d0e34c8c245a910cd200fa3de3a9088cc9e207fb4f7fa1ab6e5d9a5b6d77173ea8136c0d65191f19597c54029eb66991b7bcbeb0b57df3a65a9a3534ff2c9a0ff7932a8f05564e5d2fe0590f86cdeed13b5e381e4ee4fc4a88555bde5bba47f1673ec5a4d95cd2429d07bf9a8712f3c0ade4fd9f5dec79587f563481f5866722f7b28d84ce93750c348fed9b81d941c844265265995af69593468d221bd48cd856a2270e40b978afb113867d04b0a1d23ccbaf8516598b818f35533f3f479eb8e8366b7e7a76993b01078e85a3d6b4947b89c470ab143f22037e44ebf9a57d522af9d57df40ebb7ed37ddbf0000022800000224000002202423e4c3a9673ae1fdc643070a5ab2cb5aba8d4ae28cca65ee8fa04c7e6ab28b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009539a14858232b3ff3c522cb297f92a633812dd1876662d6ccce43399156dd087d221a4116709ec09e9bc1bd1cfc2fbaf5165c02ceb4f20e395700f10bda071682d7b9051c3ac2cc738a0900292e033a07c22d95bad3e15c54d56abb5a8a97d1c4741e310ae4216575880c08101a4d00f823fa8e0233b5b82094b2563487626584d7755b15c42701829dab02be37c61405235f48c3b2ed1a5d3290adc36ab6fa62da9d8d48557e9fec0d6de76585f0018a6eefffe40c7531b9dd161b42e7a976f7952cf9258ee1a63992695f04e25a0fcd1782dcc8676c6b316ef9786bca6cb1c5b45a7f61274e9138d8ccf5e9643989572a116ce3e9a3acdadd3c2cf40676469e624b6ec2219a2ee0f582cb7e424011480d6ccfd26542430dc4540ad734e08e6c8134b11b810fa548f802f0e507cb9b2a5b5310285aa20c412cdf9085724e64eeb75ce80168379be4a82319aaf3f9319a15e73cb67a66b2800118a6e4d2bf7c23d3a69cbb5e17a04edfc85b870e8b85a624358080fb67ddb4c98f772bf6612364a1d1a8130f07fa89745b0c56f9d3ebb02e8a99cb7e9d909bd6a9637c1fc5f65db34b2f8c17f079fc61f22d91e56c1e84f4627f6c66ed960e929a1d791d05a1000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010c55ac6ac7d6d91fc3c46bf358637914354a682745744a93108fa2236a36bb7b0208f9f426ca566c2354fbe3c7d3863b5413a53d686683e334cdcfdc14a58c0929112f8e5871c569cb1e123181a5325060294515390d69a2e7b82bab9e3cecad2900000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019e5e0254c47e9bc7e7dca8ad7e76d43f020a6f5dd07eaff9c3912992281942ce5cf1f837cc17def36abe3873d79d40e6d73662a2ffb1cd16cbf49236fd0bb74ceafc72e18abc4d4eb2096d2d5dca07b6b73d97e5481cbdff46d79ae6d03bd8b82005a49d457162d13309ee2b0d79d91b3e141ed531926c7615cf3b3da93359bf2e0901fc39febabc698d1d973ee08240946cb84e36acc0718deb57a112923d6a5d9c75653ce24e4b0485ca347281faf4892cf0d04e1ff37b55aa7cb963bcd8ffddcb059d28212396b30fa467751fee43237b16f0bd828ad90cfe59d7d05cdddcc98e30f0455a69505bbad9c85ab4f320e30c4fdcb3be77c1dd93eb6a946424e07c512eedfb61d239df61e5df7b7a678c57af6ea99ebee5bf3475b06a62f86dad847b0078c5e5ac5f07d245c9ebee6fe60863274572e9b6fb26a446170ada3d1bd7578a8a40a8a11e43df2264d7166eb0f3dae4b71ae3029ace6d469e7f1643d95b02681f996d71b7756c251e09c5ce5f3d762fbdf0ca466bdf69dbce151ffcb49186bd58dfbe0835c367cb3ad9f0c7c8c4c3227397666a9e2edaab56e272db0e7f4c27600094d8a95123cca45e587c05fa29c17a8da5a71139260ca34b4d68800000228000002240000022020a3d6770df07a85a52459a40ba364ecaa0ce1f50b8c9e447cc84a566371ea4b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080068a36a32843d1e69278563a2df93d49d652570554ee718d8fc6c2023f71d989b4c5a6dc5a95cc7655042d4e3f2477e336ea8f76c13b9b45526b55fd656f8f02ed3f1aa53f2b64ba032a6a2c836890c28248132fe544bd62f36832725ec705ef86b8c127da29f273be20d7bbc3332fa5b4f61bd99e8776ef06810a67bbb86ec2cb2abb8a71866110c577cc50037c60db95f14ed326c3948051f3a2098c93d77739d7a77afd85866f31dbf9b6aab3e143e0d2f7fca3b079a095e8d92dfa6a0e37554b4556716e788faffe25905ecd84ed2b20950fe7ab59031621b0b2f7a59d28d394821eb55064f62da232e82db6974d4200f907e4751195508f25604484b241ac5503de4bc0231b1963f7428b3b00c8993f30d2326422de369592314ee133279872da050f6f0c41671cf34f8e4a17b363dfa0cef0e6e215ac35e0d72e6bc6b5797cdd0b9ba0af9f5d1839f790b17374569388578b27f7826398b595f6dfaf31ba51a35e9e364df6e725be020567ceea6fa08a9a33799ef7d26db6c91ca07d1b027c9dee2f7ae829bb2c0c15cbec048734c95205f49f10eefaf46a276dc6c4e6d3ee59dd5336b51c3c82a4e31dfd8c96d9d48e483b7de4425d95ad037bedfc000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400115a4b65d6aa06aabe61d1e8b17ff960ebf66870c7a61f2fa6af554c0b6913059020a36ccd913cfc79de686864d7e9274b662d612e97a99d84524ad38e74056ec9107078f0a2487740d6702b7d4079629dd47f7a851b973ab7e56422f050356ffa30000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f8414bea51ddd73a2a98f034790f6b987461736fe031a532f0264eb9d66bf634b0e9564a909b538b99d261075632bd97eff0e106df436e56294e574708ce33c080e7e9f9b3e0ea6505c8935d538f9880c932f0fe2da9abdafa2eb3809183c1a7508c571d99174b779dff7a6d38fb3b1115443a518bbf5b263cad898777fe9dfd16e183ebe59b57c00f201d10f2f6f8c67f2e43a316f931166c4fc00158b5ddfaf74dbb801059987585493ee30b31d28bf45a6dde67b92edced943f9926a42f22ac9c6b8eba26d0bfb4411c82b0527fd4d0f081d285a5c5b993448de2164d3f4a5fc7d2118d08d96980fa170979d189399c399ab9bf03852b289b76452f4ca483c9429ab0df6e16f907d1f9d4315b90833d07b697b700b57ff04306a585e8a5cb32990e6960ed755567d299f4bcf5e3a86bf1ac1b83799dd50aded1acc49733c7483ce96323d1b335d7beb4ad6e11f457264cabddc0b92edc65c7e907081c8eed3669284d7e42cb7cc93c2fa33302933670a981a5337c06f2298d02590af9e3dc87efef6b33f24661e7849ed98615c1371a9c0c38e89292178ca5df1f247818ec376156509c6ec2b7ceda00c6cc2761adb26a3aff3906210837e6d6822ffdfb000000228000002240000022013d95223d0bf2a6d7aafb44e8463c9db4833a75d64dbbdf8c0b9739bfdce89f1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001145b7be73f7fdd782dcb91912b4e0411579ecae9eebf0126e1b5e82e77930b0ce359a00d8d1e576df96eaf7ec003eaa435437de3f6ea9b3092026da8f9bac1cfba685accc1ab5a191c4769df9857b992824d88345e1cb9f6b5bf8af8b3b16ae62dc7d464d4653e272be5de3892ee111a1296a92f8a439386fd3f65b30ea049e914e90e3ddef900fb622216c699bba820a34de7927e7f026c4f47f342d752b6310f8970b9c8b5b40a41ab81edef962c406b3460de5df9e22a78b90a037156950544b6d6edea75a4fb6aebb5dee70e9a6ac66f005c34d88581c59bb39f59db017ee54897acd871885a0ebf4a7c489da0b8e62d9c5fea8d60a9662c9a0b02de5501f4d7b12a2ddc63067052de59a2c0affcceb895ba63b955d701e3865a6af541853b6e162f48a76eedc2e51a8d7ef7182e0b511aa9cb5bc034611ae947f2b2f2fe4a37df774fd9211930870ea5e2ffa80b34ad882c67e47de12c9afe12b32e82562b214f845775a2b99df3f346c80589db536cd17902b43fb9d247ca574bb8605ac56ce6a541aab891e1185c6a9a248673ca707a590cb7b460d4a474e44d3368925a6deece5cf1bc5bb6698a21071599a1e369e91f2c1219058cc14d23426b2a9000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001022e797b7f65afdce736a47dc577dd2634ad9f43b42a1d16ffe2beb9d5b702dd020ac812de73e73226999df56cd29573efc9775bb6e2cca730225e4105d615c53c08484d6a1793ec65899a7c195b0e9a49c1ba742578c637ff90d026dde7e5d8ee000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000880c1f843af25545fedec97abeca081a66cf7ad33d76b08270f117223f1ad26fafdf9a88809ac328bb0cb2e43a25c35d987f7baca5567a059e4122c8c1a12a5b87d70cb12738d51e920e9f07e727305149a61c80aa804f2e4ffcbcf93b78dde55b796c91835b2406627bfe82a92674d2e1a5ebd9667c3fc414b08ed1f9b1b2d7bb388e7ddd42b664f71964576541ca87b8e43e86c7907e8311af4cdd5c97c820776673e30eaa2f0c1b599a24485d9c78b686fdd9e812acba1a01b824f1c774cc14738a3f8ff186e8f146bd21b4a44390822ef03f301fdcb3a328044363a9081b5f9677a23e91e16812f37975eb3e126d150eef7284098e1f89f017f3a93448bf97441116d87a4fc8d69656c9f694580bc1bd792fb1f22aeeb5ed65ca820574a39eb3c87bb0cd094c4ed2ae4bdb874ba88d69d6ac517062413eda76bbe48b245b775290559c7ff271f827cc18b302168a790bd925d8ce1f7301747c3a539a26d86a3a9dde6c2667511a6201e5f4b49caacdc9321a078b1c9ada8bae66adace341a7baed43eadaa5e82db681891e3185fcb73bde2acdfd2bf17f7e69ba428a1ef41b1ad6f455d7a08cda6e47769cf825ac50784d1718fc5a26290417d0582fb33c0000022800000224000002202966e5b5c271e6a552ec85d8f1d2152e9c38d50f5e7954421f36b43710bfba93000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000507222a9dbb6ed0ad12e217d916e2335fa799f4f6b00bd8400b7c9e7eaa27b5b3b0e97d40b17168f20ee31adef9eafccc64f2d7c016fba20cbfaeb83613682bb1b72f3451e48ca985b6cc06a4dca9334c212e7416c5deb0526ce3a2409efd9e44fc0921aa3ed60dc81c32ff288ee357983315af481581cc59f939a5536b3fe5030d4f40f30ef687dd5f6a6d97092bd2feb7c3a2741dfc77028eb6aaef25246f76d2292486ebcfdf3003422e414cea16b0d24b00e00ff8f8777f45141ad71c383248fc3bf439b506c3829e9526b731c37a4e7c64d25e597e721c15ac0bbaecb0e51ee5681167847f5ce35f964546a7c66013c15f26535f60112d18c918f9f552a047fbc7f2792cf06961bd0f7924c55b4beac23380bbfc1957d702f73345c2c7245fa2b3e9133bc20a4894216812da72008872686e5d8e30409944fdbdaddd22e1b04899cd1837b14217a1058d9708c2793cc70ac50772cd5e2c4eead549706b4fdf73952bef64b545d9ace641ddb51b7c68866c43f24f503b4a7f24e8c26f5899685e1897ba9e6efb678a0a9515e39e05bd9f1e679d619a6e7ef83af2d79c57d11bd37035d8b031e56edc479dc4b3f5a68abd54e6c32853504eda0580b8fc25000000040000000000000000000000000000000000000000000000000000000000000000000bec47b00214a62da7667fbcfe0bd03a416fef415cc1444c1b37b81deadc0b8fd9e2a637440f6578c8da2f829abb84e687470e14c58bbd43eef6a0c6acd39cb183a92d46a2020c38ed2ba47d952904e2b9932cb5c27251adc0aa03bea5579e3a648768a564e2200a372064b79c72870afbf2cb39e845edb65444e8e1fa7db39a924b7121bf8b00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7bd1bd4d46b038aa3a1fb405cfd956410e6567a6d0119b6f29e6059a35ca646a54f7d54f430f1b1475f37d09f7a468c2dae8521334ff8af66ba02c8f5913eddd3885907f7ce89a56850778b14e6c71d236165518f66f6a2b8007ebcf40c4f379494393b74c568287d4c9dc6c73b9c1d9f2530c152003b87aac565c337325603b9a0c5fa905eeefda432675d23ca5b3ec04a00c37cadd6f619b3fb42e1af89a4e66fbf399d3249207fceb309bc000144a92adacecd288c628fedfdf5ec40aee47cf55598446c9da89cce2e5a01a9c41fa85ba9c0a57ce464c1a42109a35902ac3728a0f04f91daa18255abfc9ea8b905165752720defc5adaa8277c1c073bcc75a2059ccb2ab47db7b4f06334de0e91ada5c2908cacb38eabbd6914e7f50f540dc99784ec535e55e1bedf3b1df3376130f870e0de4bdb5bb29300bb79fea325d76629ea5485bef8ddafbee16796b65abf697c114be84ba8068d0fea992453bc7c45209bdb9ab38034f8f77bb5faf91e0542830beb356ed8e9a2023a7cad1fe652c6a6e762234abedd11d6e8e4157e34b6e6a285f6fc573ffbc14d759c4d6ea396cc64979117d5727704e3798acdb3d4aa0dcb801947a553f8d68db3f419fc282000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cdb580547bbc4633c79c32003dc923ec1ce892096142bfde72439ba810a8659ca1a6d184cdd07316f441f3c2e28d62ec6e328147b5e195d08fe95cfea133c29b6be8d0357696c85084e9581c2991eb9147f4bd8afd0e9b91584228cb7a1e1edc8670b9221da8178f382d621962d21ba98cffe06e8d01f9a4596cb6d8cf495f4c75e30a993925ce213f7bbdc5a766c2fbed6adc3ae2b4d1a2281adec0cac303b82e21b001dc60fe4929ee6a393a323a0deedb1389bfaf56081c2ad0a121a087fb1d4da9b1c0b8ba65af289beb8cc81f1aa2bb0594ec6d92da3abdf49b8b5fbfd11f6bb13bf343888f75cafc1815178a3658a348ef749c1513e1d366f7cc80bf728eedc4a0644c42d08e1bc65e049186bba27b378ee66f04d749292271a5838bab5061969e9b8a921aa98b58ea477f3cef20b3fb0b8314374db3d2078a3e1913ee361eb086c8f2924e269c16c0f9dd2428a54b3898172c143be0fab5c3677f1d29217b1834ece8b28f80afb22ee2027642aad3cef73bfae04e85f57069085dd6ca19a623e356ec56cadb72dd099bbde69075155469ff6bc9814ccffc6323209c27584f0baf1778de362288d26690dd6f74fc870d91401518c79d3587288b116200000228000002240000022004cdc87fcae662aa682f08a95a074410a33382cf796ad560b71e3daf6c9c23190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012c28620eb12d6f1d04043d18414b0925574ecfe1d016c9055f4983b3a17f94cc05480084259cd1c5b2ebf8da90666109f8d17f4f70e16d6af248b1cb74d298b8ffa3a0330b7a280ee39244b91a7d13f9617bf6d47c137c3fa83834f2dbc769638d83a5cf73cc6bb8e36c05b4931e5de19003497bef6b65c84eed84dd2c0d2f0155050aff492cddde6bead5edf10e0b1d0a52c07ad8e7a9d4798b3d1ae36cdbdbb3f56c5549dbda4444002f9b652af2f39754c5e33b71d0a69451840458777b9ae515ddde7b386d2fe617f058501d4c634e4fe5076b90088f1c4a52d7d777087a58cd0eb3e8d981bda62ac26cb521d30ed1109a2f50ef8a06e1510f689a088b368086512bcdc0281692b2ac4d66cecedf6435d353b57882ae1d1c5e98a4e1f5990789b51cc785787caa9fbefc8dae1cf93118f3dbdeabd39902fae6cd36ff5ab4caa4f9291636b42b141720a44189b63996cadafef2ee7de7a527536fe99dd44fc40ab40778981ca3a9d745f5c04c23fd22ec0500647f9f1b86c5deb9a92046afaf875201aa2b9aa5599eabe015824a3c179444eca60f51b558205539f94168794483759bc22708d8b0374b191386b7dca179b42864743579e765f37efe880f9000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400107a3cdb5a3998494e60c8200d2b415c9ee4ec5bbab1b4698c15490c5b0dd15b6020dcd9dc2f3f3d4e22fb667b33b8d6b6e72b5d42afd3b4e838ca6f66f3b5d88fd1facf56d7274aee598770f2d69db010a693055adf86fedf354a72bfbf30be82e00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099812a8ba7413c5782a50a730edc03422e6012721bac935788473fd045900adea08993ccfe666f33eb39b97539ea0b4f4afa4a8782b6d8953e97e6d494fe7b2883dbf26d078586e0b4701e5f0329eb38f6fa2de1d8cf1af4fee2fd2b57ae4cc2c2e67ccb0d973dc6c5547e3247f8fe3a0db63a7449132161b9e0fd660a7750bed0f1f0d79d4e7209e73f40e92f7b32b8a5b5bcd7f11c69ef0c9b88955324fca2011f9a8b78ef04b37002d4aed8c2cc9144b89121927c73c05f67b359f5c190272cdc6be55a9d080e6ba4e127f32018523679514e52ac2bd2dcc4bf1beef831cc9e335fc93d488b8262737bcc4fdfabca023efa75c7971420965cbee1510c2c0b9d879de74826a8853f0b10454397dfb90a9bcbe06e9653359cfd84191db957a4d9ae324981386914ac53eea3a61ee2bee4740913eff682499fd44b512c632b315e243a9db869c53fdbee155500f9bea0bb1d4c533d3bb2cab60b2c2586bd87ea08fd50eb8b65ba339601e2aaaae82ee045b0eede9d6291f00512bf46d02cbb17221378cd58769ec351c51f3aec84dabfb896031ebdf593ae17f57ac2db9885c0c39a85c3e8bc613cb4ed539a165d7a976776e383735e288d7ceb99a5f0f5cff10000022800000224000002202f8a1330566465bcfae35e1f79e2b38f97d8a6dee50646cf862cad55df7a62c2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001599b281a60f9d6fbe380a9aed139c6507314c0312eeace2173bacf4f485d0e986cd2351cf88339d078f549ba84a8499bb944d3b88062d32a2d49ba6b2aace494f2d3d25b309c9b3305658b906b8a1d1ac388d8dd3c97810ee67e6af1c6b503c7e4ef130c12aededbc7b251f85111e181d3d71f18f08e6cbfb836f485e28e7d2f68205d917c867aca12d4d267d9c4c2589fd88abfb0aa05da703183704bd8dd013445572bc5b63737c8f442247840abe201abdae4490c25fcd99db7d3a9b80adb7ade3064eee0821d63f9e79d0e81024eeee4ab7d1b42ed83fc1ceb65f15fc4954670c8802b19a5eb03d7b2a8d1982bb802abac5481e22c077c6456329e9f9643ad8b7d98c7b41df05e0ce1d753a291db0efe3dd9d4a0ef77a27eb433800b9b32a6a781f801857fc11fc35364c2420c252b0a191fc0cda96bdeda3416b6fb22ca681dd2ca2fd06da5c1f8fd53928c86d72acc6ae5f74c30019eaeeef0cf5bec2c879df2a09fcdd3d2a93116d7abd377cec12e128d97b55d338b5d6b4b2335d3cbd24ef597657b05e71b0b1a2cd4ae14c7736e6676cd74372c9330a60f3dc6315c44bfb312b8e4550e2089d73dd61802a414bafc46b652027111ecca7637d1424000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011bad512b14e7a50ff1d95e0220308ad87b58133db7d5180198fc2f4d8a084bb4020f35c20aa453f18753fffd42081ccfabda2156852f4adeb480699342ff5e71bc10a25b0a5045a916acb9a88d7e9e912c53079faa14548969d863e6a1f7342969000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4fd2acef4ff2822d2fb0679a48443edb648f4607ec010602655be33e491ff238656c9a15e7ab196d24852d8c83a48c6a53d4c6a4886e05f60ca9aef25bd0f159218862b4c3fd90bb25a103041a5bebd5e040b74c09cccadc222c90e619b809b09124719dd70a45bfb50bdae9a326cd3f02178516e361271c9fa15337dd8cad471b8983fa108ea83cc5f117aa7381d181cfae83b01675f5ac707c2e37eed3a2d344045eeb6e1a9397533f30c215603d6144c128f2d488a99d8a7cdc71dc7d1ed9b4a744ba7bb9b87fa65dd482796fa55898381bc6c4d441f161b7e780c8601d2393a3cd4f807f6c423974399a9c986f561034d14630cdacc29f7bfa03492ed3be4b8fab08c0196b686d80b1ef6efcbdf0173278819d099d0d1cf612053835bf03c0c3628df1771225c373597b64a2241f7255903c1ff2f942198cfface460dfb0f4185c8ecb3540dc4b37127d0adac600c5a797af1845644edbafdc839ee5ab2d985fbd7a6b81b1571d8e878299d8fd048aacbb077275208dc99a89719bbf06c9cf75cddc8dfae88531527d3da0e91cfe801505215549aa96d38e4d8448fea87db434110e8e247f3a670e85fb1c2464167d85c28465f47b4a7c4ec78162dd88500000228000002240000022003d1af295462cecbb2751594ea93ef3a00e96bc9471425c1230bc75b259090380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010be80d083f0315fc8ddeb3db4f7d6227dd03b012fd2ed65c65fc983bccc688c7ba39ef763bcea7300b931499dfb115443191deb017f34c0cc7962277aa342bce16deee3034ef9388b484e9b1187c8ecf3b61b94a216f3521e12eec4ef9bd2739d2e6cf2fcabe02afb90c0e5890e038be0f360da09ba1e7e47ec4210fbbbf52faa0e3b2a938ec6e8916b036aa01c2eb32bc160f3de81c3d9964fb4ad60e6fcc7577f14535ab8f5c50cdb7c2a89c75ba3dc38977abee35c289b0a8469594bd5c600014f896a5d7cf41fe3beae592c3dc8cb86b451d11e0f8ad6e1c6f5bd22331feca2fe46e276ab67fd846f5df54066b2cba1b7545aa156b4b036d2c14d35b798195b502686c1524d2e69f5bf048e636aa4f6eb5f5186ada1c953ba5eace5748df884100b8bb0230395d1f4cd3ce9e953b41bf228300b73c749d755bf5cbf793f5b1b168ba1eefb5ed86266d1a263c46b2f4754e1302de3a8ac8f4f3862658d5d81a806c89bdf7399a5fadce0ef2d9365368eda6a6600e44989424151965d9f817814554837401385e5fc66aa2139999611870ec54fc4849fd61a921c261836e3e6aaa942b05bacec184e53f381f859ec0c945aa0b64dcdfff592afff4c73fe25000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001291710b71274aade0fed760e332616741510c8c137c171c7a837863753b73eae020f8c158a9a4a671bcec9f5639f40a593a35b7fd0bc3cf7d1daec50008dadbd10167f98e129e52a7c9666025583fad1c7e0da0c9568077b03306feaa967e0785f0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bc4831a1a0b8585d5b1b6f8504854de86e46ce9e2487675625e277756826b1f957dcf2a1d96e312b361b73ad1aa551b040041c41ca8c5705b81a4eaec0135b3a2ba0b3bf3ac24b3aed3b66cd1853597e5012a214d3cb7b12d3720f233a0cd286a43f6288aedc92906eb019f6ec2aa2e5a1e7066b5f8a487200f1da9bef52c96790241976d44f837c8c2108082f3c4c8fe734339bbe97db61144d3dcf079709f4bc5fc545813e86c272dacbe217a49f5be335f4de3e178a08f7840c4b8393e4957d59d7d77970bd8d0c0fe12cb36cb70ccaf9f18a3dde8f90696f4838024c329ac4de1fbbe07f047a7eee79b045f99dc5dfd28a51476b685363007e631db8c2f1435eec62e80cd0bd17146a040210f08378bfc78de9799c649e7bd568b35a7c0d5dbf08f7491d2b75a6fe66c688dc68b8f3dbef5ecfe7823e67e6dd3aa0eb1db6039c5bece708046288e927540a3e421c915cbd1749a030d25ffafe294456ad8dcc41ff3ebe8a79c1f2c0e26bf894de285b9f6136244720eabd244dc06c2bab3d82f214aede4510e470c8040e99170eee7ac7736d97c3723336498695c7a6499be54b2e8075f85517c947aaa1205e792363a0adb2808e976cb2b9e7163a421d50000022800000224000002200a160fc376a6a4823776282f021dbf9b26fcb5337ad8c883ea809df0c107732700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4831ca2872dbe85aed7ceadd41f8234c0f610e2621f8e8719e1348ae2a30d2b052ff0ff88007f141d77c5b7883af7e18388cfafe9eb4af1225fcc40c6a587f2d57f3cefdebf85c10c9e04814425694dccf43984196df8aa21f0328bc7d514734d42731ae1d748329ffaea10896c8529d3533b599c05decab0b8ca19159461c9150232577d80fc5df9d460585ae3de8e86ddd23abfa2008684b51b8db5072bf3da0900a4c9c1b824b0f34f55da947d8c8ab1c1761d3951ee75c28a5c53714aa0dedbce26f3320c4b3f11dc0992e395925814c19d44c453ebd0027b5eee9e10e600a973c7b1adbba25bb6e48e2a66f8cdc91f8d3c6ebe871b83c5bb2b0fe4cbc89aa929ab22b9b6f316df56061881d2e3009cd442bb3cbb57fea751cdb245b63fdfaaabaaf525d70aa0960fb1937adcc6570f744bec0d475ea3576ddb5a681efe4ac1bc96b912a5926e4575bd8fd2ad9b6427cd1b6de6ceabe7591d83010c890a2f7d3b772bf832850ead72962eeb69c4b1c020e8499cafb085e844953d407d1b93478910f15bc17f44aaefa235300d1542e27cb80eb4dd29886bf2b2fa1b96159ee39989c0a9407cfa968c764d312042d4cb19d2196bb9a368301e6166ff1c92000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011dce07b9b8baa3f1420972117183cdcb4ce846da76615d81909e44231dc639c10210824b3ed339925b7482e2622812a47838b2644da6b7299c9078867f41ffc01407a821e6cf8ae8a34d6951276013307d36349811e4fb4a45922e6fb32f67594e0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d7a559f777dab2907c150ba1291e11d6870a8c36f9a1c0dbc12acc847e9782151bdf00b4300c44818e9725dad56abc3a7740571f649ea11a5f5c459390f96c3c39604765425b13062a7e42c37d4107e7bb32a22fb765994b563183da5e8d497bb779f2140fee942024aeaba22922bab83301d05fa454a040bda8c926a137e82b684a417f96575eed6cc0f6c7cd6d65d88fb5610074b671b37e718ff5016c7065085b4a8197e5bf93f41615eca2d75c512fdf966126b6560ac2a95bfbc5b27566028b993e249ca4333171d0576dfdeba1fd734cca7788473c1d37304f23f833500b14f56c09a877034c3b9ffbf88241309a4bf61c0aeccfeea3d8e792fe7b28a971d285d6245d0b03d9b7e958bfb6e1e1da87d138353e990f3dd504dace5dad00028d91f0bde4c6523128f5b5af76bf2b88d2481929b18d55f0c0b3282a54f513cc05d293e2af117932ad72eeef2f010c86b4bd61bd91a802a360cdea6ba2d9486e4f7228a311c58fc9401de1153055e420d5e558b1d4ddbd995ae056363e0868c4d2197ede0a1cb895d2c374115fea49adc9df2d17115071935a3df9c5fbb8e8ff933416bd21d10ca91193dfd0d5c822e6055fbc2ad6c807e2ed53ce5865e9800000228000002240000022024656bac6ca8123405894b59159212548b59e2c0974533f18d993a147776bdc700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000943b1388f18fb1368792c87a29ac166d28489f6346cd1a61847d0d6cf6338f4373c21f8db18bfd832fce102d3cf21c3f0193f7db2ebc8f1eba1b5ce9332b1cebac4a9ba12ab9abc0d6cdda3c7509eb43f14c0be5929586bfc6657e6185ee3802c4a22a0b0277088d7853f7e8894725d192e2394316350b2de0a7129edaa9242ed225a6a7dbd5dc88e48d1fda00c6e05f79c39f00b494aaa21e52395abee33be768ade0c72a798cc13aa9be6de33ca106f36de22b5f9587d0a117ac5ef68520e92277154447b13688deb934932fd95abd8e6d92b0a37450b5c4bb43960d4db1548e3f8eb4ff5c55586b5d5191e2243ed1f8e916038057de2ae27d4f5b72bf5fce7f2301480d44d3bed44ae80a53e395b41d10629a24c46ea8e6d730e09924eecb8ddfade4045da20e1ccb5f6f015c6474107f9cec58b2caa34cab4d6398e832d9f8f915cf618211b5bf99403d424d517cd2ac7ea94e77b3ccec41c3a4cd540fab927d8938a730c52f648d929ec3f8b7ffe562c67e45ed59dbf244f45c39e85b911d77e8ec82b3315af5a13d75ef09b584de39f08090ea76c56ad270d1babbbb1e777b37ac55e186d32f1b28b6915ba27e88109f619f3f7bb86d3ae988474e10c2000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0021d9d8e9570281fcb6e9ad396a5d5e07534cd568da723ce74513f73d4e77cce881d6739ce4f1005961ebba3cb6e21933a1898acddf973b920121304a96c33f0a5021162e826d791640d8852377bf748624a4f16cc39b19a10e5567d14147e8b85e120453d7a21e96bb89b3bc580d5fdde4d832860e44e4b93ae649974cd3b68294b00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000225cdbdac9a9cb3374bd89dbc4accd6d400c4443a63c4513e203c06b6a79a35a3c7d46307611e855cf0f82e69b0f5e564329e5cf0a7bead080d2703a1c4440b488742b749b0f6e2e35ec423f95bdbd4522fa3beffa5f226d5db2a8e2ff0cadec8db1e0ae7c1e1448625d3501ec7658e7670dfea8e34c536aff8db0cf8603c97f0a39bfc7ee8025dd4173a838130f32c96c91fae2cac15d470ba3590679fece8e27615865e432b0d6cf8a4d6a21368115512b177831b2a95ce647057181f8500050c88dae60c8311f74a921877a616da2d5b6d15ede7cc02c921301711f62a1dd5480383c3f9689e7fa7d6cb632b95e2a9a5be1d546b56ac9a73613c4e285f694f2882cf25ed8a767bb5dc2ebd384e2155a1f8cea6e417c8349197440d2d88c6c5123f84b3cbdfc128657b8eff22071b834020064cf6f18fd83c23fdf8e2e7bc643035281432bae490c8e60c0eb7a74a528400324cb860b8ee02c5ed68ffbe13baa17b1adecb9497c4daacef51b488a406351685f0ff67a82391952e41a8b94c6f7e94707a8824cdd54a3ec23dd5013f630a2365718f70201570ed04ff46afe20e6ce5e7124139445d4fc78220c8c99852993b62a628305a28f50bc0f35eb4f600000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae130f8efe7d06c666805fca8162f2751a526b1795790157595d94fdddb2cfddcbc51e8589e91fdc5042aadac1b961b69e02d5e5cc98ebd1bf85af05cf36288fc11d7d28c9d2a119514b6304418762fa0feaa65db71ad8e8350461fab1db2131c800ca2e8738de2cff8cbe26ffe7da30dc6bb8ba54c87b86e79f43dbdb47df94abf136e2759b1c534db0a2279d53b2cc8e2dcbf84c6788872497db311603708394ff3801a2a59c3bf9177cace32a8a126b4f739299c0b82b64d54c39b26ff1ded933e2eadf2b9c328744034db79b4ad3367476a3c1ac00c5df614406e8c03d42cbc09e2d14cc5deecd12c5356e93524b8b6bde1b514b2b077cc1b422de3858c5af4b23a89f8c95ae8ef0acd6f121abe29216fae74acba996391eff99d6bb8a1384c9e012506ff69e1548f4ef0f90565e3784aebaa165b46618e76435ae2119ced87153518b4f43e26127735c94a5382d80bb5f41ce4c5895dfeeaddd5397b3724540cdbbd4b89a1f39a1adccbb84b21e4b53f3bec536929faa6fab75b79fa0a8265d4f71997f6bc27bffb4557a87743573ae8fe838f7931eefe5004be3a55525b68e94cf812fbddca7fd0fc74b93cdc6091cdd60e380995788acc350aee33e56000002280000022400000220172b09ab94137954af6a942e72b612cf924f3e9156217df11683e26497aa7c16000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e9591f777b404691953d05250bd2b96fee2e557914e3015811e4202221d00791e47838e0d5829db876d6eb914cedd998df071f74e2a9d78eaa3b16393293faa97dbaaa3f5b108f7c9a5d164d87ed5f42ef3238db6c5df279711259ca2c18ec9565dffaeb03084a8da56d377e5b10f5df9495d384a2261b309cbe7eedcb020bcec8375845076c93b1df455c5348009da27566b921eeb53c6c43b5b8a975bbee0e5e97b93f5a49676b389347c74c2f29c79e7ef786fd6c2e2a1e2d25a61b08275845f9e135c52b4a2a0d84534165a72bfebe7e051676bc783fa51e9f6ece60b4d01e558186caa61c2acbb391c0e9f2e5572cc984bccd5db191b75c7acec43aab7ef2f0fd53c7f64a36dad33043483f6835e76b039cba7a1b058cec6d56a6480376c44389d3bd23efddcd426a6f3ce2b92b5217d23cd835da889882e841c9483ea1a3dd34a54276019d568beba682350a0442dec5a9a76f24fb6fd651aedea2eea2faadcbaee8beea6b8fe11ffdbc6010007481475fd641001db1eaff5115524da90315b2600b851aef38512ee077d848cbab3a29d3dc6b16db1103c8883832443ce3e24efd9367e240b886fc3306ea2408a98f76e20d9c9c670e29c099461f370000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400123136c09ce48530299605585905ff830384f9226381faa053500c6eae176cfb70212b7694170648c185219997ff57eb3d47eec9deeb3a17c834c388fae53432afb035440ad512eff0401445e9087f61d9d84c23bdfa0aca8d1a813be2d421947db0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008717ecfb4b456ee150670deccc73533d5e95d720a4ccdc2fe51703ce93d24d28f11683cff807017441c11264e564b77a0f46e06035bfeae5f4d2a2b808bcb72ed33cc0964e86029610bd771342f42a58e573bb3de5351f17a8ac0cdddd8b5427e282134ad3ac306c3c47d808bf480bdba9d42f73e7ef578a3a7819ba4aafd297bfad0cbc3b1c6db93b55216b540ac158330d340aa4611cd87a527f72fab0b669f0cb4980cbe2263d0422b6a5db14cc6b20dc6d0a5d104217f392c076180b6a66edf6176a479f9a077b00c6ef162ff1869b7a854e40ee2445d9e34cfe45a86c2e9880e8cb319bb2187407b03e6c051b4191c1b7795826ced53dfbbf6c329dc47d3239de2134cdd1332fb7531227042a4e5ddb1a9d2a328992c75e5e3c9528a01e400d01da65845a6a83c9b8e7b00cf5ff150445142c945e86e4daece6d0269da30b3bad9269f8264440a7f7f2467199b8eb210d3b6137d59109c6c70b984c2478f1aad1f08680f6211e9149550ad254af12c7f8c4aadd3e8ea0eb8a755c0cd33acb364242f6ca7c3f353976c02d0e1de164ba0e7f5fafade3eb4ce5d01f830ff23d31f66bb5e1c166dbc5eb62333a819e0471f7604c8e0b4783295fc04d1c433400000228000002240000022002d7e3a82a248587808ce45b32fb85bfefe650fff6958888bd8cdac4ce5ca020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cc40ea66a717a65b37a30446058a955790b2b7845b8663de2c023b601e637d833363f71ee81fe2f2f71849bb4d095772d57cbe7c6a073b841e641dbb1c5f1c0ee219d16b800e5dcd626d2234ed8eba4e1719a85faad6b0178934f465164f1240026a7991164fd0ceacdcd5f80acd695275b13524537483da003da7acd1348195e2d9a35a931a6d93797243ee3cf4fb35107df2959eba2da338543ac3bfba33d9d38767041c76a6bfb50c2eb7d8a0bcde10b839ccc6d5d25d087e3104817f23de9738ed8a3e582cdf64547c66cea278a5bf107594f70791c36ab393e021502b2832dbd15e7cc3945cbcb7a6b8dbfe064a440af12a5a084355abeb27ae868e3ce1d87a5738fe2f01b0901af31446c734b1579a5d05df7e6557124cad2c7e47448a954e59a9015d0d569f608037b9669dc1998102e38272cf8131b526f780edb77c6d150d264b9e80f34b804334f233cc3daaae2b1cf5d33b749d8aaffe2e646550b5c8ffbf0f67d92650e31c128ce8788e4f298e3c94badd3a46ce9f008594619bad8f1d0996a4c3148c2613aa3ec4fcf10b029be4c64fca14e49b4cbb166a1eff051aac08e32677e1962dc7dec64b65ee7fc2410b4ec5557c3333dc050f3e467000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010336831f7c25aa7a83ef28e9264630ad11ca34d613f064aa1866f45f58219e960212c287a3b3fefa8f9fa430a898c9e6bfe7bbdb7f54401cf30596c742a633f44a2e3e0846859c27c37c86a1cd36a764686058a2c9b7e3183c5b5cfe5dae89e237000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3ca9006551ab7b3a341498f8edba950f80c5d764d56a24bfdc4c904525bba94099e894bc9ffc57377c1bfb49282fe7263692c73b68b87140e65e7bb6618d5316e2039561e90bf1d5aa067bb241e4905502e5646bc92d2bdb7314655c8349bec24ce7710ce1a6d6e1794fda337dad31ef3e7b6ce9a4e56e8fd4d50e658a437e2c8e7fbbcc15689eab6ef4e3b36a17db92132782ee49c4a8949a22fe1c894b1730774a37275aa3b52b4427058c4d436061d5ffd8219e75c764f0edeb9ef44aa200238961915b29437114dc9f9ec663b31efc9772f7628e7134fc9aded0264aa12b8beb14b5004acd386d95120247b7c407787e87a4ec99a8e6589c40188bb51b93c424ef782778f5c9c080bb7f8d21ae57c5d304acf4fabdf25a6ee9b5a869c5dc29d3e96d23140c244fd6041fc207b990a424af815d6073ab8c404848089612db04371a5a98c0571ed904cb82a76f3c19d2216097f5c7ba5adbac4013bafbb2a2332c3d84baa6b223fac8b2a468032982a2c7499a40b55a83bb1ac71056b13697f56ed6d1ad63225f6c70837039bfe0368a01812556b6f387eac9d09b1b655af58189e7fc365366aebefdb2b91a7dcbdcc714501c66cbb7cbe1834f641fa38140000022800000224000002202d144bc67c5912cf49cfd141ed116fe834637c5249c2dffc09d3ca69f0724acb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b680a9f571301af739712764fe56e94a00b040cf809c21defdb81bbec83279cc98a79ad97c1bbcc345de50f8d704c28c135705f979aa04c39d078eb13a0016b423e68ba310ff7b0b56328ecea7d6476a3f832e11dd8d2440a14e94ee3ad8f8ac50ae7908780d9433c5b3a422d8a46eeeb87c1de71649a5d53a40abbaafc36bd454aae6257982a1855a640def70ab90f398d73b48a1a8f6240ed8307165cffe9b56946f83979383407894ca3b938288e82557f341bd7ecd7bbeb4e6333d1e12e983c7b04441acc22f8e39f9364871f1c5f64553ade71640839f2483810c50e5735ec21cafb583ebb32645745847be3896d39e3b1c1659e977ec7a48c1bcce0fdf46fa0eaba8140603843ead0df8369091897b07096065be8991c0e78ea572c055843688e942c8d9a9a46e580c35748904cb12e29dec2dfcd26861daedc35dd1829c631f280c5e9edd82611d04f2fcecf35f22d16e7d6740a211c7be68df1dbece1543d538c273d2e9e1491d9b1b0551c170ae80e6471ccadcea3dfe77a5f12553a0d7375cab8fe0f1c7ddf8ba79c8b9b8a7d95efab9ae8d439198a61cb51552b557d8beb41ac8cca647e2f97f9acab05065e0f3a628e6315401d8513d65601bf000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001040ed24299aa9361158d89dc236542906d90f48a06b90fbf7ea921e92d1aae570214c5a362984ebc00d9353a0a1601f55c83f5738206092bddbd1a6a73c7a347980a0f670993a38a159728cdc08b8aad1130c9db266f0898eed2d50dbc925bd0cc00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028d8ab098d93542fc31ed86e8dead9ba073fbab86e2a08cd89b65a5f4265d4baba7dfdfe69897b0f01cf7138aa9655b73f287caf9e63747a0d5fe3072d9e063d9add6de882fe76b7645ec45f200766ed8b257a857592644ea29d84d20cc9d340651a52eb31a19b8803b2e9139cec5f342b656edd1e917967fbd29f6700c01b0fe0450b32e5a747e109f1fddd6f8c9ec423297c7bb9fad2a026892bb37e317cccad2229ef7ecfa2838303712b805b4b3661d121e7060c11a44d987971541a6927915758ac9a6e153d1bbaa5119d644fb5c677676703c167c7264da1149734d13653cc5c5d000421d88ab580871705ae9cc3d0ca77d1417bfe515c1f4d296dddb6224a92eccd8031e58b4c53e84603ab75efb43397ab32600e8c7380d95bd6b86874dd881619ea3d1d1ea482da4b3a8ec8334a75281cc68e6f4c506001ce03b15bcc0558a76a3277e2e9c8edbc0d604b4cabb8f61761af8f01a44bdf361036f77dff9ef74af4205ee6c5f12986f9f02263b16814446aa4b537335a7ceb101194f40f5fc6b82d2291e074132830bb7a2fd91d4c7e280fe2d104154b5d9af16e2f50376c3988de953216fbc3e138871c8121feb7e0089ed7dc2099ab782f55094c030000022800000224000002200b5e767f5050a773af359ea4a999829f75b65b9e40b3d4df0e83169cf058e3aa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0645e893eae7962b423eddcf52011fb33bbe252ba584ffa3813846ae91d18c59f720881978c1ec57c68d53c9940d4f32dfe09b46d3485dae0b90eccaa5d804d5cde8eced084b4e8c40a36491ae5050f41a62161c63b8a849f1b9d50b780912df7c5bcf7ab405d263e3b9ae4ca5e7c94495135a8acef64c71490b8684c6220f986552f1c5c9eceaf34b69d3e3e6e47e4b2bbaf32faa0bc36535a1c6a16b0722ede36a1cedd396559503ec44ce381b2dfd37cbf6e6583a0f82ec909ee6f7d0a686ad44ff8a082b3baae73af9dcfe4701ab66c39a1f82bf5ad3d086c5c4d19bd2116f2129eef1642bee917f5bb20ad2f189b1eefa51bbb5d4ca6c508c7e10bd4f948c97e6d98847efd579de8e55985f99a655fab2636c88fdefe3b25283ea7de3db993791c5ba430bae5270e5add53ffdd3768a0a48115143821589f7afe92b67873a4eaf1d3400cd5278e47a956bb2c1cee23c4fd1ef49ea13ae90279c9bfeb14980ec2d6136ad10b7e8c37757c4f49220656ca4b36b804d8e526ca452105023e19ee6cd180349c256082729fdc18d9a1677e161f1793c12ed5d396a235b3ba6d9c3a45865bed15be4fa9d661dcab229df5ecd8d0641b8ccfb299020ce655eed5000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011797ed47cc6210c5db46f8df6867ad884380759ce4f20a9e2b87d9f536f2e84402162445f59c8710eb7fcbc19ffb8d0221d3d76d128a5c5adb7630baf1fed77e9d164e6c492fd440d97d4ccb0619d56a8b481ec790d6cd73d13214c0b082d1a64500000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018f30135982d40b7fe416e119b18ca5b259fcf9267c813f4a60b83f2c7a1849fd0c015ea12ffb1b6dc1b2a990feb4d6562226ffced6e465ca1e8147ae5ac5aa0cc0cf83804183117f4512bf98dbecf7ab32dbee617c17e0e088d7203a96e7bf5cbb65fb46dd5e6ca5c13ce07a051af0da8d323700f857ea304460ecd00286570f44d91c13584401311593a72a89161066d36b8684448932eb096db4b804865e3a8e8165a10e3a5e79ddd7d74f5560e916b1f5fbc45a11952fa7d13dcd91cae52e80848121c3d0897c006f1318d81f14d589eeaca7ca86c74a639b47aa42ed5f2e11763ed50e0016ccfc72e6bdc645da59e78955a89298fe720a48f50884c3f161d78920b8f20818c5b87e405cd3d7c16ca31458846181a357391ee77ebced05dadb5f6d952dff8ae40ef72763347f4ef0c135d1b2312a02a854dfd09c397d7866b8aa86f4999253ed36eb7dfdbf0fe6a019dcb194f13baf189b3f7dce63f1eceea4b5e45bfd19ab34c77b21babb6c48992bdc51cef63d3b822d8d35210067a634c255ecee8d951c3cf7896dfa9a14e341db136b456d239ba1a870c4eedbeffca9729a8ee2b20dea4e7da2e8e8dac7ed55b1f972a01e8ed19f28630a3d7d7a37400000228000002240000022015345a638817130aa4bfb63220eb0b9e82c3eb49d3983b750fa3d040b491245a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000288758cc35f75b06158b6f1e5dd49488448baf290c7bd67dde9ee91eace86ae131d9ad00c954264d23262800b754cbc5c351907bd6d74cb9c4d7438b40b6ad6eca30f1fc9e0bbd881fa2d5738532380cbc2ddd4f955fc50722a248c14801ef0b02ec5ceee33485194c9e01487263b4343c24c0515a86d8ac4a5f6e35780046efa1aa2b2a8d0782e790b44633cf79b8ead65a2b213965fbff7f4c69c0d28c21b7ef0f0a3c0d6c3c6aca6c018d402caead74f59d6aff976d55649051d0cccf2e698965b1dc5bbf641d2d00b769dc0c1e078ff80c2fcaf4d136e1dde83d46e99498ccba374dd2051d2d4d33c897a96b961d266d90173f0c57210db5ab1cb9ab941fc684406aa281f6f81194fbee9326a2e8a00482be15b5c11446b88abe2e79ccf2943590e5f939e29dfa3f967da6b74f92bfce379e6821e76e3f0271c0a7c10472a5728d31e521453db3e3912ed2c1467acf512937a2e73c9c4ef5d1738134d855f01f40bb7bfec9ddd170bb7deb057a35e57d2cbc75a542d9f52667e524bb75b86d2037c4acc12d84cda238229cf2d93627a051c20960cb108d2bbf6651b8872874c371dbd81ae2f3d41b005d04b03c7049f6a4e88dcb92fd15ed8bbe3572bf6d000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400118bbf6fc84b0aeb312bc007cf569b10302454ad97f238b57b866356efe52007902165cf7743c878cd75c205fe2ae7bbb5e4034af40510605ac52aa43ededd030562f62f21382f1a31afe710a98c4883edf92638c0a6c72e544500fe3ee13447191000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a57bcb41ca64c2d14047b0821e2327b8219c5f2b51ac9e76aa641119853238b9a41cdbf8c22fde5e7b201033d7849548ca649976c988fe6b075932e4483549ac1ad3368c759062d801ecfa8523b2b1c7e0e69305c53b19f6d8e073e4a496e9f8ee61763181907f0a14ad875484aae854d893028ae80a92582bf19b8fe19e976206b43b89a08741c5556ce6c81c8fc2489a86c9f9afb77eac2d221bb34a81d2a5a1c78477f39cae72fdb8a5c49fd4fa48a527418906f5839d2df2d44eb98f413dca820a473083b51d93b084aaa8d5793161c56c040eaebee716f0f537e98bbfd7ff8aef77cb330f9b69bdf3ca4b00de16d052d9f8c73804631ef042bc590d85fa59dc21bdad7c0fce60719cbe20b50c409047048212c8d395bc23228ec2dbd2f4571e43ecd69ebac7adae43e582322766e328bb2d4ae6fab7dc937684db531449f9996b456c8bdd53bb019578abef0660fc77fc9c4c6afb1a29143fe41d0f2f401d2a76c93fc4322c847557d0208ce14c5d09a4260866119708e9a972fafa2657f43646e16566c47c2c97ee0a7ad7fd59c1ff2afa9820e7226d99ada6b2c6c689f8d1b4eb301370cb701adbe4676a1aa6fa7c69c73dcb5a2ef0dea9ac377cc0ec000002280000022400000220062c70a149825e5f5e59812db599b27e23afd92ed465f6cf5a5d0651a039be140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093834c19df4ed84ab6c475de78e5137f5cf667f7b53f763a4742baf3a08181b56af416f9a55aaf3f2408ed25f7a1fdb3056a5cd022262e357780f8e51c2604d55d2e2fcadb4b131b1f2cdd80892b157b660d1a215fca9c79a6496ab3ab6e5f90d73cf4eccfc541a81ba73576b420cbdcec13b670d42a0170bed7e9daea2fe2757f4e44413bad88b64780fafdb92fc1c44d7e775b868db8eed46af02b9b3f92bab5e55ebd04927a44f835141bf7fdedf9094df07f633a4caa40d9d73bc4448e9a460c3c64cac10a726192074f5b0617c9704802e5c953461568576806c6a657dfccbe5393ec13273d79208cfb65fea65acecdcf03ac5d5a28f15ec69d6897958d2d36abaa70e9d9699a4428d98e973dafce759f6e30681b9d4b58ea8f6230bf3576800fd72cea671cf8958073f3364f151a62739134449c116d9225fd6e846dd076904ccce8782a97bf690ae79f102f85fc5c9502382b2558248ed7daf9986123613a105e7a17b931b6c9fcd478741b6351ed3aae7318b9ce876b025b9d6a97a37a384bc18daca0cd2fa73ff13b138e4bcc1c4df859d95d28e707836575fc1db12f2e018a437c7659f4e61c43beec8645bfc50a4dca5a777fa5478338e86af68e000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011294755de3b138b9abce9983c0aba32a2b8ace78ea4f1e3a85018e77fae3967a0217fd45ce7005a410f358d3bc36b91d1a02da7b26b57185b06531df6504dc1971274465cf6f115a0b4ee535859200d185e40c48784b6d5c7d97259c898ff405220000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b792281d499b08b7480e405f3427c0adde9ac877d02025f619cc29dd3e03c8570b05a230caa19aa75699c9597f845f9095499613e129c96cb85aebb3da966a4b153df1ba6d5af21ad3343c45672952418b49c5b2771d511719a4ed3863d525be8067da9edde95db0f12b25bacb71d0ed114d62dc975be7fde8e724292da6d0598783ac4be9fac4f9083fa75ba4007192de392cc8921fe4f7fa2678f070793d719823a9ee78194fb0becbde3f6e5b806c0a45ef9e9b911d36089c939367ee33302c7193dfe3d5dcd39edc89b46a830be6a6d5b10a3c119fb1adc019ecb9b5e8389095718c200424e84f0d5fc101aa5ad967d664120fe4aa86226edec68e192e2cd56b6aa359dc15ca387f84e866dab134a43bbff0d77281581e64b1968079bf2566f060663cd32999657c9bd4a4f521fbb61cf79db6320786eb267b611d22937f96eede5a1be093e36dc8a214237ec36c2a6bfd0eca68b029967fb76087652275755fbaf5f3db85df4fa20a66cd65953088f728badb96efd675654cf15f0eed4c8b2e0f01babf52c348c5aceb46d4bf1dd68e3618d0a50021dd98c9eaadec08dfa988d88e1949764d9baf10fcebed8b6401ab0e1b99c608c6ef7aa67295993060000022800000224000002202f4a9869ea85adf9684fb15ed407669092d5527f4e112d4b39612f3c22d65ca8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008df8ce6e91a1b43a54e687ac447a8cbed81de12eac014a882eed9acd76e8e70c16d8650ac754f10b654eee0e445aa7fbec7628c90f4dcdee6f76125887b04fe1a75c2ee7cbe192977d54ffdc5f2cbf04e6d3a98a9d31a7d8a38685eaef9540b1421ca45f5076a3327ca8390962922fad00176fd1a785b832d8287fdc55c519e91d49e9d638558f89526dda8f6eb3031626c80722ea01b78b5b5b7caf9b513455ac331d058108b1391e5610c51a8146c27eab01237447442a8f144a8437614b1ba7cab475ee3afcccf1e48c2ba63cf0a9856265075e811f098565feeb1f6f432897004c0a43b74b365176528a234f8478f04711e5f53d52eff134c6627195fcfa6e0151e8a1b9ede903f0c6c87d1fb4a829756bc6410d05cb340f3b6ad9d53e59fc0d5ff90da551a47408ef35007b167ccad72e14fb67acdb549348e5275085550bfc110e843abb36994b57a418c24c2cb1e233cef13164e2be6d4cc0515b5ac69a68bdc2896274b2d8b03e9c380ad1391a64702e9e637bfac23313860d67befe25dd24e75b487a0e2cc033eaa35d69d816ec5a16bd401355312c395847c659256f3abe19b08865f05da672f2ffd78669c37479dfd918165350e1858f1429876e000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400126d8eacac7bfe7a379199338500326a3c1699dc71ea390969aa1df2031401051021a9481fb7adadcceedfff3fff7f2c28ed0d14de67320611a1b3854b4a0474c57134904aa0da4e3c2e26e7d040b4a562003dbf22f7f7f5e000d6aad7d9bf4464c0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c8f3d2e417e73387f522bee46650ef7f600428bd1107f4c65184e0e60c155cfe0396bb053702e416f846edaa008ae04de361ae2a32ebbf232f9e03e733283ff0f9c55ed62d91e42d13b825fb06763bd2cc2af022b84d9ab727632daa1b1f1651e2b379fda87224eb259730c668d3a94ae8b0c1c22b35db645a091c4c50be9e80287206efeab575135f4fd4a22fe56547356f88b8fb0cc1c3291c4c376f02593b2b9a9a20e09a5e61f83aac62fc378602ac4b7009868bdaba9ca7da711162aaeed6e678d753fb61a4f84d0d0c65a462bac6b628e6cd8f8c53e65dc61d60e21c9889213daa9fef3e2108e9a7e71ab4c0527730e63c705b8114b3b4b4e0e853ccf1e780d1e41529bb5de4752a20d5ec0e8312075f71704ab64ff76d36da97b084f039b4ef9d0dad09eae04789f883a1d4cc117cec7bc67e375a3469cc15858f390e0c39c71464348bdf9b81031252c76476dfa9780250d7a4986a69303f0677be1850dc96237df629f0dd08f8e49e74ed1fd2cb68bbe36a5a27eb8706aced6d3f3f9cc74a25ad4b3d43b8bb4402184108fed3ae928d9fb55b8bfb72825cbe915b721c12c3234cfaf454beea6968a70e1d63a98a623ec833b17e07e743d9f43e03c0000022800000224000002201321dc39e2818dbd83c78351bcf52afc7ec662ef8902fd94c741b6299d4455ad000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c02cbf802c6574260e7f121cb746d7d9cd72608a5f550a56564ff697d29b9b18d206d779b388beb1d5eae251dc28a7746a849e545682454792e90fdd2c677cde5d2c2a541f943003e43d02c40cd2df438ffe21d240e036698a2d3801d4af94a2b7b8763acf9aadb3c2dbd6845d8d480abd567fce122daa0b38e44d8b81af31dee8dcbaca3bafebd30475a8cd6f5dc5908dc946bbf44592541ef93d3fceff2207f16ca763d90ca28c739da719fff025aa0f913858a3fa11affc50d4b11db32319545e0bdf951923d4f8dac90efebfac47c912b16e23a06c188e9747260cbe540b2807e2becdeae1d82e3a1f410feec6a43f71980755e99fc4d15d8f59fe4c376c71b22ddd3a999399b2a6809b5f60b4a646da3b0639ab0a23f6bb4e325dd45a7f862f0878cf962aee5b538f97771969c78a1a64ad1310f2adcd39329cca5658727f0f14a369e1752af3f334a0ed611f50b76b9945cb2ac7e7d44822ae9f2cac65fc55912b95daf1e90cf107e574baeee74aeb1057a19a570a6f8d593dadf6e6a09d2391343dcc0ec76193afd2706c84bfebc1c91ac979f9343575fb17859ae15b9ef5faf53f7188cbeee29a5a1a59ad5b78e987ffb56d54b5511727a7e2d59f1000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400112c44e085e837073a9c0d504e3fbcad7c4ec62be50ff3dfd4a5c3f8ec8d7ad0e021c27bd18461bc5690ffb466778341c5581c4f397518d675508644be3b3f08f201f2621a7b0b10bf7f8e026497a7b3b8a64bd920a4c065cb5ad84e8bb18ea8ff10000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d0be735fe3bf388bd80fc1dcbf4732daf732e1fd69e59c7c1cfad1d15588aa4430a77ee2e7d47182bb361cf9c3acdb4607010c6988d4c20dc52158c79fef3150a6433e8fc460a7584f6de509c627f39f973a637bb432c8caaf1c099b776bde5b219bac57c53cd63dbd832db4f525add249f717c8faf30476792fdc171fe5c49f6253e7c4f99f88543c963f218b7b0ebf60cf0a53c94ebc049ef03a86278c2a6955cf4301b0809f7ac65510ae07530af7f0b3d0ad6ab2d7a3413ff4d302f95e0484450a13713c44dfb27761187069ae8e7cc4b89b70940639b9e2c9de160dd85f9674d6c5a4bcacf0dc48f1b6f5693a18b8aaa495aff9e9ad9b6cafca41869564e5175b7a3a42a9f96a4eb4855c1eaaf4310a744277ba13962b7123c18e4729d978b1c384cfe2d672526864ef46a4476b1b698d2cb9e847c61cfe272b36cdb1dafcfd36bf88ccdf1f2d330ac5f8b7600dc39c5b3e4364c0139e6aa7ddbace9c4ed8e6be7a93de574e6c983f083cb3010f19badf70387af3e1d464f3e5a9d1b03145ea8ee485ddcb436003f6beede3f51deb884760005288a48ba8a19cc80d38dbc3b165a6a2ee448d30539f09909767b2a6b0fc9adfde6d35ac9b0aab758d46c0000022800000224000002201cc7445be1603180ac20ba82ffd098fcace1eaf7ce33e43713c20d32746b8ba100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189666b365ea5ce22200292a40409b3a82d222453b8ef58c6f975b89c15038569473937c226f54a58b5713c53dcabddd58cacde2fabe77d0b7bc6af6bf99f07353facb9cca3b0e328a7b1f70ce8f77538370b8fae27f7ba5d624f5f15329db31d498fcff4f2f9101790104f3f6ebdc3b57bba6aaccb122157014b9798e7cf265e73e2017772cf6550e2eae7803f7a5a551e36fe5ed0d32210c8dd7258fad78aa10fda019a543d82d41e8721a76bbe492ae51b3f3bb6b8f32cb130cc2f84165af92e58b87d333d3b71465046b43c81f8d5282775edfaac657c37fed9c0eac40c738b56542cead0b9186eb8fa895d04be9c267297af14d5cad490b6315d1cef8bbe7e56bc26626036d6d9cf643951b3599ead302e96feefd25eb7de10370d55d88fd00137d0e096f9565af12bc1deae5e5c573eb4b61492277989492b4e3156e9f155151364d96349a6e732c5944392f4e01490a0122e620d0cdeb9d9973643e5aaa8cb26b526e1df39a5b104a68bbe5d66626948db5e67baaeb089f01e2909ab154433bd2cca101ecf1de44f09453839ea4ca4b43e2d03e780687724482efca34ce184203ac7148f03b0a7a944e7c6c0b10465a290f5ce31e5e3c496a63e83583000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400105baa5fbbaa28a6616594c4e9294256a82ba7a1201c57c4e194e6d746205b4e9021c2d32afc29a660721784d377d29dcd333404eff07ce4a6508ec0dd8118a867502a1e5e77637015fad7f6e9f65f6c135f923af8fe34fa5004e5fe52ee18a9bf00000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf371e54983eadfe281e5f32d6f4065470f106ff4f8f133ba042447ddf50d7d47a550e3184ab606cdf26a23c36f7c459dac8f94316571b4f6dbd00cde5429bb2717f8124a58639aa0b361a61e434d465d79c46e5b032fd543dbf44585420d9558a64e3a7afaa7e0baed30f1ab4e161eac2835f0f1377af37eb23133b4a386f74380120d7143e1eeec6f87fc71dcf4748b0cbf33138557cd8fffd1ea5cf102c0eca356c2ba1872ed6325970f226bdf941fd9c2b113477afd463d9b5c7361667c21a553398e72f00280b6e7135057ec65945cec5f119f1a34e76fc25113e58fc8d3dce5590686b7a014e2976fc2ba645f90c3e6603cb48b1884251912624b4e01c0537d93faef4041766299171fb36cd51f23f56870e9e5684e42686a715b53874445fc2b42b25050a9f0caf18fe6c40e04488e9faf6c2d92bc68db309a33852fdee64b6d8f0a532183cd0e34d640d828f9b070b01fb1e8f1d1751e4c751ffacf73212bb6cb2b73184d02e571d5828cfe96d30b24c6cc68a23c4fca3913c9cb9a74fb3d348665b86603f040fea356e6ce0fb2fda781a172380393ccc963f3f698fe5c6876cafe95988f3703b933ea1897368b2722bc356512f526d97b10fe4d1a0000022800000224000002201ebc04b7e48723c3d17bd40e82580e2374010aa9640587a8f1a08bd282300e9e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000209cdde432b9cb0353024f55ab207872fdcd8ed21de5965a9967fe17f8e3a060dac4d3df27c77ec67f68314f257109450523012d6e97ee4780bcd24b20bd9eda7f3f463cd8ef941187e4df9fff40c4345f6f8bf96ce4e086fc657c0afe477d69e42cb6428d36278c2364f73915eeede730c8b01021e74f7388f99e557c94ef2c35304ed819116c886c3bbb48756130a2dfec20b498a730f7d812240795b823900fb67f105ba0bb6c33b36942ce7cc7683dc356aaea33a283cbad453c570058ac30d067093003fc3f1a8dc059434c379df1180e086588b0b43b32e196133664c61e1d33e1d730d0f0b29d8a2fbbb95ef724444d948a241673bba40de32b4b5422bf4e476c30c288fed32566955301fd1663ca5692329e40e17cda6bad12ff19e63703f5810725509d773ced60d4909187c824c9eeaae545100500e2891d00e0a94d946b00c0a241fb78df220a96451493d0de47c376ae0d6a6492ad20b3ea9ed58eacfa50aa35af3ba603ed436c85d37e332e2470b41f31668125cbdc7327828bddb9d649263c44967b7f7e9dd1dadf5304fa3b7fdd92cb9c80da7811e1d3a2b100cfd5b6eaa4a7b43798606de7db92a2c99b1cf6de2f7b8a6d2502c74639ccde000000040000000000000000000000000000000000000000000000000000000000000000000bec47b0022a15153048648339b450a7520f205365456004c73dae55d17b1802a1a7e0b51829cb8c57baba7f77be61de7ca7279e45c22abac071bded6497e0e198f412f93e021cf8c373ad3395aa4d3007d250023819141609579c450239a8bf44f1a307f91f02a1e05f3a8c9f6ac67fa518816ec8af12b83345190560a83a797db9b347822a00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c000004080000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a75dac84c84b4c2d5a3ba0fe8e24a78fc7dcf1f1b9b6cf6ac8859d5c6c465b974f79f8fb0225f87fe732148cee07ba6f8b83c8a0c4ac6fb791c333d63e875c9f58db29f073f699e725db138eb5564d363a245f4a8531570775796838830998ca11c93c021e3b1f2209f55391e6d46bcaf052f19949cf016ce8a44dc52ea26f4f5f08e8624d4cd28d7f3f4534fe1752ce16a6542a74c48216c8671c046d7ec7ff165377926a1ed0716d9985a6fdb1f886246389108d6090eeff71a488551913e06fd6d7d1ffeb2720dc0f614b55958cd56cde5ab21768cef538844dcb52fd15e21fd84a2cf4d48cb4a2acb50e62f77641adf90ad513ee839a3dcd1d0a4f235e5fa98c021b6d9dfe40d49399e06252e2512ce8312c66909aaf9d3861d3fae1bcd655c3d131c8392ae6dabfae7537cf8ae477d096aecd221b4f8b14d7602390c0d106ce6e40469a2613932c4c52fe993958a2f4cef03f2d8d55a70a6b18cfe40e9b3a25e5ad2971a9550dff96ad0402b4d957845470384ae48567a13e926b5fb28022e027a903b8bf10b173bb7ca9e1212abbe6db6bf99c8b841eb7c20fe6e01afc190e2b22875ed2c0b598e3c156c34daad31409bf300f244e1b7d236f997b488d00000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002fb52d91b6ef8703d376d9cc884533f2132bee94f100654cc5eccb522a51f85acc806e56e9b0903be5fd657e29e9a063858039df86af9d357b0c191bb6ead0e0c0f7948cc0fb81d01f9df4dec01b36eacb0aca1896a7151f3f2e3b3ad980d806ccf36b4114268d6ed8ac439102982df662229cae12eac72983726dd622a00a8b28c74dacbdce71bd87e7e56b4daa2550f5a608f567f0db0772b0bf7d47385334105e1901c46c644129328c1ab323b5575b93f120009c76422c5e51af332f7efea19b4429e40c52e5e96960c7c8ab8059107388303bc3578185f94bfbbad6af387ae0d8ccbe767b8d6ea522cb50596e2268c626dc3b282d134f06ce3d3ceb9aad3434f7422bc77b6d7700653b281fe788e5ca636cd700d691c64514749c521fa0c765d2bdf9b2943e4fd12d80227cf4fd38021e14912b721da34e612abfa3a71dbcd4d5def78548a87408bd6957f6ce20846b67891a9bcc127a95f589bb589f2e66b099642b318a63e11b1ffbb579683a32a047a0edb19c16df770f0ebc51c3fd0030ce77ba9e3d05c1488c2407ddfc6b762a43da56f7491cd53ba96afaf5c4acfba7b920fb4a80e9c58d9d72352ba5a7e15ff425a9706df9da0431fa695b19ae00000228000002240000022011e2499c872a81c5f49e42f315c1b2b1d11aa42ad3de24f174a6394e76cb958a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000665705e5e2a1e2abc4d467470e402eb9659b41a01f64531e72ab07e62a14e5254cdd0aaff06dafb265969a1998d782bc29ea44a11bf512e17cc8e5e6a284a9b3a01e78068370fc4981db2e0da4a129a5e4ae8668ebb6610c3d6faffe47916d3f55fa269a7cf9689aa23b833a55194b756cf6fb509fd48d7bb10d2067357800a626387e836cd182e3a3341d6ae7013231670c586fc5328a6b976efb02d356fc84e57ef6480765705eaed97dffe35d2eebe2e8a3e151081e2c048bed1d9e1a35b303c41b5ccec115a4cbe5ec9562c2bb12c0cedd69395308fa27a6c72690219bcade77f544c5a6c1b90e66384f04345aed69f739609d240a9f85ce24e5dcabb9987ebbd74b08f5e2b632ed0ba5e431562148f8ad13f8d24225bf1ffc34d0c01139f4f77b7bfe70afacc88389835d7c183a9a7c86a843aab5d2c52b75a83cb182cefadfef41bb34feffb71392cd2f1eb75380971a029d9105935b0830c2ac774ae4b364c7b54507a35fec3ca8dcf55b38d54341ba74c290c104e3d56fdbf1e2d15b42062e14412a8486d40dca4ccaa41d159fb347f5e669302eef4b40cfa1ec9292a28031dc8c7f90232ca041717489480afdb967d6dbd31acedbbb42fba5ace76000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400111a7217073f4a04bfd4309120ecb0031f7c274ec4f111f8eba0655c6d261d7cc021fbc3c4f147e527433fc99dc720606ce37948e66faf154d8f8d9d5b69f0f520329c579d3306e95369cd46b0c3f0a90db053c7857ada36bbba8d647133d0d097b00000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095e04f774db01bfa20f210468869fbc87da2e9b485243de2b54323d922def9c84824bf5e433aa7f11aadf2bdc93b20559bdee98835f471ae21ea13f51d5e00e98ad9b45f2bde1e27171bef20ea539f1ccd940c28acbb466ac2e494d75327bdc787969bc00881ace8b24811fd5aa4edb7189b8ac3b645646fc3115da7295401b8b484d967b6fefdb51a4d6e20fe805cdc8820b6bc6664cd322c686ab50607d2efc3566a3cb1cb12f7e4d5278f94b6e776fe17d9765cecebdac5e59f63562452ff2d6d68ee1b2568eb0547ba881b516eb50314efd6d2db7ab3f9a8a86fc934652d56aa89c47deb155927c684653b8d265acc99d8ce89b6a370481908df9b649f2886cee18a23cd8f07eee1689ff567d03c0ed2421e2cf03939cf6e9f2c1e1434a5ab07659cc8499af0b0fd989065a5350992d00b6a8ec7b3ff22a352899f2090f77a782065c7de643bd2cfe585401fc039703da5844dceffe8a211092fb72e2cc1ec66a753d19ef81ef318ddf11c9f8972fcb69a34992abfb7684121ed3060a5cd74e21481653de6a07bb1882c0226be459a6dffcf48845d62d10afc71f09a04dd88d182d6a48b56343ac889e41911e69c9813fe7abedd91c675fe82d064120308000002280000022400000220090216d72b024662498f98d4cfbc7f4d6f8385726b3711047a0c76d0ec3620f6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f04738779a4182b6bfe9ade25df23203d044ab9f2bdbbd2a3e7fa9f18cf8177b5b3ee2a7a0b8c308c5d08051f55436922e54cdc0d97ef9aeb9726c122ac53211ed639f508618f2836bf6d071f18d80863fabcbf6fc92ecc1b653b9ceb31470365b44f562d82bc87680af821436e95e0200d3d2219eee9411f8ec810fc5f4dfeea9b050032bd14b26431e7268f8143eb0f632233c40508c51bf621349fb1ead35c533cc5c1e1916489deeb868c7097852ddf64e6f89d440275178fe3fa0b7e11871f36fb59ae943d7849872924b1af567ada4640e90028d2782052d2bff878eaa64fc424010c8395273fadb1e73a660eb817a2dff007799f0962954901dedb3a0384248ff5de79fb2fde4a5846d746bc8bf9b523931ea663a874813a62fcb67f3931bad2bf3a1d74c8ba94d5603adb59253533de59f6d60d0159f4a03ab65d29a0b652759ed3668269ee9221bc034a51d20e9886e6be016d7067fdf038444f4a332cc455a38aa3a7efb0e01cef9ef62705c3920122a79e8e7827ca0cb1b7d8139096c3971eee66770a2ac2ad8612c99d54022d920e5b3ee48963bc8f18efe8b40d4585e30757da787144ef5530af3b8d0b5845da37859b54571be29ae89b497f000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40010fdad6e27cb50eba8ac507fe343b2da29fa8c32dc32d9fc0199e52b1ce5fb32002204fd85615c3e74f94ae8984ed5cdd04c24f8512836ab8f29155d4006587d5032fe8069a4241b844d9a702702985af5b31a7af5d20dd16201739f213193b533d000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5d64eb4c5223a41bb4dadcd17b45b0464e628ef749324012e59c9cb6213c17514af60cf31b40a811f48d1ef1e7d3508d048a8a268c34bb49e6aec8e6af6261f78abd124ecc5c55649b11609a844aef330ba5d646a94aff4875f10c9a256d1246c9efadca8a677f25ddd979a68976a41ccd6e14aee7eabb1cd6617e7dbcaecb19736932f8dbc82767c300b8833f218babf053960145c4ca349e80aa92fab49dee8e759a612dd61c722184ac839d72662f4a5240d1cfed8d8ec4824ed3252cd1b858b2f4a232e6a471946ed84b3ee4b70253fe7087d2a27f8edfe63ef54ee1bb7a00b282c04b79a99c8a88e4802ae0b4882e35db31276b700aaac4161bcf997722d13ae635c90b3a09610d412dc8d3179fe57ce979485a8676eddc7c8d7dea5195caa7c6dab95970fbd2897769eae0ab9791dca3bfec887fb37d9c02c5ab7d9adfac9ce9a9f77cbc1af665d15aa20ed0c0b80ccf88dce5cb985f8272ab001cd0f2619a613ec124d54aad6067ab7a5855e1691770e611fcb15dfcb71ba16d659a7cbe299023c242f38f0c9926094dbbacc37a14a6a45543fd4f8116b5e6c295c17adffef3654d1f02e16d06c5a7f648e3bf8d1d2e5b08b82f0743aca5c953a18ba0000022800000224000002201676c6302a0f11d16dc2ffd20ca3ff61525e3466045de9f182f2a972889f090200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad4d284a5c7552e5f4a21aa3ae8b40902d187f3bf0137962df7535965bcfc637fddc3a817f3a62c741a5566006f8c6c3306a7c09cd6723f13866429ff7ec378107268239dffcea8d4bafe0186a9ea893b341e5e2ad33c9ecf2c623e54dde71de433b6759c1f0c54ad285dc96ae4ac35bcf7ad4db94cb091d66b750b3f1ee8da9e27a584bcb9f3d9db6c006289589e5b7386a2f98683efad5bb5b72be400586372ae77994db1e8a337778ab00b9e864d11abc2b5192fef05c58f5b7e15a043b28228785aa25a2ea20a45304745cf605af10495bc8aa1421c2833fec930425322bf09cb0253d490abba80545441fb79c309e989448d66bc8e8a9eb8c2079454bc3b7b33579ae8f1ea5467cff9daeddedbe91f65f19cb262977564c44ff622f24c629e2c2a010d69dc79b975cc9a566124641043d19898ca7ac1c38bf99242be52600db06ad7eb1a6eb3f4275b2f06166688d73f12d9bb226957b18ba7a74671328de2ca04834cb1ae27c58deda780df0aef64c086b3bb476a66e99380ba5b7a2671ea66acb73cac4c81fd04f57ec99da218dcab8a7c25c8ad01a85597b68c0e2543550d116b39594619d855c8ca5a3fdbbfd0806787416a0b029c62a1779651e6d000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011f29f172e16fae817fe8a96e6fbaf04a1eeced6c237d60d71d2b25f00070e9f7022260afa4ac737623173f9546742e45947797b9eb595763cb0fc41f8f3b7a26ba0dc628756ccac320f751631c827c40c7d079ca1fd1675ca5d10f4f7b7e489c620000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce95de9695135389acfa525ef7fd439c609f30b56914d140574b2f1f3b01117673722b71ffc5f4a8e12d400cfed43f1f1f90545b39dfbe3fd4510e11b12a6f0be217b6dcc75b69b324c94529976048c4e348e57c6a0af21fafe6158c2f9257186570bb4f22183291abc638355bfcde678f228905dc3f3f6b8cba1e6bc68435cd056de51828f59cc5147d483c498952da9ed14a9e6aba11bc46e3535ee365bb562dc89890b526ce9f0a5bc29f51e84e6dd52e2c08d59348b823221a47308dd562911061438f469fc9bb6c47a0a833b2137757357d9ad3edbd0651c0cc80f8426f89ab5a0e7244e0c529bcacedcac586ddbdaf007d3f54c14bfb223da13aca3168606226adfb3169a1db7763b4539f9497817e3c9690904825a38ca6b39f1ed4e06a38c948b7b48a4546926a88da628b1da754cebfec6a715d51d9b9e25420dd589f9a7d44694e42f0953d777ad603478588ae09b487f0dfcbf72f8316e13cd923b361e9da2723e685184503db60705562a18375ec193cfb706f6b784950d75441a933973780171a962fb017a715bd8630baa7c9bca5fc2ce8e9f348322686094747960c66c894e6382d899387c8b651027bf76f525781a9002e578bf41378dce000002280000022400000220241e20a91eba0507735570cf65dc37789b12649f277f41d69ec08e7b175e0e51000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008853b6a5d5082ba211690ce7b5f2cacc82e7339bd7c3ec05a5d953482106da9b102db64c2edc102f479c63e1f6c0be7c35e3f208eee4a6704b5ac0606518429033e002b693622ee8962dd792e0e2ebf671a8fb3255fa5a182ac019e1f8e37c21af1041df679984e1dea262bb5e9dd4c867a2eb01f5cd06992d5a7889719ce898e6e5c6dae232cc6ff89080ac17a76bb8974e5f87f7dc139a82ab86fa79e68de8c229f695beff7c2c1230bd91cc86f3cae2ae205890a961e8976bf8e3a5327cc2c972b490e8d62448398699287cf9ea837875bac1a89e441ae890172d4fd3077e0d806b223629f154f943d9e5a19a9203d9a0215b62427885627e11c6f05315c1bf07fc8d03dff4d5a5cfeb7b081a7ea551da9c0655c94f5ddde5c615073b1c8905f04eb641a3e6227345c9d58a1ba87492211712bc55e7d14e85a9a50759b494701e809d3024020ba94d7ba75db724bb64f7b7b4208624f41158c74f04933c2720f6b8641a6e9bd12c5ecd377eb3aecd82108c4800d4aa604d85411648e9ee243ee0508c4b88d53af5d35291893574d2619276a02cfc95259091f78a0ae8d2c4084ac7f96fb7649b655099ea36b7d6cc5226b1ab0cd3a1f1177e4ec04f4f27bd000000040000000000000000000000000000000000000000000000000000000000000000000bec47b002263be9296c3629d92f6edf213ddefab7cbf592763a450dc64a4c88532985cbae2bde18cc536c5f7f9680b24761f12a82629364eca12e50001a393b5e21b0848e02232dcf79753750a51406b604d06f2043170728428443c233c9aed5b69c5ca385123a73b7670d4e5192a355f735f4a2c03ebd8c48caa469fbf7c336a563a8d5bf00000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000040c0000040800000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002559e2e6e4f73a738a6a68281a66a1d61d92fea98654b57a7ed009c47fc71d00cdb57f2f8d03579607aa8a118b51011c9d92265ad5dbc47079ebd6adb5c037083082338c021b885366cb704c04f89f4f430f15b31e50f54fe892a44bc938e51a11245e69e637abe7106e23c8c9e2ecbde97f53ed9d106426494133613f737a5b6719af41858e21de97715a1c9bca0e786f7e71117ccaedd88d217f330c21a8044c6edfae192fb60f82da2524f50f58c6c4e92d6e943b767cb222329e66394a6bc6533f54607125c0b6492f599ec8c8c9624624f5eeb76ea1007ff3be1811caa065404dd6893bac5b2741daf798cfb2bccb0e4f7d7022591edc12f446b66bb52f751496f750933bf14913a2b5c3c474f3ca71ba1adf5319f7f733b6e61a5bc9fa96cfc6c4bf6e7f3766f7cf5220356a17d3cab010aeb57d7166a4009e1a5bb2b8594e5d150a628547f37ca3158107c97eb141c5aaef0f7fdfcbdb2543dd59845c30e5f89ef2388671e9fed2443bbf34738e3585b8df06ec4af69f130650fa8c11ef7c1acb71f2190c347586b840bf6d48165de6c84e7572151143fae15313a63ead8c6fe3d90bd7ca4df61de761689f9fd31c93691f8c8b775ea3fb2f6b2044ce0000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8ced7896308da7ad97c4051d76366a40b5c28c5a551d223cf483125b91ab583675a40dc753ea72bad5003fed61fa45de2a78953b45bd431b09fea3e3af10af58ed4ab081eb6ee274e0b28f315c9c66bfde0230ffa94881b627c5c539f23042ecd630090c970aa1bd1cfd7890cce6240e326cd824be2a7d659ee5094195b3d07ac925f09e81f747d3e792347972276cca9e2fc1c2dfac9a8b6a6e409fc67d42de5e46acdda3004f494c4390c7542ffe84ae0aad7aaf9fcde8832fddd3c189139759ff0ff922ff8ad27d5f19f0d622e6f04e13ddd45f2674f56a7870f549732dd41c8a46d3060cb54f32d2540e706bcf4617a50326ff151c605aa215ba89df42259266110e7e11e5a45fed2549514fb46274638b9246c561fba04423e0b6f7900848d9234dcef28c258ef3c5e027d05863386e50b0d6b067223044ea9d15539aaaab67ba4e4f3b329899323000249deb90bbdad3d30ce9cc463cec7a0e1885ef7ed024c64e0ec01d09896ba28bf00922fc8da460556fd0bf1ddff1857191c8302cb9223b1d6fec942f83a31b9de0279e46acccbb7e79730538069087fd14254f2b1d10864a3cdf9df820c5f0237c2e23977f45b74b18da5ed11d251b0c518ccd0000002280000022400000220113043735dfb6f641b8f0e75e7dfedfb82863a2d30d23d048c920011844b0171000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c90fbd1b245a81dbc7ca987aa8772cad8a7872cd0dfe227e5d37b2225f453b6ca3ca576ac9f9fcea32cfbe0e695273cc19d556cca250fc15c4139b7d56d056df0b49793ae6e26447a032ddef68a59eb51e7cd700b4cdaa67e06b16dfe507b052e87bf9ee67805c62373f95ec8517f2ec97efc2a5215b7880f4c128dd2f34eb96006995b04413d7c07883dfc6bc0d73a356598dcfec34c630b41cd80f48bbeebf288cf2710b361a7201b2355b6ec59c12b6de9aa8db9968f91075223eee7057a54320b5fd6ba9195deae4fa9a0c9a0fee38c79f1fad1d5500ab7a6adef6c90569d932a4cf15598502efae2d07db648a07d4244300c4ede43e540a207c77278b09272b3aefa4247a09ee2ab18557b92ea8c1586529a1feecbb864c81405a31966355bbb097ec42993c1d962b58162e7cb178f6b5535ae7bcee43dd9d9fe82ecc76993905b9bae36ea0fdad6c08fc2db9cd276adb41833f27a30136b005b2dd349e37f2557c8e1c474ed5f775c0c60ed9dea50062b801d0642f3b1f2bcfa1bc7b4195a9fdea975927d33e6cd5f75a61c06b9b92309b988b94ea269d372551c1977c269d2e519e0ce9bf2446803e1a5b944ca0c52c7a22f11aa2df49a30c3f8ac59000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011a2a03fbacd87f3d7579de6e8849fdf4b1f755a7a894d1fac5388e575a8b4ff102256b43678522059155b9d02376adf28fc103845dde74bd2c3c63dcb44f16624f1c03c4574ae688aa97e58d5e2ca8e5c7a80262d3ca67abb25823b3a843c32abf0000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bff2695994c77624c632749257b13ad0f23af21c9962c625295995710f54ea9efc1a87d2c58a91f2217436e366cbae51f00e5b3b2f7638ae478205cf41539a5220c47fcddda6f65adf7d9764a0e4ab52179bcea9b28a5819783cb7ea57992366b4ead9581c91cebfd5dba95688013261f89b12d3ff13633f72309170e5a6595a9bbd4d90501951f8a11c522b673d3820af327715013a7b2b8eb0a067ae7c8034207937d8ac74fc08668bcc5cee0e24a937bc2e889d1ac180f491fe9333a00a5a90324c85b2af89ff617501b9c39fc0262cf49ec79535e9bed778dabfbb8005110315cb194048dcb8be69e6df64b3f6b2d529161ed13a42419721a6bd0c9f3107cf565a69231d6015c67af7c7ef1aa2305938db26faac02720bfe27c9f1c106d7a8cc275f93cf37e5b7056393810572e098c25ccd0d3e5c1513762bc4dd4e29ec947c8632e0aeb708a86bdfba2c16406aba5fbca97b605392ec4c2cbea819bf68c20d586ff9a4a331631421f5cdceb39d0875f9f9452319f23e71d2e052f6985fad8d49f7e71be71beca720350d2f64e1254b3cd6b09874c1313dfa94940181db049ef472b4648cac844090dcdca5fd39c146c3b80ae6206bc843af5609ec13300000228000002240000022023272de9bb5f31510ae4216e17fdb884ea37c0d6c01cfff226e626969cae415800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083629dafbc1a59036b15b0b350e00e20ce60e0a7ac10b69955ed7645c6c472a22eee7c7a1c2ae0a7702f8dc68339f300eaeec7ca3ec06b895a38766c3d8b70f847ba98d14e98356976fbf77ae55807e9822885651f70793d8b5ee896cc5f0220389442557ba64822bb76586455e68d9f4cb37e95950038ad5763ae6465daedff62f4b2a037f1733e170480d7ca1a1349eb15299eed6ba61f241fb59b5758ce8672ead88bb12e520ef786ec4a534ee5afddabbb39de12aa8c8524ecd4020cc9323b99f8593802cdfee26e55fe22ad860a337e11ecb94737bcd77cdcf26499cee4aa0e24e0660581ffe7281b6428569554b6c5dcf26620ff83cc3d93d91eae52350b72748a509b90023a6325cfab4286103ebf491b5fa795fb4f21a7be1deb619f9e0466678296b9c344a4584dde648d5567311bc1032734fc33a87fb49c26343f9f196d33f7c205ebb3ea4a7db889ea927fec303c4d3cc4b25a3423ed0b4a77fd46e4eb85e022183f17c3a70d156723708b1bea30ed46c6c2d9f652fb1aac2831348ff4120c0265645e5a6ec2e23da544fa65c08007d29a3fd8567a21cfab49e6e8c87d1941c71ef159d02951b98ad9170e684e3772807746884f3458e089335000000040000000000000000000000000000000000000000000000000000000000000000000bec1d4001205087021d67ce4e4ffdac77cafc597be338daaaa668f11c96cb2f6f3682d7c102263322cf35ea41c8a94ea73bc96e029ca7147d5205ba3b9749ee90ca83bc5ae024b2b2de986f32574192c152200c47bd83a77a44165fdf37cac20988b1b8dc59000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000209d148d469a83e47a79676c7d512fc45df2a736089ad09cb4c6623bf36f95f112a775fdbc3db9ac69d86aeb2fc1bff3bc37dbd5888fb529efc60394d1991205e8819f3c29c51b969427756cdd3a3bfa03fd73f7be10fc7050d2c7c81d8bc7af25367ac291b2fa9aceab5f229a8657ddaed4db299975336922c437f133a7075a13e86d48a9283e8aa9ffe5e09b318bfcc93d4e2f90f7ecfbc4d2ddc7ef6bae0789e3b6b755424c1a1db5491cb8fa66836f2faa5691e1f0327872ded84e98573737c7e44d7a4e729bec19abed2b02cd86938698bda068177189716d136d0f25bbd3d0db86490ac70936b8439f05e857f51c99ded31f9c5fbc3c083e37e7c0627c5b9e91f3b385c6b69e6ce87d2b912bd44d5b8518fd2502d8fec5a432100bfa1dcfd568ef060e1eb6de4bdef85e5e8f4d7fea464d97889ca600275728a8ffbaac87b9e5c5a4dea73857ae8f2c16d4d7349ec8648831386a934f2fc53d2d6262d29da0f456b30eb3757780f4fae4c90ac991260f49778832bf6cb7626d08d40fddc916f78b24831fbe20da2a4b2e5dcf426d9c4fd0886391d74715dcb3faed45c4c8d7c788679c492600609178705dc45f198c834148d94e007aaed5e2d20d17e500000228000002240000022018c47d0b6705b747b6b5e345fafdae8ebc751b02fb58ce206f63aa9daa8e07e70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a227a5dd308f6a551d3b0f5020e7f7dcd13b78bb9415ca1edecec5915ef2f73a214d8255f4d403b61c300d04a9136752254b6e255512eaeb8b930b64dd9be65ff1c1593e6b84fac377f2eae8ddbc8c3784a6143eddb1ed0d8cf5cfdfbef7702e1c8de8dd9bcaf560bcaeddce9c7a69f9bc9e2309c8bf949c4b7ba3885b254178b873e7ce7102a401a9c6b0d82ef7e2664c26f7fff46f1acaa1dd7b25450eea8156f3ac054a6a576e7292535a7c9541a93f6e05555a203af239544cb53ce5d08c9c16f9aa54790123c90fae2ceb2765697db2fdf365d6e5cece6044865f54bcb3725d161a0c1c427244867ce4de53c898d45850dff601c79221ddf3c4d421485f7cbfcae153f64bd6436deea25c00ccbfa39bc1d3f2ea3938741e84397210f869c49e983f29d814d7b1c3e11caf7673347b85dde0383f98c5b195074e29fed2e2c10bded47e7400b5f78bdc14003b6c30b20b58b0ec04c9c5d8b719cbf3b0919e2af76b1df534f7b602d3c8d00f3552f7641700a81a9c6a8adcf818c9c6e4a8ac4473afe9a8796ebf491ff3864b631ad5649999a2af95f83cce6ba8828cde534c3decaa53ad6b293a9f7448ded2d752d5dd45360e5993e05993feb1e0ce1d01000000040000000000000000000000000000000000000000000000000000000000000000000bec1d400114054177a7d682e8ae4fd0cdf2f6e41ba61e1028ccfbe18fca6f2554020948d2022e934f33fb579fb93ac78e9e0cdde3904047ebfef39faecc3fe29fc317e7e48c0273834d5e71798b41e5c7c2972e14ec8827a28e03879f3762c5922e3d3e127000000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000020800000204000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021e49e981e814485f7066c42896adf7ef84f3b1d01e5f099066cd08023347ea71c9948dd3e93d50fd95eb22434cc49cd3bfa833cdc5ee4e2688018c970d9af36521abeb418665eb7ab9372db70aa95773bbaea0c99c0b5f4f2cf75760ca4afde482f37cc89b9643a0d39ff3096bae8195a1ac14c4dce0118f831dffa888790ae70c0948ca0ede1949220f5d87bb809cc58736a13cf3cf96a5fb895220d55af2f0c40868b57e821205abc7e9849d37145463054efcee44fdab52b2d736a55b66ebd151ddd052f8af007a131bfb0e4b4c2a62a3d983d7b04c49453aeeb4ba782b597dad2ac489169ea011b67de24b6cab3dd34f179bfb24c9fc6d8097a76be007034593620d5902d634667ad85baf7293fb25528f507ec14ef47a0a50a5bc6430d67e9f6878888d9a193c49f66a0fc76fe51fa65168174241fdb8b3c228afa1a66e4f2bd4916829fe7583a6335f0da8b2626a032d3d610228c5497e47655fc22a41e47127ab3bfbe690354f801dad55bdda13507fb254903591af61bd512e09701f0eeeec8867a82104dd61d5c4052ffc6356a114b73b08f4cb8ef8e7eb48b1c13df6df2a40a497b1c6b873c29f12266dce396f8f0b4044adc5c4853946a6936fb00000228000002240000022005dd9a28612c04c20b915b25e0fcb2061a26089da429cf6a9f00705c4ebdb8c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000269b3dfeca654b4585d4b53064bb5113ead20142e7ea25494d217c17dfbbc467627bc092280f885a0dda5432188ca72b7dc47c46d30f0a4cf941c20bec327975189c8c037bd3c1da4923afb208c6e9d1223f99169c164c0c3e2af15c30743aac0cf303d79ca7d58a1f4436f2e5309f69e263981e2ef8ef5f7b9881f552179a552f242fc2e6b5856dd2b9705f37ed6ec1e96126cbb3f7509162478da822fdfb3a0319ab8de7124f2d23e952d5ea2be3db7674598b1dfccbc05a35f6dc48056d36a303689401adce9b3ff2d9d70f26b3ff79af9e319525d0dde05653f128a5ae0adc8ba64c740310b29c3770ec3e7a8a64d7b82af90c5abac0de682744619cce47e2163fc888b61060ecf4bff46e4dc916f375708fb5731c938169493845da41d30109144db35f48669aa8a7199dea5d07e80709c06976a9005272ac074f85e64953728f0253e4a33c0306300291e450820c220798ba6d90f2e25badb5ad25089d49038fdef72ab74b8db1ecfe6955944e1a024981ddb802fcd69e731fbeb8a85899b353da4f06ca70ca22242d99ed31f30cd3b4f9e8099e4d1e54fe0f6c703120345fd741f463fda8c0a217ab0905c56737183667d9084ac1fd10b6d82fd100b7000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011309df8c2c151bd401e87a7979588174c94996cd74b48de57de883ae8d15be91022eb75296433b28fec874a4c6ab9d937e996602509966c0177cf4471e41637a05193f9991d6859c01f3c1efd54061c0be30a69a63606de54d8c089e2a1e1c0cc70000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002080000020400000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d193f44865248412b0ab4a2382eac95c4df85ecac8b7962ca9aabebae6606cd2a716f385f711f06da1e93a80905ec6285e4d7c9de85513969d28560d007cb520a1a305de00a46121268895c6dc8b1483b3eda45a78e54b5e66b7620779acf6ced619c6d9183efcdc56f2a31a2ce02ff342423ac9f6ace128346695e27288876dfa10022161d20b6dbc3e56c006baa46f03cc5fbcc701ac1f13ccf94b45c8ed4e735c377c248dd2db1f44dd934ea35eb417bd7470c0c91e86aa0f99dc60ef51923525eee76c0a8d5121bce5275181a7d5f50e2ef8622846c67e8464e5c3dd62f8814dadd72c43a450e3cbfbcd4186a5b9f83860c013f82b12e4453e943dcd421f7eac2b1b5940c74215402926b46d5e3aae86ce8214305c5b5b407f63388384ac714cd76f154f8ebee93b79dd38e67884b1fa3c7608459625abd5e9cc5f0e60c8f180948c5648e2307f9c9533156bbfb6c718f260e7a9b309dd9473ff73a24521b904669395179de30d37df7a2264bc01242cc196a7d6f7b2c24a9f6fca382f8fdf9df61ef758418233b9d4e321cf1ac87175c431f496eedbc210b67bc06232f6d875cb874bc331075623acf8460a5ac07f4b3eda919e6e84e7e1ab608fec6e5000002280000022400000220108868e847800d381c55c18caae2157855b44c2da295bf114ff5e845ca76a72400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad3dc6177861c966cd36da24f1824ff49e102ec532c33912de1998584447bc91098783c82a92f230d051bbd8843499cd4e1175ce0ad3ed407bb1fcc45bb069eafd44b19eceb75bfdc0413a7b7acf26c034f5a0704f7b3893c61f96e6b3da84247a5714f9165592bb5564f0fd18e442b7d3386299224cb693af9d3c3880d9108e1b0a47ce9e325b5aeeb85aaf7f27a273b89daf83fa419fe4cdac039df1ea981ef5e8f1c52dabf4e0f60a119dea4899680f35106dde65cfc7dd531f9f6e16bc32b4e5a3a8f052b35fe417e1fe515cb23bfcccb1661a161283824224552c90cc5fee53c0b90aa369a2c2981058277c47feb73bbe95e20faa4c9130cabfd9cfebe8f8eda205e1bbe5573b749727d7e297ebb91f981252fa33c8b9877458b57d672f9feeea34482d2b8f9973baefb7fbef9dad7d432e068f19fdfda19ea012c123341443c5f69764530d3a2d073be49101f9e5ce812f5b871cb4f560687cb0d651e923f7e19f04296d7b4462e24768c28960dd3159961e933bc37c4f9837a9cd71069402cde14ff4a72479e3554d563938d0bd6813ee77158d7871a913c7c416cad2a15cea3bdce98d99e060cacb1331b5aac10eadf4c87dafd8dacf243992d13c0a000000040000000000000000000000000000000000000000000000000000000000000000000bec1d40011ab0e99bc5da8c5ddfd8cae0420c5363caef2b59d7ab741b9a9301828abcd25a022f8282360603a792b6769d240455adc4fadf1b86e1c19316faa2fa4a87608aa900019dbe6c170072f191a52dcc1d14820dc2148622f566a8b7a97bf997d15077000000000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000208000002040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066ca7dc96ef53fdb4aedaa16dc8bf0fd9f9d4133856593b54f27de4abdf0a77b88ee494a3ddc0e476f52cd8748e1e4f11f0b42ca9135517bb16174f086838247aaafccd6c0f551d4388506697e46e5622417f70183fa2df900fd32af1dfaf222162240805651e6ca8dc180b9959e90e32619f5b9564097195a4f3003ea81ddf9b68b96456cded8d6e4ff068e4663bf6e5a29a0542e8c605babb217a8aa3fd7c313e865a17318a65179f5ea36a0c6b93bcfce562b9a3d17d20f00bc7a0515911067658dd6546b6e170c53a12a2b4a60a3c61811f7581b6e6b83fc79db8c9ce6d3f8b529df6ab0656a4a3d27ef2e818d1a24383cc71012fbe3ed3d58f236f185f720044bb97b4e0d19cdc8f6437329d09ec7bbd8df41ee559a71be3516b93260807d10b7ab22b6d36bebd0734c4c4879acc4849099846c30b12536fcb06249eca6d81725254612b125ecc88d8c54675d779bcaceff7c27adc5b8deccafb464eabc6cb2c463888541239b615b5ac4cdde2f434ea47ce2385c6bd5b3294333854304fba750b823c8eaeecf3736757f3b9d391177088d003eaff3a5d6cf585e99ec303b320c5d4b73ac4da8d35b48be3459965c87f86e8d9a9ac0689d7c115a3cf440000022800000224000002201006e0422849e6a8b7772679617a6ca30fb7dc2fdc73addbef98bcc861f3976b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6439b5eaeff63fe0487dfd9e3f4a28abe2b7cc0aa483a84e1fcaefda2400878c53018e91a5ae98d911cbfc5c184b22edaa4d1ec30290640a9f66c166196c3862c9680b63b8b7c7ea97a8723deba87525edb99e797f053e2906d0aa0c61186f1454f222149e78cc4cc56738143f57cb3d2e69572084ca7e9fbbddfff6298afaf2b2ca64d9ca60fe14479c685dbf3406bbf778fa64ef0c04a9fb7b9d80fb4e495ba0a87de36d1953c1cdc427a67bc4ca4c1aff6c34db970c064c0d1ca1af71120943f052d3996a5d561f8abeef4616627b25f7c56ae8c4f552fc112d6291e79e9480df137c5828c4b7ad70267c83395019c2e7872a0387662afaa4a54065c88cddf77ed691860805613e504c526ecb1b21170f51ee5ce58ba1d2f650db971690370353da7740547c4f972f90563bf316ef845b03f19864feedef4c0dc989d59cc4401507d07128a6bc2b8d191bf5a3c80c7ffb489a69651acc55cc85d5988f3986b1c029ba8bbeddd6d91dfd793b78e44f8936049ead6b0c479817afee0120dd7d2b161b397da70c6682ccef556fce6058e6c4024a319410192453e18dc372c1e755f2e13a56d8c9430908ecb06c88b1f3f7939579cbf9256570806cfcd5178160000000400000000" + "1200a06aae1368abe36530b585bd7a4d2ba4de5037b82076412691a187d7621e00000001000000000000000000000000000000000000000000000000000000000000000200cd244f7167ec7dea00011289134d968026af79401cbea1b2aa857c38e6be9200089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000100b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d000000801dad281d71440481e78506254930213d3310b0c99bcc2cc863fdbf797417df9e0000010023c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9000001000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000070dbd8d40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000caf43802d268006aae8391068d8ab0093b394a03fce1f3ac791737fe3907f6ac346ef61000000020000000100000000000000000000000000000000000000000000000000000000000caf4380000301d0126a704df567f3f5c112cd6af0f5e7967f857c2ca01d0b1aa2b9e90d601702dcd702e6bbe83301168e2eb896f23b1053d870dd40bdfa2ecd1620c810bb3a128c5774d81fced84feddedab2b25d126daf455a23abd53bc8c5073d71cc17c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c5f0000000040000000000000004000000000009c5f40009c5f00009c4c41b6d5873cef5a35f681ab9468527f356c96e09b3c64603aef404ec2ad80aa3a90009c4a0000000006999d1e02b08a447a463563453cb36919c9dd7150336fc7c4d2b52f81fcb4a6209326e87efb8be151e476b5b530e06df46f1e42679b6b297725c63b800000000000000000000000000000000000000000000000000000000000000012e0d3897e1df88325969bdd80300e23dbe44b15957a2e419074c82145db4ecea2b1dbac95c5cb0c215eecc1473c8968afb60747ba988065a3b6edc01094f561e000000000000000000000000000000000000000000000000000000000000149300000000062716b16600000a4a24000401022500040848000024000404072400000400081f000000000800000007000008431d0001084408442b00084300032b0000084400042b00084500052b0008460006220000000d2b00000308473a0000000008470000000124000400082a000009240004030a000004000a0024010401000900000409020a2a000a0b240007010c2a020c0b0000040b020b2a02050b0000000409020b240004020d4204000000080000000a0000000b0000000d2400070000090a00070a090c240001000d0a00010c0d0b21000021000b3b0100002a0000000c0000040002002a00000b240004020e000004000e00240104010b000004000b020e2a000e0f2a02090f2a020b0c2a00080720002d0a000407080b240004000104210001c6000b2000312a010c0b0000040b020a0000040a08072a01070c001c00010c0a1c00070a0b1c00010b0c0a00010c0d0b2100003b000b3b010000001e0002000c1e0005000b1e0006000a2a0000070000040002002a000003000000040002002a00000e0000040002002a00000f0000040002002a00001024000400041100000400110024010401100000041002112a0011122400072e132a021300120000041202122a0209120000041202122a0209122a0210072a00001024000004051300000400130024010401100000041002132a0013112a020911000004001102112a0209110000041102112a020911000004110211280007000000000000000005000000000000000000122a0212112a0210032a02040e2a020d0f200000652a00081020006724000404110c000410111224000403132100014300122000006c2a010f100a0001100d0c21000070000c3b0100002a0008122000720c0000041213102100011a00102000752a01030e2a00000c240004050b000004000b0000240104010c0000040e020b240004040a0000040c02073f030000000b00000000072a010c0e0000040e020e2a020e0c2a010c0e0200040e020e2a020e0c2a00020c0324000101032a02030f0000040c020e0000040e08112a01110f2a010c000e0200040e020e2a020e0c240007020c2a00000e240004031100000400110000240104010e0000040e02112a0011072a020c070000040702072a020507000000040e0207240004020a42040000000800000011000000070000000a0a00071100090e0a00010e0d0a2100009e000a3b0100002a00000e240004030a00000400000a00240104010e0000040e020a2a000a072a0211070000040702072a020f07000000040e0207240004020b4204000000080000000a000000070000000b0a0000070a090e0a00010e0d11210000ae00113b0100002a00000e0000040002002a00000011240004020b000004000b00240104011100000411020b2a000b072a020009072a02110e2a0008102000ba0a000410080b21000104000b2000bd2a010e000a0000040a02070000040708062a01060e1c00010e071c0007070a1c00010a000e210000c6000e3b0100002a00000e2400040303000004000300240104010e000000040e02032a00030a2a020c0a0000040a020a2a02050a0000040e020a240000040207420400000008000000030000000a000000070a00070309050a000100050d0e210000d6000e3b0100002a000005240004030e000004000e0024010400010500000405020e2a000e0c2a02030c0000040c020c2a020f0c0000040502000c24000402074204000000080000000e0000000c000000070a00070e090f0a0000010f0d05210000e600053b0100002a00080b2000e80a00040b080d21000000ed000d2000eb26000747dacd730003231c00070b0d0000070e0d0c2a00000d00240004020a000004000a00240104010d0000040d020a2a000a072a0209072400000401070c00040b0706210000fa00063b0100000000040d0206000004060b00072a01070a2e000000000a0000000c0000040b040a0e00040b0a0c2100010200000c3b0100002a000a0b2000e82a010e0b1c000710070000070a07062d0000000000060000000724000401110c00041011122100010c00123b0100002b0000000b08032500040002080422000001dc2b0008050006000004060212000004120010112a02071100000410040b0e0004100b072100011700073b0100002a0206000e2a000b102000ba2a010e100c000412100c2100011e000c20013d2a010310002a01030c240004040a0c0004120a062100012400063b0100000000040c02060000000406120a2a010a0b2a01070c240004030a0c0004120a142100012c0014003b0100000000040c021400000414120a2a010a060000070b060c2400040406000c00041206142100013400143b0100002b0000100803250004000508042200000001dc2b000805000b0000040b02140000041412062a020c062a020b032001003d0000041204100e000412100c21000141000c3b0100002a0010122000722a00000012240004051400000400140024010401120000041202142a0014152a02000c150000041502152a020b150000041502152a020a150000041502152a0206001524000404150c00041015162100015400163b010000000004120216000004001610152a0115142a010f120a0001120d162100015b00163b0100002a010e12000a000412131621000174001620015f2a0107132a010e122a010e112400040300160c00041116172100016600173b0100002b0000130803250004000408042200000001dc2b00080500150000041502170000041711162a021416000004120400130e00041213112100017100113b0100002a0215072a02130e2001972a000800122001760c00041213152100019d00152001792a0107132a0103122a00001500240004051600000400160024010401150000041202162400040417000004150002183f0300000016000000182a0115110000041102112a0211152a011311020000041102112a0211132a0115110200041102112a0211152b0000130803250000040004080422000001dc2b00080500110000041102120000041208182a021400182a0211072a0215032a02040e2001970000041004110e0004101112210001009b00123b0100002a0011102000672a010e150c0004121516210001a10016200001c02a0103152a01031624000404180c0004121819210001a700193b010000000000041602190000041912182a0118172a01071624000403180c000412181a00210001af001a3b01000000000416021a0000041a12182a0118190000071719001624000404170c000412171a210001b7001a3b0100002b0000150803250004000005080422000001dc2b000805001900000419021a0000041a12172a021617002a0219032001c00000041204150e0004121516210001c400163b0100002a000015122001762a010c0b1c000707030000070a030e2d000000000e0000000324000004010f0c0004070f10210001ce00103b0100002b00000b0803250004000200080422000001dc2b000805000e0000040e021000000410070f2a02030f0000000407040b0e0004070b03210001d900033b0100002a020e0c2a000b0720002d002b01080308060b0004080600020807210001e008072001e22b0008030805200001f02b0000000805010004000008040000250004000008090d00040809080400080a1700080a080a210001ee080a01000408030809080b2b01080b08080100000408050809080b2b020808080b0100040809000208092001e525010400010800052001f0232b0018ca18ca46fb44da0000024524000401022500040847000000240004030624000400071f000000000700000006000008431d000108440844002b00084300032b00084400042b0008450005220000000c2b00000308463a0000000008460000000124000101072100000f00043b0100002a00000724000403000400000400040024010401070000040702042a00040824000701092a020908000000040802082a020508240004000400000407020a240004020b42040000000004000000080000000a0000000b24000700050a000708050724000100090a00000107090b21000023000b3b0100002a0000070000040002002a00000924000400020b000004000b00240104010900000409020b2a000b0a2a02050a2a020907002a00040620002f0a00040604052100003b00052000322a010706000004060200050000040504032a0103071c000107061c000706041c000104072a00070323002a0107051c000706030000070803092d000000000900000003240004010a0c000004060a0b21000043000b3b0100002b0000050803250004000208042200000000522b000805000900000409020b0000040b060a2a02030a2400040105000000040605030e000406030b2100004f000b3b0100002a0209072a00030620002f002b01080308060b00040806000208072100005608072000582b0008030805200000662b0000000805010004000008040000250004000008090d00040809080400080a1700080a080a21000064080a01000408030809080b2b01080b08080100000408050809080b2b020808080b01000408090002080920005b2501040001080005200066232b0018ca18ca61966b7c000001eb24000401022500040848000000240004050824000400091f000000000900000008000008431d000108440844001d0001084708472b00084300032b00084400042b00084500052b0008460006002b0008470007220000000e3a0000000848000000001e000200091e0000000a000a0007090a0b21000013000b3b0100002a00000a240004030900000400090000240104010a0000040a02092a00090b240007020c2a020c0b0000040b020b2a0002050b24000400090000040a020d240004020e4204000000090000000b000000000d0000000e240007000c0a00070b0c05240001000a0a0001050a0e2100000027000e3b0100002a000005240004030e000004000e0024010401050000040500020e2a000e0d2a020b0d0000040d020d2a02060d00000405020d240004020f004204000000090000000e0000000d0000000f0a00070e0c050a0001050a0c2100000037000c3b0100001c0007070a2a00090820003a0a000408090d2100003e00000d20003d231c0007080d0000070e0d0c2a00000d240004020b000004000b0000240104010d0000040d020b2a000b072a020a0724000401070c0004080706002100004b00063b0100000000040d02060000040608072a01070b2e00000000000b0000000c240004010b000004080b0c0e0004080c0d21000054000d3b010000002a000c0820003a2b0018ca18ca8955f5fc0000016b24000401022500040800460000240004030624000400071f000000000700000006000008431d000108004408441d0001084508452b00084300032b00084400042b000845000522000000000c3a0000000846000000001e00020007240007010824000400092a00000a00240004030b000004000b00240104010a0000040a020b2a000b0c2a02080c000000040c020c2a02070c0000040a020c240004020d4204000000090000000b000000000c0000000d24000700070a00070b070824000100070a000108070a2100000021000a3b0100001c000705072a0009062000240a000406090a2100002800000a200027231c0007060a0000070b0a082a00000a240004020500000400050000240104010a0000040a02052a0005042a02070424000401040c0004060403210000003500033b0100000000040a02030000040306042a0104052e0000000005000000000824000401050000040605080e000406080a2100003e000a3b010000002a0008062000242b0018ca18cab839de91000001d024000401022500040847000000240004040724000400081f000000000800000007000008431d000108440008441d0001084608462b00084300032b00084400042b00084500052b000846000006220000000d3a0000000847000000001e00020008240004000924000702000a2a00000b240004030c000004000c00240104010b0000040b020c2a000c0d002a020a0d0000040d020d2a02080d0000040b020d240004020e420400000009000000000c0000000d0000000e24000700080a00070c080a240001000b0a0001000a0b0e21000022000e3b0100002a00000a240004030e000004000e0024010400010a0000040a020e2a000e0d2a020c0d0000040d020d2a02050d0000040a02000d240004020f4204000000090000000e0000000d0000000f0a00070e080a0a0000010a0b082100003200083b0100001c0007060b2a0009072000350a00040700090d21000039000d200038231c0007070d0000070e0d0c2a00000d24000402000a000004000a00240104010d0000040d020a2a000a082a020b082400040108000c00040708062100004600063b0100000000040d02060000040607082a0108000a2e000000000a0000000c240004010a000004070a0c0e0004070c0d210000004f000d3b0100002a000c072000352b0018ca18caf8d45e9b000002aa24000400010225000408480000240004040724000400081f00000000080000000700000008431d0001084408442b00084300032b00084400042b00084500052b000846000006220000000d2b00000308473a0000000847000000012400010108210000001000043b01000024000702042a00000824000403090000040009002401040100080000040802092a00090a2a02040a0000040a020a2a02050a24000400090000000408020b240004020c4204000000090000000a0000000b0000000c2400070000040a00070a040524000100080a000105080c21000024000c3b0100002a00000005240004030c000004000c00240104010500000405020c2a000c0b2a020a000b0000040b020b2a02060b00000405020b240004020d420400000009000000000c0000000b0000000d0a00070c04060a00010608052100003400053b010000002a0000080000040002002a00000624000402050000040005002401040106000000040602052a00050a2a02040a2a0206082a0009072000400a000407090b210000004c000b2000432a0108070000040702060000040609052a0105081c00010008091c000709071c000107082a000803232a01080b1c0007070a0000070c0a00062d00000000060000000a24000401050c00040705042100005400043b010000002b00000b08032500040002080422000000632b0008050006000004060204000000040407052a020a05240004010b000004070b0a0e0004070a04210000600000043b0100002a0206082a000a072000402b01080308060b0004080600020800072100006708072000692b00080308052000772b000000080501000400000800040000250004000008090d000408090804080a1700080a080a21000075080a0001000408030809080b2b01080b080801000408050809080b2b020808080b0100000408090002080920006c25010400010805200077232b0018ca18ca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012425d93dc07b5baaf53a98caeae2679df3528cb83e11e2640a57a0a53abbaaadb9000001000000000085864497636cf755ae7bde03f267ce01a520981c21c3682aaf82a6312ace300b02ca5ab0a25052b1e852913a47292096997ca09f758c0e3624e84560000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000011fcb4a6209326e87efb8be151e476b5b530e06df46f1e42679b6b297725c63b8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "2d268006aae8391068d8ab0093b394a03fce1f3ac791737fe3907f6ac346ef61000000020000000000000000000000000000000000000000000000000000000000000002003ea5c5eb3ab71ad84b821cd44e7c206ce2a834e3981a824056329923ea53e000089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000200b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d0000010016f5ccebee696d656b400b740bdbf0045d29842fc3dac24a4f31ddf9b24fbb190000018023c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9000001800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000070dbd8f80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000caf43801178d7fb63ae26c6ea9fd13a650f29bd72253c6a6dd41812618ddab7d8ed0472000000030000000100000000000000000000000000000000000000000000000000000000000caf43800003134614cbe48aa46123f0c563dcf80dbd592a94611498881c9003f65f607adda91ade8cf88b3a04b4929bde37d26e824afbf198d157aa433b127d806a323345d12ee65ca038c71690e98c209a8ee959b6bb7f849cbb997154c28180abc39524b7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c5f0000000040000000000000004000000000009c5f40009c5f00009c4c41b6d5873cef5a35f681ab9468527f356c96e09b3c64603aef404ec2ad80aa3a90009c4a0000000006999d1e02b08a447a463563453cb36919c9dd7150336fc7c4d2b52f82f0e61717bf6bda7f9782e3fcad1c23cbbd972b655e8253e111888bd6717d5b700000000000000000000000000000000000000000000000000000000000000010f9ac095f80cb442ff39a29edf5665df91eb5323809a47d818b462de022e8fef2a44f14613e43717c19240a4d47f9d28e81694788ff3bd970c549d2dee517d4f00000000000000000000000000000000000000000000000000000000000009b7000000000258af2ae0000004da24000401022500040847000024000404072400000400081f000000000800000007000008431d0001084408441d000208450845001d0005084608462b00084300032b00084400042b00084500052b000846000600220000000e3a0000000847000000001e000200081e000000090a000708090a0021000013000a3b01000024000101092100001600043b0100001e000800041c00000704081c000706040a00070804062500040100000a2a00000b240004210c00000004000c00240104010b0000040b020c2500040100000d460200000008000000000c0000000d00000020002a010b080000040802082a02080b2a00000824000004210d000004000d00240104010800000408020d2500040100000c460200000000040000000d0000000c00000020002a0108040000040402042a0204082a00000004000004000200240001000a2a020a042a00000c0000040002002a020a000c240004000d2a000d0720003924000420030c000407030e210000be000e2000003d2a01040b24000201040a0002050408210000b900082000422400020207000a0002050704210000b4000420004624000203040a0002050403210000b000000320004a24000204030a000205030e210000ab000e20004e240002050e0a000002050e0f210000a4000f200052240002060e0a0002050e0f2100009f000f200000562400026c0b2400027405240002700e240002640f24000261102400024900112400026e122400027213240002691424000276152400026f162a00001724000004121800000400180024010401170000041702182a0018192a021119000000041902192a0212190000041902192a0215190000041902192a021019000004001902192a020b190000041902192a0214190000041902192a020f1900000419000219240002201a2a021a190000041902192a0216190000041902192a020e1900000004190219240002651b2a021b190000041902192a021319000004190219002a0210190000041902192a0205190000041902192a0214190000041902192a000216190000041902192a0212190a00010a09182100009d00182a00001924000004131c000004001c002a00191c27010518616ab80dc88d26001c0000041c02001c00000417021d240004111e2b00001d08032b00001c08042b00001e08052200000000e4240004111d0000041c1d1c2a020d1c0000041c021c3b0119132a00000a062000a216000b0a2a000a062000a22a0006032000a916000b0a1600060b000400010a0b062a0006032000a92a0003042000ae1200010b060a2a000a04200000ae2a0004072000b22a000b072000b22a0007082000b71600060b2a000b08002000b72a00080c2000bb2a00060c2000bb210000bd000c3b010000232a010c00031600030e210000c2000e2000dd2400041f0302000403070e0e000407030f00210000c7000f3b010000240004200f0c00040e0f10210000cb00103b010000000000040b0210000004100e0f2a010f03240004200f0c00040e0f11210000d20000113b010000000004080211000004110e0f2a010f100a000203100e16000e0011210000d900112000dd0c000203100f2a020f042a02090c2000dd24000401000300000407030e0e0004070e0f210000e2000f3b0100002a000e0720003925000004000008070d0004080708050808170008080808210000ee0808010004080003080708092b01080908060100040804080708092b0208060809010004080700000208072000e5232b0018ca18ca79ed1681000004c924000401022500040800470000240004040724000400081f000000000800000007000008431d000108004408441d0002084508452b00084300032b00084400042b00084500052b000800460006220000000d3a0000000847000000001e000200081e000000090a00070008090a21000012000a3b01000024000101092100001500043b0100001e00070000040a00070406082500040100000a2a00000b240004210c000004000c0024000104010b0000040b020c2500040100000d4602000000040000000c0000000d0000000020002a010b040000040402042a02040b2a000004240004210d00000400000d00240104010400000404020d2500040100000c4602000000060000000d000000000c00000020002a0104060000040602062a0206042a00000600000400000200240001000a2a020a062a00000c0000040002002a020a0c240004000d2a00000d0720003624000420030c000407030e210000bb000e20003a2a01060b2400000201060a0002050607210000b6000720003f24000202060a000205060421000000b1000420004324000203040a0002050403210000ad00032000472400020004030a000205030e210000a8000e20004b240002050e0a0002050e0f21000000a1000f20004f240002060e0a0002050e0f2100009c000f200053240002640b002400026105240002490e240002720f2400026f10240002691124000276122a00000013240004121400000400140024010401130000041302142a0014152a02000e150000041502152400026e162a0216150000041502152a021215000004150002152a0205150000041502152400026c172a0217150000041502152a021115000000041502152a020b1500000415021524000220182a021815000004150215002a02101500000415021524000270192a021915000004150215240002651a2a00021a150000041502152a020f150000041502152a02051500000415021524000002741b2a021b150000041502152a0211150000041502152a021015000004150002152a0216150a00010a09142100009a00142a000015240004131c00000400001c002a00151c27010518616ab80dc88d26001c0000041c021c00000413021d00240004111e2b00001d08032b00001c08042b00001e080522000000e124000400111d0000041c1d1c2a020d1c0000041c021c3b0115132a000a0820009f1600000b0a2a000a0820009f2a0008032000a616000b0a1600080b0400010a0b082a000008032000a62a0003042000ab1200010b080a2a000a042000ab2a000406200000af2a000b062000af2a0006072000b41600080b2a000b072000b42a00070c002000b82a00080c2000b8210000ba000c3b010000232a010c031600030e21000000bf000e2000da2400041f0302000403070e0e000407030f210000c4000f3b00010000240004200f0c00040e0f10210000c800103b0100000000040b021000000004100e0f2a010f03240004200f0c00040e0f11210000cf00113b01000000000004040211000004110e0f2a010f100a000203100e16000e11210000d60011002000da0c000203100f2a020f062a02090c2000da240004010300000407030e000e0004070e0f210000df000f3b0100002a000e07200036250004000008070d000004080708050808170008080808210000eb08080100040803080708092b0100080908060100040804080708092b02080608090100040807000208072000e200232b0018ca18ca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012425d93dc07b5baaf53a98caeae2679df3528cb83e11e2640a57a0a53abbaaadb9000001000000000085864497636cf755ae7bde03f267ce01a520981c21c3682aaf82a6311d8f25db3e8faa6a96cb1ecf57876a2ee04581deb3c4f181488ccd817abcbdb0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000012f0e61717bf6bda7f9782e3fcad1c23cbbd972b655e8253e111888bd6717d5b7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "1178d7fb63ae26c6ea9fd13a650f29bd72253c6a6dd41812618ddab7d8ed0472000000030000000000000000000000000000000000000000000000000000000000000002006b121187e7816e6d20dc8f48c0146d59f496920da1fa2d1270459227de1c2200089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb30000003009aec0cd80314728688ee74217f740a12b4ed73c64477cc2082f2652de84c38c00000180202af0e0789680c531304cdb40e315376abcd6c28fb61932609c03ae4a2eaf190000020023c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9000002000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000070dbd91c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000bebf7441f9714fb81376b2c181279c4d1103158d09e7cd6e8fadc9beb10cf1e48c917b1000000040000000100000000000000000000000000000000000000000000000000000000000bebf7440107d56e2be468280a632761eeddc8d609f214f7e0c8f99be45c063c3421d4b3af0310c7177ff83474e25f3df7d9455bae53d784fb75a75e22fe26de51ceaafa84601cad4eef4387a251288524810248079505082a5567b1cbf0e250ea63d6b5af4a0a5c14b74beba97c1be347f07c3d5e8bd1794762674b7fa7e7740e9779557f33000000000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000209000002050000020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b780b62b3dbfbe6104a53b58afe29c3b83b66bc84586f1efd99e8cdd2f03bfa933e2e3fe451a4a741b300e1ad991900d9559d69c12638b072c56f2877e873e5e0ea56cc603bb43c75b7e348b41cf39d77d78a040e54c048615c1590283f7501cd7f5f69fa04ab411abf2a4e77e8b955d29456d9028e9065ab824fc2c554aecf1dcf4bc36507177daf14f634056b917db9f69955c86a0ed96d276312d848320d3478544401d4efad9c9c3b085dd82151ec64cabcb9eb1fb8897e685afaf0851d42be944f7099dd6aac333ce96ddf2c7371865dfe37865f63e4124b1e88a38d51a5fb665dce801f7b94d2a88becadcc04db82cb0b01f73c78900477660eb168596584ee85917d2138ee16d54527200e423105997a72c6e06a20e36997ceb246b2fa881b97cb695d14cd09d48290742db49701ec281f786820a8b34b8fc68ee8d638ffe2d6ab870a6bd450554151aedfe5cf6db3acfae68eef23fb9ca48462184fe2fe31a9159e2a77fee27520220f2a808b024b9a97c994c84352c863f850e27c4e01c8b35f9b04210addb941509a2a19e1a4edfc7c50a573d4d78b5eecd0d4606f85acc34c6d494fe058a10cfdb5cfbf4876d1eb0a0437dc0bf3ff20ed28810400000004000000000000000400000000", + "1f9714fb81376b2c181279c4d1103158d09e7cd6e8fadc9beb10cf1e48c917b100000004000000000000000000000000000000000000000000000000000000000000000200156ca80ff1fa403640392da28707c78439a20886967b3fca99f4f74c3a5c5400089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb30000004009aec0cd80314728688ee74217f740a12b4ed73c64477cc2082f2652de84c38c0000020003fe64bc47e3d3f15bded8d8015b293f63279d47b686704a34b043c847ff0dd0000002800f3c54ff1ecb59024ac9dad1370428528e6c35212e8ab74464b9cfafc482fdb0000002800000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000070dbd9400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000d3efc18193be86632451d71b9f1cb607ab1337192d5cafcf1b3571ce555934a9fd09899000000050000000100000000000000000000000000000000000000000000000000000000000d3efc180004234859bae70b80c245cd8edbc286358391965aca0d0f6b3888a6d4ecd651de361779b904cdec51a7f732f5ad28c8b4ed2b19fdfafd2115146edcde4527983fe90fd70be9b2f528d592988de7e7b5bcd381b1674c31898806af3ee58fe0b8297417bbd4b88d10f0a26352446b6f01457daa7ea6d6c34d53bf6c0e9ffc6091f0440008027f637c27efdd3adcd0acfe52c6f33e0ab0e694eb133946d1a4c33d7cd5563511e8a3ced00dcb1beea2f92814ff50b3c3d1984eb8ad7a464fa726cdc11b654e0ab2891a3f9210bf039021beaf7f5bf9717c11e5c043ee54297ccd7daae65fec00000000000000000000000000000000000000000000000000000000000000011e38541b62c3769410ee8070f838dc862a0743db8e8e9a73ca421c1e9f9d98d2000000000000000000000000000000000000000000000000000000000000dead2c1037779fe0161c5e60726e8ae22a03a40bb4f6fbfb1fc9508317cbcd44deb40054657374546f6b656e000000000000000000000000000000000000000000000a47405b10aa509fb9092eba167ace57aab61c3d375c049896af95bcad81fad4000000000000000000000000000000000000000000000000000000000000dead1cd9e2732faf1a542a6be0f344b1dcf7d0c7bf62ea757648680f9be0f2b35b72005453540000000000000000000000000000000000000000000000000000000003ea0a50a8d5fe3cd3b29bfc89300973f1236658939cea5fea84ca0bb61dc386000000000000000000000000000000000000000000000000000000000000dead20ad1b8863f538e49111160adb3cbeb910f0ff68ff382e912540088b93921730000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c5f0000000040000000000000004000000000009c5f80009c5f00009c4c41b6d5873cef5a35f681ab9468527f356c96e09b3c64603aef404ec2ad80aa3a90009c4a0000000006999d1e02b08a447a463563453cb36919c9dd7150336fc7c4d2b52f81f963c25a7957544b54bbbfc4b14674bb6af7ec24a32144758962ce5d08308180000000000000000000000000000000000000000000000000000000000000001222bf12885dfbda8efb349e635781b83b49fbdff55dd64afd693853ef9942f54235b15789549087473ee04efeb8d1d123368388442398176d819e9457941bee2000000000000000000000000000000000000000000000000000000000000a2ba0000000013125d5e02000004d024000401022500040847000024000404072400000400081f000000000800000007000008431d0001084408442b00084300032b0000084400042b00084500052b0008460006220000000c3a000000084700000000001e000000081e00000009310000000008000000090000000a24000201090a0000020a09082100001300083b0100001e0002000a1e000000090a00070a0908002100001800083b0100002a000009240004030a000004000a0024010401090000000409020a2a000a08240007020b2a020b080000040802082a02050824000400000a00000409020c240004020d42040000000a000000080000000c0000000d0024000700090a0007080905240001000b0a0001050b0d2100002c000d3b010000002a00000b0000040002002a000005240004020d000004000d0024010401050000000405020d2a000d0c2a02090c2a02050b2a000a072000380a0004070a05002400040104210000ae000520003c2a010b07000004070205000004050a032a0001030b1c00010b051c000705071c0001070b240001010721000046000b3b010000002a0000070000040002002a00000b240004020500000400050024010401000b0000040b02052a0005032a0209032a020b072a000a082000520a0004080a000924000704052100009800092000562a010708000004080203000004030a0b002a010b071c00070708280007ffffffffffffffffffffffffffffffff00030e00000708030b2100005f000b3b0100001c000507081c000708030200070703080028000700000000000000010000000000000000000708000708070b1c0007060008280007ffffffffffffffffffffffffffffffff000c0e0007080c0d2100000069000d3b0100001c000506081c0007080c020007060c0808000708070600000007030c081c000508031c0007030c020007080c030800070307080000070b0600030000070308061c000506081c000708030a00070306082100007900083b010000000400070307060000070c06072a000a0920007d0a0004090a0821000081000008200080231c000709080000070508062a00000824000402030000040003000024010401080000040802032a00030b2a02070b240004010b0c0004090b0c002100008e000c3b01000000000408020c0000040c090b2a010b032e000000000003000000060000040904060e00040906032100009600033b0100002a0006090020007d2a0107091c0007080300000705030b2d000000000b000000032400040001050c000408050c210000a0000c3b0100002b0000090803250004000208040022000000c42b000805000b0000040b020c0000040c08052a020305000004080004090e0004080903210000ab00033b0100002a020b072a0009082000522a01000b051c0007070300000708030c2d000000000c00000003240004010d0c000400070d0e210000b6000e3b0100002b00000508032500040002080422000000c4002b000805000c0000040c020e0000040e070d2a02030d0000040704030e000400070305210000c100053b0100002a020c0b2a0003072000382b01080308060b000004080600020807210000c808072000ca2b00080308052000d82b000000080005010004000008040000250004000008090d000408090804080a1700080a08000a210000d6080a01000408030809080b2b01080b080801000408050809080b002b020808080b0100040809000208092000cd250104000108052000d8232b000018ca18ca1a62d9e200000c9124000401022500040847000024000404072400000400081f000000000800000007000008431d0001084408442b00084300032b0000084400042b00084500052b0008460006220000000c3a000000084700000000001e000000081e00000009310000000008000000090000000a24000201080a0000020a08092100001300093b0100001e00020008240007020a2a00000924000004030b000004000b00240104010900000409020b2a000b0c2a020a0c000004000c020c2a02080c240004000b00000409020d240004020e42040000000b000000000c0000000d0000000e240007000a0a00070c0a0824000100090a00010809000e21000028000e3b0100002a0000080000040002002a00000e240004020d00000004000d00240104010e0000040e020d2a000d0f2a020a0f2a020e082a000b00072000340a0004070b0424000401032100020700042000382a0108040000040004020c0000040c0b0d2a010d081c0001080c1c00070c041c000104082400010001042100004200083b0100002a0000040000040002002a0205042a000008000000040002002a0206082a0000060000040002002a00000c240004020d00000400000d00240104010c0000040c020d2a000d0e2a020a0e2a020c062a000b07200000540a0004070b0c240007040d210001f1000c2000582a0106070000040702000e0000040e0b0f2a010f061c00070607280007ffffffffffffffffffffffff00ffffffff000e0e0007070e0f21000061000f3b0100001c000506071c000707000e020007060e072800070000000000000001000000000000000000060800070007060f1c00070507280007ffffffffffffffffffffffffffffffff00100e0000070710112100006b00113b0100001c000505071c00070710020007051007080000070706050000070e10071c0005070e1c00070e1002000707100e0800070e0006070000070f050e0000070e07051c0005050e1c00070e070a000707050e210000007b000e3b0100000400070706050000071005072a000b0c20007f0a0004000c0b06210001da00062000821e000000062a0104052a01080425000401000000082a00000c240004210d000004000d00240104010c0000040c020d250004010000000e4602000000050000000d0000000e00000020002a010c0e0000040e02000e2a020e0c2a00000e0000040002002a020a0e2a00000d0000040002002a02000a0d2a00000f00000400020024000701102a02100f2a000b0720009c2400040010060c000407061125000701000012210001b300112000a12a010e0f2a010d000e290007000000000000000000000000000000010000000000000000000000000000000000000d0400070d0e0c0000070f0c070a000705070c210000a9000c003b0100002a00000724000421050000040005002401040107000004070205250000040100000c460200000004000000050000000c00000020002a010708000000040802082a0208072a0000080000040002002a020a082a00000c000004000200002a020a0c2a0000050000040002002a0210052a000b112000be0c0004110600132100018c00132000c12a0108072a010c080400070d080c000007070c050a00000704050c210000c8000c3b0100002a0000040000040002002a020a042a000000050000040002002a020a052a00000a0000040002002a02100a2a000b11200000d30c00041106102100011e00102000d62a01040c2a0105040400070d0405000000070c050d24000705050a0007050d0a210000de000a3b010000290007280025c79cc6a5cbbeef7d6a8f1b6a12b312aa338440aefeb4396148c89147c0490000052a00000d2400040a0a000004000a00240104010d0000040d020a2a000a000629000730426e64aee30e998c13c8ceecda3a77807dbead52bc2f3bf0eae80051b4b710c100032a020306000004060206290007113156a068f603023240c9006b4da5474667db3b8711c521c748212a15bc034ea600102a021006000004060002062a0209060000040602062a020506000004060206290007129bfd1da54b007062d6b544e7e36b90736350f6fba01228c41c72099509f5701e00112a021100060000040602062a020906000004060206290007041223147b680850dc82e800a55a952d4df20256fe0593d949a9541ca00f0abf1500122a021206000004060002062900070a8c72e60d0e60f5d804549d48f3044d06140b98ed717a9b532a00f630c153079100132a0213060000040602062a0209062a00000a240004070600000004000600240104010a0000040a02062a0006142a020f14000004140214002a020e140000041402142a0207140000041402142a0208140000041402142a00020c140000041402142a0204142a00000624000404140000040014002401040001060000040d021424000409150000040a02162400040617000004060218440007000000140000001600000018000000152a0106050000040502052a02050600000004060213000004130b082a010805300000000005232a01041024000205000c24000200132a00001424000421150000040015002401040114000004140200152a0015162a020c160000041602162a0213160000041602162a021316000000041602162a0213160000041602162a0213160000041602162a021316000004001602162a0213160000041602162a0213160000041602162a021316000004160002162a0213160000041602162a0213160000041602162a021316000004160200162a0213160000041602162a0213160000041602162a021316000004160216002a0213160000041602162a0213160000041602162a0213160000041602162a000213160000041602162a0213160000041602162a0213160000041602162a020013160000041602162a0213160000041602162a0213160000041602162a021300160000041602162a0213160000041602162a0213160000041602162a021316000000041602162a0213160000041602162a0213160000041602162a021316000000041602162a02131624000420160c00041116172100016a00173b010000000000041402170000041711162a0116151c000715172a010a15040007171516000000071016172a0217042a0105170000041106160e0004111610210001770010003b01000024000420150c00041615182100017b00183b010000000004140218000000041816152a0115101c000710132a010a10040007131016000007171610002a0210052a010a100400071012172a02170a0000041103170e0004111710210000018a00103b0100002a0017112000d32a01081324000420150c0004111516002100019100163b0100000000040702160000041611152a0115141c00071416002a0105140400071614150000071315162a0216082a010c160000041106150e0000041115132100019e00133b01000024000420140c0004151417210001a20000173b0100000000040702170000041715142a0114131c000713152a010513040000071513170000071617132a02130c2a0105130400071312162a021605000000041103160e0004111613210001b100133b0100002a0016112000be2a010e110024000420140c0004071415210001b800153b0100000000040c0215000004150007142a0114131c000713152a010f130400071513140000071114152a02150e002a010d150000040706140e0004071411210001c500113b0100002400042011000c0004141113210001c900133b0100000000040c02130000041314112a011100061c000706142a010f060400071406130000071513062a02060d2a010f06040000070612152a02150f0000040703150e0004071512210001d800123b010000002a00150720009c1c00070c060000070d06052a000006240004020e00000400000e00240104010600000406020e2a000e0f2a02070f240004010f0c00040c0f0010210001e700103b010000000004060210000004100c0f2a010f0e2e00000000000e000000050000040c030e0e00040c0e05210001ef00053b0100002a000e000c20007f2a01060c1c0007070e0000070d0e0f2d000000000f0000000e24000004010d0c0004070d10210001f900103b0100002b00000c08032500040002080004220000021d2b000805000f0000040f021000000410070d2a020e0d0000040007030c0e0004070c0e21000204000e3b0100002a020f062a000c072000542a000108041c0007070d0000070c0d0e2d000000000e0000000d240004010f0c000004070f102100020f00103b0100002b00000408032500040002080422000002001d2b000805000e0000040e021000000410070f2a020d0f0000040703040e00000407040d2100021a000d3b0100002a020e082a0004072000342b0108030806000b00040806000208072100022108072002232b00080308052002312b000000000805010004000008040000250004000008090d000408090804080a1700080a00080a2100022f080a01000408030809080b2b01080b08080100040805080908000b2b020808080b01000408090002080920022625010400010805200231232b000018ca18ca2b11b19a000001f924000401022500040846000024000402052400000400061f000000000600000005000008431d0001084408442b0008430003002b0008440004220000000b2b00000308453a0000000845000000011e00000000061e00000007310000000006000000070000000824000201060a0002080607002100001200073b01000024000101082100001500043b0100002a000008000000040002002a000004240004020600000400060024010401040000040402062a0000060724000700092a0209072a02040824000400092a0009052000230a0004000509072100002c00072000262a0108070000040702060000040609052a010500082a000803232a0108071c0007050624000701040000070406032d0000000000030000000424000401060c000405060a21000035000a3b0100002b0000070800032500040002080422000000442b000805000300000403020a0000040a0506002a02040624000401070000040507040e000405040a21000041000a3b010000002a0203082a0004052000232b01080308060b00040806000208072100004808000720004a2b00080308052000582b000000080501000400000804000025000400000008090d000408090804080a1700080a080a21000056080a0100040803080009080b2b01080b080801000408050809080b2b020808080b0100040809000200080920004d25010400010805200058232b0018ca18ca2cd6a2c0000014b3240000040102250004084900002400040609240004000a1f000000000a0000000900000008431d0001084408442b00084300032b00084400042b00084500052b0000084600062b00084700072b0008480008220000000e3a000000084900000000001e000000091e0000000a3100000000090000000a0000000b240002010a0a0000020b0a092100001500093b0100001e0002000b0a0007050b091600090b240000010009240004010c28000700000000000000010000000000000000000d24000007000e240004000f21000023000b20001f0a0007080e0b21000022000b3b010000002001d41e000200081e000300101c000710112a0000100000040002002a000203102a0000120000040002002a0204122a0000040000040002002a020f04002a000013000004000200240004001524000402170000041517162a0000140000000400160024010401140000041402162a0215162400040216000004141615002a0214131c000403151c000715141c000414032a000f0b2000410c00040b03001424000402152100038200142000452a01100b2a0112032a0104162a011304000a0004160f1324000404172400010118240004031921000146001320004f00000004160c130e000416131a21000053001a3b0100001c0007131a0400071a0d00132a00001a0000040002002a00001b0000040002002a00001c000004000200002a00001d0000040002002400072c1e2a00001f240004042000000400200024000104011f0000041f02202a0020212a021e210000042102212a020e21000004002102212a020e212a021f1a2a00001f240004051e000004001e00240104011f000000041f021e2a001e202a020e200000042002202a020e200000042002202a00020e200000042002202a0213202a021f1b2a020c1c2a02091d20007b2a000f001320007d0c000413161e210000cb001e2000802a011d130a0001130904210000008400043b0100002a000f162000860c0004161913210000a200132000892a00011b1c2a00001a2400040516000004001600240104011a0000041c02162400000404130000041a02043f0300000016000000042a011a1c0000041c021c2a02001c1a2a011a1c0200041c021c2a021c1a2a021a1b2a02181d0000041a021b000000041b0f1c2a011c1d2a011a1b0200041b021b2a021b1a2a001d142001482a00011c130c0004161304210000a600042000c52a011b132a011b04240004041f000c0004161f20210000ac00203b01000000000404022000000420161f2a011f001e2a011a04240004031f0c0004161f21210000b400213b0100000000040402002100000421161f2a011f200000071e200424000404200c000416202121000000bc00213b0100002b00001308032500040005080422000003a92b000805001e000000041e02210000042116202a0204202a021e1b2000c5000004160c130e000004161304210000c900043b0100002a0013162000860c000413161e210000ce00001e3b01000000000404021f2a011f1f0c0004131f20210000d300203b01000000240004021f000004041f2000000420131f2a011f1e2a011d200a00012009001f210000db001f3b0100002a011c200a000420191f210000f4001f2000df2a00011a1f2a011c202a011c2124000403230c0004212324210000e600243b010000002b00001f08032500040004080422000003a92b0008050022000004220224000000042421232a021e23000004200c210e000420211e210000f1001e3b010000002a02221a2a02211c2001172a000f1f2000f60c00041f19202100011d0020002000f92a011a1f2a011b202a000021240004052200000400220024010401210000000420022224000404230000042102243f0300000022000000242a012120000000042002202a0220212a011f200200042002202a02201f2a012120020004002002202a0220212b00001f08032500040004080422000003a92b000805002000000004200224000004240f232a021e232a02201a2a02211b2a020c1c20011700000004130c1e0e0004131e1f2100011b001f3b0100002a001e1320007d2a01001c200c00041f20212100012100212001402a011b202a011b2124000404230c0000041f23242100012700243b010000000004210224000004241f232a012322002a011a2124000403230c00041f23252100012f00253b01000000000421022500000004251f232a01232400000722242124000404240c00041f2425210001370000253b0100002b00002008032500040005080422000003a92b000805002200000004220225000004251f242a0221242a02221b2001400000041f0c200e0004001f20212100014400213b0100002a00201f2000f62a000e142001482a020b10002a0203122a0000030000040002002a0000120000040002002a000010000004000002002a00000b0000040002002400072d162a00001324000404040000040000040024010401130000041302042a00041a2a02161a0000041a021a2a020e1a000000041a021a2a020e1a2a0213032a00001324000405160000040016002401000401130000041302162a0016042a020e040000040402042a020e04000004040002042a020e040000040402042800070000000000000004000000000000000000001a2a021a042a0213122a020c102a02090b2001712a000f162001730c0004001619132100030100132001762a010b140a00011409132100017a00133b010000002a000f1620017c0c0004161914210002d8001420017f2a0112162a00001400240004051300000400130024010401140000041602132400040411000004140002103f0300000013000000102a0114170000041702172a0217142a011417020000041702172a0217142a0214122a02180b000004140218000004180f122a0100120b2a0114180200041802182a0218142900072ace300b02ca5ab0a25052b100e852913a47292096997ca09f758c0e3624e84560001424000402122400040200160000041216172a00001800000400170024010401180000041802172a0212001724000402170000041817122a0012172a0205170000041702172a020b172900000730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000000000122600072716b16600172a00001624000403100000040010002401000401160000041602102a0010112a0212110000041102112a021211000004160002100000041802082a0108130000040802112a000008240004020400000400000400240104010800000408020337150000001000000014000000110000001300000000030000000100000004000000172a0108180000041802182a0218082a000108180000041802182a0218080a0002040a18210001c300183b0100002a010008040000040402042a0204082a0108040000040402042a0204082a010804000000040402042a02040800000408020a0000040a0f182a01180426000747dacd007300080a000704080a210001d3000a3b0100002001d41c0007070a280007ff00ffffffffffffffffffffffffffffff00080e00070a0804210001d900043b010000001c0005070a1c00070a0802000707080a0800070a0d07240007060a2a00000004240004030300000400030024010401040000040402032a0003102a020a00100000041002102a020510000004040210240004021142040000000f000000000300000010000000110a0007030e040a0001040911210001ee00113b010000002a0000040000040002002a00001124000402100000040010002401040111000000041102102a0010122a020e122a0211042a000f0b2001fa0a00040b0f1021000002c200102001fd2a010403000004030210000004100f112a0111041c0007000403280007ffffffffffffffffffffffffffffffff00100e0007031011210000020600113b0100001c000504031c00070310020007041003080007030d04000000070d10030200070308101c000510111c000711030a00071003111c00071100100200070407110200071110041c000504101c000710110a0007110410210000021700103b0100002a00000424000403100000040010002401040104000004000402102a0010122a020a120000041202122a02051200000404021224000402001342040000000f0000001000000012000000130a0007100e050a0001050904002100022700043b010000040007110d050000070305112a000f0b20022b0a0000040b0f05210002ab000520022e2a00000524000403040000040004002401040001050000040502042a0004032a020a030000040302032a02060300000405020003240004021042040000000f0000000400000003000000100a0007040e050a0000010509102100023e00103b0100002a0000050000040002002a00001024000004020300000400030024010401100000041002032a0003112a020e112a021000052a000f0b20024a0a00040b0f0321000295000320024d2a01050400000404000203000004030f102a0110051c00070504280007ffffffffffffffffffffff00ffffffffff00030e00070403102100025600103b0100001c000505041c0007000403020007050304080007040d050000070308041c000504031c0007030802000007040803080007030d040000070507030000070304051c000505041c00070004030a00070305042100026600043b0100002a00000524000403040000040000040024010401050000040502042a0004072a020a070000040702072a02060700000004050207240004021042040000000f0000000400000007000000100a000007040e0a0a00010a090e21000276000e3b010000040007030d0a000007080a00032a000f0b20027a0a00040b0f0e2100027e000e20027d231c00070b0e00000007040e0d2a00000e240004020a000004000a00240104010e0000040e020a2a00000a092a02030924000401090c00040b09082100028b00083b010000000004000e0208000004080b092a01090a2e000000000a0000000d0000040b0c0a0e0000040b0a0d21000293000d3b0100002a000a0b20027a2a0105031c00070b10000000070410112d00000000110000001024000401120c00040b12132100029d0000133b0100002b00000308032500040002080422000003a92b000805001100000004110213000004130b122a0210120000040b0c100e00040b1003210002a80000033b0100002a0211052a00100b20024a1c00070b050000071005042a00000500240004020300000400030024010401050000040502032a0003122a0211122400000401120c00040b1213210002b800133b010000000004050213000004130b00122a0112032e0000000003000000040000040b0c040e00040b0403210002c00000033b0100002a00040b20022b2a0104101c00070b110000070311122d0000000000120000001124000401130c00040b1314210002ca00143b0100002b0000001008032500040002080422000003a92b000805001200000412021400000414000b132a0211130000040b0c100e00040b1011210002d500113b0100002a021200042a00100b2001fa2a0110140c0004161413210002dc00132002fb2a011214002a01121324000404080c0004160804210002e200043b010000000004130204000000040416082a0108112a01031324000403080c000416081a210002ea001a003b01000000000413021a0000041a16082a0108040000071104132400040404000c000416041a210002f2001a3b0100002b0000140803250004000508042200000003a92b000805001100000411021a0000041a16042a0213042a021112200200fb000004160c140e0004161413210002ff00133b0100002a00141620017c2a00000013240004040400000400040024010401130000041302042a00041a2a0200081a0000041a021a2a02111a0000041a021a2a02141a240004031a0c000416001a1b21000310001b3b01000000000413021b0000041b161a2a011a042a010b00130a000113091b21000317001b3b0100002a0110130a000413191b2100033000001b20031b2a0103132a01101a2a01101b240004031d0c00041b1d1e2100030022001e3b0100002b00001308032500040004080422000003a92b000805001c000000041c021e0000041e1b1d2a02041d0000041a0c130e00041a131b210003002d001b3b0100002a021c032a0213102003532a000f132003320c000413191a0021000359001a2003352a0103132a01121a2a00001b240004051c000004001c0000240104011b0000041a021c240004041d0000041b021e3f030000001c000000001e2a011b1a0000041a021a2a021a1b2a01131a0200041a021a2a021a132a00011b1a0200041a021a2a021a1b2b00001308032500040004080422000003a9002b000805001a0000041a021e0000041e0f1d2a02041d2a021a032a021b122a00020c10200353000004160c130e00041613042100035700043b0100002a001300162001732a01101a0c0004131a1b2100035d001b20037c2a01121a2a01121b00240004041d0c0004131d1e21000363001e3b0100000000041b021e0000041e00131d2a011d1c2a01031b240004031d0c0004131d1f2100036b001f3b010000000000041b021f0000041f131d2a011d1e0000071c1e1b240004041c0c000413001c1f21000373001f3b0100002b00001a08032500040005080422000003a92b00000805001e0000041e021f0000041f131c2a021b1c2a021e1220037c00000400130c1a0e0004131a1b21000380001b3b0100002a001a13200332000004150b00140e00041514162100038600163b0100002a00001524000402160000040016000024010401150000041502161f04000000140000000c000000162a011514000000041402142a021415000004150216000004160f172a0117142a0104152a010013160000041502172b00001608032500040001080422000003be2b0008050000182b00080600192a0214192a0118140000041402142a0214182a0217042a020018132a0118170200041702172a0217180000040b0c180e00040b181721000300a700173b0100002a00180b2000412b01080308060b000408060002080721000003ad08072003af2b00080308052003bd2b000000080501000400000804000000250004000008090d000408090804080a1700080a080a210003bb080a0100040008030809080b2b01080b080801000408050809080b2b020808080b010004080009000208092003b2250104000108052003bd230100040803000208072b0108000708070100040807080408082500040002080a0100040808080a08092b000000000805010004000008090000250104000108050100040805000208092b0208000808092500040002080a0100040803080a08092500040002080b010004080500080b080a2500040000080c0d0004080c0807080d1700080d080d210003d608000d0100040809080c080e2b01080e080b010004080a080c080e2b02080b080e00010004080c0002080c2003cd010004080a08070806232b0018ca18ca5e134a00bf00001bcd2400040102250004088500002400044209240004000a1f00000000000a00000009000008431d0001084408441d0002084608461d000208470847001d0002084808481d0002084908491d0002084a084a1d0002084b084b1d000200084c084c1d0002084d084d1d0002084e084e1d0002084f084f1d000208500800501d0002085108511d0002085208521d0002085308531d0002085408541d000002085508551d0002085608561d0002085708571d0002085808581d000208590008591d0002085a085a1d0002085b085b1d0002085c085c1d0002085d085d1d000002085e085e1d0002085f085f1d0002086008601d0002086108611d000208006208621d0002086308631d0002086408641d0002086508651d000208660866001d0002086708671d0002086808681d0002086908691d0002086a086a1d000200086b086b1d0002086c086c1d0002086d086d1d0002086e086e1d0002086f08006f1d0002087008701d0002087108711d0002087208721d0002087308731d000002087408741d0002087508751d0002087608761d0002087708771d000208780008781d0002087908791d0002087a087a1d0002087b087b1d0002087c087c1d000002087d087d1d0002087e087e1d0002087f087f1d0002088008801d000208008108811d0002088208821d0002088308831d0002088408842b00084300032b0000084400042b0008450005250004084600062400041f092a00000a24000420000b000004000b00240104010a0000040a020b2b00000608032b00000b08042b00000009080522000000632a000a06250004086500072400041f0b2a00000a240000042009000004000900240104010a0000040a02092b00000708032b0000090008042b00000b080522000000632a000a072b0008840008220000006e3a00000000088500000000250004000008070d0004080708050808170008080808210000006d08080100040803080708092b01080908060100040804080708092b020800060809010004080700020807200064231e0000000f2a000010240004071100000004001100240104011000000410021134020000000f000000112a01100f000000040f020f2a020f102a01100f0000040f020f2a020f102a01100f0000040f00020f2a020f102a00000f0000040002002a0000110000040002002a011012000000041202122a02121024000400120000041002140000041412152a0115132a0002100f24000401142a0214112a0110150200041502152a0215102400070015000a00071315162400040213240001011724000404182400040319240001001a00210000f300162000982a01101b0000041b021b2a021b102a00001b000004000002002a00001c240004061d000004001d00240104011c0000041c021d2a001d001e2a02151e0000041e021e2a02151e0000041e021e2a02151e0000041e021e002a02151e0000041e021e2a02151e2a021c1b2a01101c0000041c021c2a021c00102a0012162000b224000405100c000416101c210000d3001c2000b62a0111001600000416100f0e0004160f1c210000bb001c3b0100002a020f112a011b110000000411020f0000040f12162a01161b0000041102160000041614102a0110000f00000411021000000410131c2a011c1600000411021c0000041c191d2a01001d1000000411021d0000041d181e2a011e1c2a0017092a001b0a2a000f0b2a0000160c2a00100d2a001c0e2000fa2a011b102a010f1c2a01111d0000041d16001e0e00041d1e1f210000da001f3b010000240004061f0c00041e1f2021000000de00203b0100000000041c0220000004201e1f2a011f1d240004051c0c000400161c20210000e500203b0100002b000010080325000400060804220000051e002b000805001e0000041e022000000420161c2a021d1c00000416141d0e000400161d10210000f000103b0100002a021e1b2a001d162000b22a001a092a0015000a2a00150b2a00150c2a00150d2a00150e2000fa210000fc00093b0100001e00000300092a0000110000040002002a0203112a0000100000040002002a020400102a0000040000040002002a0212042a00000f000004000200240004001c24000004021e0000041c1e1d2a00001b000004001d00240104011b0000041b021d002a021c1d240004021d0000041b1d1c2a021b0f1c0004031c1c00071c1b1c0000041b032a0012162001180c000416030e210004f7000e20011b2a01110e2a0100100c2a01040a2a010f040a00040a120f2100021a000f2001220000040a140f000e00040a0f032100012600033b0100001c00070f032800070000000000000000010000000000000000000f040007030f1b2a0000030000040002002a00000f000000040002002a00001c0000040002002a00001d0000040002002400072c1e002a00001f2400040420000004002000240104011f0000041f02202a0020212a00021e210000042102212a0215210000042102212a0215212a021f032a00001e00240004051f000004001f00240104011e0000041e021f2a001f202a021520000000042002202a0215200000042002202a0215200000042002202a021b202a02001e0f2a02141c2a021a1d20014f2a00121b2001510c00041b0a1e2100019f00001e2001542a011d0a0a00010a1a042100015800043b0100002a00121b20015a000c00041b190a21000176000a20015d2a010f1c2a00001b240004050a00000400000a00240104011b0000041c020a24000404040000041b02033f030000000a00000000032a011b1c0000041c021c2a021c1b2a011b1c0200041c021c2a021c001b2a021b0f2a02171d0000041b020f0000040f121c2a011c1d2a011b0f020000040f020f2a020f1b2a001d1620021c2a011c0a0c00041b0a042100017a0004002001992a010f0a2a010f04240004041f0c00041b1f202100018000203b01000000000004040220000004201b1f2a011f1e2a010304240004031f0c00041b1f00212100018800213b010000000004040221000004211b1f2a011f200000071e002004240004041e0c00041b1e212100019000213b0100002b00000a08032500000400050804220000051e2b0008050020000004200221000004211b1e2a0204001e2a02200f2001990000041b140a0e00041b0a042100019d00043b0100002a00000a1b20015a0c00041b0a1e210001a2001e3b01000000000404021f2a011f001f0c00041b1f20210001a700203b010000240004021f000004041f2000000400201b1f2a011f1e2a011d200a0001201a1f210001af001f3b0100002a011c20000a000420191f210001c8001f2001b32a01031f2a011c202a011c212400040300230c0004212324210001ba00243b0100002b00001f08032500040004080422000000051e2b00080500220000042202240000042421232a021e230000042014001f0e0004201f21210001c500213b0100002a0222032a021f1c2001eb2a0012001f2001ca0c00041f1920210001f100202001cd2a01031f2a010f202a00002100240004052200000400220024010401210000042002222400040423000004210002243f0300000022000000242a0121200000042002202a0220212a011f20020000042002202a02201f2a0121200200042002202a0220212b00001f08032500000400040804220000051e2b00080500200000042002240000042412232a021e00232a0220032a02210f2a02141c2001eb0000041b141e0e00041b1e1f21000100ef001f3b0100002a001e1b2001512a011c200c00041f2021210001f50021200002142a010f202a010f2124000404230c00041f2324210001fb00243b01000000000004210224000004241f232a0123222a01032124000403230c00041f2325002100020300253b010000000004210225000004251f232a0123240000072224002124000404220c00041f22252100020b00253b0100002b00002008032500040000050804220000051e2b0008050024000004240225000004251f222a022122002a02240f2002140000041f14200e00041f20212100021800213b0100002a0000201f2001ca2a00151620021c2a020e112a020c101c0007090c2a000009000000040002002a0000100000040002002a00000e0000040002002a000011000004000002002400070d0f2a00000a2400040404000004000400240104010a000004000a02042a0004032a020f030000040302032a0215030000040302032a021503002a020a092a00000a240004050f000004000f00240104010a0000040a020f2a00000f042a0215040000040402042a0215040000040402042a021504000004040002042800070000000000000003000000000000000000032a0203042a020a10002a02140e2a021a112002462a00120f2002480c00040f130a21000478000a2000024b2a0111130a0001131a0f2100024f000f3b0100002a0012162002510c0000041619132100044f00132002542a0110162a000013240004050f000004000f0000240104011300000416020f240004040e00000413020c3f030000000f000000000c2a0113160000041602162a0216132a0113160200041602162a0216132a000213102a0217110000041302100000041012162a0116112a011310020004100002102a0210130a00070d11132100026e00133b0100000a00070b15111e000200000d0a00070b0d1312000111130b21000274000b3b0100000a00070515170a000001171a0b21000278000b3b0100002a00121920027a0a000419121824000700011721000438001820027e24000702182a00001624000403130000040013000024010401160000041602132a0013112a0218110000041102112a0205110000000416021124000402104204000000120000001300000011000000100a0007130015050a0001051a162100028f00163b0100002a0012192002910a0004191218002100042100182002942a0000130000040002002a0215132a000011000004000002002a0217112a00121620029c2400041f100c000416100f2500070100000e0021000403000f2002a12a0113112a0000130000040002002a00000f24000402000d000004000d00240104010f0000040f020d2a000d0c2a02150c2a020f132a000012162002ae0a000416120f2600073b9aca08000d210003ed000f2002b22a0001130f0000040f020c0000040c120b2a010b130a000713150f210002b9000f003b0100002a0012162002bb0a0004161213250007dead000f210003d60013200002bf2a0012162002c10a0004161213210003be00132002c42a000013000004000002002a0215132a0000110000040002002a0217112a0012162002cc0c00040016100d210003a0000d2002cf2a0113102a0000130000040002002a00000e24000004020d000004000d00240104010e0000040e020d2a000d0c2a02150c2a02000e132a0012112002dc0a000411120e2600073b9aca07000d2100038a000e200002e02a01130e0000040e020c0000040c120b2a010b130a000713150e21000200e7000e3b0100002a0012112002e90a00041112132100037300132002ec2a000012132002ee0a00041312112100035b00112002f12a0000110000040002002a00000010240004020e000004000e00240104011000000410020e2a000e0d2a0200150d2a0210112a0012132002fd0a00041312102600073b9aca09000e210003004500102003012a01111000000410020d0000040d120c2a010c110a0007111500102100030800103b0100002a00121320030a0a00041312112100032e00112000030d1c000708112a0012132003100a00041312102100031600102003131e0000000003320000000003231c00071310240007090f0000070f100e2a00001024000004020f000004000f00240104011000000410020f2a000f0d2a02110d24000004010d0c0004130d0c21000324000c3b01000000000410020c0000040c130d002a010d0f2e000000000f0000000e00000413140f0e0004130f0e2100032c00000e3b0100002a000f132003101c000713110000070e11102a00001124000402000d000004000d00240104011100000411020d2a000d0c2a020f0c240004010c000c0004130c0b2100033b000b3b01000000000411020b0000040b130c2a010c000d2e000000000d0000001000000413140d0e0004130d102100034300103b010000002a000d1320030a2a0111101c0007130d0000070e0d0c2d000000000c000000000e240004010d0c0004130d0b2100034d000b3b0100002b00001008032500000400020804220000051e2b000805000c0000040c020b0000040b130d2a02000e0d0000041314100e000413100e21000358000e3b0100002a020c112a001000132002fd1c00071311240007070e0000070e110d2a000011240004020e00000004000e00240104011100000411020e2a000e0c2a02100c240004010c0c000400130c0b21000369000b3b01000000000411020b0000040b130c2a010c0e2e00000000000e0000000d00000413140e0e0004130e0d21000371000d3b0100002a00000e132002ee1c000711130000070d130e2a000013240004020c000004000c0000240104011300000413020c2a000c0b2a020f0b240004010b0c0004110b0a0021000380000a3b01000000000413020a0000040a110b2a010b0c2e00000000000c0000000e00000411140c0e0004110c0e21000388000e3b0100002a000c11002002e92a01130e1c0007110c0000070d0c0b2d000000000b0000000d24000400010c0c0004110c0a21000392000a3b0100002b00000e08032500040002080400220000051e2b000805000b0000040b020a0000040a110c2a020d0c0000041100140e0e0004110e0d2100039d000d3b0100002a020b132a000e112002dc0200000410160d0e000416100c210003a4000c3b0100000200040d140c0e0004140d000b210003a8000b3b0100002a01130d2400041f0a0c00040c0a09210003ad0000093b010000000004070209000004090c0a2a010a0b1c00070b0c2a01110b040000070c0b090000070d090b2a020b132a01110b0400070b0e092a020911000000041614090e000416090b210003bc000b3b0100002a0009162002cc1c0007160013240007080d0000070d130c2a000013240004020d000004000d0024010401001300000413020d2a000d0b2a02110b240004010b0c0004160b0a210003cc00000a3b01000000000413020a0000040a160b2a010b0d2e000000000d0000000c0000000416140d0e0004160d0c210003d4000c3b0100002a000d162002c11c00000716130000070d130c2a000013240004020b000004000b0024010401130000000413020b2a000b0a2a020f0a240004010a0c0004160a09210003e300093b0100000000000413020900000409160a2a010a0b2e000000000b0000000c0000040016140b0e0004160b0c210003eb000c3b0100002a000b162002bb2a01130f1c000007160c0000070d0c0b2d000000000b0000000d240004010c0c0004160c0a00210003f5000a3b0100002b00000f080325000400020804220000051e2b00080005000b0000040b020a0000040a160c2a020d0c00000416140f0e0004160f0d0021000400000d3b0100002a020b132a000f162002ae02000410160f0e00041600100d21000407000d3b0100000200040f14100e0004140f0d2100040b000d3b000100002a01130f2400041f0c0c0004100c0b21000410000b3b0100000000040006020b0000040b100c2a010c0d1c00070d102a01110d040007100d0b000007000f0b0d2a020d132a01110d0400070d0e0b2a020b1100000416140b0e000416000b0e2100041f000e3b0100002a000b1620029c1c000719180000071318162a00000018240004021100000400110024010401180000041802112a0011102a0200171024000401100c000419100f2100042e000f3b01000000000418020f000000040f19102a0110112e0000000011000000160000041914110e0004191116210000043600163b0100002a0011192002911c000719180000071718162a00001800240004021700000400170024010401180000041802172a0017132a0205132400000401130c00041913112100044500113b010000000004180211000004111900132a0113172e0000000017000000160000041914170e00041917162100044d0000163b0100002a00171920027a2a010e130c000416130f21000453000f200400722a0110132a01100f240004040a0c0004160a042100045900043b010000000000040f020400000404160a2a010a0c2a01090f240004030a0c0004160a03210000046100033b0100000000040f020300000403160a2a010a040000070c040f00240004040c0c0004160c032100046900033b0100002b00001308032500040000050804220000051e2b000805000400000404020300000403160c2a020f0c2a000204102004720000041614130e000416130f21000476000f3b0100002a001300162002512a00000a2400040304000004000400240104010a0000040a02042a000004032a020c030000040302032a02160324000402030c00040f031b2100040085001b3b0100000000040a021b0000041b0f032a0103042a01110a0a00010a001a1b2100048c001b3b0100002a010e0a0a00040a191b210004a5001b200490002a01090a2a010e032a010e1b240004031d0c00041b1d1e21000497001e3b010000002b00000a080325000400040804220000051e2b000805001c0000041c02001e0000041e1b1d2a02041d00000403141b0e0004031b04210004a200043b010000002a021c092a021b0e2004c82a00120a2004a70c00040a1903210004ce0000032004aa2a01090a2a0110032a00001b240004051c000004001c0024010401001b00000403021c240004041d0000041b021e3f030000001c0000001e2a011b00030000040302032a02031b2a010a030200040302032a02030a2a011b03020000040302032a02031b2b00000a080325000400040804220000051e2b00080500000300000403021e0000041e121d2a02041d2a0203092a021b102a02140e200400c80000040f140a0e00040f0a04210004cc00043b0100002a000a0f2002482a00010e030c00040a031b210004d2001b2004f12a0110032a01101b240004041d000c00040a1d1e210004d8001e3b0100000000041b021e0000041e0a1d2a011d001c2a01091b240004031d0c00040a1d1f210004e0001f3b0100000000041b02001f0000041f0a1d2a011d1e0000071c1e1b240004041e0c00040a1e1f21000400e8001f3b0100002b000003080325000400050804220000051e2b000805001c000000041c021f0000041f0a1e2a021b1e2a021c102004f10000040a14030e0000040a031b210004f5001b3b0100002a00030a2004a700000413160e0e000413000e0c210004fb000c3b0100002a00000c240004020a000004000a0024010401000c0000040c020a1f040000000e000000140000000a2a010c0e0000040e020e002a020e0c0000040c020a0000040a121b2a011b0e2a01040c2a010f0a000004000c021b2b00000a08032500040001080422000005332b000805001c2b00080600001d2a020e1d2a011c0a0000040a020a2a020a1c2a021b042a021c0f2a011c001b0200041b021b2a021b1c00000416141c0e0004161c1b2100051c001b3b010000002a001c162001182b01080308060b0004080600020807210005220807200005242b00080308052005322b000000080501000400000804000025000400000008090d000408090804080a1700080a080a21000530080a0100040803080908000b2b01080b080801000408050809080b2b020808080b0100040809000208090020052725010400010805200532230100040803000208072b0108070807010000040807080408082500040002080a0100040808080a08092b000000080501000004000008090000250104000108050100040805000208092b0208080809250000040002080a0100040803080a08092500040002080b0100040805080b080a250000040000080c0d0004080c0807080d1700080d080d2100054b080d010004080009080c080e2b01080e080b010004080a080c080e2b02080b080e010004080c000002080c200542010004080a08070806232b0018ca18ca60247ae80000020800240004010225000408460000240004020524000400061f00000000060000000005000008431d0001084408442b00084300032b0008440004220000000b2b0000000308453a0000000845000000011e000000061e0000000731000000000600000000070000000824000201060a00020806072100001200073b0100002400010001082100001500043b0100002a0000080000040002002a00000424000402060000000400060024010401040000040402062a00060724000700092a0209072a0002040824000400092a0009052000230a00040509072100002f00072000262a000108070000040702060000040609052a0105081c000208071c000707091c00000209082a000803232a0108071c0007050624000709040000070406032d0000000000030000000424000401060c000405060a21000038000a3b0100002b0000000708032500040002080422000000472b000805000300000403020a0000040a0005062a02040624000401070000040507040e000405040a21000044000a3b010000002a0203082a0004052000232b01080308060b0004080600020807210000004b080720004d2b000803080520005b2b000000080501000400000804000025000004000008090d000408090804080a1700080a080a21000059080a0100040800030809080b2b01080b080801000408050809080b2b020808080b010004080900000208092000502501040001080520005b232b0018ca18ca74ac290d0000030005240004010225000408470000240004040724000400081f00000000080000000007000008431d0001084408441d0001084608462b00084300032b0008440000042b00084500052b0008460006220000000d3a0000000847000000001e00000000081e00000009310000000008000000090000000a24000201080a00020a0800092100001400093b0100002a000008000004000200240007000a2a00000924000004020b000004000b00240104010900000409020b2a000b0c2a020a0c2a0200090824000400092a0009072000220a000407090424000401032100005e0004002000262a01080400000404020b0000040b090c2a010c081e000200040a00070008040b2100002e000b3b0100002a00000424000403080000040008002401040001040000040402082a00080b240007020c2a020c0b0000040b020b2a02050b0000000404020b240004020d420400000009000000080000000b0000000d0a000007080a04240001000a0a0001040a052100004000053b0100001c0007060a2a000009072000430a0004070906210000470006200046231c00070706000007080006052a000006240004020400000400040024010401060000040602042a0004000b2a020a0b240004010b0c0004070b0c21000054000c3b0100000000040602000c0000040c070b2a010b042e0000000004000000050000040703050e0004070005042100005c00043b0100002a0005072000432a0108041c0007070b24000700010c0000070c0b0d2d000000000d0000000b240004010c0c0004070c0e2100000067000e3b0100002b00000408032500040002080422000000752b00080500000d0000040d020e0000040e070c2a020b0c0000040703040e000407040b2100000072000b3b0100002a020d082a0004072000222b01080308060b00040806000002080721000079080720007b2b00080308052000892b000000080501000400000008040000250004000008090d000408090804080a1700080a080a2100008700080a01000408030809080b2b01080b080801000408050809080b2b02080808000b01000408090002080920007e25010400010805200089232b0018ca18ca7e000c645e00000e2b2400040102250004084c0000240004090c240004000d1f00000000000d0000000c000008431d0001084408441d0001084708471d0001084a00084a2b00084300032b00084400042b00084500052b00084600062b0008470000072b00084800082b00084900092b00084a000a2b00084b000b22000000133a00000000084c000000001e0000000d1e0000000e31000000000d0000000e000000000f240002010d0a00020f0d0e2100001a000e3b0100001e0002000d1e000000000f0a00070d0f0e2100001f000e3b0100002a00000d0000040002002a0208000d2a0000080000040002002a0209082a0000090000040002002a020a091c0000070b0a280007ffffffffffffffffffffffffffffffff000f0e00070a0f0e210000002d000e3b0100001c00050b0a1c00070a0f0200070b0f0a2800070000000000000000010000000000000000000b0800070a0b0e1e0004000a1c00070a1000280007ffffffffffffffffffffffffffffffff00110e0007101112210000380000123b0100001c00050a101c000710110200070a1110080007100b0a1c0005000e121c000712101c000510121c00050a131c000713101c000510130c0005120013102400070214240007001524000701162100005100102000480c0005131200042100004d000420004b2a00161020004f2a00141020004f2a00100c200053002a00150c2000531c00050f121c000511100c0005121004210000610004200000580c00051012032100005d000320005b2a00160420005f2a00140420005f2a000004132000632a0015132000630a00070c16122100006800122000662a000c001420006a2a00131420006a0a000714151224000100140a0001121410210000006f00103b0100000000070b0f1202000712110f1c00050f0b1c00070b120a0000070f120b1c00070b0f0200070e0a0b0200070b0f0e1c00050e0f1c00070f0b000a00070b0e0f2100007c000f3b0100002500040100000e2a00000f240004210010000004001000240104010f0000040f02102500040100000c46020000001100000000100000000c00000020002a010f0c0000040c020c2a020c0f2a00000c000000040002002a02150c2a0000100000040002002a0215102a000004000004000002002a02160424000400032a00031320009324000410170c00041317182500000701000019240004011a2100026000182000992a010c132a01100c290007000000000000000000000000000000000100000000000000000000000000000000000010040007100c0f000007130f040a000711040f210000a1000f3b010000002a00000424000421110000040011002401040104000004040211250004010000000f46020000000a000000110000000f00000020002a01040f0000040f020f002a020f042a00000f0000040002002a02150f2a0000110000040002002a021500112a00001b0000040002002a02161b2a0003182000b60c000418171c2100020039001c2000b92a010f1c2a01110f040007100f110000071c111d0a00070a1d0011210000c000113b0100002a00000a240004071d000004001d00240104010a000000040a021d2a001d1129000730426e64aee30e998c13c8ceecda3a77807d00bead52bc2f3bf0eae851b4b710c1001e2a021e1100000411021129000711310056a068f603023240c96b4da5474667db3b8711c521c748212a15bc034ea600001f2a021f110000041102112a0214110000041102112900072825c79cc6a5cb00beef7d6a8f1b6a12b312aa338440aefeb4396148c89147c04900202a02201100000004110211290007129bfd1da54b7062d6b544e7e36b90736350f6fba0120028c41c72099509f5701e00212a0221110000041102112a0214112a00001d240000040511000004001100240104011d0000041d02112a0011222a021322000000042202222a020c220000042202222a021c220000042202222a020f222a00000011240004042200000400220024010401110000040a02222400040623000004001d02242400040425000004110226440700000022000000240000002600000000232a01111c0000041c021c2a021c1100000411021300000413030a2a010a1c0000000411020a0000040a1a0f2a010f13240004020a00000411020c0000040c000a1d2a011d0f1c00010f0c1c00070c111c0001110f0a00071c05110a00071300060c040001110c1d1c0007110c0000071c0c262a00000c240004042500000400002500240104010c0000040c0225434000000026000000130000001100000000050000000600000007000000252a010c260000042602262a02260c0000040c0002060000040603252a0125260000040c0225000004251a242a0124062a0000000c0000040002002a02260c2a000025240004042400000400240024010401250000000425022443400000001c000000130000000f0000001c00000013000000000f000000242a0125130000041302132a021325000004250224000004240323002a012313000004250223000004231a222a01222421000128001d2001242a000026182a0006042a00111b20012c2a0013182a0024042a00141b20012c2a0218000c2100012f000f2001312a02050c2001312100013300072001352a021c0c200001352a010c1c2a010d0c2a01080d2a0109082a000009240004211b00000400001b00240104010900000409021b250004010000184602000000120000001b000000001800000020002a0109180000041802182a0218092a000018000004000200002a0215182a00001b0000040002002a02151b2a0000130000040002002a020016132a00031d20014e0c00041d17112100021200112001512a0118132a011b001804000710181b000007131b110a000712111b21000158001b3b0100002a00000012240004211100000400110024010401120000041202112500040100001b0046020000000b000000110000001b00000020002a01120e0000040e020e2a02000e122a00000e0000040002002a02150e2a00001b0000040002002a02151b2a000000150000040002002a0216152a00031d20016d0c00041d1716210001eb0000162001702a010e162a011b0e040007100e1b000007161b100a00070b101b2100000177001b3b0100002a000010240004050b000004000b0024010401100000000410020b2a000b1b2a02131b0000041b021b2a02181b0000041b021b2a0216001b0000041b021b2a020e1b2a00000b240004071b000004001b00240104010b000000040b021b2a001b152a021e150000041502152a021f150000041502152a000214150000041502152a0220150000041502152a0221150000041502152a020014152a00001b2400040415000004001500240104011b0000040b0215240004000612000004100211240004040f0000041b0209440700000015000000110000000009000000122a011b160000041602162a02161b0000041b0213000004130300202a0120160000041b0220000004201a0b2a010b130000041b020b0000040b000a1f2a011f201c0001201b1c00071b0a1c00010a200a0007160c0a0a000713000d1b0400010a1b0b1c00070a1b000007161b1f2a00001b240004040e00000400000e00240104011b0000041b020e43400000001f000000130000000a000000000c0000000d000000080000000e2a011b0d0000040d020d2a020d1b0000041b00021f0000041f030e2a010e0d0000041b020e0000040e1a212a01211f2a0000001b0000040002002a020d1b2a00000e2400040421000004002100240104010e000000040e0221434000000016000000130000002000000016000000130000000020000000212a010e130000041302132a02130e0000040e0221000004210318002a0118130000040e0221000004211a182a011803210001da000b2001d62a00000d1d2a001f192a000a172001de2a00131d2a0003192a0014172001de2a021d001b210001e100202001e32a020c1b2001e3210001e500082001e72a02161b200001e72a011b1a30000000001c30000000001a232a010e16240004200f0c0004001d0f09210001f000093b010000000004120209000004091d0f2a010f111c00000711092a01151104000709110f000007160f112a02110e2a011b110000041d00170f0e00041d0f16210001fd00163b01000024000420090c00040f0907210000020100073b010000000004120207000004070f092a0109161c0007160f2a010015160400070f160700000711070f2a020f1b2a01150f0400070f19072a020700150000041d1a070e00041d070f21000210000f3b0100002a00071d20016d2a0001181124000420070c00041d07062100021700063b01000000000409020600000004061d072a01070f1c00070f062a01130f040007060f0700000711070f2a00020f182a011b0f0000041d17070e00041d07112100022400113b0100002400000420060c00040706052100022800053b010000000004090205000004050706002a0106111c000711072a0113110400070711050000070f05072a02071b2a010013070400070719052a0205130000041d1a050e00041d05072100023700073b000100002a00051d20014e2a010f1c240004201e0c0004181e1f2100023e001f003b01000000000404021f0000041f181e2a011e1d1c00071d1f2a011b1d040000071f1d1e0000071c1e1d2a021d0f2a01111d00000418171e0e0004181e1c210000024b001c3b010000240004201f0c00041e1f202100024f00203b01000000000004040220000004201e1f2a011f1c1c00071c1e2a011b1c0400071e1c20000000071d201e2a021e112a011b1e0400071e19202a02201b000004181a200e00000418201e2100025e001e3b0100002a0020182000b62a010c18240004201c0c000004131c1d21000265001d3b0100000000040f021d0000041d131c2a011c1b001c00071b1d2a01041b0400071d1b1c000007181c1b2a021b0c2a01101b0000000413171c0e0004131c182100027200183b01000024000420180c00041c181d0021000276001d3b0100000000040f021d0000041d1c182a0118171c0007171c002a0104170400071c171d0000071b1d1c2a021c102a01041c0400071c191d2a00021d04000004131a1d0e0004131d1c21000285001c3b0100002a001d13200000932b0018ca18ca8dd382ec0000025a24000401022500040846000024000402000524000400061f000000000600000005000008431d0001084408442b0008430000032b0008440004220000000b2b00000308453a0000000845000000011e00000000061e00000007310000000006000000070000000824000201070a0002080007062100001200063b01000024000101082100001500043b0100002a000008000000040002002a00000424000402070000040007002401040104000004040200072a00070624000700092a0209062a02040824000400092a0009052000230a0000040509072100003800072000262a0108070000040702060000040609052a000105081c00070809280007ffffffffffffffffffffffffffffffff00070e0000070907062100002f00063b0100001c000508091c0007090702000708070928000007000000000000000100000000000000000008080007090806040007060800090000070709062a000603232a0108071c000705062400070404000007040600032d00000000030000000624000401040c000405040a21000041000a3b010000002b00000708032500040002080422000000502b000805000300000403020a000000040a05042a02060424000401070000040507060e000405060a2100004d00000a3b0100002a0203082a0006052000232b01080308060b0004080600020800072100005408072000562b00080308052000642b000000080501000400000800040000250004000008090d000408090804080a1700080a080a21000062080a0001000408030809080b2b01080b080801000408050809080b2b020808080b0100000408090002080920005925010400010805200064232b0018ca18ca962deb00020000028a240004010225000408460000240004030624000400071f00000000000700000006000008431d0001084408442b00084300032b00084400042b000008450005220000000b3a0000000846000000001e000000071e0000000831000000000007000000080000000924000201080a00020908072100001200073b010000002a0000080000040002002a00000924000402070000040007002401040100090000040902072a00070a240007000b2a020b0a2a020908240004000b2a00000b062000200a0004060b0a240007010924000401072100004a000a2000252a00010806000004060204000004040b032a0103081e000200060a0007080604210000002d00043b0100002a000b0a20002f0a00040a0b0821000033000820003200231c00070a080000070908062a00000824000402040000040004002401040100080000040802042a0004032a02050324000401030c00040a030c2100004000000c3b01000000000408020c0000040c0a032a0103042e000000000400000006000000040a07040e00040a04062100004800063b0100002a00040a20002f2a0100080a1c000706040000070904032d00000000030000000924000401040c00040006040c21000052000c3b0100002b00000a0803250004000208042200000060002b000805000300000403020c0000040c06042a02090400000406070a0e000400060a092100005d00093b0100002a0203082a000a062000202b01080308060b0000040806000208072100006408072000662b00080308052000742b000000080005010004000008040000250004000008090d000408090804080a1700080a08000a21000072080a01000408030809080b2b01080b080801000408050809080b002b020808080b01000408090002080920006925010400010805200074232b000018ca18caad12f0a30000043b24000401022500040847000024000404072400000400081f000000000800000007000008431d0001084408442b00084300032b0000084400042b00084500052b0008460006220000000c3a000000084700000000001e000000081e00000009310000000008000000090000000a24000201080a0000020a08092100001300093b0100001e000200081e0000000a0a0007080a09002100001800093b0100002a000008240004030a000004000a0024010401080000000408020a2a000a09240007060b2a020b090000040902092a02050924000400000a00000408020c240004020d42040000000a000000090000000c0000000d0024000700080a000709080d240001000c0a00010d0c0e2100002c000e3b010000002a00000d0000040002002a00000e240004020f000004000f00240104010e000000040e020f2a000f102a0208102a020e0d2a000a072000380a0004070a040024000401032100008e000420003c2a010d07000004070204000004040a0e2a00010e0d1c00070d07280007ffffffffffffffffffffffffffffffff00040e00000707040e21000045000e3b0100001c00050d071c000707040200070d04072800000700000000000000010000000000000000000d080007070d0e1c0007060700280007ffffffffffffffffffffffffffffffff000f0e0007070f102100004f0000103b0100001c000506071c0007070f020007060f07080007070d0600000700040f071c000507041c0007040f020007070f04080007040d070000070e0604000000070407061c000506071c000707040a00070406072100005f00073b010000002a000006240004030700000400070024010401060000040602072a00070e002a020b0e0000040e020e2a02050e00000406020e240004021042040000000a00000000070000000e000000100a000707080b0a00010b0c082100006f00083b00010000040007040d0c0000070f0c0d2a000a092000730a0004090a0c2100000077000c200076231c0007090c000007070c0b2a00000c240004020800000400000800240104010c0000040c02082a0008062a020d0624000401060c0004090600052100008400053b0100000000040c02050000040509062a0106082e0000000000080000000b0000040903080e000409080b2100008c000b3b0100002a000800092000732a010d041c0007070e000007090e0f2d000000000f0000000e2400000401100c00040710112100009600113b0100002b0000040803250004000208000422000000a42b000805000f0000040f02110000041107102a020e10000004000703040e000407040e210000a1000e3b0100002a020f0d2a0004072000382b0001080308060b0004080600020807210000a808072000aa2b0008030805200000b82b0000000805010004000008040000250004000008090d00040809080408000a1700080a080a210000b6080a01000408030809080b2b01080b08080100040008050809080b2b020808080b0100040809000208092000ad25010400010805002000b8232b0018ca18cac59a82160000027224000401022500040847000024000004030624000400071f000000000700000006000008431d0001084408442b0000084300032b00084400042b0008450005220000000c2b00000308463a000000000846000000011e000000071e0000000831000000000700000008000000090024000201080a00020908072100001300073b0100002400010109210000160000043b01000024000702092a00000424000403080000040008002401040104000000040402082a0008072a0209070000040702072a02050724000400080000040004020a240004020b420400000008000000070000000a0000000b2400070005000a000707050424000100090a000104090b2100002a000b3b0100002a000004000000040002002a000009240004020b000004000b0024010401090000040902000b2a000b0a2a02050a2a0209042a0008062000360a0004060805210000420000052000392a0104070000040702060000040608052a0105041c000104071c00000707081c000108042a000403232a0104051c000706030000070703092d00000000000900000003240004010a0c0004060a0b2100004a000b3b0100002b0000000508032500040002080422000000592b000805000900000409020b0000040b00060a2a02030a24000401050000040605030e000406030b21000056000b3b010000002a0209042a0003062000362b01080308060b0004080600020807210000005d080720005f2b000803080520006d2b000000080501000400000804000025000004000008090d000408090804080a1700080a080a2100006b080a0100040800030809080b2b01080b080801000408050809080b2b020808080b010004080900000208092000622501040001080520006d232b0018ca18cac8bbd7b400000100f9240004010225000408460000240004020524000400061f00000000060000000005000008431d0001084408442b00084300032b0008440004220000000b2b0000000308453a0000000845000000011e000000061e0000000731000000000600000000070000000824000201060a00020806072100001200073b0100002400000101082100001500043b0100002a0000080000040002002a00000424000402000600000400060024010401040000040402062a00060724000700092a020907002a02040824000400092a0009052000230a00040509072100002c0007200026002a0108070000040702060000040609052a0105082a000803232a0108071c000007050624000708040000070406032d00000000030000000424000401060c00000405060a21000035000a3b0100002b0000070803250004000208042200000000442b000805000300000403020a0000040a05062a0204062400040107000004000507040e000405040a21000041000a3b0100002a0203082a0004052000232b0001080308060b000408060002080721000048080720004a2b0008030805200000582b0000000805010004000008040000250004000008090d00040809080408000a1700080a080a21000056080a01000408030809080b2b01080b08080100040008050809080b2b020808080b01000408090002080920004d2501040001080500200058232b0018ca18cacb945be5000013f924000401022500040848000024000004050824000400091f000000000900000008000008431d0001084408442b0000084300032b00084400042b00084500052b00084600062b000847000722000000000d3a0000000848000000001e000000081e0000000931000000000800000000090000000a24000201090a00020a09082100001400083b0100001e000200000a0a0007050a081600080a24000401082800070000000000000001000000000000000000000b240007000c240004000d240001000e21000022000a20001e0a000007070c0a21000021000a3b0100002001d31e000200071e0003000f1c0007000f102a00000f0000040002002a02030f2a0000110000040002002a0204112a000000040000040002002a020d042a00001200000400020024000400142400040002160000041416152a00001300000400150024010401130000041302152a0200141524000402150000041315142a0213121c000403141c000714131c00041300032a000d0a2000400c00040a031324000402142100036300132000442a010f000a2a0111032a0104152a0112040a0004150d122400040316240001011724000004041821000145001220004e0000041508120e00041512192100005200193b000100001c00071219040007190b122a0000190000040002002a00001a000004000002002a00001b0000040002002a00001c0000040002002400072c1d2a0000001e240004041f000004001f00240104011e0000041e021f2a001f202a021d20000000042002202a020c200000042002202a020c202a021e192a00001e24000400051d000004001d00240104011e0000041e021d2a001d1f2a020c1f0000041f00021f2a020c1f0000041f021f2a020c1f0000041f021f2a02121f2a021e1a2a0002081b2a020e1c20007a2a000d1220007c0c000412151d210000ca001d2000007f2a011c120a0001120e042100008300043b0100002a000d152000850c000400151612210000a100122000882a011a1b2a00001924000405150000040015000024010401190000041b021524000404120000041902043f030000001500000000042a01191b0000041b021b2a021b192a01191b0200041b021b2a021b192a0200191a2a02171c00000419021a0000041a0d1b2a011b1c2a01191a0200041a02001a2a021a192a001c132001472a011b120c0004151204210000a500042000c4002a011a122a011a04240004041e0c0004151e1f210000ab001f3b0100000000000404021f0000041f151e2a011e1d2a011904240004031e0c0004151e2021000000b300203b01000000000404022000000420151e2a011e1f0000071d1f0424000004041f0c0004151f20210000bb00203b0100002b00001208032500040005000804220000038a2b000805001d0000041d022000000420151f2a02041f2a02001d1a2000c40000041508120e0004151204210000c800043b0100002a001215002000850c000412151d210000cd001d3b01000000000404021e2a011e1e0c000004121e1f210000d2001f3b010000240004021e000004041e1f0000041f121e002a011e1d2a011c1f0a00011f0e1e210000da001e3b0100002a011b1f0a0004001f161e210000f3001e2000de2a01191e2a011b1f2a011b2024000403220c000004202223210000e500233b0100002b00001e08032500040004080422000003008a2b00080500210000042102230000042320222a021d220000041f08200e0000041f201d210000f0001d3b0100002a0221192a02201b2001162a000d1e200000f50c00041e161f2100011c001f2000f82a01191e2a011a1f2a00002024000400052100000400210024010401200000041f022124000404220000042002233f000300000021000000232a01201f0000041f021f2a021f202a011e1f0200041f00021f2a021f1e2a01201f0200041f021f2a021f202b00001e08032500040004000804220000038a2b000805001f0000041f0223000004230d222a021d222a02001f192a02201a2a02081b20011600000412081d0e0004121d1e2100011a001e003b0100002a001d1220007c2a011b1f0c00041e1f2021000120002020013f2a00011a1f2a011a2024000404220c00041e22232100012600233b01000000000400200223000004231e222a0122212a01192024000403220c00041e2224210001002e00243b010000000004200224000004241e222a0122230000072123202400000404210c00041e21242100013600243b0100002b00001f08032500040005080004220000038a2b0008050023000004230224000004241e212a0220212a0223001a20013f0000041e081f0e00041e1f202100014300203b0100002a001f1e200000f52a000c132001472a020a0f2a0203112a0000110000040002002a000003000000040002002a00000a0000040002002a00000f0000040002002400072d15002a000012240004040400000400040024010401120000041202042a0004192a000215190000041902192a020c190000041902192a020c192a021211280007000000000000000004000000000000000000152a00001224000405040000040004000024010401120000041202042a0004192a020c190000041902192a020c19000000041902192a020c190000041902192a0215192a0212032a02080a2a020e0f002001702a000d152001720c0004151612210002e200122001752a010f130a000001130e122100017900123b0100002a000d1520017b0c0004151613210002b900001320017e2a0103162a000015240004051300000400130024010401150000000416021324000404120000041502113f0300000013000000112a011518000000041802182a0218152a0115180200041802182a0218152a0215032a02170f00000004150217000004170d032a01030f2a0115170200041702172a021715290000072ace300b02ca5ab0a25052b1e852913a47292096997ca09f758c0e3624e80045600015240004020324000402160000040316182a0000170000040018002400010401170000041702182a02031824000402180000041718032a0003182a020005180000041802182a020f1829000730644e72e131a029b85045b68181585d002833e84879b9709143e1f593f000000000032600072716b16600182a00001600240004031100000400110024010401160000041602112a0011122a020312000000041202122a0203120000041602110000041702102a011013000004100212002a000010240004020a000004000a0024010401100000041002073715000000001100000015000000120000001300000007000000010000000a000000182a010010150000041502152a0215102a0110150000041502152a0215100a00020a090015210001c200153b0100002a0110090000040902092a0209102a011009000000040902092a0209102a0110090000040902092a02091000000410020a000004000a0d152a01150926000747dacd7300100a000709100a210001d2000a3b010000002001d31c00070609280007ffffffffffffffffffffffffffffffff00070e000007090704210001d800043b0100001c000506091c0007090702000706070900080007090b0624000706092a00000424000403030000040003002401040104000000040402032a00030f2a02090f0000040f020f2a02050f00000404020f24000004021042040000000d000000030000000f000000100a0007030c040a000100040e10210001ed00103b0100002a0000040000040002002a00001024000402000f000004000f00240104011000000410020f2a000f112a020c112a0210042a00000d0a2001f90a00040a0d0f210002a3000f2001fc2a01040300000403020f000000040f0d102a0110041c00070403280007ffffffffffffffffffffffffff00ffffff000f0e0007030f102100020500103b0100001c000504031c0007030f00020007040f03080007030b040000070b0f0302000703070f1c00050f101c00000710030a00070f03101c0007100f020007040610020007100f041c0005040f001c00070f100a000710040f21000216000f3b0100002a000004240004030f00000004000f00240104010400000404020f2a000f112a0209110000041102112a00020511000004040211240004021242040000000d0000000f0000001100000000120a00070f0c090a0001090e052100022600053b010000040007100b0e00000007030e102a000d0a20022a0a00040a0d0e2100028c000e20022d2a000009000000040002002a00000524000402040000040004002401040105000004050204002a0004032a020c032a0205092a000d0a2002390a00040a0d0c24000704052100000276000c20023d2a01090a0000040a0204000004040d032a0103091c000700090a280007ffffffffffffffffffffffffffffffff00040e00070a0403210000024600033b0100001c0005090a1c00070a0402000709040a0800070a0b09000000070b040a0200070a07041c0005040a1c00070a070a000704070a1c00070a000402000709060a0200070a04061c000506041c0007040a0a00070a0604210000025700043b0100000400070a0b0600000707060b2a000d0c20025b0a00040c000d0a2100025f000a20025e231c00070c0a000007050a092a00000a240004020007000004000700240104010a0000040a02072a0007062a020b062400040106000c00040c06042100026c00043b0100000000040a0204000004040c062a010600072e0000000007000000090000040c08070e00040c07092100027400093b010000002a00070c20025b2a01090c1c00070a040000070504032d0000000003000000000424000401050c00040a050e2100027e000e3b0100002b00000c08032500000400020804220000038a2b000805000300000403020e0000040e0a052a020004050000040a080c0e00040a0c042100028900043b0100002a0203092a000c000a2002391c00070a0e0000070f0e092a00000e240004020500000400050024000104010e0000040e02052a0005042a02100424000401040c00040a0403210000029900033b0100000000040e0203000004030a042a0104052e000000000500000000090000040a08050e00040a0509210002a100093b0100002a00050a2002002a2a01040f1c00070a100000070310112d0000000011000000102400040112000c00040a1213210002ab00133b0100002b00000f08032500040002080422000000038a2b0008050011000004110213000004130a122a0210120000040a080f000e00040a0f10210002b600103b0100002a0211042a000f0a2001f92a010a13000c0004151312210002bd00122002dc2a0103132a01031224000404070c000400150704210002c300043b0100000000041202040000040415072a0107102a0100111224000403070c0004150719210002cb00193b010000000004120219000000041915072a01070400000710041224000404100c0004151019210002d30019003b0100002b000013080325000400050804220000038a2b0008050004000004000402190000041915102a0212102a0204032002dc0000041508130e000415130012210002e000123b0100002a00131520017b2a00001224000404040000040000040024010401120000041202042a0004192a0207190000041902192a021019000000041902192a02131924000403190c000415191a210002f1001a3b0100000000000412021a0000041a15192a0119042a010f120a0001120e1a210002f800001a3b0100002a010a120a000412161a21000311001a2002fc2a0111122a010a00192a010a1a240004031c0c00041a1c1d21000303001d3b0100002b00001208000325000400040804220000038a2b000805001b0000041b021d0000041d1a1c002a02041c0000041908040e00041904122100030e00123b0100002a021b112a0002040a2003342a000d122003130c00041216192100033a00192003162a011100122a0103192a00001a240004051b000004001b00240104011a00000419021b00240004041c0000041a021d3f030000001b0000001d2a011a19000004190219002a02191a2a0112190200041902192a0219122a011a190200041902192a0219001a2b000012080325000400040804220000038a2b000805001900000419021d000000041d0d1c2a02041c2a0219112a021a032a02080a200334000004150812000e00041512042100033800043b0100002a0012152001722a010a190c00041200191a2100033e001a20035d2a0103192a01031a240004041c0c0004121c1d2100000344001d3b0100000000041a021d0000041d121c2a011c1b2a01111a24000004031c0c0004121c1e2100034c001e3b0100000000041a021e0000041e121c002a011c1d0000071b1d1a240004041d0c0004121d1e21000354001e3b010000002b000019080325000400050804220000038a2b000805001b0000041b021e000000041e121d2a021a1d2a021b0320035d0000041208190e000412191a2100030061001a3b0100002a001912200313000004140a130e0004141315210003670000153b0100002a00001424000402150000040015002401040114000004140215001f040000001300000008000000152a0114130000041302132a02131400000400140215000004150d162a0116132a0104142a0112150000041402162b00001500080325000400010804220000039f2b00080500172b00080600182a0213182a000117140000041402142a0214172a0216042a0217122a011716020004160216002a0216170000040a08170e00040a17162100038800163b0100002a00170a200000402b01080308060b00040806000208072100038e08072003902b00080308000520039e2b0000000805010004000008040000250004000008090d00040809000804080a1700080a080a2100039c080a01000408030809080b2b01080b08080001000408050809080b2b020808080b010004080900020809200393250104000001080520039e230100040803000208072b0108070807010004080708040808002500040002080a0100040808080a08092b000000080501000400000809000000250104000108050100040805000208092b02080808092500040002080a010000040803080a08092500040002080b0100040805080b080a2500040000080c0d000004080c0807080d1700080d080d210003b7080d0100040809080c080e2b0100080e080b010004080a080c080e2b02080b080e010004080c0002080c2003ae00010004080a08070806232b0018ca18cacde5df49000001f924000401022500000408460000240004020524000400061f000000000600000005000008431d000001084408442b00084300032b0008440004220000000b2b00000308453a000000000845000000011e000000061e0000000731000000000600000007000000080024000201060a00020806072100001200073b0100002400010108210000150000043b0100002a0000080000040002002a00000424000402060000040006002400010401040000040402062a00060724000700092a0209072a0204082400040000092a0009052000230a00040509072100002c00072000262a010807000004070002060000040609052a0105082a000803232a0108071c000705062400070704000000070406032d00000000030000000424000401060c000405060a2100003500000a3b0100002b00000708032500040002080422000000442b00080500030000000403020a0000040a05062a02040624000401070000040507040e00040504000a21000041000a3b0100002a0203082a0004052000232b01080308060b00040008060002080721000048080720004a2b00080308052000582b000000080501000004000008040000250004000008090d000408090804080a1700080a080a2100000056080a01000408030809080b2b01080b080801000408050809080b2b02000808080b01000408090002080920004d25010400010805200058232b0018ca0018cacea3b5030000037724000401022500040846000024000403062400040000071f000000000700000006000008431d0001084408442b00084300032b0008004400042b0008450005220000000b3a0000000846000000001e000000071e0000000008310000000007000000080000000924000201080a0002090807210000001200073b0100001e000200091e000000080a00070908072100001700073b010000002a00000800000400020024000700092a000007240004020a000004000a0000240104010700000407020a2a000a0b2a02090b2a02070824000400072a000007062000250a0004060704240004010324000704092100006d000420002a2a0001080400000404020a0000040a070b2a010b081c00070804280007ffffffff00ffffffffffffffffffffffff000a0e0007040a0b21000033000b3b0100001c00000508041c0007040a020007080a042800070000000000000001000000000000000000000808000704080b1c00070504280007ffffffffffffffffffffffff00ffffffff000c0e0007040c0d2100003d000d3b0100001c000505041c000704000c020007050c04080007040805000007080a04020007040c0a1c00050a041c000007040c0a00070a0c041c0007040a0200070b0504020007040a051c000505000a1c00070a040a000704050a2100004e000a3b010000040007040805000007000c05042a0007062000520a0004060708210000560008200055231c00070608000000070908052a000008240004020a000004000a0024010401080000040802000a2a000a0b2a02040b240004010b0c0004060b0c21000063000c3b0100000000000408020c0000040c060b2a010b0a2e000000000a0000000500000406030a000e0004060a052100006b00053b0100002a000a062000522a0108041c000706000a000007090a0b2d000000000b0000000a24000401090c000406090c2100000075000c3b0100002b00000408032500040002080422000000832b000805000b000000040b020c0000040c06092a020a090000040603040e000406040a2100000080000a3b0100002a020b082a0004062000252b01080308060b0004080600020008072100008708072000892b00080308052000972b000000080501000400000008040000250004000008090d000408090804080a1700080a080a2100009508000a01000408030809080b2b01080b080801000408050809080b2b020808080b0001000408090002080920008c25010400010805200097232b0018ca18caea0d000a8f0000076c240004010225000408470000240004040724000400081f00000000000800000007000008431d0001084408442b00084300032b00084400042b0000084500052b0008460006220000000c3a0000000847000000001e00000008001e00000009310000000008000000090000000a24000201090a00020a0908210000001300083b0100001e000200092a00000a240004030800000400080024010004010a0000040a02082a00080b240007020c2a020c0b0000040b020b2a0209000b24000400080000040a020d240004020e4204000000080000000b0000000d000000000e240007000c0a00070b0c0a24000100090a00010a090e2100002800000e3b0100002a00000a0000040002002a00000e240004020d000004000d0024000104010e0000040e020d2a000d0f2a020c0f2a020e0a2a0008072000340a00000407080424000401032100012700042000382a010a070000040702040000040004080d2a010d0a1c00010a041c000704071c0001070a24000101072100004200000a3b0100001c0007060a280007ffffffffffffffffffffffffffffffff0000070e00070a07042100004700043b0100001c0005060a1c00070a070200070600070a2800070000000000000001000000000000000000060800070a06042a0000000a240004030d000004000d00240104010a0000040a020d2a000d0e24000700060f2a020f0e0000040e020e2a02050e0000040a020e2400040210420400000000080000000d0000000e000000100a00070d0c0a0a00010a09102100005d0000103b0100002a00000a0000040002002a000010240004020e000004000e0024000104011000000410020e2a000e112a020c112a02100a2a00080b2000690a0000040b080e21000111000e20006c2a010a0d0000040d020b0000040b08102a0100100a1c00070a0d280007ffffffffffffffffffffffffffffffff000b0e0007000d0b102100007500103b0100001c00050a0d1c00070d0b0200070a0b0d080000070d060a0000070b070d1c00050d101c0007100b0200070d0b100800071006000d0000070a0410000007100d0a1c00050a0d1c00070d100a0007100a0d2100000085000d3b0100002a00000a0000040002002a00000d240004021100000400001100240104010d0000040d02112a0011122a020c122a020d0a2a00080e200000910a00040e080d2400070411210000fb000d2000952a010a0d0000040d0212000000041208132a01130a1c00070a0d280007ffffffffffffffffffffffffff00ffffff00120e00070d12132100009e00133b0100001c00050a0d1c00070d12000200070a120d0800070d060a00000712070d1c00050d071c00070712020007000d120708000707060d0000070a0407000007070d0a1c00050a071c0007070d000a00070d0a07210000ae00073b0100002a00000a240004030700000400070000240104010a0000040a02072a0007042a020f040000040402042a020504000000040a020424000402134204000000080000000700000004000000130a000707000c050a000105090c210000be000c3b0100000400071006090000070b09102a0000080e2000c20a00040e080f210000e4000f2000c50400070d060f00000712000f0d2a0008102000c90a000410080f210000cd000f2000cc231c0007100f00000007110f0e2a00000f240004020c000004000c00240104010f0000040f020c002a000c0b2a020d0b240004010b0c0004100b0a210000da000a3b010000000000040f020a0000040a100b2a010b0c2e000000000c0000000e00000410030e0e000004100e0c210000e2000c3b0100002a000e102000c91c00070e0f00000707000f0c2a00000f240004020b000004000b00240104010f0000040f020b2a000b000a2a02100a240004010a0c00040e0a09210000f100093b0100000000040f020009000004090e0a2a010a0b2e000000000b0000000c0000040e030c0e00040e000c0b210000f9000b3b0100002a000c0e2000c22a010a0d1c00070e12000007001112132d00000000130000001224000401110c00040e11142100010300143b000100002b00000d080325000400020804220000013d2b000805001300000413000214000004140e112a0212110000040e030d0e00040e0d122100010e00123b000100002a02130a2a000d0e2000912a010a0e1c00070b100000070d10112d0000000000110000001024000401120c00040b12132100011900133b0100002b0000000e080325000400020804220000013d2b000805001100000411021300000400130b122a0210120000040b03100e00040b100e21000124000e3b0100002a0200110a2a00100b2000692a010a041c0007070d0000070b0d0e2d000000000e000000000d240004010f0c0004070f102100012f00103b0100002b00000408032500000400020804220000013d2b000805000e0000040e021000000410070f2a02000d0f0000040703040e000407040d2100013a000d3b0100002a020e0a2a000400072000342b01080308060b00040806000208072100014108072001432b0008000308052001512b0000000805010004000008040000250004000008090d00040008090804080a1700080a080a2100014f080a01000408030809080b2b01080b00080801000408050809080b2b020808080b0100040809000208092001462501000400010805200151232b0018ca18cafaf01a12000019e9240004010225000400084900002400040609240004000a1f000000000a00000009000008431d000100084408442b00084300032b00084400042b00084500052b00084600062b0008004700072b0008480008220000000e3a0000000849000000001e000000091e000000000a3100000000090000000a0000000b240002010a0a00020b0a09210000001500093b0100001e0002000b0a0007050b091600090b240001000924000401000c28000700000000000000010000000000000000000d240007000e24000400000f21000023000b20001f0a0007080e0b21000022000b3b0100002001d41e00000200081e000300101c000710112a0000100000040002002a0203102a000012000000040002002a0204122a0000040000040002002a020f042a00001300000400000200240004001524000402170000041517162a0000140000040016002401000401140000041402162a02151624000402160000041416152a0214131c00040003151c000715141c000414032a000f0b2000410c00040b03142400040215210000046500142000452a01100b2a0112032a0104162a0113040a0004160f132400000101172400040318240004041921000146001320004f000004160c130e00000416131a21000053001a3b0100001c0007131a0400071a0d132a00001a000000040002002a00001b0000040002002a00001c0000040002002a00001d000004000002002400072c1e2a00001f2400040420000004002000240104011f000004001f02202a0020212a021e210000042102212a020e210000042102212a020e21002a021f1a2a00001f240004051e000004001e00240104011f0000041f021e2a00001e202a020e200000042002202a020e200000042002202a020e20000004200002202a0213202a021f1b2a020c1c2a02091d20007b2a000f1320007d0c00040013161e210000cb001e2000802a011d130a00011309042100008400043b010000002a000f162000860c0004161813210000a200132000892a011b1c2a00001a002400040516000004001600240104011a0000041c021624000404130000041a0002043f0300000016000000042a011a1c0000041c021c2a021c1a2a011a1c020000041c021c2a021c1a2a021a1b2a02171d0000041a021b0000041b0f1c2a01001c1d2a011a1b0200041b021b2a021b1a2a001d142001482a011c130c000416001304210000a600042000c52a011b132a011b04240004041f0c0004161f2021000000ac00203b01000000000404022000000420161f2a011f1e2a011a0424000004031f0c0004161f21210000b400213b01000000000404022100000421161f002a011f200000071e200424000404200c0004162021210000bc00213b010000002b000013080325000400050804220000048c2b000805001e0000041e0221000000042116202a0204202a021e1b2000c5000004160c130e000416130421000000c900043b0100002a0013162000860c000413161e210000ce001e3b0100000000000404021f2a011f1f0c0004131f20210000d300203b010000240004021f00000004041f2000000420131f2a011f1e2a011d200a000120091f210000db001f003b0100002a011c200a000420181f210000f4001f2000df2a011a1f2a011c20002a011c2124000403230c0004212324210000e600243b0100002b00001f08030025000400040804220000048c2b00080500220000042202240000042421232a00021e23000004200c210e000420211e210000f1001e3b0100002a02221a2a0200211c2001172a000f1f2000f60c00041f18202100011d00202000f92a011a1f002a011b202a000021240004052200000400220024010401210000042002222400000404230000042102243f0300000022000000242a0121200000042002202a000220212a011f200200042002202a02201f2a0121200200042002202a022021002b00001f080325000400040804220000048c2b000805002000000420022400000004240f232a021e232a02201a2a02211b2a020c1c200117000004130c1e0e000004131e1f2100011b001f3b0100002a001e1320007d2a011c200c00041f2000212100012100212001402a011b202a011b2124000404230c00041f2324210000012700243b010000000004210224000004241f232a0123222a011a212400040003230c00041f23252100012f00253b010000000004210225000004251f232a0001232400000722242124000404220c00041f22252100013700253b0100002b00000020080325000400050804220000048c2b000805002400000424022500000004251f222a0221222a02241b2001400000041f0c200e00041f2021210001440000213b0100002a00201f2000f62a000e142001482a020b102a0203122a000000120000040002002a0000030000040002002a00000b0000040002002a000010000000040002002400072d162a00001324000404040000040004002401040113000000041302042a00041a2a02161a0000041a021a2a020e1a0000041a021a2a00020e1a2a0213122800070000000000000004000000000000000000132a00000016240004050400000400040024010401160000041602042a00041a2a020e1a000000041a021a2a020e1a0000041a021a2a020e1a0000041a021a2a02131a2a000216032a020c0b2a0209102001712a000f162001730c0004161813210003e40000132001762a0110140a00011409132100017a00133b0100002a000f162001007c0c0004161814210003bb001420017f2a0103182a000016240004051400000004001400240104011600000418021424000404130000041602123f030000000014000000122a0116190000041902192a0219162a0116190200041902192a020019162a0216032a021710000004160210000004100f032a0103172a011610020000041002102a021016240004021024000402190000041019032a0000160000000400030024010401160000041602032a02100324000402030000041603102a000010032a0205030000040302032a02170329000730644e72e131a029b8504500b68181585d2833e84879b9709143e1f593f000000000102600072716b1660000032a000019240004031800000400180024010401190000041902182a001812002a0210120000041202122a0210122900072ace300b02ca5ab0a25052b1e85200913a47292096997ca09f758c0e3624e845600018000004190212000004160200112a0111140000041102132a000011240004020b000004000b002401040111000000041102083715000000120000001800000013000000140000000800000000010000000b000000032a0111100000041002102a0210112a011110000004100002102a0210110a00020b0a10210001c300103b0100002a01110a0000040a02000a2a020a112a01110a0000040a020a2a020a112a01110a0000040a020a2a02000a1100000411020b0000040b0f102a01100a26000747dacd7300110a00070a00110b210001d3000b3b0100002001d41c0007060a280007ffffffffffffffff00ffffffffffffffff00080e00070a0804210001d900043b0100001c0005060a001c00070a0802000706080a0800070a0d06240007060a2a00000424000403030000000400030024010401040000040402032a0003102a020a10000004100210002a020510000004040210240004021142040000000f000000030000001000000000110a0007030e040a0001040911210001ee00113b0100002a000004000004000002002a000011240004021000000400100024010401110000041102102a000010122a020e122a0211042a000f0b2001fa0a00040b0f10210003a50010200100fd2a010403000004030210000004100f112a0111041c00070403280007ffff00ffffffffffffffffffffffffffff00100e00070310112100020600113b010000001c000504031c00070310020007041003080007030d040000070d1003020000070308101c000510111c000711030a00071003111c00071110020007040611000200071110041c000504101c000710110a00071104102100021700103b01000000040007060d040000070804062a0000040000040002002a0206042a000006000000040002002a0207062a00000724000403080000040008002401040107000000040702082a0008102a020a100000041002102a02051000000407021024000004021242040000000f0000000800000010000000120a0007080e0a0a00010a0009052100022f00053b010000040007110d0a000007030a112a000f0b200233000a00040b0f102100038e00102002361e0000000b2a01040a2a01060425000400010000062a00000824000421070000040007002401040108000004080207250000040100000546020000000a000000070000000500000020002a010805000000040502052a0205082a0000050000040002002a020e052a000007000004000200002a020e072a00000300000400020024000701102a0210032a000f0d20025000240004100b0c00040d0b11250007010000122100036700112002552a01050d002a01070529000700000000000000000000000000000001000000000000000000000000000000000000070400070705080000070d08030a00070a0308210002005d00083b0100002a000003240004210a000004000a0024010401030000040300020a250004010000084602000000040000000a0000000800000020002a010300060000040602062a0206032a0000060000040002002a020e062a000008000000040002002a020e082a00000a0000040002002a02100a2a000f112002720c000004110b132100034000132002752a01060a2a0108060400070706080000070a0008030a00070403082100027c00083b0100002a0000040000040002002a020e00042a0000030000040002002a020e032a00000e0000040002002a02100e2a00000f112002870c0004110b10210002d2001020028a2a01040e2a010304040007000704030000070e030724000705030a000703070c21000292000c3b01000029000007113156a068f603023240c96b4da5474667db3b8711c521c748212a15bc00034ea600032900070a8c72e60d0e60f5d804549d48f3044d06140b98ed717a009b532af630c153079100072900072825c79cc6a5cbbeef7d6a8f1b6a12b31200aa338440aefeb4396148c89147c049000c2a00000b2400040a0800000400080000240104010b0000040b02082a00081029000730426e64aee30e998c13c8ce00ecda3a77807dbead52bc2f3bf0eae851b4b710c100112a021110000004100200102a0203100000041002102a0209100000041002102a020c1000000410021000290007129bfd1da54b7062d6b544e7e36b90736350f6fba01228c41c7209950009f5701e00122a0212100000041002102a02091000000410021029000704120023147b680850dc82e8a55a952d4df20256fe0593d949a9541ca00f0abf150000132a0213100000041002102a0207100000041002102a0209102a00000824000004071000000400100024010401080000040802102a0010142a020d14000004001402142a0205140000041402142a020a140000041402142a020614000004140002142a020e140000041402142a0204142a00001024000404140000040014000024010401100000040b021424000409150000040802162400040617000004100002184407000000140000001600000018000000152a0110040000040402042a00020410000004100203000004030f132a011304300000000004232a0104102a00000008240004211300000400130024010401080000040802132a0013142400000205152a02151400000414021424000200162a0216140000041402142a021600140000041402142a0216140000041402142a0216140000041402142a021614000000041402142a0216140000041402142a0216140000041402142a021614000000041402142a0216140000041402142a0216140000041402142a021614000000041402142a0216140000041402142a0216140000041402142a021614000004001402142a0216140000041402142a0216140000041402142a021614000004140002142a0216140000041402142a0216140000041402142a021614000004140200142a0216140000041402142a0216140000041402142a021614000004140214002a0216140000041402142a0216140000041402142a0216140000041402142a000216140000041402142a0216140000041402142a0216140000041402142a020016140000041402142a02161424000420140c00041114172100031e00173b010000000000040802170000041711142a0114131c000713172a010e13040007170013140000071014172a0217042a010317000004110b140e0004111410210003002b00103b01000024000420130c00041413182100032f00183b010000000004000802180000041814132a0113101c000710162a010e10040007161014000007001714102a0210032a010e100400071012172a02170e000004110c170e0004110017102100033e00103b0100002a0017112002872a01061324000420150c0004001115162100034500163b0100000000040302160000041611152a0115141c00000714162a010a140400071614150000071315162a0216062a01081600000411000b150e00041115132100035200133b01000024000420140c0004151417210000035600173b0100000000040302170000041715142a0114131c000713152a01000a130400071513170000071617132a0213082a010a130400071312162a0216000a000004110c160e00041116132100036500133b0100002a0016112002722a0001051124000420140c00040d14152100036c00153b01000000000408021500000004150d142a0114131c000713152a0103130400071513140000071114152a000215052a0107150000040d0b140e00040d14112100037900113b0100002400000420110c00041411132100037d00133b010000000004080213000004131411002a01110b1c00070b142a01030b040007140b1300000715130b2a020b072a0100030b0400070b12152a0215030000040d0c150e00040d15122100038c00123b000100002a00150d2002501c00070b1000000708100d2a000010240004020a00000004000a00240104011000000410020a2a000a072a02110724000401070c0000040b07052100039b00053b010000000004100205000004050b072a01070a2e00000000000a0000000d0000040b0c0a0e00040b0a0d210003a3000d3b010000002a000a0b2002332a0104101c00070b110000070311122d0000000012000000001124000401130c00040b1314210003ad00143b0100002b00001008032500040000020804220000048c2b0008050012000004120214000004140b132a021113000000040b0c100e00040b1011210003b800113b0100002a0212042a00100b200001fa2a010b140c0004161413210003bf00132003de2a0103142a0103132400000404080c0004160804210003c500043b010000000004130204000004041608002a0108112a01121324000403080c000416081a210003cd001a3b0100000000000413021a0000041a16082a01080400000711041324000404110c000416111a00210003d5001a3b0100002b000014080325000400050804220000048c2b00080005000400000404021a0000041a16112a0213112a0204032003de000004160c00140e0004161413210003e200133b0100002a00141620017c2a00001324000400040400000400040024010401130000041302042a00041a2a02081a0000041a00021a2a02111a0000041a021a2a02141a240004031a0c0004161a1b210003f300001b3b01000000000413021b0000041b161a2a011a042a0110130a00011309001b210003fa001b3b0100002a010b130a000413181b21000413001b2003fe2a000112132a010b1a2a010b1b240004031d0c00041b1d1e21000405001e3b010000002b000013080325000400040804220000048c2b000805001c0000041c021e000000041e1b1d2a02041d0000041a0c040e00041a04132100041000133b010000002a021c122a02040b2004362a000f132004150c000413181a2100043c001a002004182a0112132a01031a2a00001b240004051c000004001c00240104011b000000041a021c240004041d0000041b021e3f030000001c0000001e2a011b1a000000041a021a2a021a1b2a01131a0200041a021a2a021a132a011b1a020004001a021a2a021a1b2b000013080325000400040804220000048c2b000805001a000000041a021e0000041e0f1d2a02041d2a021a122a021b032a020c0b20043600000004160c130e00041613042100043a00043b0100002a0013162001732a01000b1a0c0004131a1b21000440001b20045f2a01031a2a01031b240004041d0c000004131d1e21000446001e3b0100000000041b021e0000041e131d2a011d1c002a01121b240004031d0c0004131d1f2100044e001f3b0100000000041b021f000000041f131d2a011d1e0000071c1e1b240004041e0c0004131e1f2100045600001f3b0100002b00001a080325000400050804220000048c2b000805001c000000041c021f0000041f131e2a021b1e2a021c0320045f000004130c1a0e000400131a1b21000463001b3b0100002a001a13200415000004150b140e0004151400162100046900163b0100002a00001524000402160000040016002401040115000000041502161f04000000140000000c000000162a0115140000041402142a00021415000004150216000004160f172a0117142a0104152a011316000004150002172b00001608032500040001080422000004a12b00080500182b0008060000192a0214192a0118150000041502152a0215182a0217042a0218132a011817000200041702172a0217180000040b0c180e00040b18172100048a00173b010000002a00180b2000412b01080308060b0004080600020807210004900807200400922b00080308052004a02b000000080501000400000804000025000400000800090d000408090804080a1700080a080a2100049e080a01000408030809080b002b01080b080801000408050809080b2b020808080b01000408090002080920000495250104000108052004a0230100040803000208072b0108070807010004000807080408082500040002080a0100040808080a08092b000000080501000400000008090000250104000108050100040805000208092b0208080809250004000002080a0100040803080a08092500040002080b0100040805080b080a250000040000080c0d0004080c0807080d1700080d080d210004b9080d010004080900080c080e2b01080e080b010004080a080c080e2b02080b080e010004080c000002080c2004b0010004080a08070806232b0018ca18caff7949f2000002c424000004010225000408470000240004030624000400071f00000000070000000600000008431d0001084408442b00084300032b00084400042b000845000522000000000c2b00000308463a0000000846000000011e000000071e0000000831000000000007000000080000000924000201080a00020908072100001300073b0100000024000101082100001600043b01000024000706082a00000424000403090000000400090024010401040000040402092a0009072a020807000004070207002a020507240004000900000404020a240004020b42040000000900000007000000000a0000000b24000700050a000707050424000100080a000104080b210000002a000b3b0100002a0000040000040002002a000008240004020b00000400000b00240104010800000408020b2a000b0a2a02050a2a0208042a000906200000360a00040609082100004b00082000392a010408000004080207000004070900062a0106041c00070409280007ffffffffffffffffffffffffffffffff0008000e00070908072100004200073b0100001c000504091c0007090802000704080009280007000000000000000100000000000000000004080007090407040007000704090000070809042a000403232a0104081c000706050000070705032d00000000000300000005240004010a0c0004060a0b21000053000b3b0100002b0000000808032500040002080422000000622b000805000300000403020b000004000b060a2a02050a24000401080000040608050e000406050b2100005f000b3b000100002a0203042a0005062000362b01080308060b0004080600020807210000006608072000682b00080308052000762b000000080501000400000804000000250004000008090d000408090804080a1700080a080a21000074080a0100040008030809080b2b01080b080801000408050809080b2b020808080b0100040800090002080920006b25010400010805200076232b0018ca18ca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012425d93dc07b5baaf53a98caeae2679df3528cb83e11e2640a57a0a53abbaaadb9000001000000000085864497636cf755ae7bde03f267ce01a520981c21c3682aaf82a631071360bd9fe9e8c684bca88d680a52356018c83539a20e46c7352bf06165430300000000000000000000000000000000000000000000000000000000000000012d4fe203604414aeab5a327772a298e8be0473efad610c5775b734307a5f2c331f963c25a7957544b54bbbfc4b14674bb6af7ec24a32144758962ce5d083081823fcfe07f4d82a282b94f66e61a3f20290e226724d01be42e8f2f4121228f868000000000000000000000000000000000000000000000000000000000000000011e8a3ced00dcb1beea2f92814ff50b3c3d1984eb8ad7a464fa726cdc11b654e00000000", + "193be86632451d71b9f1cb607ab1337192d5cafcf1b3571ce555934a9fd09899000000050000000000000000000000000000000000000000000000000000000000000002006ddb33b4fe6aba8af5512ed72888ac4a39f66d07644820b0bac185db96d99c00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb30000005009aec0cd80314728688ee74217f740a12b4ed73c64477cc2082f2652de84c38c000002802200477aa8a58f70bf47bf6d2bab71b1cf11fcad38ea5c39a74a87626744d5aa000003000f3c54ff1ecb59024ac9dad1370428528e6c35212e8ab74464b9cfafc482fdb0000003000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000070dbd9640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000caf4380237f5e8ed6d475e5e2b1f932d5b14ef8e436598401ded1f21624c099d5bd5e5e000000060000000100000000000000000000000000000000000000000000000000000000000caf4380000307e778332d0df43529dbcdf83975591cd9e14c7174fdf564abde7380fb7e7c8e0661ae0a9761886857d567bd114feb2d5c9fc2649267003fe6c21c878953331b004d75bf1b6db82e7e9c2cfd4f029258e06ba68dee0c39add7ba65d376e3414b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c5f0000000040000000000000004000000000009c5f40009c5f00009c4c41b6d5873cef5a35f681ab9468527f356c96e09b3c64603aef404ec2ad80aa3a90009c4a0000000006999d1e02b08a447a463563453cb36919c9dd7150336fc7c4d2b52f80fb185f408646be795757505213d2e40ad5b623d26f43dcba0e3ab718a86731400000000000000000000000000000000000000000000000000000000000000011038fc99fb8b4a27348d50f138fe6ffa34d6eb9a4bfb4b9fdd33fda1a3920dda030e4f5db5d27e1633f07ff701a044600b4ef5ab40eaf2b2ed260a8b4611a7b200000000000000000000000000000000000000000000000000000000000004240000000001e52dc0bb0000041824000401022500040847000024000404072400000400081f000000000800000007000008431d0001084408441d000408450845001d0004084608462b00084300032b00084400042b00084500052b000846000600220000000e3a0000000847000000001e000200081e000000090a000708090a0021000013000a3b0100002a0005072000150c000407060521000019000520000018231c00070704240004000324000702082a000009240004030a000004000a0000240104010900000409020a2a000a0b2a02080b0000040b020b2a02040b0000000409020b240004020c4204000000030000000a0000000b0000000c2400070000040a00070a0409240001000c0a0001090c0b2100002e000b3b0100002a000000090000040002002a00000b240004020d000004000d00240104010b000004000b020d2a000d0e2a02040e2a020b092a00030520003a0a000405030b24000400010d2100008d000b20003e2a01090a0000040a020500000405030e2a010e09001c0007090a280007ffffffffffffffffffffffffffffffff00050e00070a05000e21000047000e3b0100001c0005090a1c00070a0502000709050a280007000000000000000001000000000000000000090800070a090e1c0007070a2a0000000f2400040310000004001000240104010f0000040f02102a0010112a020811000000041102112a020a110000040f02112400040212420400000003000000100000000011000000120a000710040a0a00010a0c042100005d00043b01000024000007010a000007050a0c1c00050c0a1c00070a050200070c050a0800070a09000c0000070e0c0a1c00050a0e1c00070e0c0a00070c0a0e21000069000e3b010000000400070c090a000007050a092a00030b20006d0a00040b030f2100007600000f200070000004070d0c0e0004070c0b21000074000b3b0100002a000c07002000151c00070b0f000007100f0e2a00000f240004020c000004000c0024010004010f0000040f020c2a000c0a2a02090a240004010a0c00040b0a08210000008300083b0100000000040f0208000004080b0a2a010a0c2e000000000c000000000e0000040b0d0c0e00040b0c0e2100008b000e3b0100002a000c0b20006d002a01090b1c0007050e0000070a0e0f2d000000000f0000000e24000401100c0000040510112100009500113b0100002b00000b0803250004000208042200000000a32b000805000f0000040f02110000041105102a020e10000004050d0e0e000004050e0b210000a0000b3b0100002a020f092a000e0520003a2b0108030800060b0004080600020807210000a708072000a92b00080308052000b72b000000000805010004000008040000250004000008090d000408090804080a170008000a080a210000b5080a01000408030809080b2b01080b08080100040805080900080b2b020808080b0100040809000208092000ac250104000108052000b723002b0018ca18ca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012425d93dc07b5baaf53a98caeae2679df3528cb83e11e2640a57a0a53abbaaadb9000001000000000085864497636cf755ae7bde03f267ce01a520981c21c3682aaf82a6312d10a2e5dc9110781c47aee8468aa4228503017b1f9422daf5c1454ebf3974a600000000000000000000000000000000000000000000000000000000000000010e553c9c7c96b6a6e27ff18ff5b6fe18fbf7397ed5e66ad19bdd6e646f95d2270fb185f408646be795757505213d2e40ad5b623d26f43dcba0e3ab718a8673140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011e8a3ced00dcb1beea2f92814ff50b3c3d1984eb8ad7a464fa726cdc11b654e", + "237f5e8ed6d475e5e2b1f932d5b14ef8e436598401ded1f21624c099d5bd5e5e00000006000000000000000000000000000000000000000000000000000000000000002400273441092078ac53b721ce20f949c65a2512de3d6c34a61494e537f1be522200089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000601f1521586f80a14b8ef23abdc870f12919357bc4055cb75ae61547e948a9887200000b802d49d660d554fc907fe946cbfdf098dd514daeef9a8bc0ac0c244fb1cc0f66b100000c000f3c54ff1ecb59024ac9dad1370428528e6c35212e8ab74464b9cfafc482fdb000000c000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000070dbd988000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad2ec59016e10e6b3d6f84c567923bbfca9ef167b4005e6ad433c7787e78838305e629fe000000070000002400000000000000000000000000000000000000000000000000000000000bebf744011e63c73e092587f4a18d2451227f27c91b26116fbdb33b05a1e13d901a17a2aa030010397e5ebbb3f0d49b4a47527661a73c73c49876b5bd9779e133bbff237e762a9618da1c3af7b57ba1a0daeb5557e20e4a3ff98dccc43e3a0c0837256836e42267ef2abf9488301f62efe44f1ce67c0928875595067f3c1a2743af4f6815680000000000000000000000000000000000000000000000000000000000000000020500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090000020500000201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080828ed08304c630ad355d7eeaa10c5011deb2532493542f09e71466c0643e895b649c133ef655fa1d88a154869f567515de4ed739100169d052ec29f3194da8f77d274b19c95bbe3c3798104e2b07dc100ffcd9d2be523a5fcc901eede0dd4555786ed2f48afc55ebdd25c1c5f7bcd2652d3573c0766e156e3f80e0b7e5834771d67785e9d619787f3ad65aa586f98816c547c41f5c53d77259bf16cb23376a0af5da06eea9520d42ee29770d9571bcbf1eb3aebbd16024c5b04248d7cae754e6650ed948e3d4f81b512fd07859bf647be363ff704de1cb5ce9e1873605e5a8da1e37094adafc9d6dff7d445d126aa85bfe7e1d64cf330b6ace732a435dacd7fdb1c2036559662d8a8033462a1b1ec3163068c65d225b9c1602cb0e03004faf10eed36ad9e278edbe78cff1b9cbee00b83ad0ef865f196c1ac038f0f123c6450b54eee89980ac719298e8d1feb88a6d719c56725b2abbf0a0e53f758568012e9280465464ab237af0a4ad5a6640cc5933ae8a60e54cb485345728eedb2a6cf090ef24511cfe377406530dbc190d4f5acc2ef40c859e4c7e24c94f983553a076fd9ad85eb5abc52414a20c812f1c433456e54cb51364b59e7b641c45b0a9beb50000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf74401163f79f9d87c8643e00ac8bce9e9efa210c23e935323075f830b02cead40f5c503005d451d4ce83105fa4e35a7dd97fea4e87718ea7172709ecf2b28fb3521583d27b92845edae29809eab0143801cf49ee76d05a67cab300f6061a9c00c78bafe2988a452025d5d7d9cc97e7b961a37a373ed9aa52ee390b5f31e50464f85106100000000000000000000000000000000000000000000000000000000000000000205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020900000205000002010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000212130c1605c3c4e61309801c05c358f8490150ae28dc424abf7fdb373b4c1cd21df62fe0530ac9fb75a611aa2bc7f591ec10b9b090e00fb662c0917cabbff876c110e9d6784aa4b9809e309b60fdc9a41ea9196dba90e654c1c76e2917a79cd3705adf297355c2a0b65750d508ad736188d6e059b0ba76f6f1ba217bdece5bdf8274722574e3f56eea62d76838f86da757eef0c80499be668c17e950d93104709e46e3bcabc1ec388cfeed6af4b57c3bb9559daf6d619f2aeb421267487c111e505978847d3f1886f1c6a4525d60945d7360d210361a508093c1081a45587a8b5fc7495bc7c7ddddf448040a944988f48dd1bd90a7f12dba7be0b7cb6211fac7df336780ff220b00fd1b3e854ccbc9c4997e1fa113ee45ebb94288cec093ee6796606a628e9be4085d317276d789c66debf3ab293830ecf54b8f1bd5b6e8c00cbf0c207b61421bd4a1a847d8649a65b524759ba2482414a38fe43f09a3c97304c9d52bc8287a97248b3504b5f3ac749fbaade24e8ea716cd880e21ece959c81e166bef4cb5e33f31f147c42977582d2dd3256a49540f54fb54972d53431c2e59859df80c799f8386ee87672dd463f1d92617bb0361129e21254a60b2d25e5790000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf74401040f30349b902136416d9080e301c0404472035ce277512d9333ca7a7863374303016cbae8b92c37e6413af43e037ac68326cfddc92e961b9f5d6cad8b7dc417c201d4ba90b04d8bf9c4b25a98490a4e53988d5551d46a1e64bf193b9177ca79c41cbdbda42640cc9aaf1e5ab8c474c97a5c18e254fad738115c746adf57f6737f00000000000000000000000000000000000000000000000000000000000000000205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020900000205000002010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8aaf658cbe0a6ccc99984ec171fddabf8f381435a512ad484f183c4072b139d881dd0b952c55dfdfbeb6b68e2bc0d66d5fd834aaa19f625d8f3a6d2972fc1fd7f4a42afbdb8512fe4262dcc4d8bbc0043da9c853a6e5c685d88cf11ab0dc7dcf6d5b3b49f466af8d4f5b1546430b8bebf075edfddd9071acdf2f1ff884d7e83cfc70a915bef7d3fd4aaf656e3a27ac60665379d82cef49fbebbfe488f1273b5caca05f830395629fc4ed34738b50572c5b9deb30fe5e790fa07235ffffd32049e4337563d74de8d77c20d0f59f9443ade97f4dd30744ee9bb6f84c15c290f3bc786d2ba26eaf5333779140fb5bb1643dce4498b3a0f81830c158404a1ebe4afbc9ba3c2c2a24569b8e69a1d6c3a24f4bfde1a17ec1c4c94860b0b957f37fea4fc9e585fde3811b6d000583e8ad76f6ce15b14ecd188f6cbf59001c1078cc5e8523af2bd4af566e0ffa606fb05ba8a045caf12a3eb216629aa6c5a968748a4b2d9e4bf1318646e2a80d5c2f63d62ebb94189146e44f36eed1442dc183b2b08d9a79d218cce07e3f98a6d07e0f48cc1261703230ac8c71e75f181a97ed2b015634abfa40fa1bd619d0c0e7239021a5263549a96a6629b61e12453bee19e4dbf680000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744012a7c5c38a959600620785006b90c607e7f73ca2316aa6b536cc75d8e33bfd4d40302309667c3ebfe923ea3671ed89a10f7f1e78011cd794827332157576de461e501e45a457c5f4f38d3845fec9f0b538fa366f49bfafde2193c651a2d0faf60bb0dda9f22deeadb478a759907203a7357b80432a4d4809f6df7b7f08e2f889ca3000000000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000209000002050000020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a1325a6527c725c605d667499a11ea349cd46abf48890f9ba56de67255b618121a45b52d54b59fde0d6e0c80e0b5f28637306b8d38618096b9621db94ec913494250a50abd3354734353a7da1032329eb742c63e544a1ef826f282d089e35f81c7819dcb5a6e1aa53cc41c2605be5ebc1be91236af2e76b8fa96da37b8f3b97524b732738cd023dc2be6ffa2827d4217a7e54e2bdf6e1a280c3474066f753ee6908cacf857e27a19783ce69f11cd835e8d0fd7881c096417ce2da4621f5e01ed153ef16608efbc798256618946f5a755b7bf7fc0b91ee8d924a7af31f5f97cf215f8c4520f72ad2204fc0e8c00f9396cd699267efdb1598de869d46e4fd1fa6bc9c029a2208277a1b67564739e2bed1cb030d12f914e8fb69633acfc83120d753b69aae7e879e30ebea8f98c7dbbd71d5a956bd1d9707a46e1d064e56a891c8f6dc31be71a8536643e9bd797e37827799c5350feca56a91a987874df31983fe95e13f2d2e20ae9ab7180a1e9255e755c73bdca73fd00113cfe4f26232e00764eba1a57388be1631f5b227bf20574405e5bec00804defea77363088f66f2f2eb82d78a664ce8f9d0c94c921faab0c77f32670ae8c15477525524a2daea4691030000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7440104ab5d7ae87a3882229e6e24dcab50f77d4b86a2f34b8bc7cbeb3b8055efcec8030246990d9c056065c5d9314e133b239b813b1c2572efe9b9180a30a5e38b571c0aaa10d8363e0e4fda881cfc2a01767d56c34018891de9147c6618ef9bd0c4a703c6188b064eae698bc061692b0a610e8f4d37bc0bc92df61de8d05066e26c0a0000000000000000000000000000000000000000000000000000000000000000020500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090000020500000201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025ccbbc6e40062286d3ca22e90e20e09d5ad95ba644c4e358f30fae0fa82a9f99f615e34510c08422f899f72c543e3348844cc0c60439273f1e87baa2f53e82429385331d4a75a6046fe9a1f7a57d90d2152e411f96ea1d3cd2cf6a7e0d422b796b270fcf9fc95e459dbecc5cfe338ca8996a9f509c3c273d6aebccb85fc91cc02a38fec3c92ec16ffd95408649b5ff46ecec805ebda3b82d04dee5b2ba71a3d407b64a11c61ca5456bca515c3f1fee446f8a9c4c60a70087d5ffd49d59ba11f6e25d197a16391aedb857aa5dbfee5ae598130579500078a714f85b11a9d2cb9482927195009a83e8dbc8b15fc1de5c38d1532b97538f46870f8dff525cb5ab33d257864644d0ee612f68437e51de4bcc335284ba5afcdf104fbee3ba49b0c76e886c1029e9c7e7f1a60f6c8ee6fefe49d21478d1091dcdd2f87ff6aa51fc74615761c701460997059977eb2e9118143064c26a96066e4e9790c7cbea32b62309d41bd1c08814f9394b198be27e59f38995e889dcfaa6985e688bde6b4c4c6e98a1fda3fdee21aa376587e6622eb2fe21726f1fb5b1a7f58ad6e6b6698e9acb296d7ebeb90ed32699bd7d3441679c7b85d6ebd72c3a2b260da054bebba6248320000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744010d3660109e5e829c7778af64c98b5d4a4f6f82e4206052fea27c49a7e5db47eb0302746fd33195e70e400fb667c11c4c811db5986665b605e368e6f91f44b7909511b9fadb58b2707ecf3e9a92960a5936364f2ecf6938307b2b74c14fd3eeaa8a26020d3adff7dabf546df989845926ed1185e3685ff1fbbe52b7b5061b2656080000000000000000000000000000000000000000000000000000000000000000020500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090000020500000201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013a4a4f8c38fc401f514be1a6b8d9bba70c3edf1c8555bb8cac4d9aa60d0a7c5a23d9a58cf31ebcd8d325a438483ff3f608aef336dd09a249a25a01103a02609666e9462639267d6a91035da6a3034b7d55a31a84ce7745ac86e825ff7382610ed2b1f8b3de16dcfc1f4cf511a5dc12e9ea9d23f65355421fb560c938a51da7b7558477ad9094af42fdea390abf30ad19485a4dac677c0232dbf26d8344323459afe00d3e2bf8d74e049bf48829aa23c9a65a5725f26b3c8528e6c34b4a574afb69077cbe30c6943bba727fbfa3b772a7898d391ce7acc9fc5f9ec9f46d3a5e22cb94859775cc9d89c8d5c87608d4f417109ff3df20e2431357ae72cc00144ac8396d6b3069e89a7c7f0c97c8dfa2f46f2bf4c59018dd1fbc27737bc12fcdab36e32fe25468bc9f4e52a950ed39e373334882f3e1f481be73e40b63a8ae9e4d242bf1e60633546f980a4c70224cce1c9c2928f391d9a6626273fb589887f271545ace093d1efca480d98c3be0fd758bf34cfc5c748557b498154f4a1dd836d6cb302169e5c3ffea6424fd52a36da7ad49a5bcf62c18398581a0787f6d51cba374fce450a0cd15529896d1139bc59c7544b6f8a9c56cc776165fbed8e7d8736190000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744012ffd31c5718f5af4c6cad289bdbd30f39ab59bd93146b559b26827382d8fdd1e03027f8e75c268cb0f4a5777b8be6c3dba06a6247bf712e6260feeda3af92f87e428935794730dd71d2a921432bb17298ca6c8a9aa722341ab8549bc31495cd7bb2f44b2d74fd647b6dd45ce1469b174c94872b8634c0dc1d35627d15d9dee2815000000000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000209000002050000020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a64b8ef0c48d3cf1d6aba272b164739949ac3aa5965d515afe1cf305924edf5696297425978862cf5cdc55af549e0786246d1177f4c36cce5c68ec035fc95bf53df2679d79fd9415c30d4dc139f4ebc6ee59924553625c98b47e3d48587630445b34d2e7521402ee5f55dcad736d8fb2794d6ce1e3e7f2b9d4213a95ea03db47db00dcd5e96054c73cf36fbbe583b7aed5f6e81f9d1456f46e0d70158b957be3c2ec216cb71a2cad17bb357bd3433855b97d503092230b1ed44510b897e348dcc802686c59d1abd74ebc35e6bea1626071e68deed00e3eec3aad37a219e47f54ec0803907d814ac3021ae4ff867965e6b6c3154a8c9b22f76d85f59dddf2776e929a32d4b3006cedc057687c8e59bcb66278c51077c1eb77db4f77105f39b1ea916535bfe972966b33620c57291e753c51c0f5537c924656f3be20c8244decc7a4a4507385a06df6321057cf1431753a5ccd263c90987d2d0375bb29cd994ae45a901df28992a2f530321a7f94540d43da73dac828e9729ab3a5f3b9bca68f4633549eedc4705b9ca015fc18f89e68d2c439d0b7340897de6c726455535793f49c2b8ec741afa94449a53d46b4b844e3753d4ff3bddfe437dc662dd1ceaf5be0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7440100d42ad6a44d61342fa8b614f1ac46d7afe8b98d750c87bba390cd242f1ad0a80303ad5f6e38f243dc603920cd3da1a7d07cce5bce121c495577e6cba961cad29126516fe91aa5e3d52ea6c59c8fe8f6d2cb34269f825d0ee436c9eeca87844a2f2ce7789facaf2c12eafe0f0d1eef2b74ca6e5fc3ba60cd00ccd6a0abe6d30ead00000000000000000000000000000000000000000000000000000000000000000205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020900000205000002010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000125a7f230b87e26eb91ecdccd695d159afa2d40ee14ca93f7e877fdc963111b76b8260f93a6426cb76580f8f166fe70db59bdc3508f463cc5b74c7a316589c4b90eb061051e2899e7be1bdf90e73e6441ea7e36a83d79a1d924023991ebc07674f6475dc4215c883e5926fb26700243dfb8048bcadd09064383733532f3a0424902eeb0b478b0b5f8ad07ef94e8f64b42a5847faa79607fbba2e1efbb97d2c5bd8b0f2514c5fde0811f5f79f681782d82f1dcebe1c4928843c5a9bf358e96badd135f701a0a957b2cc3dc84ce1b6087b0fc319edf8d92e7ace3e1c00248d0241b423402de159129c00390f72d28277100a55e780b4190a16401ed6fadb0509ead5288249926a11e23f3104b36c4361fce54c97f9cf9e749276c29b57735156525475d1cb3796a6fc78c16eeda60668f11f9b72e3a4dd0837224d123e406ce2fb9528207bca8380f887b0fc918af9b48250baff6159c7e1e5b4993158e76edb7b88402e674d9d18379220dbcf110d92aa994f3a0d821c4c5fd35405fc9300246fd1705dcac6f5de4bd92430282746ee9dedc056e676b4c94d0adb7710df7be27a0a8c243d5e511d417746cf42ff20bedfd6f562d00878444b89a0066fba9bf8370000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf74401233a9d018665cae4bf805fdbee9253fc8656f3234beb6ace4af4d2ed953b8b510304510494498d140a8d7962eb1b8af48ede73d03b8edf2f7dd7acd901266723bf00dcf6c8630db4b4747e1bd0edc995fec634dc42750ef7478e19e41b43e99b6a300b5848a0bdea061a8d574aa725f856e60adbd90ded79630012ec0f6c44b2df000000000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000209000002050000020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ec3f4cedb8a4094384155283ba648a601ad83f3a4275d6fec4abb836c63d37657447d465c4efb3dce7e19722294995cd5e5972e028f3231a5e4e72a7bb8fde6b850fd5bf3d64688d41d24df8e1445ff16613b8896054668359ed9453db4e6056f0c532317bc5678fc388f80890290ac95f190fc345ced23403f1a61a61fa41e1a65e0fa881fe6874a6f8816dd52e5ac7979d1b8910f5791b58bce579686f603c6b79081f6c1a46c8e86d6aa4d626782c13e580dda89c83ab5408387b10e622f706df9ec8915e5c5da04e32be7c508dbb8c2a1e5d1fee1921f9da781fedb348f5c44d2e664ba383eb3cc325604efd961babbe43040ffb08a18c6cb1a55f0763af197efe45bb56db26bac81f223428ff422c41ec8522cc9baded9952a98134381c93a72e15101e661bdd7abb161adefd03661ba70f67ef4f824ba3ff6d49a61308ec8dd3512fd815184615d2d04da7cf22ed604fd9bdda723781d73275e7c847cb8eec60187860edfe7dd3ee59ac05bd20a61823c84786cd997f2b9981a311a411af85b422676e36a28e51bf5350cfedd62178c93f6439b8c6b29e632bbe10087bf664db4871d26f8448986069db95da8eb50b77143cd2167d02b832660bbb49e0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744010cea43cbfed1d2557168f0eb8124aadb8d251021e040f2e5460ef3642d7493da0305e1590ed5fb475c396daff427a6aaf565d6a968eb7612be1f7e289631f3095f1373972d3f92962ab281374fc35aac8803e70360366b0e10c500b01d09e2d2f51111d2802f8633c961a49f5416ec034082c8a0a6f43884beb76b9d4bd39dad290000000000000000000000000000000000000000000000000000000000000000020500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090000020500000201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e8ef1b3d714f542541fc0ba30be82a841081ec3d099ed5c3904807029e8f96eaf839d9cf96c61459e68f1bea16bfd93985e4aa3b1c74aae2fc64084f15eebc60069c6ed181b999a4c56795fd9849b0ecb748721c9f87a8c07e983e27bc891b4e33f375adafa2d59f84a6db256c585a1c779a8ada4eab5f16e0279cadfe36caa20f64cfc419b47ed4470856d19430d10ca6cd7b661212abbf4ef903b8e490b12f30894b28c82497dbb4f7d1dc8d9540ecea893b7bf3d0fd3bdab4f73393030b5c3de2c491f3818e8155f4531cb38f2b4f37d7116ab8a263a1a7078b6bcd42a538359f24fedf68da19608fe78c7cafd6f4c256efad2faa5087abe9adac9f8d5223e278cf1800cfcd4426e76a13dfbfb6aeaac3ee080dbb2ccf4b812efc5fc5de87664c572e6af2e46c1ff6be3cfb27d92df65982740f241b9aa5941149b81a3402f51889821a702bcaaa5cdc304801a402b50f7d18d58f014af7aa57d682b02a41ee2823e83c58a1329406890efa77526086d4d8610374d30b62489020e1ae1de7ac6ce84cee0c0a6160e82f3b1d24dd3414f8b486029f532a96a8b32787ce76c9dc6c87b2d7983fa36038d53b1645290fdc52ea80c2a2f4af14f9bc21f1a1240000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf74401192547a5ab30a9c7b526508c8f963f5a27b1a04c8f0bc8ee10b455864c092d9a030931ed82939f012c47d41aaadb9a50113ce90e65c9bcdf83dbaacdecd84c9164089400347f9085bed5d748198a6f0fbc181a77f6e7fac0269eaa9e5a2596c7080af85e388288c628c9bb8bcb21f3b4ae3f704117580abceaf0a93115d9d5d8b200000000000000000000000000000000000000000000000000000000000000000205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020900000205000002010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000893607c74de6e02c179e6c3e4b00fa17068fa991c35656650109221ef7ad6d4e75d3e6d443949924b13b4e01abcab83260a1d393aad3de2eab0d95b1f9d30835cfee7cf16bf615b6c30505a10f215850cbf5f32fb51a3c0a0743dcbb39a5d95e79d44819174556caf9994e65b8a2a48d478c70151bef170d30baa6fb352f616818194446c73468704b96df80bbda65dec90f7ce829e202c58e75fd2fdb7a0f2f2e5c1d081cd089501315225aaca6f515591a164052ca6ca994c1250f6778e47fa05f308807805abb662b06f8fe2afd758423e521e776d7d324e18e2e8e24b3a4d359e8cfd6e0dcc1ab934b27f2a1a4de85d22bea817338f72614c93ed99a0a78a93382dc7fdae0508da68f01ab7793a347870751f499e095b4a1f7ab56c85c1fc6980caec2078cc34f26c66536c8247edf33041850c10cdb2f500ac5d469d8d55c08808738d31317b79b762beeb1c92cf93f280443e5d1d6bda11b3a95e5ebdaa431f312c44a00d51078e446379944a235dd5c530d3b61d5e945e843d2aac067ef32df3a0cd094874e9c9d2db8b134eb155d6e9e2c93a58c7c015d2d493bed095622c73a92779afa3471eb47d71d379bc038c9e09a876b368b6576c44a3bfbb40000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744011621543448a43d77e0974d6db57896f489cb2969a32f50f7b96a652c6dbf9215030dbcb91462e6b49f7c802a44553ec25a34fe4243c80f97e2606e81bb459cf10a115c2dd5db04576b48595796a5d705a476468e10625359c3d19afb6be6fff814269586d1bd502d252a2061e488d25218334dda5e079e49ac0d98fdcd0c4b16a1000000000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000209000002050000020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f01f371f873a124fcfbcfcc7252d7532341d0dada2d0ec9791494c51fda86dbdcc0ecb542e824ea0e13bdb859fc30e60d196d34dd6558d8e3b4d594c7c21554e8be784cd34a77c08e5d33e7c82074d6b3b1addfe2aa1b8cb5c97b9ff720f1a4aefb9678b50ad9d34d7c82aa003193dc8d1a6fd1ab2310e55186d474dc75b6279ac23a305e8179e32c45a8526da366d8d8a1e6952080e6a646996f0ca661f1546763d8481642278b9302066cb1588581fbff107f61fbccd816d0fdaf1bb21603f3144b7f67de45a309617236cb6ad63101f4e688a2bae4cd3bf4c20c8f60f537f0f7f0f175e888c624ba459d889889e4822091f7d1f7e098aa44d4da6ceb0bb6ef6eaac9d1bc2b162145bffc002f7ad05365d01fdb191028cb99229e80ae6bd957834fc4111ab27bfa4355bda564f56790e136dac46d937c04e377158ad802de0e20bfdcbe73fdea609f98fc57012bbf3fd31b92a1d08bcce8ecad65e33a5825083dad30bd68ee431a44cb058641e7e9c2817a84c8a898b8fb9b305c2186417198da9157a012eed0217362a12e477482651b5594546a16bc86dd7c85205251d532fd73de6e218656ad71fa177bbef198613e927975c57436a2fa45c6850e19650000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf74401081c73fd580f05d76c6e99797c2f4e8dafe00016635125e11ff5db483544b7fd030de268b41aaa9498e11267472fef94817ada6907fac4c773335dd7329fd61a6503455904e6e22bd562d6ff4d66f1b3dcf9599c461e3c1de0e5812ec264ccec6c1657594ae34667e6b6a4e6cb61569c3b7e2a7570efc5bdbcb39e2f865925988000000000000000000000000000000000000000000000000000000000000000000205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020900000205000002010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac22da2761aa5f90c2cd2cd11d730550e98721ebecb010d32c7e965f2fd100c9a38d2cc7a7b7f532d6d9d22e5e36d4d9ca5ecd4a25a9c7d34e2d57e1e3c9a093bf2903fedef0b473b9d551f38bb93febd21b660db914540e9b928789979086dedadcfc8541d00c9127cb623f2bf31d0146742f4b03ca582ac0eb6227a3ce05ba2f1009e8b2be75f7a61745241e0acb8a08fdfddc540a96ef687bd350b831ab1de907954bfce98f052d195e3c667da4df8db70be9f526a76a98521f3f820fafc96222b1567bb7958de9f07915ea1d15151f3ec11eea287df9a079b29895d9eb62cc65e2cdbd71527b546f0b023d9d66575fe4adff110bcf6295e64ff265d14d0452b57f44698d6db0a2fe20d32762a270bc9950e3a0fdd68e829e022c4e9b631100322020ad1bfc9bf2b91383dadb83aa4ee31dcf56ca568c7f5aef4f9e027242fbc531ed8dfb1f7c62643d73bd85a2f3981d3a5fdfccd29b2391bdcc3dd3e6db941d83fee4ea31f7aa474d65c7c7b01b4345b2fcc9d27ba0d69588c1497b02a04f9a1c4124039b51da81434ffb818b5d68f2422dd4bc22c053f8eff098afe85a1fae63d095f42987a118ed266de438532eb54abf74c7215e6453082d4b2563950000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744012071ae954ee6c95fc81c4fc7f684ec8aa58a5e9ddb8083f998e6ecc7b6a1eb8c030f880e1e105ed91348aef5dca1772829842bfce3c95abe51fbf052315385c621006726327ef586b9837e8bc63158ad7ad083d13ee799be1fddd138faec0a59ca2fdb364ab0801289af58e7cb8e83bd1c63bbd42b4ae748a4731803e631555ba4000000000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000209000002050000020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ef38314f8152c88186eae716c0ab17499e8102077a451276ada876d4ff94881caaf7509cbd1d0e6662b10dadfec8e671837ea933f26f569bc0e74fe2636a15ff0ff4a00f5a24f849a6dafb91e0843b890e7c168d45f11ba5398077d68f3e13d9bcd7e1b98eea37ea367dc14337f78cf035f415993a453d66a11ff7db2e9f8def3d2c7dae2fe4cd36119b59b362e77643b4eaf69312e8f1f5d67b35825142cbbe7ab6eb20205fe25b1272cc635723709f5c3a908ab61cbb134f3aa763f34208ec3b9221dc609e606ed16aa22e9dd0eb51502cba920dda1a905f4c9a7761993a1a090db948a76f501bda7bbe5e131ef39d16b70f10293a1a304e551811c65f136e4fe81a35d04fe6bf2e00c93a78cf28ca120eb4f2708b74b8b501ac79eac4b5167da7d14b0bdd0fce7987fd419af4e5ee396143086f3865f3e77d13be76ff72abcf8edd437efbb1e0d6d10c8304cd52ead8d27dc4adb0330826e5f66a6fd5bdee825ca39dd836086b43a92f118948a18fac0f4819d421cfc58d364a558a5a843b6ea777d66b110ab9fd308bb68c6a17005676fe7513bd0db1502e75521b6719f212af00542f1e35c4971ccf329753ba0f0325407e571f8799d190aec0cfb47260000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744012d31752bac5107a350bd7477ad5370121f93337798cfd76c9662837c685c4b95030fafa04a98365448688ad8fac35c94289a0d4ed3d71db66c56a583e32f8359b11c484e82ca9574c31ad88a7d91c7d331d3f083af12c6aee3c9e637b34cbe4ad7193b22eadc057cf42a2cb4683ad41f3826a2a8bbabdd8cfd7b7eaaaf7eff33b30000000000000000000000000000000000000000000000000000000000000000020500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090000020500000201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088fc63410f1ea348b285e556c4e5e37c7aa67740b5ac1a4cb2e06d2f942c4ec707f58ce9d660bd05b8655f286710d8abd1ed6ce6ebf1ad48b1b5cda23ffbab4177ef9520de909b9299e6c9e79d21b3e6496346cd2d2f6385d78f676edd2d6e1ffe4a47270d66c94d3126ac637a2704c9f2cbae4d70085cfc47e8872f439818650faac83f8d22a87eefe974847271f2bbb9c9f143d8f900d80ee8bac91417d6b412458f1b65432be5674c8647ed2d78efe6b1eeead4809f23b19766ea97efc8325bc0ba03cc3af49f47c08eeebaff7cf1aaa3e21fc74bb5beabbc36bfb27e8aad0a20b68be3d70979da94671b6c0065a3a9598b7f86136cd66e00a9756597dc481ad67f9efb695194cd923fee8579a796c8a228506369f9259646fdb07b879c0362e24ce95f418a187523195716de297c223126df8f4f55fea96e3401e65fb177fccbcea1cce5b27be2d41c077b584a62f447bfb85d95a35ae7fb9f67da5dcd2e195de95bdc35fc1d7f22d507218869d45e3fac4e3e24994ca47e8c5d2d9e693adc3155bf2aa3a82b20764d5af44987bb5df97ea7fa464665fbe92d605464d2870a1e6409f52910522d36f5fd7c5b6aa3cd0409488261122a4b3e3b455437ad900000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744012f41fff39a6199d1a81d5f59e514136f252d0b7e9556f8de85adf7404e13ae98031096af48cf845f6934604463cd007599b058f3452affc8bd5ccb53a75c85526a00f4da6ebc779a7a4551ea0c86c65c3ae81c2dff7cf2975f23a0bfecfa13eeef1a05b3b491af1781d098c7b8a882010614dd2f041d2b4779610052d5f89dac4f00000000000000000000000000000000000000000000000000000000000000000205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020900000205000002010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000244c72515d4d9a67e44c92152d6dda2db11b146d5563f2129c2b636156ba50ccce6ed4fbe3e782dd019ed07a7714a4fe44755fd291485aeebbe990ad2f23032449e53880bf4b0566eb02767d6659dc67b387e5315758a71ba629d2b468655c9811229cd19452bc7a64f1e8f6c29145eaffefbe054cb2b486b27950e0a9b332642927cd9e4ca24923d052bf96d3ba60dab60d574b4744c791f64dbc59d73c2f880b3499a4ebc123b8e65fcc286a21e953ff98b31190f55581c893897aa711402733492b3561a2c2065d541f5a9b7bf43e51b0eeebeaf2f0b20653bece75f02bbf93994c34d2e2881e6c0410bbd606b3b83bdf90ee643b291ff23ba8990caa33fd6bd013856a861598eacef06e678c1d4034eb59fdd265140d1357e915e2dbc7d15c98de288a260f54fd6e296dfda83563e4cf72f46e23b5d9e532f3b7c8dafeaae9ea6d5b79c8f3b5e7ab08577828024fd832b551b90515fbe761727b4f7489847e13e40540ae732ca62081713560891710a98651b9e428b0a2239dc4a34a19c355cecfe488b99d62da90b5c7bd538cde5bd8b01756f213db66adfaaedbaedd93b0f92ca2b4134dc54c1bffea2ff53a5a5f72f06fe05f433846d588c2cd48cb770000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744010352f44fe8f0e4db3d94033c2880b865ebc103e4fe9455ff051ca2ea6ad92e440313317c35888c2fa7d4d5ed387f64416cdf810f01821c8c37b96d025edf0dd42f0553e6729ef38d23b4d9719923971ee0dea9404764d72a811f6cf7307a24008e1c5b794a3f3f92392722f72c380c2b05a70ae8e5a08f90a3784b1df1a49960d2000000000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000209000002050000020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fdc8533204abec815bcfd1039520836bab8711f801f00d746faa4d118e199320ab546b3271ff548496130775db64ffbccbb563f0910f96f68826912740a3d34a736f831abe56531b0cdd6b1b4c647d17cba3081cfab7fef27659eae5ffb72e6ee119c12a9feed2607a081277135e4e0264602b1d10d5b925580621e30a7fe57b35a33131bb8d9fefac950ebab1d8e108db9d743ce0439e5f661c8b52a4889b99b0e2ed01ae82b5dbf4b514339c26151498c3fce430991062d9acf930367bdf0202c5a3e93d699ee849d779d3bb1cb24ac3951b56466f8ca3bc69eaf6d74c4c7382409fffe6aa73e6f1c11b6bafd1a1129e622109af17493d4ed43e9f466f68eaea050de3eb02a9e181af0f60800bda8d4743568a9873eaa91a32085404b0e1f591cde8b12b87f5d80e1ca75a57113a9e2ea223dde3c2198c787a783eef7b378f4a523298e46ef1c17fcbba474833832982494e2d081d7487ec5a00854e2bce65ff1e95e5152ae7fca99c2d984d8c9c29364bc1088b94037d74ced9eb760bdf2bd4e6a162ef3305cdae668d1f5fea3e6b0245b45064954379425878e8f23251ba260f05ec20108361be0c255b5ee8a67d6ab58fd6e4ee94b4d83d7a2aa3af2430000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744010d26928ab692cdabf370e8ea8cdf711c5324944b07a1705cfc27eca248c9febe0313e6d1ca2f89e04093441e64e91f863647cea2e51321285195f62cf9f059f8bb0ccf58cd51c227e67ee512263602fc9a510e05839975622626ebe39f2578d15f1d9f73a26e32070a805b29e6c03b08712da08199305c613e70946c412b4c46d4000000000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000209000002050000020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dd7130d1678f279cd9969d5b1ad63471d5db236060f99b126c28af2e3f8140293714ab9b8999b64457e4cb4d8b00208d3bae36a3e585be42250269932d1904f3512a0f49bb03d17cfc652adc08979c8fcd86480d24df9bb4b5817c4a32f6d7455df9be8e1fac10f82da939260fb3a1987bc0cc9cf68f7f6ee7c517cae54433bae8baf52baa37662e19852baae7b4d15ca2319ef7a1d446daef57a13d174b441ef12ec7b0c720aebbae6ef018c9f4de046baaf5c99e6276eaf89f322316d17a5a5233048a35b418302c8c56a7f9d9bdd6eb7a64ef133ed11f38d69669aba671c4db59cc023ada7e79347dd532177463957196c1b5112f18e6f6ca3bc584fce78163478789fc78d86e3c182940afa30b179b68dd1fe4e3bf382488b6bb4797184d2a940505e6bdf2bd4badd71e8673f9e38642d71b712bd47fdc2570117d54b7ea4a9e8bfc35a1c56c48d83a9b8d1bc1498c0976e252a1cd7cccca529407ca0c8fb689ee6c0762118ca81dd81e3bc5390ac77a4cfda7b9a314d1cad7c41171e13e0bc3f39a7d08ae10b1261acf1c5540c6ef4b1bf8a1641f1a06ddafc19cc55b46450db2af09b91deebab3529a93cda3326bb9224ede3f8c6570e0be894fa966d0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744011060467545cf35dcad5bf7fd4e10494d80e16a883b72219f62c6105782348c9503148a5fb58b761a4a44c48130dc05175c98293ea08e69641d96d9198b3858d1cb28fabb1419de47c8355d87a58b55d63b5205d4bd065cfa4cb26a3cceeddc41b31f8efde9def355e554dd68797145751d34b78ccaac206610a34fdd8caa703c7b000000000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000209000002050000020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000857c71c50e041972eb59dfa7ea7f40e6404e3f2cb763d0a5365560503003864347a30791acea4b00a8011754a723198b942d1447ac8fc571cffd822c2959142f6b44c419e7df39cf907623ff318cf5664688510ba63e6989f3927dc7fae2d8e34de87be31f8b0a02a4916059d188c34ae028ea0acd06ff21d3c2f5f392a655e0e2f972747e1dd79d3eb4dad13a3337b86daf2a6b9bf9fdc24601eadb7260abfde93e42d04c817aa72585dd255338263cc9cdafd993f475c3ff4c8a6e3fa85141b09e76f323605a10defbb4b9bc9d97c6a476a84a9dc7beec3e02245bfde4d9cf956303ce1f6e2e00e4e64ecea437f5d0c9f9371d3c51c446917e4ac73e23de04016908539e930e2eb064e6c3c396b5f8b7b2c108a9e17dc6fc88840b6a3fb99dabd2d4156ee3fcaec3bf5b1548637e9b3473434c9a5f8ea3d822935aba3beddcad062778c9d80d8459efc84f2275db8af743be84bff325986c80755b1d5a9250f60ca5c56fde331d63b22dd000463239273d47325b6bd67e30039d8c07832a5acefe31065109bd4f31ef802d88bc7c47fe99892893f644b21173f0c9c929af29d371ce8bbf1a158d24792eab745e8dfdab5d655b91159ff6a28f135354c77310000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf74401048463b35edb9d1fe5512ede6699b739b9d0bb002b9b89936b27543075cf52d20317239cfee0f72d9fc40be6eba6d6513a5e7c71be80710982e65a9afe6b47a29a265bd5d91dd2a70e0f08114339f846f72c2622f0b3afd95254e7cbfc83b03eb21ba3bf42b99684e002a39b5989678e7544c60a20219b8af719eeb54b88684ce70000000000000000000000000000000000000000000000000000000000000000020500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090000020500000201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082798f3437b6b38f29abfa16dbd94df14296522695002e29ae1b6f657b4cdc09a2b734c8a2cbca720f35e4c891d21eff10eb22794c89b33ca34b6e63943c2564ea83465b5ffcaaa6fa7ecc02f176eeb0b548ee7f1a8e51e62734c8c17cc3f39522a3eb06164c71de22237de325a400c2ae4e73310f6b98492fb93a4fb6d3258a7c5040faf6b419c662086cc586e0ce2b6203771a6d128cf1466b71a9a8f1a953940548e2e5be37f1f60a7ba76b43450130c4e1172452e677409b97924dd45f4cae657c96763d710a13b2fd7b8fb275200ce454e014f835e10609a2a08095a3e8f72e41cf177c9ca74c3578e29a69ecc8427283c64b7f9a57439cadff21712ef9b3b61adcd39a95e00f8847f767785051c11e1313d7f92f88f4143253770a0b4197c7eecea64e40f8baf92cba7e5be034d2802d0fb4752da5f4b611c52a58f8ee7a79e12496dd6d8ebfcd5351770ac496905dc4279ebbe0da6940a7cd9f270430144dce4aa2cf8b70016a3dd62827cbdf3af4f4dbf9f126da56c42336b1d945f40c1978017bb34092b5dc6f123454c04a9d9967fa2ef877ddaae0e7faac5a95c22290da15dc3464ed7bee12c2696601d293bdcd3a4991248f34fd498d08ff9e690000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744011f45f934fe6e251db4a5d06c31ca48a3250f65fff74639e575a195aca86d0d6203182acade23c4f38c6e261fb86461f9b4c6da8d522f43b627561e9d55f8c80ed127574e4bb8bfde323a9f0ba219e81b0c6e8fb5d551e83b126a2baeeeaa1359f1152bace3c418f3d506b985b2cb2e38daf83aa59cdd6a894eecc12931bf29aea2000000000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000209000002050000020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b898f6203c138d247a2de76a37fe890884939ea7e0adea2a070acecd9a5ff4bec6d8d509186828c30e4e10d2db43a33bfb4c800ad1d6ce5f5139db076f7ead3863212a58fb13999a8f883416a861f98fd76baa09eaa2ff256bdc45b7df47c463d243f843082ec684c618c72e68e46c7a94460698f97c7449e3772067584b75bc556e4cf245185f8f06538aef989ef84db145e27c559cf8420e9a84b5507f807ead9881dd8e6b6461f39df7c6cf079ac6d6d7f9f84e5f5ce657d89bd63f530bcd68a7ce729b05b3bf6a0d3657888c64dbda4d286d9a4510979e12d0e0cf6fe7da70db0f31b636c1a47d8539badfb21a9931b5116b265e6cf7686d94c11da4623bdf920a784db21f3cf5b45797387d20aea9335882d47d395a388b21886fa8ae0f0d30619a150e7b874cbb5396c1e5bbe31e282cf8ca2a2ad4526f0ffde4446e64bbc34467b8d8c4c3026da7dc85aa18e11afb469442e600f5393733b8f4a1d708a48321dc896eec1f56503c62e778849ff7842354e5057cb963c8e44acc400a49a7717310367c62554fde9aa88c84cda463297cf26430ba35bf02a5fa0f585fc0aa576e44ae25c806f327bdf2ae67b56f9f5dcdb4075b7606fa3dc3c4af1c1010000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf74401278a0e106b11356878f2c0b62ad104816aab7c6276c2e5764b81716f0389c54b0319291a7b747efa9ff81cd338301273fad83594d00d554706731e446dabe5c12e27a898026859b700418d0ccacd36b96431bbd01137032b95d6cffc6913baea4b14496210a502c35660ba4e877186098ad979c7b2faf58ffe9c058413f6b44a4600000000000000000000000000000000000000000000000000000000000000000205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020900000205000002010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8775d64bba51c7989b81553f7310d16974f94838dff88b678b5cdf40b8c47d7fe4843a9d9390f970251e67f7817dccaccc4bd2320acb8b0a57cb03a379d7d01b25a661c054ef133e2c9aa08709cd61ecba6e319b33e05fa905838bdd7ce5d3509256fd5ede96483124aa6999e5ccbdc6f305b262e2b5840ba8ea70f505c6946a56dde574f82a8a5861832c382c5c7286cb41d06425e5455db44a33dc36b845001c9668f55c0168ce4ee816ab5ff070b3b8b39173dadb02172540887f8412031471d48f9160c270dd5dcf562dbb6b606894897103e3b3722a27ef3748d7e5ad778ead8e9f9d07d06de5ebaebdeccddaa7db0d3c85c879faa54618f1e487170f40ae58cc4e9147fadf70e1670930233a726381f5f9daacb3f219d3641969479cc597417b4129638f0717cc4e11aa65c2a2d4c0c80727501db6ee7ce8e2776978a0020f8c577fe795eebf7fbffbb9d882d623c65f5348efe0f9fbd8e86a45b96c99b0c9747c492582bbfa89442effb446cb72f6356c6ec5ff27b7cc3ba6e2b7031cac42ea0bf2ac0dcf57c97c3e13993d12bd0cc1ee26d85e1c599ebce99c8d0799ff0aca423777dd4f636230e6bfe7d9cb868c43d3205995bb21f4517d4d2543d0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744010f3f1d020b81210631b85f9d11141118c39f1525444aaafd6257b8f0de1e26300319e9a8939fd5234b22f9bd320e8661d4e8634f977929eac5e4d9b581e2d089b924f8163f860c95ebc7763d868c5d34a5112f3ecb67a1427810b0ece19a29037c150f34527e2f35956492103ee2c3133baf0ef6c4fc9f541002a118c461e32f3d0000000000000000000000000000000000000000000000000000000000000000020500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090000020500000201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028b7cde115cb196b975c00b3666706183a47f2077e370813f57784a7ee76d6b9753ba14304ee9a4f95d00afe68be7e3fad2968bc9643e055d69e1b65317da385fb91cea9055f1924c872fe73c59017cd7858cac84effe4f3428c7252b3be484811357278a107cf273f7d4eddc1d41ea378e25e10fda42788314ce3bf2d8271ae2dcdc643f2058a812c213dc2e55a091dd8629c1eaaa65012e2d7d079d2e1a1c07098c6a4c71654189bfc0c045dd6f1674090033916c9c046e55ae73c766dbb2d496d66683fbfad08cfd933ad7ab297c229fbd11d292a7a37d02d43fc8b603875baef271be2f78f8ab41f7f806a475eb218af457c5b9f3410211a8d27cf91f214ebfef0f6332bd40070e46975402d217253d115fe097c11c74ca506db3329398e491a65bab96b1bbf38e5a6c6b4095687fac7abe92d386d547097826c9ab323272b7738eb271b26a20c0c6174e9d0b5aca4514419b744c6ef21c647d48b442d5944b9ec678139bad2ed7c9948c5fcdd3425fd8abc1045753e8f8d0ac7c177559909858ac07542e770f2290040bdb30215564e16803f473523c9a05977767bc7e772ed53691de08d1a9ed97b0c13ce6e6b3e54ea91d8efc95a312958f40ad6c6ec0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744012243be3b28b3195cb8dc2808d8d4478aa6e51bb9694bc4e2c5464c72568a5f34031abf05342fa6eccdfbc889e2ac33a36e0b4e9883014ef9c573cbac564be0a863046cc8fd7c35f0833d6413467958fa03cd893ca86f72854bd5be3b8b35acbdf5097c4cf1ebb087295b86cebe7efde0a3802f13a74036c793241c21d6aeded0830000000000000000000000000000000000000000000000000000000000000000020500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090000020500000201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088378e0ac47c438bd9fa81f1c69f23e6829ad19985cc3226d006c8d488ff343adc7f8fda91e8251c9ca9092bebe25b38f3b75a2405360db918f810fe834fc966517a05fd8907e59f06c294104fbd3fa31717bb052c4df09dece56647c3dba36d4a06b74635e5cfe0fa05dcf36a6508d77746880aeb82d2303cc86957f3db07ca76b085ac5325e5eca6f57d016b9d0a017df10db991250818a775bd3658ff655b65cc6a289398bf45f7722af600978655fcb8368505b6d09b48c9196538f462f30f5cb7cce6a2f6bfc086788e5721cee9231934d8ee48c35a78dd0909ca72031a172f2c3a127dae999abd2e698d7591e46c771fd792ff2057ff11ec20108f7a4280396592f39db04631ec73fed60461f744de9b3d0f064b6756356a5d1eb796fd3a54dab5d9bb3690fdebfcc2b9eef6d9f4aed2c1b22bdeb1bf06a393e1defa923bb1dfa7299aafeb5dda13433756b5cc6fa46de45e3f4ed373a045e882a094e2ce3ee467f08d5b1f0c36f81321e75473f0c2b7d05ff8a2e9a77db2b665fe0de37069f5db01a5ac6472048938dec17d852e382c9c0714deb5061f52af3c3d02cfc55963a1fafc78191d423ae7cfd200524f3b12a5a95d7f3b0ecd92fb1ee5ef040000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744010f6b6c4f834b957e520249fdd2ae42abb0917ae53216cc557cdbf8a0c7d4424a031e3b5a281b84a00e530530a0484470370746ec13a31ba726df390a934d5624541421f4a26051c844998edd66ec1eca5fb3cdf64954ec5c4b76a8834713ee38a91eb40df7fb7ea338c9ba76076a0b2d479e2a467d16b5521c80daf54df0d2353f0000000000000000000000000000000000000000000000000000000000000000020500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090000020500000201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021bd7e2b74142d4e87a05f7b39a3bb1ba5cd1fc760b755bc728403f0d2208b444e5b5cbc7da83a15e9bba464f367dc5096ebad64e4d62e45908376291ea22266b0060f3f41eecf0fc39953d9117a550c8ec2c62237c1c2f5f3a5ff626df56218b2b9aa0e86f65e96d6c405d71c323e3b030152d9a3ebe2a80326eaf18ff7cff52857cfb0dbbd660258cbf4adc9a28044edf66cf6506abffa982ec41b2c549db3866e90224adfa08e03cbc1003fba5706ea7f1311476a36c2f05b0a0264e1970f297b48b533b01de25e435671327017964c8a54993eceacbef1b2e0af55e74bd151a31c0b647bd86235607da95289ce3dd250e48f5e6b7d83709efd8fe6b10326c4fbb12ba1918299060efb70f899cfdbd3a4b5389054e62aa8b7a5c4d4f8eeab75cfd5661d442469829e4e86f4a57f5e4c1d3470b3198852f2e46cbd7cd6d739af6f6ce533589ba3106ddf8bbacc2964c90899c9d02ef78a8c6b81af7415cb7d6e5c7102ac36f14e617c8a60927c4a6f63e4e83a6a08299e7784f8da2a139e753ee2c2530134586e37ac8051773f5fb1e55b40290a2ea5cd6a462a4972aa4cc16916a1e7d90f520038431703377e7f9cbd83004ea751d36d54bc354dcaa801da0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7440116ff2b04d47d7f99f4570eecc8732f36b4335c46cec4e74c36360376c1572f130320b58b92aa04214e0846ea172c02f34c6b63413cd7272cbabd8c133dc85be0e1178a6fba465b0ccecf2b2dd8d8be62c005930d6fff8a5230b54ebb8926518e7f0a0396545501631f9ed840332ec2d7519fc216c2558fb65d600a9344b440e3ad00000000000000000000000000000000000000000000000000000000000000000205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020900000205000002010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a93827abbb5d2bbce8852699f8f4b38ee33d635d107ec128d45830c37b3377efd5dd56cdf6a23b244287c21e1142b4d108e952254e554c2e7987ff49fc1b368d95f7b839903b82a3958be42b34a4d40af7a739f9a483208c86b24beadde75d7482ee7e710df0d55129fc7562b2f13b30c77528d5a73a518ab49565fff74a27979135c8bb77be27a4158f1357b2e19ae70abf8642c16b199b40034306abc4130d2efbccee05a73efda0dd0efb68a124cbafc4689cd6743d4807cd236187fb2d7d6166dc0930244cdd1c57598707bef95794f5b99d86e3048286cd85317b494cfcabb2e99162edc4a7c6e74c3cbd965bbf482b8c10566ad0d62f79eb4026b26a3ae6a93ed4f9e82dca7ae5104b08fa42d3ba4cb35ab9528a85814f7a0d2f015e0249ba6a3662ef6cae16705ac56ec235d322a63897f6caef8b704d5e5e269c2d1d931109271bb1bda37e7dcde75d96d6c5b5bf07b32990d4039892b8c54b6c4fbe6e93c250f00cc8606936f57873b1770876440bb659442735dde755d18b45436b21b9f6e89a58aa38b69fa5090d4913f63ca812d0d1e2ad667212716f81a24a77dc8eeffd5dad486575b713ca6ca0c3d960255be2a9a00bb1b78c522f35f916090000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744010da6631416b1f9aa662a2907f3a6e5b3e2c1a83ab7cabce22dbfe4d385294f990320dce93973aeeab74d1fa5bf300cbc10a9c357b501d7487302afc2405718b7d122d05d6fa40264755ab71fc43c4010531757d3877313c4b099fe8281ca6ba0221a132350f5cb2f367a9cbc84c13144ea25b399a55797be779e0b85a001edd19800000000000000000000000000000000000000000000000000000000000000000205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020900000205000002010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa2280c06cbb539f658f438ec5a4ed26adacc7ec75b3a8b3976fabd1f2a918c2df50227c1bdfc1b40449b41d4408e91531813bf0984f62facfe46c9fe6226c3e9cf55fa6970c764e6762d67a42b74122c64e0bcf3d7c0196bbb3f120bd62101cbdf9ac0b7f8d6a9c4e3b25f35f18e1b4c05c286515b2f748bd41be56005ce42465cafcfa5b2291d6434b494b082b9e3ffe90d363015915f8230d91e633cb6fc32f12af1abf89458708addf0fe51640ea0b5940c8a0c81c31e71d9cdf7717ad1cdc20fffc316ed20dc8465ad080ec6ecaee17f38873e35552e4aa1f6df4d8793ebbd6d94ea061c0c67bf17d97c9de7689efb882d2d8543a83dc336275f55df994ae1c14c1e36c2b3d5af4879e9262c25718f7f76935d4e855f201b015bccc4ef1c3355018440e01187219d6114a5f0e409da8b59f2507e97ad94d0b41ace104ae14d4bfd30511c1851a75e4e593c0b9884c80c783131fb2b1a50f559c78ca808807a0dbbaf4d0c7060aabb3f901dfbcd77c8544076331e4947c8a5191480468d092423d2a843bbd14809a0927058ac6523735416df4d363a772e4a6cf5a5c8b1e30c22a8fec8b1e6d4c0b72e956534a5e74a01bd82b35505046974e5f878837930000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf74401194f97bb6de4abf235be3dc0bd72fb20fa08db46f38fee4fd19f1882328cd7e70321fc2b2399f356b29a81d7e1f03c7009155f1f05afefab757effd0a7d589bc47153c76ec256dc31a8b4a974a8598b6047451188f30e051d3d574962b9872334900e60c1494f5deb01c3e6f43567b31f13e274a726c2027f105b69a554789fd020000000000000000000000000000000000000000000000000000000000000000020500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090000020500000201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094cc2d94105c441a28f7ac48b621f8f005c4f117408cbb75db12a43ac2805e0e2ebb98e5688f4a02839806378d23152f05a08bb7b4be1102399f735e178cd9f46e281f7b13e16882df4b811a56fe243045cdbee559029520791e68fd6ae4b9357b02caef532963a0c38236d714fea52b39a63bf99bb016b1a6145998eaafed2a797c0f444aab7ed38c901016e6a179cdf187a9691a24e16c520de88016aadf1b199748dee43a50494e26a9389ee471f37022c9024f51f4ce59530c5be49fda5d3d891c480250e53d6c74408733eeeafb7b956f614b07dce103a2df82488d37f8e64291acd186ec3d69239b7d9e97367e330580d84f64cf771af47bcd97373bbbbbaaf882ba46ea5746eab28a3613a313fd762cc99e6d846f115d11416d86dea9b50d4643e53b9cb35f39186501db01a175880ca7906b852a405bd013870f0d20504da3162d3fd12623fcc71d4ca15534046bd65f3ce45de684e495aaa567b08eb0168a84675f2c2ea7d7a75a91927ed4f3ecbe547a750bc9d5f29217d178e8426bde459f56dbb574279a02ca2a757bf5d093a349e066b873cafbca662bef3682945e5e93307ddc66e401c4bb84306efa173019dc2bb8fdbd2d729592ca4d44ce0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744011a3cae6e01e4413650129c89ac3b87e97f786b795bea7b45b8c68e398c24fc14032517b7b2dd8b5bb2785e3bbb1aa88fb3b727f7a8259d6d5de97c3cdcf3a7becc2446af58a203cf89c854f552a503ffd340915a2e07c7d68111ee56ae2c38445603215cf8b44b81b1a7b9a6cb7f2e4aa0375e32fa38766f9c96faf0afcb42f8b90000000000000000000000000000000000000000000000000000000000000000020500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090000020500000201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093beca4e11a29f5d08339455a7626247b79d2ccd1920bb60500bb185440573fffa7f47129dc909f48a3ac14ccd7331261f9519920e92052a58ceb5a95d2dab430ba236fb83532dda06304dea55b58e2f6690ee895f2ab2b74f154445d92f1bd4aeccab383b6d56d0172d4e1737b2d91668b7cdf9a8c09cac6f4b10d42bd8e742ff902ee5bf30879a1efc7e2ab24166f6fdb2dfea47ed5d59615d12e43c08748164a823b45c35f42de56a66ac1b697669d473245e94797d133b6a30ae4c2335a4d452e24c0a6ad0500029cfc1ecdc68597553d916e136562b18857c0fa2cae68762bc11447d6c6c9fbec6419e19f23b479710ab0c427f038f5f22dc5c3871becf24f58ba90cd5e7b0908e145dee96ad4d89d70a983fe4422029ce8734e79123e01e44cf53cf2af8de3c3dc320aea27e8d07543e252c771aff5e003ae7b61a4557cb087e8b747b8d7ef2369e6215d8fe892f5f9a6ef53abad9a58fc0db46657baaea31dd53c7220b9fd7dfb9e19158a4c0a3c5b1bd791dc26915a89916641ef9134c790ede7ba78f9512d2d6523e47608b5fd17dc098178948915b9e3c69e7186316f3262b5e82b97a58f5445ba97e9231a3a7340133bec61d25048551adb717cd0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744012bcd7c77e590f2d8f8601af530e885d2f2dd0507abf90087b815845f24fd2211032627f3921bc87611a7a1609985162f0b4d4dff6a3e99182241b6537dc3f3feb10eb9e05df6024b70e10808713bf7f9e3eb2bce045710033d6734b1a0623cfb210173d068dabfd56bdaf12f860f93ac0b9752653835074bbb2d3069a7e7148265000000000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000209000002050000020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f22a3585b8f424aa3e4739b583ed3b989dd7d33eea3c8f1399842ae154e64c2297dd8afaae03ee2dcd912420fe13d8c3142b64d1a990aa10fb71f7a4679efa72aeaf97aa5786584adf93122e0550a10d5f78f3bcbdd0b5c36a7aa032aef9cad3dfb8b63329d3991c8205823d622462ac768b7ac7ccb046ce5790b09aa1e61c5a0d84ef22413624d16b49303b973740cf3e45651d221889c35c504ea41309a5063a5894092d7f48eac06f3fab13d5d40d6690c50260cde46d16d49bfc69029d610418834288431ced92fe4d759a3409ed658a3a2f22d59eae8ba8b4504b9060284100f09478f151f577b1d4069a1a1973526d136354a017f1cabd26e2bf349e7acc2792314635ca1588a6e743cb37223b0a5cd836c577d7c035938d9a20e64473814a34d7f1debf1b21f30f8e1c020e2f99090ea2c0bae59121c8a9be6dde969cb0bf526e4d798d350e46986fa95c0f5a2430122987fe7fb981d5e582a2e136fd3473446c9cd8f44391fced357e5b8768ae0d4db47540b9fb174bf1b73bfa2d6f30bc59e78d99ac1d46b1e332e9e2a1d3536033dfa5303ba8f5c0c2dd64fb52197462bef545eac05d2149295deaa631d35e3499176b8a58b0634acba64de62600000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7440115c1a10b62035a4c952f29ff8e9c4c133de255accd968b3128012445fbd7f3f703263c3ad47cf9e97a8631525eca8badd3c06c0088cb185ecbb07089583dfebbc924e24037805e50775a5c8d0ad554f57ca5672a2d6c92f5d385b702ee0f75aa400003b56fa6d46aa32c177cf0f11f15c40752a33360c10b4047f48c206d4770450000000000000000000000000000000000000000000000000000000000000000020500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090000020500000201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089b66701909307f077d4a3dd8b81c123acaa4f68904ee161366ba7399fb03de4ef9eb0002107f65e099db1bb4bc4b02d148cf00b9c7f7dfc2b5d4b75d0d5040977ffd063efcba76f80b924670dcc6696b3aab39fbdfd25798b5eeaf09473ce4c4d216548db5d6972e299244693794124124afd282f04c5d87cc73fbe09419a13a0e05f335486faedbfc7f67dfc686f950d6ea96c95f13deb73457bf52ac0ad9c68308a51840a1559f26089164219f57245f3160591870e1f5298cf9e08f45f839f7ba967075b2d26cd5195f30a3439288f6cd52411e3517536f109e5031f523d255e3d71e032b2e41ea0aa7870de22e0b2d063eb6484a8cdce396e1435703b97f55c0915668a8429d4cb809e0c76ec9a003872110973f079db80c248d965402a927b7439caa80943d48f5a41750d597bfab3385c241366648ab91b806f77f1e9014089b0978732eb35289d2b324e2fc9680dccc9951067f509ce81c49077ee9aeebfefd72c88af7fdadc7f94ae7f702e425cb5d831990f685738c5e4a8865aae9994657ce8a45ac3e4d37171be465e35930dae7c78c936bc72e25b7832e211ab4a109aa795e27c0fe1bd7d1d28109d27b15dce02dcf6a964a2f6e4892d72630e0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7440107c535abe22a0be78582cd35071a6a3378c356a5a424515f77e2d05cc097656103277ff3275abc51ca997705222ff4b35a7176ccbe9e61bd897bec69792396d66c10420c00c6d18ece2dbe2985d5e762de6b5a2d39428d62cd981c1acff1fa4da3063d3371c3f457fe463933c4f342fa46e713f0e3c5c72f4dabe2aa03471950ba0000000000000000000000000000000000000000000000000000000000000000020500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090000020500000201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081048f28674927d6da667695b09b2cea3d5a5975724ee255866212685867f3af1c37058cc772a994c9fc16a8bf037371779f66ab5d89cd6941ef6276a278bfb85f41d09e22a7233e919f174a0799e604416c52721e797a04522a571f38349b8299efce1343afb69da0b5af0154146fb54c2288d7d123f7cb99e39fb254a8fff134c16644eaaf48da1f47cb970edc682933d865c71a8ad10d22e08c9df463fd38ef481b19a63335e1098ae40893f4062c3a44dea9f018a3335f806c9ab145386ae9c4a2abf05bbf2b6165d615420e76f66460310777209d6c460a5f1c9b6493bb2d81fd9efa1299ec32d005c1c99c80a91f2490e14e8003d66e5c3c2e5a7fbb31182b7298ed6863eef55c04eb346e6b4d596086d2fb4f5580d1a79db1fc779d2a99d1d14ec72c3d9763d7ab05570c873279cc65df73f2d29bb4db5e5fb5eaeeb38568664f9d45ac2b376aa94ab937416380f1985f1433be5413b36fb9b16162a14dd6f5ca5234c2c20900cfc7b106a642f16905213305fc7e872d49ee0b93614646e240683e6387f47cdbfebbd27d65c118c4d1e79b362768ef9192c684c29e0d8c6ae59478e729e964905383c8d4010bffd7ea1cc90f92a9dff5e34171b385b20000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7440102ad76dc2ef34c1f6892fdfbd437a4b411919010be0570621f0c8a4b33fb76b3032984dfd74ce543e1bed7afb31f9492a7ddf4d5a98dae9aaec0b8dc8052e144b91e0e08da090229cb7d66027c3cf2bed01111b2930e9f762a90a84204df742f8a305fbe9b80b41e2dde4d4ade01492560f086cbf896ea1fefe217c93192982217000000000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000209000002050000020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a87e9c35901450785ff8abcf878725dae0286b45c07dcbc2c95539d24d91c6930257b66d3b01b9bd894255829853d7f08819211de90ad265dc1325bf537b0d82dd6f03d85db8c34e3d06a750809a459338a55906e339fbcc74591f3e567c7603c14d76d05cfeb4eeac21dea67a0137019eb8cd3f534811e987e6de07af64fd0df693674b1453f2f2b4a8851c2800cc37fabea8563f4a1f5e5d2606b38aa251c83940c5343a44a1ace0a02c81c0ef69aef6f8203073526132f70b1ad6065861ffff5f2a7092c3fde3f074ddaba37ab86e946d01f6959cdb3559637a484335d6c1aa07bf3d3f47105e4fa9700cf80056f25a2fcb0922bf61d9f639d64fd287c745b321129678ee9c94ee8e5ed5d9d0f16a835c853660eb99250ad4bee0aefa2bcecb22adfe5c619fcd8ac3f8853db9686e22f6e91991af21df4fe9b642d5c43a4148d25ca19ca00c4c07601ee38136d39124caa2054d23ace0d818ea496a46dcb3f847baa46ec31b4e0ba7cefec46a954f6c984621371f696b1729197f3103e2c229535e2fb9c4a90277b24f61efe30da2c7014eb32967129cc56653fc47cff75cbcef1c18b50774cd7c871dceb25850b9ec14c7e99a1de4b6611949b6806dc9d0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7440110d222f5485915126577d2ebf29132eff45b81a4264771d20131cbfe33027251032a7210c03e2975897488ad3fd0acdd474a452442ac779f67531373b7b9e87fe10e82b8d5e49a2b97138d24e9909be68f67e09ef1c7ee4719078000946cce31fd17408a01c74fc40ce4da5a5c3443b41916674ac593e923d369dae7563dc2f1000000000000000000000000000000000000000000000000000000000000000000020500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090000020500000201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028b4409ccbc18c6c94497b3af8d9f4e930aefe2c78be847c0c867293409f9af4abb144b9729efa756d73274b470b81b7d4598464cd28e6d7edf88263dac435060587bfa74540de5069ee70c681fa8bda8b53fb9992c1c5fb8d6ec029465c51251be877201c52004faaf1ed4be7b7dc3c3e8bb25f62c97bea573b73249179f2c20dfda24076cb5e84533edc92d6f46c919f161d008686855768f5d0523cf2a17546119b1e3df13fd1f0344ad941c8c131ae897425c75450eb4ba6c4ddef54fc376cf8e896366c01ad7a027bfca6b8f6b9efdec3b8e284975c0a409042e41f529f403602c89dfca931b5df15bcea869b4c2c333931397bee441740df9848ec334baf9e6c48b3686d60868f6b849260367aafd1e182d236a496c623807d94e880713e69919e1ab2530bb07ee746d9a9648c1cb69d70fb8498f1f974f2c7f13ae935986adee95e48dbb3ce4e4a3923bb33dead351215f983a70e70a8e294def7a9658a7dfcdbbdca2a1f2d7b6096a7d12f73da6fadcd78c4c04b30568c38737a59989cc4568d96a67bfce44fac00a91ff52be301032e8073fd8067534e95b52841e52e06aad5f9d3863636ea33b9806b0b22c85afbc5cafc2cce6e3e6c981d4e82410000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7440100e93b5457fc63eeb0630cc9d84cea9539e95dd912a043c3d3ac2a645c71d913032ba0f8b965562b999607ff34e9bcac0f453eaa814f6169eab14c02f5d4f7c58201a5e219831ad9f3b3211e4fb43d8f6a806447e2dc38105c5f10df5ae4a61d1004199cc434bb1525cf8b05758912fbb016cfb541819fec732c1d233fa307351c00000000000000000000000000000000000000000000000000000000000000000205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020900000205000002010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000868cf53720f6eb4decfe7f56d870d351edd052b17314466d148c987793b65ecc42555af64318038cce456b6b89751363ff7b660c1721c4794ca932b791dc54e04eca92f15023db36408f9635e647b40053cb230b60c9dae138fd4166fc757ad72f509d0c5598c992b69d80609e92db5e6ced08cf899476f03a19988fa983664bb80741fc70b1ad83baa9308deddba206e85cfbb7103001e27931967c571f6df70ea1643ce3fbf0a87803a42e3229d989450b0a1020befe6abd50b94b094f87380d2a72f5118cd844c1e9ed617483ccb1cb80b9f22634cce5feb43dbf9d4c0cf45565a22f1307de1cf1d6a0cdc3ad0c6537bf582b97c948de4001235f59884a454cf3469ea32677dee984f43eb0f6449441f613aa032ed0acd2d237fdbe988335fe6432e7ecc14bbdcee5f28884b54dd98787e3d7910b1f0ecee604c172bf9ddc80106fc6564d82bc15789fef35ccfa67733e436c1b12826eea273b2b54ad02412d7269b347f7ac92a7be7cd5ccaef0a7e0857afada72cd75dd0bcab8219d6f66939c7372280313f75bc5af323dd2bd6ab16db90670572924a290648d38ae4daf69b383cf90ff7414cffd1157581956e2c2ae0b8d8b94663a8df807f52df391ef0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf744010d001d37149262eba3dfa8eef53be599a6187979865f880da1e9e3bae19d9c9c032d897f41dce55b34e43265ea69b3daef2ba76a3126df7573490b763748e9757a290d0a55e8cd305185deab7d7b499d2531534884e8050cba1324a2d4d0584c80080ec659a500fa70f08ab3b6b0da1a819b33f858629bca479f6c0ae556ba11b20000000000000000000000000000000000000000000000000000000000000000020500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090000020500000201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d486d79923bf1a3ebe0a8460e180a2ecf05ec4e01a576fe26eea8b5d463997807aea0c0ba32e94d5b4d5068906c4ebf334e91ee2bd6d84781b84d1cf2489562700e5fd305c5974119d7158156d2320add312d3a67eade956585f90b8bc624f1bfe293cc7b1474c24d976597c2e0f3bbf1acc4d63d242fbdf5a0b02047dc5ac771125d0ae5a4c625c08517ae64687f49761e906f8f52d7536446d0f921bcf063545edb8c3db3852653a7276289bce4301587d7a8c20fbf47afdc693b3166b63748d6d6e1ad99f22bb746962fe37f11a6c496246f9531e6fdb862f0c0a1ee4665bd1349698dc8965b31140680e22c0b94a3d79dfe5c817399610ba8a3f38e1343c17a5550413abdbd160537912a4325dc2c6b966eddb61594925d403aade716c899b1d2351155d7f96f0ae489615b1f7a37ec0348d81bac8b5d6d11e1c78adb4bfef3bf2265c443c8fe592bfeb918eb038bbe2a3d8a52875c1ad5e9223fa7d1dd8d41806007dff27586c205ec70c5db3611cb33a76e1a82a58f56380ff4abe822e84de68eb03bd5d7bf3e86b57ea266605f4a556de381407f94a2ffe63aa0f39a26bbda22ad9f0630f469e89702dcbe3bfcbeaee4e600bcdb00a8794506a9c8b00000004000000000000000400000000", + "16e10e6b3d6f84c567923bbfca9ef167b4005e6ad433c7787e78838305e629fe00000007000000000000000000000000000000000000000000000000000000000000002400a432dd07dd4591033f07718735fdb1ee37beaa6fb2c521273173c720a1025500089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb300000070206b1fad0b8df16a6cadd9aa5a851124b801c70304fd2caadc194bbb08d991de000014801914714ad410b2542c17e11fd74eee577f4d422e226127af83164d7351c6eba800001500190b2bd9a61e15de13fdc0dd5db50292162dd32e7193b1d73f6a966182f7db89000015000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000070dbd9ac000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001af376c781753b64af719d30b6e0d27d0db6280bdb214118ced6b6b1ddb2a96854dd4b8ae000000080000002400000000000000000000000000000000000000000000000000000000000bfa6dae012dbfe3c60875c1ca15741182530c91378ff562cbe1fae01e0b66e49f1a62dfea0100c9566f7ce551b64509779fe27af9f336adfe99fff28196234acb391ee7bdfb000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae0114de13ac4a84de63d6dd2ab81e66f49a701188ec151fd79462086266c964303601012954ab1693991fd60438f02ae99d4f71e9911fa8f7c82032c53b2388aec6d7000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae010132415a2d66fcd2fd79e3313ebea819d887ae58bcccbc29f4ac0193fa976b310101e5ac98b22890a1c309ae0993314ffeb61071a5ff1339d2daba8c037358414b000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa00000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae0127689fb0224172d73731087f57a6fe7b20f8d60840c85fc0ebbbff4c99b3680a010330b361ef61581058ab3cf6c52e2ef6601cb93f0f71efd4fe7ace37310661ef000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa00000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae0116776e7c782f1c6ec0ab4b27438d81bb3aa985c9a7a2646211a353f7eda88d340103566d494150e12e5d05ef09083ba4e3013ceb53df84fef9de464b3fcc1b1911000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000013880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae0107a6f1134d492f20021796e534329686068653a71be9dd78f664dbd1f6bb6df8010464c7c3f410ca2d29121b5a98662f1c26cdb447487288cd2276b2965c0e1ae4000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000017700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae010766b7d5642f4716547a720768cb306f776eeecc9ee47fa9a5464a9c0bbaf0d2010640960f9dd7f8dc8247fd44661e0bb37c67dc83673a72bc46aadcb21bff41c4000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa00000000000000000000000000000000000000000000000000000000000001b580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae01181874216d8a3bf7a4ad816b745e777f03974ac9931b9c05769d0494db032897010774f6b1f3567b5a8ddf105482fda18c4ad8e8226618ea213729ee3fc12012ba000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa00000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae013027e877677c46d8033e369c32eee24421fd5bc27a43099a646db0547845bc3e01077dfdda23244730859ecdce094665c35cc4a0d1ff6b2ab072590109d59c7caf000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000023280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae012f55ca31d12bc1a0be90201c5b43e46dc671c4848ac5c278fc9ddd904d467a1d0108f07c531e9e4afd1ba2c355d0501b765a7ac0ad919853af8f22c57d6f7aec90000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae0120b14b0836db767a9e6cabcc70736fc58952f213732d106ef7b73b4f28d16ea8010a55b23a0b5fb1b788b56a44b5e201667f43ecb467eb4e3aa8b33c9eb35fd45f000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa00000000000000000000000000000000000000000000000000000000000002af80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae010760631792a6b3b462ae87ef1d9137c283ff7a603ffaa6b7626e8787275f4a6b010b1296a5305875ce0e84e50368d31a49d0dacf59ddd68472ee0ccd5749eb4608000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae012db0657888a994ee056bb4c801776f59a1bf0cce386ba6efe1541e46787ded04010bd77e760cd84d272b4b0a8ade182b9ab4075948292fa07f9fbed16275c5eabd000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000032c80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae01144693bd386ddbd97e410862f287aeed21ed93fca4f2cda163e5f2be311b7980010bfb4e707241f8fd4eeb8ba8fde4f7ede1bb22df2fd7f4f98f98ffade3bf1045000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000036b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae010f28972231aea7ee367a6a0b496a847d101ed5d98ca2978c278b4fb90732a15e010c430d88f79f019149e355cdd73165c91c9eefacdd2211d6b78a66abca26cec0000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa00000000000000000000000000000000000000000000000000000000000003a980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae011467ecc678d4f833bf00f967e6c974315610e65ae252436044d17d375ce2ff07010cc14c8b273f21f002f871444dd5d118241567b4dccddabe3288d281ea180b5e000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa00000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae0120862eda9effcdecab3d9cb1c5926f2623fe7f783963ef7b29232e8883e75ab9010cfef51f2c8fde755e4c8581cd530e736b8aee7fb0c963392622223c09fbd01e000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000042680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae012055ad667d910fb48d7337e8b4e60a52aa8ebda8332299cd6610edc6e1055108010dcb638c5e22a27f8bbfe5109254310251445a4cd49c01a02e9f6f35e09febac000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000046500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae012f2bb993fd2468e95b3c2f71fec947b06078007edeff8dcf37650762b940ed3d010f4eab1d623c3638f7a708240bdbc269b3126eaee565d996619f2e7cf8edef92000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa00000000000000000000000000000000000000000000000000000000000004a380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae010c5b8309e4e5581d4825400170790d0bc02276f479c6f3a80e2e23fa3868e8c7011272b834d6bbd0582992883568101006d57dc655e1681f1eb3b3d0c751acb96f000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa00000000000000000000000000000000000000000000000000000000000004e200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae01157559ac8bc7009bf0e113c08f71d2b2076c7b7153dde301b5653683198e0a1701130564352122a4044e02fecc00d13b3097a87157ea474ad91432585965c38d3b000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000052080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae011cc6611e1aa8f93bdc110b8fff4de16c78e72431b5f3e0ef22bc54f3cb2b5d110113900e30d15e971001121344f94ce569fad4c6d039f256f1a42aa24dcf00f679000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000055f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae01185be08e425bb59ae35eee98486a87614529835fed024d9bfe1002b723395a3f0114e0c85713cba8285420dd50f185bb04317d0a2f8c84ce596415584338802bc3000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000059d80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae012c2edd5a6da96e34ded04aa447f2f7283d3f8ed1b9e913100c4b729bc852140601196fcaf5ac4bfb904346fc1322ea4e0a8a52c03c40851c9f4fc2f839a9cf36ab000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa00000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae011caa32805590ead0a2f6b2737fbc3a5a68aaa64bc34bcf908f66ee7c66c3920b011f17af7fb4db99b96e366070f51098d941d902902d1d260cded347da97eb0bfd000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000061a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae010cd01fa8a1cc7345d0f5c1f11d0b4c0fcab8f60788e09ea61aeffee0315e9a44011f395603bdea2e89afc3f7efc8799f71193615d25029ab312c0b6755e83bfa6e000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000065900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae011f6d2d6f736c2b2c5aa60a776fdbb29606df4d2d6a0a7c244663d938e3163d12011ff8e2381d1116839d09a2a77d2f2741134306af624e5be4132306ed731351d3000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000069780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae0101d62dd68b125ba905acd30a9fcab3d17e8926e1f1f421a7509717b7abe147c40120dd80fe32051cdfbe752a172a2462a415df1c666bbd57498d0b3de036460bcb000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa00000000000000000000000000000000000000000000000000000000000006d600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae011d8dcf36e4fdcf72919c19c9fe85498c6613e8dad5e87e96c26aa97f2f5663fd0123cf9500af0c8fa0de5d41b1b752e11730408a809e33b32219a0883c7a88a730000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000071480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae011060c7d30430b05ba1195f3db9697b57bcde265a193e595b67c484a25198e7ac0124bef80739331fe872d03f8aa757062bdb88071bca9bce67c5bb3cc62b92cc30000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000075300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae010f62ef22049a432a7a18c9c58317991353ed800cc33336d0fa1d205bc723babf0126aa6d32e07eaf99214d731f04ef57a75a0e77f939a22d125bf77b8573d50990000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000079180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae0126e8c6da83c80992d778fe8940aa8aef4ce2952d43b5cddffe0ab48ab3e3e8af0127e44cb64d865a3a910af24431cb0cadd88d90ef0344520e7fe6dcd5f06e5f4a000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa00000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae01120b50e7ef5bbc846b07a58b62f546732acd36ce8887a6db6615d0dd20ef6a130127f04c57ef818d586f7575b05dc790aff41c1f9ff8342cd22c579c1abbe44b80000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000080e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae01127a0d0f537d2bb505a60b28248d9bc1b713ff3c9b8542e101c7a6fe7f4ba968012a0409b7625ecde7159f4433269b198c33ae919cf812dd9a92b4ab2db71b1bf5000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000084d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae012429e69b0732ee9e9bc05f56c2b9d27934108ec7891088171dca7cd841abab6c012af6a1ed3ea944b2ccd24e936921148bd84f59161be0cac03d3822099adbf28c000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa000000000000000000000000000000000000000000000000000000000000088b80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000bfa6dae0111bca088ff11bde12663a65ef6fac77e8fa52c5bbf64d1b53f4e2f3146539666012e55622c155236531992a0a6801b497aad9c483db6259de1c53a34236d101641000106ee8dc1068b0f8c8d36d75e0de495521e410a8812d550ef8800538f74c11aa00000000000000000000000000000000000000000000000000000000000008ca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000400000000000000080000000000000000", + "1753b64af719d30b6e0d27d0db6280bdb214118ced6b6b1ddb2a96854dd4b8ae00000008000000000000000000000000000000000000000000000000000000000000002400bf481f2f00f8fec87dd62747dbda76303da6bec3c736fe5793116b22ff089800089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb300000080224f52c3a436bcca44cf6d896e758adf3f53ebe448f259b806b625a8ca41caeb00001d8028562ac9ed91660ad3190b8becc6e249d314941b0e442f957f90b15934caee7800001e00190b2bd9a61e15de13fdc0dd5db50292162dd32e7193b1d73f6a966182f7db8900001e000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000070dbd9d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad2ece90051d486346ab8cde8f14dfde117f20abd1d3d737c854e6bf9ee5e6ebbd3682e2000000090000002400000000000000000000000000000000000000000000000000000000000bebf784012308c7f71922a69c2cef047ce95d827c124cb30f3efc8c9152d52ed215e1ba0002004cccbc4f25610ac8aec081ca7fa5ecc6a843b68e6f63a19007c1c779c523bc2908947a09741c2e4c82b5f3f24992a62acdd36371589af3ff2d1923c4e8c65200000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000231d52593270ee2836dd03058625071cf1b4e764a148a5ddfc2e4864e81afca7adae4fd180be13111c0e70d1f80ace1b7040a927a1e1ef2623102fafe48c4fc229f4925780f56c623a8f2efb189e6894c3f8b318941e6d56c85fa8d598f4b3dbc386a0f5e9dbff8fb6648c9373a4081bd4fc503de63993dc26401e63fbe7b5f4c671580e70632a8eba14b4f6664977acad7f39ca502d7f311fb5a4aae8f2746c979efdfb824a057783c3d1f568f8e8a7bea68bfb1f85283b2db2d5631bb89c5577bba8f7a1787fbd6ecfb2677b46cba0c29fcf3a35403b7dcf59e25ed1871f0b65f3526e42965f23e232486de81360520fba30aa9482c574d54847757497f85e2a80b26a3a227997800b44800e5160452fed248679b81f0854cfbc8ee64d38f97d89f8b77e7e3d80d071f50a332c2ea54f9d0a51b899862ea2ef5b1545a2ddaf7a9329fd34441e595a08f02a72ced6d8839307f8efc54da581ade78eb73be08c35618cf0ce6b14eb3e3178a404938294fba35f4068b919ed6c08cb32ef3c4706c06479943200d808f7160e6eb1d5f23a314448c25c7f703f31d79f4f9416582f2d45c822c1faa9dcc03718757819eea25b68a6a71f2097773ccfff1ffd50ab30b64642675b953103e2d12b2b8ca66bfefb8e9c340bc6bd0af975b23c88f587890000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784010c4b236bc31142f1d969ed4039c9d126ed164c640068c9dd5e059714581c426f02018c7efefeeff4c5af5ffc88e0454feef2608b19cb41394534358bcbb0b9b63400403fccd6ca242552befbff26904dab09265fd8c5ca898416e3809ba24b1ed0000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009311795ad6c36caf96d694936145678b589881ec17621195902a6b66d59db586c276fb6e7ce079739c9e1471d585f37ace8e6b06befc2a773a4e56300c8cecce6fae64eef34b825ae7b7d51387d4f31fbeba572fd361dd1c7170882042cc8d6351b447e1b66b8ccf240515f08224ca323d65bbfff235e4c630bc7e6a4eeb625d79d8941cd88722932904c45168b39cbd8ccdfd2343ff0d119427cd4d41e69c3b2922add8df1c36ac7218692ed1cbba0bfd7c1927fbbe66211195b51bb4dac80cfab99b33e29c8ae27b371a3d0ff2e6247fa900365662fe7b2a47bd5fd3ff5f2ec59728f6cb9b4709db846199f887e3169c9e4ee690ced4154e9b9fba7f62ed852b2d1b49e38d336172432c9d7ffa8eb808cf240f7991c238dbb3340e77280684a775e83d0c669cbbcf6c9a0a603f989ab9a4555b3a0af33f6b5cc9b878d28641840aec723339c8846a81d53eeff82672a78124c9f7a06658fa61b0348be05fcf50f29882c571cd93cee7fa342493aece292aaf21b70185fd6355246625f69493dd431601fc289c309e058b6065e2c814f61246a6e6d8c201425c67415bcde730daf79dc853b0a22c0eea2fdf06f7fa29aa7fde19c6d109af9887f2fbce39048fa3bf71cc9cab1d712b52c6ef84c8a875da5380df0dfcf77cf3f9d73e73bdd1150000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf78401102c6a48009c63930b0c72567355c6a84ebb3449c74efd54fe6abfd06d62acdb02033e3eb3c5d9f918e94282d2009054852486104213209a5a8863fe6cfd84644d1255d50f6b053509d513ce2f8d505ee474f0c34bdedf36cf95eedae277da8371000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008035ceb026b32e36de623ce734bc8e6b1b90a81b48116ee559756ae79ee05b610ab4c1113bdcd76b6452887a00616c59f81316af582e85468ab38be50ce7da1605ce5b91f9ac91cf3369526c18d77e35a3787ba6850c4261a2f6b23b2859d81dc2835ac913dc3599279475550600f713ecdbd30dbaae5f5088552b79c068c9b1fd177f9bb96b99ec506e4b56be026e587ec768b2dbe765b3a14d4e4c5f59bc3e1764d3fd1e1189c70617e6b1673c2bc3e374b99a156c5f704f3b1d3f3b31f14c4fa9d1c1d843674a07a575966a8995f46eb83c89d63ef678ec6fa6791d03295227c44257cd5205baba7c1e7bfd2ead30f390c2f13ef95f3e043e461d249bd39c87d08988cc599929ef91306dff55151d2bd8e9ededac2b55f63927b7ed2d83cf27729a27d763d3778bedc8a7a6ff3a56741299c90ce5e0e8360a94e276cd7401f4b0d833ceed5bfda8813f33721e1e0e3a7286978016b0ecf954d57e44c4c2bb5eda4c0ed9b4129910a53b605ae0b5546fcc7a65281ebf3f3134feac4cefb28524b739e28188e1a68f88dd5ed91aaf99644aa65210be483d11135e073c63aaca270e06f1445d4d549aef3320979976bab9984bff77ada9b37d7785fac3be1614508a3d05936fd1ea07e60e6e405ea918d7a902a17d11adce447b17948d7a2c8e0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784010ce49d476fd2e06c78d0d179534e4bab721becc5eedca930aa946564974a8cd602048c3a682765fa2274d2fe6a8275071674d43c95cbdbb37ed00d08adb5fd607b0a31aa868de74676909133b9bfb2ef29efc52a1eca77f4ad53f27e18c6e2c9f300000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6e3db39cd1f3cdeaeb405c9542d39372a8e28fe6c9e4ddb4a8c103632ede38b995f81f0bfe4189ad4b8ea396586a952385052e4fab2db08d39c63b9e99677c1e1daeca1fa5ade82935984a6183ea7f9d6b0b339883e5580d7e5ff36648528fe88e806feab1270f676dd387f534a4948cf35e39c2318a761fb458817ed8f33a0cf14d0bc478fadd08cdae0bdb7a75ce6277af75998f274bfc59da8f0aa6baa7c5ee7ab753473fda53974731712eeb0d58aa6b76ad47c5593444f14bf1a7008b91ae7db5c4f789f7c63b05d880a1ab905e1f7c880264de58b4013afc664d0ab9023279328c80889887fd429382497eb7bf895dabe90c32dfdf1b1af8f729fef40533a6a178d1d09ff8bbacb8203be3331cfe784522fd3636daf59bdf897380463c18430ebf91bed9bdf62a0e0fef304a3b287fc7d97623f14a1bd717030e56281bcc0e41c8d4d6543072f80500763f343f949a6e79d34e105427644cc6c3582b5ba9b3c1e709f45f4ca3dcc9392015eede8d1f6733df6bcc257994d5733dd8bb2922b8d2012275db66a430aa144bc774f835c2872bebab2015ebc1b580edf0e9948f596fbb1ae311fc1d3e81509c7b9fbb0953315ee4c4d674187b042b885a5c186137d6a31c0177c2012679ca1f8e0b115c5db4ae72efef4e958e2efb665d5d30000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784012c251abf907da98796a9409da947d4cd7462150c465ea65407cef0ebbdc2f08a02049ae6451f57d59dc20dd5cc4aef23b3447c987fd7544ef5875c152ef128f7ec2881c9a684022de0b25bb6c1eb2647943e69186949cd91065163448a618e4b7f00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac53ca5969f44d9f09889384d3dce8680b846cfdf3a3741f95624e218d6ed000658576935fb7eb6cb6b7a3e1898e8465bced4092757f276f752c4182b662f88766d13590d10120e3089f0c18dce5732e771b37bac984d3094eedbded695c9612e45c7882581b5c569e61341794dc48fc44da490d13f61888fecb41964a1b65a7f96f133407a01a172f408971d1e968e54304ac5a3271900a36a1e7ffdae3dbe7291c2a261e15a1f49876ed9b2109b267ddcb20c84418d36d75a40200c5d895aa2d0d0ba4f69ec1336c07920f57b5a18bd23e6ed5b55027911733eb977abb3040b7349a08e8712f9a1380bd0bd04d68d57e885b8912fd531242bb8411eccd86ba688f0adf6fa7f59c80ea63b4f3e93d335220704d9961b63761510ced61e1e4cd0d87f4e743e7077c1024217395bb906c5792155d172aae871274438af14c832e244987ddfc2b973fe4857d81a7b844922829377aea4daf088440125314defb1eaee8a5635d90db79b68ab04c4e7ef34850b959b48390fdd46cb99dc732737ef865ff7af0a7b01e89dd209983a949fd96b0f41e8de8f37949d4c604ae9bb3fe22d8ab9d3de3052ba40c624f2d0729bd54959761a66e4a143de4f03d784a9a78cc9ccb681d8a11744b7097c2bc1f701fb1d62f25e7ac666ddaf5d64983170febc10000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf78401234e31a16de3fa96ace4cdc2b5c29270be1a8fc544674b9b3fad2e212d7bd55e02064c5c53463ff192c246319d581e8ee14c3da2bf2433cc3f58d441c1c97abd2d06a37b42a31286236db27dfadd41f8665aba63a375b688061fe96979708b900e00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000115ee83746dc499ff9da12a23b556effa69107e9fb4da438bcb7b1a756e6eb4a71d359ae8b373d1267088843eba10b2f3f2c0ca6bd53d226ab7669e00ba7d6f8e40a33d44fad38c4ff3b18cdb8b399f4670c8266a3b8440c4630576367fe0b92a491fd3ee265361020f8637b91e0da14959f4ad29c5c851edbc92f7efd11a93f5cc592a31657d680a24620d1293e7c0153c5b686e2c13885e91f4e4bde9a0b232650fe069e8d22a79763a609f45c97cbb8bb68ed9a5dd61fea4b70d6c0a63878b9ef069e7ced46a378a45c3808b7ef1b9cf1d6791d3bf01e683ea68022ab1be14fc7eef0b5b7e835988abe0646bf43f184377bba5d9b34733ec039eb2666ec2c1a67d4b42294839625c46a88b689f6f4da88cff7c53ee6f1b24cbded825fed5282261e7834b18096aa6e7c4f85c09c0912c43beb0a1879df98e2403b3a5bf37433230b79f6393872d6e55dfc153840a72c16fbd49b294f7dd9dafb9d7938e2a10b982ae053d5869d1b820cd680010737f5ea9f591b51ae9343ce3ec81b351262861c8d91a8e5518489c35e6bfcf50009680802648b6a570f99842435a49e20c85059d3cddcb74e5dc144fbc5925fad12f6144fbbe457d0a23d85ec6add710f34e0ef6db44f88258ea541fb4590f76cfdc843e8a385c0a75a80ebc53b8fafb51e0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784012fd9a12523ba8c24bbf80d0e4e12696435987cf8c9d8cd565926599eed15ff320206efd9a0aca36a7281d30889e5f34269bf71f7505fa20fcdbe4a3f592ba57dee2bcc6c39b393ab6bdaf6a253b118e9c2516baa04808fe7e24f80c436054302ab000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f5593075e61a52e33957ec109dd3353bf3a174d29ca2299fb9882aa1ce80c6d971589dfb0afd14a787941fc8b9bdaa280682e516769ba986e9dc26944c62257b1f569d4e84e57332ee2551a35f8bef3a2ebfd68dbeff47b67a92eee0f12ea80965a129b82c5c344db29415ee3ad48a437324aecdbea1b5b65bbf202d82ba123fef68b938d4c5a3a0dbc76bb89a285ce65a60f24e77383667c36d0f2a181eb17a85bb0d05b822d71b71d41a0e9c6366cdb01f7949df0065872e70ac64029f675decae2b2773ccf5457e5e82eec49c4ca76005be11a43e6c1bdba61de2db685b4e9acc6ac03151de42ab308e98821b0f8875fdfbe0dabe799d2c9d62f848eafec82125cae1d93cc5cfbf6c23dc2bc43c48df977e604f253f1ec8060f6f09f848db760186b4e407c69f1f15754e3bc10e5760bfdfbab17d7a51f0c688b9553e519dd07e0f38272a7391ec767802aba961fcba89467505c627491123a645494ea911bcc9f9d1f9b2bb5a166b1c08bda47016aea25b5a9feea38d3dea905c51693acd3bc7292d70f0eb123f24bae749fca5eedd4547554b1197a22f810d9ef30f91ce46e59581d1beebb64e5d257ca27dd12fcdf8bda5534dc9d80498b335834eaad4a91d149ac45e907298ca6fd11293b4ed82b22002b1df5cb52cdb79eda7bd1a20000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf78401000d236b74a5ac962ed359cb065381837c0391d14f387eaa83c1264f746fcc64020886df85250ee8a227d81e5e5d6d84bb2f1e0e5083cf0aad83e285fc9f9f57362bd8a1dccbbd1a266f2fa2646a229ef472baf9b07d8c0d226e369f1e0d55b6a6000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008385f159d7a21baa43d92eca3b9ce763087b71f68275121046c8fcbbdd371bad3131856a067e83bc069dd9c1463e55256f26d8d24768c631806f96634362037af01ba9170a4e7f77500e39649e8b4a4b67927de36ecb0cafa6f18d868c337596c2ea74d4781ffcb5e82d015ba568a95edaf0572ca2a60516fc86d0d30ab05d82cca4f2903b4d2da3a94d22221cee58e134d74e630aa3732c56049b7b2fe531eab1101622a644e65d27d6f4a80548b884c395779a2326fdefa1fc46c15b71a783ae42a3ad576e0840e68c93acb863fc7e43f620c38978203bf4808e956ced813d858284163f60dd02603bcb27dcdb584c0471adcc3ef1fb5524289b16bd8f79ea347cd670660f8f01821b084810c52428cf0c6d39f9d854622c22ee1efe15d14d5d8a9c21d17244545cf44a0917cbd1d259452a3fa8c2229a1ab3215aa61efc9ef9fd6568849d8e427a251cc00556540cabfaeb91f1b2fbc3799cf51c40220f3f3429057e47ecbc8ae87c0b3853cbfb4d55455944e84c6abcc9ca8f8fb3502003516877ba9d728db59c719c2756baeac9983b293b1a4df21a9d97fcf07f62ae5869ef9ce9b02055a4f8ec17691e26a894248a327ec4530a147d8278946efd269f204f2f825af921ac2549af9c1fb686864bcdb5cf956e85a12844be921758d5d30000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784010eab7214e327f6750bfceef18201703ee75416f55103c5b2bb451320b9cd707602088e4f4e2deee3be65d8a6fdb51236d6a7483f425831b85405e69c20de35307e0a72bb1c904c43889d02b2b5009d974a44384eb8c0f6be5e4eded199a19789e500000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adaa2f339156d47a389432ac2cf4fff2b42c461c4d86ed82331c0d0a687f8248244822b4d1b3b1900d0e0fd396831cb2ef1eae23247f6267b66df8ba5e8a2cd88b7795dce5e6083f11821e320a82be32d7f7ce37c3244bc5093c2dba9f8d31d1a269c71d864b8cef32de2e7b025d286dc7309403cd554ac6b5e88167f7caf6b3d5d06decc04c08c62c983cad95f8f274489c8713be474e96a2264cf3ef1f3bde60a58aae06e909f9a7c45260fd29c828ea63edae10d988cfbba85f361ae0e9c4077f676fd07b343f3c20c26977455c397967ffb78ca239ab485eafc004ac5b0d2e35fea847c3356c47001c56fc2c59b7cd4ad714c38582f22f4f45f0319971825c46f9a9333b53454890c442f62fb354040dc86d7c381da63259a647a65a08d219cd318d36b28ad6576c5742f5898e9dfb23002782efbf55028108bc2bf819837f1a4b05abda87cc79915d89501f0e24995835def1cf6e9da01e9aa8fec89405e85d9a818877722fffaa21feb10b5aaecaba4295b078985c8a2f18de70fcdea6fb83a79d165ca7ac43bd095b1b4ee6f34f7297126c7c140a7ab37c6f3527f7d3d458fc71679de4013cf99a80d17d7acf2db5a9b1d7c2ecbeca56fe19f18178e1b1983b0df93af0fcc77b07e1f91bf7dc4ba810aed79fa88970e6b7333d09faa70000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf78401196f619e4dcf7ff1eda774cd4a526180435220189519008cc35d8aec3b8a27c3020abaca59cb141688f872a65711e01981891cfaee308b2e3487602e92e4debc072fba28447b8a8dcb618824da063902851223c1c624babf607df88201bd3af1ee00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120d7fd605cc835ce2ee3894144c61091ce293cfc1a924bf155b870e9d4df3cd9bc47b1d18058fca3361cb073dc6c143990ae72743839ce67737282650825e6706a4019d92eabbccbbe761abc77cbd37185e0acad032c80891f7f203c2713ed05319de59ec60bcb3a20f4f86b1065a3f28786e64a065d2e859026e5c949bad258bd5fcbd24bc395d4c885ca09b8625a03e3388f10125b5f684b4e1606b65073d4fc487e829e57b6040e7d6e53f5f7c1d64428d337c6d4255c466d35a8888a1fbeeef9c22945a04e8b2720f6aacaebd4af0ec4c9ce8a77f46bf02553c2e9aabf4fd9e65728195b84a9ab9b0af93208a8fb9282fb4825752b3fbe86ee50b433223928f1550e98840f5c25067bf8f4a9f789197148a3b94382969aedc336f1fe2e6c748bbe52219c7a8471d4a23845a07e2663926757ad9f2aa315f4109aac9eb78426e0e746b4e0a3b895c272dfc6ce55085a9e21b2def3a62ed316608f914141498bf6eb692d7addd6882041f63b2f3bbf0f4ce9fbd0ec1112aec91b95869b5a349ccba88613761def2ce2e78990c33e0eebc77eb4d81587e7223e19f13e5db4f9ee9ec3cf4db0854a8ea44ee7c55d16c67c02acfd1b1a69c6f1665b622e499d9a3e117b232df3853de767d83a063e4eba196258506ce42d276559cd1d066aa950000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7840101fa040d177b50eaf8eed54ec73cda40bcdd01774b47562c67cc773f67000371020f04f9ec364bd3e749f739a130b27a5c0da7e2aee5e2c2488607d934a3819fca135a85b876641192f6a19c1002e99cb20fb63aaced7e1e4471fc630f1a8a23390000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008184b998dc8097149790809286883e7c781f12146c9501d0ac63a810a4b4fd1c9f4fa07400017211ed9b38562c255dd30a5044f3aa3bd4c2c24c6c4b48dd90813f128723d798c0de34a225ed7d3b93865bece579a5fd9425fc72e91de08614fbdbe8e4c142043b1c32d6e31f6b249034a93f55442ee75d3be73854a7a26d58f7b7d7a7d0b7d842bd3619e6f75e71c0298b68cac776c4adc143aa1b88df154ef7f1e786f23284e4d3fcc878c2d983fee68563bb9452d5abcbd7bb1d193651103da0b398f861aea72a61f001d31065397c74f12ea540b45259837ab5ffeca203c60d1aa66946b1b82847e4bb3edba7b162d99ab91dd3ab17c5f7c4554c232428850442263c1778983ea6bfd6b0bcc03c982d3990112f80821cce5f22a61c3b44daaf9befc3a09ed0e0e18c62044334c142dbbd4600fd895ead2b6c57a1cc570875d6f3237caf836508441ee534e0581e2ec1c8240d106c877a156fea2208abb8f5afe35ce83896e0638b3bdff50516711e48fb06675103040e15cdf9c9f5707b4f9de75a2fbf29022d0e4cf615112988432a6132ce6a063f6b392f2f7b424790dec3e44b9c30b0e4c621b2922d265dbe6112d92f7bfa2de17ebee1208e68cb95b8b9b96124455e733415f9bb506690a0afca038118a590edeee1d6e4f878cc4270000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf78401171859dac01897dcb100ec7abd577c51dc73465d2cdbfde09caa060ac15374eb020fb05a1bd02a05106010bfef6e99e8b19f71007d210ecd9085b1c9f3fd4bbe9c003c194ef877254d713ff2ae0650dae64b2f5ca13493790eab07781cad24fd8c000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001586f0738cb8ed23edda2cdeb75a57098b8b840e294fee5523d8fec4c5da2dfd4124f87730e00b815becab20d52fe3c3bf882e03cee872c63adc2cc7922a42c0b99bb0c2d3f75e7ac924bd53d84296473bdf4bc559a7c1d0500c4394c00f070ea4554750c1aa47853bc0c79baab40387ce4a3f7aa5e8c069f284675935541926c22b8b600e22087bdb224e6866d67bcdb893ce47f4045273e9c2a679d799ec51289e6451a80c3c523ed00fd7bfeebafa054a050692b8eb1009ff729cd4834c5c7e82f5a2178af761a425fa3e806a9d158d851082cfb4e7a0edc1a7e12290a7274454a363593b196dc7dc5a08348bb10c0ae31a66a7b6d89053287b8ef45fb9b1cd4eebc156599e6dde3b1d4f4101d04939a0e10a2af71b76ec9b87d36e2864431f82634cdfb476ef097ef243025dbeeda4a9ad0e06fc8e0af627446e8cd2483b049c79c61e62e69bf9d1f9381b966956261ea6a484c18785ad50639baab60a2ec56833e50e76a43214abc1d3e15affec7c3305f8eeba8f8678e964718abe1a0bd0d6f18bc95dd92caa0ddf4866731e939cdc599263e4880545f8f1b4ca15adeb3249626941ad0bf748bad486114652b6aec4888df3f141227b6e7619fc0c27a34b5034557ff78880f28f913e2c17cb98c283cc8621f0518f8e2fba17af454a100000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784011d0abc1327ecbdd1b9771e06ae6d344ef0048c6c759ac9fc5cf0637da38a3d70021122fe9394c4be73133aa9c09e0ba5b5e387541bf64a9e28f16de43c87e6b7262ccc7d26db47265af19647038d4ca13eca9f43c868ffeb66071292a99842c72c000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e663716ec3f641eb134ca27f1038eb7b4238acca3746b2993fdb44cf854c1b2ed2e01d1fb28e977987ac5a73827036f05e7be9af744dcd567dcac3de749c090aefe5c2e4388059a0e9e59fa2fbca19f37d9758ca744de5a0d6238ea586925587af798fa940a8f9d1e20cd2e2b6f3ff1eb9e0c61ee2c3b13201066ace57dbf0939c434975a329c953900cd8c6140b4daefb42f720f8bdf2e193c8a291bbac75869c56a5bddc53b41e987860e80800a1da1f8ea4269cd03af5e0a275770d9903ad6a1a4b76360e67859547806922c3b6a6b741a66fe0a771b51482dd1738b3ef68192acc555534d6312db93a6d0af292367f6266ca4ec13f566837cf54fe5af32434a723d3ba400a04d7ed056465bef2cd6e50dde3cfc83481006da5b3eb02e982d57cce7adc3c9c9c173d8ed32ae25dd360807f17d626340107b16923514b63b6cf0903c9562e60e8330c86f06018ee0eb77e9682c7de7ca9482bc1660d7d8f825e3db5ef7bab594aadfac7bcbd22a3c2bf802d52c9c7456012c040f04dfaa388c30ad6894a1f6e9ba220bc3489f3ac536fb8873fd8349959cceeba65ca7f4a28d67aad0770c07639fe4b3a3f07e9a562260f45c344b925d06f54f05cfc19f8887167c4a727987a4c2de593813ca54c6c94d644628f60b3216cbcbdfd814ba650000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7840115d854a1b695ab1fccc8e32d3bdff4a4da773d6684a43f3b3bef1a97ae40b7f3021241c28336802eed6cbac2ef97be3b2cedebb79674e5d9bb1a7d0743f90cc2471f2d4fcb08106d8814165a01841d0a644df91d50a91b2e67c14b9de6886819940000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015c57c15678743f38df1e41bcea95bf3b921d6e5ca668b031a0b9974a717d31dd8a539907205d70c495c217ad4c8c714231874bb686fa77cfa58de1a1636af73f7a2559814bfb17a8a0fb0c420d415e08263ff7e13b5e51a2d246262f1e955e90cd848ecf0d55135aeae696821c60b903ea41b6ea3d6f4b564ab967a09f4721049957c0af3210ee31244b868b3b9085f92a9dbf8617bdd27cb83e3f24986d901fbc14e8c1ae03aff46994a28d44e2a44a3afccaa9bfeca618b577d327d95f09b5c8fdd90de2181da05840b75c67a0bcff9d55e1b8b396977792c21c0e7c46ef95d72d3bc3554dcdd5ba8d52a01356df24ab1d9bb2527f5c47c1d1528ea7607f62956809f2ea1ce49743d49a0c4a65cc4c2baafd1cd318ce86c438280ca90a7f6e5ea40faaca07c243f7c9780e18a444c66b9a25f69317ccf8d87e95576e81802a638f9bb9ef6499f4ba59f55f4bba2f7b3440232d1485ed1d54d464ebd4891acd13aab05899e8f1a1b82a029e52b5be443851495691d4dec621b5fe673aca10c92521952e9b8ab8a28d7e82da82e0cd74191f92cf3f25aed0c6c319350220d5d4338ddbdc3c26708891b07d8a6cdee6e9d36a8025a7c09254f1599b468cda682a8597292d42698e6833c78e3d58eda54281db9c4fa3aa57bb0a3b5d92ae179060000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784012800c6fdcf35b902d7e5f1235adddd8e31a99069b3d5cf72120c5b6769e94038021335a4a24ed7629e8d806ec537815bbc6ab2f7f93d2887012a0c1d98d169c7c51f6a72bca5d71fca41cdadc8288966a0aeeffb5e34412245b46d4408ddda90490000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011db0800d887a0feee06510b08d42db4eea76065367024c5a983d3471fb3350d7c2c8f610a40fcb9e92871d3294f7a46c7e4966cd94d995d8bcd4b23815465b1a20018543bcd353cf94958fa12e5723690f7aaa301cb7ce170da2a11f9f9f67906eeb56fe3cb270e845feb44ec51cafa28161b5ae12dd344f05e6b7e4744e28dccb5a9b9d1aad10e1901ef20f0f600f1797da7a645068dc1d9b9b8963fcafb351b6c63bcd4a52019ee457083dcb015cab6df47953a3fef4c85465029cd767fb791ee11f2fb9a9f246e98187b025c59a7fdc1cae6d1d6b10bf6fc5078e4c8f7a64bed046474923da8852f07843dd6f5c102f4ca9c7a0c2efec531b7d6147ed4382605d1e1938bcf3f370d3a175aa7b209467657a8916061f26ee21a5597141e87dd4842867c586e27ceb300354d23894dd0d818a02c98aa93261f1bb39b9fde6749e17e734463fe0b5dc0058c43f7a5b822b994c1e59c314ba5c8126a6d531583c1e7d364b38e97ee3731996138afee7de96e4d61af1226db97470f75a835127dc601a443daadae3583caed41791de244e37a9a1ae425b8dd520bf0e4a0fc9621cd25821211a06546c770f04967b92920c083d5c775e10a337b4b045e91375920512aac1ea9108e0fb49c3d2317b15d5dc6dc4845c6d8dbd543c42a7d8bd6aab50000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf78401223bafc722789747d64f658f7d4d90c0393923e5146448b1b1d5d579d8d5eec50214313019ba8cf12bc16542ff48da6b6dffcf930d259add671f2a539edfc0e64a07753769becc1498c7627110e37929124a6520db5222aaadf2a2acd5aa00c6b000000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093857e1efa3ed70bb1d845782ead35fcfbff85d703e6d815a455b1736a71c70e530cdac8dc5ebfb83e09e335892d1d9ad0486fd30caa43a61339e5d390bf8ecdf4e349c7325bf4a8ddbf616c9fd85b0aa5a3b56327981cadf3039cc0440207e1fdca3d7e0776c66ef0309afa2c109a66bb22a3eca0e50d7e48a85608460418dc6994ba5467b644685c75492358d574783310dcaecce588cdcb3657e6ce2a467a166b644075b5b988307e2b7f19a3ddb8f49a2fe68f728e096f6d4c56c03af4ee2bd6185a2fa1ed78462a56fc9ec8e42bb2903cdaff9c78851e075fa89c110a1bf6ce0e136615b46478abd57f0b49a089e1360d617721a854a4d5aca0c2f95b9d242be28675e6a72e37d63035ac148c5883026e99ec6ae57e3f692c6f577d5b4db350c1de7a7ab5d8fb4e5e140c5a81aebe7e36cf70443556186f6e5a5ad28b73b9361215a31c2d4d3a744820fb442ee42b6a88a6bf7778b06ec2a4c8c60462acfd2516088cf5bf213140c08b3f830b441942672614ad48e463f5adde21caa52e1ceaf6925c9f61e0e0ab375417f5b5c2759abcb54599cdc9fbb7d1e394a428d53115ceeb25b06e85774763b294d4700155e56a8c8dd2700014771a87da5b05b932da64b30c86b4663b7e6031b0a3c73ea4f79cedbae91a489f0fe20f01a67010000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784011b05f90d6d4b33524da0a7f257e95e1a75532a7b90192ba730734100168ac505021546ef3cbcc20d5819c53a4b15e7ff5e2ca8b1001cfc50e9b32935dd43b5bd8225987a705d64d7fb0dd5b7b5274d28469ec15360d101501b9df004302a93602b0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a2f6bb8b6b25852b20d5a0589d6997ddafdd36462267a736782373842e9bf53a390d61acfcf1774ee201886d40011feb608c61e3127cdca8bb1efaab580dad4432b6126488cd247c150bde08e6f708c85d304c862a0f64dd105827c44716f5c02e3b9c027b0323f2a340846ed7f8aeff498d39f87fbdffe2a5017e4c3dbc4d767dbd7048008ed2b16bfb581ae438e8ee4711f7de7639035fc605d1a1313f20abe4e0477e96f4256b6b2ba542eb4eba1e3eac5281bc8041b8e143ed4e25f6d625105a5685edde6fcc38d32887df946f1c5489d73802b5be2852160ae5db755751cfd4dd311310f1d105c3999884dca40bd2520107a438a71671aa1b36859e60342da6b89855cfda2d827ea3e5de2b767e7976d7ceb9c97762c8a67c00aad710b78ccd39da1ed8fc4a7ed9b358a51c24ed83494c4881bc443d39393486a42287b8e326e45645da472c70a48d6a8c0ef416c1d26f85f0a39e75b3df7c937a78c7001719507611cd2ecc9ab9ebd813790314716a7e4e087890b8ed13de9ff911338f6a17e1137564f97bcdd2eb30adb51c448522e1ed989aad75be9b522c06e5965bc1c03f11244367e1305ef72098ee4c754b346e38a663790394198dc582ba01b4ac6bbb86c56c5274dcfe17eb8829152d307adad313de2817b64cd0f432788b0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7840128d011690241869e3b99789250ae4c43d81eb194362f4e9757e6890735354457021588c8b200c961266d22915b29b1a59ba8a1d7ece11f2b7374fc1554089a76dc0d45cdffe20fc05b60cf17127d8635d2bcb12171315b6fabc1b8bd8a3bc0e5f7000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a46e32eca3b18980b94aaab3bcd57b1ee7a0f18afef87ae3c2b894cbc04f694747404a9d9b96a81e74f8c61e4a421a49c9cdcc38dfcc35b0304c729ee705d0b82fb631344dba9a77ade0f8d8e6c7a483e8478a2fef51b3f3511f856a2df473f9ae1c76078cb4018890de9b8e9d920dff5938882a457d3c97aebfb7fbffc71e3325ac9188a2eb9bf1c1235b59954874ed4934a6b0b03c2945090890e10e1f9aabc0407424d7dbc7359584874a1d15f685120058af24a24424bad40810febb2dcb8a2012074e487e0ab009ebfac7780e6452b80e2ca4745d6c39e60bc308aa5aefbc8bada2c71fc08aa4f9223fac21211de1e9be2bd95deb1fa0ca598c80a4e0f0b0c1c1b54fc31a55c6a5059ae055397f62d1651f38376528056e1aab35a652018040351067665da232ad98d2d35a7abe80ccdbc89966b2d65071df92d56e49de205fbf7b18ee463e79d7c973dbdac1c1efb1b63b53e89f242ba294edc2348ad0a127e5fea3ba62b85292650ba647e6b508fe880dc9bf56be49f216db033f26fbae391eadcd979b00119adef022e7a058766637b4e68f65e3649620cd13833c3e638484a39d3bd0f679b5afbdda8ae3b242a4e98f5a6bed52f5c8abcd040626f72ae53ea37f2aecd8582122a769cfbc0d2be62d86b636d4cc0339f34d3e8efe90000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784010e403934277bc8d7cf46110d12572bd59d3de22f7cc44c8f386c57b8646d6cb402171c80f212d3954aebb155edc5084a3ef3915cdcfc113198cab3e9e8139b4b910d0da8ca84da5f771457ac98db657d8ad368266736d0971f099165581725abcf000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff5d3292a352d8cb7d19af976f4968ed0cf5aad87aa4e98647fa5a2a74fa7ea9841385e288f524448aff598908c5909f4538e58cbd6325e882a6c4dc99def591fd9ea8f3d3a3029147b4d5e3078865c07c7310184cdf84f0a5ff12a81e00bb6013e67e01feeeaad94ddbeb7807321225876d1e436355ba0065ca84af20d48f2d56c88a9f66e4cbb181785ccb3366e6f0cc4bee33da3d93ff837e90e4adcca875dc3ce7c62bfd89defb9009c46ef3fc9cec8c9d94065d91e412db2a5c81d766a8881b2758bd1e257b2ecc349b8ee6f4dd324263059099823ea9941114bd92a3a7a575e259c1d8c2faa17c17201cb71ef362e21072007ffa1b1b7d5a7372f10c98646babfd1156ef7be1720a4ecb76128505eaee1738fc626a8727abe3f865aa9868518280ac099de8572a68ea1d4e073a6f40bd0108794823034042f17380cd931265a865696585c8c725fbb399274d5c1a099ed8461c0b33e8a4654280d4c83e2fab2a5b931e6cb3e70b5222641d9244e090775d87d02a3f8c09792f25fcc5f77aacc68f51b0a077c9ee2659162aff21dbe4669571137ededddae20a34a7395ee159772919d75f0a6e842589de749232a9cbeb2285d0a41290854582c5573d5a1fc647b78b4e778e7b92d76c3adca827e678d4e8fa5136a03724dbb92175c030000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784010aa172dbcd2c6ac2562b9d7c11fdf01f19ed6d4abbf6c193d2d62ed99d38d8d50217b4985d65d130c450c89c569a22dbffc316cb05ceab57b7ac83495dc60859a81262eabd0aff248e46383114c593c6f35c628b5c6d97115d632f9f9dd85169b5000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a7d0febd1f2153aeb52319aa17c3215889677895d1317bbd643d884b4cecbb5f6ebdf81feedd704646d6284e216e7e8c99b700e2eb1d982d333b48cec6451766d30c5854a41c71923e4b8cecfa5e1c780256f88d729df66413664336e064c24251ff6257d1222c382e979e3a693c5358e5ecbe2e68d1a106d0085ba6e52af236171ac0d49ba4bf0356c30eb3f20f61e365240f3f01c1d3593e9c634404b21a9a1d6a1817a413eef3b0af3bec75436d2fe7bdf8534c3ee870b18252494dd6812fb31555e361fc52595a661a466c5958d4a2e100367d1c51059352e364ce7432f56a426d537a239c989dd57de112065482173fd3e7afb9f8ea03fae459c08d248101a9c00c1749570d9db4a473e8d9ae31b1c26ed979876eb79115b166d784a322264d6c2ee2fc515f84ff1efc1d0cc17d9526a43414b6444eeb63cbb361a80be0ce5368b9af77912ae51929ac8420f52d870508cfad00ea7bd49d09d6ee534d86323ebdca70caf65a46fd5805c03b222bdc19327f197670cb9129af96ad507303d627ed0c8093e2cf6bcafc2d384df14dd2fff96cbeed86653bb082eb31ba02fc4e7b84c83468137dee5d0131819d1a4e066a6e976b744014c18b0e5518f674fa7c28b7e04961cd7549891730e428047157b8f8178ce45269c0d0533a3bc04a90000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf78401158e9b1e8775e13cc4f9f5631fda3fe27c29fbfad0c20b5abe1aa5a2af75d1e902194134631c0c49e9d729b22c0ab50a0b599b877a4bfaf332f4db0d579db8eca827ffa814e68ed187c8dbc47c1b99ba44d963804b5c00bcb3e2c3b6790935dcf500000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1600b38b17e32f84ece6dcad7874e647c76981252de5d12d141deb6d4fe409d52e3f6598d4eda18d288b7f7f830b9041ba83116723ab1ea3f5a06caeff33beffba265c859595f6c32782839dfeff17f846a8a6788e3bf1cfcb117ba787c8c52e925dbb32241ea73503d43a3029640c3849ac44256a7215c88ef8d63cb48a5528e056348f735486f3f3226345c32152b7e1198e30165b7c95626fe23246b50f8a42bd8c1b862a640e71936dcdf3c49a0cf8560e64e9bbb1562849da1fb88d62e6a18004f54ac40c4aec0b4a7fc47879307f64ba3de90525a36cd87bb7c29766a28033908b3d9a326df83a77c6766477f20ccae599a5cfb42fcce6041a4d5653cfb10ea5ee81aebb61cf0c62e837181103ad70bc3e06f7ff702927a406a9acb843d1a42ac14eee7de1e03b55d04c598360426b4f516c9ffc9056db20f42c23e5e90c6f015dd65ed840cd3e0b1171bd7a95a333907f4293e2b621be04bf0ef55a349a668eefd436f09391227a4801210a6af8a983c1e216d5756df4497d025ff6ac16c3c27b2269e41fadb7bddb49985cde61090008d979029810b1266ebcc78b9563d03b1f383f99952c09df7c05106171baec9b1e40f79b551eb4b4a746fd648e6ad4ee549dd4db9710ad20e5b97005a60e537d358be39a0d00fe55e169123830000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784011fa08a26c652f6c4762ca44bf02e19d8867957863e529a8818ff34137b98334e021968c12a86765cc061c77ea66abd774afc642ba2c443bdca10756a9b9ea96b580610019c612440ac02378b6f2d583ca7a3663bb96a2344e5bf4ec4208f11fa6b00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062bac37571a5f99d03dafad6c2ef3440e19182489a4967fb998f54d854acce954fe8aad5f9556143bfc4742d77b4aae0cc6c42794c486d6d6871a7d6d87b786e4ef7e5a6675ccb852c41954891d0703b0a65eea18d5cda95e4d2174b2d790c1c3a2551be89c82f0314fdae2815ba4cc8c74b9e0548d4ea20e61fe4c6c80441c70c2ec5c1aee4c94ebba14084d3ded3869a914d71f9b43444d5d8e2f0f9f84cfa9da3f9eeabf0eeb18aef1f810de48164fa0883ec6f21a3490dc63c81ed3819aef7ab5ade57eb2cbfeab2339413b118a3a9d616c9d8d799d354277afca8a8d5953e8ae7dc7d837cc7937ad5ebd1cb9a3dc9fff1744d07db730dd62ba5e0c4315122eada06460f8d883706daaf14075a7765bde724b7c3860d2c4b1bac437fc4077058b27c1bd84d16b04352abc92559ab6f1a636f2b1be36d54760cdfb3295c2ea0d3c5983aa201375c42cee250bea156d0aafe0c0a92c774a9d4e9ce4356bf4565a23a639d946836add912acda45bac42aa41e8cd0a7d3305cd3bd877cc15d181f4ab82ddf61df4129f31c361b8bb949b6897f9c7015dc120accc16d8630e98ea7a430186ad48ee12971b130bf9c87a5a126f2b86d9ae2018eb266c65caed6744f2a378bdef77644c4426db9b5151515297d8b9a294dbe33fd79d36306ffd3c0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784011b5820b84df199ca3e7465e7b100e79ef9652213d74bc488c1eda6c9c0a7bae2021b93ab79cacb670949cd83c22b03b4851f250cdca9a2f5cada4e61e4fab9f8962bcbd21e359de4468b316ddc530522701416254c9353a8934aa2581b21f3c23500000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2680fe765ad7940b72c8a50baa84f7f6c531c35d02fadbb053648cf103802fb0cf5c78ae4c42a404284ec2c6e6a87ac8f5435fcff6ed8c45dbf0b53a68a5721d853e732ee0d001fd926bf1dd91084546c0e7905ddf6c3b37e60acb91340fc52d396a3fe9bfaf4d2cdd5c3e58ecf344de7ac339e0954d1ac6e008161670658b39d74991dbcccbe0647c23031614053cc7b7727769c929468a8ad4f25fbbb588e07a1ab71d40fee441d919721c354b80d3dcd19031158e1a631648900cedd27d1629396a02d74887a6a0d68abcdce2b8dd1db1db653053ac46b08dae49b73f7f60ea1004676be7ae2162cf2e0719b5d561a692428fa55e932f863e4fb110411f6aa67a10ef3d0a54acf10fa249836f428883cd128c4aa7b5734ed05a68d8a5f4f4d001529259bf92f09160c7f8cd06a5ddfcced41ac4c4cb776cf712cc943ad230af433cb690f07586f4baa838e23068d40a12ffb2ae57ec6ecb1c2848609e472cd2fbf6cdfa9d659fdcb822be6a252a26757645558fd4828a42336ea7a71b2b031f857f9e12461617266868987e176c600f7118cec0fcda36a4f41b7b50a80854cb2cbf60f0fdf183f1816fbeec014554e776a8f2db4fd9dfce915ef19cd649a92c651c9d31f786536e27925a756ab0dce875aa405e3642ae6d2e5fea868bc660000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784012cad7449791977b7387e1cff9a4e0d9861d548e84cb7cf6177f973500c1e9c81021c3d5ccb8ae22894dda5aab9350d5fffdfdddc6a18b883cbed0dafb0b9e7b91a3056eb645fabd63a1aa87826c51ee50c91fcbb409b4ff5ade4ae6a6ed6cf3737000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002064129a867f1c955f7d880787af32bfb3985e3cc4c68cfc22efd1dbf496e96c7d4584efa07a12589fc7a5dd040e1eb431e8ee55407a63d7cb8e687a9bf3c478cc18bfc1172cc646e0ec9eae7371c5f935a6fbdd1fb56d27208ee3c801d1dee3aaec043f22a0bb90ede4f3f04c757a2403c9f87c12aa276e35e00951dfcd0317f31a72202387262caa857605005a4c792c1d6a169d7c5cf33aeab8b6f0e220757bbb6552c445bb11194e0c41f4721b48b21e144c8109b74001c95ff02ab1e32a78090c38afc3abc6294eacb2f29a737537c3f982bfc135f807549d17f232a9ed80252e47e0504eeb31a6742f0ce4966619319ed5c926b1d2d1bc3353b0f669e18cd6ec6c414b6feacb5058b6f30f056d3536742b7588576ede8fe4aca8c0916f9c8eecb951a00db4840bc7036ed034c41f2462d0f9ad7f8004122304de02218824ea653a704c22cada745645f0abad1b22e745d79ab7e721354513921f757a17da54fc76183ad1891a183643b4dfb1accec7b84b7cf8f53ddfb00ef063358487b2a1e8f4c5f34a04c10129dde38912501b74d25b5286feb85e18033ba35a066aa5ce615dd9550cea5b9cdcfa5d9fd5b33a49b66c8fee8c3c4487eb859898e656d3fd074f19df91b2b463e1da07fe4171820b79b01544af7596bb202f1f4bd0d50000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784011c253fef486877b7e241d0cbf8db63d3c4896c9a01b8534ae3583c8b7fd40655021ea290a0d53cdfe25cc2b81611625e8a2b1b528333beaf941caaaaa48ab4e8210d2cacec6506b9c30e76185f56e46e272bce5f5f5a177903579453b5362119b800000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000afebb9ecd504b8ed54ea833f9c66f5e4f593b6e247c7463f317b63ac0be2e669701120019c73da8c826a462d0b83ae9934c8c7e3587f34b2aae7ee974c5b62d656e5292132b38c4ff798a8252bc47c07873d9580c7b13f5c1d40dff171ecd7e62e36d3731a4984c3cc9a01352d53cd46dd3642c0fec25dc046ad8945357b4caff58b30636a866182988c41c0dc919187ddc057de6edf7edc9d997929e984fb138f8232e3cec0ea149e4cd9357fb7a667ebf91c6f36bf84e6a267515c0510416ae30e6b792f33f835a22e61af43b60848db047df79e925ce5a15239a89ec76eb265187e0add0dd9d9914bbd46b229faa7e467ff314a6ba13e084b0eb2b9abb360be6620db7b43e70b6167943b64792ccb9b55127bec6942a516156fc4dfdf4da8f2686a6a0e2304fb3e31d051675bc473f8d320b5ec1308458e7efa58c5045166f2dc0cfe849c0ebd7e170c7311a0359c1d21aa2506dddcb7da0106b3efed8c406543c2bdd07a88286cfdf7414ac9f36602b967a1337977a304638679e4cbe0b011bfcd8b98d812f71077348ec52e8faf62d04a968f0b3673177e5c3e13b0c3616043979e36747201007bbcbc8f89858534a61264d30906e3d117252b2f215e45b7cc75a3168859f09ffa5c809e02f523c6c43d461c15d6674076011752e1bb750000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784010a2c434320a4a9e995aef8529a0a8770b561fa1c8cdfb38d460f85dbc471b3fb021ec3993bcfa50f6336bc3ec60b868f6c8e63f696638d498699fb0a0208f1b9520d98336793921409060849a55b86af707fe6014db888f6c530b80378bf85c5fd00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000228a890ea7b326e2ae63e26312d6e1d9029b808a634186e48b63c3d27927311317a7f96789586ed76f226dc468ae3126c7f0992911a0ce66e6378ef87a0f53f94b6d84770474f9396a2478651cfae1fd4f9dc3f08de763aa89b5a19f9e71e9715ba3255f470f7d1b2482be2364480c922622b23a44489593499eb7fd543f79f38a67a7ad856ab8d02d3281dd06ee340a1d0b5274f87b25073c660c57d015ec86945687cda38a66b21ad4dccbd044eb526629fd66f50ed85db6aef6f38b784a89399954db17b0db3abd771c2dd89676b933887c53f328cee118b3cf3bce225e4eb9a06982fc1ce8f677657233403cf72fb3a6464d0df51bcb377d1c402e548fad481061a10eea10a7e0136d5c08f371fb38d9d673f62c316a813cafe0591fa18969111d0de52100b03318fecc53c3368f8febf3c4e00c865aaea4bc7477fa48af1d06d20e5e6a8849d7394455d6f74921502a9d371b96fe5b200a93d8642d3e67c6d2b4f5ef0fb8dddcf264e52efc8f98e0bca5a48696ee64b0e951518b3d14c843f8b23a1187faa7e151713cf955fa2dab8365458cc159d64811f2437ef176f99ba8a84218d8466a8c037b94293aac2d9a6599636536780c71651692a71b9446f35b39f851b168452f4a0ba22fcc00d338feac7268d751aca5731ea3f37b95140000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784012408a6e36cee458ccd8d02f02576a867091af04be6ed06adcae2bef58784d97f021f12c0911c0477199466b6de8b88d0c89490fada29ecebe98e5839c384152bb906e91a6b4528f0d2404caa9ab9fcc6ed24cf2b72aed9dad32bb1811a16ef7fd70000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029fe9de94ad6af36029e0699c824dbcd792b4ea3a5815d356a51068e385bff17ba3b14ceb332dd528832a782c4619180e931080ab5e8dde482a478978341ab449819ab5feebf8092a9a4522661b30a0e2634286ca469bbda859931b2b7a4e81d1174955142a82fcb5bbd5a53909b7d401b2c17dd91ab1fa254860c2e6004cad4ee3775ef86a4e629af71722acc95ba2f0545e4de51226503c407f982d028c25d76eace8a0a237ab76a5c8ee931d0f879144dbdedb4d527e58c6f05f6005c24cc021e4ca064968c806595ade1fdf3144ed6aa9b65c4bd6332f0031afe15898045c7916b46f777bf8aa50309585bf17de61f50a3307c7f01f372c866669d2e3606b57af3934fcbc629e513ea939a61ffac1d7ee4bc340ffb488eb03a6ca0f55648ae8c59ee65dcd31dd168d3d0c3b30c6bcf0a44ef4515a1df67b262a16b1cd4f23f0f6faedd4aecf2a8e4ce3224d68d574a0d89babe065bac85790b1acd6046daa51331662f8f8a6d16aeb3cc9a597622137ac52334c52fb10d433e56d5cec3351e365047f26ab86adedf8deab8e857b66340f558de56da6c7920f2fa089af4978e6ef63f979c724599ce0cc678b93ee3cd23dae81f3f107643ee83edcbd4b8ce48e4457f3b8106309167e9ed17463db2daeb0ac412c7c51d75cf88b9b485aa9d0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf78401174e40abe0c9000ef4681edcf9d309420d65f4dba90c9cb73b2bf78e179b6ed1021f53863d6c8d5c0aaa2cd1bc67ed1e513d53e61bd0f4dcf2e8eff93e9896d3da0b1d4a33ba297a4209c8e45c749018ecc0b9f911b268cb482773099051e9dd1700000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0884b033fdeecc5f62ec99e2ead0879a44f0aecb2a53c1b2e561b49fef980e847e82addab4433d412b034033e199cfe812c7969dd949cae8a7d75afd610e3620290f15fc4f52b95181caaa3d8135fd35c352c1c69ef2007bed886c72b557e4065d425904bece5c3594bd0153a593ee7dfa44e51e4e60abff9271f42b2066ff3354bee90b06ee16b28907544ff768d9cafac430e9114ba1ebab49c900f31f4e1bd330a69ea51aed7753bb49c04201574f2e3b8f5e8b4525728f7ce5b149920d8255e841356a8cf62f54aa74d61b1760035688f0f9e1b7bb0d810933926ef0e27e1da1a15d0157b42b18417f11e93d0e5e0c83c19ab6fc24bfafd4f072b2d59441f6e8aa1b247945bda108fb969b059afad2ef89b270d6d9a17e423c7393228d5ab64be16da398094520cad75e84b133c97d1411c66f904726e3f7e1512172d3b11d50ccaf463f8c155799628d4898dab36f7b4f77b3e85d8623854889d265415b63e494903807a88bc2d99bedaa7285e6e9b19c48dc37e29cb18d0664359debef01051bc74ea866889bbfac43dfc4f3e47f51b747ba90da0a052ffe1b8a3baa53acdb48f7863db2de33e3fad9f807c9339c4dc50b35dc05a9b4de1129ac7b7d2ada1b59730b821ee547d731d52c62061e0685ec84cea51db006ddb893b1de89c0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784012ee1b9963c80bed0a9648957627573c4eb6d9f59f0e63c2226d5f15643423ef002202f964ae8c2282ad8f04baf1b3dc371afea60d919bc3c6790fa6775306e76271972f7496f0e780fd48a2a7a525c53f0a3099c76a6d722e4669b45d6949ce43100000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abda1a1c8942c478e492523f0b497d20e503a7d1a9f4c16258ae040944a7ed13ae630fc467a516dec511bdbe59743b41db75da7f3ad370d69a739f1ab1f1fd7fc27b2d575bd71d2685b47aae409f49ad01401fb895b1254bfa19aa665548f65d5cdb3440b42108def8109eca63e4fc33b60fc5bf472fb70da3e280326511ebeceb8c4516dd91c6885e9a75170c9c3a0d3a3811267e1a77551026c89ce31fe031440fd0bc57629c2c9b59cb4b3e1443cec4e345d35d56df0ce0b4b425230aff57815ba6a506aefe1cb69b658b42218314d229a4a1b5277c1f72136a4b8056e44106193d294e98e80d874e97f1453137624940af9760b4734644075144feda70db68a2fe098a2c8a615cef7ea3fe408800c624276e20250fc60547a7fb2cee24cd585863c7b9a524094f9d5dc851382e90eab98f0225442eb5b6fd20b9c83e4d142c7668eb851c40a33245f10e1eb5316e01b2e6cfea68e3fc86a99ed0ae9c5cc0393676138c4c580ee59a938857a4e01ad5a4b6d4a7eb5fdb22445216066f1be2484593b2e06036ad3414ae9bb2602b9a500bd474328539ab4c96933bc71bcdaa28bb4105b3c9790256273bd82f187feb274185f07cbee78d3d1c9e731a40b655c4ea5b5a322fe0aa3ac5ada72b1e2e7b310e803a021a49187730e1ba082761260000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784010b5ed97ac0a0b2e0592ab2562ae7f4be16b97f052fad3ed94dbb7b6a8343dec90223929d65bebef54c7965be10faa89808bf2935de3f8a60a3ffb323ac9ddcf6d22eede5e8e4e844871b102aae43a4344e6caf2b468641f7651e7b653f90182df0000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f54c7c2ecbbef60d5767fbb831991231e2b6835e3ba9fd76c17be323654d9539fe7d2d1fcccb927ecbea5951e4d98bbab91d25684340c52796fcb280d190dd07742701902c314b73fd9a4d3642082a277db9ec03bdf9aecca9dcf999489a1d567b7e48c1a0b4443a6087b870ea976bf6eff167dd306b1368c858266834a3a77af0f6aae54989d70ca0d80ca8d8fc60b20f85be1476a05fbe092028bebadb991a996832c3f93ca7864dc1a9a4be9afbfe9cb1b5b8733a403b511deb2eca5a0998dd47b8a9464351033dfc6090969b6dbcc0bb9f391173e376b99953912a855783c69849db5594350eb7651e6ef14097b7be451f3d7ee39f88a9415451b61868ca225ea9228f6f495bbbd6dadbada2dc6bc9b250770d6246619dd6d18618af2f63f6c7d38d808ace2ca757ec521fc3070e8db9565850d2126d3b2d1ad6df198fd556b9453a41a162bd54a2d72baf9a69976f4559d0d4c956d56942a8d9d3502af1d1af7d6658468087bb91568b3a6f39fd82f9917e8118538ca156895257e804f2494e1fcd7352c91d40a49605995c00f20a196d4ffb2316184e4cbdd43c36cd3fab6ae437e927899024593c0702c5f79c1fc2a62f9180aed597d72c78aa39ea38735b3a395229c788a3a3e5f885fba4d86fd68e856d903941a0efe359f16c20f0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784012ee3748491b84b5af64cea340627c7663c065795b40ef3648d59b1d977127a4f02241eef7418e14236d42d401e8538a202df62914a7434d89bb6012893f2ec6dbc12371a06cba5c4b59cbc5726f473d1046e04429bcde4f2bd8456ef1ca092b35b00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ada03175e76abfc32e9ae01ece0217f8e6ca950df38fc8d88507e123eab6c9b0c0fcd026b3bd714f0701ffb23bfa269c85641bc7b7a3821acbf2b0d2643a3c461b4e05edf8a3e146665aca5958646ac23352fb67cc227a114b419963f88cc517be2e3a6ebe5a2c5bf934e6a5984e4a3365f3782af65fcdd69a63dca9373ac37b28b847ec6e0c0497adecd3c537f4310b39db369e352f8f00963178a444a52b874998a98ec5dad0f9ffb11a6729d63dbb3afadfdcde38ad9f8601e20e97994eb7885091c7422d43015394e946335ce9187a1b2bfe24ed27cd6c953e5fefda960c04f956bd65cf4458f2a755235e5a685fc5bb068491d3a0e51831f35b55ca4be436e67f41457ef9a9cc8f481b83085e1d91803fd784a57ae0a3ad6e1a3bc82463e4cf3120fc976482dae7d5c99823a114a944f39a589dad7444b2870681b6fb421716d89206e575359b803fa38ef1967845a2726bbd87712345e49af18eb3e9ada212c1ca25c99043f19dcb1950a44706f1a1f50f81fbd568d2eb06e795056ec3e1e026202d474c56a040ae9cb12f3683a1a3ffd36dee183c1adf05454953b6bbbd503b3fc0851c5ed956bac7c7ca7ee057f45ed249be39b6b376a2515955351d6502156ae8695fc9a11e108351614547b9bbae4ee29dc8cc97cbf9f8a805681b0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784011e9e2d660d01db03ff3d2556c5c78ba4fc5d4159d378304225489bb78303a4150224cc7712c1e533c455aa8fde3dc60b84fe6974308c6111b82f83f3ab4241a3800e3b3de795c0e89a83eb382658be4d39eac08838fdd3263cf065869a5248121b00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000852eafe1fe957c23c4546c6778413da9a75e85ad690c632dd90ac48582972e30807bd0f4266af3b178ca9b059ed08facc81eb04240e789649b0db0987370e96b8ca15f2b679269840c4adb4bac4707cdb72c51377bdac1599e4daf09aaa9d7a2e430a0023d6c1b2c709e6837b154d0a23a165830f08e320aeeb68af324aefb6573cd32fa12857042ecaa5c95dde74d5169a0de758b4c462c91aefd67326857f1082e70cb8b69f1a98c58266d401d14271dc9f2d9f9c124c88382027070df6be19db9fa4ece7732b2fa742c543c98f031824d73ba45c0ace2cf9ecf807d6c7cc5bfc039ecf09b5355eb9a12f10502a46a61b64a7554abb934b541a30e2df1bfa0c2968c6546376d49282bc8e0c3c474ceff4f34ac970a23915cb5436c54150696259b8f283668d3e2272c620828be3f532c9064ec48d0fe6bd7961c6631db32670f508f56a649462f3c448417ef83261110b5f24a8e77aff444630c19d056018addbb1ef3662b439cd7769af9be8c1184c3bc24489fe2c662c689b55e8276cc077059a537b9c19d888145920959bcd773e5aee2c007cce3122f78675c5118590b742d77be1b2b237301eb3ea70138420bd217cfa3ff15fbdaaade60eeffb2ebe008202611af19ecbc3d44767d1d4eb84296aa306c0206d295a655848caeec68500000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7840114e9af393d5c34f60af2469ba0e8e00a4b9e5328d000512387769ef64ae9c9570225b0fcd41f5ef2d4f1ef7b38b9c6c5ced88fb75427dbe8719cd90d11978184f12f052b1b08fa2ca61e31d72d54dc1c9d408ec183633a09ac1f4368dc9723b8dd00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a186aa7828f5b08ff3b1fd3ae377a3a45339471b2c93406260fd132818f5832bbb43cab60da54b9cdb0b9c78751e76d9c1d832fe3e52c16e59231be4a08953288221adc6269e3c1425d3b810b5f48e32ead4d41dc5888c421cd58a1132442d59d1282c9e146cec5b1e1df99fda2e253a31bf7970b3068322e0ab37e2a29912bfd3fcafd17ee6ed8b32ddd0bb14ab64b39f3749b49342787d4faf9b4a7d239aee30bdfbff237cf3dbf6ec879913d5de7245dcf6e982ca06044dae63681ef3f95d34803fb7f12fe11e04a8161fc2f75a76ff99b57bdf527049c7b932778c5c402cadd3236c38c76f0279f99f8ffc5b3c67956861eca4efabf94bd37f87c350205d837eddb616486227111636ce2994f3db12e2e5c0777699e2b39c3d9cc9496746dfb6b2f28c53e4962af335386541d467dca0079572247b869f6f18475c72b3f780a36b406c384e4f0b7ee515d977f594b856705df422b146770da1ae6e0c071a5c9e1a5a242c9050c05f86be1b7b6119ed0856d68888f158fb9bf331f78dac812c088414dc6af496f2ec6f1103502c731200d1fc24deba1fe9729e29eb508660e9710e7b4434cb63631802cfb6a05e27eeb003ea148a3034b61ac39ba6e0ba7e9e859e45cf5e76a63ec32e7715f31ca938e85e7bfca990ab0f80b19367b352530000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf78401223a556a74ee02893ce4d7f9a468afa6669995c5952d87311030f10c03e438a30226d45f5f5eb5b3cd29e772eca5b84bd5849b000f5db48852fb7354f27128f1650790781f85a1c052fe35a6a3f5ab215d187d0ac28a153ecb610958c426f37ab50000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a6c8d82c89c96422246f8da72fc975cb422dad9bcade99a85fca46a1abbc734bd2824314587ed2396d2fb5eb8a79d6845339583a84c514abde0dde36171e938d4d06ecbc70b4de60a0cee0c6df7901d35f30e0b2a24f616d50cbb00292fcb550fa45b1be4adca8bbdf79d6f2162208b0e1f43761d327840de81d80bddba472223b8cbde360fda1b9fc48dc37f69590585ff5eec76a3baec32bb0e9aad0271b54c63e05e8d658b02d696307ab40331c6b3381294be1a22c9b27a317b88bc059d079a4aff5f37b4cfb64c84593a51d5141702abb53a8106d986a6030bbc5757ebc14b4bc13333dda79920fa65ec444d2c6f52ad3a91b030211e5d9bc042b39b19a92deece88c847d8f8320e61a54c56df2d46180741fff3ee0ef4439374a4773641c042be905aace7d4904eb63f32ec1221e5f81eddc69b428b77f347543f5cf72e05f0c7ad3cbf9bad5759b9b78f2e2daa6bcbf11e64e05ccd28c8ea48e194300f7e287e9f2f872879a3d26b2d56554d85ac5a7cb1a3cb7365a49e3c2c7e0281fc8e05a9c843227beefd42e5d5e31fe87f7ae7b45adc725826d7d3e6507732d4338ff07c7a21e1699ddf589a896d334e1f03fb282c829a805070f20f12ea59c1a7c852d509c0cfa4f94d3e8b3406c074b668fd31e2023ca725e5f33ab1ef7d40000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf784010865f6a161e2c3f48b9a3f826593eca737ce39eb0f63a1930bdc1d44208e26ce02280b484d74cb65fdf8fd35a8f430d5579caca8efd318cb03f321fb2ad82a52fb19609d905e3be533bc4070a1582ee5c8d7223d81c19c83e9c42c171573f53c7d0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f174cfd8707d8282cd193b64880ef657c5d6b483e217bbda3014bb52e0b4f93b6b4a473cc6a60b9ec82108c59e75ce5b16d022b20abc8884351b5aa4202d456acc5da5b3b7771916d627f06d199b4292c5521dc7bec894b47e530237f40e1ec7e055697d1be8934746ca3d440f8062bf36ef73a388bb15461a5302712fac03d6e8a80d064c55d010ba26a3ac45064cd62d0a491d0857a33a739b2f4b76cf1fb76b7d44c7f9433e158ecb48a6cdbdd8e2588796c2fd7d7e291e4063362a50149b3338d683eb7fd68beaecc416698e03f97c1b635a23576b38718d360dc837a63a7e71275152559f22504c4ee91207a80da4741b6ccdff567f900bbea156422f4ae2c3693d2a2dd0a74aa5e0d24e0c26ec504511323fb3587fb9bb6cf68677f3936c5ad2b45ea0dfa26dd405465b2a8aac8196931ca6a50eca907ab734aeddbe77f7277e71991f4da27af632fda0bc8eaccd452b2e112f9dd30f2ba333ed8361d11ae1f3871603cc6f7b649e6a6dde0896391f38b88e3b7cfa631a58fdce65ad09b56fad6a7e0f39d23a3169e3dfb75b1810fc1ecb8384648ccbd13c02836a348fb04e73799fe2e61e653ec110232492e75deac52c330b6dc1554549a52c6b2991615614f72c62461e320d4158248393deecac34e2a0964442006f1191362beb0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebf7840111287c62d7e98e93d1bf1696e70c66b894c948d46cfd9fc68505ff899f575488022e4acb6d746f399b948941c0534c31c4585fc3051330be883dd84299c6f475d5149062093bb88078bff4b35cf7f13ea9934abebaa4653b2c2c6c75f855c92a7c000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009548f2ad2433cbe4fcbc3a0485b21df9bf96f972ce7902950db169cbaa5cc20f03d641dfcc550910dac71ebc3a6a7cdbbe5b1eae1754e9e2e0f9c6ddf588edab3af5f8660784816f6205c5ee13b3df57190d758773a22dca471e3cff2eb2e3435eec2fecc33801831fe75581d4ebe0281d5c87b4a7a8a276e67f8f6bda9485dcce19575bc30e1d7ff5fa52bda0b0cbd4569f79c719507e327cbe26434b5aa4b538cb7b581e714df4f837262c6f8a2201040ae552f0504dd588f8880454544c01b01c3ecfdf028c078a8498689a79c62c869d60489f761e38cf66c6b5034ff085d6adae1f9f0907ca71d21b0ba500af7a1d8179622b275eac37538d33112bdaad8686d11ee97c7d72e7dc85b2dcd7b5e21e368f827b41cab01ec88fc2bfea6b5c96bd7d1fbe0b761020ad53a33c911b0fb06c3f2a8c68bccf97f4e668e1c7f7584516121b018d22a3d88bef028f0a44f003450a2f1664cee5eea15bbeff5ebdf941ce289ffc9f75210dc9904273e2b3357908e5a2b552877ff5673fa4b4c19265f2f6ff72d217b4159a608253901928786dbc72aedafd08264e8f3bdbb34eacb3ee8ac142391ad106e6178dbf2ebaa999f62425ff4a966099301b11f9b87ad4adb97bf4a115b3cb59ecd01a111209e45ec62403642ac33736fe091881551033c000000004000000000000000400000000", + "051d486346ab8cde8f14dfde117f20abd1d3d737c854e6bf9ee5e6ebbd3682e2000000090000000000000000000000000000000000000000000000000000000000000024000f9c89f0aac720eff077a5effac3fc934f9b1b23aa176062b51f0acc6c8a0e00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000902faa82c8c842a21bc091a4b7847fd4bb53f3b1e49ed6906f84280725576a695b0000268007b616edbf3321dcfe0798e0a1a8af3af5d7030badb78ed038e42b7614837a9000002700190b2bd9a61e15de13fdc0dd5db50292162dd32e7193b1d73f6a966182f7db89000027000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000070dbd9f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad3ace602bfe62ba2061f853f65566a401d59e1e662f24bb032d00a573f9af5bec37819e0000000a0000002400000000000000000000000000000000000000000000000000000000000bec4cd8022421919e8cf592b6bd4aaaabee20a5e9711e1b915b61c936e308eab7521370700b11d478b1a87006c91e74894344f9bbaf2171181d95db66d4a2505617020d3d0200c6751fbd8ddc22fbc5dba6c0a1cbc15eaf3bd0eabb70b8426f83f23ed9c6d31e55f42eed64e623b5dce17be0ae2e3b04842e1348253bc274a536560471cdba0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b3b175cc6822c07fd2e9ef2fe5b70711e5cdc41d2a1d8da12e9e2844fc82dd221b8bc4e374a9d67cd497fe6d71de0838f4dc118d6a3365b26afa40408f2fc6d35a06334170cae657d45b57c24dadaf289f7ed455ee6ee081e8b801e9416514e963a37dd3fa3186e8274d025f2f27eb7fcab0f478efbb18f3ec80efc53119d41d5a7ef8239d1610133cb2d7f94095acc52c836a35c5b927ab22ee53d6baf0679ee844914c5437009066dae7becb30ff198ab97dd259608753138537c9a7c0f1831bbd568ef692e22e16d404a0ce538911916be133e961f863bae509637cc86ed079b56e740c4f8fb95c0c8d645872e9427bfa216d7413ef0990bd6c2c9fe068a54c10182bfd3aa3af2b6c94685fb5e84586bd3f00241e872d182f15625662c41bf26cf8eb90bac01ead98c42ac130c01e4911657499e77035a1099629331f4ab1f8625032eca56ae291a67972f904812b042b2c36398dd2f12d18a269472a6e3bc2ba08bcd8d22f24665df91b50a40dac37e51089a658a1530b932ef71e62b295c942b0183d206c82d7a1348320dc322e962634de84250b60ade91e5f815a5375c6ef4b909581e39524d470a8ebf5706cdc10ab902aedda3700f0163a2d4d09e4c9ec0a72b471480b8f53b7d73f80d6d43a07430a26d3efe3f0e51ad649e02240000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f562ffc30c5fed423cc3b2bc90116caffe5aa944a7909e0a7f49864aad7791f95655be607c3c02e2c71e08585c0359f2dde7636198dba4fdf76db655e9eee56d1c8ad54e5ef6b513a5ca0dd5f2215753c36078ddda3f56a4e1908730492c27d374d0dd9e5db0b7eb05246250c508791f2e54fe86180c98809258d8f947a777a6410b1999c27fd4171858c6b695199255124d394107cffb255b8d91be367ad8c72d71e9af99421b91795c7aa70b0821c1c75a6f2b3a67dac199070b63c3af2312a006c9c30ac5bd20538147e5454a93c3a7a2e9c36a7a20e5e38c7e9f515276a9a07eff906edd28f104ff5847cb259866a85e1bb812fd7d4261c530c12ef9347bcb02b063d8a407707b5ed9d9a61d5cb61376608f00d5fbee34ea92792065b77d1f145958d593adad289aee2f12a7135ad2ca4df65c0f3ec933b4d6a162cb11d38b6036c4ec5ffec84cb7f3c337bc3096134110134276a9a04efb09c240416a539bc908ff35e10602a9d00c02c6c1de254228d795c29af3d46cc0bd202c4f1b6fe52864215b22282086f4761b0b497e4b9bf854303b8d135e655ebdce856d8ebd4871e7bd8676889c62dcbef920be53d8337485d72e466e4b6028cc921b67ebba18cbe7dedee10873411ad29ab7bcf5fce3d0ff772c5f5cf92b41619ccca0265000002280000022400000220106371d7f1522779049d7b5320648a96bd40fa16fb3d4dc54fec335045f0e1470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006dd45b5946238c84e0c77e6f7940112cdc854c4f2f5ed3d6d78f4f9d30aa7fedcce75e58a1408e8f5302ffec8c6dc5eb43c9f47f1a69686a6ddbfe0ad4b98ecf6f65f66f90c19930664a81f2f2906f6389880661250e0f6a4c040e9ed64d1cc9ff1639abfb68adec524b62b778152a59258d5375d4d973c262c27a5656a9485bec4b5ac2f6db73b8f4cfca10c527614a7e0d0a430706c7ad6e70956d56fb1e50967606425e09564a01dbd9288a152b034c84926942357a40160179a3a956172d0313b614d17f0fec22750e5a586c42a307dd97fd804e71864f59086501e7df488847e43d8af189fe31583da3ec4ce318970c8829911be37e88eb009f0a9fd021ec2ef297b65c650a5f44b9bdc92dec7eb000405e76c2b5bada0aa6227ad953a5aa5b6f978f7aa6f96ea7e64cf51453c2a46879b12ddb62678ac4c6465dfbde7c116d63af7b8fb4f6352746cb166ebb846e87680b3235802bc6bcca9f5f7796d26f6e5997ea8c5d0d7c0f95b0539fdc5d01e1f17268db27ac32662fb3e342c7770dcffce28aa060802c89a45a4bba6af50b40f58d6311294f77b4d9ce56752f7807767a25b66ffa1dddd438b479a578b5fae62b26c2733cea410bee7006d9d7d000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80208865f2118b6c26974898bc0a8ac349d50317a2ea977bc25a5ca935141567714051020d8db6e361802b0d8c91e854a808fa8ab39ccf20f65800666b37e32e40c02016a0ad5477418a5cdf337e5247f825e20f8a95fa68d49af8fd2276fc4c59a87184c94007e04db6399f9816014b40ee8bddfa92772e6c6e89aa8c081bb04b13d0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001de86ae73dbb7db6f249a9020fef749fe27d1c50d18ba6eadf67043ec3894195377b7e3bd96e9fca2eb886d15bd55b0f68098fe13df7ace1069d82817829db7af758585993b5280fdab03a615cde2bddc335a9d18a2f2bbf63be3c2cf26908bb19baf677948cda91788306f97900c849004e7df267664208a298c694133811cd1f8e86c12b432c678e8016eee77b6545ef7c434fae0b223b5aafb5188f518b599622a77cedc192e5bd9966ea309df2ae2569387fc2add89a7f2f2765214d4ea226a8ba48e1cae94e0dd7005c709b93ab3d5484b3b6414c912ac1c8a6be8394de3e24a00568fc7c5879e62556cc47153df1261eee693e958ae5f03e522df4c9d8e785b8592462581803a984743a7b5704a3bf0ea283d5056b38d91cd6acfc559c738f139ee37d12236dfa56d7bd0e5742289bf65c749ca1dd21327281bdd36d387812153192194ef5ef08f89b24f0812cd649934b850ef99b60bc2c9a8671e251d5c70edcff5af3eb868428ff71d097cb22c4f6fb178b6e556c3296171a448c33e72110ff7ff5cb895cf348d7b68ce1461e96ea3c143ceffd4421a8fe29addb40786aafae6cd85f7dcb70f2d9e99e8b2ea0e6a5feee5dcc5fc1407954bbd4617b8e68e27ba16d0402c185149221b272d95ad8f8974a241d4924d18ca0821115c50000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b166aee0b2d5de6f95e67afc23b61e33f7a26ba10d6ae997b244248f4c9022971afd133c7bc7b0ea5bdbb8d8a9e0a3c9b2b96a4f7ca35f57e16d2aecf6baf438b411c09aa33409ff65a1e4f6980c715a959aadff4382bdce2d38bb8f992a4d2a60acb382adeff9e17a7b0e3684ab8196953f41a6146390ae9b2211cf0b8ad4aa37850af373b19de12b2a4cfc5f2edd9ea92ba130a4639f18415eafed3505e653d89d530e5ff2bb020d06ecd3cbe9a7715eb4251385f4d31338d7d0b8ec263c73ec78ff6af0da88e29ef075b45baa7d2717870d14676ecd8b3982d67d73bdb8e76a06bab6349497453a6dfb2805269c44e4fceacc651c3996f134839df4798a284a559ccd2ee5a91b49f25f37e3f9df40d48c8f4d126dd9d0e4533985dd9e20ec64c11c2c7a2c219f75d5ef53e3c9d29d4710bfc698997f4061741a11080137623f73ec6f072563495fcaafc4a1159544c96a1bd64d33263ee69d5be5bca454efd5b352fcfb6b3b16953f5dfd8f1beb4b813c63175c73ff6d248f54bff69f83c1785f41e4dade2cf4c5d74f0c3f02a5130e9db85d73bd889397a1d835ab32ef9102e3a2f9e361b14f48cb9c963a516e9cb0712a206f49a2b105c4a561a39cba775c737b6c668fc94dfde9512d5a79852bc7fe8a37fc7fd1d8fcc9538b08054e100000228000002240000022010d6a3c85ec9c4d3e067b892299b3f807536a2adc541bd44b8a6fae657481053000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008fec169292251e49258946988cd0a16c48d76479b1d0955529a19636b3b1e8770e5e75e427cc079d4694df778a4a5e3a0e20490bdf97a23048c7ece8eb78cb2bcca358bef831f4fd014dc5fcc27497d2a3d8e5b6df2eaf04131cc16a45459e109f01187d2883acfc1f10451122967e9c50430733786b5364fc38955ef7e98cc9e181edb6d28e92efc725e32194a4ea7e9bd76667903522d53b623eda2c03238605fec662d23231d8ed8d5f7f831f338d7824dac7a9143bed1d8688e9527e53e97678f7a7694f80ed6a0805ac6bf3b5f44bb9e8060d11f5be2fda2a496cfe7a3b973e8700ba2a38a71f13c6e2798906ae8c4e281f12c052c2921b00279412338ad8eab97664f2968190b61597fe8634a1119655515efbb792d8e0dfc6fe645015ffc9172a96a2ab63c2848f6e8fefc8e52593b131823522b5b67a91795fb6276da167c4074214b48524649b79beabd03dedbb0cac2165d090a96ce13c620be3db92cab544d2f936e618c18522e0a99370901d059ddc488b2b58c27443833f396c82277f2beb36da6757dd4b37c1c15331508ba6955aff87ffec7d3c19a530b473e913a01812f15644a1cc49f6f84e4cd193ab4ea344b9bcc0299624abbd244ef8000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802011ee13a847f6ee7ac87d06c292f7d9e32a536f3edfc6c40b7ddd834f64110691bb030a525a9f050ee871faa65a8e6ad58a80b026eb9f853d397345bc0db05570204732f158f17e91404aabf397644cbd49cb773fd0b831c8ce325242328c69d6c11653f710a7f610bb93060af038c0c5bfe1d17f4bf74c9b21d1241d37b13ff2b0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e54877eaf552a3aaf4058d1a61a5ed58f2d85bce28a513dc145424040cebfb6f331490a5ffcc54e741a10311e4adc27da970e0531d72693478006093d1e251df65db9e813ecbb9e52cd576a12a384d65bf0118565d66aa540bbff8ad59a0545261704bc9f01e30a4b615613d916230c9e8d073779ac229a2a5cc3216e7d4bc275689a0a836087f8917ba3d14c4ed988c4d9e67a084777df2d579400799edb4004f67ac26d577afe2c93f5738d24edf4fcb2816d7d9c0db523016b1aa08cf075b6126285b36da3bf7d21f09025fb507cc39cfa6aad65fa415ec2462253e76e185e03a5c2cd30f235be3c998fe2cf44c90cfe3eb63bee0790713d0f1867fc0f0120e711d72fcb8aba5528a1d58d82bb61b2ddf4400a8966511b61f4dbc7df1977c68547f09f4f957e6b8d78a28062c6cce9b463be3d1881932c67abeaf4e21b607b49ca0d181177fbcbca5bd96ab21559ccb04769b49be9f8b66ba3dbab75c759e415e7a643e638f66dd17c8b500ddaa5bfdb7cb39d1c2f1fba28c896bdc5659305863c1610be5e679e09a791ec37525ee85b5fb92c86dbff213feb2f7004b665fde23d514ee5e90bfcf4ce9cf20c003ba8efc2d6ff537e40bfb0749451b9f1c80475451bb20ad148e648f6d168d36946050b04bde52acdd83fe8e0446cbe9b3200000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022ecc3bac08fd2357573dff9df5360ddf7bc8c72297e9cb33c4edf9bb3198d2a361e7d3d2a8cea487fe3bbe9f87e38508f28554d157ac9b170056bd9787d1d39f96563f245a79f4437a14504812808d2d87b6bda6a1ed082fcf706e1dee73baebb7c97be8f47918b46bb8ed1ac863e7425d7e850bc0fee91fd42f0752fb10c1c06434b9798ea2a89d373a0d3e82110b5bde40c07daabb4f97e19c63c5eb9a6c48d6f0333bbc68188d6520cd9bb82ac33d91e9d6c04b70685f5fac69b145d7ead0ca14692695c4d2a03058a001991f45b0aaed4e7fffa6b29c3ecad529964c03a98474ae288a4b51314ff45ad8dd7b14768d1e47bb5f017d1d3afb13568d847e80761631091ac9d113afbc9a4c586bad7dfed79a7954ae7b838636054310b5ec2706ff7d65ca56f5f1eecf39eaa53fe795f9f067d785ecc20e73cbc3472b1649a070d8091730554de65d526f37698f5bf1593d1a78aacce94be90d24a4c3d6f62231948488d2403c51497b9bc3a4054a19893c8128dfdff804c24d98ae27f47cc2ee0bf6f650ef715e2f741940b2a9a0b9234cf6008acf3af4acb22ad3cca836222dc7043940b38b97d2a14f7397bb60dfdfaf05d6896767e9953502d1cc1503835b5bba35f0655797506e085240a22a12d3f5471e1235014107530db012c16b60000022800000224000002200018c0101c4f1780dd6255d0535c114e315c686510f57341416ff74066630f1d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c78109eb1900176c3c398cab08e85a7ff7b7423237d559a2618841d6f95c3494c1b89c8db50f273f77c0e3651e70c25f33efe7fd680225bac94bfdf7a8ba7326f5e737173aeaa5523e05cab4219ae3366a4ccd3e0b787fc4d1db01c6990af7aa2bdd32ed91439e2df76df8d3379e14c28a363c802521f41057b9cd032dd9ca4437383af06e4186b4ed6e934706cb11a73431646c621b6026b7f9ecb90070329e6919e5f454b5c3cf03959b5b8e39eaa99db9c04d9c3ea7e394b795d6d704e681dd10fd6f981ffb447b5432fdce5b4314e3c4e71c73b545c1c9a4f7c891d401e4cad4848a8ec0894bfff45cb44564452ec56d6a4b4b804297cb8e3b182f2cd6c3b47ab8886f2d5aca8c5e45f8ec2b4e30a4ac33fa0536039839981a2380a4423ed400e6d59d8bc68d93d882fe2b0090395f67853504ccb3eb0bbda93c21623c4e2c0ecb96322d1abd879805ce6db75ce0c144fc572b675808d80ff2523bee5055d08bdea0ca481a1fb4bd705c49d792b979e59cfdb2e750b550b5ddb9730b5f3f37497ceada39f91a936612812c22782fe28621e2ce02f0c55c8ffcf7ed4cdc7f798657e01af58a6a100ce3cba9b5cc9485f27bae9dbe9c91e8e363e69c4ad95000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021fc4aaac06e2754269d08c8dfaa1195f2fb6551c3cdcc0a2102d60f6d1cc725a0ef1b8a40062ae2db11d14877f135b2af889244904226cf3823e2143641f98f302050b714a40fa7ad7484f446db42a757a23756ab5a9b1f2448edb3e90b76cbf0907bada833ec9bd9531b13a65dcfced427847301a750164fa1738208e2e9163830000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075998478c6f61ace03f690a08b3b0af75d11ac2ee1ceddf05fd539300ce65ec460f8008e098246ac71871fb151111922854124c09693f9066eb0032f264bf8849d3839e8531990bd4dc06178fd2724afec1fe65314b16627f4b060f996887db437249d1a71d5efee0d19834741ccde5a7e50ad2548009ec06393f1259739efd7668f7260d98ac8c055ddc59c6af565f76978ceaed98f80a8ae842a99b7046931d3d37c181f7bcf598f9ee8cc65913f0fbe1723c5fdd907a7507d27dba1351e322d20235e5bd3faabe02acad502ed6a9e6916629a4d588462f2ac0fb07a0f464e0d8f6a79ecd5e6425e11e0720c1c2af28dc59f3d0ce9813784f4b6aa803a519be34495152bfe1f79171ef66e2ec3f257ac16f5b1e9994f181eb5085fb5cb4b030b8b6dce55acd876d3167cedddba88594ec41e159f36065e294d73fe3aaa1b9f553b5e80e5048a1c2915573ad0272102099c26ba4e0c848e24d21c9ce05c0c4a65b0b95d6445a983f0e9e249772893f13a4bc0e910b33aba20b497f3c9b242d993a20296e33f3d2ad280b4565c17484788f4624a32c87c57a00ccd13997d76547f12880d67b4a8d16591e5ccf803b0485cd66ba77b533f0b116c1c4a9da9a75cd197dd2d3923889affe228744429823a66f38440f5753f2a9da27cf6e184d7f00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024c71445fa3712fbc19950c90f9a3a6c7b9f5e6126bd49a728f072d7055288ff5f958eb41a969e2822b4a9a7c36c2146993e327926dae0d972c8a8766f26dfea4456febd26c9483ecd859b081f1e30ab4d6f748a6e8d31ce6eb6adb24e197625646c29665cef6fe37438dd0179527b1737792422e9729d4ffbbb554d2d9452a1e3b915e6a4f96306e25b788fb96dd1896f74a474a2e824591e302a10e9ece8447b58fb02fabc1ef8a1564a38274295a56514cb8a0e091d47cb00f29399777b8fd42e92a133b163bfcf4334f9ff05cdd017aa203a19fc6a3bf7be9f199ab376e6b702e94797dfd89367f35d68af0e0be70f21fd35ff3012bf5a311dd2111d692bd4cab8f10e3584308e87d4e1ba29fb03d81a966b2d00def1700a12126a304a03514ae67afee585cf70088fdb074e598a958a4b7e9290a01097338c8d0990fcd6470faba24b12ff2ec69b3fc8197079b34e855c333bfee8898aa6e64a956a4e59189f745451e356f512eda078f589aca8d309d7de0d2f7f8025a6a4598c5bc6bcddb9736a22f040e8a4b3992154d003f80ca0fcb472c2d749d1cf879af1a3442f53d6bec896ab882ec8398abe9f1a59acb4fd20c8ccc9fe20576df650f655a21728c5f49b65f0703bc7d630ee587f80f6e96ba24b1d5ad8eb16f9201d126ca5550000022800000224000002202a28d2e58b26ce13201bebd1b72875f4521845a64d461ad1d2dd3f75ce13c84200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a408c426b374ac0abe517c51ef35e22b8b5f148f94d8cab559a83351a5aa523b472a75b8c2200820501a36aa79873acb59b58b44680408cb3eed3215fd9d66b906e69fc97271cef42616db82db6d917cb387d470babe55fffcc6904b36aebf7bd9ccdf50b04493f27f30d1a06795d80e607bbe6552fa96e871d52fb05bfeda82b86323600608aafc3aaa2994c6c5909023d42e488622811970134bf0be0788498bb45bd7a8d02e378fc651156fcaae8aa730ac3f4570e4f718a709dfc5be0ac1e2312cdb928a4962813819905ae4c4122dc066c7f910b348b171cda291c8cedb2b5e2356c1a0befb93c02ff4fede1c57def611008985311f85e14359e5157d36bba14912b548228cd7df321f5a94c4d43749452372ea6e0df99c524b85b286836c3c722b683cf92da8935c88842fc830ba687cc8857d63856a1e194f8e858ba0f56bc296d457a9c66b9d7139a7eb5537b7bd5ab6ea83ac409dba05b8b79a65142ecb5cc17873d67842b0bad50c8c641cf0506ee59f61ce83fefed7d097b29687c9a14ffd941f84efce5b29bd32f2d6fe733c66f3f474bd0861acec33d709d50e4cc40e85cce5ef5c0a0f2d9ba26a005f5ce4aeb504787d205402155f7b390d3d000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020f440aa0f28414c5ceb252ed9200924e59260ddefddba94440fa8cb9f193105703c32a51ebc7017fcfe3995a8a6a7286e56a99b85482cc152d327dc380a5f61a0205904170faf05bff66f133606bebfc97d81608ab94ff5dadf55bff796dbf32f21bf3cc3eb6878a0a39eecb7ad854d0ab653c16000a372883f51e3a05037ca5930000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b3aaa116ee26d26d82561fff4832be9a83b9fc59bfb8b5c9b7a87243e92ad088820b55dc81f9779ec2743329159eedeb7dfb0e892cd30abc270756fcefc641bd8f901b86b2421badc7a9b320f3d105c5617913a6fa65b4b575f5a6f44ab5207deff48be56b3bcf350911ee5b31a51c7ea4e01af65b7773261fce6a77f6fa42f731078d4a230b1c25b697632d2f17c52619ff138644c4d9b0ce8f98a2f3f1d0e46d405609900bc0fd8717cde637893a858078bd50213206c79160aa1e612b5a146f0144bba354b0c2cf431eaff8481603bf291f6bd70d8b791a0f13ba132ab73d6239b663137c337a6c88975508ea78c404afb9bbd0878c1e88ff40fff509488862062df5dfda345dce8d05eee6ec4461370e2e878a96c5861579f1e81e09bce0c680c7a957878f4276194d60043a91d49afca28c084857587f742b7230f8e56379d9580f441a0375f97af99dcc3cab02560070676452b5988b05b4473790da8fe4bd0ae3c587450113c501f5d6ce994eada4a2966eac7416fdd60377cd1eb947b3ec96a5b071686406fba6eb8c22aac15d661b7f0d61eeb31c4a51ae493a13adad7835668d5adb73569c158898d55fbecb08873c6ea5c1a9892cb8434d531832767e1ef652963918e84d43cfdb8c81d4b273793e2a477eaa949ff65a6d9cd060000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b21561c3b962d3fb343eabaa7b8ff92a282f86458f3b6228d03cad46ca3ed65f1f381d9f3dda2ce619fc1c7bf83d7738cbef8355bff35c5781e0ada567b5c8e8726fa2430162aa9b9a552f8029f3f1678696af22d222ae0483da750edb2365d60a6dfebbade823bb57cfafa358a9593ad3f8b2c88f2f2c07e6d19ee040b83002a492657432622d6b2ebccf8dbdb55e11a00c42500aa2babb9c6d40e5bc0d544d096bdf1acc377b74355c476b4378b16e11d0396432a8b11d268f4fecfcd9372523f9b70b63d0c533cd2a776ed122875896c247ede3bae3f2f231e0a007bfd681d6371682f67ea68d8ba0eef43743ab600ca9920847be46ad4419f6c725f6ee2d814c0e5e120e207bd1ed4f415998678f8a929df5d01e4e4205bcd241c2945880b49e660b2a9fbe9241503f077d421ede86e1ca45796c442e4ca96386b60a4912ac431bca125e2185284552dcd2525947a7c7568db7e0e0607895d278f5e9538112070b0acb6ded3fc5e34657fc26c4b0ee9004801f6942245b12d7972dd7ef6389fd1a32eb31b03ca2ed5365aaf88c5ac48b561e8c639507a3f846e9c1cd1a0ca478e792d5b00b2c705564d38ef13a4f52e617ed4b77d813e77ac0697ef4e85e9ae78bf3b858b323f78d3ede548de884b52f37662a3eca86943dda9b59f069b0000022800000224000002202cd0d2944d17a8101f2c8f120b50a767540681747a3982022ae2cb668853296a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af9e278cfa835202367b1cb79c26a6f47fbee78c7c39bed4906a1ce64d197162c220b9562def9f83bc0e80358beeb0e9a2afa45e553cbd2d9c90a43a9fe3ff6d9a502d360014892eb317146bbcdd21af34aede35161d87bb91e734deb06d72705386d330c5b628e0188c1b848fc82264cda297a82d2ce8bf0caf647aadc4c17a22d384512af31181d29a4799829b74027c12cd700e788a4aadad6cf76e5a12408e300e5b95ec74ded27939936f5371e798586f782bbc0bd5b7bd11e1bf0f356345866eb68d45389a999bdbcfdecfb9452a4e32620900f7545546983b7b73a78a833ec10812be1103a7f6813dcaada43ca649453d56a0e53b6a3870bcf5336d44d96cbb68da4888c87d230cdf48e872f52a90e8572bed4b28a4429d291ac35a87d9962f9fce097003663fd5f98a5feaddeb4eed8f159113eb1f714ad7cc27584fefca185d3c4f7e0c457c9676e08172cb89185167e484938339ae9a38c36e54547bb2e49b696f1a1868de11d6c1464e360ee7cb1ca14e53b6c4f918268774fd45313551094a22acf8301e7b986d7c9b53761dbba8f5598ae391f29d2c069bfc80a0078af111069e22b1316d81043cffad42fb871fd77812c6b49a009066f8fc1000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802112cf9293e84a2de2c3a7603ace4d2c29f21d11af5a68b2043a23593560d92bb1f9282fe47f7c36fedf0736be4ebaa6c7c0f8238e05e413f5f45248538b4280f02061c9f2494c7f92a4b10e3015065091c152acde7eeff52feb37af15bbdbebbe80ae4cbbba31c9612d37b1392c32f4529415d1ac837f9e397726cc40d1965e0c00000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093d976c1c6dba0df9cb96babf748d5b6618236874398ac51b77f6160c9f68b2332609141b64c8ede530b70a0e7c321d6319ea01a9abb9449b29a9ffdb3e39b76734669e17e686481465c66d0ae6f46dff290bce160e3215100728607b847b9f267ff36f86a06ffe50d0bda61069e2dc44fd0d5e5086b473bc57a58880eb142f50eb0a4d73a0ae27a3b98dbe4fae0bc8faf2f335a2708924a6289bd9c32cf4b71e817048d280e4ba20dd13ca71c9e4cc5a50382499018c64ea7036d9c6d919069846294c0dbb28d76b79420811e4850233d021f2e80dc64f5960aa1eae4e33510a1a566a9c87765e7c313c2567116d21877bcb2be5b0074d2f157a5206b2b7ee18a8eff390b3fc262740370785d5d8f095eeb1532d962db856f326c460778a5a1d76dbf76bf22ff453328779b8c8e600e473bbf7ee2f5be288aee987015d69015fc89d770b809d06481082b49a25c64f524fae5c38c55fd3ad641152f0fe8604fa6903975652ae8df25019ee3f74a808fdd17f1531a20fd8a2155522fcf62bf9c90a19fc73d88cec2784aaf4da953538f9f6ab0efbecc9906bb0532aef819b39b5dd1d88b515cf6eaadf588ec3306e53c10c514dd2246ef850d6349d112f17d227e5b060ce4a16a6123a0e0191dcdbfa4b6da84aaf6c13c5ac42c5d8b210db8c200000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f938c7c313f99490f6885d9947a5248d6f2d8e27ed27ce62c378c77c7dc617375130b083e7f3641150864f01eda775e58ae011d105d8fbbec0ce368937c06436833dd9c0badd945ac5958012a0acac78a50fe48f7ab94454ab742e9f30386dfbcce3029ed336729865eed01501e17e1808aa6cd7019c5c5422bf628f2f12fc8c84ea93d73b8f9422afbed0feac69e882b91c4d13269c6683f685f15240d0d1477fb5581fb2ae35bd33d814feaadc99a970b35b10baa954c6bcb34e5d564b3410c6fb0b7ced352cc09977f9d5acb5634aa79f0517013f8e06a7c71f9c405b095d33d5d5c05417cf69e1d03ca24098e299f2a6c5c3b8551a605f641666d9a0d01d0f9a23b69b0455d49e576c7621a6c3d214de47d43eff0dc32586e1b614c3e2df86baa66656609cab5bec86eca97a1a0e0c84b4fa2c1b2eab4f61c15f3c33bf0e410f07a399fd59c3fef1dc4414763693ca64459985271297d578fa12ffca7be0c0eb43012ce0d259a087758a95a3848a5f1c9b840303a7aee9fa7ce85571408cbe15f00b229256dadecf0e550705d079f0f1fc5fb4f547e2ae0af89779b234057495e470c1552f89e31d919562ad99a78654bd1ef5a727656e3148d2dad3ead25ed156280bac687598fdbe567390aa1bcb9c2f5a9d10d7b131cb0b97797d1e000002280000022400000220119d82668c6d4ecc4b36804fd063a89ab24323bf87933b472f9a9d83c7f26b4b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d90bae899a84155b7cb946ca83c89aa9ead9b7347017fca1b1a40bb02dc281c5edbc5e38b9006b2ce3e399bda8cee81edf0fe5e918a03a0da4f0ec6cadc1ffe6933d893882c27025436ef872bb2c8e620b7bd989502245ea4dd6ba6a9ac2cbd49acc3df000893e50f3dd0ec3599e387cae1a8ba406757f6bdd831d55c7a220423c684a3f8a774e8fceb2ccd3a1af4f7b4a280b5572f3c700b9112ef32b84f400a2512395d7161f647633a6cbff9509d24841aea87450a5c92162bd63b78ec9574b8b4898597052d36b15cf1f1e43a7cfdf8ccfa753d0550fbbbc6f4597086fe39b06bb18b9f4169da2ed7a7eef2f94530a6d68ca620927b78f1465541cdd79befb8789ee5f1ae18e40edeea14705a24e6348b594d06277bbac9e1733bca6c837c8acb5e8abd4185f3df83f692d82d00dc4f46cbce4e5260c8d1a99be72b0ab77c4fdc067f4033dc70e588a2c2f583c4ed3e03f6c0b3d32605f55922f34e9808a85fbfbc94fa41cc2680840050198a0a138d4d09a4c94fe4de4b1cda3a8da7f84c3f177bb442f89ec08ce2196d17ed2514fc2c909ba2650b64c7f83ff2accc178a154202163550cc6e1a35bd61f836e5f6b9057242e8d7b9db482a4bd117dfff000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021e925402c4c1700dca22e5cc2eafd6a627c950007d7a9660a23656b7c6750e252b24a442a35ac7ddc3a1f9f1b2596bf430afaadbeb202c9cb8c7206733cabd3d020905f2a953e59c8e28b395a64b9387a7bdf8d51420b84767bfc22f014bf9d3ee0124d3c009c3c11ee931f4a75b9a2029ad779fc71a87f0f345668d688afca0520000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000282eccd739bee5304ad0bc42686ee9b5f178f28b952f5f662b11fd50a598028d76271efbc1270703959795a486a00cc427bc1587e9566e02d32ea911c42633bd21531b9d036b322c09180dc0a71d968744629ae88a391adacc66b566e1375bae9d28a88fc946529023ca93e7b4a237c2eca6b45e484f5a7b1d10278724804f9bfc5c7ec7a0dd9c9f05247b242dd9dcb13d6e67846898926abbbd0c1a92ae0f91d85e88c096a7251cbc98d82525e56b46b5492a1aa985530fd756eb43e42bfe5d86bf17179c1b1501bfa9f82463f7eccd207ba85d5c41f67378056d3ba5142f5f9a4dc5db312c9c2521fb8162e2b102dce72f070719d91b193fa181db986627a50e56a6d968a3738daff25a33e5e4cdbf4042b9db02acbf9b1c8e9c7c66b18dc0a6a0800137b064eaeaf465ba4b30614805c05b55aa5e49e0d985c603f0e3fd111b21a2ed1420a9fa96b9c0cafcb5bf81747d98f1603c9af856b7b6d00fa27ec5a29a77011f10936357193e4a88ad5e97a291a24f87506b2bc2c1bb7f38e230bdcddf2e7e1184e2e631937f02565a04173e969b414aebdac0e230cc7c463b8ba076dd2b2e04455c13453b49a7f73a6ca150337577ee5b27dc2d3d9750ab9de9ffe5253ae4c429e4408928477debfa8d80a685a01f1d1e218a12f694cb2ebf6c850000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009120858ced38d56bafd30ccec5c073e65d191996c1593e0e235b7f7f8f385b3368ad737cbc141e2d9f37f9e07cec23a970c1b6b1c115249a67467e58c63b492af7fefdfc6a834e28308338ca829fe6dee4c27af44beebf2dce188767c116c7a16372fdefb6360e83e35b79a170a11bd2a7d339e205621c8b315fdc52b8ea683583d5550a4e9fad0fd0bfe882560041127e9863fe5d9c32015d00195e481af35df65fc6ece95233cbd2666af9849d57b9914c4389607985c0ab0ec8479355e6e26d8ac55225571541b5f064a143494201fa2a8c16ceeb2e8813fe635cd8bfa82733533b9127f4021367646e3626d5124d6bc684d0de0a76d29fe3c835f8a2cca05fb7d1f8396d6f20e2e3e1d4f81779e6440b847ec904764585980d2441ec07b5999896ef0193ef73709021fab12218211b1c9d83a53d79bdfc72da5c9efa7ef8594891e93140bb87a61566a77e1848d579cfc752b163e03a116062d3db84eb352e29551d7a3f35a89691a09f66fec58d67e705331dd6a74cbf6074eb01e43c886da8eb3ec7769c059f21fe1536885df520ba24aff2892e0d218dcd059d7c449dcc122ecbf38199d276843556139121c9931595424fad06723f48983ddc19d1566491df142943531c4eb97c5f61f5eecc9e9d9f3f8b1b5aa184b3b9630bdd5104000002280000022400000220068f57e12d01f882ee93480949ba1d3e404a88589d811cd96cc689596565cb2d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060dcd6b29c7cf22633f503fa6be39cb291c71a7d53d78c9766ea1b80a53a0819f858972a1eceb937fa5cbf724eddf4b6179993015d295787a9f07551c4d4742673555d8fbdd3c5d6e3efc33f86335d6543a1d620f3dea79366a32b8dad39c32af19d48262cc335a5f217e2e104ef053fd87721304eeb85809d95476943fe27b173833a3a49ebf1256cd3fae4bcd7fb356154d5eea19d69363594feb62c092bed4d220207be9f75b60572cf432edf82cc8b6862d901150bb805f63cb0a9641aac00a2325dc436f596674b1a471473bbae27c24fab8cb72724b3ed4bf00525ea7ac24504d3628581fe28abda6a7d4d5e511f644b32c2e3441d474770b4d98f752e76d58a11f3cc2e8b4293d8795e1bc21ebbad9b815b616a8e09b6ec80843db2d2797cef12371c233f3c3f771ddaaeaf3363c4ddcaa007a12f68bf51abfac03f9872318196296eee94dc3f5595af1f01fc53fd8215df0eb61e4e9a4c7f2df864e2c5ac483451d36acbce528586eea4af4b4e3b9a59f26950a04d8a39c03d5878ecc7f88646520abbd6c84e5a5b0b01d23d9a5158725560542dbe3f824b143e2ebf5a9c9945af3637e83beaf6ec8bf669f9cec3b466d1707fa223a2fdf02296ed9000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021578401afa9c40f9c1c66c4dffdefb6defb7b7fd21bb6c55c46174f9b91f855c0466e2c0d6b7a28590deaba2c165818400d5a6055556713db8f529588edce1bd02094912de1555cfbf2d5e27022966f3fc28a58af5170d34b9ae4785bd85a522a92cbb19a9f43c53b4813d9825d38c78e9556dd21b3711b3ed4197fae18f06a3390000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097dba58cfaa6bba5312dc37d2dc08d6aaa3e96c950f36acb0e2274b12ad7bb7952530522343938bbe7b2328de5f6e32697f071d0c97e2c75115c31937821ae93d0cae90b1cbfcb0cd4144358fd0dea7af53d14e5fcc0b16dbe17e025ecccafcb0a4c1177d0dba769b44b506d6e3e88f8166694a5d4ab9f868e420421d05c11983874d233f3d8c7253e10060d5be360e2c774ab7466d2c7417f65a8d2e9a6fcbde8272c1992baaea5eecccb359a5de1da3cf0aa646b5f751b8d3d05723f752f0e41c1c7c84ad9bfcfe5ca27cd160b577544874d72dbdfd918b25495152eaffa1d3746643c02ebb674edb483a24d26b11d94937ec9d01349355e4a7bff612ff64af6d54478093eb8fe6421fe22377ce4dd05d1b2c35180e6b3fe373db7ccb7718fc593ac49dbd750d1e7441fa92b3387bbd6883f560e374d9518dafa8f85d5fbba1654a2f4b66d5f885c8f30d76d917cdde1d4237d36d6e3621bb5589f9d7e48e2d2b516874d14e2a3e4539bf111a125c1127a4cf6caf9ca2e9eac8c23c85eb0d9b6c7940b56a8412d1ded6686017398f53bbd8d5dd873a7b48734f5c7cf076595a2a3e7378d5d2b59c4ec560635c52ae4f7e1a1c4115ea45cfbaf071c54f8e8bf26bc3ecce45dd73d9d01d29104edd7411e67a7fc8bfc0dcb658e284c0462666400000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003df18fa4ac89b41ba8b9008f3409d29a8729a4cdadbf2db2b138b5f7837cb67725cd342e32d7bf6d9f50a0380bb96da1b3fd7508c1cf428e1d42b61cacabcb18081ca5703ae5cea82bdfafd9fee4d45f52e1e106f72eee91c994f6e0a226c07a87114c29d9348cae249516a8a4074168af30bf6259dc0eae722a4aafd5873c259d19d729c300aa4c3c6777e21153ed51a3d82e77259b649718ae11c62b048cca3188a20b4e25125fd6602a3d533f90223d6ff2edd309b44be4dfeaf8ea49a1d19a2286a529b0268ed3a169bab6484cc4b34026efae2f2b72ed00a2731b04c61be4d958bdf2d07a6ae1f87102348fce948356e412628f5eea944bfbafde91b391b38b7e1548e909903ae636caf3a8941ff1f3d152026fcec5a6409dc5069f48b5f60fee8773195a204b28474267c4613426619c953f04ea63ca379fbc60a8fce939092d2609c1e0dec3c0053d8cc531e35d660695d5285778f1a3cf5585c12eea587c8ec9bdd23a84dfa06602f7c877252e67addecf3177c215e566510fdf1a1418b4fce17df787905e097c8b50e645d99336b1189a80edc6bdb30d4b18cb364c5b2994cc088a45f61aa622159e0f6f25e6a8f176cf229d502c2318bef25182116260c6edda0ebf4275bfbc13b163bd03df178419754531a7ddc59cd1bfa434e000002280000022400000220036b539a0786249353eacf1f22b059d426cdce267ab923414d6e759273764d7700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000877259c71ab96f23398e29d4feb13728a33c973b84776c572005f873e53cb5db01e8ef8e3f51262cfde4c037326b4cdf2b75051701a5d5b5aabcf8894a7bbb507fc2467287b51ab7c609d117bc0a62f3a0a1a4a57a88c71adeaa628cc24c6b83a482c5519363c286317857c55b7197fca49a966264eb21034cd5ee87447176fd68b112d9af3a576b1f13c87007379ed763ac41977fb3308465d9c04a2e9b71a0db2d7fed59a4f870536663ea5e74ca79910b36fa7381de3fefbde23c4bd853fc61550c6030e6bedd533f41e5bd0672ae0950fe85ce651e3589ea797d2993d17d794c789e82414cba6c312523777e9d876ace9fac19d604bbfec69dfae91f6788bd48f5e612ed2ca1589d817981165d712402cb648d8b7390f5c4c3e85e180df7eee4c3690b623adf16b0e911bba99ce832960bc20917a4472a18b02022d597c561cf51cfd7c5d301f3ebbe2aa4683a1e02bdce404d6c6bcabab2580c55037f9aa13854d9f96a88592890745a352c4ec9cf5cc494b0cc19d777ed7d076b079f3a6e39e10f617772bbad4cb4385ab9d6289cae69d708b15f5dcefbd340b2c375f7545215a2d9f3153a636d9dea5a933587bc7e00ceb7f20c673fba44eda0adccfc000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80228676bfe05a8d6955ca0f4f342d783c8219580718a648dcbf7521bd17c370c17178c7a4158b81216532e61f0e89cea50f7aab80426e561d599b9e11ea0f91d37020a281468ae9044c12e162ce926a58db8d3ae2f35a788523a67c76e3b0c3671420a4f9547577ba44d950e689e686889dcf881032de7ed33f6fbece8c5b540b0740000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094450cd07d4ebb6a9fd3cd43eec7e6db83fe0ee0d3c92e497730f5d52d66f0cb35995c1f38c21d651391e0c114ac26d78c2304633d8d66ed80a1a1b1d6b5afe45ed68e3235a934eab75ea32a65109a7583acb928bffec14c367ab180954758490851cb1afe47085b041d036feb15d589eba5b288df40d3393653dbd7e89bc18f7eccc7caf56d13028f77b3c89b7450212c01931de737857c0d13be7912a06d6924a3bb1bad37e9200361fa76b5683e4acaf19179627616b09037907cb10be6522687696c5adf3f7d30fb25f941db07c05e192a187d41c8e3bebc12dd33f9ae004584d3a2697c50e0fc572d556bf076c070908fc0386befaa9ff22297fd314554ca3cbc03688fa7363f43755f1f67b0aa710341cd2530c17f7058619490ef208c5b5b942c0845cc4157e161928d320a58d5e327565bb85f295dc431c9d0e9f894c0b400f555956d385a3b11595c5d410c6e2c2c07b76219d1e3f908cd0af05e2fb5bc6655e9c0d450573cc6e0654b36673302c6dbfeba560ed40ab6151454f1fd877e050f2b3b7e3f32878de3df6447c4c995d791a9285edd491bde0808b8ad4336dc49baf85e00f04d3fb686804259b22ad4db082f1109063fe8bee373cd7743d24ce29413a2341aff27d68055c991e21a134d6a74e180066ab5901836edc0d5000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000121bae959ba3157ce0d2863d5024218d97d34c09ed698bbd60f60c3842b54b6e943b9b268f41e439ebdbb6367c7ed2ae3a2aab3760ad553c25ee3e5d0bb0ebf509babf82c31fff644b3037191fa26af7e1efbe7a397c8208662bb0bfdc1d1ca8cb77705c5e02c01bf48895a2bd769f2878bcc364cdaf37ba761e9a62d2107abfc15ef188d3596aadbedb9aca53b3d409dcf5b4ec85676d57ea1c83562ffad65b0d0baad42c6af62390c421996d889789aa92bf2fab0e32b2d2c1441ac92e36d903852df4210a413cff8bb3de72aec88ffb30c8fc62ea8500cf18dc768ab3cf872d6272338cd71d0befa33110e0ed6269aa8fc7d1830eafaf1a4d4b4ffb3d13e65992115b01b86d56037a7183de16b972e5cb32fe0f2d0f57925e51bf9ee058f5379c80d42382c943138d0aba333296eee32c19568ade4b0591e5f03fa4f08d5236a6c5746f72a7dac881338ea2be222006aed49a2a7594ebc0bda511f2ad98be2e4f0bf1a8df5557c1cf763f72741516ec1357b2c3ba92a8f72d318dc61a3d3056e82e6bbd21af66650272dc25cf72ff96872d68cc7957e63a241c3d84edf82aa492bc76f3a157d44ddcecdf9cd6c55e1085916c0bf8cb12aa75459dc07fca0cc7ae51bec378683fe428ee44ae58067a4f5a48f24fdc36458c364a072f0c272f0000022800000224000002201a80f288283895a89aaeca0f7037e3189676e62c619afc7e3c6ab977728d397000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa97e3e06d3aeff42e823acb284fd562d64e06214c43b7ef88a8c5003a4272fe8e4fdb0b813368a96c49b4296444450b4a8279d18cba58e49615da5a69865f0504f4161559bff2e7e28c967b20dfb70d135630004dd8ecc94de717bfe70f2d382fdd5e1ab2e770aa37de395b083c6f0993920bf3cdc2e31764961d88aa291e04c14f847a1e8b009595d8c81b9889d069cb7670dc44810dc80e386fc7c4923791a350dd179c42f94fc2f1b1f1f7430742903341efb213cffdfe1d7501ba6c2b31de001f58ed2c5ded6238cd4f1651519d9af5cbe3bdd81286c407f7a7ba7176e3ee946925069042ec03e36047dd352d30e5d94bd5fce4bb3f75aa762bca2b0189ed30d9c26eb626648dae37746c3ca03181f227abc2f18fc0c900dba3e1541f3888bde39f3af98779a793022554deee7330e4e800a28b7e401698bfcb4758b9601a2bea8b36d7cd78cc1acf64e0f6a59974fa4066c37e14d8e46fa4ec4fe876ed94c14e37234dbddad8c8bbff86e384cccd7d15b8665f8aadc779a73afe810293ecbcf573be10d497b20a1e612176fd26d30f4fce81b9cf4beaa5c863698294e1d3936e77e8be8ef3c69073d8921169751696528a4fcd9774f18ce3e26eb763a4000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020a6ac10d6c9ff2c6b2a660b04ae7e6ea52da59234edd6d0311fddc5d2fb713e22be469b55a2555e6e019c180a7d5aa66f26b327be44f35e070459d59d40764b1020eecf987e8c9ee6ff6d869ee62ac1b4770326bf56d8b4211159d4a3893eeb4201a89880b80cc6fc85c2ec78e7091613bc7c68d701c67aec35f2fc443743a39940000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004822a25e6ff9277d661246049cbe736621f9a86c18464481d736a1084b0577ca66d392e154619aa5de3850aa9d5088479e6895ef5918c418d6b05f51351311a6b9726ce1de3c1e0e6f859d01f3230b343ca19d015d07ba9bc5b6adfc32d6ee6fb2c7fda704919edb9d7eab757bca8c44502828675435fafdc57478b58f839ade7b79dbea64c61159cc097c3d4e2fa3e0998fc533a95f0533d5c2b7ae6738f9f870e8f2233d14468f2212b2fb3e55851dff0a13cc4a208ce680ff66fe6d00593063f1522845f39ff945416c43dbc17162211af3191c86764fa2ab8155013a42a9653f5ab7ad7461503287fa34748063d80a7fe18fb121631b8db1352b1d9210bdb70e284d679a28bea1cdceeb7c4fc0ad7e6e9726ebdcaa75b0a8382a0f00867f5463c37ddef40ca262ab63b3e0c9a079ae00d2a47ac678111dfdab4b9543bcb33e559a1892bb5aa93929f49755568cc324c02fc16e5e79b1749e4e4cbdcc90049976d9fef9671397da3d5a967277a295df3da8861ec0b39fc14a94989a096c9abfdb2cba7db6ca07a356232ae6c4d6d6da8125c112b9e20d2f1acb2d735b1bc84f401110e4744671d36bc8e393cad82995cd303017939523d7734b4e9a914b983e536de9f08768f20f84516fbb8fc259569db10fe81d65ff9c5171bee0062b300000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016f5a4745d5e9fdb8a534bb6f05f5df4d1327dbccb5048b4c993121729f4139556e1ce7a482d9ab791ac544ddf2de017f7176d2c9c3c0427b0f9633ed6c6ba4cedf2a5fa86d74eef64b168e5932367889a27fc6232f53b8912eb4367d76e0151b3c26b5cb3633bfbcc6d3caaa3300a8a817d874b700a4e1cfcbe1b9cadf75d09393e1ef91ffed0fe018caa8c50cf477d6f7e14b9d5283eb0e1725348d97cc71a4d8485c691c490260c377316a5d1151aef2881a7fdbae6cd699d6475b26f6c4c43bc772e3d913a9e31dc71ad7ae1ef5ee03420edf90e8256f422d6287ef814e0a0586def895e3afb3c1bf0608b7c455d3a3fa2ec50e21b16de441466fc5abe30e7449f20cc63ea33c80c062efbc53c6b79f5e151463d5c0bdbd6ed4f7b79fbabedbd99ea22a59e7baf9a4e61654a98bbe616f5a51d3c359df69248d39d921ab96203fbe6b761bd2c4f80ca596638f9ee8b084c7db4f26dca54f6f2845cffdcf5e85d7afeeb69c5706a6067603360253aa1bc55ea8352f8620ec9aa98226438ea1b3011f33ba8787d8c6b98ea529e0128a417b05a1dca964f56476b611e3ce201f44cd761c7eb10b98b5b3d3203aa1dc9573f99490b23322e1dcfb2ba1ca9adf8f43623f10cd66a99d74ebde5ee30eb273a405811126dafe7d3af2a3cda7ddcc500000228000002240000022024ad2a1408c483ccd3a4d40614d1629fed0fab1a2f2dbffc2a92a661d1ec3100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009612254098c10da010ed64d2658a4023e2aa11f716ebea4fcd892880638ee453c4694f83a55c2c5fe558a41e1fb60484ef43a9ded9634fc6084b61f3e8d1a7fde63a323591b7f0dadddcf13c6156b187e792eadd187dd4ed0f5afd3bd9530861f2f6a7af1061909ff1698ed29d567f2cde4889cab133ae1036b47dc0c795def375eb3a8b4bb2e98d029c6c99b12890b18e3cb1f7e65cad7bc64d4439690b6770cdb740fe653f72c33e37d84e9541861f1eb91fd9ced7886dc132a08ec63a5c4c7ffb031b11adbd57ad420f35b73ea499469c21b4d4f6f4c0d432fce5833dbcb739e58a53341522b8be795112125c8c1fd15b35cb62be472db117e9be41137511a880a946723a5b915a4b17f1f0529d5736104db3641a3c12e4b68b5260babab92d67b06ad9e436f9f373c3394950b97ea44c4bdef7d4c106b55acbd9289a85dc1108b5d98c9ed6ecb28593968eceeccb5bad5181e5fc3ae0e9c974e170fc9a014bad58480912d393160b3d71b0f11e8853b54a23451beb8091c307cbcfa8dbfd78496aceed00328bf1fcdec15bdb788b580bba2f38036bfeb32c0c41aa11f06086fdac72c2ec77dc2e55be13d82a45b62a7941a1a3ed53f99fca003e37ec74cd000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802126aeef012988cec7ba332ac7d1ab347ea56f1068c78b1fac171e46af49059fa1843f2b58eb9f909b57d10abd7c216d5955769df485166f49a0b1e1b4a375e85020fcae7f923a69620fdddad784d475f965b5a265a4b551b0b601ff1f8aeb2102b1e6587447d0d006c44cd229c5fe031b964f55acf499a4b625d51d0790d60b2ea0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000258d553de557939f358d589d56d29fab7e0ab67f3a62aaec0bc4ce8f55058ad59cfd5df1bb92efdac351715577605531f4092ea595e19730ad282e94a7a015cddb8507b5297aafda2d5dcad6cab1ba5fed7d1d8e20119ad712f7454faf213cacbc994249cba899a6cc870f77c94d3075adf3766f3d111f54a272c8c5973d283fc782105b29d60cee42c4d06076bf0211d8fb0e0932078033bed199c7d0d6cae34a1bfad69f4b5152f26a83533bdc6560129edc29cff9d2af82cb8babcd2816c16d454027629ff450642738eb96f57c9b7e00ad33c741d2d7ec54e02e57a62c7da6a285f4cc1c7be346bf5ca60e15204ee98f5197dda4c6a29856da17111637df65c7bbf70ec5c0327045702c56e5c0d18541891a59ced6d21779ab444c89f8fedaedc5e0e873059c00fe235adaaaae029d44687d2b00341486a2ada24fb9eb7389abc568a30252c7bdb37faa1b964ffeb9c65d6e78e00426df7817bc25c5a7077ff16e5e70b89bf464260741455b4539bfc8db50b5b62a261e1d1f167b55de55079b6ed2741da15b4cccc9d1b1049d8d489ad64d96c4fe68fa475aecd390fe27822e296050e4957022ef2a047ecfea498edce2d4422db9ae5f8bc6953e61cfbbcc8dba775ec43f598f40f3aa4b9bb40718e9638e33f3bc92f297eb4e30ab634700000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023e7168919d51a78d3e392dc87a0b831743051343e5d765a8c48947f32b217378431dd47ec475a142d3c564a3b7c686a0077c8afd097f597e5eb1e1115a39485741c384e0d10cce0c92c90ce20789441dc78c098ce7646bd04e313f5e43e68ecc9d3815168fa7c8a6fab0788c4233e2b8bdb617357bf123879c064fe3c81f8c00cd2f970e313ff50f27562f621d5e3b39648e1bfc4d499bd6b74000c2c5ad72d309f554afa1d7dc5d8a7de5fde42ad098056c6bdb6a9532f14aa83d7e6371f8b65257b5cc551b2d6ed06214c68817903827bd1e326475c97c48489403a669427b7b7d2239adbbbe38cc1c5a9252e5b9b3f1e13c1297cd8b83037e591aa62af2d9c1979210687d58a6feb0a239076ce1ed986c8cc03a96a8c2f6e0e53983ccfb1dc9785926c6ed3a97f66c4941b7b782801c343a8c7f5f3ed57026d8ca646d075cc122887f2e36773200c21872ee843e08d8916e084f09b9a8e08f3087f86399833da6ceff3355c9b912e4b428deb1f8c823cf5685cc4ca9f2d99cdaa9c35ec90c445e296253bcf49dfe7916123117f6db68f39335c4cfb612cbc6071ee82d3d52ffd8a7c1c5fb6928e1f027549273fd72ca78b69347b98dc0fac4a5c7401ff08ca467bbc07dd83ae4b12219ddc70a6df078d6b42b9c2ef8eee4c0ef41aa4cf4200000228000002240000022026266ef2b8f9547b11f0d3713fe70f1c2ea8dad951849fb3d428b1d43614b3a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e703a45f8c0980d68b1410a1b09d1b85eafb879af436c3721ff990d525e7931e37e027276893f84f6f0e58b8f425c4a95881318ab45e9376ad0fa83448d4588b5a46c51ff6ff11809d2e63692fa9f37d3e1024b3c795cae0c215553abba8e28e4fc11654cd6bb1872b62614c52f5f19842f4863bdbe404dff2a192d4821294878d7c0328aec7f4730bee2b71b6daa2d708be6ffd4f0069992462b72303411056359432b7f0e6556542412c48ffaaea517319246a32e5e7500585aff26acfd44c36390698796486ed653b4f4a1a3308f12da3818a659016206730dc9ca02d3e274f9001acde71924bb72bab5764b2df633bbadf5ac17aad1af604308937b3da457f0517120e12a4dfed32baf9463c9b835984cedb371537f118c3403d80bfd8001f798e1df6c3e7b736718da4a0bc73a2a478189f1558f7a0654e4dca40eef0fc3173d3da9aa912e4adff434bb06c3ad46ecae4eff579ae322b26e125a7f3e938c86492c326fa7fe8b99b6a1a6332b8c32d4aa8438dfc95f7dc0817593328ece7b284820d6638fbe36c9dba7eb3104cb63168bfd1469edd56b0632af115d5a19b95d81f59c5fea3081e407f70f1ce82e89778c779f34fe05f1862081e9ea64bb000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021e92b732e89e6de1d4d075a29d35bcc65ae80d373e6ad9560e71f00813f8be151a126859ba47b6e259441cebc487143c7bf0ec934cfedd3e829769ce257b8c4402101a2f28a232cd598709a7e247380be87ed6009d5a91ece6c4e839147187eb14043994997dc27b2ea6ef8cbb7aa48d4ef5096f83d37e77aaf6e946a23a14d9370000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000481c7458fcc9e2cd1d26dabe54d58f1f3cb6aa6dda6b7a782c3105d6bd67c84d31d616775e80d8d65b5491c4f5cb0ecc26e6d53501190493a6dde3638d53127ba7de58de3fc8580a023a5f1e78b76a8d7b0fef621d5b8ab3c949d1fc8c9480a395f91f5123c2102a9a8a6981bc242654a53510733bdf5df4cf3b497b05d4d23b92316f5194b3f0c86cef0780f9800f221dd175489ec8827dbd9568da2504be40a74073953daf60c262ea7b2f2dfdede134d4b1a1cd8af61611a42e91f1e6fe1df8f3b682bef328105a7e841e772ce3d8634b6f73b575b0e8f45776aa4d2a7bdede99a9d3a057afaf8e449efec5a0fa23b09a11795488a3e4fc505068caf72fadd8eac6eccc5e9f278d3d6a5deb16a14a3be357b8131be59986a78046614a9af65a95b709708b6489e418e54c4cab66b506b8e18aa1fb0c44cb87092d3cfe2b391b9ccaff1ec090a2e18512e576209076827f9e807de3a88a104f5a1907ddea586c86e2efc726eaf50e2a5d7d01407b4f92c5a8612f08a0ded16ae2eeab4bc204ad364d090a50b661c117b323186b585be50758285b0fd0ca9449aa441f0e10d9601f9470b3e0fbbecda711b3878737238446a693d690e74f9a9340826a299d1f8c966aa8ab43e33c6db68bb5ca9478707faa74784a17573779c83d0c6784673000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000acf79cdbecb3f93ba78e542b60e73a8658ac60903177d00b4312d7ebabfa4d27b88a652271ed80a5e106c10250063bcfc334d37ba6bf5a2d830b17d44fea0c6980a3ade7b0d158733c0595727aa198ce08670f46864cef08469fd34ca1069444d921e3cc361eef5f253bf73100632af3ba60351b5770db075b769c0edd5f57d5c2f5ca3ae3cb4429dfeac80a40d9ae371855c1211a8405133c05c740e6ff9daffd6bfc28e02fc402a34f04ab34e13036a4996d692839de6a8c8b0c45a130d212d5b70d0134dd553e2b02f651df77d24d1b7921bf9d25c7b67995db401731ade27c3827b422c3f96d0e42b39dc469efe69330169a6e3ea2f19cd1c17c852bded64e24b2f0c2aecd6a9661f5cb754e8a9a8168804bfe1e6018df537de4d2dcbbd7008a4b7beda0cf21e4440d67f8e5b86d3baa3f0abf5de076ad9ec37b8bcfce1ffa0eab33cf3aa1d0b7f4eac4197ab4216aee1420f5b6c8c5587f3db166f5a4ff66d814be6462630b465fbaa777f20fb2121ab30ecc5dd6a9b5d750552cba8eaf46940e29069054fd29e7434357d1c6fab2e159ebdd0e95d4ae764dd0b57ba20348edd70cc631d1f13f4018fdcd7bfd15ec6092a6b4153eb98c53db76fe794ca4c9197763f65002377e094f6279dde15ca51feb082b292f4a9ffab36b6615cd6f00000228000002240000022015d43557081e034c8347b431aa0eeab89a1e991d90ded31af3f74f9508d5c3d8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009cfbf4d938fe5eea66b0975dc9ec26222d6b0d7da74bb43ee4f80566622df7abaa22bc1eafa1a1a3b41be70eb44ef716bb8374503d9e2191ffe9b4dd8af45dd4aaee0723741444d67df4491c792318b7c3739b9b7638fa86106a097c04ff583ead4172debb52a82991ff8121b2fe9e000462522bb3dc295c5d8c93bf68694d498d10211e8aaf108fe849c61dae55f27a6aa5589f550018458ea639959b177c3423796348923cd81f4527aef61ad8268172436c5e479d2e4ad153c1a39101d649ab37bbc8f929e1034437dd3a70dedc438d58d47b2d195d36b7397a3d73e182e043444a73154b044112cc21121befb7d26a667df13b5574f3d58292acd9c4bbb14b545e170e1a336ebaf7a75f2944f18fe9226e6d6e0f9c24d8d63c357c877e97215fa72330912ed978c343b86916708cc7ccf2d0e09b7e75650f4216fce541684ad54f8757b3c0b49a1fc8b726be9b792d93c94d86d63fc6112f5ba2c08a74d425208c6069783e0d01342b78e5c312e6b03c4d8634b050317847b69ff9b2af8e849016e6ebff23155e0310e8f5b58df5a99161f6521f439ace7b6ffa62c1500021d75d5fc3dc5ce3adfda0554faa4eafbbb5698c1b1e3b2ee3369323aeab8e4c000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020655af891ccb5f0d604e2db80ccd3e8dd132748cb2d952d20ccdedf7632899c810e876f592050853357a765f22ed1d22708ca9cca8082072c330c3588342ae7802130dc6fa48d8623e5b0e0058cfef12b53e65a2db87dc16c6e3940dd0b79719ad2d6290e12a4b6daae73874953e38d9d4d9e11ae1041fe77bb2535d22710669e80000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d522e1a9a2b2656e636a4e69a10a40f992351f0cd885575c59ef393034aaa9b89a5f69345b4f131110fd6ba0f271ebeadf1fac4263c0bccecf43be7a5df8c1675e376480b272d2fbc18e9c5000f946f8cec6051147ba214bc6fe6fb65036b0bce1a3ec40063b10840ff1025657558d7aa134ca4358b9ace2680c4870c317fd9baba719327c8bdbab79fc4aebc240c4f55c39b413b60f69031496ddc16c8254c11b9a7c3a6e5c206f27078f9ae49eb66954d019ab8ee7153e3bf306ebe4550312be6b36b9ebce74639ec06697b97d5b219cc37c3282262c56361162ecc69aeecbc4d160d5c0dee6146509acb4d4a2f3f84290c718fc4915635529faadd0427bd2eac65bca789c74f79042aa94a33b4cff0357cbb76064b50b6c66b816f612a38420ec8a7fe29790e59730d88cf787cac206e280f4963bd7df5c89a59bbfeb671312e5f9982e12c0ecb0a6daf8cc429504e19e5298bb4107118718d76fe1b6932202940b19b48d68490e43f3311607dc2dc2fb515674b5c6d561863cbc2674830f295a26b2f9abdebedce0df8ed506bbc40e3f730a55fb1e910acf2e0433a1125205a6b0dbad5ab020e4a70b2dd969c6ef9da7f7a78eb25e7bb773e33fe8f71863b49de8a2fb9dfb400490ab87bcdc9bef6bcd52ab3112bd4d17e2b4ff6b9ea11000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7613148816d2450ffacf0da2e30cc49458bbb8020b6064316d035776cbe1ac83c62366db88d14577abdfe31735c2115a674fc8593dbfc50dc368afdd5d67dda972b917ecffc1a9baaed287ee4faf54caeca0366466e7a53ad46337497b9f9a9fa7135bcea2c43532dea54ec541933fd79c0728b6d50d1aa907e74c866b0ee26f6f915ce52fc68bdebbb73eddb19f2abdbd2c2b6d6748af36d3ef1259aceda48c2e90e349a1b58c1d30ab20846b9e2edc9799d75fb87e6a5559789eb12751a1875a8a24695f920ca7e1b48588a60cef1f99d477447032a11032ad8ea0d2e1d26a1663591bb32da40be1156cedae2d10de1c28ffa524b1cd88050285a26c959c171705dc7edc0895e499080bdf4e225f5bf51ccbe05391f5e4caf7fcd91da56efcf8960e6bc475ce0227bc6d89302db9ba0289777c3fb6f50a744bb423da0742c1bc2bd9fe1a19a794680347574156ce0d493796e8f675faaf489d9344e3bed2b5a31f5db4093dd34c04ff24c6e38e63bb68873678604050451e8e0331ef02c7060cc90fc3c1ecea5b6b3b411c52c553fcfee6d55db03df1d887003a83d58e2c2c293781bd4ee2e09b87fe6e7cf834e59618bf05a537b89e070e94958185cf8619aab5bb957feb93dd0096c52d834b83c8e73df2f7ba899067edfeb5736e6d93e0000022800000224000002200071333d7b9dfe2075ba490c048cbbaf39b1ecd562c2040864a693d67be633c40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088ed69eee836d838e81ef2704ec06cc65b4d11bd940f07972f0f9e26ac94c64db8d7316dba23d6cd7d3a62fb7d80d8e118f5337f26aa4043e5b18ea4fc5958fc41c888a7843625ceb2ddbada1bf96eab7dbc53a2d94c861109a88781af22b19294b1216d6e1ac5715aa021c39f87b6c8a6747550fd6fb70127da7f80b92681b13e9f3709f555c3d2a525f132833436b41e5dbc6fc158122f424861402c414a564e6cb8497faf7c627c4fdb56045f794a5da436694727ba765c76a5cd43494f51a7ed966fe3e0d8f5ef04257b2fffc06aaef77e985d3f43f15826d9d28045e643dc0ee6f67ab7acb16db41d62eaa1a0afe314433da6e9fa013b4b1bab1b413f2495e7a82814c67d1bec5dd2b2da10aaf0f8763692da135e065ebb36b153628b92f746b5357146454d01a190eff459729a9d4b0fe1bdc34c77082ffb0332a8cb2dd465b64246fd10a6ccda490d9be07053b0b872739fa60aed0f60fdcae19f04c37a0d2c2c854f0dfdcbd590ce212f803013f7174804db72d89bd594938380897b68da09217fde6999276ebac2eed1bd69ff4069904ae954e843bf98c88237e9ac5ace8c061253d23225b22ebe8071d6e29a71289be2dc0baebb592f6321f17782000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021bef7caa940d2f1a74578cce7e153061ca838332402efc1b5ec7e1ce334182c108c1f01418f623a20f320c2ce6a9b31348780d9ebb59b96e895834a7675db053021438468a3a38c0e86df548b41aa51d9ac2d3622bf5fe41eefd401acb3e653ccb0347e7c03fbbeed71179744df9bd0645f717e213c50965ac2b400ae0dfcd9c990000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a7492d982567574101460290adeb875590afc954e77a077e7520ec692dd7c098930885edc31f5867f92c6aeedb38b02c9eeff1fef63e3771fe3a214c5373bdf57999f24e17bbafb2a6d1c3666b55a742b9d12f689311e4e4c3d435993a1885718b400c91aacc7f172dad5b661f721fd0df7e8c65fd090696da28b9fba89a1dba803844791b9e1b387e1064c63bad6428ceb127073124c7e601d7796e8e92bf59ab3b43226f54368fd664b4bfcd1e6f573c4f4c638e0574893182de4b17fd1f588ef80ab73058049c826709df7659619b80b7c950922c72e863f64aa98a09467386282ee6610c4ae0c19f78a83332ecca05bc0a85901276b41c6c144092c0a46822d4c3d7f0399b79ac87f97477f25b8ed337cbdff93131d23902efd0d57cea7361a6430c0a58fed1755ba778508ee3eee9731fa08a242e8734fa525e7a3fbf542eb0d820e837d6d22584ce27f72b2dc6934c70bab3f71fa49bfbf1faf308ec665b61ae8b6994645d17354b7aef9c1097e05f480cfa68620cb75687919f5e450eb11daba1a51802e386d552f58b26262630553ce4b06790df6f7912b531d846ce0b8098544ff0a3500cd0e5a96bd892a222c38f8a8ed1d2bc68668289dafb0c91a7aff8e2b6755119bb2f5d2805b50909180b6079fcf77f24aea46a52f26cf74000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066899d3ed7a07ae58df23b765afbf4b64d4c491f5b1c0ff830be3283bf5ce3dae8387d9803a688fce29fe61d61b41dfff6a4f5027ffc0ad7488e27e47f1524889eb6effe0c81c874c3cab1f717cd8703391015e96b709ed9785ad482632a1c0cb067d0330dd76b63ec2d57c4f248ac3ef2a8c51ba052565f6bea4f2a61b3180bd85b41bb5b37904da2d978acb8f9b5b5fb431deb63b90ce964f485662336ce339dfdd8786f595b618268dc6f0463ab18e978dd5a67c7b88aa6c8e42798813ec216efde5dc2a5da369fe63d5b3f6bca2346b83c73beecd65b2563505e470b81dea564b3a1686160e2336079ec3fd917e9850756962f46f311653a617c9108c187c336b3dfe6c3294566ff7668fdd63f3d536de446d6377f5a61b6e8b03be5478f3bcb04ef90b88798a5c14e78c468fea2d47be909b9a4a3338da44dae0bc8dd1d61a13c14afdd95818904f1303ccf751e80596fc25ddf1a7718a4686c868024de8b34609641be81790ed38b67080a81dc8018e1e23276f15e864f9a8537e349c23674d610cc1e39f2ea23ab8e9f5261ddc13be4a32aa96bb5aa6f1704a175d55fdbbf139761e844f0f87dc3914479587b61d76e6f45d61635cd47f694a312d14101f0779ab4416fd7ef3f206a85d005cc2e4d601ff63742871bb3549d2cdd85000000228000002240000022022b52d3b7f446fe7850d8d31e29782c24b303ffe146f7bfb0147823cf1ebd7d600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025167dc1de3528be686fb140a835c2ca12ef2def0852eeb224107bcce7dabb4ac63d323c154fc288e68524d943b7e2204c601fee39f382ecb694cd605b7fd600b06d1c252cdfd153cab6a4b6cf8461cc22d9d8577dcc24bc8631213a8529f426784be0e3f1e6ce4551b8102bfd03ca7b2e9e2d9ed9ad3b6b2550c0c66829f25ddea0234232eb30b060d395000819758d40cdae7ea4824061c08aec9ccc0a628af91e645694d38c2ff313396cb10cb20eade5bc8a5dc207eb1af4ffb5f534ebc097bdce489e9d1ef002fb0963a1ec529ddf000246120805b8a15aad8b871b33d3f7fb1b64bf2d23332903f4b23eb090adb1bb68120947867dfe4455842dd5da3979ff9830f56a338878eb3af639a0ae1f432e20b1def5a6406d162c2bbe93f5b13acf5c2a41a750224b74317311b3eed969762388d1447955124b0b0ff76d8f54d48ff8bcccc36bfc65a787a099e5a59e5959ba22811a7f98489c6c5ba1e2ff66db31a47d4617b0d2677283f701e36a11ceddf7d57873544f86716b78b75771684f4d36c09426756a593377e5c42ae525588fcb61d057ddf3f509a0ef1124f14bd556c687b05af05bbfdc5531bc40091811776f21b6521205fb8a3e3450246f4000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022a9f620904832ac0d68b608ca7324e232af62548a7cc812303e63d0017ff47b51b0e7f83a63b9a43f65363fc1fce1948ae74cb86cd3eaa6fbd39082226680a660214a94bc33300217453eda3a928c1b2521772f5c09d8406530c0d43cf9e08a333067ffd40d50657a9c375492d46b01ae707754cf9b6bfef661a7cc5ce83412de60000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001dde59893561683fdd708c7d5a9ee7c44a61a779a87d9e78bffb87681c87d97303e12bf076f8d593b2153e1b5a6e71521b88f33a5470bcd87b4792fb6d6b1cf29b36559d642cd4ce487191cfe6515e93bbd4271caa0d2a518cc53a2292b629da8a4de9854a6bd7a3a25e8e1252c934e2b8278082463277b4efeec9c506055f9cd54d0cb0084791582720ee3829b2da09e6886f07c0aa63a9e7885205040a865bd8d2a7c993630fa78e3736c49446d1d56dad844fc531becb51cbc180660cdb98a2fc4b1d926305ad2154e76cf13c55a3a2dc47d36b01a7cf6b53507f7bc08efe9e1ae5d5f07805bcb036704adb1bffea6fe6d90f137ab78eefcb1b0d86eb71553fde16c37f8dcb6af57275d03fdf477ac05f39643fb6552697f7fa8285291cff949616b531d1185fd4d35cb74358b9323c9840e6569ab9d1a530b6debc9df3c1c1d09668b2d1f5124e2225da8ed25edbb558e576a807adc110ff3f5d0010208d28307fb678749a7beecbb42dfc2d78b40469a8b17cad11e644c239a5234a886652551f9c622aee03cd63b121816308ad68e1ced95499a39d441312b68ae2351bdcae8c5ce2241479e46ed05616aca4129de4053a79ebaf53f10ed1504a4162b0b29941cd04718c7e509558c73530587e8f105e88525913ca29205fa855f6cee4000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038765b279d01da32358b3d573451c1cba8dec90e58b65948dcf1d3c380dde8429723ac2a1326ebea12be3a0dbce41dd2c121626d65f00724223933ec922b82caccb37d6ef5569b8cadb76f78413f438437b3d23c4131e31393da963ef3a9df9c8d3ec822d7889335801d1b55cf577bbe2c237a8a6510af9dc313316cd42f64a1d2dba5c472c7c868213da58033b9a8865ab686fd90de09b756813e7ec14e88212bed3d9b0118f6f0e4b7820946d528e935691a789bf006000eb62272dba37b85c04c2f0d294565784b4ac84358e2975bab9d61435ea633469303062e00351ded7e109789572f3d8c01680910998809667263f920228223aeef883b2c0834e0716deb6facf01bd4c232b30b1c2b922ac2fb647f35a3fb9c7cbf6ddcbbe692519c9d24fe43685faf60cf5e8697afc43de8323ef9cae4a05ec0184e9318130aa6081cf3e7bd692dfd0adaa38d82e376c2d63cf2508b0b8d9284ac7fa6be126e32e984cbe2ebc452a950657d343cad4a7d6493568f3f6b061c7a17c136b79c59de64ca13bbb6734d8258fac6a95d91d6fea7415c9d04793642511fa2658ae1179386d8aaf695ef9aa8a5c91681338cca1543631bf6ff8240ed8a45f606928ac2bfc32a1a97e39a1ff3dbcf649db630302ff18c4ffcdc3c27aa056298c6007988a720000022800000224000002202d1652a03234c19d0fb39cf471550d0b2d2dd655bc61e79d981085f5fa1ad5ef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160ded442a0aa1ef95e46adf4f4e76b3e503b57b1551aa786254405e2e1634b62e8f9bf65553e06a74f1b1eb4d7c8d06942def71ceb797329bc6d7a0aacb0ab2224125c5112835319a2a55289ca3ab587682a42f7b4e3bc5adba2e70acdc6c698b4b0a4902dd87e8e9d740c2627882b68013bb7d399ac607020082400429ff89666f3ac835ff258f63b3766431f95ae34d0b3012407aedd05190ee2f988a2e3ecb5e7c6fbe33ac15d0b842a73142580da59bd72e3e7ff4f7f9a2a9bb8896a978611d7cd2a436d57757490c75851deb7a66533f40ec91686a428ba1546143e6f57ebbea53f5163f469c9fe054a7169426ad74b642dc7852a744cefa68367c6df06d99280136d355c69c1796646d7bee9a910b5c1448b69c1e663eb19adf9924179bb36dd6bdeb14a1a4ea4d958a0b24c19b97dc6275790b0a20b97f79b79647cffd6cf7be21d0df8d84df107fb2e3090c910a1e4b6fd12fb5012a2abce8143dd71f08888ba6a5635dfc93e30d5760e7fe7fe09449ee75a788d5f2a92cd14a1590cb9306294c47f7dfa9c88f5be99a7380e2296e8303bdb83c465834cab06f8d22a6e5fa7cfd4e1ffada18aa1e3c92861a01e6fe0f4b889cc8d2f649f6b609c87e000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021c5413745f050aaf269ae4a342c16e906f7486a0bb300463ef185c74a607fb3a2c07ec0af4561e97faf32505ea87819f2e994d299327a5c3f24022f81b5c84190215787ca70a2423f54d311a3bf1d45378d124d3a4e6321878075eb4fcc5e47e1a2a08792e97f3e1b88fe01bee041b28406aef1006841bb40639830e593980a1970000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088362bf6fd356803cc15657cabd914c511e274804ddeebc6a42e71ac54e599b7a38843299697372a1b9a67449c71ed22a0919bd21c08acf662805430aa4ccdb119d1488f70e3aa22adb67722b8fdfaee6635099c5767ccd8cacfb19c6227eeba64d637efee859a096a72ae50f527857a1ea6c72d534907f58b27fcff1183626c4b601aa43a4dc529c82afa751c49c9d9a9775631f12f9097b62e487e5ee9572c9c904c2b88ffcc98a9e97b54723269f3a0426172f0fcc57076f22083b84d54c46760d22f26a15bb6b014c290dd9e5f34081998efc23db98ab1b3669cf29bf56efb58fbd9f1dc35b2dc47aab649c0ee91e7c9855e3dc87175a12fc46ae35632c29d1bf1d811dc044243eda2c32d5280510fe0a06b1fa3c5132bca14fd9fbeb7bafe9028c414258b62d54fd232ee7ee406e00111274c9fb5e90822d7a653d1e35bd0a193c951c3d00533b5f1b9a1018770b98adc1c12caa3a20af11b30cd33669693468b0ece0c5119ffc32874a4369006abedf0aecf8e8c02dfa816ce28ab4e97de75530828b3e5bd5a1947132d1c5ad5d4adc08583b9e8732156e6ba2dfce66daad1e3354ca3e404937af8a8ab23bd1063e14f82d69d3ea5cc3db9ce7e9832d742ec393a021e8b022fd6e43efa87a8ee9a2bf3aca3bbef14b06d59d89a68ec0c000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000929bf5be94d672289daaae52ab9a17a8235f65ca2bdd9d780218c0be4e8d046d09884b362bfdfaa17666712a3626047be5e177bb5d74c33b3328b02d30a1f4a9f89e01551317941b6676b74299b871aa9bc182ff1e64b9f51455ae24f2dd40ab38732710cff06f195ef43af79a27596cf914d7d8e2790aadc78e6143452123d6c4412b64a668f7ff2f434dd39a1a86fa057f026837ffc528e8234c9d71e29607fbe9c4c3d279042d37703581f61383fa1d641fc864311b72f32cb5a4e779ecbfcca9f3e02adeaba04a78586947aebe2bbbcdafe8d5382f45cd70f165d9fd36ffbcf32a46ab88ffaa8b479cd6e9472bd5ea46ee0700ade6adb63f1976e0ed95130f087fb2e0be9c0b2a97fc6fefa641c70d77928af4d1b76d57183ac00c9ac3d383cbec58cc5119d561194eab503a85cdc88455addc6df6ea123d089a721543bc10b73dc93eecac8603efa9259895085a24899f272889c47d82c5be6e39247018b50b2d200f5d37318290c25449574f74633f00c8a47eee48ae3b55df5fa87b6f4ab2862ed3dbe7df089b1a43f8887ee0ed813f68b905349e5d684fd90d44340014fc2669b42803c36efea9c49431b8cdaa2dee37d18d7b3eec4b72bebbd3daef66d2d3ae424f1463d5dee2cbb4a343384ff54c0c400c563de5641836374b7b050000022800000224000002200cd11513776b10a5e3a7ac2f2cb9f8a5ff73bca02f34298aafb637f3020c73c40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012a644b26379062168aec315cb9d45dc01df942d7b94db0f90061d0ac793a5423eefc18ca2474490261f7c12fe80cbd3cbc89325afd62dfe1e2b00f1a07b58d16c38761064343cd799d8a841bde877ae125c1348a7c8d1f11f186d4e695a888d121e8da82ec8207aa2fe22bcd4f161c7ce38640a3fb78d71292f4f2ccb7bab61d00ab70425188e75fe279d8e77ce3fb3db61d8f298204e2a65144c10306cf1231e39e134c8dd5bbb5809baa122ec2416698d98b743a4106367c4665b9ed612e215fb1b8f58959793527053fe5402229c65dc9e6edca369d80b55b834ebfbbc25e75002c4e08305de4e205872ec5fc49b6cccf011123ca8b2af524f1d097fda2c3284d99717033cad88adda38ae0e949d6ec68833f9b1dfb77f4c5128f9390626020ddcba62c59ce11c8df94f8ab2297c93c9cbb82d4b9cbb018921d88e4f7b9a20bcac4c0bc3d23f8cc126ae487774180c5c4d3dd156ee6ceb1e5e555357c04c133cb563065d23123662d1eaf7bfbdf0d95c84ea8b596d2bace302ae8e37ff6b37136c8fa637e1347acf9225daa838037d0416dbc3e0beb99293c9380069b960a631602a66a3114b66974f8024fb8a0b4cbbe5f67328d70b045c75c3a83a0a1b000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022df393a64599b3e378a39893c41999b6fd1202496e0a3f8c6f2069573698838c0694e5c6a2ec8c103482e88e53b1b61534caeeaa0b888691d23ffa6dfe89854c0216728ab5c72706fa71bc042fcf0ed037e14794029b56f30f2bb09d31b8cb8eab2af31e83995413f9bf738d610801d595963fc68916e70c180ac5e582b8e2472e0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9aaa37fff2c796e2cc5b3fb043e073909dbd9ff15b6d384c08f0747f26e5fe4b98d8480eeb7fd240c6e41a074262a19b74b3f5e51c1fa50ab747a6e16df9f96ce30b5122a41c951cae3f85fef4304fb85f931b382e097ce6c940590a3e727fe9f9d0273829eccfa4cb7ac181f5ae9361df7bc4b3d3e9919cf427b81568d3759454ecbdb94e85c595ffdc443eb583022149c0fddbd506cc53f184462e8ba0b099bf27edfb75a14856bde7d7b3baf6cf83aea7a233198f05c36e288df3b05a7a53cd92d4e420e3046825278c8081930e34c6f285ade4ccfd1e2f0dbee9f3b3eb5f01319e45aa25b5f53ee5eabb0b7d96def60f9ec9ee0ba14f55a1b3e6ab14ba0723eeb99ee8f400a72dac6941e4ac6d6f02c98c5f4513ae094b92c98a80b5c895dd04d2a12ad4aef362bb5953927e3a47ae12ed5564f2632092f2a624c49747f9a1e30480401bbfc8ff29be26a4024b4d5ff49eb2bfa85b077deede5a369676989081427a2608b454e7367b8b9a42e1a7f60dca3f28735cd2665b0c85fc7dc435d54a0435319b338afec5dbbf8a969c369f050842e6bc1205cf007154fd322204e3aa12cfe42558807041b8b228797b5aa79a1688c397cbd979958387c8af370e77c9b21901b9a54faf1279db1a1c267257db14fb6add351932aed705bbe245d00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090aaa3d8aaf002a8d803d5a61ee77855a1b1a83bf9d2876cb1799cc7d50242319b777f22401f5940391ea19dd51adea400e4155c050c97921e7b9e8d9569793d66a18993f01546c31e88c63650dd61593ebaa19783e83d02d1df865acdddc446a1035c68d2ae1ec752cc635c9f7873a9ae9dd6c11fcf91a1c39f655a88e6c5c8187bc8c043dffa33ced6d90fcd5f52ef9868ef06b8448bbe401436cf90f1e1206d1475d9dd3fca50fc3569781cb70fd852886b621254c326bad7156b0b6bef9b43cbee71cebe695e6162141ee0e0acf49a46f893f99f954e5ca01f03843341958fa4a619b6aed078f60e0832ebd8e39c28de4e01b2e08e1bdcd15c109f80fb6d1ac648502f5035e69e3caa565ab7f2ad11b65836af0956ee757fc3c0b177ea43cc8ed8c24f2721ec30878aa905e173c3456972a98d33f26936d5e5235075381068a78b619b007352d25ce35983e4f0e8e123bed1151c47f3ef885e3ced4363633ffeadd314fd87f245d15f096bc7fa13c3b1a916694cde1357671bb441e3fddf758f3c8463d1396975e177e35e0b81ce2b6adc475a36a96823ede47577420900802babb5d4236d7eb1391f6c513b35d883840894f8de8793ebe9f22b7404398d9df12131ef86c0459e8834440cdc38a0f53484fcafad8fed6928a6066a8918d600000228000002240000022023c2fccaafb25ee1276153a15948bd2fad3a99b872224da8d51726d7daccef94000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0d8fdbb5069359f237c4886db712d43c9c52973d465fd014a72d639eb5f0c2d9626596f2913d0ee10c27275852bc112761186fe7ed2ddbb51bf07679bfd00798b40a3377547777382c98f5113505bae5dddff8110ad81a9945f1ab74a06473eb2d8b50deadd7fb1ae2a02edd5d3a40d43dc886b83e4e504e766c7d5ea5ec9633adf247557ce570b7ad472cf3eaa13c3816c77b0b7806113f5a728b9bef4490c05482a8ac066dab54271d7f339ea89d091c4129b20ec7c4335388385ff454bc5e5d02deeacc690e377d25b63999a02bc57e8f1b02eb993cf20a10ff1f83129671f4c31d226ece44f0645576ff76081b6de7505707b7d87903c27e79cee45f9f113480c3c12dbde7f2f80293dc495754777f68466c52a4658b29c8bdf23ba77523b0c999d8c46b394b96aa70f365b001d5ab58528466185bd8ce19773d1a62cf2aa33669ecaa877583d57ffa70809745a5d54e6a0b0b0f28a25f8ed3fc1c1f845be0b6cff133776cfd58b05081632a9694425629519684006b8d7dcf918cf25196a22b1cebcc80eb8a54e93e6aa8d55fe32068c9477028df3b8afb36560b7503202d095bf123b4ee1c4f533691a7a2c66c7695f86a5ce6e1b84501abf5ca2bae000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80203163a1a00a9c5d85cdc65475d0664214621c08a81f806486dcf0397cd784b890e8b1e4605c2e8145ce41818c80dd23945162f611bfd8e042a83f8a1d14b0f2e02177609158735574f3a9bfbea5cc14736855665699c33f758e7eba004e365efdf2df08024dc3a3831553a1426d8134d0e36f7d142f4db4ac71ab70a844b9840550000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a161a511809be9c651ea355d40593e7a005ed0dd30bc975f8ddb1185ecf8c06e17ab5243123eabe03b3f1215cbe60bb0627c041311ff2fa6b0a2fbacfb70f720aeb25ad379637cdc33a9192b6877d737d0d02943c21f59e9b127f98d808e60000a28d7b00e8a327386d3d25e125ba55321cdf1c9cf219c8a7b11f7eb5ab3843a9405c00360d4e838cc7ff442d8e010e31baa8189bff90d0a6aeba434c31f656cd8ec07481394b4ae76bdb14c2fad911aef44500517dd6c48e16cb81f121bd0603741263a8a7d13b8e5c7a356a2ed9c37ce2befb041c04c809ba25b29512cca47f6bba8b36eb4ef9cf4a8f863ca339d24edad26cb1135d5ef70d515719d4a87ee6ebfc41ddf0e8b1b568f03242f43a1e64af0df5c884758637659685b6c3438b3f6dd7568e8859f64d8d26eb0291703b04e4fbed9bfd1c1d33c8767f53ccd5086e0900fb292cc69f3ad704247e44bfc5afab4a596db626f96635514926134d4b9b71bf85e5fe9faa75937a37b5b09245cca892aa19a1223aa450c706575d25d742d80bffb29326a300ed2f1eb120ec2f107ef2e5651ff6b06fe0f2653718603f625ca097931586a9125e54ed22377c1b601e050528b79760891dcd367c98fd06b601e0d5d28a0aba755ceab709f639af8f4dae1fcbe4ee8ee9d58f6e311b7000f000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abff423357871b22fe0f9ae55af19007bbb7d8a2df85e1825788279cb38b65841545bdc35f5cd04a8858478731862e78fa217e67aa41458697c4561de9db27da48828502560613cd97d8a4419955563f072bee61e5338bb03a72366970adc1138602f6eb1991e2af76bfde9cae565c4d689658941f4681de283afae7f65d768992840f36c78f02ca67f357ae92ac7e27ee1553fc6d646585a43cfc49b176ae871e06015ab784371d2770ecfef8ff5739c5c2012a30a9143845fc4e2c0f4cf634fa77239bdd179e6e8734ac851003655caf2392a29373e9fde494c2674c8acf8f23b63d53ce3ede36db4e0a75fc442a912777a71af7fbcc88f6650cb897758ab792c04b8761ad27ad0b457d225bee31e4835bf6e774eaece1bb40e53464b804b2c0eabcd8171c9d9da8e890a60f844c6423faf8a239e43003b021b81bbf3b8ee52ed5353333f9bfd0153d2520654eebe4850dc692fa8a819aba48de6c00aee158c5b2955c13bc5866bfc7fac17cdc705b39009ba62bbed3d1ce1efae439fa8c660e4decb3219f652bcd1c4e55a2791075c9f01ceab4c769e1d2951da5b9af449b00d7c3cb317209f3d6901ca434c48dc1402fdb460ef050731ce3e3c9ea8d2fb01a48a48114b349309d533c30642794ce4f3af9fe7a2fe522497f9409e57ebd1e00000228000002240000022017f2603a8bff38fe67fe97cb965f3f05569efc4532437a581f0921729acb418f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000265c1c561ef93bb9d8882e34c534a43821b7afc68fc80aac3787cf387d4f9e9b9ce28eee95f3dc9e580a7e909833446b1e0e7d339d10b5d3a562f1ccc540d9246f1a2a5f046eed4d5d455bb93c4a94471ea772a4f6bda75a4ecc9223038b9d7dfd02d277636d108da4394116329ecc813f633867c7275249644709df0e02f830c75a9dd01556c7f942cb8c04a44289a97c200d625573684256cd37c6619b6d55976f9196bb56f7d90db56f066324c66fcee299defb392fc11801151490a0c711e3dce1d3b913c6397b695f4dee36884462e1ca673e23c7fb354154a0243efe6b90c60d1ad22a0516e4882fbeffddfac696fc15f9e8406cd19def4ccda979a89fd3e0989c7640b528a135067d97581fa76477eb33ed21414fff8bebab4586e1d71e2dd52f7c2f5db2a64c49005af672200c4f9e0a7b665bffbf691c8443b818f42e3c4d09acad17eba584842947898546c5021e84b99910d0e4cdd5a37d5d71ce1bf373a2e271ccb214cbfed132b87e06941e306fefdca9fe4cc5dcf86dbb235d30c199d5fd293b541dbee504ef07550c0da4bfd17adec07696cd1a49d0d2f5b8a3ce711a61d0fa2734ba634226150b5badd50794143cd44f28abaa6e4c7d626a000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020ead50c7d07b32f0a443999282a55414e1d463bbde360b8a129e9208efd6a01219dd5aea9b6fec3674c412df10aa5e20861017b64c3602e05d497a7cd37ea4e2021aa1586feaa45de0a7bd2d416e9ef1b9cc212035f1d6cf5bf3ff701602d56b2a0db2f982043b77a6aca0d3a8cbd1f44ce1a32f5e9d0972e6ea26777d9cf27d280000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f81c823e0a867c8cdd835919b57a8a6098a9a494d1d138f49122b016c3bcd86ab01abc0ac8f6aea414e80bc13391f162a3e00fb40a1b66cc96753556d108c180723f65b67256e162c78da5bc8ab606be6fd04ba1a1857812f65a53f5066b51b4ba424528a54d3ae04ecc5c9a5317a5b776d4e8ac828b752a1c73428dc80d2e64195aacad6df34a693491004154bb3dcb2cf6d5e4709ea8e53d96c8546ebca25c2ccc9222d1b33d6e07e1e63760e645d7f5f4e1a30a1afd078f44b552dc04dd1d1aa7c53b32d6fa4352328102b9631ef1710e112685bd9ba12ebd30700bc9137868f10ff6256dbd0155c62b4da78ff2755d85efeb0cff6317cb40c4b56c3ce43035769653544dbd7de466c9b91fd475cb1baa0bcbfc412bc943167057bc00e69cfab21dae4cd6f6e381d9998c4d804f77a4294c24c7b697fe199919e11e34977a533b4b5329492444e00d499747f62eb2deab92b7e1371a2b6b160bfcd70e180cf3bb5f051ea5afb99ae72711d106b1682f56b6e96479532d378a2c99af32b829f356eea4fa4b280c743eb32eab0a6b5785ebc9418496e435d2b4c9766172a693bced565d40327ff2674b42b971d582a1d2944257d5fcc9a3a3efd405f7edc1ea423f7d7edd381c322385a76ae2773f483a6ad9ec761ae9d3dc14c47e02a2ac30000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2a7b19e26eea6bd7c3952a60992464442ffdaa587b7b6940bc5ee3f43750da62d8f8c1f9eeb94acfe0f87b9cf53b828999df17a474e7aec6ce2320f7b81b6eff885d392c41169e3f046d11c408d28ac42498069f2a5124027ba7d03c5c58f48062278e84ef2c8ff2d9407dddbde8d87650c9fa6f859fd874204356c5dca85394c34d2cf6f871afb5afe1e03359c44676626e05f618e02b82b2c92158fcd50f87cfe251f6a40ad55a66570d78ab5d772b72ce3e8ca6755a8d9d6c508432a621fe4fc736c0dc6291896724c67e45e227cf19ea6b555b76e0021fe9ecf01ad972aa395f94207983ec771caa92891dc21e002e09dc0e79c28c844c628d0674e94591699fa165989c19ac86952835203713005197f97de6694da5194e86616c7adedd7f70000002167cb6f4b05ee7014a063dd076f9e46473a2f3703c3a3d9afcedc8aa6bc1cf026774eaf666e193ffa7b0a36037a0ebbf416ccd7b99aad397d083cb33b89eef6a75bd9f015b4a3ce148aeb4f09d573a3e9630d7a61d5ed07952d4db4440489545b13ec89c46f05e01ffaa8a4c7d602db51a3b39af5f5512b6911540a3425953e600e6e0cd89e5e8c20cdce0cdd6522b3b29a7eab796933402599b7e68096074b1f8c79c60c81d8f0c7ea6f9e0b5341e1bae96181c5ddbaff5c08f00000228000002240000022025892b9f210f4c1b8bf7dd0bdac2d5a6dd8af096f21aca0bac48c9cc97354e7d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000234fa2be8c7e001062973ecc7bab84906199ec4bd0aa5789e6a4c9dd7f5dc95f47feb6214c655ff4e670f0d279410909fa86dbb95ccf5dd3243a11388c355165b5e7a66c7c5f76e3138e3a7d95cfb24691f5383b3972d311f0906930dd321e37cac31119b8701615b9e242a7cad89c61c356067dd84de567c89f71d916dee746724b3b76a941a8d976f47347363d78695acd99b8de78e8186ccff20b8c833d223a5f6f3f83f27fc61f2006b1492c0178ee157292759915f56de195cc680b9238594d786b7e2936ac384bc3c41c83af10067817000b9df3bf76679cd6cdcaf46e23ee5804a0791e2037d380d67e3ff22e59ffa4278066181641fd61786ee7e0191510d5d58115dda8b336fb82fedd53d453ef801f99a88546279a58ba411713736817ff31a338690863b80b2f2e2ef07c0d0fac8e64b53e21c5078181891991a2ab203a1f496fb927751354fc6282eae789e3ae18f62b1780c2d968a776694e2b0752ccb191d49fc1bec86a52c1da3eb677c2f64222ffc0c8f74ad98ef06f1cee3aa9d9b942e931aa0a29d10713a5bf96e82450a5d1fb167b0e8a878bc7c22172d2e5ebadaf35ca4c9d458167ccc4a53766f1b0732b421fbe67d31bf387f24ceb000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802069e97f0a10eb774aaf07a55708d624f0aa0709c05a933d2cbc4cd3ddd0fa2432de3f61a13f29af0cd400bc73a6822b3138113a54dc3ce4933c6fc14522f6011021c8139cb5f8949124ba7503620be77e42870b1496c29507d610aad536486647f12ac78a04cac4efcd8dff7ec5d328febe1238c008f6484845fd820e48aa274e70000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097740732c8a39e454e12c9fee6a2d060dd5efb911c93b638bc5f92f82caffaeee2366c927564a5c374e28b82642bd974a60ca068b4cc872b6824ba4a03f86e861f27de7777077fefab8d08c709a59c83b958f54246c4007267c6cf0e23cb7becef413c167b6861974e9b96cc44018f4f9e5bc0d6b000d62f066edbe2136da18bc51e09c77526f9555fb69b0751e001d1997bbab71609dd9ab3c123e6edff2afdc307f81539a3eb8f2384e04840a43130f27df9ad132a1c1c8c47961e9d00dc49e4b65f110bb05e7d4b30263e6f81557758bbecd4aed79a369bedb93bd9970f7fb0fe3d005205853e6093706789301f925e841fc7381cc82ef4d2dbd15f9369c6be7644e6a0b4a74dc1980472f2af907aee96434bb02947c03131d4d71f1df9517aec0ed69c841676d20eada8aa6eb4abef1a00e895b9a244acabe4996cdea0ce93760f4f8c17f074e64a36f38a46076193c17e4005f4f0064205bdf87855a696b3588bc278d4cb366e0330ec0e69fb9ff6b6fd8189a64b10e364e03126833a8fba70a8915dcb6cc2594dd6f8c14da46298225e1c89e65269f8b06486d57201c85c86db84281753c6972034fb528d75b0fc6eaf98435302a27a7ef1b6669fd148e24d485d50553c5e978253b72fe84da254d31cb50741f49835ec212692f6b220000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002062ef80f61ee61d73dbc64e2793124ba70bc51f131fc9b0d644332b5c050a7797ebbd8ed3c80b79177eabfbd00f9c0d74972d37a73eafa74a02084487b1befa28ce83bcb7e6e956b1206f47656a47dfc62ee8fc652e2210ca8e2c9287d020177d55ad624cc41b2a01ed236a5033f1b2ba7b80cc8221c143a30f9e496444bee7f65bc20ee3675b2c90fcd37133b46b722026ad47424d6a088f7fc8f68cabb8621c57e1612fda294d1c733a5686b7504a56ca1798d325f9203874c8e0e270ea27eb875a4e873fbe427eee30aeaaf8f9102f8c0ac4f12138d67bb5e123c42009a8b0b60dc9764411398e37430014fb66f566d0e7b34e50e4466f07f83f4abff8a997202bc4e27e79b10e59751426eb8d4cfee7decd5b45b3415c0ebc996464178a69a680a5afc2dd52501982fb8a541925c1785aeb8389dd0c25127043144b3dda9370ce58f800b9f993306b9722e635885142de9cf864769ead08282091dcaa1e06997369e7908c0209e4b94c6ac9920e301d943b6f407e8fe173cf177e6b748a78fc6538084d223b6ccb6658b3812328b5c00ae491f22665ce9fb01acc38240383d13e132beb94d0ce7d2a6ecfa7e9f0ea3b19ecc5af1c5e25e6d953ceeaf5b0bd05b9b0051504ecf948609e806b09c412703222e8b8dda1c45132d995015d6b00000228000002240000022025a4a5760c2bf6447b9d0956228a23284bd6b67ecdb753d7f8c62b297924b87500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aeb923fe46eb6d9979929e2d70121e18944cf95d447b26370f70cfbdfbccac96773e8e1694d65c0ece8bbee98cc0a605e7a4dda273cdb418f2453d4c0ac50bf53f1e25d5203e26bb6ab3bd89db8a80fe21be9bc3f34987a117ceeb42d01dc74657c86ff920cded71d578029c558b4651d6eeb710d07768f752a51e23d62fddf8a3b7ea52648143ad4e261387c8d4b857a5e13b64c809e714613bef4cf899b88e4f196b3439b732b7276a429e9ec01ff9fe04e33eb930b9f6745d8a0d7eba1900f7f7e6f10e1fc3cd7d9b97f5e9ca6a9b31414897f93dbc4d5261c0b9dbfd4803c839c32cdea575cb6f7cb45e0b0aeb1a00f243c056ad4e0b3f33810736fa2136aee77b6519e1971bbf5f23d462e03ea7cbccfac61bcd75591f878bcfd9b8589b1ff1e0db5b003db26f67b110c00d4182c506cb68672c5d6347f0a205d9cbdaaa2986a1b85c312abb15971b77e77d5853c89b398362a82cd0042b51a89dfded4215a3a70f6034a27c0706362f2dfeac65a383a85d09f3d169cbbeefbb5605b2afcc9e2fbf45f41b49b12b898cd7c7cf2f3804fad5972116352ddfe9673d5d83d24f4cc55e89bb8a9a2702c60f184ba06630281e6045432c08e21cb1229c212a20000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021d6c595a5e0c4df7798bf8ff3b0514a1748e00ba36a2e3c6d1dbac253328f7b517e9af552da1ea0a71b339f7a277dc35932080f78d11e15b1628a8b62e797fc6021ea53447d54dae9cc2a4f1811e98d0ec3adaead1d8256f77abc8c84be8a612361d308c327794f972c114bb74cfa1014d3c8f37377c54bca06660d23d6562e9fe0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001826dfff9d012a9b7f6f6f412af9f06da73df7c917e83dfedc8b6f8f0738c9717507eca008b54c5b1483506e9da9f94b8a1aa69dccfd3d4734d5c829c94ca7b673a63e12a1359441a069fe66546b06a7d7391533aa4fb0bd6e9036449320e5a551aa8e5931eed6303c8bdf15d3dbd9ba39205dfc9a0fdb601a3783d274ef09c6cfba41eaf9799549e9f0a2166d0610672d6c51996aa170b7b6c27f4956c112d58447f27774e86c4163b3088693a0092b56e3a1d0130261dd9b8db314d975d9e1e61cc741674352c2bac8f87338f0061f15199496c4d19eaafb6be421f3a433751d12cb38bb529eec6f45c4686574874058b3792d971534c16c993adbd7c29a659d40fd134ec1f23f8c171b3333d9ecb33515c1cd8879fbd6722399145f798698a07a6c3247237a1a56355c9210fb16ca505d80e3d086d161274668dff8092fe71c8e57b7dea2795e604568229260f4d1c479c01ce3c195ebdae3d0f9e4316d4721e87d450d4e7035a2dc98c1722e0426776320a1fd12f3b8bc2f96179a6533a4229cc45d96e3fac92af0447ba1a8c75928841d075308c954d21f6aed0c949bf2d608a94cfdc3e4a1d0b84e421a060ff29d8cf9789982a5b95f0affe1fdcad4845eafbc9e03c0e821a2011f8683899abc3059393c750e5bed6967290c79c768ec000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000907166b83a93381817b554aa801c9b1f25b9eed23213de5daa6b649f70364c7683d2fc7a00868965cdaab15b7aef4dd4362e6424ed2682791a0895e3eb1bea59a5f519b8fd5641f306e0d49d2e1e79ec68843c8ba7c5797513330fd6def61422055b04ee0445d0765a48941bae69d2db4aa8ee8289fa9e4702969eaf260243fba3e6d12274d06632cd775ca8a55c0ce424d1b54cc010d93d80086778382e8ac1948f2dcadf55240148754dce619b5126ee7bbf7fe9117cfc749c1e44fc44b539bc670d66133638b4a4d666b5572f2221dfb548f6360245a3fea438a33839c00ef1d69e1e7d62a4ac3653ccaf21cb712666bdb0ac91e2e6f0fb68bf05164adef704c64d28f15095767d3136541fa57874707110d61794ddc3f2b220de60269911cc1a98b424e639642fa4953b1ee41225aad4935d54a3181cb040c68217d676b8a5a7ca8c8391ff2e0e46f9fbd616d5f492fe39935d87d80b68b714881a9aa5f3bce6e1013cffadb4c87e56894679861e7712e860b29883c3da1d90e2b1df1706f999179d64355a5dbb65e98a5b94b98dc5153640b323d2c9ea2019171e2aa162bcb4fdb6b70c705792f8c17d2abb6740e3cbbbdcab7a7bb9262048f15e76355e37b7ab589ce0516fb6861842efbf3b36f34cdc1411f8b41d9c7a7e63539c3c9c00000228000002240000022006bde5abbbdea724a66a2c871c4c1787de8e65ccee51a1509a268f9bcd6775ec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009196bc3d76b9b7ed7fbafaf905d1f5c435edfb93d4b4df2cbaf177737e89c7804ba0040328bc74a3acbff4e3323ae5abb2d68238824943a5e9a7483c890eff008e9b6eaf6086d65cf93a58729058ccc3713575e7f94c9e9f09185d08496d5bb979e6e3177d65b46c6309411ba0727242b88185cbef3c7eca87beb9f9e029f22aa2344746b087e0de07d9f833d5cc35f89c40786bbbb0e6df2ee57aca184e214ea5286f8652393478b297b70c1c6c5b680cc43842b1d29bf57eca9e235345f7d4ec1c3ebec5f7aa2b78820682f3503d3a5dc62617959a92e003f8e9a7aa67f1eaf01ac6e574c0ec8140c187d0b041754bc4b01169a86b391067a05b380886966e6a1d57514d67d3b2a36881b002aec05bc065889bf87fe3be331338f960448dfa808cdb53fcd2e0df6c2f45ea754656a2e51a497cd5073f3f623e29103dc30c2f1d5dfe002982ab50dcf090f793651188f35a586bf2a4aed4954b1ad8ac51d2e102364b226b375c98f6ebe74f80f4eb04777a35b56c3772c624920d0c06bbb50c0e597385fc7e23e0aa711a8df3684a13d35b9f927002ddbd029a7301a54c272b59c6f7ddb749cd177e8d4be2c9e313de428ab20b0480434faa1ab8ad27527779000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021417c598aae48d6aadde65b6103d19979e4042460012013c0e4b01ce554605e12c268ca7625b8981a285bc756917b178f3ac6b1865a2e9e6f8a1c12bbf0c2d1d02227e7d5304c9d43d45bf941c4c3793c7c95453309ecbdeef5d4376522ecb0de5033f5687bd503ff808b2f88fc9b50f0562ba46fbfc8075f273a8b4655e6731e00000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002db1401ca782f4987c995a474cb48a1d33f0b39cc55aeed7114e7fc6a192494c246396329dcea092abf1aaaaaefba640e9827fb3c62b1e1652d5f7eb3f3a50022b0a504ecf9840d72e54c9ccc088df2da6d85b819847594778d9dfeac7d9ed6aa5f99128600a78dccd7d8573e3b2e9574f041045f09b24b8b4c180bcf5b87b8ec99093629c227296e69d7da4c24d8eeba261a1a603b64c54c709a0bc294a1a13c2e0b488bd9cc5ee994a5d3a2cf04fddda141acb055705f57d7deb6d61ee97a53430db733bc2dd0708959f88b36dd02a11ce2aba90f0afe2e60dcb9a9e08a9ac0ed86e87743f96de39d333ba9d5982b90fa272ea1b8652ed2aa9737564f4b1b1036e8dc6faf0975e9156e4e675e4e08f91a16574bf3a8a3f89de4291a389fcc3e5deff351295b1a8e6862d15e7a8f916ee16f3989320a7e948b015b9f5a4ce65af0895c6740fb90f6ed1c55c5cbcdb316fed1386aa7a2d20d5e0f00bc2c4329e9d0d8d1d9a2d44d897821f212f5f5e47030f7e328b07015a1bb381c98c4003a1273472ece955de6711b45ef93cef88783f16757186db834f8a44cf41b04fbab9e3de65997d41cc74b8a86300635284d4101454b3f768b2a68aa58136ede363eeef718f19ce4565a4a999a38ec2142db9d7bfdd873e191d77c87a97c6d1659c5b00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018b2e1f4ba240e0c59e931731b3123c54fb48adb1d21f2c5e099d5ee8925b0072271f564d77585067028ff1cf533cc6492eb2e1d7887b53899ea353ea922d5d03f18e5a060d74debf896c36d372ade1e8d8721943be1ea2c80a50ab7881c1dcac5db8ffbff9d4e04692fb6064b5a10e1170b80aeda45c958161214df706d4356c66e5ed2f276eafb80fcc846a7384bc37d887c3a2ce0194e12dbee899a9be09bc259d55e91349ec991b9cad660fed4965ce5f8a2ea755305e8bea012e344e2156d441d87826f96c82f16f4988b2291ade7dfbb473814088945745d850a2e5eacc89cd1df60a585a30101683fc2922732934705e2a7d0ac1affeb6d3c525d3ecc5ddd455075116d5f6aa3ac5fb192db99857bd96f535b122f6d31039e24346c7c71c49cb25574ed7f735a402b8591a33fab9ca7e914eeb4b41f536d496c7751f9398fd7d7d8703dc38d954c2a53b8f65827fbaf4ba6c6dc2e911e46eff35b3f6c27968e516cec3dc0d72dd7b73f94ecb33a92bc6a5a3c80e967ac20b69e88ffcbca9b629e027c02dc4ed27807189e2bc9f90c07ff2d8a6e4385df81a5c5489dd139e7611cd10aac672c8563e93391dff57f1c3b93a7afd0c51d96de6e839bdb33354d2b37f842fd19b8d8b3dcd325e61a4a1e6b15c60791e3bacae087a561d34e00000228000002240000022016c667a6a1860ae05bf84bd8ec52d8af6986c1d45e2e6685bef3f9d15d692d4300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9f3d552e7dda29bcd07d31a14d7b38ba6a7e9739275eda4a15f0539c1a9887ac1708f5bb5cfae94cd7dc2d5c5aa0f753be3d19b00fa9a9cf3cd9fe274c6d48be55ba77984bec5af98255bcadfca9e04defbf139cea6840e6e2afe27dfa45b9d40deae74dabfc183a9e8cb47aa7d8c1982d28f6ee356df68637f58df98278436855300ed45a21b9af0698cd0431ed117ed1c744b9cb63ff9b3790a5cbaed29cf5124f3fa4895fd969336225c1e5a231254f0575defb2a8691f4644a5770fc54d45235834eb713c372d33d6a4678e01bdfe015d2863a003f544c6049abe66dc70b9da7556d2be27f1c2a5144475077b3dcf5707f8bd27fba37d2c7c667520033403e403440f9dc46c1da6518c23ff0be3c56a9fbe4f900c083089a9e1e96f706af05a51faa43f43d16d0b88fd9ac6ab8acf17321065527f41f9467a2c420abf5e3f6d46b023ee9df23c70a547f99dd79b2159aa02382a82af20c835405bd5069cc4ebbfc1c0025c12507d2f914eb34a69661fc6b630db1e4bb10a7500643b46330573723cec38ebd55acdc2ee0b83b2f9d76df2d5cda72fe717e7f7b420549dddc1f89e2e8dca5df5a4639204979c0e28e108cd1a01b6b4b2733d502b37ef9ae7000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020dd6a7c87516b39d8aad3477dedc1d87a54daa5a9268e2dd3542ce83a77887e3194b497de97cf1d3f17f506d9582f8795ac0ef30503c24df565219bb713f251202238d6f3d042b9810ecd7754366823d8c331b7c8679d5708bf9dcca0709126dd3188a7a6a2bb482650ad93576601ac50f878ad428d73de3c8d0d1820dde9df3d70000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a45d2e00fe41278b2194d21d694621346044b5c8f35176313f1c4bbd6de4c73ed5474dc0b582543d592b525617b3f5bdedfdafde71337c63203f14c725b88a3ad2664c037d70c557ce56b2acceeb38df232178d6761a3a19995690c91c953bf75075018686658423462951975dc1b924b9d51bcf508975f684e42c30402f807e21be75d2a7d65626d30413e41ed9c0d4ee8aa40669812ebb27a144362ce4c601031d80afb0e596da8c3fe4090c693c7551f3c587b3623bcac8b6600bac49126a1c1d28d6a783fdaf27676c84f4716521d662cfe117a3d90b5048d2ce56982689986a76c1d7d3328c60fb80d6747ca7afd7dd535393c5edd6b54d65141de7cea2e5d6afa1091e6f0fb6f236eef99a77eb9b67b0643f47d3b88ea2924135257e4efb53254f57cba21b025b7e54c42ca995fc0eeda4757c78ca85eb18c3b5fa0a1894b9df4d0d0b3f59d5eaa4a3d0f79d0c4a2ec852712d4917d14f46622bc9b5f3127102d0e5fc2790865dff2799c02bc290b6280bf94bf51cda068ec8c5276ed36798c7164a592901a78ae19bc14ee5a0d0eb72fa4eaaae6a6145e1968c10e59576372c180012cef0ac238e173a9a7db13a6a21f4a2c8cb4fd49921ab35a4488eee3ceaaa090d4a7f6fd9c9acf2c98905a5b1259fd7ffe3ae89554751a566fcfd000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a82d5be7b13f9e1c1a33619b6f59f3332767d09f19beb955d9c0d0579943aaac9cfd3e532986e995523c166d806040b19c7fabd207f7b54416ca476128b42511cf37e2346099db7cdb821f92e45f8fbf9ed719e18de7e2fae9f324cf8dd14203a49b26940a2b6b4f032b37974d7a7ecb2c9c179d41df9032013a50fd4d9656b9e1cf0f2def210192a5a25b01702702b4d64e6cfd427843d72a4f0c26d4b5dc76dbfc2706fda9695c9f2d4d86228065d196d1c22ba58c78e4485c6e44f4f58ed8f9c57210f68d720ea3e6486f82df2a41100ef2ab00ee4c7c3e42a789ea593b24f053d53dcbea243ba7eb21fb673a78cbb75a3a26a2275a1372c5495d229bbe3a3357cd265dbae9fa111d64315c58dd741750c98318c01eeeba6b63ee35c672c9eef3ec27fe90ef4435c33de902f71142b73f7995d1ea7e1620eebfac383ef812294a3b448235e368d0e0452523e7a127f8a7ced8412fecfbad9a2331bb1488be6d39e4a4123630d7afd8c44a6e8a2c79c3e02a193b2d27a889e1c27081c5d4d221cf7bcef6a4cd98cac663d73f18ae1f3bbdb3fee095f2089b51f9b470bd1eab2abc4f5d8a843d224b3d70922cd1f3332ce2f11523055619f9b74410234d6ad260495502ef585fd06e297eb8f5af7383a7a4785b845dfd2396a281a47aa88f85000002280000022400000220137f28dccfe01574f3a9f478fcb5751c01ad1dc4b9f54f575eabfa8abf1b08b200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000206a993fa1ea6afcf8cfd885a95abee0e30e461da4dd0daf3248d0807d7d85d75ace9c97f1f681c03ed2ad07a737f2664caf34dfaa5d99bf6ab0971afc3a06a4ef18c93df0f0f6e4e449a81838e6168359f3cbb2d5adb27468db61073ec35112278853cfa5436bc096c80c3f6697e523ba5147219a9c7977c19b3c0a6c857637ec978d87db88458a4cca8cffa7f7fb9a900d745873c778802520040c646954f24f78d6977ae2ac7056baaea00407549b35409b8b5e18c27c8196e682d4b205368a10ddf5938e398ebc4a396bebc8564b18d9cefe93b2d2eb36a2d2e52dec310eba1af985eb82c3cb280e211ea892e26c4453eeaf621d9b3ed26262ec19d366e8d283480fe95dfa4537cf5c7cb062719bb692b005b0be064621b7a46b7114f4781976c29d736b727bfeea923dee0c7acc4b69514bb585cc1c80040056123caf7f020cbd73cd11fb4071fe2eea2de5ec18d9f4da8716a6a412fb20874bf7d9c263a9f578bfb265e30cdeecb38006702fcdaeb69a0380ce1e808c98fb0fb77b0f06dc8565a321deb7d8ede2bd4ad1a2fa4e40d893959ce84444f3967f25a0c29d30976fe03ef6c1bda1e92acc54ff84a3da105a51db6c20d9640945e68f9165adcc000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020bbb54eea4b6ed1bdb85c568062754ef8222936bb481ff0296a16917fc9c99fa21d3a49f3229f6c5383c79d527685ef5a13ed033493f11a9eee837605266ef4d0227253fa2ba1906dfa350d2f3821e61bb103f6aeab5e6d55fe436cf239646643807fd6ebde6be6b179356de4e73e1dd7cb74e1e83d41074179e853eeb2fdf093a0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066c8396f03380c74fcf001426fade31ea645160c61fdc0b2e46292c323d379c8b17b3416afee3645b214b903b83f897ebdde983838a38ac359f5a6ee1a5ac895f5d0f5127abbc28d7b962f93cad3d834fc74cd24fcc2ad476e8502ab1732198d3760f917cfe5476f699814b6c80c9639e620eae95ee63c36f235c32461bf86e5f562c63d95bc924ec3ae6c000ba2fc7a40cec79c3270a4d8c76870580abea6463168b363e18e1dc8c049c27a051ce79a69ded07594a98edc5b45672e57959e895c0f25b5f7d00d80b68cfd24a34b778b4e3ec5d20438a24d8de04a32f41a9731a7182b752185b061f309026e237e403b05985061a23953aaed589e1089bb355fd0fa807327255433686f08ee2a168d8a052e32cf1240876b28b9d3dd0ba14f421f73dd7883e42ee2951c956f7ee506555f897d8a589d7b80211f010d06bce460dd770647f53f72e2107dffe3c0c3f32a0063a5b8ebc1413a73be0e83894b98f9f3b31c9850b1ba467eec7b7c90f648061ddc8c7f00894deb547670d550fc3989bd158fad75c21a0c67b976baea1633d69c753c8c18620dbf0b0aadcee423aa61bd2e54bbf40b03558d4e5c9a402c65e7e8acacb61fbe8bfafed659914de1e4a16b27d1a7cc228912f8a8423191f309ef8bf81e700380245749f5955787cc2c100000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080c1f94dd8cc43ba78613b10d6e484afd7ca04d6c479eea872df3cea904a1b9bd640a81c3cdf16e19b414031ade81c3150609da8e6f25c5a62d4c2c41f7b8e464edd1244a2b8cbe5133cd27b41d95533eb2be8b08a6b0408a895d7ee722ea4c9af51153fbc2eff1625270c6c5021d65fd38a9c6a0fa42b0f04c7844e90af462bc8a526ca8120a37b1ad484b8a0aefd0e93f314596c88340bd88d2b3b4e54afc06045382d7cddf910ff5b30d115b2ae7ab1a0998ad7ba0fff8047e311cd56949ad98429a5a0a6a5cf159ff7114a06fdfa53079197cb64ffa269c3a5c3a46c2427f58c8fb1d475df1ce2b246d245057d83610c3659b087c2f1c884c1c2db6739316063807f4570b2adac930bc13fd6167e67cd7dc2c958860b3ee61b5db4b78c4c5d49cf951e1fedd7257f1aeb3a9f0114981932e8c2f6046bda42ced332f44effd295c126264de89fcd64d65f732b1a2240133ae0a531091161f287f85e587f0ac45830c3df49bd95c74f14516b7f87de73fea6f38cf74d0f609b05707ecaae93dbec72d3db3eb0c64216890d200dcdc42d851a4de6dd93f75c635f0f88713494599c865db8123f2f16769c2ee1d70743c790559e993dd3febea495f9f96deff93bafa6019cd2b34f48bfdba13b16df041d08612d9d82cde4dbfcef952b520f310000022800000224000002201361d167178c9333d0ae3c82a56c5bfe9693fec29cd5aa13380187bf46cd679600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000910d2a411d5a4028bec63e0b1cc14718892e89c7cc6f19d30961570ddc1e7383eb5f6180cf27d3670364c92e7558175f77f8c20651ecc0a9ee8f42b9d71a8a534cdd863d894072a7e9303540043aac208ca5c9e071697455c27a9bdb5e039df9d37d5d340c812de51781e8610c5f2641d2919a9fe3f4d0a686d5375280fbb78746ce47580ab12af98f06d905873608543884a7f6dcc3491e68fa1a479552f0b00796f15b3e66baa2d175de92629aad2cc58f9d2413cd9bc8a7491ac45004ecbe6280fc2f290be21a5e9fdae04a27f7ac7ed04a9afa51089fbac90425c844d182a2950c8a26d7c1b7f9b91d5d7343230cece00d5b5e91defbf25c604f072ceae1c624d5f0eef1fc9356d930afb3f2da1ff4b548578946de06ef9a220e94a0e960c7ca41162449821bfd107d60c4f586f31894357c8db30119e59908ff99dfdc762b22f0ec36b28ea895f91d10ea40be55451927a5028d238cbbac78a84908e17840ea15d7626ef4005b7ab664bf8d92516b093648323549369957934ec2611f7c8ed1a5ebf3b164f1ca541f3876d798b785a8b0eb2231ad6255495ebe55027f7b93d81416b625928ac9fa71210ba44616d63af71bb7813bfe3417622cfe02dede000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020e7939fe52cc0626d730746270fbd543b0d3296f74fe27b175cab7a724b166b10885c3b16d3a31833032802a6fc76d6644e798971bcedd97c6573249db0863ca0227a3efd57e765e01ee3f0c9256d05f89cd19405638e941f59664f1973934d4020684ec6a8845ca24b45d69f33a5ea497f721a6b652d3c05f518b2b00b631ffe30000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087ca673278111c8e2d9396a43450ddc10dd1fe11caa07af93ac2caa2fea8f1a83122dbc084a60fed40f9f3208b4203e1e4995eb3f480067f595290334b7ea000db36664899fd51d3be75e358bcd1ad44897b24397d49c3ff6c9746aee59541fa77cbc0931d78fc8ff09d2e854414a9cf73ff8f5c60d969742a44d18b23ebad13589b7fa91af0667d528d9cfe51b0732b5d7217cbf27f1bf7bb7959934d37ebd94ea914a364902c8e974a13a357b71d8e164f4fc8b6a17377f39fcaa32495df5b91066185ad4867d9a9c60cfeeac1a826f0224bc27ef979d7aa58d6ef92672744aba4aa532237b81bc23341eb171b3c5a80cf38eeddddc6dc22c9cd87fb124856534f33de0f6b170bef85212eec2f8d176c8f6dd70f0d6d7ff6f4bbdf8ef038e31df07c200548f20c291dbec52f1f1ba20d73f02cef71562c7f459c2a0d22ed1e08908184ae8a172cbe47b65d7b08f001f10e9041c333abd099a3593c353512c89bad22550f181f8accd200469d978199a9f27047e557669dcb3823f316c98804768c7d516893c2501e912f76ecee8fae1824555a4cf6b798cc7c9c3d106a736472e969baded1867b05ee452a209a147ca022c5f893388557ca6cb3a109fd27f181339c7fad4b5a294443f3f02ab4f13175b65c1ea743743e592ba320a3e1526d000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af4c01e8243247ebd594dcab469e15831adff96751fff56900c62d9cad76817523583320c315321d6ae3832ca02078d72871fedd1f580bbbf8f5dcc25cc3b06838b020271cbe427900a96435efcecf5e6ba52bf02022106ce65b0308645af3fc3d0bfd200454da39407e7207f510e9e6c336b0209218d38650b99eca50caf9d89f8e9c97420071116a8dbf0d1fa85e7d2c3e232c2067a619d3ea4492d95433dbc79eea342e465f3d31a206b8be17b1a0c832c027060bb6bcf6fa8192d3c4cdac13d85597bdec107f30d9fae5e632b2b68402b93b648f81a1544d0323de3284f034c7c7523c35968be9f32352cfb4384668f25ee6cda9713ed6cefa63386ffe700fb28ca37221fbecb3f8ba7386ae7d98ac29a8dd083d182e6a95e840d90f44cdec25da182194be5e624567e5c2479da6994ffb5bf43fc07020826756e16d17f195dbac05b667cd1f8ebfa53326f55fa25269cde4a2a98b5aa1489f0e0ba9d86072ce690f700ae8515965fa3e77f40cfb39ac81ba53280905168c319b9981d4de4fd88c8a47fa59218188cba3b2267698b5cc0a145840fcfb6485c5f5b3be01dd7e21e42955d6b15284e536205bdd9ceeac1694481c1b030052a523dbb67cb275d37d713f926798b6be438f4427cdd47202e7bb6927cad78eb8d64c026800acb30000022800000224000002200da7753b1bb2f23ddddaaeda6ad3e186acc9fb7eab198d4290a3eead68819d6d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090c6d0a78689fad3bed3d1442830cdb80071018d86c8870871a93666ee932d42cc0c01300780ebc5423ebd0532ec85fa01d72d0b739942cbd0074b09d4ab0d7e5a19162c27f957f98451edb1a470d429ab6890add387b9c8bcd8e7fdcdc29ffbed5e8660beb6bd9ab374df7c94b6fbcda8ee99d930991b6d40a2ba81c2e42c3ccfe7ea689c5fb277d6557be2ddf1b123191af51b5a49b219c961a523a47795219f5e9460c2b1b92759addb13de383491647a69923770812c6c848d5288c3078136a7d3d913276e24ea1cfd3a23b7b683c48d94c7b9005ba4e2a14c34fa8f2860c8e2a5e47b4f45f9d62eb952eb15559606a20c66341c8c46cf5d855712ef6b3bc9da60487d48b0ceb292d2338727041e3ac1db473c19856ff33e39063c3f552b2a17cabf3e021b0f0a661d246b5e889972b2d8fafbb68165055d5a82ef40e5f23e94283b30110b25857f4be051b14679fd6c8c654cc0f6afa8699ec7e8e10f051f43fcfc5b404dc864e100410b8e69ce9d7e21daaf1e3a07f2e43e1bced2853bc0ffdf4bc368dbc3097f0914556f73a8411dd1e0d962c36f4b26da4815abc3a74a4d8e9bdb6d46bc59fcd5d60e0765a7e16041c3e556783dbd44458707755b6d000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020ab6345a2aba8b28f8b5a39f5c16d3397b6db93b3752ad1fb1355e440fd6ff471c3cc6aae7b18076160a1b1c9166c56b2bc6128b101d7743bb9cc324fd6e45ce02282e6ab0b9829d7d24cda4e943f6950b4f7bbd1a6236e2787114db383c835bd01a2fd7805f33d036b8610efab2e1c671dfd2c25191ed92c3dc784c0b97045fb80000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f5794f889695d5021895d0faffb1c61d19d3dfd42d6f34c1a93464cc2ce4c99262b8fe12c8f11d7e02913899b6e7cdcecbc0c864a56f22eb0777f9691513f2f3cd79f183ec967d829f2589302107a5247dd6e152ff39f3c4f5eaab3154b6598acb679c09a0e8386e23271215e62a7ba0d3ca783587e59304f034f904f8377cb7c63bdad4b59438d50bca03ee3332dbf7675c07356be4d6098e69763066a767eb733e5ab121b88c545ebcd7ec8e0afd5db264b039828ac779ed7f0df8a7c76607e52ded226c4c90ee7c54badb21efaccc56cf7e12e9dd3bf72d2b59aebc9d4ca0a5eb20e235e3297f0179c6aa4021dcb3468f86a0afa8b8a975826e4906ca772d725b1b059505f5d3c3a7ce506d01cbd352b30a14148693c0d67ed16e4dd3b41c16ec40d52adf9f695f92837c8c26f8b93584772e18728972cd5d0c9970bf6c814d7c338d15d854c8768900bd5766ead3a3db7afe8a6d5fcd52c4b7d12e251bc0ceb6080025ba8377f767ab6fad8c3aaf20c2f4fefaac8d230dc3d91d1d1c2f8743fc14e0921faae026fe9dd0384632ad5e8dc4cfca79cbf99358ede9403b607c53fee46ec12008ee4f30c888d69931a39b36a3a8348f7408ed20daf81ceeac09e915ce5fbdffcf5ba8931c923f2679c9da1f22725457dcb46d56c71300a793a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b37285e9bff8913c18e85a93248afba3bc5dee1ce4c5d622b2f0c85c7ad995107ae7bd8e7b26c13e69410c3ce4143be7fbccf93edc11bd180605bc32159711a48d721be009965cd90572ea0983550c61940ce44925df450026068e026f4aa0bc95b5f7afc937cf745c5eba274ec65cb7ff6c4d5db69b93007f35ff4d37f1e2a8d94807a4c149844d2a0910ccf5662d57005486945544f2e2c4849f72dc0259502ef9051fae4838ea833de7ac85fd8001aa4b4d4074902b4b16e520b20c4469631f257922e876eb09414717c5f87ca0ec3018f92dc56a139aa62ea198d2212ce9f1311d10efba4d169cd54dd52c309d570f4166e3b988b09c5959903974c459642a7baf1188796a1d1e81bd27e6a22e08d26ca077d0112637dff76b1efb3f9583b0d624499428959c12080594ab1d74718191a0cdd8676fd38994c71439bb20df31f8f45727c9800f82e2c155ba04589e84fc0453913ff3bcf8ff529ded810eace3a4c02d5e2bdf1dcedbb77bad9ea2f724a193a9a94eea4424332dbc1286dec91b2f0b8525dd39157d5e63979567121d5979e89bb0b2ad3e174c38896dc6e9b1c1d0665e2ca8f8ae878df32763a68e5b65a0ef432e29b4017a688ef1925e8c3b7b4533d1a58c671a34c4532ac7f5c793364b85e1a50871d2e6cf613436640ed0000022800000224000002201467c059cb2c7d7a6d210395406bd1dca777da228572d36f6718fad8907ee30c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000150c067e5d5a37a1d67139c581961812084d67ab70c4b48d9276d45d4436fd412c829708c8657e035eaad9d17169b15ea36c0f28474abca20df93438b4f48653c0e43e8b50e32c255ba168a9f09a2a90d9a325ea0f067829457a36008dc025ff92d65ed797c43a468f7c8e1d826c616473d1b238a9e0ac729b3a161b38ffbfc1b2c74ec245f408850d0cb1bec53b82b798215cf5374efb5b2a4c6c18c3b1965c3d9e490cc7e4b95c397a2e159246def4b2413b0845815d9f94b34978ab368d352179cdab24ba2a3eb9223bfe696b5fc621722af15e1b45a9e798a4a7894fd016e82aeeb714c37a891aedd4288a538f5115b106960b4be2c382851104d1cf9fc8fb0242b1945193851471a5fd42894de496d01c6ae31d805828d16777fcf7f165654cc6ee47bbcd0bd5bda31a52fa6bea0cd02c76e274d786dbf3450278201aa099e2615ecb85411660fcac41ffd4fd1f5dc17ef35a2a5df36d6afbbe4502150b0d4933e1b77900d37e84934a1a70c1eb79efc851b675e5e855714cac87b2cf58285a3016ed7681bb1d36a9013b08d72c2ba7d187aed93fcad2f06ebef851b3f41f5c0c3b9cdc0aad79eb821d05802d706d68b61e9c9548f345530dc29aaf0bb7000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80220fa7dc05b4ee75a33b78e43284dfa4c18ae634c98cc2deb0b75eb401fc0d19528504e7b8cace0acc90aa3a06cfc2f8786674d623eb750d77ec951239cdadd5c022a156dd01b11d9abca3169d6231ab695418445504c71511f2dd226e3766bf1cf19417d04cffbb5c87544199787848206595383f4fe09fe6ab3f056c4cd1c45360000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000acd960fd5bbe61597b8dc8808fbe98d5ccddb7ee76b0de4439078e2a07ea770ea793ae1aea7a6df7ed5a2bd1374ad539a98562241c45b29f0b1a8c4d798cd108d29dd83a4b9e0d3d2a6b8348c7696efb034f86f186445873512ccc745bbd6e56d0bab45dd0c2dbde545546a6402159ff04003e7a46328f55f043bebf718f6c3c925e89ebb048e7aec260de8a5d35b64caab3dacccf0cdafd482190b5cdff5ba20d6b4d1af9c8f09e39c2603839466bda485d02522f08bda4573a8fad3a3c8b8e22cf5a4943824e92f1c3665d7f15f4a6f14fd9c34fcb87780b77d04c26d880bc970c259c6fdb04354c3eb9754ed2c0c2cb76c58631847e9799198a263ba2caf7c9e50556de29ecc5f0e77a6c682f9b65ae59e57c214b89403299a9117ce74ccc475c10cb0732bd5f60b621581e3907a7392c17563aa145e7850d83f624a5f9db6075f2a0712f4f59ddafd6a58282387340c11d15bb4549d74bc66f328f81e45eaf489fee0c4dd56c5a3316cb4aa855b0d5864365260062f297379bbc405483cb4291db534ea08dff540a82f3e0e355fc453ac2ab59cdd38dd8c40ea437b471ea5cad80c63c8dd1f6a417eb528783f9ed6ad3c1fde24d5a1e1f93d5683448aa06a02d9f30748048b7d228d715555eec51bfb58d0452a73920424e2d999927b970000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039f101c48364e6b0e3a18ddbae7775e839f642a4b4e3778fdd566cccaa843d3524a89aabdd1ded633153e817b6b8b8913801bced666d5cd4eac30bc35341ef2ea5aef45f43d923746f39dce6e804a2a290ae9396073a206064a7426b67043f15448e1a0e5899e13649756874bb82b42b88bb8000d36dcc7334087bb0b91c7a27e9365fc8d3a664bb90210fa969ab41f0e348900426b4f6bae75d15e9d4f17923640c038f75e7964317bb2502c18a771d45aabbe24c96bf757da1b00f0b580a8ac9f8e9512536e4c2ecd16818f67f42ff3d362846a53686627454fcab6b6134da14d92d4c20dfbd29d39807ea0eee0477829842c135c7e81009e2bd76e5fd0ebe84e98c4b0d753053187d8c491c11686eaa32fba1cb2d90ffa3fb8a0796eead2e00ffe32ca4c58a6a82f8b5eb74a987c5072a57479e4dea8b229a9211687b0396a18c307f391d6350a4c39652f5688c260ec8fea456d135a433371eaa53222030f7369604a65049ee5d131c434086f5a9f69862ac35760f443192ccfb5c5604d54f0311a9ce6cf7a139f144da2c2a629cfb777ea89766f1a7065ea6856a59f6d580c22c9323b846b2fd619ce861811c96817d5cb8c5c66fcb5e9d1bdaf274bc949bb6c58d13ad1f824acef43d06a8c8627764145a88df86b2c3bb6d4ccc54588000002280000022400000220013d54baa2f9ff7d1f18d910dfd28a21382a11c938a565d0e3c17c328d3b46750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082ba40338d74bcf0eb881780832a1ff391771e2dbcfebb5614cf661b7db1909e7c88a491ab8975035590cb15113e7ad35322b863caaffc0043b4a3a4e74ee33f0d75df7233133a4f1e68e06ca75a075bb933fc9e503adb78ac1a28aea266daa54c921c865455affba32ef6d70bb26892e841c2a4dc674c01602c98388d8dbf49365eb0fc56b0e64334b9191f519ba8f51390397185e60920e72fc61da5afe9fd775cec3a7d13e66587df4f42618f88d105b6abdd2a87173bb86a322293b688cd91b7a4b263aef2beb1a908afd3966de05f522b11872ef45d73878e2c0ec59e7eed3ef65175f00835b9a0f332fcf64396d0aa7698d9d90070b5aa65152a292646c3040e3b7219afe4847860d65d691032123df8cf0cb19ec948f37c7bfe1b6bd98e0bb3ac452463129cb31022063a4aee9f75a6e815146e36fc201eebb435eb1b1fdade7ee1c93831ff1e73d1e22859e608cdcfe030054399afebef5783147c6e45e8b5438333834bb37979230ae88887372285659aab4d707cc127876eb6dccb778ca5a6b421905e10096f006d1ca2e111dd660cac74cefd00653a188b91d54a759ebc5f7793cbdef620a3d603ded08a0c8ff4c8919618a941841ab192891ad5000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80218c701e3c0a3895bbf3f2cd5559c9ec39549fa28b369a9acedfd013e313c4ac80589444f0e452a235a3c2f3a7b42ad88f1c969f7139c47eacfa9a15e4282583b022a1626aebddfc8bd2f2b18dc140d1debeb07989bae80561a6d00281cbd8e29be0d4e56d46afbad830e823ea5b211d01b39938567fd2e32f1de904e91bebee9850000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d2875c45e155d74a7038db9874521d96a4efb6dd5da7929901f467acf09ac847aa2f2864bf11ab0ff24ae1327fd3dbb1edeaa20223f1c7af7dd43b6ba8088d00f08995bfdb516a00b3e2e11a1b4905c49b4766354b2d16d256d9e0f9c0909b2f2f854e2fb9bce3f1ae364847032c2df8b5170590e543f57aa7aa6a2a0c5b6aea02700200a122c7f2bea06f10861dccd04076426bc62954f334cb35d977373f218d4e7ebd510588db46408440569558e9352dac92d77dccf95c266595f33d4232aa44c0149a7bbe589de89ab9efcc44d353fe34737acf0852b3b3d5d706331168b57ad3eedcd8cd05c19870467b08b764af81f4b19e47bba6473eb739f581587bfba78bf887011fe73a7da104059c04a726fe24b28ebb49a4e38ae7ae15552a904046dd1560a0d260fcd4d06aa24b585ea01df78b111a6a7a2defb1df4961968de2a9829cb62b9cf610e8ea6b9c9750896710c5dc2aa1c1dac90a4e27d289c7ade54ebb9947e9483685f6de9ca52d023913baeef1aeb95b446d04e39a61b974eb66e9818b37366b1914c76f7e3d91cf2ac49976ca2ffe707bf78988867f43b85c87eb16c8af18c96eff90165e1f5477e88d6ce3dd6a9b1fd050881ab0084f73b30588b1f11f672747c55da1f9e96659b4666db517fb00845339450bb779101900000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d1424e4bf0acc7e7721245cdc82161543d0af76468c724fa36a093567151657bd67f6c63a083c4b02317be70b07b0969af3bfb34f9cdc55b29763c7ae493904594e3b2a77af333f087450413e7244afcd5106deee8381b2af65ba7fd95e1da65ccdeda6ec5af4c2f966b01c46afb0bdfd389a34c36eb371a21068db32cd89ef18552bcdfa11427a70b23f77474e84ad3630da7e10afbd1bed6d437c365fb4d998e62d06270f6cee2e8cbcff09934340f5e9b1a9fd9a34857a495a64ba47cd506d2f7c5c846d0b1ae7c5658dff38a3e40f0f68c63a71da681b35f0199077e00b3b78c151ba2c71037df45d5eafbd58b58a63dcae40ee1f57751d62d564b0d472c724e4e149c4f80206a9defc0210f1d6fb56926f9da9526f8ea1c318400b67726b54226d8894a9dfd39a5fbb88cded94cc561d4e5e80a32a792e4d0b49de652d92e4c0328c27661efd403f7119f513ac5243d7225e90a97bdbe95dc3b85d791c4491844f10facc51c1040fc9346f80721f90791346b5a905e41b23c928f6b5607618574bb0b28f63bb6a60f271b9e5ea58392ccd647122d4bb5573373d2423f7ba7fbea7e07bf393ed0a28b5dea0d2e2def763865c0f9f62aa5bf371ef7d9fbe752421978628c6345e0234a72d4c65f08f297e70e1fffcf380d4ff5be258dcf0000022800000224000002202981be06cc129f3a936e7b5cea168f92bf6701148c455488d6cdcc10c8176e6c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cc5f13f55f979f4824be2074edb3df06b4f63e3b0b7a7bb7c7becc83424fbf5479cd7f5c184f30d2c487f21b925230d2a12f4eb85972088f627d365b1ed9fab552e32a3414adbd83e35e5ae6f72e7795a011551b1f3aeb9dc095aff056077ff77f51cccf5da68a3881e80afa4f293bead3ffe75a256ff2cfbe9860a4f50bb8253c8b4697d095804d4b624e30d7b0c7fa92b5db8f48d07700a81d05e1ab8ea8f5cdbe92c97b073af5ff2fa5f1cb775bb0f2b06deb29b863c96e7a15ae40d3653362ca085a5cf10cb4daf1ba853c294982d004643fd6864d3d15c820c0db1dd74edcc76933ad47ce587bb37c751a9ec2fe79a05e6bb4ac18c458fdceba09d237e804719f4c114afd69ca205e6a6d62b933cf36775145a71c40158325358a8498737b2124cc542e4d78aa0ae8ad59a21f7140b3389f63f9f88681e9c76939ac01a5e4b0e1b45ff52d4ce3918a9d919548aef11ee355ffb537fcfed5e8be3351913db59e115ae2be8827214b1f3934d300ffc5a91077ede22358a4572e7279873ce5f4afbab023c490d4939dd580066d0d5e78db7d5ad982bc7c96f5bd89e42ef0ca4e633070752a1623c17824808437f8fc69578fda2f41282befc2624c5fe83fa000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022aa5f0ac256b17cda8b507815cb6435d74358812c51f945744f59070d33c62570ebaf770448583e8d02fad5bec3a6ab97c698af06f410905fc39c3a703ded31f022aabbd65ec7b95932324422fe5cc5db80207cbe8201615b8b815b7f1eb8de30e26a745f9506afdab8a7e833f4701d79f3e3ee0cdfcd2ad758a5e3264e2b517c60000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064e8e049b2163235ee4286d0a6e2ec9f6a8ec342618171760b9a986dfb49f271e87665ea4423c30b616bf3c7a1c2b24c878f61270393d552c555d4c04bde8aab2b88014fd450ecc4e2a771610629ab098aa204f0f71b739a1c1193129f16958fc66750b10d3541f8e0a9d1cd0b1c844bcb5a5fc53a5b2580a55ff891a1fb3eb565ae89e5a1bbbf21be634401765f4653d1c78268943c683db6051efafdfd09ad763d52b34d308dc96aca18256d6126f4e412ddbf3dc78be20c9619205f359a2cf754aa3aa86ab0e6b0a04b73c882adde2efaeaf884150d62991386592e0422d5873f3347584d14602fac55a832841972de28f2dc862b45357ddb19b65582cedd3c61c4e7f39f68259b2ced6c00093345c00fa70addb288f94743ca75363763a31e26472c636ead10d1ccaffcbae0bfa4e467b70fc07a78bb47384d843c740358b96571fec58696f9fb9ec21f863c5515c0390f7beaa6051a19eacb246c64e08ff66cdd1cc670e56e6a230f00001eaca522467e0b01b8fa8fb1895958109dc8955efb1c6bfc412c203875b0cd052dcfba30cee0a99f3282a1a28ea10d093deac65f67a894653445e9448af9bccbf2dd703721659ff331638221b5cd66b376cd60d4940d73899f875a80814ac604b06ad4b0cc11b2982dc527077074b16f1000400000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087ad56a254222731ad73c13e008e299b0ee551917084ede254beff8b19a84a934caae4067884ef431d0cd8fa382952ddab1772636dc88c0032ee48cbaaec5950d37f263f85a9a65ebb731342c2235c14e5d1a451aec0cdd44325c669110feb42ae045888615d79dedf64b99772c497c57b3b684dd7531cab158cab398d2fe2b09349fccb7ef8dcdb6310bc76cc8f6f128fefc1c01074a82f967f89b271acb82b7092496467ca44b967843d961b348397b11659a4c7fd70faa7ec90da9cb2e66f7112fc17a2e78293ecdb136305795a801bb7aee9eaa5e86e174ab0b5e12e1c1ad1cd392ee957fd255fa10e495aa77e7809210a2a400fb1c4e74b646139dc9fe667b4c8681751a9ea6d4dc81c58c4a1fe6616c00313a4fa4e64fd3c9acc1caa146498e42d9df93a945e7959822cabb42c560c945e272f0a448bc3eedc7b8d9e02e94d8852904f2e27adc451d0ad7e03c624260748930683c5cac690288596c4750344a61f2457443fa3ab26a7a1dfa09ac49cb788cb632223eeb07ee46a76befda14ffa123482471221bf85f41c2072d6676e5d52c5a72eb81b8c0ce590e216174c526fabc7818460884b0d3183f7d0586b9e309c3a05b74f2467e7e5001e9d7ed1393bd3a3913eb678f11a0f924d1a9caa80b75e33f7ed2693ef6f6fbfe61b3f0000022800000224000002201d568cd9420c1912dd2ae9ae9f8c7ab610670400c213c3c238150cfc84f92bf60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084196dec6755bf35c2cd3024e18f16f21ed87bd5c20b50fb373e1c04d3aa4c2b17215aae2c5f4b6d6b9bf7d7d6b37ce6c5e3b61eb4d811e10d205add43c450fc1a5d9b369f12fa39226946b4dee165e47cefd673e7e6a092e64731c32737a9063774f051ca8669d7fc427dab75b6dffb397953e4fb4fac8c83f5cfdeae0f0b33b039975a4e27e8b4132cf3219c935e3e768f06d540021936f355dda7e1ca2db79f54fe83d481adda28f04bdb0aea805475c28b1b83987af2271eb629e752159079d32bcc9856ab7ac16e1dc5976b29684f656b8aa3b2e58fa917d6c7ade24b5c762ac93afe2f6f4ce77188957d910be3bda791d95dc58fd015f839fc7db4795bf340d409fc45adf4b9a82765220e45b295b34dfb6ca20568a57e81aefc4bad3bfbd4a984e654168ec3d99b3cb3b4e0004f7da84b72fb30e84a9833e2cb31a136fbbfc8e66f53a2f27ddce4b36dc9ffd45fa33b7b54b1c79201151d2f150b9e664ba1065408c8a8ad2da0bcd61a8d5241e177f1d52a99bf608db40e1abd366b65db00cdf4559d2ab285c4e60f3569177b5f1c4d827dc8bd8916832f88d235065e3ec29f7f2e9bab9e14928da80a0e81452d1d79131215508b7b33e3eae3ed2e7d000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021d6fdc9eae3391be1e2ac6b8fbdddc6816b8e4bf2c5ce2e1c987978716fc25a328290043457978ca15cf95164a1c6117fe20ace588b39c6527e1994f67d337ad022ab73f16d98d3bb7f37283e87f1e7c0457620b783a77b01f9d9514e47fffecbb06af88add346c7c8ff56af5c2c204fc9b8092ada96ef9321f23c0530de9a315a0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000908bd5c30f663578879d5492128fe81f17a662622ba3a7342ff5e990d994ee45dc2926f8dcc79fdbec1f62dc29a58590b65eee9adec3aadee53053d9aa265cf36a59ae9ef851da9cd33e2e8ce5f1413ad3034372eb735ded6d10fb5faad183fe87a3f6c25256c3462af75fd9df167ddd977da146c48fddc5d2f9137862e2ce41470fef097e0618c5105c6b4f346c10df50c539fe54ac4868d91af0ab57845267b2cbd3108c030ac6497ae2625c868495997e0ecf9ae1261ea0ee1ce4cbd5343855486f7a50f9157c948a847f1778fd046ba18211947ce05b887a56ac7dd4a03a9960fd51eb48f9fffed32bf536a7c71ea3f439baa52acce3ee734bede4ff3e0883d3166b525eca4c877328be245c01c7ea73c1e98750be2de3c0e728ee8e54a9736b960f4b2ad517849c3c2925871a65138e4ec4f404224d946c3a22e8efdaaf2c909acdcf6644364c20eb8caaa4f580889cd585fa931169678252dcb960f6abc37740823b3d0809678f7580b2d22aa003066e3d28cea58f6108fec6842da472c23ebb812245b3a4f3bc51b657bb9aad5ef692d6500c1c06ea3f3a7df8a2a4ecce543e1088342d8b48048fc03ba30afe089567999198f949105237c18c8409539ee4a537c1473e34dddc265d6c43f2a6c20c8fe6442fe03ff0ee4594d5a15ab30000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001559ba22cef281344684ae7ef4d28eaf8e4d383767d38dda6acf4c26cf2c826c7f77496b0c5151d2098924661f5ce3d689f73b4aabd51bcf3bd2bcc77307842074d0e57286b157222348f229085eb4d1828f3abf95ea0a5963cb4f9f366be116e961142ded2101254cf86c5c6d0eac867ee18d7052800878fa062ab5f6a95720d4b6b0f41182d4c464bbcddef0a0ec17016ba35f3518057e536686a9addf7b6d4e645f5fb18d9202946951ff1bb5ba17c5f60254a361e3f0caa3776e857109140597c7af0dd98fcc73437b3229bcaf9c07cdf37fde93966fc6542e2bacc933a1c623dc9b396a449b65f1831d1bfbb4f0491b65e012dc92641ee1ecfcb39a951adab50be652c86d5c0b3a0a73cb3ac592172b89d7d011240d757a37f94c6b1cbece3ba3be8cb2295146638561a348eb20d1e920240184a96edb4e1393e6707c9d6e328b3d76bcefa0e34d733fe24567660ff542172566dffa84c29b64a0709c5b987da8cb80dddb49796ab3ba7c197fa78cea0791da1ae399791dd3837b5d554a52afca236616778334686cd3b79cba2b5afcdade78b54fe49ac73b004d9b0bab9cea800ddb3387422cdf144be43a2fd3ae70839ab24af9e5847c6dd9bffbcd4f543278f8ac5aec960f3d9ccd71dc341168fe967d3aef7f52531d84bce1ac2d020000022800000224000002201f16632b347897a02f611bf646a9017e10309a17af5419eac19957281a2424e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002dded63673018341168e95787fc3cfa65db3300639b59cbbbde719a2a86c952de919467dc47e82de567c42f790dcc806201814b0fdbcb499da3d37d90d4cfa38bdb1f3817ce3b534d9e939beb2f69739f2ca65a8b18dcb1fe5ab8c8285526053ee13cd2c8c76774a57983ea0c3fe4e4fecad3e9c901db44af1835bc37283ea2c015377370f37f8ccf0db6b653234c81207eba1236771f2d31092f198be63dfd1757e127cc90e33ffb96a6adcdd342cf1bb4d0a22ac96e6eb126f2c851172c9744dd4742891467b9a5a8f9b09a627a6fd7588a8763a3c7d93bbbb2b46bfee8e099a0419f3f3dc85eac258668a1372aeb031326537fd4048c58612647f7397b7835923d7afcb31bab5fe713faacc8c87f30f9a3b58094179d3d41d080e5b78ce3f5cc5c7bf126b36e1d504196f49f0dccd02e4434ba2a4488c31179533af4aba85643355aceaac9de24ec36371cb09339ebc85cc3ebd82cb759917d0ef9ad73e7d19c3e838527c9140df52181c29fd3879c3c39b41367cfd48be3a8a9131b273696bb86920c10e177825197202f3d8977384fc6067381daaaa97b39c3d86af50fb1892093e0a7013446451c6d04d4ed854ba5cb7f60cd4d908b1d7f7f3b07e4649000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021ae68dc5ca5f22871487346e7d9d4e570224de8cc65f5e1b2823722ffe6fee4a28d3409af09a97106fc358651f0b2a101836bfda3e1da707f87f9512d3e8a936022dd10e5d8376ac8db77e6c1bbc1b63e5507da5bade40f97a5305897a90976b7c1ddc5e2ffa20e2e7b2ec246379bb17966a91ea3ae99236cca057443718dc3de80000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099d3907a3ff6eeb04d04f947d59cac38172181f83f46139ff34dc9ac28fa31ba0a7ab46a47d0c7627bd94ea1d475368d9aaa2b226b13d58a064267d75c0a1629e736eb57da3897fa9d1da5a8398d9f305fab2cdaef41379357fb8ba2aebe42d59db66a11bcdbfaea027e79ff9e1d39dc949b9cc215860844fbae5b9f0c9e2ad94cc2716d135f384ff41bf89ded3b323a1a480b61c19993e4664555db42540b65384e11613a936d50a5fe2466241707e8e34eb1131dc179dd4205d6081bdef4d7549fbdc3123f5fbf23f1f8627d1a706dd26199925c2bfb1249a2875cdeed5a13cde338dadc580a00e63c95f6aa6500d82a38b8cebe69695ae38a8a307051659404e743edf3b9857d2552e9718ce4a38c87335f31da9b971f5539fad299dc5a0414d5db489339478ff83af34e9b53ba459fa65fe56fdf1e53e55fb9290e19d97665cb1b79eb6cfc727cd0ecfab96085af11d48b033ca0fa5d2af0d03fdac919987aacfb2fbd5cacaf26cc791b2e18f8df3fa04ee0d81441276d6213de041e6a5b27b026ab744f05269bdee945d1c95e800c136ec5531a0771d345ecf70a116406e65765f5ddc0def0b4c54464e5764b03f15f5dc377ac2715cf6676c7390f88340dab7b2311a15dc671c59bba660dd87a22b48fd650dc2444a7689c0a9ad1a6e800000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080a328dde2827976261820bb288c85d1ad93900297ee2d81e2f532760836c40c53a854e17cce1ca96414cf79d99555290eec1832ba91a4eceabb501db488b47a1d3912915faa2301eac17d8709359a012864373bb42be2b3a4b02c1e655866fe23a2cfa36e625b723a35fe95a00e8f48ad28c078736c8874ae8200d5be251ed8b046dfbd05078a5d6f606d0ee02028033c63efa962d53e342fa57e591280726d867aa2433c9a1e163fddb6435b6b7db1ca9cb0ada54b796b6e3802dcc8822285679e52e808afde3d8676e18051afbbdce255ecbadb7e60135c397e3168a3a4f0b8b7e9a3480592caa5eb1c0181756ef7d9b255bc0a246ada80db259a2712feab6448862be8d6d09bc8a57bc545a7fa720dd09fb1c06a043155a79ac2d125b8d3e40067b3f3c80d474a45372d3ad9404091b718dba71975d5383bdce9f4920d484d065019dc10fd3d32b18995110280fb4e614f2f6f0a2879678b719b84e6282c1dbceb3edc1c343a469b7a311ad2cce84fd2e8024f2fed7eacdbf6b4ffdbf3fef33691db095c2ff8ba5a11db2a265d23d8a3d885d9564625411291d98ad85b49d2acd56912ff7290c58d57c5ba45b57701802f25573c0e83ff2e16c33f0422928efdbf92e4093b53bd388f6c652bb3aedf15abd20bc75625e1f384ea97f9a63a0000022800000224000002201473d918356628ff40888b73fc58975bd7ef16e47746ac2727e0bb8061cd78ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b73309b62aa158119a44295ae9d607286998d2a62fca0d4bc2b33a14efd1cbc4c133ede3a042e9d8b61ec7ae9d4ad9b878525fa6505be385bc9eae8c484fb0549723775268f8188fb37479fd2541fd4a337591b96406160506609473c7a80343748db9de7b9132dd7ef52e69709a877ce8cacc5062a13ffd3aec642c453c744848567def704b4cc53d78b9997617f90d0624c2c40fc37dd55287d0df33f0b1a01622097f93d272e0ec81a6bb7d97a4f2bbeb9db0c0ecc6ca94f62fedc21526828690936320f7e83f75b9fc23f6fb302175b89be79dc390051d40f39546ed60e397b2d2d0bb718bfbe1040427e8366fdf9020a0730125728c9aeb7caf5b96f911c21d654744a6950ab628be7ce65dbaad4f3ea9e1934f253741d766ba9ba24168cf23f24c9dc1baee8a3951ec0750a285a546b3579c6b8d5b773a3459814228409feda719b31f11d134b82002e7202f1ade895098e2bd4def6df0eb91568109369a13020afe54bef7a85e82c453d9f09066a8b1e7e5e1a8c3007a0fca6793f937cd5d6844cba8ae5746387b1b20536768de9e83ea004f5d47d84a90c1094aafdee4916b2f63d5ef6a515ce59d966892e68098d259e4d1d00544f1173eee861d000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022c8b159427fe6c17475efa6e19745afa2ebcbfdb6c75a9c74394f3461d593e4012e11f8fdf1530082d0b9bc7fc8a7cc8e6cde7a6312f0f1a659fb63cc4f6a520022e463c3632b997dde5daf76de5354505e9db01592c0afae067d60cc312b930dc16c4e0290946334ea7990c5e13fd65631b10bb90cb730a84e5ce5aefdb847aa60000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009bdcede5633f9021e257978ff3b766ce8da6cc19bba4dfe2d8cca782255c9f8e1948f68bfe76f4e9ccd3f473845d6ded4dc19a29db85f724066742105eeeda2e0e934020c3f505e3532bc58e8a55c09b892f9d58b1a6247dc893e8d940a339aab630c7994d55c14e0844d1692e65073c8675d3f0bf5b827acbf1dcde100e0a469edaf87a212e205fb25b5cd6996a1776a87307db869c68fae32f098442fefc7049f592f5b567392f61deb627719388fdab65a5f53a26237a811fc417284432d81be5b0ca18458c831444eda02c45bb4e4c37a6930bf2de10bd47b7320e7a12c167b8634bdeafe3c23d7faa967cafdbb1240b3620df10659a3a5354a2eb6555bedc322b4c2dcaf243419c477ee0f1d89799900c911cd9c0a4432780697e28f1675d44c2766a08ed14cda25c4224f1daddd0b28f7e9a225972a64ccb146ecee0957cd52e96d4e2e144055ce3af6eb06ebfba7eea7c2da60c2ff2366becc9eaaa664763d2d9899fe437eec244ccbcf12b47f605ea21453fb34fafecc66d4cfeb52fbdebabae31dc7d09ff8ddfb27c563587ff225c2a149628af5b431bd2f73dd589f00785422c0531798b07d335784213aa002f7e3bbf021d31a0dae20639d1cfa4988820ba7ee73fac7ab7d284876c1bdbe3d09feb1b6ef1101064f3f4e168ca1200000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086a5af0877ee841c0b3f65a3d260c43edcc390682a833db060dc1e4b1d64465e29d269ac9865b198f60d0ccc37650e931f82609c63131b9902201f562ebd0783a6e4b45a60bcc0374f38982df4b3b65019c3f9f4bd04cd94120e7f5ceee54c5b69e3f03169a1f919f896c3dea40b77c5cfd67ec50c0bf7b55d6d662849110e8ab6e629c49a6140be0935bf336c2a1ee88c4252538d83441895031975b5a4dde67fe3517a2451181e7eb416efd94150af442eede7d675600140ae74e58d8732a2689e1e583be454332e35e6f202b9ffb7f872d38cd48fa959ded4f1835788c365938e6b34fdae3edf41e5a3e1b75e8fb040fe89ea99a3c200ec8bb9719e5e8002f6bfa3f75fd229383d873f1e2cb42780cbe4d4ea436b1bc98cf90fd243355b4bf5c53877b749690ed9b56f95af69b36e58bf6db012d56de3770aaf012d42f81d7b4ba2fbcbbb91051f1fa0d215ea54aa38055913c72e51cc9c7337604a7d92dc79bda7b156089d10cca9c54e9a4e985c5781e3d61747aafc32b706c27b937bdceca6d713d112b0436b8336bb9415adf86dd71b6961b1798bbdd1b29d6fa45addb2659dc0f8d490fb4ef57c63a68dbcff2227ccb41c32aa5bdf9c4d60a6968a0b40bd3972304778f1d8a4423e05d6906d5d095f3f041e218fdd47036dc71b515f0000022800000224000002201fcb265d5480bd065bc28aeabc782998b7b4e8cbe86e38e775c3f996fc0cdbb300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a87c2e68f9203b1d50d1915896a70703d941b5d85ce0095d10ec2f9d2417d90241d3521ba0f76e2cdb6dc992807ef81dc6c0947645d1d90c70099610bafcbf9614d18fd5fb15ec95eeea92c65a2a35cfe1f85018c70395fbec77b49edb9706aefa0c5e4b3cb230cfcde8d6339b2775b52d2c698876daf67479c4563d4754724f6dcd528b912ca501ba547519668baddc5c61dd377cb34e370a3feee24b2da6f69d0d11197a91d288c9f304c889df488b3674f67712ff85386bf5fa88ec3168707e33cd0f9b6dd6473ff59b689606e5dfb3c0fcc9361ca1249816491f6c5eb44d81bf5613a67a0d83e5d44e1e5aca9ff17786e20fbc0f63471bb07344ed35ac684490e3175a58ba6aff4f54cb06d676a3cf591b17bdaeed8e17c08df8003ed414f26deab9bfc1868561cc118503d5b526385922102052f287d31cfeca058532b571a0fd764a9d8c96bf9689052b37099ca840367de28e564a70a33494bdaa23197223ad2069ddb3fac2c8898e6bbd0503aac6c16af64ae40e412b69c00f73c9516471cfdb8ae51c05295557ed86324f0e878fe6ce3654187775792a14f37ba446c810803942830a7e10e8f4ad75ef18304a98b8ee99e9af12cdb01e2116092f2d000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802094f1b239d6be38b6518bb1f15a557e24dbaa24f842b1e37f3381fda30402c190de9c5c3220d1b618b76d9bc86e9f87a56fcf31e9a5f20ecffb2b534d1f0fce1022f3294f631ea029e7eda0100235cfdf4941e41c5f35ca9ee9a741eb24984862c0d2036b1d414b83482e0c2804f1fb6874be0b63d410edfa3bba0bb8c0dd39cb80000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e030cbd3a10d4b6503e26f8c8c4cdf3e673867a17b665de8b6b9943e944307bee905cbfb20de47a3034495fea7a0ca6b4d5b3440ebfb6f96f90721d170d3956fa99df73d402dcafecc813382f2fb7b691a4244d999680756deabe27872356d1eeeec9a22aa90551131eaf661326cc1b7bb0d92c2a3917e53f5905e1c86319f8b554da940fb83d5091754ede91bbaf4a719faf3ff38891ebda9c833195a66289da664afe8f10808555aa3f02f58633be521aa889fc2384572085225893084de289d5e6634c32517211beb606d61b8737714f008699076f3754677bcd168b9f4c2ed1378479463548b7e5aad33e2aa1c926e317cea269f5defa2f77b94f8af1e7b2ac9fed680c2ae7b8ecb60d48848901218f39e8449ebb29d7ae941f466a7c9b3060df16e4f1184ee1f05f4eb5ce383883c9c3872166ad2e14fd48efb53733dd3b0e63697ebeb4df64b53ce5d6abb594ba0f8680773d39fbf0c769e18d13fe6df5d320196851499c765039b6a0714d846da3601534d4bd41a27279d25f8267373184b53ea1499a3377dc0b2b23062488b185d7dd88a4550d53cb7e989f432fcc65cd6cd9a24d33242c8ad897e03a9737cd9473d40beebfa4c22fdb397a5da4c7205e0333706605663012ac215cb73a2b36152821f2c05d7fb2c2fba698f79365000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000969c0c2373d57a1a5ca202bfc801c6a8fedc19f95283e17f1b7a2480a9569c1ca90ebbc6a16a3a43ac9d2d85361247408b8b0eb35ff5787912d5072ebb3c7c0856a8785150318c4c97806d81b29cde957e6adf394afaea7ff5cb31f9c54573184b011139ecdaa03332b1ed304b8078ecf386664ca794234412e5e564b825cbc7726dbde9f5d40e574807eeb3027590591e3f938f8589749bba8264e323c2008a966e8359f21a76645fa9e3e8b7efb53e02b5fd0e32372d7889e6761c6fdfc923cbfbcf7062884a1bb1f5592cec86cf5e4968c0bc057b8dec626586932544dd55d305c21e939b09d78bf9290ff9b1c460f78234f8dc407ab4540e35fcbec1a701d095a6cec8e5ece577d678f6b51c65c4d87a0f2c4e4439fa5f816feed88612749b52afd5d1bb9944c9170da357cdf38d451cca2b5e673b0b5f061c7b1f7699371a46e59527bc0423236429f2db10359a5f6749fb7eabf68b98581a89641da9bc73611f8f4d370a58a8636139ea4b4fea3ee23403780b877b83e8f027def41aa4bef327e289eaf2c13128429fd82b2d9d17a5ac14e9430d771e759ca23bf4bd04f0f95ad1eb962854a5605c5272ec74a5fa0107fe0cd3f0a1ec0c0a27362e0aa3bf7db4508e0e41ad751683fa5a19a537d48f3217ec5d1ffcdf82084a6e78226d000002280000022400000220022560d442e71ff1789173397e002c3c7aef4748ec8c30441ace0053b3296c79000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000939190e8e569c4d58e250b06a24256751f29df04e2eee66b6e7c451d2c55a4497001d0c385a7bd7951eb17f54de2292d88084036d5a27dcf70e584563bb1016deb47a381802eea18bc9b89a6704fe6c4254cf9d0b7ced529ce955e950399c634a6964ebf68d2cd9cf0b8289a1fb2fbe55ae306941a19590e2785b7b1b6a34834f462da84ab693b2800c320086a414d786f84d8637ef7ffad2679a55c642670da0e7b4c2ebda77bfa0b3db337fe89ca1fff55dc1f36f80ad999ad7b5b03df0edf18dfa1edbfce6a27f9142a85b3164fb396325608ea2b4a040ab97ecf9873e260217cd4ad547f8427052a8aca9b11e1d4a755229dd593d39afa62540888f9ba8b6436a7f322b5138f9b3bbaaa96b5dc8c4b54a25f6208d5f0b33b845e13abf77831f0c9339443a47dfc8d41fc01e3ae26d7923a9eb3d48409d8ab4620445df9ff91cf4e0ef0c1dcfe360fc0931ce0a8eeb2041717800426d0aa29e429e6f0178b947d92d72250ce23f0d3047df6a867213859eafd33da7c127afcd7290d31a216180c1d4f0673a2b7e8f5d3d3d9ab79f72adba5e6361b9c5e550541f5658504e948ac0c44dea600aec1fe42af7fb94f25bbb7fbf4a8e728bd78c765a5c7e5196000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020e8f893f7472cec73553bc617c6f6da71825994e1ffa8810c9f34b776c1283600969f2c691e8f068bcc2b2db41c9cd21280a63cc9bfd01a0fbe44556d37babf7022f7af29c6ed44537ff0ac2e620c153015434c50131512dfa46a676a4a8f1ae5b238995d65dfbde079e31ced57b529fd2aac88547262e0cf3fccf58b24a3182d40000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009662b44b8142a6435e6657d3baa8ccc16151ee374c15c3d8c2e784482592e3e5310e50ca919e3f68880cd66d9d82494dff4e053ca874481a72dc6fa2436575397c0e991fb0dc41ab8862533cd1b41d637039b3a2eb47b343e6b1eb0f0f101b075627fe8ab6485d61aec0c5795814a9331fc6a67858e622989fc8a1e47b67e2b902d8d622ac752b0031e81562a9b81fd5081d40f4325dec0ba1552c17b2ea76d7968e8c795f8a2e08472eeed1e9bafc50076a81ee11ba18def57d5d1b1ec4663dabc20b81988b58a171471209929deb1e55b0af2fb5c48ceb5d7d682a07968117907de6b20e48536156f23f527e6e1a88fca1d8b355f3b55a0fa4b3a0b86a7f7d993070938c016bcbbf17d6bdd2603424b6d7a400a4334af473f331d8b546dd88d99549f50cbc0b4193cf5cd5baa2b64604d5024a9c409e4ecc356afb1d30fbc297e799ce42a422c0a04cba19051e84fb4813f04d81bd02838e3ad32553266e03ef489bd75e998114c91655b3bf389869466f33af80c70757d3e996ae692a3a908df7ba962cfd1fa5aff436e7527a35eb50a1b51d677a2ab88471dbb9afd2cdceb6fc89615d867fa17b13072d884447f382df18e2dc780746927112e88ac2524aa5c0f1d7c49f5b6329dd50c511330dfa0ba9658d6a5e37ef4521180398ab648c0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bdb65d460e6124ee9613dc96be95438eb7ca591b719e96cdeae058ab5feb3ef6901c2d914f90e1ce6d2311068368d63734b8f6180b83deeed0c3d5da85c66d5c34c52e15c86b32834822eb32c519013eea8e2d4508e591411321d2246da4b2fb40ad2deffb885df26033662d4be8466caeb82f87fb3e99b668b976f078358e0d8f58108743d05539bdb7f29c7094ede826235acad33d33773b0830691abcfb8de41d31d4738d4e19b025ded9d2ebb069789414670258297c7cbd02b4b43419cff8d31d743e38fa61d0e9e7d0ab2c9829a183f880b7b0164f05cb3c19ccc2c99144ec045b1cfaf6f7c110d3827edfff49e345feae9be71a2d5fe79060745ba4299f59457f51919c3f2e07899a831d2c3335bf2a5ccffe1ca001c2a09d57c5d06ab037b306a4b6118a01835e0b92e55371ab5ee4b81ab046ccc7ee3b9ce37ce7bb5ca34cb3e4e1cd92517a7b6b71010497a289afbed1c2aa75617be22a410675f2b0c6533bcb436b7d478fd477d997cd9231ed5d353423b3e19f40cdcf8228b35eb15ec7fa8a791d3d9f76c549a6549a73dab342dd3ba8cbb7e6c84946c1862e0655b96b85faf8fda7278636fb4538e4ceea71a81c3116dfb6b86167ef60cfa5515d6f13f7864061c955a92bf20f8b1ca45c5ac9f08c2eb6927d5f860d50535220000022800000224000002200f3ffc025492f474102136476a006d9d7d2bc03843b54c7b30c0f7df8296d2c600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000995f738e904a68a6596156c9d064fa3b6ca4c5e34e4ac2700f6f19d72ce0f28024d5333b77246268d49dc35d3786ad7b9e6dff731c6fd35f9c77a2ba950342fb8ab7577afb9030d8540b4e6cdd1663a8e1433b64b6a75344537c4fd52d5a5f92f3d35eef430c02ff1e49c211dddd7d9a67ed16b902c4555a0b422dcf1f41865ab45a832eb9dcc14d7c78f33143844ccd514cf811bbd5aaae0d31ec82439f0006def6fc8cb0404aa891eb642806bba6ef3fd673a7c0e568f7cd58f89fdfc91c2a35d45288e9a2016401c8b56f4d78e1ed5a4ac527687c084fedc7da75f4211280ebcc046ccdf01195b667795ef9d8e1fa4163f1821aec8db6671e9c42c5b7c81bced4e008109e1fb13a5c625f9c22801ed899fb95665f659b1cd8dc6ce145d0d10ab5c4c978169ab1d1abeeedb705925fce8eef205abf291b30d47f48fffd1d1d76e73ce28792ebca5bd1754624749a3625a6600851a0f1f8bb33b8c07b85dcff591dd4da278a6aece1e30f93e00a3175cc05d2959c8163cbe7f50fccabc951be29888d63139f36bb9709727abe8279ab91df8bc4a903fe5075392d9a577b1bb4129abffb3e71fc850035cc6592af9cd54b21ce36cf274799def9e2cb9413984e000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80217133f5ac46721120282835c84e3e4ea1ff5eeda2a82b4872dd5874267531be525b4a6ab03c428f10be996250515698e4b1440561b5f7a287cb9d8401789acb3022f998dc999a46148f448d4c0d6b9114a77a626db15f4c63fe27d14d3ec7be3b60a503610da7c136545a0c4876d591fca68f9e54d138b351b511e17cd1ef156200000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2cff13cc2e9ba03aeb2aeab45d60989d3c5331bfc4b9375b47a3d0705be3485a1bfdf1f81333728898f8ace4d8e274c131d28c94b55312ee310d4eb86636bef112eb4175a07fc47921c85877be86b22bd1a2bc6ea4de182b05c1e6e68031e4a7228d668b1ed040bf9be07383f4df02049945c9ec5154ff9245f2b6a9775e3ef50c8bb12d9052de42167dbacd4459b315da73c872c05ea8c379ddd3413e3ecdae91b9d1c962ef798bb4e5f9c21bee0152c73ee4fceea7ec8411d43b6bfe6313f40b0b6cd9239a696d3b76431227ecf3cea6d927c0bac8d0910cf3b5bf7b216903f36bf9f439cf67aaa993800f025961e70fe269464b49f17a25bde3bcd33b9b2f4788e5c2f8d34bc92f79bc7a6a528fde7f41bcc35e51a581e47e32f7443fe2b6b441478f53a8fab95f855da90445f20715efa76cc55cb48af0a3eb96c3feaf5c7fd36dd65ded70008d68cf970b92ecd72ebdf18bfa9767f7fb815a5d43930f0540db2edf095efe4b893c7af653484d444f13df188b4cdc047ed8ec3e73d9d3b1e5f80c22749e02ac3d426898f11d30ac6f492391957a9d75a74b1b095f151812e958c0da0bb086af745351d6060dfc3dcfeccb4a2cf0f326a5c6931c6d2aa99140b5dac6f489cd2c902ec0acbdae3b6113423acf8d36cb618d8b1d8d4f93280000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c6275cacfd890596efc4347d1f0a9b20d8c15efa7c034a3130b9130c9f7c0a00ebf8be3cfcf229ca3d804b8e0936a3ea3695cf205a7b9c2636ef33032a21217ed6a098252dc5010b7028b7a49e0231d9357f1612f3c53e6a361faeb49abfb86c7c06c7432ab3729ac2c395181ff2d4a78f2ae705e8ea53edcf9cf3e19f0c2066b2c42e0c97b876358bc00fee98706c497d7dd33007ab19a44fe4cf744d1e0432676cd21549117ef01639cde9441304f77ca34f9e64a397093f620e48b12a0fb6a91c7b5c6021a815f3723e1633e567e49e1e306a6574f6591d5aac891baeebc973eb081303c3ec3929b11bcc9e7d36990143d26cd53636b52e360be8d5b60c7ba96f2b4c0bac926d6c6c75f1a002377d95bb6bb1a8f93b4fbad59c34bb108e8e0ca75c81fb9f2ecc26f51ea8068d1ba3eb6ab31c00b7722d85f2f89dcb918fad9a6d04f86db71591a704e1bcbbf3887070b8a3509090ec749ec4c870570f3e57402b6cd6770cfbb83522c81505261a45ad233f72bea4b581813fc8110299dd685eef22bea278c766e85ed990d482f02415116c070a81a1dd62c18a4b6f098441ccd0c8750339c5b01551b99fe23c7ab10f6d2aa8e32665cf3826c202ad07689492a191acc96f9df0d49b79a18e5270b78382c7906dae226e655ab830d588e570000022800000224000002201e57f58499ed84489e4057004924b14059cd3073ffb5342eadad2018ba04a39c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b05d68cb17affdc1ad22da01db3284fd4fc085ec3c483247a39b38d939fb1ce347ce06ef5b3d52435889de6c7baea1efdd93034d6ddcfc7fb351c2046918427cbc86c3a65df33b0376f4deea06ca299c1766b8d844fdf16c0cc9b1680e84897e9483e68b807ebbbdc31e2d50f34410c46d865fae770c14d9c97e022164b5f739c95333347c5339fbf028ce36533709dd06897bb1e373ad055bae5769e19f043b4d4cfcb5aab439732ea500350cdb1b4fd39e6d252645dd341cc68051c12a9400c8beb8418ca108872a5ccd3812021f79463d8874230ba9acda88849df14cc96d7cc601da453449a9e96369e2bc483084617ae1a610265a50466131214058376139d59bda4ed84ebf64338466f40a1157052695f0657a65784b76b11fa8494ff14599b72c43347fa3a8c0355c47e435dc1641be7617653f7deb389ce2e7fd80afb229d53902ed75cc52802e51585ee5dbcfe224c7c87e3eae71ebb067ba628ece4e34eaeba470cdd4a06ea02bf93cf9d1fd26d392fd3325ada6010954c172e07433771290ccd2732b1ded047e6a53117b3977328727c882e68594840da2edef6bb2ae0269dd7a441cf107717e47e942dc624a856e587dd5d015301a7470c5dde4000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802146d2ac89dbc52ff0123aec701858a5c89095347f72076b2b3fb4e562697a9ee13fc4be7237b27407250dd24832bb5ecb7fd9ed81d93a7ca90964ae3963ed3b8022fa5b8617d49c354adefbf8ed75d4255847b0b22f4861cfc2ed33144be1d7dca16f9e407ede892881e94b6ca8e8d4a8bf51e9d1b3de6a3281bacc3dd689304680000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b22305448a5edbba5480573a6ba8a118db8c1061bce8365bdc2d3fd5960ea98516355a5abcb658a657ec91f0d37b08461b6d39c12ea96ea8c60867e73f6c0ad3c3df8d483c76c97ddfe5fac293f72ed2c6afd97ec4a67ac9dd35540491019f64b32a283f09454bbd43ab761f636eb0c51a84d5b168b90138fcbf58e6a832e62e1857a82805c80425b74bd47005dc864054175d7a786a336a87c2c27e866c05d83799a6ea6c6418ffb9a74af94a1e17d97e4466305990323dc372e5fa156a16139bb51becd2adf238667311bbf988330effb7b82f32281670d9585d8af0ae5156bcd0bcb89abce1223a21b436d0f3c79dd7fb7e01fbb7a4cd2da981afbca14c069cbd6602ec92f62fca7ecb75f915995f2eb8d39c15f47369a654b4c80595b3361283dc8464dca613e696f2cd4493461a85b5ad1cf815cfe68b5f7dd29547a1e889c8e4fb3c74e33b92958d73b2fb16273c855f828fd255044f72beefcca29c61fd60660e37be199c23a56a11c6c1a22291bc61707b7fb213be97d995b83bce2cfba7701d3ae71e46f2c468a55af6d1fff7a8c84a505ff832fc8ab434e92f090fd1b7eb8633919271a3a2e83cfe93663b9091024130b010eca3a3b45085a08ff1e2e32f19cb1e5ce4a9446ed947b1e4595b537a804ff9b7381c6c477cddaf91f0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009bf27c3d6537499e52ca91efb96a4081595e601f357764e771ecae1bb04b7fa6ef0a0f2605ea46278ebb40b8cee8e22c7d4fb0833eb5f9d136c8bf9bb21cf74a321270f89902ca95c251590158f0680d64d7342d9da660ac59e2ec5ede737078f5caa40c12c5c0ead1965ea9f61fcfe018c658418c77267a341466837bac84f9ebf42708c2b2b0021317189e5ed451c55be28560ca2482049645a720ef6df10fd4a8f6aee90f9b076184a09556cae70d1c068de8b46dc470a2a20a287b08668e4a3be6554eaee756de14057f59b563f27acdf6763b918e5196832d288b59ecf7e77d38dfa18c2aca9df3b52d8065918a36615f78d76fac07c77e23e137139ce39593b4da186b8bdb568c637296c1061586a7ddd9f4e5a009281b50c596a44158191ef41d62c3c46127acdb12ac9627cf27a7c9864596d33b978bfe1ede5b523569dd8477fa59f397dc12e0a5fbdd91c7d9d817a80a88d30c144901f047c55f1e3aab29b0aa6804f889495f06e9159f510839d072a434063cfe27ae6c94e5a981453af842c55b3375b8c5e10e321f91f06bc1fd326e78946030f179541c8ad96b76e7aa2d39435f74bbb93e8d341dcec2560e21028c96de874778b7f4ede0fce32b2c06dbc6a8ac25d8d94f46d2729efc535f79bfbae0d94b08ae4e14d76bd8a2000002280000022400000220245c0a160e5d12d5f47ef17cea9e8016dc6ffcb97fdf7ad28634c07dd8d442810000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098cf63d5be9a52cd82e1711e76c44741c0ffa108c02d4809de32b54488f0192ad7b1d17de0fc6fbc89063c7f6c020d7410445f2e759b1d3eb710f00cb4fe6d4a03c288bb17f5d109599127a480382b28c91cc9a65121b970420c2867b88bb6f224c7900425a7d89442d6242b3613092d8d642e4e2e632c119abad955efaa91d66ff2ebb85559cb967deb22f379c42071613bd4a1a878f7308ff22b3257956df2b2b21ece210f41451f64d20f46d0cd91fcf0571854bd693881d29d666bc2939c1471107f8e60d4123985d27e14ea718e14ee140164de2557a0cfc8e16678db69cd12fbc39846bd3089c5cc224be7923baf7ad9419e6bb2fe99085279cd28e7b46775d509b0c4825d2004ad573ce8cbef3044d66d0092caa83927267e073d557747c652b5d0b5bebe70c75247e7748611883768fc78a5eaaea5937a27d1a1951d27c9fff35c6a2ce1c3ae020aedf6f6a3645617e1d9864616b6e990d75a2399a7ce20269f3f56c07e6af851304b63e6896d61d6a6612f1871f969e3f497f4a981cd8822c2d92e461bb3963a9cce5f74351a714eae8dcd773c2eea1b01f9c883003bd7fd14f9131eb471066c2011edb111760db36d55b45e87dcfba414c7432bf30000000400000000", + "2bfe62ba2061f853f65566a401d59e1e662f24bb032d00a573f9af5bec37819e0000000a000000000000000000000000000000000000000000000000000000000000002400b1dd918ab2e3ffe8fc0066eb915203236b6bb179be1c1d0171f62611029e4f00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000a01874bca8a1f585a556071a7cd855e575ac01b28781615c7c741132380482aece00002f802c4544fa8bad62a6a6f2eb7a023e97d7b94353dc61563187001a8c03a1f9d9bf00003000190b2bd9a61e15de13fdc0dd5db50292162dd32e7193b1d73f6a966182f7db89000030000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000070dbda18000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad37d11c1a21c17e136274b9f383e9a48700215c6cc1fd058fb6949f0fb8ca44579894cf0000000b0000002400000000000000000000000000000000000000000000000000000000000bec1fd4010d41d2264df6db1e5f5d571e4d0b86ced3387d8a5205e86933ba26f2e0bb5b170200d424c8dd6f3f894e7763772def6189845ecd838a247716fd926206baf64a8c1bcf3d54b7ebef3c5445c43adf73fe01c81c5bb00c5a67e0dd180905b036d73e0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014b797571a5790c4b351e53971435d8223f496daa678c195223c839fad0617ab60c361dec12fdda637b2b0fe71820add7ca42d4ca65fc6c281f3a56617f383671fdaef77af724f7fdedecf7219feae606ac6be519f3cc59e80420aa42dd864dd868bf01b51866f0a5e12d20171d41c542d06d4e0360ca3990c43b62f3162de2689a8631982fa9e84826875efcebb63ee01b6205a58621a79030a80c6c43c7c6a52bdda8648b2903543f063be621b0eea238db086d0de722dbc115de8700adb850a42b9cb1dc5fc9405bc50e7b62e9436a02027028fb6cf955154e2390e15e566cfc5bcc3dc23f049095149767b339ead219d47121f1252fa07cf7bb7327cc20cd00533adee66d43760ce7129afcd3ef86ddf3cba68054d31151b5966a53cbfce0d528f96da75b9a7e5bcacd441fb0ac15b54495cc818a0418d065d21bbd2e6c38303c61131fb4ca8f7cf7032ae5d401f66230655a169d8f281046038db8bf4b172b6ff343ee41f59bfdadc20f4e55ea0a5c3c1609b443abe0b65f5f9fcf8bf3ed69a0124412ca6b497f4af7f5dbb20ee6a9c5aa62594db31181b09683f3f25124534d0b89c792bf76514c2cfa4aa8c3f086b2f1a8cc22bfe656bae52fdfaec411e4702dc17476a9c4f1f884c9546a3b5e82daf1ae59f8abb319690c0373fc3980000022800000224000002201e963cdd5f0f77a78f9026178ba8684e3c66ad5b60c6ff946475136a3e0eb397000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c574cba8b0023bebee13a607998d3427dc363fee573163a00d41619d9e78fd9c4e428dbc7d5ca1c942420cc02c7adea9f961077a9ca8bf2c800a2752e31d7d0b46b195dfad8c12578bddd00b40e7e675f3589485f6d316e8533e99382100b4eb52e2a1ecdc08395e23cdd2d3a6b9e408905a0f4a79d1cf68043f87f9d8e6467617f704aa9cb9a3b813a53b44bd4bf6604182498d648a4ff614c7f8453bc0ac718b3156c56fb53f3e894b4dfa90e644baa81c739d8af13976ef493e2072025794cde4bd0103c675269e7ee4ccfe10b2deb8cb832ce2e39908f4e5bfefcc65fcb3fdd96c76018656fd3d8ee57f251792b2e06cebcb180dc754a79b090658b71edbed934ebe9997c3407133cd469713939bc15b2f0d5b951d9817da83d393790e312a54f3b1cf95a6f099167f80d119fbf75e3e0aa873459217a86ea4df0cbd1df88b2903bf7b18be74aa5f0cd5a8e31be3b8f352ccc2a5c1fbf2f386eda4d75a2817ef576ab8a4d9b34f92bf9d278951b728b6a5883ad0a3e92944e9a8d0eaa5bb749d4593ee4e1fd9ee6a87567d58acfb0c68f018bc7ce5e27ab4bf7e8e08d5da21a3810b16b828efb1d54cf0b66da98ea85c8a9c5baa889176211f7bfb62b19000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401232d1ed930aeff83904970faef5337f6d6fec1be0728b050e10ac906b87141430201717a76de33398895e98123c17ab22977127be1ca0e6304d115282a70441e2d26d053f20445a4750a13403941b588837b9fd2cd5ee75a070e25e78339c7d26000000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8a81f4f01108a6b8eb931edd69b0856d589555ee44e5662c487ab1f03c7ab5669cdbc1c8f4bba72d247c11e6a992b48afb6f596a7ac3ae236d526e99d31f02af16df4567f8ceeb418adc31d3e7bced91d90bea47a143d298f9b3b780e5d6eecebbe6e20b530995d5bc7ad0b3e2127844d69a560c48bb21f4fdd9bb46f6df4c55d716869836b6dafd3c3a4ac6570a5c9e4ecba2772ef85e9589cccef18133a8882076451c7a82b2801998889b442fe53fb0929a4fbed72bc4a4544d1e0566d06c51da24513e6f369bc8bc6597e9482b89b5fe77f621266d7ac8117877d31b75a818d4807a1624ce9e4e5cd859674b464d06c0648f5f204102af0b21dbff20601c125b58866deac5f8d2121da0b74efc49be76a77ee759ad48d8fde7b15091d7c0429573e466633e41c47ea1c7005d90e02ef0368cfd9ae1777bf634352026ad263d137d0711e86c977d0aa47bd6ba8113571ef05039460c88c759067242296e1ef937de6c18226dad806ba0a76df7427888001ee94485934868e07e182c8be0a0b7630c0d56106d87d28c0c319975338660213554fc9d9e63eb129cf8696d3014dd621847cfd368dbc2d54be849a49e340f42d25ff2c66206d6eb3ba6a538030226a2cdb26093c19b59dff7d640090c5b8ca1c051e586f45ed3f877176256e370000022800000224000002202da3d0245667c471c673b8a65fdabd3d4117b5c2f12680b51bc367411280dc83000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b95e48760dfe77dc25ff66d8712225256dcf882099421df7337bff3d9a555457565af22ae5d2d98739c8cb41a92e42dc31932d66018bcfd8fd6171f181973d1a5cff06c97dc5cbab719034b60b8b6451566efa73231cad8fe2b487f90048f5dbce1571ddd32625ab31f1d2a993c82fb765ed4321671b4e0e7fadb594a33c984218fa1bf050ee4336b14d55c4f8a4cf1684624eff1d37d3654c18633f05e2cf03a8ea12c6f4af120056ae3e239e04c27288ec62e3b1a94422e7ce99da09a7512b6a3e792bbd9b9b1993b8032c7c05a12c1200f5b6d0a114443fbf57c4f5220ce331bd2be22668b9c7158aab505470b6a8c0cc127c2af3bf115208abb1f150bb7cf9faedb27ccc28d08e6392d24374d20e3318b61739dfc799e8c51dfc901204d49e68c0e40e4a0c1c22d40ae4bfeaba219f0f2730c25393a7ae74a2e3b508403b4fdeca9ae5f334bedf9d4784d7b0757890c55ea0c4c644db5ce38f3585a800df3351d1a7cd831fcbc36386783a23e599d614b64c81800dabe65728dba985c51b3394725f32451d46c578331b90f93f9d4b68270f23599fef2a8f59d65e9562afd1c0de8244872b695c5e9a7331cb40b660cfd44cb2169c38699220a549cdc0c000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020409b1445a0c1c75737f05c1d76036cbf9d4539bb6a8cc59a5e5b7b0e78a15b124423701482208977ee14895cb499968f158ef3eb96b0904ff32ae3a3de182e80201d34bedbf348572d63f16a6b958de5bdae8ead89b35b532bf220c18c4f3599502d04c413669dbaf1c5c69ead68edf5f3577687a5f2b8085ac708b3bf39a32920000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4a2f38f977944c50ec9000201da4ba1f62d83fe315e67c0f07fb74a0648df9b47cd1295dc40f22ab4026c9c294842045c3202ff51c187c89db44f7b5cd6e036a2fa272d123096fcc3feec892f494d227d14c472adce0f40ca4b509c3695fb1a54a735ebc43c6b65abc44c82b120c03b25744944ca1e7aa26cf59ca14784e5e5dab09a0bf89134f188940c2febc7e772355854fb3478e7c0a9ca786df27933dc656de5a7c4516167b6b4caf48ce4b60453555d4615124c6dc6cf5320bed84830926c0df4fd9a330701c8ca11084f0f16d01252476b07d3bf4b3a5e11ecea4a90a007b2a8776ad770a9ed7b94c9d7c184b532c534bc18fed05e2e4ca36ffd8cf4830aa0c412884094cc29b2eb097932f9a60a0b285f97c8b3447a78b2afec918e193c0fcf556147aac3e21e91ee675bb4ea3371df5c7d028325ed3afa8f42c81be52b581112eacda4a1f2c40a5c43b7e77c39549a291d6d1290288870ac8f274e7c62d346a902dd020bc55853ba15a86a25a98bed423b93101011f4b353de50451c4e8e856d7886d920e7d3b9a431fd95e8fb964a76de799a569d1601022a77e57527355292aeb167e84ac3da83de910d2d1734b3e3f8e9bc10665869d07c36043ffcd2ed1e41c54b66930c58dea70a2a174cb042bafab2d2018c3ee56ed0e851000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086c225f33b253cad11d26ddff9db9094f60e515e85d7b24e0d31643dd034c9ac48a40c1dd9059a3318e87dc765139a7336bf81f6d5ed818c603feac2db737edd1fbd3f6d883e2707b11f11616314649d705fe4da16a35404fc09d49aa21c396b3242ae84149c2b3478380a1d68919d92524bb8384b4077ef9ebe199cddad0679d7fc99e6d88bebf731c57699bd188422427ee59773538545addc2406b6c251ebc777995367ecc066b5401c4788d8e16d428f73f44b95d986e98e6f9bee3f67cb0a61b0c84b3843ec6af0d083c615d2d6492e906095d6b72306a1e789889f07bcac7b0b720f037363a576afe880270cdc0c0927ea0a42f65de69a291315c51d9c9f36540eaf2729a5d78d50ca5e48c5a5ba0c2e5573dfc700829987d439201b489d729e23abc9a4c303a8b9a648f64b0f154c07a415476cd0386074d91551c4ea765a4693fb955bcc912747fb21c9164a97e6384be22e6e149cbd6b2150794dff7a729c93db9f4ecc468cb1d87565dc5ae568c937ef6a14ac71313bef446072deeb28284ba93001e669c3b0a8f8acdc79a1b2b85254c8962f155ddc822f5773281fc9a3eb6a624c5a0a92477a87205a88d24f8c66a6feaa76dcc4662028b1c0ed2431e42772805ffbc632f7a3106b02ac36f5f53c9ad188e1b282798ef8c965c000002280000022400000220137ad7c0f35d152cc5fa8399476aab26e92f9f7660755a14e518fb8cbb9107de000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f423e5bc794482fa844f6c14fc45191fa18bf0f28222475fc0f92bda241622895900856de85af916e081fd3c495e0e0f81879bba84602f009abad2e7d220d8bd83613bacb977aba43ac0e726003109363b08ade5a388200ec8020c78c6d34b692e0c447cc67838e6a060fe1b81dd7fe5eaec8025cbdb2fdaa549cd76762b805ce70920a7a8a760a9e5e8e17d53ebb250572aff61346959c66d2eb5a74b0a96f97e28a9392eb1aff44584734b57f40ce0482672e5bd5b9fe6c8936b0c48e927ca829d3efaf8af6fd6a33225a2ba1701fd75205e990f450a3c7396a8ce93c20b413b86aef1e99ec69e2ee48514eedfcb325917897515ec6e0adf9d362eb03e92b399124f21152e9f9ebf9b0a36403edce12ff206c72a450eb9d056d56a833955cb49e6e2a4e5e56c503c59b6be5ae52a8b7a33fcff85380ea56468b1b0938d57d46603825d19656d0e048c95045681cf50b08a9c229f02b441fd37d79c7289593531cfa9fb5ec603376b145ad7dc8d332cc99bddfa8e6b8facffa33502b6119c4d36b57d9c0ce7bbe56862f4d5bd2a5c4592804a7b8cf8416744e99be766df593328577aedbe757ebb256ae62f8912f47ce0dd03aaa34c8a95be3f9b90045ffd6000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40100c1617b121681ba2e73649b57942474ea2ae282f44a5650c393d811ca06cd9102020ebf1908b490761c1b00df80fed3fe846cc199b6e6f9fc6395979121d22fce084271ef65119d69b71c9650a698667f6881b8e65ec94fbc2e9ad3bf2e3bde6d000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002514d11558816323ec0efa1c5e90ea8477af4bb6ab7abffb5419f7a93917767f29adbd9185d26c1f9f7b5cf8eef6dc93a1123aa52da57e5a62659047b0dffff78590840856e63d3cd7f63b69a98fd1d38808be1e4d8a2fde074ee271920188d6e19601ae7d6d02ac89d9cd94663e37daab609eab8260cefac208aa3898265caeceb3c416dc4e5d404cf5e497249c3e8fbd5b7f46da3acd96ebf02380bb209ea6697b962406799464737b73610bd1a50fc977d180fb1a44f4e50af48c2a0814b32f8394f743db3846c2a37b963f4521a91e68b37f4ef21cbba917defa79f2fc3674e58b0840cc24fd9187d2fc9fe820410b2e0ac1a7c2eceacb4819348dc8ba27a145b315322c3f1afd7c3f7ea9217c34f82b2552df10e63fc80fa58fbc9cae5a9e75784e873334b4c5f5662458a495980877d3e87d18aec5fa898ad1838f2c3554cbaebb2bc386635d75a0058b06a1de73841b08e9deb754f8a83264bf4d4515baadddd648554a0bdfe8b00f0fb621444f179f7417a6343e0a1e96777962c107d8ab84d7629ff5de626ae37b70a5b2b0b82ff14bb78a19b19426e2127b8f4486a082cee14c6e23db3ba5247d03902783fd511863fb4597e6606e584994ac64492cda434e9555b8b0da09be8f2551cf9dbcf880680dee6bdbbbeac4df0c5f3a1c00000228000002240000022006e1499cb05fb112b6570c5fd1c6ce5301cade336068c3b2ca9bd105b153cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009160bcd21f09a4dfcd6e890e6869613e31e4f32818bcc62c7c986982a81c968cd028f9c28a697098d08954f54dd1ab01b964b7d6d579e2efecd57441620d1d46377a7c2a6600371b1cbc9173b90e0b09f59f4b258ccb0ce57aa443f877163a0dcc675327f81d702cd432bc9d43cbb36a25e893df041f7524239c5e0848264124d6aa773c207cbf0ed9d79a9872784e837303300ad39c937662f309e67d4037ab92cddbbfda02474e324823b3a8a02817eafd2561c67c54eae289d4f7b4101ff131029a3d439318ee1e4b6f013a6bc1a374942df4e4d375d94b54005b42c8e1cdfb689c634c5e56aab6f1104a28e16a1cacf8e0e7ba714b42085ab1ad429d2dba5ac7e3a643808e29132322d7389f7256b80db79902f6224b27bdcc69628d7d2a17da4f0fb34da48eef9f4f565a0097e120116a0b3721d4949b6e2083eea4982187474cbd051b43008c93c6f36f9929309ab3a56e97509896a9e5546cd84e8ad3d641e6087ac91d3d5e334b670e9717c90b3a9e89864c776518a9e2e3ab11514ddde7d9b2541f75085870abfe376f1ce0ee7eb4f1657ed5d71e88ac467a4578b9ea618174f702ed63d9d1f723c7540932eee5337a2b5e2fcf64c70555a705a1ac000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022ebd87ab92655d2d5a655b0fdd35e46d704faa760bc165bbaedd15c6ba16084b050e77380def45b74e05dd7e24441174d20785ac2d1ca22f05706071f00987e80206e4b7bd7a4ab39dc7a46446f9ed09d89c6247755d5a81cc97c8ea949901a0771289bd8376bb967ebe62f56e93c14948078ea06a411a76ff236de0a47613f1a40000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6ce2fba0181f84441cb910d7d585647bee886f56b498dfcf73708ac48e466edfc93f205aa3bc6115801ba6e1ea1b1ecdceb20abf1b518e8dde9303b7de0096e013e446e7f8b63e34de5c649892ef3f0c2112397315e733a533ac5158f0138dfc66ff0b5e2c913ce5fa51fad97d68fe3d9c2ec76ff2045938f3d36d79cb85c047b661dadee0909cc4eb83b478f76d1f9065d4a4571e25ee384f029dbf6a9218b2d33c6bc3099a87d99d97fe6b12e70800770cbdd1147cfd4650477761b17767a2ee46460d57d9df72d37d38bc561e814456cf36b560b091244e694c96b658fc34965cabdbc496fcf13833bc1318eda1f188fff02b430fffe99f74e983a7b08014641e87e0ac1e7a50a499a8fbdf35d22f30fe07e5e5cf2e094ca03bc65fa03a8809501d3f003a62c3fb4f28d1d6703ebd76c5165728a5c725e4cc100f5073008b8fe6872f207410ae414b0e7d15b678f1e6106d4ff33ed90fc76763972746fa8bb2ecda33d5faf43b670c37e20109beda71369d8a35e986c06f5ed09c6269ce1c8be678a57c36f20b3879253ce1f5d98bb4343a0e22b718e1a94ce842c8c1097a4c579528aa0cdb3a75c90e9ecc9f9efebfe2b031d6adc502c8a59f0fa4928293d15954f18b1ff9d56940c09bce4219de6cc321a4e61c91603275bfe5edf0a3f00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004bad07b69400aa674710b10767af1b12531768f1843cd8fa3a06139214e2db1941e7af641fd7011ecdeaddcd3a69e6d4c3ff0bf280047768142537f735965793e30e665736666bccbc403abc7ba29c4b68142a1d54b0872463579282fa6d6b15c037d668de2da1a581cb4216bab3c0156dc1ad332bdea1674df149cbdd190df35ceb246f9653f7f7503234acc3117a254bec65199182e4fe8412d03e0d8ff4f17c62417c19476c0a0771c1ae95ffab4cd68fa3b4f1cbe0d268b33e0ded412709cb274a3b52befa4112c5d114fb296122e503526d925cfcf1e048a31a05f0840f2a3c6f571404dabe8b135b95921daee8ff2dfe8a37b22f89f625f9153f2b13c825ceb4ff14ea823c9710fa8a5a498a41558148d5bb7fe5fb8b935737c89e233219affcd5bc76bdeaddf0bd458034bbf6a36c958ce2c52640f2c46ecf19b66a9b0f9a431eac358164a7e2dd2251195d73a18a36320deaaa87a4a5474ea4d9c62b43e866c95407428d15153ee182673392320c0d8ce1daacff51724b1c1a4ab039e245b2f1c759b8c7d454cac4b2d1d8946eed7cba454fdc2c1fccbf32460e46849c4b147dba4fe6ff0fa2edfbe91c35668b41d8a11699c3fe171d2e82949ab4cbb23c8a6f6b4583be5abbadb3387ee425f6e56c66c16de5c112ed1c9c494360000000228000002240000022017cbc700da78e9547b8ea9fae632bd7cc86fb582c9c55d7a422c1be6033eed140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096d79ba59cb77f952583b460aff5db3a98e013bf5c6635f059ad51736cc222669e798015ad8c00bfce4f04852eb022673feb0cd224c8911dcd986fa7c1aed89f3e706f9f31b2e08964adf4c3a363ca94085faf79feb017cda174e39c104dc9c3958310083eff4e62c4518ddaef94b6aa3ca92df7010fd6d3043646d288619b72ae02b195882cf9760f1d7cd85f70b6bb388c9103c5a918c5f26c9b7516846d4501a79744e80f3486e352376ec9c0b9853ff0dad7709a31f1a18d1a5c0931310786b49dad80fb2a4187ba6f14dc1ff8ea8ffc7aee06b7c14580e0fbf33d01c6dc0a23fca27e195c55560c489dc4f4cf36bb72f7fcdd6a4257ecf52ba1843c93c14497f9fc1e555eab9d4b0b3258d70e441223717bdaed83f148f8e2da9de8b59397717abbdbd996ae61bea02e355f3b02134702d39bb53b0977dfbc5518485a1aaacbd5c1cae4bb81e010fc20c5c5a73277be62696be6af39e2c57b8e8b7a6d6fad0e37467e9730e4ed43483fb478d7a192e51ea2943efacf97584ce497f8197647341ad35883dcb6c510738755f39b43a0fda4186fd3bc5f86eee684aa8abed80d63d5d7ccd48bc6535d95a156653189628805d217b79fec9bc7772f29a328ef000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802052f1838ba688426268e226770d508dd75aaf18241c379d3e23471884abe77f8033146f8b78edd091e3145d4b2ff04d124485cb7b872717b29568082e96c6cb70208c9a513d242358e0a560d9d5a459da1d483ce0a55681ea87f27296057b678051548e429bf625c3eb85baaa4adbc64b5c85abe7faccddf083704866e7bed29010000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013459b60852f196830a1d9353a73614b213bb9dd33cebeef6bf5370e763dceccb909dc5348f054e0a39edc669b68f301920a7c700d0a951de9bf3c6b2702a4d5d823a4123a3339d3f148d9fb49ae8d3f999b63d8f0189606edffb4f92d750d9630f1881b76edbf6e2a5e176f20b2987999013e730378f969b596f6e9ff164b949838e067f04644e0798784d8701a1d1061cf1f52393456b7c7b8a15cf7aa4ad3d37c90657e5b227ac01efa9a28feb199811166ee2d2a382cfe9a3efdbd605cd13a9356baeeb1fa25a0cce47a9153796fbd5203ab800fd929fce0c7eb27437a75bd8a6ca052ba95575e738c5ce88a19060595faadf53ba8bfa2b36bf611f6b1620f41659919feab36eebd98ef752f863da9cd01ab5c64873180afff18bb0a9997e5fdaeecda6f14224d796745d292c262a95db24fa8e5ae179b1876176344efd52f9da46d31800fd452bb62024263cc2445e5da932d26fd09b313314130bb2f3d148a3e4e3be226811869c086bfeb2576bfe5856c8d3f4c4fbf9d2761f5aa8c04678d4a89b8e721cfe9b06c70aae620bd229d764d2d0ef7f5f51b1a735b9121bc5322ba9167e575e5381fc43055f44a48ed9aa20507049e6fa61dab4fa9fa08e394578dcfe2e71e1801390f766e42ab7c555f361ed172b62bd38bfbc8892dc3e5000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000248193e96bd0116e52d7c415c145cedda947519f7301d633d0c5f676bc6afc9e4f454b1bca0b4b91a13ccd8df98aa58d0a29c7e461333e0b4bf6e639311efef151245c428a2d69423a9dc55a84faed73a6643274ef54149ec25186260b3af152081c2fa5ceba044eb811840c98e00a2e1d1256fe50afd16c4caec8a33ccd3abd1857d785212cc0adab4d4ae53252389cc97300ae531ca06678d59ee3c54ef243f25075e85c5249a645e776a0fd3263bb7848e062e6f35dbbf621b631484637d0ad804967580e315b0cfd8cec330def7f3e0fb87e8192cc71c778172539bf9c2ce185ef908469cd4bd7c83b575318c526b9f7eef09bd96052c0dd69a364182fe826b1d95f6a6b9f0a8d4687f9435464d1581c7f517c8cecdc83c1ff50e15801be882817dda829ed35f152e4604b21a3258ba786abffdec95483ede8616ea1e7b6b1fd8b6186de5126aa715c5fdfa824cfaf69ec84af58c0d80807f0a768295775b32739bed099b209501cf6299cb05acbae2fa5dc156131f487f73b079985222bcd55f2edd7efe9716fb6faa4346428ef587c0e7c68d303c127e0f10f51733a8d3c14185c36063f2e30b8c8405663c8bc8fab05cd00d7a0ec569e6bd0853d4516623a91e02b71a5aaca2f8ac2e9f20164fa74f0a7d57b9066438b5e109d6b97ff0000022800000224000002200de418ae133866df0dafa2edb026c9719a8899a2fae9f3835b27a8957ac0a5c3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abcfb984068c045db9f3ea49c725ca798572bdc4e9b74a048c6b0facc5fc65c9bb1fe46fa92a8bc7154776588f9f38c6728e1ec439ff142fb4b1eea3023874c09aa3f7f9cf255af6921b7cec83d7592eed95d37551e2e1d0b6caaa22c914174a7eb8764a401c89f8df0dcd8b3c16f7ce0462c341aa52267d60a377a659f3090196ab25181b4a4c2e4c94daf4007460ecf6fe80edf634125491d5b592e5787a8daf1c74eec1c97581a25c36863f225c9859bc979992b2498abf0be81c684a5c096924dcc160725a7801abdd1785dc9509814d297325fbd5cc7b01e52a28d908c9021a781264fdedbb42c4f4962bc5c87cb928755114ae4f0e75222289905ad64bdfdef22ef02307b2f942281970a5124c9192105262f50d1aec524d1a7f491ad786a9737077a08eea50f6557ef68f4fede67464218e9984611890e50c7588a3650e517917bd61b5ba997c06ae337fd0e2291332bff86344e01efee4b253732de18c68344e4373616c1f68840fc2e1398168e5e0c646d49ce976fb94079a1551f8941b7deabaea2e136b409e7ebdd6dee5c37267450dc6b20584dc3e897775e233d8c818e724b6f4d218f3377e58612238d39071f9a4fdcc316e9fe52bf01f653000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022cfa435ed0ecebc38e72ef575daf13f0fde808b7a1de817f74b21b6794e367562a34500cf886f7df0f8d85e3068214d7912f6e95fe0e39f46836a96a31061975020b39d56d6a8016910d2e7aa93bf00ca4e2d917e79b4bd341fac589c8c956d87b2a11230c37e5981899e61f818e20f56946f29e320b00cf4b137829c4b3223f6b0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aff0b74ed2a621dcd7034ff26db2881afb2f5504060fe7440bcf0d712fb51056b86d5d5c7504a1a3c3bbd01d22dd16bb78a964c2470eeb5ca27db96547db5f31d64393e3c75f9dffec9edb840d4285ba0e8e4698bfd57ba891c45a890e19e2be1a9d74f086c837dd987ecbfb75473ea29688e25859ed93425b30006e3c97466ac8a76c493145a8a1ca11a6cec2b827fffe301b4abe517f7b9def7e063e038b0b3ada3f9ffbe01ff43ec8bd7aa50c6ee6e0a1b1782fd91bbffb139ae7ac7d8b42570ed884d3f2807a1bf09677e4028eff3e78b40871274e418dc5d9ceb4833beea8e569b8b4ab079da6285b46cbebb5fb76e6dd8d8e4a1ebfb1acbf14ccc135f067219a2f8ac61e26b85feae05eba126e0def8d1bfff0372e1b1ca44696076743b74f130341a12c858dcf4115f369da859c019b66122753d3bf6f0746051cf64be57386441bb432c71244bdb31fdb2fe3e9e12d27e1eff59f5b65bd62b56124a9f7a44df7e0c5bf2f16acacc1ce806211f45dbe2c04431e86376362c1a94ad13962ee9ed1351753e9c0ec8e5f4dddd53d6df91461ec038ecb03af401c1964a309aebb5f0140e4a7309e21b9c197dc4c171a4a2fe130f74dc49b9adcc59db4d7d61dacd7942853883271afcdbd1241bd492217956ce144111fa7f0e9f5749ebc9e000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a451ad8f36aab8c2e1dd466cae066b20c03e53edaf0bdae3a95a29842949bc46015af6fe0e5b46b1dc3c7338195c64b2dfe2a934ccf717ba52e68988131213d0cd3c86046dfea5fa1baa825e53b73fd7aa043d49b42fabaa06a8b201886ed3267e624dd07ce1333f05269764b7bd4872094ab5d767658a8a6570d09054e250df62bc015bccd23b7fe6ab34ccaaebbab421cc9a43eca981c9dd7843d7e7a3b8560f3eccf4d42a08d29fe9ef8522a21da780dcd4e87ecd1e43cd2a4d8f463cdf413a41a61be792a3ae7eb30cf86c49182251901846b5f6b3a577e1377bc73d75ed6730b51a934d97e0b682c85dc1b2565ba7aa0e90a540b083d6508c7f30bba9016d4bbfd073c8bca58f688a1da7253dc325deb869c7691bfb7e5c26956e2815a6134fa4a54803e805fe5775ccbabaa239f66d1781a7713de8c10713a471fafbfbb141249d4f9de9940a63b9cabf0528872d294eca9edd28bf95080d3c9198cc9407f5f7efc5c7539424cf366617cfe85edae479de2ef1f1398e0e0f78caac72c62291c38406866d112e589d0509aeefa3d6f515df65fe15384099bded8ceeee21697cfbaaa5472896d28274c2ea6ec8530e05dae00f95ea04b43ba9aed8bf5b14f920b15f2328c7a4ad78b38e3e2833334d37a2f011410581981d84c155de4e130000022800000224000002200ff59f6fb7a579db2b5f98890241b7f630d289ac57b1c0067ef9c27b595ea067000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ee33855ff17db04588c67ffb36c89fe8a8456b5c3833ec2c9e5cffda1db96c696a443c5e82326754578534f2ba1ed0247c053aabd7d578118a135e9b0b842fa8bed7937ed3c4aebc493f152967c231a17c4f6740549171546b5ce41b60369a438f3745ea114bb9a4364b6ddd0e36556f5ed01593dcff83446d176982430d20974fe34e0f3853bc32188773ad505117af1c5a044de1deb11ca66caebd80b0d9a8a2f1b2257b269e91b0ab7362e2502f549f7d2b47c8ff8a8020cf9cdc2e4883086b663949f225c8268bfb232beb5875402206b3f91a3dbf3034e9617cfc978260267f4af7e01395a21aa6d532ef0aafa795f5f4d167538c0bed2c8e5583d3ae78d437b17434343809ea276968a331dbe11e5034d5449830bc5f016c6aa27b4b2859089982bf510738275119ab974da7392981b39c5435efdaf502e5e9acb6cbdf737dde555b14912e09e5cec1b2f2219519edd9926e505026940689a104dc413eb9e5b3e2c0147a6ff2e163c0d6204d92f1bb0baa81c4165d24804fe0a24ea5a16e5b4f317283b50aff0634b68176d28ec75c47c555db5428ead9b709826b2fe25d94fe111d2d69ca3d63d83d13a81904662944f62ec99b764c61bfc554e6df4000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020ca59ce10e65eae6b783645490765af34bcbeb1a96d6c45c171c09ccccaed77c1112c230291c8bc52191aff66466f4864faefd711a22e4d1340defdbb2b18413020b80a574dddab5bd0314b14a00181c2e76da3a5d72d9a9d6f95f52adcaf05d6f0980e47a94c50674fbef29fbf06370d24256c41c80f88fd0e07aaca0588cb2550000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085a12b7275a3993ed2362b3244b9f747d4f064e9344617ae4597fd41eb63e813afe487bc568ca7962e385d50052dfd8f25f8422907eaa66e15c00b4538c59c7d4c4a2a8277eea8853d9676d5ad15cf9842b7681c23edf1872c861c6b350f3218307bf336844198b185ad9d5b3e3752f25fb75712343baa80101dea9c6df03b9539e86e07164fda202648656913a08edff1e55b50372e5ee3932aad1bb43723ac3ada442f9e8a10e775fc7149a2188855671ab717d17504ba7afe31aee67e04d96f9c1861e066eff14c4c6401f047e81ca2c6a76e3c2347e18e0e3b1de38053cbac2fcd1d4ebe4b009c13beee36ebc2ca297457b9edb12ec9ecca51909c6d1c9bdcf233c795db9ea2fef50451a51691e05b965ee8ab01789a12130fe5a5a7cb1b9330ef041f44e3f62f3961055e7e3e5a191cb0ff9099c7d4603b6d350cf97d3f8903fcdc74ac570c8815bef0c1461146ccf39515e5d6cb24efe7ce6f345760cf98d29f5b8eac7eeee34865139851e9527ec63f0c785fdcb0e32b38af82678744ee1b26f2e41fb85127567b9703d2cf0dd35780098436928de26ce12753c29150ee76a4ab1553b0a5d2ae754c25f1ba41edc3476bbb3639f48ea5b8a2f7dfe43dc216c15c79f18b5eaf9bca3d9c319fc5ff6477d7eba493efdfa0c218a454d5710000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ac9678671a7838ba9703aaea5b9e2f62e2fce21392a4c26719d518a7e6e66a656058e05f6685066129fc5e3a4dc039ea2f4dea2556f359e551b096ad1fd4e6d2a7c69d94b762cedf8f17610d19831bdf1185eaa48630c26ba5bf5db9c9163109685bd206df988f6172c430faba796a7b3679bc8a01d1cb6ab7ffbf006c788502b14bff23442a35b4397a7e9ae7fb40225973941288acb12c43441e14f36ae91c72b95be4fc6728867350d0c818ad91b553677d3dd1e3360c024d52a3453e4b2613a2faeda9227b1a1014929355656ff9111cee23c737223a395eaebdb342f357e18bf37ca82e960db3c4556ba0c1a658b0db5c9f06067f4bc67d1b9ab736dc0d3fcfc9adee26458a55f9f38f21cf0395d84c6494c40c3f5b1d025576830e260c7eb90c3c2c539c5c8ff2644380d7936eba8b90b97c50ea56542287a06f97774800be5090495a63fa62524c0171ae743a0a11b15d4e57ff2c1e23679b55021c0a3e30bfd1c5b64e3a29f524e68c7ea2fc83ff922456a8506ba6bd3dfc84ecca581a0a67e7021cb30e6f0a9329f8d1992ccd79e9cc3346ef9c953adad098028f8473130b5f196b69a3711092172f19930cc3f63d563f7cac0d432e6cf8c2bfa4aa6ce21970c748dc3f469fddd05216aeb6a4da6c2fa5245829a36ab57f9af506e00000228000002240000022018839613d089b9c73019e6be25cc3eba9d75a9c8ab3bc904763798941571ab52000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001886a6b98374811d7d6f614af773e9e889da58c81756e6ef1ea25622c7705d330457c2af59679fdeafc7e79ccc9596a9076d52ac13250a83d3fad8efa288e124d953b4ab1c3bc1c198f0d4701909b53c69135c624f868045f382ccc9d559fd2036d6acc6b75a3cd9f5f27dfe6f5b3872e59b24165724cec02aefbbdc1dd99b1eab1c88c597e05ee2f58343d32106e03eb49925bcdeccee4e0cf0ff5b840ad725ba222bd8d71dad7067f231277b8911280c7b838b87c1390a9a89efb335ac934440ff0f1fbd809e48346e1956d33a53180dcd2b5af9f0b2c6cc7e76796451de15170ad5f2c047d49fe1a37bd1f5c8c0cd97a0e04d7b3121507a621282fb4fd6e19f60b967798dd231204e871672ba2a9e6e60d72f90eca424146a8b3454943c314db59fdcc0c0c946f106a0a0ca70ccb1011ac46878ff95c931b94337f93e598f520aad8800419d0864845a91786e788487f22ec8369f26418b57f28a0ea0f6789f06a8f1697fc950b5d30fb4d49c32c9c6d59a5c6750918e5843c47fb2c9a07a3bae52e492292b0790f72d58fac8d3190813b8c2d3f85034b6deeb39dda3409d7490a43c8f36a4f70f07250b29e4bbf90ed087c60c25b0e9b61963273a205ee0000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022671514febaf6bb6a7b4a379ae0866c238de1543ab6df6b2938e507623cec2f51b8dc829cdf8c30b1d313762a7e56edd6bc8ac24356dc313369f01ca9183780802101a2eb99b434199b235a63574004830c197b6aa77f142a763e4a83c6ac3ba800319db9060353b17650c1867a446e58aab37e777b2e7324ef40f093bebc227e70000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012fe8929832b49d15d59d8c5ab6ae513472cc60eaef962637abb3f1f045e9f7b47c694d70176ad350b9281145586b2f49daf7cf93818af6a3543e4647d84c081931aae2e73bb4f023c36552a52f09d7fbb6fd2936cafb420753b47743dd7f065e4a799e06e3a1104cab68bb3af2c1a6db5ac13f1d80dab1dd48061dc896c831caab4ea9ff361ef3fdb2b4aa0710d6a4eadc4bb4e20ba45171e4f367bb3429990659b13aeaa15ec35d4f954e7228723caf3c874410e9c1e33eb179bbaa03640ed17498779bcebbff1e2864bc72b7afb3ac6e709a850e33afb9dcc4de493030a1843e3c7e80e45e0b9020874d81f691dd67954be3d321d081f5f32bfbea4dc3a8bf01a0ebabdb382a7542e030ad3ddd4033a4400cbb1b5791adaec67b343c6fc7c737c924513f241765965c84aaade3c7fa840ce64561a823a9f9b400acf7b048eee0df9d188d0e1116ced99e7dbce0ef598a198a116cc0671129018c6ad3e5b597f31f44a1eac6ad42064b5f6e81876781dadde06443951be81d035673ac87b5db9758f27e4f63479bd9f8b4de5b6a0944bd96879c0dd0f6fd87c658f28dc94f5be79457a31c772ce475b26d91d5cbb2d82f7901ad0551319a77b5aaa5bf20122bf4c34464afc83036a815b6021d76d070ac923ebce8e9d59bd32d1ec3a917f5000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000977a7e04aebcd8d03370bee9cb5b3e1309ca35d8f83eacf018cdc5c2dfd598527042b358bc0eef0b16273b0d2200d43f1bf9a0fd7a6c3eacc65ca9ab9dfa1622fa956c20e222cf7405fe56c2a58cdba69eefde657b57c2ff93a2bb1f629b7532057e209e29581a23c790f7678f747d0c7b15de03ee89e3b60604ad0e8cee6daba34102d65110af4221adb3c52c63871e05c9161bdfec20db2cf89237229116d1e8d24de9a8d97ebd462337281d91a3dc15dea0806d4e0b881b37101c23346ba7c28ccfe35c6a842c18012fb20cadbf8b0aeab42c3f07a6cdd00422f3c6f2cca602bb1b78aabaf6311e83baba6d7d6bf7fd07ac4e8a8bfea6ef387bf66e55c9d9f1d428c49aa987bde13ba1589b2c2efb4c1fb89d46354ad6836c95e33c6d134c74c024386cdea276b88013e3d33c3a75afd848e090d9e9c373764f81e2d39e4433472e27f95e1c84fd693b2b7b66da5434cb0dc0283a05cc56a05cba3a8d557f2838bb023a00a447860ab0944e89bcda80887f7289eef007deb6dba3ff33cbcd4e4d7fb1b4dc5b93971118f64cd8b458b1abffaf6eec289753d75dbcf0280ada0aa71ae3002635aa388c23802717025eb776adf9ce23efa312aaf1e1915a3495966402b05f55d824bcd9fc1696362ac864f988bb1cc3e3cbb3aacf9a84f5f97c000002280000022400000220241a44279330345288daa192d2f2e92ac3e22b6b82063ff2a042590d60e0f2a500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000afc7c968b54ea873752e3c1e305513d3ea7f8e666f3fca837fe8fabecbcfcd3ef64dd85dc7fc9fbb5d14d250d8c57d2f60acaf840c2c0e5cf63625ddb4cf6d5bf89e7a6b60274ab6a5c4f1a724c5d5122e2a78a44a5beb7fb04d752f70df24e49cf606eaf5abfcbc326de32a94554c2c25ca8e7f6ff49f4e3296c207f20c37e46c4da357bfbf7cd459f6bf5868e541ad907d69b6f25c030a974c0d2fb8a993379ac881c2fe03c137bccdd929a7f19c67b028ded5e89982f88d1c205fb71d78beae3934725cd051ee95b6113d163c56a55cc85beb049838ccbf30e0b36298680b474cf2de169ca568bda8d76b60aef4c21c157a0f5083d2037174cc0e4c44174c4a876b14153ed197f438e989cbe125edf75984a750b2a3277168140f532ec638e630dbc04f888959f9576f704dd14d4dedb9b699949ce2f585929df8b94e1fcc266cc1014bb392b3e0a4ff457e36cdc0cdd0a885535b9dafb4635b6d3e867ee545ac1d46d93e7ef4f888d7772c7364db2530407f83a8a9f73e1007cfedcc3a7494feaca32739f167ffd34aa6959cf0ed9330a98b8f0cbb53dc18ca79e85771812e0bc5fad0f0c97d797a6a0a94d4777f4760f3b339e65c425ff0ee95d35f8f66000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80218e9a3b1501d2baa45797ac0e978ae11a5095f328fde0a0ab80e4a145ff500212cc1dfc174033d1cd3c4512c39d61168c93fdd70a597aa928d49381e9794a3c7021090853223c74bb52b19124e35d19c8549e87392d26083066adc8915af90cb5a0f39ab5cc600547387ea40a726061010411015949c9dbd81701ef01613eb66700000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019da618e33d67244b02dbdecb0781c13267eaa5878eeb3e313947d50ee5693f2074c593e891e968101506edc935e68382302133ef9075126ef3f8063c9113e35dec61fe279daa47f5367e3ef1fc67aa880a35fb0b670ecd340fccbd4dde928c997b5bed5c78cf4540b6d7ac2e6ea05fb9926c5a8857d1660ea44f8c0cd2e6d02ca9589c2bb6e1851eb1fdc11421033dc7acfd069f7d6fd3f600e0eb669354b9147e8e5df8603e6a49fc8085b116f9068c75ef486c5955ce307aedb295e25ea23e7b3651ff69596aeff5808f7bff024748f1117cbb0f3529a94d2d72c1eef6980b7af1cfe88a882c3c698ae6f5ae7491689979b1c7bb649d55afd4dc9b1cefac15508d579a742b4ff7147251686a46c7986371f95ee9d7161160bf39e2aefd321a2f2ef832b7979c5f7d7f424610aeefadeac24ae4e2f91a2af4684573d3273629ce51ec8c4d8002452afc3cc2052114a61e5f1c2d497bdfbbdf1fd90420ddc96dcee423c5d294842b8a8ac5e09862f1c2aef9c84b5bcbce1851b2d29f5ef0502fe7830269eb6b7f9fcf259af54c540bb332e1826a2ffeec1af877df08fbdf24db200ae664ecfcfbef42cfba9385d0298d79b92ffbbdbf8150e0c8f47408ce02475e941cf704829320fc2404f3f70f9727d5e283e870964221a8adeaef6d724d500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a200fb756f4c8db7e7c7485eb76d19d9c22b38e045e64164bfc5913a0c8c82073d1ae5dfde0d679607db4ecfa1b1d8617d338ae5230996176c9df9c591502ba322074bf2095170e7dae7b26780941d4c82c0c4c5be81e47dd25b2fc9bcb774ce272bf54c3acb873060a43a2b420950f0795c73b08fe01a92213090cf150ecfd3111262fd8a82a8f54040ac960ffeb079bbbe3934bee69842e9711fa38e9c6bf82ecb74405844b85d22031acd86924244cb033c6a8a30ebe778317214d2f2b5c6ac1d8de0b755e1bfb3ceda97478d6b193111970332040646d1751ae42f4ccb551eec85fcdda29f588d7d6f1633e76fe9ef0036e870b3502d450537cb73175292ae950934a7712665cfd72e6ffd3556fa537c98f9713c6a237a5b1a08c879bac21df9ec4c7af26eafa75459f182128a2b5cd57259305b70b9d6e7b279d31c4e08461f153ec878c299bd9b74f3acd5852e4291fab7d95ecc3bf9a7052c3036297df51d6e7fa3f9166a63b4ed49045f1fc6f3b5f98427758d5be6f29e31166fe13c2dea9c5621bc1ecfe40e54b92cf4fceea8b7b0fe03ee7e01f0eae6fe72d77dc0d709484d42495e55cfd4bd3a7169233037732a937355195253dd665afcfb655ba8048b828e7dd50f54a32c6977780a1fb9da1b34a57ed3e6fd98d80cd5681a0000022800000224000002200c8c492afe4da5ac23108a4d282bc6165c992f1b044c8a9fae9c412d10782f410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016e5264f40bdc7eb67230e782b4a9365e2d96fe6f4bcb3dd28dca8d3b1323a764978eb0e241b6756aac04815685b3caa3446f44cc681ef56309af23df0fd3b96320db3aca7134f40e08acde732c4eb2bf0a96993db1e8f562d2643e15afe730d78e05547828e8ab5b5485728477ede89b91749cbae7a82cc54fbef7fc58da7e1134160d58817f30a17a1234494cf65f6ffe86753f76593eb5d27dcc637d88f7616008381ff086d55bef3c824f26c14f141ed99111687bc27c62cefa7fa4f91d11c83622da46ddfcfe1ba4b1e3250534de960a33431b5647aea77a9ce4ea0f7e84377797ddeaadabdbcb261c09873cfea937244aba429efea4105eaeb844406d418c27cb25350af44dd32cfb84d50684ceea6073b959c714552af41a5164ba93e231cb77f81b683106794e9ef7c42f326af672b86937c4dde2a449caf464228d3405332b1a8fc578aae93c5f4ff216cf322aef79b46ead8a737dc506b57604064947c4366c6ec5f321ea8f0b5a8e9f3816ed92e94a4557fac64f02422700496a9f61cf02e636643bbc5ffe7dbb4f613e93ab14f9ef48da7733a743c8b3d1a8243eeb67640c67e09c65d7dacd2bf620423ad407e055536fdc74046a9cee5f0d387000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802122dbd180b5ba072fa498c4a60fa9ff152b581bd988d060054a4f40a6e155fae228ed97834d926abdac681189905700079a8b9b25813a40e7ff3be6fa6cc7f5002109648ec786c06b2aca0a2e01c35f516a2bbf1ed05a5cd99c8d98cc925c2c0401783e904566dc1c876cd2291c7513be377c2b16fab46b426de41e82f4d2a05140000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099c7359ae3c9fd7818dca82db822f1a84cfb9076eadb282da33004c27233305027578441ba0097575dba71852cc72cb32d5b11c9071280fd216b0e6a95395c7ae8379119ba7e6074475cfaf9ef471c296729b13284109d43685778a4d37c035302c925672e8ae3e32b9c2683aa0a94c377a8959ae8d3acd34f3078a60e779b5118887d80c0a9a809bd55c7a423935b936c86afab3928a28a418ce6a6343410379d24094e9cd9f0326709278b5904c2bb76c4220a75d7e8c7af2edabe9c1b76c02f2006c63e8d4b6f55c1a84f2f77bbdacae3623c68380b0cb289fa248002cc1670266004a2d08013f593e32871a72801bc7be9fb23f915d89d9a010d5035c0c3efd0c78fa8f8de4403fd5910e6847d0f3424c7bd4ba26f71977d53879fb731519b4198d883424f867f9acc23d1cf13a6017378e030e957b1b55c4070e15423c428908fdd6c388ce0a4a1493830994ebb138633e1e4c35c052c37d66048c007f1f9303d93d87583d5165fdbdc97da2e64ae509cb9d3fb0cd87ea0f3cf1b29fd06aab7d138297803262775c41d38ccc1637a48018dad295a329071b8031dcdfd0f82091c3806667a4febb7c85355a8bd0080c4c7d6453630af21646d19a8fb6e2fd9c20e86091c445f37a074a7922703e25aa71d729d5874bc16ac5fb7d8211c87000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070229f446b1664bde3237d1e3a24c083b5756b200aff1f7b83446e7f640b86814f0c5f67d16e3589e541a3846ed313ef139a2eb9287da97d1071b37324c563755d9a6ea96a077fd6d85eb753123bec76092ff74b11456c86f3da4f567c378ac26a87c489f0a1f6f0d7dcfbbf2e529c32891c6669a00c36581770dee73fe732a7f2299107a0d9f38a6919c07db7e3374a87ee966a7148bdacfd3a86325171a8f6e132f137c3c9f59fbff8c88265957f6a7713c3707970077406a605d58a4bfec1ddac865e5196ee5b3811ccd848810ddfa50b2859530368a5b0014d5d5cbec22018e1bad95df79bdb8fb00afa6c054daaba5c93228b6e9ea8554bace6d1c92fbde8d03e95da585ddbec30cb03c2e5452bebd63ce0fcd6cfc06e2bcce87339dfc2560da3d7fd43df605768d391a9da4bc25647f421164f1d35eb0749fece151557437a175bfdcf0381ac4f456393c7cc08ae11026855543c8f0638e01d87df0c04c4549b9428c231a45f907f10b331f3701122b7f2483c7bdd7b0ead1003786f67141364a1eb906f57481c9ac1dcab61bff01288e604b51b68771ff35b98d616ab151d366e313d636de7f9df9e44126d3e70eb3536c4f9598e051258918dd07dfd92c32ad114a90dd32920ae8e020ef21f7b6e1a2fb0d8b939f4cdc394e9cbbe5000002280000022400000220032bb54b9541fd44e5bb04619eff6bd3ccaa2b6f5cedcbe61740a235cd77f5880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013424920fac199b88d5f71c70ae1eb587597a2ba31540b791075449c2944fb6a3e715b062ba51a4537644b142745e0389d7f1aaf4ceaec161a406d49f123f4a9ea0a4cbaf43086175d63bc8da8b5e19786375d5ac250b4996b470e2bc81ca00de676f9255151f2cef643111355bd41b4914567d380c224fde1c358cb14f569753858fda146316d6ce9c86190fba14b5254299e98449424ec260dcbf53fb87d16485dc36d77243d451a615961fdaa3968e63819d653943ae49d155d0b2b1c0500a6c367a6ca8df0eb2922ad77789d080fdf14fb4505add110a3b9a75e6b3cd098d5e92f6313eab7e2a7d8e15b9c9f95bdbf564ba8d318af4e7b137ad98641c5900680819604edcfd450a6b30c597031e422ba553f80d817119e691f36a83684582ad7c040c040d204f2bd5829c142c3a051098261b046343b5eb4f2bcfd0693f2e12d33875d9dc924558047787c24529a24aa216104806b410a610ca1b06e9779d51eadba53aad0d3b0d3f2b098423b10cccedb7fc6be6b6e1043419d6cb78d604f8fc2e170c20ae5f2522d1abca5b34141556ab7807e5146dff4632afd77cbb3f7a22a75a552ea01126e5f1999804718f45541fa05e6dc1a95326e6fca66ce82000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40112dce3da53595f04293f4ae3e78eab53a9bd765ddfb83f7c48223b3a76f5f71102114cb4e48c67d422f5762c9aaa2aea506c93076692dac519be09faa88591c1be2a33a81044f59d5b387f5941ab8a070995a2b459b7fe33485d3726860ea90aac00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a46e189898dd75f4416f2f67eaf8954a852f44e25976c043aa246bdfcc8234b27aec1126b51620557fc49fe6c3accdc36ac68e39a75481cccb3a98335fd57c9cc5bf0ebc34c274c91e3c6895e4a3ed5b62bd72a133ea2cae238c8786614a97d6af46988d835edd32a0e95c479fe20a62cbee05ac779cdddbb4804edf6b6f184d3406f0cbdd42375cb9d8ce51434e7ec9b8d257b9972a7716d9dce7a311c816e5403b226db9fc0954d20c4d01a3bd3f68cd727b7adce8c9104d4224b576fa51605a2cbbb8b104051a0559dee408d936b18a990528f16f456e494e7bd27c411ddbe5255a036e837bbc26fb54cbc408db070a5e406876e4eae5682311801d26652e5fe81c3cbd6c5f1c7f623a83c381b83dcf376a1468abb2b361fca83ab75836b9af214ad2c7345885d715862c4644babb00286fdf0d1db241983c7c229af4ba61877bd7fe36f68dfe13154a1d8f2fe1ebb35e74aaf469f396a473f3e0179dd1178bb72d2d78c63a1359ba71ef4f8f807a70197fc496cdb07790455fce9138c66b514d39422d64e525ba821182c45aa7b5e7b62e7c41977ffbbbd8244a6f425b93f8ec154fd7117086573e2b32f47ce8762cb0d77372fb16f7931b89f2fffe01eb1e151b15c90666e43ff569a6911f10bedcf3a6ce1b7447373c5af5a99cfba74d0000022800000224000002200e155b98cc34c4266fdbd69b82d05435be19cc123d06e9f86dae462029916c7c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a47d9c1f1c7bd2875f78ff10adfe819471a0bf20a41b72960c7cbc93e516eac05c2267af6fc9f69eddca53bed55962ce6e2f43827fdee5d1c2c15b71cd5a02be8e72b505caa2a86caad7d03aba5ea4ff2b03e863c80f108413af7f9984d322b98c2859dfc67d218830c7158f12f1166048d22dd55528142cf7122d9ebfafc1debd614b885d41fa9edc233a0b6f7a5d6e85dbc1036b95124d24d7cee1cd44d337e2a96811f2be53d878256e5837c5a70fa57f29a61f3bc16ae2bfddf3f3f4ed4142d1c5c8b800204d3398724e61f874cae258c55c7fdb81ccdf0a6cd433317e36f6e39d7fd61f8963a7d7bf4d3ab0edc26f2a933f64006da6e44e8e7327bedec153ab7ee5a6cab63c01a56792dfebb4211fea3a096813d97d858283925539958c1a86093dcc0e2b37bfb4532fabff0a3a6d7639ea5922e5364b635e945011a395774ad5ac25a4ea0f539302b5381353c72d2fc29e244a5fdd363288ca36843ce3a212b6770241d63781268fa61d194bf59ec92b085d6b5fb51f375ab2c0280eff184e14a52c9ccd3dabde292775315410465d15e61b1757cf4f07ba4a14aeb7ef6af0e98416033e7a93f58b56250fccefc9e015e5d195cdc3595e30408821ad05000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80208d85d0a964d19f452407901f1ec2ffb48f5f169830b60d61736a2e2208b7b6030507438f2d626b81893e5ea5232d3c68ccc589365e6c977f8079c2ef9dc154e02114e4e37102cb770948795afcefa153eb9b7d674525c2b475a47e7783efee75d0b03c76092453d4a4dc8030f6a9bea3702df57f1c96b9b40fba3b8124bce6fa60000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002416ec077d3a69ecbf518cda45eb5598f2fb91cb6c6ac75e23be5a9f6be38b3f944c27d2922443ebe83bcdfd30f88365e607f7e081ff213067555eeffed81d900f7771325e959e24d8171f8bbb88bceefa43399bd4394c64714bdb02968ed5ee133338fa5562d463fb8337e2a27207157e1717ee0ab3efb39484d6d0e0aca0db6eedbc8f125417167ede51d4a69c11e5aa0ad558f4d24f10db2b79e35b794cb5fce3dda40312f6de8db75fe6d23e7604595f56a86bbd2b2b4b53029591688feebdd00a22f00c2e0189874ec71201ae4734b45d1f2f1e2305db2eaecf3a185f7d9fb2d26a2d5df8be09f196e93ea74a84ccfdcdef6e70febc4f9b5ff08f791e0d500fb4e688fe93f212b527738924cb013f50585fd7092d3f1b6766f86d3693b0a3423c71ae488cdcf04e6b6f09f690068356a316efd21167bfd062c786722fc27a3f6e447bc976394029f7a539c3cdd7037f64e1bec4d2eaa6b6772949222680f6909592d6bfab5da160453408f1bb9c937abf4fa2b35c0688ed3debb30b82e356adc48fc131cf086b55dd569f4d2277a68c568faf9e6444b8d305a883eaf66e00bc54472e6ecaaf263e0d76fe8ed42a0feb1dfc4ec2b4172d28bd68d3dba146195e9cb2bafb92d399d2196bf4e3fdb64a8b696de51301bc85d09772036f3f64000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af9c9a258b31a2dd857c57267b721f5a68ba230ed023d4f5fb4e25bb95909f40f4a65f1ee5c3a67c3254359ec8be1b0a67c7a619190d10ccddc1911f2c6788013ff8ae5f78f329240593092b087c056117a0256ae5bdfbb3df7af25068cf02d0aab2f7db906cb2ce16499bb342345c5b145e8b9935ae4eaca4c09c56e93a5a0e2f1564b045b28574459c8d1a883df347cb517439cbc92469fe67e53fd5a020f29bffdd25d33d7c6203d64d76e89a294399138b92ea176b5c86c3428608a86441b19382a30abdcd3391d2cc2016bfc6bd6b9edc9967d72f98e03cfaade3d3b49e0e8df99a8cb0a23a9469b6bd6f1d4ad11942e43a878a8de76478655845c2b8394e729f185fd0a5e7e98973c3f1922cabf571af0e9335fca9a81dbd870408afa538c94cd05fe5c909aa0acd9e2c16c54db18c04593ea66bc42e7ddec861442437744428f87b6c9af0f1676a7858cf4a32974dff82a9c08da4ddea7b68f42b51c75f4daf9ad24fe097e6090b67af50504987569c7b3b9435fb3403588319d57f087921ab30526e420fe4c682077e34a55096cb3aead1ef13960ffe26399308856d0ffd251ae61c91767cf1fddbf5b0975c86ca9bb80e37066e28c7af7cd8a81eacdb51e95c621be853ee7a9ba5a1394d319a9d53b1f8c1cc6e0987d373db6c636b00000228000002240000022000b722cb3a63a23ce695e6ae3f561ba48a88e3c928b3eab0da9b4f97bebd03fe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000118950d3e84d7b8819b31d9e74d86b17f787c6f32f26daf657eee6d7a48a41bc8c7250f20f14249d50683f37d56cd2ce3a704756826618b23894c97175ed594e826585128200130b53d956637647dba501f6a0a845285f42521648c0c4120d8e162946ac8b7009766dc61741490337941fd9ceb06f67c61d695c23292ae43a5dcd0856763140773c729cff63063a8d19904c0421ffc93301f36b647f7cbb5d84ef8fef8b816a7e0fa59c01034bfd7d6df3e3542b4b844fefafc0879f3870a6a9dd60c512bb2c32eb4e74e4a56a7cc11ebee047f0bcff5be428d40c79964eb463c9af6748c2dba25d8bcc932ffbaca087d0dccc30b002adae1a60b580295cafa1c394bb51df950dbb2d56a5b457fe2917526ee74e3450d28f102644614eafb251253c787451736a9deba357760262e6bdaa6e0f14a5380ad50bf74032d84cd479ec62d99e77fc8c6dd75bf85951c4e890d4644d02aba7326964bbe7f02de009109c84ba6b54981d69dc9a7a8013c92a9ffef7ce8de439e68f5275c13d1426cdd5d94b73cf142e16e7ce79d6651143be800892853d3583edea9b34ea60f38c072f9dab2cec916a685641bc16bd57711c2166ee630e838d2f1ef4781a79e8f0afb6000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802065fd3c1ae728448a94758eab1f2a540ec371d9cb75048d112783d866d0f1ce620dab40aafdec81c8a691f04fb4e7aab402653b595bd88d32bac63709885e5420213d02f2bd7bf932a647377b435faa9329f4e10afae53de3de49ab5f62a78e3420ff763098257823cd9e43a56d057d36cc0d375aa86db44c5b6aa02b033c7c9db0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fe50c64378f8be21e2271a2e6d1675dbe52e38333956c98844054cccd48e332a7ed3460b42872181ee02c7ca2c7925e929a67f8daa116c649a409fd8fb14eed8ee3fc712dd9ff31b98e965fb4450f0b25d630270c58ad831b525ea832e4f59fa29c83d726b4e763a429b5e3db2312438974ec5a971d754ab3ca3b546dd57404a4aae71b5b285572027a81848db5249c3403e2812a169b1c53d7104787642d158aae2cbda587e66d606cad14926061a77be283358ed1ea07fd43a200f00a4e01bee7effa2953777a4080d6fb1ad480ec7865bb0deaf8373878bbe6159e5051f9b9388710220942f4b233b7bdcda722e74ff987aee62c612fdfffa6c218ce51226ccebb0fa422b34410455f6ed27e164df37b70f8f5c8a1cbddc1dfb29cf7d570d3f7feb0b385f5f1d05284d93acf96fa70220bb6ec4f25953ec588011108255b7a8206efd244bc05d32c30e93b2edd364c9f4794e72735609cb3ad10d121d2d4b108d0be13a52bc5d0b7c98d27893e68e3035261a52bbd4ba9ac8d846e2694943e39f32138562d2eb8c42dde42f92b23e8191bf8ce2d736ecae32b4f8e6645194e40b9b87d6e5505352dc05ce0b1a440f415529487a4b7b5da1026ee051e83892d293d710ee81377a7c7efe1cb46262c7f29f7a042f7fc135345d3a3fcc27c2d00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093f787bd7d650f0af7dbe1efaf6a80b3400f239f6465473cb5814d95cfcbfafed42c4449f9612aaa51c9fa9a958b198c85ed9862c0ee8e0a43a0d57209af9777568f5331b66298b584da9a03fd22d0e354ff8f5c0822d0b5e43115eb545156714736a388c7220483248084290dd517b41cc8f9ca4269af79f2d9b1bf8b0555f0ed339ec0846512c299f69f7fc2e72abbb91ce698a531c13a3dac5327f3406f730e5edbaa8f8c0d8ea750899396c6317e4bd6b77273afc8a77a276f9f46251de02ca6ed1ecd971f14cfa955ba167635b302bff82d72585c84f80d096590e80b4cb5d8928bea10eef756a398477cd831f0721644635dab5c00a85c8e00cfd12d5644b38d8cc2c7c574aa32bd95ae5e632da7fcbc293be581d4bbe114ae51b5aa6b895bb10038c69641853f6f34a745b70c1e64138d9ae82a23e61bb40d6b86554fb1924fc5309d48f9f365c80d77304f5c8a00ad9550889fad3c7a7cd4a659bfe687117728db8d1be1966f85ab470e399d118600c71dfd0e6757c694ab206308e77ddace728c28581230cdc3554a0014f5bfa0600cf9a7986e21a33fb1266716b4c72dc8d6d28557ebaed16a2daa2f39aa3f97687272cd5aea1f5ae4a7e7284ab2944a59d58376d23ac07527b2951af3a6856af41ba66aed9eb5bb2416d25d78e60000022800000224000002202e3f13166416695c2900463c52a54d956b528704c66c709ea500e3bb6f11c84a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d7c3120c860b145a5536fcec6ae079f8bfb60b10537aca38ae61a72da8528e8918936fc88c9b42961956182b7c3957d744713f60f7103803e92c43f1df849679c5a5cef306873702a4357e10f012a72239084515c2789066656267eadfebb5f5c7e929a47816e228caa5fb46e091caccfd551e3a51aade195f901caf4e3a2c775a9d261f3a0fcf5b9b4e0b428598713b4675490298862ee6a5092bbe2440d92c5eb05f06db563583577720704b7927786e310f92f2dccd84d222f12ad2a1751dc1bce13a69d7f6a14446f11c62096c8d6dadf36da71a7473e0b4d431241876e88d05bfad351eaf195b0fe564380f7b6c45c1e9d313d4c5df36f5bb258753ec91df30a266e07177a5a370244042b524846ac7e2bf44224b03a80ad0e5a4f5f341b6c77ff8e86b05bc3b7685b402f73b59ae72c0964ced16b0b581c81007827e87e0efe2cb482a8091f1eff88869a3b4c1bf3a6fce1a6e78b30a21710e0a745251dc3df43ac1d53afd595f59c6d36f794d70cc6b6dd6fe960ba0bd7aa76407c9801af2b6d1d7ef64b0bce5d98bd4f1dddab71b691712d14d61cfd0f9d71e990da84433d801432ade9c13207b44f17a372fd451f9ec1ed223456e90c9ca197ca70000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80226df24f03362bee2eba4f088ce705630272bdbb3203b2101d677e1e61ca6949826e8abcec7ebfc5698ec9a77ac1b357c680b93119799ab42c93a606dea75df2c0213d7479e6e4ede13971e2226bd08e1397d9f15a4966910fbfc07dad83903b8bc10f84d064178db48fbc8d7ef9d855a1fcc408910b2f6283cd09f461bb0cf0e510000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bd5c83affd7e05be098125589ac76c9537c9cf187cb6bec603c3591308865c30f81ce4268388cc9385917417a72f627cb560d9bd0ab12af1927938b3bf5a648fb0161c7b669edde89c8c046c52791b65a12541e0c104228702dc266c0a024055707653b83614ef9f71ce40da5a5a6bf1c2f81f6afe1f046099f10b44adb13131eef64d6d11e29aaacf6f37b27aa8ef1d8f18fcf5d6aafe19d3cbf2e2b7c1e6a2fa4ef3e8f3a62ccc6e28fe9bf799fcbab4be7d898f482ce40d39124037ccb257b74c3893c4a0b70487e8e0198f0e3de0d0418ca756dc58538f73708505d0e9c7f633674d724e3277270415ab5f127fa8c9cca2c944f270a2f2e91b0c8cdb43a192f07d8c465f1dc4c235c18aafbebf1c1baa2bce261fd1660512ccb08777835a4e4d6c4fef9269bffe75b859c38ae43af04492f5aa98c9c1181426303ce0dbeecd16ccac1ad482fd2a00709f7dfe20844ecea28f728793ed3ef0041c0730e1aeaa4ed60bef040310950af06699626a1bf9d0d3fafe557680682a82972a46ba739fd1f6c2b86f19b64629cb2b9be9ccb8315545d9bc631961b2d262d3e7c8dbedcb03fa230a3fc7e604b268917433b52327c63e6ba2c1bf1ae6e50f3be9330e561902bfe9282e0294ce6222347045750b5a97cba219c6f9a86c5cdf99b7d56b90000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d585107f752e4c1776774ddcb84dd0a4ec767be6e89d005a4dab662df91fd33ca6b7bf239f12af50b22acb84e9888b3c3019a735d99ff586e4d9a53195efea5959196267a0a7e7c52c616774661f4edaf59759e6005d499038a2eca51184db44a92c80f98a4ebbc56508cf5fba96ed789ed4028957b77e13e7d292f887df23461f3eb644c7239f769ad499a0839b3237352607923323b0fc70ba1359d7be099133a32b9b9991a8907935c362e98907ad6c4954e6b251aa41f991c836ff419d92d0fb04b6e4732fb77a33e990a5b7a89b86957ff25e775882791607995daf67c96710d2a3d80e72e5b2352e21663ad712cbae9aa16fb536b883ba931b8536ae2408723dbc83f028e663251212943987f8dcc1cd081d252228417345e066a4b2ba1ed8f8d3bae9cbb5a5610df65b7ba47421400cee1d76661ce8f0091bed5736b32cf00228350184bdcb2f916f52f580e802091cc74b4cdbe7fb29a8b1c0d1ebf11ef1773182ede87c1a0a11a72d7302274cf5769d4f533859058be5247c9e004985a02bf6381649d4e0e99d4febc83cc14fb3c04a82fbe3b5da403e7d064dd7763540da0f37dabd654cb2c5bd739cef2c41f88e6b45e78f0a19d8fb2c5c3cf7ed76c18469938449b0b4940efbf704d12dd9d85a129040e6bf605243f18f09a48000002280000022400000220068d16da1dbe6ca8e57b2d7f63e70f18eabc6f7d20504be15e6645466c1ae37500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000188c1aca616570a3d635484c4ebeb72980fd292fb15edf526546311b7fd7edb2a5d5b16dd5999799eba7071b864f1493ebd28d13c0c4d50b6cd11da059ef63464f1f2df7b29be88c2a8cee114937ff61d1409b808450b1f6c59df3da32d1d4b4a6289c1ab3a832ff74fa6344dbb92386dea2ae7b716ca620befcbec9d3f55070aedb8a9e886e41fcfeff78c99f1e9caf422808fa9e5c32559fc540aacdc1663121182d42c8692d8c47563c17891475c047518c4f3b6e656188002d0b61094325659b4c2e444059e6b28464c32c84628f3e731a98282b3a868c75027fd4406ce7dc04840aad54af2695ad04d9fb1df85b97f6af27eef1f6f5afabb56828ab89e2cb02af97e868cd013f0810f146fe30aa502985764c579a84746307cf0446f9a847c2a07254e4759516eb60b6f2f7daa536468777a20b68bc9e3225c75f3c49524354699cb5396fb49a9688c609e939918cf148884a8ebc24c5786a9fd2abd118894cd891c28edc4a725a1cc2509ad529d0014a90d041f173cf14c6c018568c79f7e39118e7af120283b9ded7e2da894955f719057e26245f75c5f3ed055e5afe0bd00bafc5c21808bc72bffaad4b97e5246a4257e136a6266ca976ee229af844000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40122a167811cd07b736b7ab067f9ebbdf0d9a7082d8e0de37e14ecdbd8b1a9ed040215f4fdaeb9cb29acbbd69cc963cad819e4c47b7f1c1b466d88b036dc6868f2051f7fb90d6918dff822479d4f9c187f1718014121de3c4fb655a7d2fc590d02f8000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ab2f632d6e2f15c50e2603b256144e75c3c8a395d8ac1867ab9d3eb9c9c8fe98345bf3de233febbd961a825b1966c8f97965c17e09d3d0b21cb436336ecfd8353b602d0d77f8e555aa87affe31ed6249910c210f14d4156a10550a4c950233b6db12b1e67d60c85ef85292e6d1a2c031eba9a58dd828258364f42b0e52df51b8f54efdb29ae83321b94bdab06de83d871f9e34b396263cf4b19d98c6c0c8a7f85fc7be9d2fe31ba728fd66a688656e5363c7a498e59774804f3f9797ab8104b69720ad1b5bfc06e0329236c668d611c4c71419ca7594d60ab93644ff3a4a902e5e624c50f934ed102fbf7677a74e0fe8137a21e98eba4a31aa910f1db35283d7882adb3433279028db550eb8bfbb9221025c684eac71bd8a1c4c3745c29ea3d244882af5f563999c17420c5d9d5f86543baead96300536668e693c1a8cc3c1306721fa5c12c861ff784b9f0e15c9fca3a87cc5db86f80bfb83aaeebf0b51300fe7955fce1e3c499611f727f2c9b8328032e07772f934e0fc992f368f47b17cecb2123eb2690329771aff4f6b7f5610370c362feadc09c8257563742598783b5a68bb9782b3fa874108c77ea33065b800cc794570c9d171cc451ee3563068ca711a7be75b364cfc6d8c3f211327ea6479a63d3c675ecfec1e26aa1e64fac01ae0000022800000224000002202ab8782e530d137b9386500cbfab4ee551f5516fb09c7149bac91312173dab69000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ebd020fc470ca5da50ffee7207ea6ffb374ac636e6b62a49cc6eb3f00846a82b26e68c89853ac24eaa8386a7232cfaed146b528063404b76cd82fc4346f28bd1ea21d52703ab2f969ab9d210d27677aad03f5dbde7a4cc0cdfb2ce66066e7f21e7e8b135a852209ca0bf4fb0cd595e89ff768ac798b3737d585f443051a8687bab5f8c3c72535c986589b320f7702633559d8eb8d339e83fe41ce9289daf56d9260f4498da1747a18738cb2eae2f796e7ebda89e490ce353b6ff482b9c354b7c714bce419ad3d2c4735509f161c26f99cfd793101ea810f768533db34f9faa1c7c15fe6ddc275462bf74c3750b9380ef5f4df2e1a33b6cf0881454b358c4b1ddd9904a45ed37c7366c240bfcf546e04c26be2d572c9e4462e9a9fe02244e05ecca00b18dac6c83ba7856ce690528e3a406309a946830230096735312ec5e1616ebed37811de8d03422ad8ca935321ea678083bcf5c441b6c8663321db852105c7f0048463a82091c9dbe888700c217b060b56f5a7f944d9f27fe897e4362901c521e06addfbdba053d562632c0bf780510adc1259f46bcf96704a20d5783c1477ec379b52b9b554e65fa37931e94da5cd453c67166a4f12b5da2bd44c0a2f26000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40118c7b50c4b205e3e62fd4030e471f36b34cf6cf3abdca555899185c86f809d450218ccd6401723ca52983f026e057ff3accedf205fa7c71a4b741492180ac3e03f251d8bfbd2b9c327d21ed84f65fae228f03e1e502b9f67920571e12030bfb59100000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adca84898cb7bc3a1fbc36430bb72ac4b03e1feb8241aca7d655b3f6d7a917a5043a14f793c52c7ffc35e6bb685073473e96c16adf37cc85eedc9a22808959728bf16baee4c2aec661c3ee7701984197307cc7246b3dd7b2efa76085c48974a6d3e0c255b1e5f1f367fefa94635ad823f8cfc1296fdd9f61c5bec0b5b04e9abb32d5520c6402922dfcc12edb1893e7966b3c9859f0f6724c4b8d8cb43bb87c8b8a1f32786ee4fb8ebb7e36ba009a062e932ddac9b1bc723943f1dbde1d417b32aa05514260d12b307caf8983541b8cde7216f82bd73eea67e3637bc091f63f8d0c87684a7c4c89c540105fed6b4b7b684eba093e8766fa01cb7b95f3e328751a30add0e3d8ce5a595facf4d7c6b3e32fd30847674089e4b5f8394e3c015f187c9ea99245e83095daa992f53c302524c95269a530afa34c332fb4decac8f1e1493d762ff86d4ba4dc3265463cfde6edc1d7411ee0e3d1bee4b59deef874bb294171ff22c49cdee7d76243be3f09d7264bc9786ad5a01f69274b9ece21865729e67ee5c768f36de15b1e02bdae7336d7841d2fd357d6a0cca3e2c7674080e13803a2930e59c27923fd8348035ce6144fbd553d127e8a4178b640a54b1c8623f3056633d1bfb2c492f213ccaa2415c58e008c9e8f34c69c341680d376fdf2fca3d300000228000002240000022029cdae35ae4a6a26ec96f3fb207100729650c0f05f0ada632f31777f2a6a204e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002920cb49f0486fecedf6154ee878ae36d6bdf65e28cc43fd30d41bc11da954729aee5d6485cd3bbdcd866d5d3b8ceb70343f7bf8cbec4bfb1af00ce358e5c91a358758df170f4c9d0b982fdf67aaa96f61d58e8b86ee83b7beff7227fb82699ee676d34fd647c4a702862154a933aa239b18498f2a06a5613cda6d164064db9a588b382b9ce33a462e53b3ac15f1601c9b7bb79128a95667210e86c2362ad9dbdda232d75094bf5cca33fd2a18fe13a8971420c03079f2b0ef90bae7976e14fb236bc6f620ffd70902ce4987db505d34628ef7f2072b58789a90e2b18b211c8af96f4c02f3710c6dcb975138d80d2a26f5af9b3c02e2a0f6cf4d00598ab3e19bae9ea4df44f9d3d6b658f9de7b7109185dadf740c182618fdad3b3182da66b6c02e00591f0654fc447e5ea1e1712f2f879ed4d1c582c10d0420d514c639224702b0a4ac708c6c47cb484f82cacd6584dcd5c93a7fa34c51daf431c0672c9d204422d6b3eb563ce7b668ecb9853cb24d7d57116e55b43b2aed8798c05890fbb8c0e0bd746d4afdbfe1ad81b2edb0fadd6b1bf73999e0841e3b5387976dde28366798d32c41acdcb164a858a743111f2fa097a9dcfed0177b652810730d2696efc000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802286b91027bb44b82f76564fbc7a5e1361b70697c052ee25e9825311f134c7e661c999c053adaf6ffdfc26a970aaf8a75fbda50082bfd41cadaf57cfa5ec4249d0219563cd5e4d9629d9b9b1a0376eeaae456922ddf7d612bd1b4c275c4a79bbabe2df9fee7320cfcb1f095af726a467976ec19f7b3448bc8315de47fab8672dc920000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d24e0b56025e3966b477400e435f24a3b006d55a0b3dc20a4f962ddaa1e086ca500ce1c23b047f393d66f9a45a51273744a93a34e56e68904aeac11defcbb8247642e9245080931e1dfe5b4b80fea9bc83a0908b5f8296b4f27aaa471623cd3af2d80722c4c7b4333ce09ed756df4fc6ae34547b5ed6cde96980898ff4f22a4761526b607c2f53ad4615b66d6d24e790af316f272a78e08610a6a6a886b4012080df961f1a00c1eb95ea36b477a3475fb0d4797561cc1f56e01c0b95d240e12f6373521b5b98fc83731bf89f2d15262d72bff7d80d90458fd88e0916edc9b89a9be867d2ce22002dcc269051328d81d33a60c2017091b74ef353b7850ed16bcf69ccee7801944aa7418a84d817452a43dbbdd2789c57a8dc8689e96a3599e2512322f9759aff071fe1b95d615babb5950369a274ceef52f8487c4e56733ca13bcd03803331ba82e54e0525bd8f2153c1ccfe6b89c154eacda35dc2cc80a5c9126fd62cabb6725dd6fdeccd8e26d809f486a14e81461706bf64cc9f566d667627704bd4b6bd8613d832fdd9e8413c59568d0309b4a3fa200c927534d84fccba246b3195f52739120bd558b9ef4093fac8cf0cb7a3a6dcead904fa79afc35e0ae51fad751dda86c303f5531ee6aa8a9d7be9220c6e3c88937f54bba78c4d3657e000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a927a8b2c4fbd44f1e2065aa450eca51bef7f53b77047572267165ffc3780346bc40ac3ca8dd962cc19621ff26027e27d083f327d1023f55bae081abf48ce0f0fbb1269559fd44ffb69c0ca77694830e4148b01d5c36ca4ab624268f9f09a2e16f1c7d246e76e28f29b3ec135256e1528603ac7ba862bd692dd52ba08f1958b8ae103b77b3cc4e26b8fedb0e32569704c85631bb69f4d874bdc0e94681b941e0d7ea1369ff9dbae8433b4c3b24b9d2c181f067042c4d01727980e3e89803c28fbe726ea82af4670cdf42b3645fc4d3bd6219c42891926d6d228a178009e59122b0e127c3956d29c00749cbd099b6383282dbf694bbabe28262e918004f515c5cf177ea6ffcb6249b89fba6986d38ef636f2bff43a0e0fbba3db285d925ff458d3aa4cec267f42ccfc77da1677af4451c381bd8c783c1077f52bd3bd310c55a51e8d94b6917dd27987518504dfa7eaf168f55687f58731dbcd090e3acf8599bb3d417e16a9006e1312aab99ab4663778205f8fd0b1212855ebde3ed74c0a2a8cf2c12eda4290ee6dcbac5091e5afa37d2b5010a57596fe217b1fc55208e7c174e26f9139b8e2d353eb3792bc1d659e23ec0a8c9ccbb125ee98a4025ca9467324c972ed620620597785d466ed0d33d3e3ead1321a36fe28eeb63c0894d60b90bbd0000022800000224000002202aa8f8b6c6ced0a8246ea993c174eb157d54e482d454d4ac5b92c64452205b29000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0db8806a5e61cca89126b9e2eb92da3ca457a28a3641720169b3cb1edd06d5241e7d8cbd637b7a0fc77362a09624dc2a1501bb3d0bbefb09d51d694e73cd0e4551d00b772719d71e15a7b52af402ec82713451086795b4840f5115b107a1b7aa27d99fb39c63f6cc5cfc7dd67ed41f59fca9980358aace85aa5aa121db35c853097fe511962bb4396ae01bb29850ad4e33131533aeeea6ff407c5271ce4250bffbb0efedbfa5db8d84ce9dc6468f283d1586584969160ea99ee049617a62173cdcfd2562877c1b967bc3b94e780096fdcdc26e8ca282f8d00927510d7a389c431ef3080b2b359dd4a1c5a120a3050840b2c4df0951bbd0e428743146fe3729c8569b7c51d5fbad474562a927fdeb65a546fee6697b924dd2e15b8dd82e5d82872fa6a2014716141cdc0573d608c7fd15ae03fb15ae1f45ab0a73675b53fb575fb2ece8cc4d590ea411796779f95c52dd2f1d851f868dd558b14ab6bfb59b310bff7233c8f4230d771814dce28a9e9a2a9dcda2176bd843bb087c5006bff6c0faf3988b27306f6cc13e4941b7c42d5607bf92142efca1588573657a44efe3327966972678baa230db9984734a76a58ee7d656f4093334b897853ec22ccb77c4000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802224b9c054428a50873fd2635f454c1cf75626c9f511d846827cfe1046027c55824f39ef4a7c50cf8cbfa05041fdee955516b76c3676c5e5ba2170862f9337783021a176d7cf8424b0a6263809ca6943605d03c4c99706ad97941af61f7860de6462e53113a7fc3be86a16abb878ce663a74d6e858abf3d80c5c0d950afc4e91dce0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae72f7cf952eac8cf119c30fb3a97b911f0bb75f8d3acd698bf10046dfcbc17376107e18552dcf01c986b8b28a86282061a5ac793b88b15625e9712e056518e6988a559b70bf1caba142da284e700c32f2c5fca9f4ec2f2c0042734fdb8f636fad1400deae0fd29956eb09cf3bb7ef262f6c934b257068996f3f166161c345ab9a31b7eb0965ffdd3aa06af3f969974377cf465a00d4bc02e872795e5b7dc8858ebd8fdd2ac6a6694ae111ffb35325bf015f474694a5f45d77bd0d9072499c9929c95e4e29c140337cfc744a80f76f34d61e5afde85d010153f2520281e7270e91fac74f33741a18144c3bac7eb8f32fe04c5346b6e4599513d4c841ec034e68b4351be46b474348624610b569a10a081c524bb5aee5731bedd2a5c2ae395cc6d51386b97f61d29fca249193e5f3206ba36aa38665ce25d8895a83bb4c9956cb2b29ec56b3afcde525aa0219708793db2d1e188676e66834b8823199e10c653a5a2282695c0c0eb01ae0d1133d17c393b06526bb3794d71fa9f6cddcd8cb6b8ebf8ca2819afaa6e9958ed9b097327d6ebfd980bf3f8874077746a2d6c4d7dd344d1de3c52ae83ccf0d4a7cc981f81ececb8e7584daa46f05c72f30cbfb41c09122e833bc4c88841619bc4460edb827f3085f8f219bfb39c6f13f42c8e3c07bc5000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae3de13d3f9183ac81bc5c47bea1f8cf2838811e18a51f29df90368a32d5f8cfa6485ee327b4af3165bc793c09d7168f2498a8742c827f525fc41a87d8996dec37289d1baa8ff26c9016308258c2c77b2273df68477ae08fce282c06ef2b48011c396f8e9696dab20e9433421b6b78c17db52b3877b1e023d5b89491125e95c6a44939f3ecb9378cab31323af05320ba1d596ddd4f054b7959cb600f8d5da2f091920d4add05994033a6637440c9e15df8fa66a457bd1aef1490048724934eb0dcbcc038dfd2cedbcc4b46cecc7bcebacfb3d213699e3157db1fae277db9dbe8bfffd6fa2c012cbf613a52fc051c6f877c04ebb85f0aa166effbd6e976db804cab64bea371d05dd0d4f0f62ffc257e3abe839fc903b73ad39bda35d61040f92521cdfd98e5353bea29883e555b6926cd4653ed750b3fce951956f48bbda64546d9df1a6b0d4a897f12da485f1dd8056423b23d8efd5dbbd62d07efef6bcddf7bae9f211d7e0f4227187a9c0fa12d699260e1cfe77f3202681ec534e64a296f6b6d1edbf676d2d9569942a41344eaab16ae06c23f0e43a7137ae7ac3ca580065293ff0b086c326980e2601cd4c17f906d21987b97436e6f2019626e25366161212abe6ba235719a8a71c78fbac58a998063d4ae559253fb7959496eb43ccb0c7f0000022800000224000002201244b47b80e8e23d241ac59dbcbc935990b8d188ada1e4c72f143bf29d5393de000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d882bb28df7eb4fcf117db456c4b8d3cc37f10bce88f96557a7d7ef016a7fefbad8128562fbc6c0140a8074e19f16370428a803f718f466990f1e44093b8740ec2cdb41f6f0df767658bca9dfd59b729c35531c748985d1962115937d5584674fb7c91644de2d854c4988c18d00d307ad2f10a6931bece72c0e994a562b88d1b3070199e441f63adf5028fcc260e03836c878a15806542c8f93e55928dde029824159044c615f7e42fed72910e72d066d4d03ce911bcdf64619ac49d5480eab1f7fe4782e3004962ffadc5fd09e3564cf873d82360df4e4d7ba81d9d8dd2aae3bbaffe902e410894207bfb8c3d807a9b354f633bdcc6e1781b5281982abc138fef639981d8da6ca6ee838abb9369b8da3531913194d70580be4c7dc5ce729789d7ccad13c86753cd6ad256fd3e1c3d3fa0da5811374e5d4e350cfe8f41d6496aa017f402774cde1b2f8d9112b019e9b5df155d76d4e608d2ba49cc2e4b6131173b6e7efd3ee16bfba55e287159adbf261be0d9bccaeb83bc3ad2eb800f49fc2f129f827b1749aa8043cd79ac8d7ce772fb369ca03536ff93c6e4ebd6a9801601c914deffe25878f967e7549214d32dc22af53b36409a65dbf740b94fad4fd4f000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020e5a3d97a877144de90c2b6c6fcc10496f2af610ff85bad51718af54ed76de591ed4806d9a10c23b7880ad4095c9b4c1810e0dc419d3439c6727046164004323021b5ef8b6920ac24d20158159f6b542fcf3462b512eabb143330334c77c6d06a9276673d75a2b964531762d4b38e4f77f82b2719a40e2ec858f6bb2b67fed6b710000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f0b7ee47de7c0c93a588f0d5c1d63bc7e6d86412ec11c381410534922e6366985d58bba38d3f265c982c7b376beed51f6f47450a7f0cc843c997d90c79bf00cef88ce48defe8c960b6ce3eb7bcdb2bc009b8127b689bb688ecef03d6152c2f9b7733e7bdfcf0c97e40146a8448de47b27ad23c782de6983cffdeb347e30eeea05507ad1e18819d95d4d1edaceaf14602aaa3688abc87675b813cee441f56bac72c611f2741cc79cbec6b9352084ae6dfeace6a3aec0d27abff70578986a5aa98455f2ef91b30d8c9e6de7dd75935206070b7aad13705472cdb355a10973be2b022640aca19c193b6243fb7d49ce84e41586a5e71626dcbfbe824ed7f406862560e10cef9c4b10b4010c98d6c5ca0d37c404231e2a509d8dd48f5fd4bf5712f46928b8f45c7957e91f2fad74967cdc27f03468da2a559da78c60e1dc2b23d7861b3a4bbf1f285fa43398e205c0c21b6c0691624e88982a6e381e4404074da71654eac35bd34388140214110301d42bd8c11d04ec4b0dcfcd35c030d01ddc92cb7a9212ed6717101e3fc0add57a01b73879f4a956c80b036d64cc2c0efae39511516beb589daacc95ff11dd78dc71fa11f50493a297f8908b50de5e65db7aa909066c1c1409e64c5fa696ced6e853a25010be3fe91ec6dc6bd159e0e1077295b300000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022640c94acaad9aefdea370fd0d52c5c8d350ff71c4f7e90b67f9f36b4d8d46648a51b96d88aabaa1b09845bc6c41ffa66687cffb839e40f5dc3733c068181d5e1deaddfde086cac2190f0e650601132a98f823c8a2bb8a9dad61e3ea96adbc77b23758fb65d6dfe304c5aaf0d12eceb0bd125ad3e460585e5e01d76101722955530582f70dcb8b77b95579aa191684c5058383d9f0947e292befd9387643c8327610cf2ebf97ff31c000f33dde68cf3d80d0b2f43578ab9636d2d7b08a094bf05e392c3544da29d363b4fdf2bea0fd6b8d5a4a44cf869a68f9c5464c8a177ebaf3590b4bfa5632a14601f57cf4e5356a0e52ce8d4a6899db1ca206574ea86c184918f982be01e846852c06b74eb40136de4df88660a2678ad6ec12269fe70102b06b098ddc06ceb356eba0e009b8f15c1ab989689bc9b39dab3bf0a99ba857ad8388275c7704b8bd701fedf2d948ee8d77a0a1747af2cce607da67e5d7ddc09afab010a7f19e0069702f1d1ac59581132f7af3445fd38d7adbacd3a9a31b3c77c675d5c23e5a0da64b8039f52d58ff9d57edb47d968d7a257a804f2386b2eedaf8a42c5636edd7d7a4e7a6b434c09e5d2364584e39374a0d714ab8d294f4ad8270b36bb12b011dfe6a6714de7e90c211afb0f769e74ce639b3a3b24dc33ff84000002280000022400000220265823afd81d6c76e412ae6202cc70643bad1377003321774ba93a73208c80cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009573f95e1cb089d0cd95686be18cb319df040977b08dc7492470efd03a0e4a80056715ea17635222169750a0dd488fcfbe79f3d190d86d6b397a47d3cc56364c8b8247edcc6d6ec75864b76c0d63ffb164c8a78ea60b9f32c097b268d78da4834ec20b5769cefad143344dd2b8781f9e56e2f11646efc727cc7e758ae0ae162ed8f38eef3b43953ac57b82694ad6118249b3d33c8907edc86b83707acec7d0ac3545b03f385a6f7e441d6c53025a9feff861d9398da81c3c1c3bd3ac30b8074f4bcc41a7df42bf49a8596b36997a6fec0efecc0b37f892cc9c817f49a44b3ba3f6515e8c31e6db3beda53212a206ec8f844094f74e0cd04390534b3be34f9d572c12111f27fa2de0937b2a62ad2154aad357e04e49122ae85298d244b94845c5a4f0c3c5d7117ee8736f3154c4019e93e602b19d3a21c8b170cc0181da1b0b8e34f428a914303cbfb957bd7cadc2488bd96df66f3d3eb2a676e698cb1a4d3bcd6023f3964a353f3451f125bf5fa58e07c1aa446da9dd97a48e67e7dd0e533cd9f0cb426ed7df1748e4f09b2e80bae9fff264c80176df2bde4c802c929e56f4023c705a2dea4fa64418325107406e43934eda5ce681860dc989c73b0544f9dc37000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012d7fed01c807c0922e2e2b0c919f3c85787a30f50c284e56696cc9b81051c69b021bd73f3b4e4a234668643bf99accd5190af4f491d60564c8f21531fa03a1d0a62a91ebe5b9f9bea2a26900eed525613487af33ce0590a31e1079d2ec712b1aba00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000301c65edc2433a376301bba2291e63c3b6f9061691b1b0c0576c03334dcd854a6b73091a9685ceb3f13ff30756eca5e7189655ffb44c7fa8922030c74c078ad18f4984622a6f6f45a3b4eef9f21b972cfb5c5cba6e3f94dfcf7e6a91d7824b957bedb9d4373117a49e0c5929f092a103a6bfac7d50735873e499a9d7e097bbe76b13e7fa21740c4ac8ea5d9e7eb9fb4f51aa464718878ef9b261d8ee3e572cbb545d5f5a54c5746e44e2cc2e9457db3950fe615db46c492851dcca6c32013ce1448786bf8c835428b44112f888a0bf6244284a900cbdb8d41a77438f1046e906369e320673719568a6b1c9ca246f373c4daf2c13c5f38470bcbaf9a587e607a0110196e865c164f4029008cba410d7f1433a2c614c2885e65ca70bf47675b0fa117ff0ca2e3df00881559fd587e6be09191c066a1e2071ee8b4e266a6c2639faa8139e2086624aa3b12789c774cbb2cfd0edec3bb39a346749a36c5d9574cd6c2e58ec6140f465b2bc349bef4255d2d4aac288664a891c0c976578e1ea2751da30963d506a8c6a4956f35f631cf6caae0a53e2aa3269a59d82206031ea1ba454d693af0b625444a25fddb72723e67f0f5f8ef6cbce497a88c03459574bc912085c1cb14a360e15246c3a5e3c96fe4304c001f719bf391dc8231e9aed0d8ef3140000022800000224000002202264de86d509130eed517f81d517a2323e6972c084ba7bab59e226733f9c0e250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093bbf58b2d44e36462cefaab374c01c93f2869b56076b4a7a0ab8074d1cc3786bc86363e6f7d3f2ad74fd3ad65c808763a34f1ff97f1344ff389c506778837d39a2d2b11804f98608570deae959f4c5ae7025f60132d096f9923b017ab3ffc7103694f6d1b6eb947eb5a7d1a11a593caae6f7f0b4ce05117bb1aa31059226606f0be240d2b3b7b486387edad9149febd9da4decd7ea66ebeaed0fdba1d118af3438ef5e1fdca70e540691f2f182b80601228dce2a7b0761a67a31a990b553ef9989e70ddd2dd5e46e65ce65e3ec77b7b0d20f752e748d5edb746e4b1bdc0d7611bcc167fb3d0aee92e9a7674678802121740b22dea7d0b60e70adaa9eff4b93eb92698ef8e9b9465ee94a950f820c619ff9f1ec19e5a61da1a2c88043b89b8d56216316bcdbd432d45a9e8129a634b93517172a6124fc272b3cc595a0b8f6f7bfe0e8ec15e690ec6636974eef765baa3e632b1a14dc677d2d18c59dfaee24bf5223e4e3117f2dfd520195af024c0944dfe5f9cfcbb33938172e250aa636af9a46251eef3988a52b5c6cf7a1f1c5ac4c3acf4ebd0bd26974a21c3df750e828c0d787c16f900ce91ce775f3a294d3e26b6c2fd4fa467ed646b05bffafbde952fbd000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40117e63500ce4a22c2f260e50097040d617306f8fc54fc610b2b80bd67241dc686021fa36867f3473319f14294ea86764dfd3d09cdba034172b6c3d1c3917fecd9341c6b9031307ac6a5eae44ddc53e53e8ab7d5756ea82e62269594e13cd8a044000000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008dc962432ed30d9c30551c504ec4e92f303b3b94f763b8a6595d79a3d421c53c403dd7f42b67bf3c2eeb023f16ff451af3a647b6ac0064eaa7462acd4e911bb09238735eb7ead5adc82f2e2654bf3add0cdb1eb3720b1b78580e7b954c82c2a731656117a6850cc06065f067bedb85cf820487bc5372ed07a8ed97740613142f46f6f999499fd773be2c3663b14350772f881bcc6fcc372cd1b11180860cbf22ab996bdab242cf2096ae72c95de253e5ac7ba0e77ee19faf8c4f5340bed0a4c95daac7227690e0938f6c76d39c48632d0cbdbeed8e57184c4eb0f22fa7b158b81259eee47f4eb1a3bbcf86c9ab3f2822d33c55bd30f49e609ec812508fa5103da7a0b25c25ef17ccf534a67f969255f517bfe23b93426361036c95e9053c3fd59b5b7c57b31030a5033131d0549f9a74f902cb69217bd20da4b3e90398334af6f499ddc55fcc72d3e09ef10b0b639f647233b0aa36ddb1dfd0edc04593da7a330d7878b44a3f43515f964a958b1d31757f64f290720b49f82900bef7872ce470fa02904845ca230326f8a2e5b726947c1a901b14cb4345439b9749ba9089cbc057df334c0c8ccf43fd1a7657101a3d33e97a4c56d4c07df0c1abaeac5e41969d5054c5a9919e299e6ab72d37b136a50e8da9c61fddce1ddbd663af777a5cb0f0000022800000224000002202f386de2b7fe2228ccc72ddb394a9b2c6834e00f7becbab9c40773d1b1e82424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16b2b1113c875660e816036f30109bf54b9d604076abf01a658012b14c4d7774e2d4c4e39a3d2f4715b0e1381f8301e8ab3331744e10dcbc56dfaf3c35785e6c4eb3350895e6576633d1d86afbc89847d88f03db8991e8e394ba24c6c600a022193dd9b5a4f18d4a831ba7c68b7fbf384177dbe62455d9df8786ef051a6252f78145e5bd869441d3fe1be562ad7f1b7a2c13ac0157fb998d23b3a808e81784f22637a4e660c298b187b4b59a8c57e8a4d75234ceca7007e76df26b761a622ab5fb512999c2778335cd70fd1c3ca2718de8d60dfda10c01e4587b2310af7a9294cbbf0115b7f43e4653f87d2ed8bae3d2204157bcad27eb4f6124a59322d82576010e8b832d6364ac34c0960a7d3d56fd71360fda14f00dd2acddd6feab8e81355afaf89c56f77218cb39e94f2bb4fc347a70ebeadba7afa754ea109d32dbb964831c92141a0d5dbd013cfc7c546cfabbc73dab08513bba2e594f01db81dc905111c52e29bfe9f684f3bbde332a94a00e579e0864f03c75fc7c6e4ebc4d7076ba5d41e214b3d4d732cff398129c7d2be9929184b3a44b3f538fa6d2d7ac80fb7b6f6e98d5c5bffa86bcf1b195aea467d9f4c686e0c50425e73fc91d1918bffa000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021ec0052df33a3fb410e2fe16d862f83852babf74f5e7ff81655a9cb5510460ae077095c9ccaf516e718d99fb495bf8d5cf0f2ac674f1dc32c52a0ce2056055de021fd4ccebe757e38cb9743e81249f2bc5f81aa2ab46251bb9fb5626605c16149502e07a18abae1c3df29f7e6f7f0723fb5d1d30ea787e8e12ad807ada784636b00000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005736de20ff7c542a5a2cf22eb9c25ed6f73762e766c09c1e7a0c867a186fa0897bf13c55b42fd8012d515e35364034180045dfcad7ad9263997a541d69a020605ca68d5c27e7931f9024a5dbd15eba1cdf81e18d1439675bc609b66dcbe8fd4a6798fc9552b2d2cb486be4ee41c5075dee5dc8d6e6e9e4065d413e62c982cd3ae6e7ff6db9070e53fdba5c109548b5022d4e63fd023652f0d1fffc6b07c85491cb24f9cce32766c3fa1c35d74bd6b45bbedcf9d7eb398d4ffa3acb95b9d5c63f9dc03db863c2bad3d9eb4b7bafdf8739751fb14465d424ddb5faa428e5c6def9905439950612b5841d455518933fcec08a5b1ef92573570261c0bba52afb09f8fa749b8677485915acf3895d1111e8d5e6a9c4ab4a73f8b8d1f8394a104c43f51cb3ce21c54aa3d4e992f4fc45fdc4a31276e0197ed847561f8155c6ffbee4eafae642f83322532a8b3d893df9329992f14df94ed3dff813b4cfccb9d2c9902f41507c9f6960040b2132b228c3bfad73661919e2d679f9b544ffcaa44d1efc4aea03fe46df8a55473df3eaa46996d7efa9ff72005bcbf891265cf716bf3a021877dc2a5baef3aa7690914c36baf97c51a0cc8f51dbbd09b3a36b59eacc21269b412ea34e7382786e506fd0411eed621e59beb14c6c98708d6145d35a9a38ff4000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a08e7676fe4b9a3b4f536abb1ca02b85e1e1be93d11c9a87dd65eb85b3257133b14fe1525017d323aff9af1a17127cfcea900b512564745f230944a866639e06edecbf5b98ef59c543a659567018b50a7f42daf1a25735104da6b0b12383c7778d0850b56ae6f676b0060cf93927b3ec457241e31834ad15f1ac0d2e463cb0b48b7546efcd2c0093739ea7ea8b03bf52d23b2ffb8975326ce71317dc37a2d8561051c6d031d212febb9b31e894325984f18de7f839c5dde5889e75b75d3600d5d92125cc5d087b565e14bbb9ef7e4d3aec053c269ab4f35f58404e367394469a54b71e43ba8043c7565116f088a2b4ebba6c6bff7f8ec2a9805b1b180c76cab3f023f1a2c7dbb3059b71711bcc45668d1f605b2851e4c9688ecf43d68c80157384fc152f4f747237c4ff3df0ddf338852591b0f23ba0b0e5c3a43cae6882210d0119b512cf18167ad6fedfac89fc2a952851463d0b63aeb858e05f3bdf68a6bace2fac3304e26f6d4a4458bd01a3d30527ce51c467bb8eb9c46d6b4c5ab9c222e3513f8a4d0b304dd6936f3c717b33fe9510d2602a269c9d5ae66f1e1b24b7ddf47ccebf95b67876f9891a2fac3f4311e7227c322444b6e91e5307916864a69e9e555ba6b4173ccd4cc34bcec664a50e8b0c8784280c621803543c77b2f3a5f60000022800000224000002201dce534f780d884df12c77cccb1d951096eee62ad0fa8f2b736eb7cdddb9eed900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000206bdfa68ccc6a578ac095676fd12c4f631683a27d36caa5a0fb79c681f0090d8909d8ebdc651311d8c4c59d7b0ca48ff9e8d184a0712731ec53d9ab83c976309aa9bd18b362123fec0b82176d67f9a1101c6902bc43f56111134b72765a3ad7a572088538e44d5db46de222dbe36539836bc54d57467c2a3d61b022633f25f0583b2c103d00bd7862d067452d08d4c57257ab011615481fb32fd219d5911b6011752d0f3509b1493298acb37cb1d941353ed80fd82917a8ac3106205e36fdddd26597c68f481f972e20f73a8c3098f27a176c2274ab3616acaa449a4e8e1fe7c8fa4cb0faf281b5ebaf55fe357800ad954925a079ebf6f64574d62fe0153bb8435e40e51f5555c660f7dfdfec2eeccf12e185b552681abd6cfb6a707238ffe813b575ca9a8606b3b96847cfcc55afff3d5f4f2fa0e4c24ea2670e9fa6619509883d508fa85f7b81c29872e5099de6b3b7b632b9d7344cf7bf70f2b0e41a3e718ad494ee7e0ee1243b1d6adbce84463f61014e5f673497eea829955983700974f52341ff20dcc94c19bef2ab9710c6f9e14147cf99a06c75721d078c9b869a947bf566cb462544c3e1f31d467080cf3dee4abca095e84db69ab0bb77a930dd9b000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40126523c83cb7745f1d98fb8783a06418a9050b1859c0742cc767b3f6f11403b5802204f2645ade90701e4050829f787751d6ac1cfa31961c3af107b8c9e7fba75f2269182d5da03881390d99d2177768787f031236e459e458449d386bca9d6460400000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a84091e2d91ce5145ef8f1f1670d6c44ac21f6e7496c9a3e2a1ce2f38de6d5f0ce87f20576cc98302dfdcc5078950554610510cb3ee4b9bcf7297c39dea1514aedd67731dfc54d4f5133ae494aa074b22d32cf9977734ce5e2421480b40aeae9ad4897287ec1f7fec99058364cd811d19a0627553a65aca3c56d06f5122f5876f9c84fba5e34ea4d4a6be68a2a5a8931c96951e9ccb938fe69ee07ad83e9a3c165e27dcd822e5475c993ad623ddd51c16aec7f0d86826a4984911211d615adec8a95d71aaa5162e3742bd18c9d3797ca9f7b150afb676fd6942e583ec4780f405983a6b51008c55bb47341419fe9a831c17c92eb505753d350765e518a4cc32cce28509863ba22d7690c1b1a430ee382d5c088a0b6ff54942d4e4df50cc1976c73a8af59d82a40064feb8e378b6bfe963aa791c31718483e0bc7ed0ce5070e39d9556494bbc20285c859e23fba0ca3ddbbfbd1ae0b1e783e5c8cf9326e009a852469e5177999aa938711fad9b2d2cea9bf880c83f6ebe108e2cd5dd3a388948521adaf9e17ac385d933abcf6d88fa3ccd8d6e617f6f7d1f3296bdfa394193b0eb1b03a8dfd780ed727e59357742caf9242883873cd6c35498cd6a2e6b1e3aaf89114e3def1a7d15fde2c21fbfb82deefb928a1e6f443e690e26f6afff22eb687000002280000022400000220081fa8569ff1dce1ada8ea85abb73beed184863ef3bef4f62511e2611189d9c90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019000f6ecc656396f8cfedc226886b1735bc5a37b7261780b1beea8688d0e7b93c2adf953cc005c88bc39900c615b760932fe8763c0e22f20604480e9f4ad79b7623a64177a9d4c46cc1a9bd1eb30bcaaeaf8922a0c65ef0105eddfcc58a7295224921cbc4e33b97c9a2eccfb289132b99c3caad4d369af25e77561c2c1617766ed13a524f0c3e9d169932b7fecc70596afdd4ff10a38d89e74335dc9e5355e10bb93789dc2fac7470465e5e662c85966461155f7b3de3d2315b73cf0e55ccdad8876a4473000e0666852999124a027c380d6de38f7ff5b7f93ed102b74f3f38323b456c059a32613e720a9d92da48204626f80880097a28b6873456da94c25e003adc0918a8186d91f8cbefc1a217689bdcd0058e363117e280a0c8364be028316e12a193d8ab7fdde40bc187d069c4a2bd8693bca560ff2a3947cad570d82481724487c0c1caf94b9a638d3f1b4295ed2e210239666e544aabb472726575f2319ac046ebd3c8aa4608ab7ca2d8e81fe984fe11774b6fddc00aecfc75faba5e2a8e4d435dab3d24f9a9b635c4b976b6cbdf92639b5c345a1141a880a3f36631dcc0d0693a0f159024ccf98289f5af30629571f1feb399792c1769445a4aad71000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401015752549b74f0e8e83496831fc958a3d91857e56da89dd1985db1deaa81dbf3022093f596d4e466a4a1edd9eb874665f0f158b77cf632df44655126ce0bbc04ae138d689d0472e44a375965ccaf284c3a280e096a2b96d1c6b543bd882f61432600000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af4b1c025bc00f7cecc00b9664b572c2f3d4c3e10ae51f448779852c8b9411b71e8d9405e3398d67b4abc9d51fc299d52ad242a63c707b3282fe9657f3da309f6c2ced0ccd8e37e072fe4dda3849b3067fa365bead6b2d0b6acfe104a035edba2310e9d1b8472236510d61ca7a16dd65c86e9aef8fd536384531012de772b3ef086a2c93e208174a3548ff441e438d9e1059a3f7671fb139ef02f9c056dd99ed136c7a5be9d7a786c711474414e612ea5ea65034ede0cb32632d90a41781a2b3133fcc2baefde1dc2b012604c04b47a26a775c725f009f4f9dda345dcb320dae22fa9b5d71eb725a1fcd2b61b1204fe9089f056425f30e23c82e9e25dea8a9d9d9541fd0f64622c6d2d0584a9bf438e11c2f6854ab96efc09725b81b445f5360aece559ddc3e8fa3bd3e8b026969b2ca41427cdfa1e224d278e925d95ad77a38363437a4df03286817ee72e995401a6b8d24bb9b992c88704a0aade95c12741d49deb90ba6dd1e49383980d59f674d6cc4757b983a3dd51d75477a3608f3cdfe280c94920793f0ca2f7b8ff51b322b4a3dd2f89f5c2b2b32c21d0069d622b82854d2ca8457db791a819b0b897605502aff9241e2bea371f1a058be79e76dbd337e7671468be9a27f074a71a34f1563dec610dcecd5cb32271a51f030644a9fcd0000022800000224000002200f5dc8990c5d23789ac7bd20f9dcefc30b0d4bf37dacf21154caa2545366c90e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090964655234e4bb04c3b12c893ed43e1c5ffcbb96557744fd493ec256ce79e100dda23eae689b58b221bd2f9d46201063b4605b23285a1f090214161142734b2fcb4e3a4c4b0b0bb8c80e1d33150057e37d14208d35d69b054b8b7ac7f0e8ffd78770a80972cedf1e388368bdb39c3c430f3a2e0f660f6251a28d475b995aacd17257b34faba0b9432d6479ec99c9baf243912753d74cc3f7c8798d1ce3070a559ab85d3a499cca4ddf23c02c24b05b366a128d98739216dae5e43b55e824468478f0a246919922733d4cd057a86bc02c55c3d33510249de1425f5bda6d12fb241f208d86db27a0678d37fa0511c0bfaace0a1874a78181717437853f25aeace702d006666dc7ea30249182256f1c847267fded881ce1ae6c8175266bf0ea40994723f3ac61a9f50d44b21ff6a71ae03a4fc37fc5654c17db803ccca534ecd6b74f84dd559244dfa6e4e7ce78ec8373a6e13679c64ba9070e651e5bef71e52ff3c881eb96add202485f7a07b72feebdcf1a7719288de54bf6bcd167f96715aeff3363a712e096a9cbc8f8069054db22027db2163e87a0b21bb922b14a75de050261a955f911fbcef1561a397ba4734f0f23289d88d2f3965cfa71a8f8a5e0ab4000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80203382fa8c64e9a8b768bf60c661b5acdce57850bbf46cab81b4cc75e303230bc1f47ffc2b95f1e8eaa999dcd440bb8b75ced49ec2b8a5be836abc08e132ca989022140da8fccb36e842b2aa7ce84da7351f060c5c494eb33d40c512d87678440ea0ae203eb8714f2c12e1d42d8d049de85333ab0c47fc30f08464a239ad2e8db6c0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f0def90ecf57b79a2fa81335c536ed619590c26930e1c664729aa9683a3fcad9d9bf7dc23511d16ef014a032222b0ee8e1fd9eb2cac179af0d1497d78924405a2fee0277f80a79d616ee2a84458888cc4e4867eb3b2dd3e2e3b3fc7c49c0fbb6bd459a2fcd3a4f8e79d098413179d4530a8e3362fe7f8b46a2067b928914bc3f821951cbf4a479402e3856fa58e897584d570da8a213b48ef61ef1912c1bd95ca6480b7401a51b4ff9d4c95edc5996b9d7fa0a04b7a33ba7cee89d550625537413ffd21429fa6fd19ad8912445f88f6819ab34465e1b1c7c8a2949358662f2ffba67a79cb99305f5ff7c378d0360966afbcf465f7ee0b91105c0c7cde1d24a29a250d529978e9599f327d24423eedce153ef1bedb595d210b8a979df50e3e83223dc66351e52a6b6816d02e721eb3def17bf6e1154d580a1dd628c1c96e72cf41fe4d39e369cd6a93d541e864791783d834edb22b7595ac9702a6e8c24555d468464ab0f8baf0f3c789fc34bd48dc4081ea3b5b30ec96455c989a4f08ebe49bb897d5f28f00a8023f003d3052a1beb367be1ba4dc5e1768d1c708ccaccb0cf40f149f670115466e310763355fa13047bbafcc87c73c457a6fbedf198adeeb8d78bc34cc5c6c7c7c3d33f6c03687aa7d446fe54de31b060d9105c7ff182a27bd0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fbf616f2fb20ce1b2b7edcf322bf646d523db8779cb0d4217f36bfc58f554ab209d95ec00cafbe9befb21350b3239b96e4442ff3337f449531f581e1553398344daf732065e42bee3eb2a9568dd1b4e8af463a8b49e11bd2ce83c5d5e4998ad3754e06a3419c84021c7613f1e91642c20e47baf2c5612bb63651ea09811da4a19891cf49d19f5d89fe6892a2490badda652fd555dcb1811e427a0df565371f8204a2d0602de6a12c678f823d8c583f19484a813f1b32475bc14585e2b7dfb7783c04047fec4474225e05d70c09a70232c435029c37ef0650ac447109d114433fdb65b6bf0cd1ceab23dfbf34386ae0f2eb157c518d5d5127446861f81f163023990d502a84f0e8024b0d6aa44deea0cea10054742f39751af0f01e72c42176b1fb5c7ec94c33474eb615c0f80adf18b5f94c353fa1e086ee42240c6b8412c08a1b37855a7616bef2f9637a4dac7918aeda0a363258382454af30d435a8694cb9cc80fc01fe5c617a011ffc315c09e7f5d12fc0145d913a9ecd3806ce5e4ad99d86b95aaca07144b749ab31c084e5920d491452ebab1b48c71fb93b241449f470eee69aa9bc0d57fd94abbd62139a9bbbf2b53451fdec3a53ae8d69771ef1592598a55c9db22e05eae43cc07ade338b689ecc5cc281d9962efb8c5c50bf50d930000022800000224000002203032d2b7af9b6743e9c25bc6b20a9e4cf937dc893fb0ad7a30a80567b05fae96000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f9b549d1c6003b3f4593771975047310790dae23acac74c1add872739fd310294b6f15762133932f9d02b2d43f833249ed6cdd9a39bbb4075538e5d9249c118d6ecd9d5932ab3e7596a4c2e70380856c51d8d054ed18ba018c615b6c39541d11e7e8ebb586d086fbd5ffb243d59a27889797551f5c43a4e0e9d8f84f87cbb6a71262ecb1d1d39ecb545a9320bb10f2804f92a5166ac78e31d194ca8b498003194be86eeb13d7b8339fe6c13b6ec4e5efd16b4ad9974721673e65fd8b475bbfc2a54dbe623426d2555dac451822d04f3f7671cae45f39c2b0bfd279efccd7bd0e609d39af96c8ec0276317dcb7b048c7714d3bff0a616a268474e98fafdf87fb853ffeef13b188224068bf696b71255c502f6180970917c83772c66ac2b8bd2a35cedf3236dfaa5a482f19cafebb9cceaa18da17519eb53ef38e227aad4e93b2f52fe4303f42a718524704396be4047e3c12ae041ff51ef763c10ea2cb4895d7e5a03a5cb3097718d4cf87e861a966199dc94e963c53b3b105324040c42ef29aacf9478b6db1aabcfc7bcb170f992b5cb9cd62b8f21aa4ca2f0594886972dcf4c4bda24e2a6f28fd8ea5998f30ee3c942763f754be17a21fa7d0729939dcd0cc000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40118f35e7ff123390d853727e1589e5cc1c9b8366b0cb6fa4843a79a2d37f294730221de2be05daec6ab8ab5b0a9677937074008be4ac660c582bb5e58819d0623bd1804739b2e72afd94ff5a79a3ff2d67343da56bece4429a1094cb158138a2eb100000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae166a379f575b83038bc0e95ce0eaa0d0b6d83e882d0fcc8f2f92457ab1d4ff14f0253900b6c7910592adaf8cc7302f147d2c6c714eef71c388ee348cb5587ea4ff64db34274ebad7836a27cda07de99592c12ee3594bc279faa63bdc71cf3b0f14ba3e892341cfa9a033f7037765380be343f9907b6c3467662b934c8e6817de4d877c7934852ca2192717d059222a759ee76a2d47472d64b8099f589a11ee2c1aa5bd72a38f5cd63ae572f004264e95b9c96c2aef77498aeb728042050747beea27cea67b48277cff28664c27b3472afc53f9822ce2b2c5254bdb6cd6347b336c793a82447c334e4d03353e83d9e3e9c47027c37b0bfae17974f25b1c327ebd7fc31126f8fc7086caccdb84317aed0624defc3319e943a2e9ad63797a4674e0961ceb517f21f4b4156288db25283bbaaac609743e7873e3eb0b19d7e10accc6929dcd6b8932e7a6f7cc2a6c2b82dcbffdee4f8d9defb845c38eee2580eee9d000aade37e019f6de991bf47d4ca9dce01017aec4d968aa2413f6b6dec204041c9162aaf50c85a085b4c06924df6cda4163b52eb53215e2b01bd000daa949e500e397c59215211788369d741002619eb74ea42f395c8856125bd4dd659bc6758dbb23c8a5dc40a49f765de94dd45415df3243b48e79cfd5628d04c5f4e6df9e0000022800000224000002201af522e387fc8e8c9daa87f5521bb89bd6eb9ee0cd24ec0004589a5daf7b56ce0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083a5a26e2214b1dc1b30e12fed9221066fc3827a52a94f8a53f7db1280466a1cf59182d12d0382931bef61c06c07e062f94fd226bc57a5e9b07db5c01301660a472530c6b38063c366a3937f872f7a8e74950b30f3156adf1c3ea3ffab8f5e5f1f41b355a199a0f540ae70535825e8aed4ba100c4303cd35f523c044b0102389794a56f2def82cc42503ba7b22cd894eb994f9446bd6f7bcbf8d7aa50630415294c598d7b7d2e353e5b8e80ea215bdac8a8db524cd9c25ecd1f5f46b6c1def383eea60603f9cde00b1e7b30cf2d51ffe7ca0d25fce77ffab727674d83a9ff5fc065021d290e27a964441d2a0fa73c4aff14a681db5df517af4317333af0020afdc5a4785cec67bd1c2d6cce64ff8936707bbac43b3123bbae8623e15154fe0eb47e8a9763fa49d88888ba97202b1bb1ad9b6f124ad37e6dd2c40f78c040bdef969e8eb2947c8ba95537e57222a2b7ac1ef7ba165e5817ede6e2692a972c4ebe31249310fda8ab342f2b9cb47d60af4dd282a0640edc38a1afdf647fc94fa45657afc0a0a7642102e9b039ce02e3c80d794ded5b5c98724916339b0e222069bb7ff92f70037029495082073dee4c7c53feae8deaf770cbcd171de2f2adb9d4381000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40124caf2b4a3a98fd3d138e4fe36a6bcfd756d0e802d2ca751c17431410d85e7ac02233b55d7e0d041886b9da2f238b6afecbfb1fbbe6200a4c4b5098554f1d877dc28677e64dcbcf57fbf8ffc8bbddeed02bb92da3f5b7cf9226fdb7e5c26e16ef30000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017cbba0e6a33953af1969c6bc3a112fd66838a45a4065e0b6ac3f3a5eb1fb200cd095f0e57a753d0a4b5fd801776d6264a3f46b295954d4acb82e2794292e94f051dbae64dd337d71ad161071cc061a0d3ec951c06f5f36623955419a2cb52e59cec5db789cad4bd2f68bf36dbf41994c70ebeab2d98c3d631ae3628ef271926e34f7ced277555b941dd18429b8066fff1bea48fafb2baf9d95f011e4d42d1e3cece0c44b82ffa2ecb7aab0cdb5cb8987d0e3d0325873ade0a57978a0b716b671ef4f673c65428ec8c43ecb43779aaeed84c4c473ef14f4677bb87cfde0607da87edc06aab2345886640bd56953a3802c0c7cf322a74db7bc38f08501779692a409b3ec54cb9f36eea66cb1fabd3ab62acbd38ac22fede20d74be2f644f1a1e2a73eb42787109871e83dba73a42c2403a6780ef59a252fa1117794eba5fe61e766c7e964d75c0496697359b4a0079dae630986b3a441add7cfc7619ff0d63df3912b66fdf1a8e2a297cdaaa9a9424eb73e58af0c4f0fcc01a0844b8a315409310d77cd8cd0c0a40f60efb1e9eded562abec8e8209cce645f0345ab66ea2607d2c57faef99014729c8f881a4262fd98092ab13dab19f5406924491622775e23a6d79bc3192b35d553abef94090bd31ecce1aee5b7d5b03a4e288b3c09eed2bd200000022800000224000002200bb7f3cab386983063325fa73bf58354cd60303e28b8896bffd178324e2b75e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab8d9371489fcaa242e23baf3b59ff7e26e758ccfe23ba86b2587e11d8c97c4a7fb1b7c4950ad33be8bc15a6b20fb049f449912052e958d181aff6299ccbe0a943b885dd3ba8dbba4b6e7e1a21aafdf5247c43fbf50af1e5c5e892ac18e8922c03752190f551960335bcdb766073fc253185c5b5891d4fdcdaf9e878a137d15fc458fefeb986358d2f751902d9b8bee354ef19d7dfe6583dd2badf92ba848902ca3a51437e0d91975dfa4ef53f8798d7a230d3460fb448ded794135832d322bcf57767d1d899218e76271cf084fe31289583646d13ed9d14c6bf81fcccc7e9d16079442e622743b49198c3a299d96f40f5c1b8c92f51c1a07443581cb9bb28b2ff6a6c077f1667060b24a7fadd1c5dba4ffde0953a7d39e8b9c056cb815c8d3a0340298b422432b62f4cf0626b56e6a4765f1fd8899d4c3e2c322d29e66b8be9b12daf852cd297bfbdbd22645347f9348eabefad4b3cbbf87471799c14e2d8e00682dc4c158d66f162b8645bcce4045368a5bc80f2f725f7c19ed76ce63368ee3de77064c55bbc00be3ae063316b285da0a56e95f1b01096db5aac7070c7a45bd15b09bd5ee32605dcde3bf496e5a600a8ee89b4fd0290f77b7c133289c7b2e0000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021fa0981932f29b7d45875fd5d1f89d53967b48d54a65977daa2fb9462a682b3d116b8a8c494c3a01a483db7262a613dfb0b1f56f2309132d4cb7df1a5491ccbf022436f9c9799c868d383fbc89532018e42647e6fbe55b0de6cb071c2c4719e3b922ad4c0e96168b39d35773225cafff8226789e6b192cc640aa271206725b98da0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039c1217f032dcf94a6ab46dc3a5d058e92181ed87f30f27cf0ca750ffbb1915ce6a2a1fec1bd2f32ffea1464c074714c7aabee538fbd35bd561501435dec4d9f18cfb2ed6b0bb349b863b29ab1cf416263339f5c54375d96dd65aed37ee1744f6879311d3b88e0655c9a4b85da716fb7816be07f08d7ee21caa2026ebfba3ea3a10047541930c5b0aebb37dca32736965dc12f2f52cc15cb64d5a722c2d483120a8ca9e2e23a76d42ffd4c024752aae4e559fec5f324eeac069fd530437c387d5c48a7518b7e928170a49f69d44a1b322f295ed07ab45f7dd69508a7999c4ac992195619cc731185fb8bcc91f15e2f9b24b36f22d451946f5a094fed4ba082d2102012238eefef312943e777bec33bce310100fb7ad9ef63a53593b2f007ab9b4d96b9bbfead08abe6752d2fdc12bed74ad075dcf34ce50d6a52166a676343f6f27d97707fd02fea4b6c87c7aaab848c0ebdf85c41e5b813200b6d041899527543d3b4abdabb5e55721797535ed780510351fbc62fed8977aa1525bb307ee38b0e9cea9d51fb7b6ef914234dd4ad1d805b0b4c15de4f7cd33c1274bf40dd503d719be7cd95fa5568b237821a358db525ef23af101dcdc80626647a9fd2ebee676476ce50b8b44e55c0336c8fda123592654d0a16652fb0b0a53845680582c90000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4b74245a35bc47f7bbed17b3f85aea737ef6c719ab0535439e1d6fde49192c67ddffcdca01c4d0c378f2b70d1bfc8119e316b396c3aa022129c94b38c0d93c612eddd394e86e19bc5da7bdcf92198aa7567fb84a9f27f84eac1e7075774dec75db7f90cb3aa3f65bc1f6a67e264e154ed100545dfcf4f62832a1a62c4ae8924765a54e40d5e7fe9ea0f4433e78099229394e237aaa6af8509cd0126739f50383e75ec362274bc7e5f8a64882d070cfca5ab060159fb3d392fd93b94aafbd4ac104c9fb054205d0f86212145065f52326863adc0c181d1f545427b2d2a3e79c9727a2de4dacd265b15a1b97f93fd06e3d73184e932bb2a14e79cdf7598232ca6c16bc1c2406eddf175416de2f04c7e684dee54352a03e30a228b192f89f9d966a471a0ed69c56c8137590be40ffc06e02d7dc0989bb0581a7e10fcdc9f0a14e48404da0c21e9e3e0f0e81a7cfb6782e1e11953763b51d91e81ac32d4953b4758c707602f271ca8bd55e481200df13fb460a62cb1bb2b76445cf10ea2d527f70f6a3e17dab95888095c00de8e3c7a20bf0c570d5464399f1eb68bdd1abed8fce406e83bbf765e4a8ed5fb36bd11a2da6738e6ae1e0e37817a65a88a73d8d03af345b05f7b9497c4ce8ac82c4de256140c3c6641b5bb16c15532dfeb4a577814f0000022800000224000002202a4fdabf6d5a94d21578e7ff5fc8f091faefcc46b922190f5dcf7898f898a06f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f841722017d0b0cfa501630c93d15543c0874c6e2bf428d4a91d427067fa34a358d96c4cad48d3f309d524a5c61115d389f7fd8bfaf665b7ba274469016b9c5efc898b0471d24784ea099090b84a6d031fb3e76741dd93f77e0c26ce78ea8a5d882ab998f2f272430dcea07c6b1005b203ef590acbec55e67979deeb94fd92fd277b7b5d0cf521f5d4e73cdf76f1f002e63182e9cb04596b6dc2400d23266f450ee2d06221c0b541c8e652577b6d085295ee388c26731b78151dcb45dc3b02bfb7360d8f6b637031ee068307339016c97865b0eba8c37b41ef71171163c90d650a903a95a075f6b12fcef8dd50fc400f76059efe0fddfd46f8df944cefa80ee9b0cea393bf2bcc047aae04a3f843ba2e954086f277c09293d69dc41e1fd5376f78793e0ff56a391fdcb7fc0ac6cdd8f6e10db1debb95a8ac4c8c0db9eb098c1727386814e80900b95cb6fd374aad975a52636ef29d15023e1f9530f41347b45e0dd3caf7e776c39355d8884a2d72d477e4766e26da78510aa267dfa8beaa4938a7db952d58c5a613505587db1c264c30a50a1a70045fcc73a7238ba945b842884098a31411dae8afb96f91fa34c510eb3e91a90b66c428db14b4b229cce9171000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40101f009b1675ddd949d057a0c951edb78ed38babf3f3476894a59b7e1e5d92af00224e47fc6524335d989f2edcbc002371a7abcfb79beb82f754f4018e4fe9c171c05a569be35f13f4abfdcf1e6cc1fb44c8a4a6a3b28c0978b33714a947f86cdc6000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a3f7f4e809aaea84ae1fc039eacb0e462e67a60b757929aaa63d6fe14358065265149adf937491d92db15432fea1e72787d44637e41b090b7a1ac5547d6b53668a732384328c5c293900a784fa254e905524c3e0d76e377110a70f0d84ce4b44bcabc9a32948c67b5d31b77cb7ed4c6dabb9190c1ce7e33c8b32975840d66220c7033f224e1a452d42161de7231cc81a239405a1f166ab4f1697a98837216bbd5c3530f26eb4b09d56082201c05f6474a7f6f106efa31e0fb3a0ec59f83c59b687eddb3c1e25d712a1ae3dff26052ed1404875f20c03256ce2c965e3ff63a26be03e751636c47817404f09a13c975210264f653675339f835c84c590a647941a012098ba2cc5005c6d064d06fb08e2953f3c133406c68ebad1e15907f40ca2c95467bae2cc5becbd381658d8a7aefa62d95db6faba44bc5c93a56f86e5abeb3a0027920425207d3b9bbb67d23a88a6b41d674ff4be9e87087b11f37d1cfa4240a7e842068ea2b147928f334ef203d8a037d8e0eb85d3834ec3b5647508add790981581146635059d00736cbdb9f66825b7c54159ad0148ef63893f009b88ac24884388104e72be3bf2f78b04a4efef25d316eb7d5766b790402a326f18a85f8d50812b116722f6c929476604b25f31caf995a44025eca4c9c8199bda4a9b1bf00000228000002240000022000d571035d9ad3c5713ae466b1b96b0ed3c1336730847ec502f4dd9b2b8aff7f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a13100cd87859235428d45cf90946396b3d23a86f614e06bb509e21dfb0ff633d1073d97ee00b37d4a20afabc978bf64b9f39d3f22c606ca59f390f62553d6c40a65132287eb024317827695b58030b2f0f916865c2d602be47c2a5c23979eb10444132c6e4551173c68d6ff784e33dffe0506a6ee9f415d845de22efaa26d4afc162ea84d9ad2cd1ceb36eb258de760e9aa1def1587a8f8c343d06c55d4ee02fade118a22b5c8fb4eff3cd40f5bf27d39e5d1b57fc9559a4f67bb5ba29a21cbd5a4d23a5031a81b29d0e31d11c4de96e7ea0698cd84485a7a19f0db34423e75806d23f86555b82e701e8fbec0e1f679d8ecb8a4292add98d7be152e9f75792d1dcac8046926723f698a7750f47f01a7b741cab03a1a8483022ae796414dabcd20b8cbb5283f9ab874910359cab6a9258b23ac2dbbea8e359950b5d315692c691a8c27f5744876209ad8dbae26ec8687f00c040fe7b4c8a9deef6a8b92c2ddc997e14a85cb679bc7e216eaed8eccbcb366ea09f744f42f3f49a35bc187364a322b51809763529cea816cdbe0cecf405f7214f3021ec03f82d6fe6d7b1d9fdacfe0620548974fabbe39218a7e241e7885beb50074b2c725b2b6b0be1ecac9476f000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40128e9a99a1f32b439941fb42ff6e406f261e99dd4d57622de66384e4f85677e190225fcb351aeb408c5ce1b9a6c042b664576c569dbefdf37290b433a784bb21ce510cac8011b3e25e8ec2adbecf8674c7f9251ccdd84fc93a3d8c4d1062278a5c9000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002106f99896c1c7bc35b180a5e4f601e5d0df232be22803c39328b5d0a3d5967b438ca8e72e8918ee4f2cce56141f7e6a8555d9f4672f6c4427192437384d11cde35b9a4a808c3914f82b96afad43891c1d030506390fe8ba5c5e57630257f6ee817cf553f12939529297acdaec07eb2cf4ec30b9815b94fdbcb16c2f483bfa07bee3a4af2910152476e07bdca05c5eef3618461e2b870469ab70d469a79d39e5ace7536cfe92a5b306e4c816ad0baacb2f0aede0d239a085d4d7c47defa9b01b2d5614cf3f77537b51be7c42317430519b5f7b806a97ce20dcb3a494428b6f2835cea3c7b74e71abe28e2f86760a86e5836ba55a3b560c402d212d3acd3b8cf9bc29da80be661d3d95da056daa566199c28e5a8fd41d7c09ac92ee0d7b564f4000a3e72723d947b131238f72e5bb2b788d166d4dc9f8b373c08710467c13184b90f248cb3d8cb799fdea9ddfe21a41493ba27e2f96935a0d034469aca7da3f8e05119f99c01b2000649c242c55ef6dacfa95377905364121605a705afaaabc08b82660c00d74e6c521a9446f929991608702bd40ec83d2f145d5388411fedc774f62339ec5e353c6ced744ff262227444412619455cea2a4e8d143947131297552061d407ab46621e156163d2aeb284c9ca36177b677735518f5f7b89f7dda1500000228000002240000022021a16694a5ad9f16b63d921ce493095258a76d81d051ccb605748645e4ccdeb9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d1ff1c5e843570d735fd15c0ae92fa364c42c15e9b6a6e40c34a6eeeec10e738a833f2fef54670813f419abf75c0180d9efa604d1316a23fd0934e02275c6baa98cb67bc5979f701199a17355acf06ebd225bc541061f5246e91db91ab2d9ed999052018687511db8f1fe572ac256bebf57fa184b78e177c99b3047a8f38e4498e0f923bb55bfafb045911686c90752e9a58b6a54173df4b57cfb0caeee4613f011464a19f049d4a3d78099bc678e745014dad5f6e323ca232cf4d7e74b72775a6c6295e767860f92034ed8ba9f5e3ea3402b4b66ad90930cfb1d3dbdd3e0dc768fa41e46861048130d49be1c03b36e175291bb21bb3ee83acbe0e487ca05aca5be159500201062baead572a82a410d22951d09d73f4940a4b6100c2ab94237ef8dfe9d2321ceff8fc0c2cf0fbf0f06dfd6b4551b1f7a63fab3b409ba14ce39b0bf9b3c8b36286e7e2a14edc70ebd55356a9a1e602985bd01aa2c48f1b9d95e5ae38da06120779eed9340a9a552d41c0ed6f9c0b9f7fe98faaabae741114e30249771e6b29f9a3044bf04deaa42da1129d1c01ce7b0c5e4d60dd2e55dc88735d6bd4cc5c6c25f57fb331ad628e08a0dbfebf251adcf9b70d6a9f830fd161194000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802113796d7a76805753dca8b3301f0e0f797fd71568a332e2834ad7ddd1e97284e1156d2f6ae3f90d8e2a1806b801f9f281fb90bc6b47e9900615f80bf0fa9224102282da521eb2fd1082faf0bf9d6b0836c2f1cc0574dd8f8a587678f6d2348b91a03e251877208043a107a245228f336d50febbf5143560c99da9407bec2f7804d0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000263c71dc58e1a842bd9b415cec1b73b438cada5fa5a5ac5e88261043f26c98710dab531061148234773eafcd73fd6dd3ff5cb2e5d4a6e9257e56b2b8c7052ad13be4d2cf82c7d31f39c8daa73226c8aadb7099e7eeb027d1cfb286da8f70e7556a5c752dce60ee58f116fdbd0eb85070bafc56402e6d0a19dee523a960301d8522f915277d6dcedeabb1ac688682a8faba7aeadc4763545ffbe2dc8f17245f5b394cd13c8f698c12f4a87fbde87662caa9fdd4cf09c75471a9c068b1a4d77eadb10cc296042e699c04d7670f7627f0606140d4fe8f16b87162f8a98521adbf009d170156da7ff625eb3b92a5fce79170fa1990c442ef8eb460c4070673308fb3d218137a6f31b5c14dc448c1399dc6276f1d509e7e08314a570f03fbf02ecac2a548c07e860050797989b51de684ce1b54c182d34a3b4116788eaa54fcaa7c1d64d2325244360a7355f16d92607eedbac869c8dfdf2246760306e7d75aced30ad6e599885d00419ccf585fcd1e71ae6202c5beb520f086e02632bf2775e0538129bded04a1b844b9a4af4f3c2c049f3d02ab07d5f47132cec295ac12b2760e1a81a1c364762717ad69431dfcd0faf057359a7ffffdff5991111b3a5da2c3a9edf5c25a0a1f6906eb0075bc1626c7d0bc131dd61f35cec155af42e747a650ef36000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000139bdf7b1b00cb6da4e37a8a0473ab81b6454f26b6d15d454d3c4aafbb120ae685133df974f4369aa606a032f375d243adc0573d3ffcbdd73c780411d7b11ab9a463a43edc2973605634996646fb796da6761acfe5b97b7bb82aea791329fd09adf2350752ee2ea8098eb10bc9b3ac7b4108fc6cd969984ce7f1404c51f57fd6be9f97fe90cfa61e1584f090d9f5a57f540e5f297494e616f45318429400d11855eeb49888a3214299503159530cdaa6516a2910b08725d3a0390334a71b59e2fd4bc771ae94c47fb158a14591701b5f1a3b904a3fa6fc8fc4862ffbce3bb7c6bcc22fdcaae253b061c07c45a61331978d8fd03afdf2e63f737ce076fb27e2d40b7185faf0b3a196b3703258c67887c4e9118cc53a0fa993b5a90b9d76f91171f7a8e9bab5e20437c63cbe040958f0a6b7b63d0ca2ca7ae8307b077e3d9f75c00e28d785842f16bf7cce977934f6219772636ab0e9c82e485e2e29274e110550a38ceeecf946420f1f79fa74375ea8bef750591665a1381e452dbf694e3f5995dcdd591d30d50365e5e0fe8002ee032ee34b0fdcad040b66e8c2204f20e415e3feb9d0926ad823de5efc45fab3e432dbfcb54db5a4f684bcf6d5a18517bfca291f135bc7b34dd9fa46a46e2ffbd73c5cf81b5247105a46ccba7fac81a446bbb60000022800000224000002201f6cd715ad6cffeb3a185aab0f1e1d5ee23d0d3c04eb964f38be57e0ca8b1e7500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000174707e40306cffb6a0184ff64ad0c1225d69b9d9ad3e7f58526d87d2292eb3fa4eb8df766ed98198fa6384a6f83b39640d9b18ef8b90326de9b51461394ce8df31229fc21edbc0b7fb1d5b715367bb273f8be7c3e6adb86a39ed30e5866757b02bd942e05dce760ff756be96d877ebcba81836fdb20790e5e1768079ba8b2c32569b3ee92fb402bac20602ace39c4336ddc8923a9324b1251814b60bb0a887ba5c158005174456b9cf595634256ded1ed2535f92d8c67b67eaca2a8ccec082f6b532715532acfbb1dec39f53c795cbc96f35167af775e82b12069e6a231b3687ba5504842d4c8899b260d945fbe1e933bd750abac67de4d26b3dcbafab2e946bf9745dc70ea914ee8efa9c309256591168c8f10b891d16c50ee092d321afd3614defb5b379eb8b9727b1fb502cda719664a90eb074fc89950a6f655f26adc0cc4a7d444fa4114f67ab2e30913b8804569a29b7d500cb3342095aaaa96ec4100cd1861d94bf42095b0b85ed0b7da2b826007737712f90fe1e2025918d9b68ba413e82f7ab67b64c44d01d0df4f6515320616241bb439a2ac1fab2071aaaf2cf2617338a81d1b66b06167cc0a42f7e43048d1c3d3ff08abe43de3d2a37db21bfe000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010ea4736923526b2b2f98d3adf55380da6d0922de2c4b861964eb30d36e3e0a0d0229672ac39ad2d872908ac26ccef3b6f71109dafdf85794c0c5b0a3765934271c0a95fa238b198a91379e715834ed3591903bf093b0901f260d842038ec33824d0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092c86deabc666d73610831bf14e83d8030e23279eca5b971af019eca6d9453b57e0349c43e6b803db2b5307f05ab00b659831766db9b2f907884cad91ff0b303c621fa481e415732140193447fa7a02c80aaba31330411a8f4bde6c218b71b8e1a771bac34503788f640295ea21a961fdf341c26e442d79dce81070893f913dc410cce860fef4a1b06c0af85da08b0416032360ca3106b8a0bbddebb6273579f4c21167179a02bb880d454f68305044bd72c2b670406f76dd0c189b251fb9ec06af443cdc371303e2a68304a3a65486f8eaa46de796767ceaca0593f7893ea6f2281eb611e0d60e3b4c517ee52e6336c671bee67b612694625b5fd00a60972236620cddd072c529a6a0db43145ced5fc505e5e78c9af47ba85d7230b82fb16e79637ed5c120bcc5f11d75b1e405a7aaf8ce373e2e83706dd65b7034a227efc0d06ac88655dc98ea3f5814302383988f502b4f632c581edee9a1ebb151182c737120899b3d8f4c67f386e6694614cf4a5e0e254f2ae19b544abc126c88cdd00bf2b78d046b8c14087a4bdc2fe478011a7d3c34b007d7950c1163791fc1b1e917b70250ea8912eb15a90e59c57b1b783708a1f5fc12d9ce319c3b7a8c6247ce89f00b4ff5ed916442a59aca9d2eec804d53d55b5679f6678cbf4444bcbaaf098860000022800000224000002201b50cfcf7490575609bc253953a593ba2e7ff95dafa7dd045768ddd8e60dea6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003275345912111bd159a4692bda77bc8f8b57d7663783c976e02edf80268cfd2e7684ed82f13a7dae5cabec2a808f1d5b8f928ded6b5d28a17c7eefea68e70865bb80978015f605e0a49cbaa63481b83429b56a1ac02d7d1392e0a8e2b9381e4f4f57500e0d8d45ee4b88541e0982489f2696d83e642103d6660edff2a12c6d0415cd0fa75aa62cba6fe3919033a05c27bf27cbc2187b0d064699ca1d03deec5c3ca52ba0a5536c3514b07a048202cb1f2dcf695a39240dee34d75672b85da06050d9e67b4989f797c7a396c77b401096025a52ea181b062ded14ccaa1105f7dcc4b9fb4bb2959f655c3e7787ff7204957d1f5d34eefd3f8772530d554067fcd15e3e3b1a5a4e0f61d829796761e158b4e0793644fc88bdb86f863498173493af157c2fe28f33d3e96db60514ab85e02366e08a874020578ef147885a045f6f773bd4198ab78587187e5a9faab81eb960dbd24e4eb8ab4984a8fb1c16498af7c2d34dbd5d877a16042b7e24ab685c70b4643c2babafe0c3189d80253d854ec72885b6a38619d363878ab43841339e36bfdbfda630c7f3020b156103c71da220189e907f91d26a1628b877c59ddf27a6a8d28a838ddf28f0b8812a0367fa073c000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012366524f0dc8a7a1dfcb208a45dcf4918270cb07e8b2c24b2b6a7ff00e03b6cb022abe4c79a5589d391466e6e732a7c3fb100a62a5e6722c6be4c02f12b4c44f3f26320acb015ce27879193cf45a9ed46cc9d16309f124c556b203b3e35924e599000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b10ecda1b1d5fd0c57a02d0291a5b2bcc498c636e4032143a343fae82aff0a20d07b82b2fc326b05b58414a3f31e38763b4788e0ece303e444e5f907784121ad916ce8a91de34ee4d114d5a4894af778a5d9f0b0811cbc9cc3688561d3be976fb856b4ec6ac4e1a84a3e25d9a617b5c98df48027cd1fd931a8f5d3dcd143f1e8aa67c537e73622a0e18c4c4a75460ec2254a07684d6c9615b5710e1b7f242b3fad215d6a94e251507b19f044c9bf2181fea37c89df22751ecfb6bf3ff559da87e0d790dc4d470cca1bbffbf684f650fd7e1ca8e9ce4a0fe531f62b303f12fc159eade75319a3f7b97c8ba9e2466c15019b6e8fbce8ccc6efb214cc5118bd0fbb2a6743d9fb9973ad86a87478f34c1b79b4f71ae80cf9977657045e545e6ea78e3563b609861ccd477b620d017c684b6aac0217caca87d34b6fb4fa45f1b5d32396e79d38e20d3821bf2294371ff6cb8795126f737d198ceed618326e7f5c874ccc243936d1ceca134c795798ac0be9b5090a5e0e900964150b2decca07608451597d8f2ebe9bb6fe70e0367be1a8b3d068106699f7ae3c4fbaf4095d0b5909a02aa2acdb6df9b59ac01a675f79e2cf7eb851be073cf5d1c693fc3cc454f8e52b85e75ae064c06ee612886999be1fe915e397f1332b1f6381751c5b6d9e132290000022800000224000002201dd348e70488654317fc0c9b4db5e601c23555c6cdf868050a85257e1fb64c730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095449416dbe1f721626295cf6154f4f5baa05b872fbe32514bc273386e2e8de2ac1a78317aeaa8dade41c09dab37d0f496c84eb90f092dfde91212e2a7066312ea85ffb4457229741d3b504d6bb15f62ba420279e9ff10758ca967b2b03b59f480fbeb74d1d279d11726301dad2e731a6975c34b40f95b84cc37ec0766c3df8af276d9bee3eb5da278d8c1a09a91678f3dff579b06aafadb1aab11ad4712bbd7384532d6dd9ba465045eeaafd993b0f81f92b0c024ff310d6f52c04644a7b4ae08f0265ce6ab2c7e1cc3bee8ba0ff0b09f94437e844b41e51e32ba1160f375e34d22e9b013e0ee1a520cb502a89df6f783134e824b510c002e792fdf92d81293d76c02fc5b6d08befee6886b7c9371e6754df61cd2ec4fbcd118f8af4f8c2486b7fafc281b19536a19cd6b51cdbb0b7d1590b0f3b4811d7a9d29d4083920504ea3ae3edf512a179ad313f87cb2fc53ff109804d22f6e58d552f6957e65911e9d8a7d9f294b891a96d0563aa6b6f525267bb4ce364385d900dcea5be7fb7d892b431976b6e082cd03f6fbd6c8ef5b2843d53c33fbd7b84b40d9678d6f46983d7d5eab654e79b0f059cddb50a207f7844199a2f0441ee1fc187d5855fc90b806bb000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020279ec5159f47fc3fe4dfccd1fa5719a92a745615ad7b85214dbefe62a6bc42010062a9cafc4ed6d9462ca1e7502c0e74216a057243a04f4cc9ec3ef7c2cda47022cadc11ff8576dcd7e86d317d011fb834bf0d7bf160812f2ed2647de91e77519016e190af1da2ae91ebe1822e6d69b4534742b9023d5f1f337431a0c713ca9fa0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5b4c470eea5ad3aa5efd0da7ac032bd6a0a7d786c10bbe57efada566352e75b2ba5f7da4546dcb5e1a369eeab6e8045ba20fecbae64f3243fd58f300f87ffdcbf5470f3a12bf6b1706ddad34d5de2d7707425e58b0c5ab10d6fb28d7b39f2b4a5b56b126747a89da527ab5dcc61a1f9654fde5ea012758e9a35abb639ea809518a63e3c8bd12eaec270f7e160546f8db5ca1de253914f1c2899c59653f4b074e7a21637df6004691f764125d7a295fa46fea0861745dcdd58db8ef5309d8ff09562e05efe877d9b5d607f8e2437039f49728cbbffdc4fb15b075e7ca616c0a2afd15a99dc9db88ef5d58053b68486ac0477ebc2866c8a21fcb8a340110bf554279cf11477f5e9a77d32e5e66c12061ce77813d3fe6cdb8e5dfd1bc16c65d29508d743c4d81af8dfd566ec4bac4cf1a28e0cff30877bdd1818efb9818dc7835225fd1c97aa07dd34e93cbee939568ba1fa7307be79d5d99dfd08cde60a4dcf8c3c2d1e6d618c1f71e255e2b1d832ac041837b2d24c63aaba8af72633d9a5864e1680de30e4d6491ba3dc44b48d90e3966c94ed7bf59b97b333fdfdc31d9e4ca5ae0cbcadda4089e6c59400e2881a572f3af4ef8051093696a1709d66505605f8beeb64b741cf2635bb0f39cca13e433253b6a8ab98f57913b9264fd97990b3060000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c2e466a3cb78f9731ebc5be41411cec52da4d80cf17ff0e8bead01d201419a750f9c8fb675464eba4209bf99bc5a6ec00dca3518a2abe9e1eaee19248e9e729d2db7125c77169d50939a32b4a3727457197690996ab583edf35b3a21be24bf31f902be527d04ea750dc7e6b8d08948a5698f607c533e977da33b719a9a8e7c494dd4fcc7aabf64a5db221a8ee893a7f5f9e6fc44b84ba27ef22ba3793b5672e0a6077d415bf524cda73f89f1d5e44b93da3b1903f7ff04c9d2d789ca3467ddd279ce56682cf60027d6ae43850290ae8a564dda8667db19568b8bb3595fa912faebf34ac7cdc98b369cb1f85852030d815fc84018e9615dc496375739b37f2fd6a8c63b890ccea7dfdf48f8fdd4289a8dcff11cb8c90c0120beb96602c4418cc932343b988244e0ccb04c59e943ea7fdbb4fac927e20b5c37cb519408c4e1e9d7fbb7699cf263cf1d7618ded7a26b2d162618a2ebee2aeec5521a76ccc324dc7effccc20f731891f9dba7d7069530847a015da034de40e4d9bf24405775232093b7ad65233c88139f50b8425cc0a3023a7045fcb7853e3ca40a38171815e0a7cb3d5b22a7b6b04ea57313501cc0e95a4c555b1e3cbd7873fdd7b7913cd5fca439e435f761b82449dcb661f62b22dc098748815c3330f808123a8749bd0c05e55000002280000022400000220148140f0656e74e19c1c74a8ae9be7c45812ab511a588f45c29e82379c37fc360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010ab4f6b2430edc81b4870aa81789cfeb14ba03efc0ec6e58c6acd891aacda5fbc0fff9a95aab33150b64e04d0cd419044a41c1baf9688ed9437fbbb828c1d59342771ac7edf7ed2c4199f449104b169fa64cd4f28ee269a289d0247fed7b242df3441055a7a8113614a69ca5ed115bd4339741b8d80014134b1f5754a9e9a5f54cb8a8401bde92e321bc71762dff805025f32286bd42bb47dc996891e91b3c494331e5dc312bdf8676b5cbca76cdf75710876abc6fee6ae9089ce6244e1ef5a3d3c60624823a9c17f7bde67248172f0bfe68eda834f2ca1737a737314775f698c0c9a95f837f2febebede40ef058d913d3e40ad3067a7eebcd8dd4d1491427044cbb23b29bfc5f1b3c6dfe528b8b21f046d6135826ba6ecc3c013c8647e96afc76b9c60aafb78f18723473f07d1c65fa800802bd2d9917f13ff5e2aba7568007e1180b3d7ee69483a382e9e40bf034161a8eff2c99b9714eb346ad30c2cf493b562314fa46761b463c81fd34000446996d072c39b15a495c1bdd735fcc76ea3218afd1a9361a3ca65da66a7b826b9d02a8fa1b6242c561ecd30c0990a69ee138a5d0c4efdd8dd3162295ff72b7adb78c38dc8b90ac590d73cdfdc5a272d9c84000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011a8aaede72d584e8c0fbb53e91b1101f46299589262eda2f3697a6a4edf9eeda022d9f0842286465d7e4f80781147e89e39bc12b689ddefcc9d817f94096ba824f08d2b559be4391f6260a535b6ea2ad6bd40e9f543cebe15888a902d842e59e090000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082c9b14ca56f05b881d4a6f585fa966f83d35b1f9c54bfc03edfc1ba8aef617e9712c0346d02a9dfb0da208e1949dca2733dc6962bc2406c435d921a8f0dcb58c0dea3926517b4b64da7ab8124a8d0e57602a733ddc9c60bca54534dbfec18e2c240bf0cd218e6354ade0fcb425473fcfc9df97c80dc828255718f5371da18f5e78dab812f5181510efa5bc3dbeb047bc59afe68a577ea38d6a2972ec02215416ed614ea1730f47af62299c40c39231664e5bc50d05c00a003ea7111361bc5a505ad18a1f3e8e2d2eb25dffdda3273fa7968115acce3b9ad8fe139c0ba68a82dbd09c99e89374c39baedb8e313dbbd92c4dc0a87f5056028133249f68902352cac214f189a6bf4f2ebe08c773871c9c08b60738087dfe2a057c3dfcc523d74a205cfcd0aeb88b9806b67ca6c69d608e8fd9dc59553eb64f1e0e0e5f88a97f618e5b23ba3d4145d0ab379c1e8fbba75146cec44becc9c086c87931961a86cd6dc66da82c9ab7e6a49075460ca789edc6731721e27437919531dd44409092144e9ffe20c7f8a2fa59af08839906fe08a45642081c749f2bf46184505adecd55edfd71c0d5851b7fb5ec6e209262f9d594590a1d66b76101b231b1a19506f5c895a1a42ac72d5b906f170021809aeb605aa740b80774560dec793f1a965161330020000022800000224000002202e977867c258b8b384515288ed704f3051e9dfb167f855930daaab79b0cbaf19000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000886d3e09ba518aec280600ada7a46f161c22c5fc75a007fcd41578d057c9865a9a19b1f3496818ade30423b57c2e886c947ce940e3701024bc25cad62e4ae0c02f1b287d00037005fd48d97424c25e05d46fcbc2ca21c949876a01221c7b52c57bb7ded5e8798f4e8181fac5d279bc140a8d5d46de8814c711467391366fdbd311437be968e21184ac52222c09cecdeefc3174ae7438d2bd2310dfde9fcc05033bbe3e7ef65e88b840d06bbccd9d645595f174701783a3dd6f54d93bcc5c0d140cf72107f772134eb54f9ae115e5e0a3159b52206e39e4b13b80cef520ba475ac7035192ae322d905e8604e9d747adbf44940da7df78912ee997c2d9d3db67753b08a2c1f180dd1233b3cfc07c70f1e82802ddf6de5171c0b0f06fa27ff545f45201ddb596c7fa6fcea2e5d78f7a39f9109037a9cebcc748c77e83dffde3d32a74549fc98b5bdc2eb9f8a0c545e39ff3ee3cb2886fa122ae56262a0107b887e570ec12027e8b5f70b542adc598eaab96f08100f477e8172f49bfae3c7d4e202eb391c5d0b8fdb8bb98dd500f28189e94685a44300c6944e19507560c7e9cabf60d5533adb5b0d0d6f390d897204b0b0c8ff2862bb8fc6cec9fa9e56c1df03db0000000400000000", + "1a21c17e136274b9f383e9a48700215c6cc1fd058fb6949f0fb8ca44579894cf0000000b000000000000000000000000000000000000000000000000000000000000002400c2df1437c28215ef175be46b1a456daf47fb7032db342863f4b53bef3eecb200089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000b014e5f17cb9080694eec7704816c37afdabd0b46f319478e91cdbeaec4b80014d0000388012fd82ecae004287bae743438c1dd6c393772a0176c0bde0a31b87571a83269a00003900190b2bd9a61e15de13fdc0dd5db50292162dd32e7193b1d73f6a966182f7db89000039000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000070dbda3c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad37771414f888b557c208e724f638a01c16a4d5490fc40ef3e601630903e56c5a50dc870000000c0000002400000000000000000000000000000000000000000000000000000000000bec1fd40129f3af9e9983cbf3573b14c33821b4fa9a7ec40862f580dbd814a8be3d9311b10202d0eeb231d501877b0e83810dfe29ce9d8c40615bf0719bf389a9292a0e6f9622751868cf508a05055ed372ff0925d8c4c803f2f48183d82b8f65226164a33100000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b039eaddd5bb582eaebbfa0e3a477415c767cf7bfe22853ef7ddc01fb16edd70b300577005ee3f97593d04a2cb234fddbd8c28b2149f855530577182bfd6a412c960bce17de0c3fb0d19c9fb48a57b032cbc4a76143a27e5e7dd2a160d8cccc501ac324f8167c8d05d4a6699bc2e0294e4110e7ef6b597b375eef81ae1f1f936dad91bb53616635e9c5e121aafb7c60404bf68b698139250ab20e54467880fbc2f8d903eeb1e7ccce9f0271411001b7117c05940faf6ff863d2e77e56547399ff0f189bd7decacb9947190ef3899031caac490f4e1367ba282caa4b53489f56724582550f7ba38acc6633f2e849db06e550d27dbaf3ab5139f07b46d1f88a8ef3568c32606420f9e607858dababacb7a54a6c59a8f9cafd7d31979b1d8d53a5ed1068d7f493df5bfd6af03073b3ab38c7014f05e4129c0e1735182a085653c7ccaf13c075735b8f0ba2bad2594c86f1e50399997013722ff3e83eb8b61e97c2fe2a725c746f00e4f1ed8b7c1178b0967eeea4c3159429fe967141d951f19d561c5401534f5cd705f27822f2ae4325b5c9b3b8127c8228f294070f34f1a098f18b35bd4294280e2ca0f453d6f9bf8a5284eb3f2602bc88f43d2e60f2c08913146577b58db95192c515f5530f35fde656b82ef39ff1e428375582d58c52ea266ed0000022800000224000002201b8d4091e73d81d9727137e6f9d452005194952d6caf8a74c74e34deb6b31f7f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090fc8a0e8a2e9dd414a3ec49ca00493cc3d005e6162f4c2523ab3541956d0b99e6b007da034e5b74f9a5a5d369bdd52c726fb5fbee8b5215580758ca8e6585c48ee84dc831f526b2c2b384257936746354e69979da9ca0bbb2813e145e1baa508b4d2b04ecc4374dd7dd86845cf378fa2bbf8e13c6f58521db0ede34e793e990788f7c68bd1d18f3105a927825642a5238724d3a44d5f9940b9aa086d9e43d2f6734c9cfcd2acf54e09e6a9e364e805927f3be324737984dc94ba34b9551a34f024041af29c1c2cd1a0aab57f0ef36304982854b55968a01715cc59b42aebfaab25ae47a8d95194cbfecd40ff63fd776a212066a63d2d4c61583745f1d843c9dd85d5c4b9eb6da2ff071b87b7a9615577f2feb50a9a8ec1346b3e029d93749894d9548f9e74aec4a0637594b607d926edf1b6139ad13094210120c853f35a78ca683e3ad7b4385674f284564f8ca02694342f084ceeba41a9f9aa30b9593f865bc652a5e857373fe392ba348e3a76f585e44c78fd511043becfb5911931625cf32f8fcbfff87597151133060003eb7637f3a8964fb1cc7b2e4574021491e64d822f7ce3bd8d711f485a6a7ffe21442cbeac5388e8f24d9f0e4807e128a53dc81000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012983571ebcbe05e02204d682cefb1327b40c1f27d3096918f8a091c03a5429f40202ffffc23cbbac93e666ba2722124c5969b327217dab4810a350c7f063034f6422f907ffac4160874064daa780a6916f14e8239f9fc7f5288c80b3e13ab02797000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e5e34e56689e19e2eb0f6964c94a801c4910e603e2747cc1e230b72afe12ea7e2cf02bd58df167e8aa3dd1bad4074f4c85d142bc8b808be800e0094da1565398c2ad65e9830e4da9be5e8263b8ddd7d31a12aa685f71672556a303b777b215f14a6b81ba7d47d26f7244a99de9670e8c58f365eaf1e4fa90fe13de71be988e2779c4cff1339b4c5ba498ebb026abc987d4082fc8d3a1619797971b3c5b97c51d5ec22051aa2d19b62a49c2a6d69a6323f658cb93c8aeb0c2383c12607dd88767b0662480348f43b5c5a7b24ab2de5e07ad17b5c93ea860ba3a0ccadeead57073668ff1514b851847f3b25e5d72d74b2984cfeafc2cbb4b715e23a3b995a2e105d26863c8e0af4f8d8711ea15599c9001f920c2d684d32f082e84de649682a24eafc3fbd000b67bdd925022b1d1cde7245b0d66763f8f5755ec590a83ba554b9040dadb2eb50153ef06a37afd76b9dd397a8ce62754dd5e3f9bbc377452c4ab2d8f5e9e93e3055ccbcdbc8269e0d4a1c8e80e3d3d7c18bf9d0fb98557346a0c815014d844ba6df603ff49ef201d74fec7cfdfccb3e2eff6e45aabe70c45504ce228eede91b1e5ad71e8aa24580608e4c3bd11aff14cbac80682cbdbf3d256595713cfa53bc81fe64022092aeb75dfa10a19d7d86a996303a36447ec377a780dc0000022800000224000002202b739770737d6bfe63f3857248693e23f70383771641c3b6c743c70a16b023750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007c2c383d458570504686be97e786efb4cca53f48b2dfbd78eb117589de3293f19eec9000d3ad45f2fb9c7ceac134f9744a5dbc32972e2aa2634b262153f2aa6cd57fc65f2b8cd57ee1b3542ef06d73e6dccc9120ff04db6ef0eb07653d40360ae38ebf5443a3c43bad66789f5874148a4e58629d287ae4bb6b72e49de988b0a9ba835766235bb14708d28784b6c3d056fceb2cc89319fdb2ce4434bca16e0ed2215b61220196b5927d38182340102231d8ce537c1ed83a082520522e293a8a625d8c820549aaaff7fe4a189709b87d587db6820f84a76effd93d46693fce8d8df2f24667ac49e79f01dd624175259297165fcdc093952daa2a538df66504af3155fee5143d75d86c3978eb46fec5f53413344d569cbb3d6fe0a095184cfda41e414921434f3834a5a76ef28129ab4481fb52f127086c5944b4921b85dbca4f9e551a79e6577cc02e3c9111cdcae7fb21f564b8cf931ed9889baebedafc049a1cbc0911369e2e71c84004b1b9b093dfa5b7671e0675a9def5e985b2eed31bd1cbcc731a67e8247ce7885f0abb7eb23c8e548a625382f67326817bb2284d82e631c1fb85682ba26329243752e1426057d57340fbf1ddafd29d84e7a7e45a5c9d3000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021759055f5e9034f4de1349b9c9437d4f6920a7ec37919d201cede2e4269136a815ff8bb9a4a6b397ac6d46c0ce20020132c16f409869eb0d7a364035e63a836d020358aaed230910d7365e9bac037948f3907a4e7d9d68ed4f41179a41f38ff0b8139fa6a22e04b76d321251c1d13fab97f31b8b0a3aa4b4b6cfccf3a19792e26b0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017ff6c957bcd0e1265c8391864a1681e491a553cdcbf5ccb4af66fa96dc1fc28cae7ddabea58786af9f23f75878b233a94c3eefc6a32b2043e3352d81aa058f2029692d15923ce071b93af0e4b221d164dd8f326101f77c8d5c870f0bc229911c78a10c95502d411293e6ff8c8be6c118a32368db4d4297357ad378ce2c63dbe52473c5eb99645eea32749610951b39e50dab34c07f93d638ece13b6014366b66ddff1b8051ba1a9f7ca6d82435416d63baf4326ae57045797b67c31b11fe2a9e8e0cec62a72daa364056b6f81809b0200917abeaffb6dfafc8901edd2c7ed01936a5b5b308cba67230f83d37f102544a8cd7dd2d78906db420f24fa1768224dad5d859f976035c086aa91aa89bde63cef3f70b275dac0594af5acfbc691f27d65f1ad986d0c3e404fff140663c9cd696541688fca900aa166d8360deb00906211dca52e8bf429ce61eac240cfb1cd3793e3f5802755cdc0112fb148691e12bbb543467a806ce85374f422e8edf97f698891934913ea96a89720d33ee275e58ab72af240ed9679db62fc1cf242260c80a4e1133c1841b6bdd750ec28cccf97286ac22f14092a43f5fa0cbdd672e122a87211787b567dc19e943092c54dd18e96e840d4bdcb4744ee2010496a86b0475adf2ebd7c542c51b2b03a8ed63f51d4e300000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091c667fbb7dfae9aae170e53a7e71bb529dcbb4719048e72fdc2a99afbb326075c7205a13eadc902b27a74ec7078a3506b6848d38acf503adc5de79c1b9b634d6848eafc16ff4421b4e99bfd164ad49e707a96928b064b486ae34c32511911210210d8479a59b89cf15fc0add46c75508e0d9472aa6e9f359603ef64acb90138021c36c5c7db5e76ee790e6c82106d8026c6dd41811b73c279d8243f1bc2a4b012b2702acfda88493347f34dc790e1b909f954fdf31fcd32f24ba0bc18cd4c4e2d6d128614064de6f617e6ed755db5d14b9d2b428c1cc0fa916521017978fe77ba84b893be9dacd6befe213fd607ee0e26344db4f9a66ce4a1c3cf0bc98ddd7e566e72aa7cddcb60c12bd7a2e9e56dea0aa61ead50d5c928cce4a5bc6cefa54cae76bd935f3c0cb3261248afffbfa9d034db0de54c319e24365bdf6342cdd1c53be12fa476f1d52d502dee4bf61847251d890bac374008e24e0a4e086d50e15ea247d5d22c146a2e41ad209807a9a0643484ef5a5aa990ea37ed8cae5bab922bf4e11bd1d8a063e41369ebec341f4e54b7b1f756814743a4f4a6c7a38cfa352881dcd8334d8bace9b741bde9000600c83dc9b77f6839b77d0bec1854fc5d5e7b6164d920e9b83df7b1016da5ba561e81f18941ef019429016ebe6c45c4b2a8a7000002280000022400000220150cb084b1e803021611edcb3c5d25ee984123de71dc0e41b4d87597f5c6e4f1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e0948d803acd222bd3d35346c0c703e8efcee69bfeed001942e4772c775359cc95b75e433c0683684d8ab3c3da767c114a6bd864460b56a58c29fbf45ccdfee8a98e9bc17fe13603b52424a11bb2b8b3c4b2725b4735187f1460f301ab9a75844faf1ff00afe2e4eb1683092137d85886ac938679fd97462bf12da2b6fa1bf9b6ba005805bf735d9a007bcb4b0e35478e3bcf790df02ed9d7cc28c7a53787e5640e7665d97660d366d96c23d3268a5e4f13678bcfd7cf990690a9b586c7aae9cf2b473ff82ec26c4418826b879a567d1a2ba7331e67c8b12181d54fe6b032d138da2e1414bbd74228499c9774f194cc729879d7a4b22d75dd0432726ce5584fd95d9e007a9df391d7f89f04924a6e996c5e0843b0c003cb2f432b06393a6b76c02eaf54f6ad7a8ae10bcb24372354d4c2f6178af94e16c3d7d889d82a8e940ea87f0a8b9e30992401beb467f9b4c02f0a1a963c1198e7636d530b36c0c78d5a4d4177f7356c3f2f98aefcfad031b91e74a0045c88653af8732c7d2322e51892ad1d2eaac29589a40481e12667009b1ea7133f4498a4e88eaca8574cb909fb2653bf37c358ec22be63ee9936e67eb5a6f982d065d01bf370105017100076cb87000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020fc16ba1684e803335550ba540598179813f12a48df2173b7394aa1fdd78338d07d8f99f9d22a397a5671db258247285307734172016feeeb5f8c0c41aa87d5a0203e33ab71db69476091fee80b210a27fcaee22dc0bb9e568391f8249dcf166770d7a9fe0223123ac7dc1ae650c1efb447cc6633b51538d941e484be1cf1b5bc40000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009253d750e659a3983079cff1aa857e43dd5c7345a48683126de0464312f8ee8c6b02fbbb7cc5c89951b3064a39c857b37b51ba6a4798d22f56bfde4e052d1e7a9973470fb61562c32e6db4f35d4d80d3b9d7855cc385d97a7958884878d58d867e71d9c4ad63eb683534ccf75a0444ee119e0e8ba781cd13e3704c8771e3b081611ae5a42ff439d07efe2d4d53bb11c6edd5f3343ebf45bb66defa78383f631b886bfdacbf0de09ff4673b51ef4251cc60cb9a382f82ef0014b73d7a667aaf9437fb80e6e26ad0ebd2856a500121ecb36b2eaacd39301bb565f89d2ab3b0ce79818ff1c6878f250e161a27328247c8bd048f51b8a3a26607be05d29b57ebb91168d4247e6803f8946836361259db71cf8af6a2337046665815844fd4a82368e6cfbeca245343e0ca06970cf24b00d1947cdba6c5780b15002113ad2d40d7dba90973c4b0f846c8ae25048057a553e8f12352a696184316f14809f6b9439ab00646cf6315fd92b80739b337256b9a7417cb64c175b16bbf86c9ea5181d8522e2780e0d9354aed68cd15bacfaa3284f41c854091ca90b439a48523a6436223dd1f5ed54a4ef728b8a1f359edfc4f48113c6143421cf49b96439f6d8eb2b416fe0ee4ccf762a0566aa9d0e399a73ad4672063d482d2741dbc3accdad44966d496d20000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0a7318589d35cb15d9d951457639f6992d04b701213e2912a8b6f7f44ea2ccfda7caeaa85edf1fa39d3dd4497e60feba6780d3f06c6593798afce2a637765af8673e4d085717c30a0fbc5246aa30b1172e43a2d552aebdf24214349c81f713c29ca70f3b8aa65ffb02899396c3021c3ba5b3596a236534e70475896b570a9822371bcbd64e502780cf49c8d9c45518e6458a945698c3f7c81c254287f56efb9f0738d4bd5e34ccf2fda945bba802c278569fe559b2353940f72944ac7a43ac24ae1092a8ff0d75e4705872880835a0e85239e1a6b213325f1b8f4288efb55135b467336b5032f35954386a624a781387d3194c572f06cafb42cc57e2a88e4599de2b32596fe5e94f3cdd55365dbdb2d85be34106abf0ce870f77e246c8802a32e128a3b5e9a34e0f5d6183f29e27c80048d3f5f8a4d5f4b825dfdc72b0c5515c47decb7140680b62b10d14b8028ab086b311e8e7749c74f24e10d4b842244b5f88efd2e87bf323bcdbfb6b485cef823a106965ef564656750db67a150b08837f9b8a0367f40133886201a08c886dbdcb57cb64805e362777e85b1bd92af0d0bf281e9b84f44a7ab80267658ae78104219a925232f4faf284d93d67dfe7e7c4d7ab284a1d2ab8a4044029e3dbbf65bf102d921f7084cb7f8bfa40d8bb0eb0000022800000224000002200a9c4c3e64b9a8e6b74d87f00cb3c079c1bae153222b79760cb64fa55695a62c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0e3c6018c74fbd8489b8a1001185bd1f08296b6b53700330f8b929c8d5cc49d7742a3c2e3757bdd930d8f0997f7370dc196e88a8943ac26aedc9e9f9e862a036b0c93c9755df7edcadd61b478f38ecd199e5ba1bc43dd49b047b08623178c463eebaea363bb253f767ff2a7b09e3fd5fcc7fa87728c49428976fd6c849821628dab4ec8f7dfba896afff4c260f404babe48ecf4806609eaab27e09f54cec743b896ac2ecf0b8ff897651bbf1d11be3baaad91b2fae3d9de0247d7cf77cfd95a534820b7a0af765b71a4f56c9cde7aad55cc86689b48dae285ffecc88c2a2612b41eec12a477a617bbf9b66a84a1d72ec5972bb3d25f4d36a94526e75f08fa723bff307314683512efe48c701406089c1130843078fc84572965ed37aeb972592e582f09a2000e8f37b1a59d54ed932bf3a046f460f87b8fbe97fa2086e3f19a520c74d6b7502be76062807062db6a1725057e440d5165da8494623c5ea7aa5971dee190690547baf8404b0d08bbcf7e44f195e729b1e511a21ca0e5d590cb5ade3b046cc3998ebfcdb598cd2c6a10cf9f3afdce78106b52832a0a45c4bce11183af6696430e740eaa59d4584a784ce6e5f493b6bb2d4d2aabd0d050c0415a16000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012b02bcb13de0946e00d3e4247726c08f02aed3621f5ca9cfe218811f39a17b12020476141d5f06044fa119081deaf60522e58d712e8c472a1b7060f3e24b0979e517ae3dc6c1b23e81366ca246c6f0d0f24de9cd5fe3770343b40e6d4926e365e7000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e3033ff89c0379e3ebdb7609691307c811153ea5b56ff12946750c6f9191a38867bef891c62bc5b3ce8ede8a7be19d80442e20827dc033728eb8e14e797d51c3c9b16d3d4b8c374320445f8a88e692eeafd34fbb5a6fa67dfa23ec7fdb6f5226dd8a5edb0dc7d251c20c8a7274b442e1fd4e3ffe383f595a7b81ea7533625c7dfe27643b2a744e2e1e2fc9d6c552fd6dfbd93eaf543bc6c7f67406a11a2d4fe6722a9fe2d32093be7bc70ef76d201cfd3ee7c5dc3c9d8650f414e3adbfeeba8406c31ae81a977272939ccd8abdb7cc5b3147ee33ea0ac0d3807eed4c8dfcab69436abac9c35853f11e66de0bb67648bd222d408b58d3a94aabc504c77c89be5dc17b2bdbbebbb0174c0b4a63adb07514d5620e1c7dad7c7323bd22cff8bcbb1b39d11685480d43cd50fa88fd985138c226936abed854ab4d68c720fa724f4ec935b8b778c0c8a14a2c5721006d84e0accf5aea9de461b4c9ce250030d7be8181987ca3bc7aada8537a0fbcb594b1dfabe43e73d61ebb657f2b38ca1c6b0ec84eff46fa5c6e4e6d5410f28903664b9d646d19bb01f9ca4bc44311cb5417c0b363eefcfdc947bfcf49f4cfff37f34de873aab574055d8e31b69f7939e84ae55e4c6f207ae92a95fbf1afcc58fccee763e6577adeb07085bafa578e4120e07cf270000022800000224000002200a02ba415197a3dcbd373c9ea12fb247f8501df1385efc9a82f0427f416da7f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab2800aec33cf2dc07dda2a1d2ea0f83b26fb4e702dbd616e2c365c28ad786ea39223caa89c4983baae2b67b97bb8b791d01c526dee847d59ed65d60fed0c890087ad225475894f1aa7266a3fa0bfb2d57103820dca6a97acce1cc346fb6dd47e0e8b78ae6e3adb7aab4d88df0a84f09723422039c761c9aa8a3fef3cf57a49321e6bd35bd2d4b75252335787f575914c0ba45a9f4ff72c3a53e8db7eb13b099ed016542d620a3959bc52b2add86771208060734748477f41422bd18d0b87a4feb9db8234f0e2a42bd46b5ee874c09eb3dba617019f2a1f74bfced63b2964a74820b5d607857871a9cb6055be0c3aec36dca32be90e7d2e8f6f3d1bece500cef83e3097730c9d914f8676ff3d3a1f33ff0e0a1bd49ed6c536e89f24c2968267d338cea8813111f1af85c4012bd4805afaef8ff74c1eaa82d6acfd826f0a68b0d14b62ae78c2db65d426fd76b1c6d3044eb20b90f89e9d4f6ef974ab7fb5f3549164e525a326e893f20feb63d8c9a0f8246e63311178418a63bf0356ee5d01343ea3ee44ce5acdcf316e9b42688e52099ffbffc631341d8c36fe2284dbceb095d02e081c0a19779b886fcd4a8ab78f4d2943fcf6a53d54df6934b525c031ec2a5000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80203eb0c306b5e80914f39ebb574da0cfe80000592bcf7dc7d69fa93db7339462008c6282c22286832720af0c8af4184763a094eb3f40fb0c7985a42022e5f39100204c40b9af4715d4bc36f1a1a27fce2837b7a247d838f217f4be8bcdd3e37117328d2e555aef379642e7830342cfda9b35ce33c1cd1b9967a86f8812ab34f72da0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ec6d858dc3c6757f02037472c4fe809cddd42f1f01ececf057df7bc017012a86d07acf690796d515d5c5823c6893ba3dfc305bdf0242ddfe98c3e8b17116bc3739dcad0b9943ff86b81870a66c07bdcccb382bf77f218dec4ca2dea3301fc23986aff460e7329a74c884d75d9c4e20fcd6331ab7363180d406090952b9acf01fd90ab0b4455a2439420cea0b9cbfae554af36d52ce354c1897741218aa91ef23918c436570aa62df2ddf65abbf6d879ffa2cc1e44c9e7612df8a7f182e6e5583de6f48d5a44d0fb71def87698aab5901a3752986de0cb0ddfa400412be56bcfa9f188f9b5966b6c5a3f4bebbc23e6d0c1d8b797e72b0c0ac5cf4e41a5c2b6799ebf2a1cb045dc40f9b8b59ff14910c4ddafc2578969408e6de7e69b9f6be73a95c4212913eaa4642dd8975508e2bf5ef6c9f455964e1f60420cdf5e8a330e0db8fdaf83dfe829df02e755cc03c8c0088c07ad0ce0b7cdb86ba945a513cb2005394c0508b537651452de365e061d7f8d1b5e08ac8a063b55b40066f9079060c9d98ad8619253a2a0860205f133311071b5248741ba31ec5e223755d6c4eb5aa4fc18256103a4b6f0de3259f47c89b5e28ef4f7906464725c2ecfb3e74fe26d98c382a38dfad55754595b8322c7ad560231be4cabd4086b88dcee08f26e086f490000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a67d972919750b0804a271bdfc5a934842a2b4770e4d096a3902934b95d860be7fb0658733ee40f28f49950d23671d82de5a5ecfcf4f15e09b55b27ba8dc2699d3979acc50e5572e02fb34630cc4b31b2e8aa5068988427417a47c0ee0ad76d8dda1751cc30c55c7a9e36dc94dd2ceb0e96b80ef65c398242c4630946e63a09733b3cca9c88a63ee87570e11a67fda6dac0fbe5992bdb71d14e5530c202bf09500cf2dcef3cd96b85da9cf2c98c1cb7ef658916b5f55f4bcca6f9b0dfc332ccc3a2f18e3cde84d1c0c9615aae27df683b9bd8004bc890166036f2101d4a0857b945b9a600195cbb5f1b3ffba5aa7c58302b2c83073f9a66a25e4886ae05ae9c7cd85834150fb65aabdc3d41626c31903cfaef099218cce2c40c330a0b9802155778d9076a45d418db3373f506f20406b91e38b42500f67b60af6c8221e346527e27dbe92c1cf1f9a0ad8e5c59e272a33cc87047d227aab081a9a85a0b24272ca237036a3007b20cb68a65d1bed8f7b6dc74533b92f143d6e7a98b4a57717f428e467121e3ba715a7856ac492aa3879a36a2b51b2c6750ee8a80e694948ec135b52019ee073b3cbbb1c0b7a5360bb697193587cbb30a385cf8175b5e5417b224c869b63d36ca29b771c84ca147d149c334906450839748ac065b70cc6d8e61c8000002280000022400000220298e5c5743b8f0193f0724409894ab60db0602a2b3135c09342f4be8f53cbca0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a975946d2920a80f8ec713ab9700bd590c91fcdcdbdcface2b4ad7bfaf3a6aa5288db193252e0e46c97dede74cca60fc52eb5e828b83ae28b31f471b1064ee3a0313d638974a5c8c92fbb775c51da130676b117997c5334a4fbad6f1801620b7875166009b206bd5cf71cff1d568ebc7deeea3980e1183f61c7b5df864995d58fe3e2593050be7b434e15580e05e4f1b334c1350db280eab7c8f6e15d176d494390749c43bbfb214bf24ae72251d26d59e4d5ed474bdb76181bde37b6eef130d8d8708cfacbee29ef60ca43f54849c59e42406a00e5df39c0c8688d5286a861517252d8c2517ceab551262c244f8b94f12ba0941920350177c317934bf199a777725c856882372110a1ad8fe9b1923805880f01490ff8b4e4a3c2fedb91812191008147af7c928c9ae317045b3256b743088edba86d6a4b21a6933b6205ef21963ac02db622e40091670e9052b10c7b99b7a8d6ea97badd63eb08bbd24ef3a01f1189bc8fb3528756399ccb47b72dc69fcdcd710740cf73f2da8039cd9402a621ba0c4de3708d45e00997ff32caf5a372b3b201c7eae816c65d6c848e0677b5e4a51fb5ded7db84c2a4fdd34ddcbcab46b4de2145f6acf3976c0c023f635deb000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011c415769cc4b4e10212ca6b7dccf70a8e9cb3a328751f26479c0d5b0f3cbcee70205c124667b67e47f9a12fdca786c91acb87abbf6cd77746e780775129384948c2038278596a3ed25949eba917083565108ce8d36baed07f2dba5ed1a2ff1ed27000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001190ce1dd221930f9390e301078a66f459b153ce52ad2d561342098a39f791370e382d7aeb10069337b695bb374b404c110a21dd3ed9a751a8351f462e4ac4a8ef8533af84dea721549e7d25c4fd97857c831320cfe86b1c7ef62eb9ccaaa318fbdd88a15356b5ba5a1d238ee64a55c9d207b6f1c588c0db797526be92289b1aced01366af2a047477bae17cc76b6890d31e7525767a1c558f45a582327ac390d370d10a7ad0e33879d72389688035fd0221a1701803f70342f414b6ebe2de87ceb2aa9a368868e9f174ecc2dbc14fd3fedd2abcb7f758de7a3cc5bb3b0369a5ce2cb44654c7d2945b2261fffb8b45ff644e98f60723fad8f7596bb1ec40971b33fb591734a160d42fcf256615a83c010b5de744a819ad9ec74e0c212ce44137a604f8155a6d8a43f660689753b684f027dcdcb909f8b249a36050d579b0ae7cfb3cb217c4cb94e359a13083255b0e0c56fcb6d02550119f2e70e53e825da4149b117895a7020fc83adf8ea7163891fb3141bc7a6c4fbdce5742c7bcc33c561b29fad1b1ccea9574c3f7d72fdd08eb62bd18246c2e89ae2d3a33f34b173944c15a763701a3db0a572d7b8e74dfe0c79b2936d32f9278186b91eb2e82a4aeede7e649e32c777cc8fd717dbf20fb1e62912df26f40541ef31e3bf62897dd454d770000022800000224000002200178348fa1031088a14ede7aa66ab69fda2627b45fcbabda4cb38bf2ff7bde990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010059b88dce34e7a7dbe9a657b5aa0259f0bdbb71cc0a1a3122ce7a70bc9f13aa446fba35b368f0907f6eb71acffca9c35fd1dda4946030700067130120ef651fed1c4d0397324b700c2ecdfeb4475c94fd75e863eb4b8a94b36a317964ee189406f07afcc5c9f7686f18c2cc0ae517053141ca2b2be964769dcac98061028ce7dbb71718b3b71bb2343a8467ccbb8bb61317dc6aa6884a8e7bbf27b68bd830db8d1f7eebecfec19ac0cb5892b3d55c6333bc302868a7d36e5345f2d80d358a2e7f38892afdac9f26ae9d2830f29743f0180453be32cad8714ee4af1230acfca4375716ee9a3079c3d7b0683f92b9138c227781b0d4c536d748e20ba588cd7ffd50daf7df8b864fc5427758bdf703a1355c3db0c41914b032b469a9da555b7c2d51c542932a12d89bfdedfce124fbb2dcf3be90a374a8110df1f33a60feba2984e6a5eb6c56a3f330915c0a08b2d8ed566da6f80eae8506dbda20392c4e3a5dccc625465bcdf4251ad36f6d3bd7f4de3d1a418979fd96492f8c95c1462873b68b24416e199200f0e103e35775cb4a83500fe4496d96c331051cebe18e28bb21422fedc66d55bd5bac7e306ee3679922c328a5c4bf09000eeb8d7555b41235cda000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40122cb1c022cafcac46920a57c884a51ec194d80822f77a516b9e4d10d34ad516602086b1b88b3653858a8bd7290552558f2b65c49bf52c0921306494d6a246c16c4155d4739624468c5b69b123c0a5809421db8e46eff7211e21c7443ef5727a5ea000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009bc37b95a25af88a22f7ad607b2b3c6c2a812db91308261b2deb2ff33504c111c6cc63f45a771e38114a9ab9d0c1101c85cf46a81d4e36b8fe55f147cd356315a2a141abc8fdde89b6f0532bd7ecea4623d89750a5d479120d597462429806d18c70fae81a36173a890481d7251fca7bd4663f95467a39f98f52876982c5d2a213799c0b1fe90ebe1fff2d819a717692c114b80195080bb666275dac5ac3c70170ed7e312d28de1043b40dc3c99a8b0d6c5552a4e09872d084df78f64418c8d9d5d52eca225782d325673f6b363ec50c708e786dfa4fb95f5c20eb0e9f61deec789fcf4432f4c3e38a29826923d8853ee2771770f47a64a136582eaa4c9fe7f9d9e4e0ec6f26803143f25f45f268c4531fa1b0c4221d55da3a14cfc43b22e5ca0b1c6d18a3a4d7e9a92a04f7816e7f35f84a82f798f1c1bcb08bd71e4839cf5a9c617afc3fbe1dfbe8e62da582c95bf2a2d9a50ed18a11eab74271e585d5274fd78e79f7db93e6974957b8ead71def35036576bb8d3032e323df413d9852518e488a4dd670b09c921f607afe1d506f35a2f1d8913d469b7a1decd1e590b0fc48f0f64833856cda076285a0bfccdcf4bd6f061f8c18d112e2f72b10c122c573474c75c0aa323e56c72e4534838ee0a582eca5d8a0a64463a7819c94b3b5ac38980000022800000224000002200efe58c7437979cebba568c6fba391ce6a3ec8c249fe74ae193f8e449c02a02b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8c20d4cd5d8ca271138830adefcc55d5d1efa06c0b903abedbc28308b041198dea4a895659b0d6dc387eee2661bea82586b3774818490540bb0056bd682fbe7f385571e2e95485240c921f1f61dc1c46672a2946376f0ac4f24693090d89230e01b27959fdd2c75a81e0cf107a4582887b15f449e0f8ea2c45a9169d7e26616e8c53d61deed0d91dde249c373efb91de0103fe3f10b4f6c4f0325ea2bd55377fe8b7db42afae90c6754e1ea930af1ce814d3bbeae18a7574d76ebabb958cfda04b3cbfed3ea040f1aa09e5fe93a55b227b372fae58cadcd821e4e341ef5ff3c966232884c62a77914dedd511ec2f00925c87919cb665d6bc73a7393d21c8fd966b037556737bfad97550722a26cceb219fff1846e655632fe19470c162e4c03e6168f74a2fddf7c57595e5756f2230e5e4e7c2cf878740ed0e463b17207e15615972799d7d2a7a6fe48c896cfefd4bd8b1bb1eeaec234f08de411e2d81d0c15ee57dca179520029faf7c667930da97d4697861f33c9bcf08f383ba0e2ddd2d40157d6af0830600ff956bd535da47e2abffc4de472e8cd89e277d3db718d6dcf9db3a2e5d0f82e3f2c5098d97e439151a6cccef8c8b52d8c95f5aabc88744678000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010a1c6f83b268206a99b55c479adcfa18be3c9a860ed4ba61d59d17fee4e152c102087ba5b061a6ae55f1741cb61bb59a15ed09adf0c4b0dc2966d85f6850736ff7154e21eccc62a64a37bf50dac6d91f51fa0c6c4590c032c70e2c50ec16f1e6e2000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a702bebbdbc3d4db77670e1ebfc4234f33cc79b6123254dede11a406a76b582c571e987afa9b1094cc4df8c6cddc38029423b98fd76de6de6ba742f9510e5c0edaa6bb3cc448cad50612f8199475b590263a1368bd5139ae96e2c22999ef3dc1a7171b48ac7efc830848de9bd2f370301954f617d4ed2e68727234f0be9d08a0df0b732f6ff10de37b7d97c4e9698c27043142f4a0cf775532b8c35aca126853b72869f9d84888334a0a28f9b59b018ca26598b710523c0b7c71ef1f8ac581f362e5952e536a5d9e13a148ff5f856bf9ad5fa1346dd24c7f345147d599e07efc9b526e98efc6f4a37f1a2278d508f6359dbd8cbdb8067d25b00e89fee4e0004a670cc29db5a866e571d51817edcbb05ea4c947d292dd91ec89590fe5f61599dbd7bd9d232877ca7b18c0bfc385d4eb6a9c7833f412dd3999fd839bc6f0278c4e5deb90ab52d1785fe913b9df074b15df2266ed49bc5702d30a8b489ac381cd06133d39dc9eed42c638ea33574d9cfa1b5cfbb04088b477745719b20e14db4919da0807ab590142a0332c64b4bbe05651d20adf1c447945d15d2d36450b3d06febb7d0932d6b1cebb5c5c8240b4a57a970643b3c96d77166745db57482eb18cd922eac94a0acb3033d697b3292cd682b87e690162d14264e2a7c807689a7306c00000228000002240000022000fca464c13818d46320fc4f7a0022ed7bd513a506e676a5e6735de3cea55fd60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095913fa09dc5d71cd12a110070d725d026653a9b3f57ae0ce1e66bd8827e1228eb8dc7e26151c5a9a6964f2b1a887c7c90a31bfc723764d7cac84a1d3b200da0148babb4c7d105c4576884d645a78fd3d8201857b982d73435504f93f8fbf24113c901b41dee70b844ba8ae6c3406a276fe390b47a8a06888323223faea4be0c8bb14a9cf54d604e7b13ae296efb1ba6ad654ab60061386e804361e54b01bd033df74098248b9d260bfa79f6836c7e5df9a52f93857a46bcdb5b6a5a4cc6b440bd13d15c07892de2b687c0db7ffef8e9a5d5baf610c2d2b647e2e0603ce97f6cc475d0787db205f722913780f34765cb60fcd09b135cb2b6655a4b73686a829411a84cb0b9a330f01508af840ed5ecf807546cfa5bdcf1b5242b3c65927a21a3ee67c0ec6b33cec8eee5a1e23b26a243a7aa2d60165c92394c2747c38315cf12cbd03f844cf86a1d81a6e9c4a3614c80216dc8fdaafc9a2ddcaad8799536b3fd76d59188b3bf88b70d81f5a2aa97e3922abd31b5fa126aafbd369130385a380fb74b51d5d30a578c14fb30f32d13d7cafc9b6a626b4884da613b4f04f2cbb0bf1de15ac7fcfe7ee472eecbd3060da919fd824eeb4de7fc3b4a549c398cd19155000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802092d5d61e21403d18ad85a59dd2397376e63906c8a921a0a5731451ea2389e6b2d8275531628d980ce7489caed970084196a954d5326dc0be30f991f0f4319de020be82b03eae53069fdbdb2328d80203faf40b2c26bc5ba25079c3134638bb2772b01d2e17eafe01b2920cf009a3de307084cd969c9bb490d71436dafe208ecff0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009764c2a65420dabf22b0e27c866fa65b3752f1915144d6fad4cacd0651c6a948bd2243d9e93267a13b9148583d064956a4bee4868e50c263bb6b11045fee3686f7eaf7a5e5a70275a0187afcc4f73768cc3396534e6f26648e39b607c6d2417e313768b4cb56c65051e79057404c0c89c3d6dd95b29537cfa12bc1ea2860cb2b48c97054af2110a71a4434a3811ffc396fc0d99e8b063e6acb260e95f1720635ca0eb7fdcef24e6ed5b1ee37b5cd5e020c2f33c13b657b1038a0da1195f3bf8ece1c9becba36555b904f4fc97ecb24f9c40d49dc33332bb31955b8ffcc31207def3b3bf9164309679a7bf21715c8c44653df6a49aea92bd3aaad8db502723af26d495a839a4e9f1eaad1d2ac4d8ec217e3c766a9d9710eaef445e108063b0b519bbc6b43c75000f514b29877a5574967a5a13a9c5562620d87650e2305ac237c045f3c44f471d3932e3f0d0dccb2075c5a9e4f108c359be126b6ec927d9aa264e165b9e848fddb69d96753e46a635e0945295242aa0e2258adee61babd5842c41457a50ab136599a90b00774b2a29bba1b2bbf8c499fbcf96ab85a7d5cb0f8350c3cd5aeda2307e77a946f7c213577231b592d74b9dc30d642b0374c4ea4d6b7d2a360246fdcd46b8909001056c3c0a52fd7792e45d80ec210aba6ffee9fd3910000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ea6b9e21ebbcff7ca7454adda8e9ee30355674f484ddd30bd3f3ac7b841a7c44773d3f0081dd751b08c8a58c90c2369e39739ab0a71324b579be42c2906343f0afb60d1eddeb6cea1659bbd2954991d7996b222abcbf79e3a0a17c315cccd01603cfcc1823dc0a540305a95a6b238e30a9f6680551316854af21fede485fe1d2f4ce9938473c0c8c32a26e3f7df0c0fcaa1b88c8ccdd1d5db462745b36918ad59b4c4cdc7f3241fc6c25228384b3ed459409dff4b64b1bee55fe403e66b2a1cb7175a58bbfc55747105a3d2948e959ffe6c4a7b1206df7b60105ab6606b2f2e680e84c1bdc1807357eace5526f5eeb4a1972157076a3c094e3f4c7988d8b76ff2c133bb3d1953dbf496cc2884c84b946a3204e8653533353d4559c2de7f152768b17a61c9ea864d7da075c8e21885ae3a6ac7550a4ef47a366a336737b90836fc7263f1596399a5fc031c908748668095fb7d4a0aab06c8d42a60c8bde42b605d7ffd85f70f52178207302815ee1e1fda0b07790bf2547bc2394154b9f696a58a430161216ac592daa082c848858f97f04c8a377b01a282fa173d7c061b46b8f0162bb4eefb12664db54fbe7b6215fca78a73cd0e6a3a8dd292dca7838927982020925afe9161870bef8468a7583527f45597d133fef266e13899c0473ab5fe000002280000022400000220146dba0e505daff7efd32cecef086d3873984eebf616b567873ce2fac0e5b5d4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c1ec361235cd1200f6d45f12122574fd1056e84a12ae714f317010781b03f6efc5760edc38f14228ff46bbf7c0496225c11d929ed0abea5a0dd61f3f8f9d14f2d4777b3ecf207385dcd76cdb24490fc2dc3219f19062ec935453fb7824d105db015bdcef18848529b0a5571586ffa78176970e2de782ca3e5cc8f07ac5d55a54c0efe5bff3bfe5814e007e3f5e8469a6e07fb4b19f92be93ada68e135d5ceaaef8c0b5c7fad6abbd4bb3938caef43a15bcb952ef6676c31515b46e51e62566fcdb1ee77b62e3c89ebf8d0cfe0e8115a3892f5cf0c291ab4fefcf1a9f73bea66c5312c7f8b0c513016e828a6ea55aba04f7243006a022975dfe7687f762f464b67aefddb8f60ec987e4f2e814841df216b6f581ee8a814eb20c9d3a0e0b4d98bc8e11f56e4f11ff1b2971c26dd3a4173e7a870becb9e914de91abcec43394f399511547daff3840c6b038dd7ca10ed6433e73d20092b6907f78ba09dd7c1b71e555ce4ba947d376256aae5e3791ea351b004757d73da852ca86094562623ba2fb9b9f704bc7b05e0a88079a4df123f1695be013443136c50c62c2f049cec7756eff8cf2310c311a9ef96606041ad3d7a787141c4a46e61ba5a6721055afb167a000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011db94451c049c68f89cab4e2056f685524c21758e2f7f88f5a54eb4dcb22206b020dcec81a989a18de4673b68d42f09b710e3dec0f21ca3dc54265a6e436284f6b063958d83ce8a4b7db642d7b5745959d1fa92bd77672cf359ae7b441eff840ed000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b6a081c7b9aefce1c09d32c068ccbb85f558f48eb8fa04e540536332f0dc78cc17e68ae8aa7d80f897f3c7e415cc43fd94ecbd542bf49bfddbb9215e89b6f53ce88c6d505b7b1a43b155a08da3988647d78f423115fea278d7e54015aafcabfad83ecdfef4515201ab0a7f8ea47b8a923107d2b53346827dd168148623d49b770df04323dcbb25a9ce14698d4eb1ae8a76998b7785b3ea31a5ffcdaa67a5610a820efc5376dd255483e7e84e8849c333ce81ee72f9074898966c602310ce87937e2de2aed0c307a200aa29087544a2b6d4a47792cdbd1853aea60cffbff68e38d32763024a57ebc1c8626f86d8fceec622ed0c6f78cfb5b00f0c99865a6ba197b76b2626f796fc322479abdfa3bad606fb169f92edac25101ba46e009a4b7ce834513615820faadf597f94a1e10e453557651aa24f0e278debb9743f7313ca4bc6c2bfd981ba1c027dd3e1d97048beb2f0df9f0f656605a2dac8ecb90d841d50c267a5fe376dd835cfdfe168d6a8756f0ee3804033cc55d27129fd4c42ef2f9a14ee20fb508e97fc25a4ea71dbbee2a2a1736436c51f07daa3535038370a8ed3ea2daae26847ac1c464694018b75bbac73c4dc46e427e7859f76bd42b9fe3e1cbfba507d3a52d37ef231580a3ad4475f429c68fd01bc06b198e5a86fde13ef50000022800000224000002201a2b6a91e3cac0295ff049b559ccf1f1f69285ec59e499a14f83db3af1db011d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b8aa775d8f8379b1f1d66647b1f714c33b4ad82315eacdf866c42286881cf2b441205aab5e41119e2a0ac28a097744b97b3dfcab7dd4772ad6061fbd7b6b3b060367225b575512bea00e2b5372f7b60e86cd0e150122fd700feb43f82594caf04d0b1545a356d8e02c77ddbba9184911a7f1944a540a6e3e63f88ddb9eb53b1301a959bd0e8dc820890f5e184b1a96821c573cece2578d618fa9a09abbe48867c7f29571a3979c411a33580d514054c40e7e90ead2e7077ed5449c28bdb84632fd0f35feb32d32ef6690ad3ecd385e57669ee934c4d63bda584b43f1d790d66132309807dd0a8deda8df56ef0ae6562bff379a206df3861f50dcd2d0a8b5586d2cda1f77debd72f6741529dd8095cd8f851606e437ad5b22f83af21ac272db009e99cc014f0d7f6c81d072860b179698d8c44bfc2a479fc98cd8664cff2e42d9b08582dc1c5ae10d4e7e3e644903ff9ec6d6f6ac2f3126cd02510301f8843de62c8b5836c86c9febff9571b46139496f15a82ca7741cc98aa5bfb71f10d730446bf589408ec9f3a3c8779852db54db42f63c270e47fa3f064fd62c448d650f8fecf3025bd8fb6ed26493798c51d8e1f069a8154b22fc679e676e80f9f6b6561000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012f7f75cc6704c8bc7ca9f15ed586907e9758ac21b0cd4b0dc63ba8380c3dcbc6020f3980c9e6a3279bb2a28c0cdc1c0ab6225eb59b73bff53e45ef4eea8cee45af0698888a5a63b94d34db081d27d808831a1c6473c76af566330b6673d686bf4b00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aaa929183ff183fd82a9ac35ccef464d826da2b613eb9a12909b957b8589059ecaa1b60fde02c046ed8d612a031833bc36e61759b4e3501322705d525de5911ed3c95bdec6755755e0508a06d2d2b0c7dcf39bdc017eeddcaa99dd1c4ff7a659a70f6c95a45a3b5f9a01a8a51e9791e0d5038744ff2bc3ed1aff8926697b7926877a917fc0f4d9ac6c8be9a03e080ec2263b6421b63474a65806f5c26b1ee949f42757cb3592d5da8355c907da52e6c49885f10527af80425871de3098c970ca59912809b97a742d62b3c76dfab9e9c1a073c57d87005dbc964daae22d30712821b490794f6c135fb4d699ab81186bb66c0786e2d8e4776d413ebb4d11442ffe0ef8f1d5f89968674ce7dea2cdcb52256b35f3ced06b47729a11b5b3498d323633e10c51e72c9ce9805660c77a1e5e30f5eae9669f721fe12b86255852c2f8ed1a1bc8bbcbcd9b9f175271f93e58962aef00b73caa01245947168d16321134b66286ac51777a85aebfb68a861aff2ab02ff88710488238f6dcf349949c8976d97f28463d3b1011ea45c6f96079753665e55d3247da5b758afc87bb758482310fed9eacacad470f3c1e901e3730a5e315c765278920e9389ed3c6ef6d354c291067eb1f9cbf7d5cc1aa44e4d4383dc9f56d41f1d2dc1a48528120ad3386ca67fa000002280000022400000220064c918c55fcd46b0d675b0dcc4a99f41a4a45dfd1814b372a80a310ad98d03c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab954d869a71ec9ddf56a3702f9de9468216a1279289ce41d38563294928630d39f7314f3c060c0a59b8bf9fe10beb93c70a91c6c24f1b8326490c921b3f317f595698db1c0f853430effd6c03fcf16c857fdbcb74348bff71e35c73567f08cbd54d2c29b1794cef046d85fd0c9c548bf28b0200a6bf93a08a8affd9ddbc34e6bf1dad2e3438f4097352d8d4e6a0d2b7d00e4d20bc6358f1b4f6e9744a61f396da1ef8b0ab4571a39a24a045edaf29412874897c07d8d5502ac79238d65ce238f738afd1a7b16b45d236eee3a7045dbb49686e44db49f04365153c1787b7ffd0d81cf8040b8b85b83104387ddb6abdde4a581845c42093a95e52e15b8a8dfa50f7c612e81fefa277c75f30b6dd2cbbaf166c0487a4b707bb04c882f2769d1ccd9097b95961f90e1f16ac539402804717f3c34a0e25679928360480fe6781383db55d4517d1d52c92d67c557c0555b24e2c26cb6c4a6fe91c5d54642ec51ffec58030ab037257b4b7d7d94409cdd3d0c8e1d53da948dadac88354d9baf947d80dfdcc159ac42b56b09aed4176f9ae7a393e5594503848a1d6ab5971b384da355c438705fcfccc2cd92e03bf6438c6ddfaed92912c27e7e41ff180eea00d84f749000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010dbb1a74c1396aa009ff03e830d1d37db6072ac704703f4603a25739cfda14640210b4ba960055b4cf136d26fda7dad4d03dbcf244e32463a512e381cb2f74156f2f65ad50e146fb754d85911624573e42c3d4f976503b846bd3e1fd600d554855000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008eefcfbae19791743dc47a895a5e8cb20d7fe4eab83a688bd5127c9db177b67098ae93abb55f0d70af25e1edae2517c418582460369ea4c35d9cc4d42d035b206d77786b6502ea25cdbe7ce6e2c4dd7e17745dfd9ea83b6dd92f22a685d18664016eb582489a04a61334c1e2011c1b4bc5aae082b481bfe94275705e1ac5b5b183e130924605d68209eb401f27603aa2ec160b2e6d96b1c63ce9869cf25a31f03777335dfb9be6289565264aaf3b8fbc6c6c33744b5dbc1addc1333d269d2b36a11517fc8f8f6fa59d3eac2ace9e8de3ca0e08ef4ea2950cbb2ad3bcd884ba23284e8963e12d22551b96267aaf943d8c28d9b55543e003413c14712bb789b6118172bc5a55c98dc0bf5833281aba0fb168454310aa7414b780e9004618204eed9c793c0df5150277a4ca2af1edf21dd44f333011eca29d01ab834982b7118a6bf4dbc96c7f51244889b145e398b9f33c0cd0a75ebba86e101e5f2a6ee42abfabdf4a9a094082ac48f97eea6c4734f8062e104ae8d81e496c30fd347d45ae8c3c95cf8806cf802c01047874059a9f79af1bcdcb160c0e2bee24f621044f7d26ffe9cabf997b9503ccc68097fbabd722422cacef8724967c2a838d3992a1afa30a7d2454b95bafb42f6a1f55007a3ac2fbb3cb2c8286c3b07154301496b8a9d9c60000022800000224000002201f4accd1aac33651a8f34114a2cd7ba563eb8b7eaa44a1292df2b820a29c0c4f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096c1d1315a3140d04fbf58af49c8525e0e8d8c667e9958c73363ec12873576beac9ebc8b30f4b67ced7da747b6f3e92d1ae425f109067f5fde2b4988f4ced8a543a2dcf33a1fa2812652d48c8243568c9f3a3774f340b1ff3933baf49c67c3d4def233716df0e6e965d29c0179ed318af6d072bfcd4e6ffe6bf916f9853695c212cfdd4bd75379f3bf08fa84b772bd4b3eb51205b7486c4110304e2661af7575b5777cd88f62a08a7c753c7f257ee2424cca9aef53b0c1508648cefd359457d75a1b9fb402b6d1c724bddf184bdade7d8f02c81cb0797c92db56e9b9e3ddf652bc2ba5162f05cd5ef03128021c7ca5fc52ea6c5eb75e0334562a60ee161af1665d59e51d815f0fba136ed47248562b0a61d437f7bc9eff06f405c5b6350ecd686feab2294f7ec042f6f41394357be9965aa8f038f7c5e09476f0e39d0ac87cc4b8035078d897750562502529981457dbc62fac4305bf51bbab20b6a41963197bc5b33577cc190bb0eff972b25542fa0d823dc83bbd9daac1533d932965069405e6549f9b6d1adba8481b5ebf25e818f63c33c9fd5e12c5be689034d0a76cd80e93e4c22fc11a53e603bd9323442e5e17e99b5c385ebd7bc014e2e37896f73a02000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802011361fca598f9d4aad6fc1b4135cbe3760c337fb0092a07429920e49f9cd08903483dcabe7dd4b0aff28af13fce16905d523299eee1e569ecc3ad0c6feaac7c02113b746b7678a4171a5e8385ff4f73a6bf6b208fb6082bc28d9b8f51d4289f5d0ed3e7074b6f8c6f20532470086462418c695438e2cd071c871c84823ff961c20000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a03d6c991be5dc2aadff2d13b4705774bf7f93220365610b97ab40a24e222fe121ec69153db273346ffb8f9e2f6590da526eb3a69d155e47757a720074755501d36d87fde54eb2848548362130c324a51416b11e63c8434958d730a5ea847529f4b13df91ba94f957342c4548192d5852a594ec0e6524cafc80465eabfd0d8bb2a1cb674974be0f3d0b5333a641887dc9a388df381fc68bcf588bdce118e7ce881cac01f6e97f9533ec05f47521ef3fabe62c2fb7da07f7f92feafbbc0a7e94ec436c758f3ddbb9fdc5dcf3e574455d43fed9832217ab657c7891151d4d071f34c9436dfc4cdac68fe0356be00126baf1f7f194a32ad96b14dcb3e9b1afc4a506b15fbfd343857ec4b8ad039154ad7b099b8ee5bc4ef4ce2d4f8f5a79f30edf2546795a63c3e88aea850b12c0516c1e65c2a0d1888e195c914d4e21aa388d526d7d9bde00806e0dca27879909c29b8a265c81f81c757ae0778086d30549df64f5b636989837d31d64bac345c5b19d47d6e55eefa28703ed11c10518fe3b12345fca2c9ad4f3f28ea1e620688b399b927c49e09a011c4fc3e8fffa72acfc025346c9ae5716ff7a9faaeedc3c9673569ee4f09fafffc496cdc7f3626cc6aac2e150049caa95b1aaa97e183ad643bbd8718c39a2dbf5a774b79ffa74dd6b09094b00000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008963f64ed1e0f6a17674b54c3e7ac835b7a7f1d2018f59b4934abf15fb0e67cd4ca35f7f2e354dd31d61d15ee29d6d01ad268dc8ae34a8da50ad2a0593a4cc518c014b21e2d39fc0494c0c0d19555df6997939af00d069183b14b0db33bef65f3e2cbcc26d814a0240a60fae771935b8aac17ca07ce03bbb6895d8145a3c7fe80c7a95b396510793ba455cd24e92400c932c6ff19830a3b940cc6790dfba64f403d0722012d5ae1f771cd82b18c7171427c11a3a6d28a270de6be9532190041eee52b4747ddf54b76de6a39b21b175f7015d3420b847475b3da100534a35751f2ab895757562bfce10d173ea1e9c9ac8634e925b47ace81d9e0a92e0507892e0b4680b257a5eb5592f8d064482fd7d5153398784dcfc308231f24dbfddad72d1326e58811a7a1784096d17e647da1342825eb192fb47669036cbeca00724df97ceabe1dbc85dfa4dcf081008fd6633ee762da53c3536afb7da959ad9f68fd04c24d5ea21dcd1fc71033a45f67b894ca4fe118b74129c34b88236cf1cb6ff35b9cad3eb94ebfb7a54b8b24b16222c4c803ede173ec3cd95941ec102bee84eb33f44333a759b44238e9d0ea3db1f255f954b74ae903ca3263fcb90237e6baafd8a5b19ba1c19186a2f6f218578223c066de54330e5f5833ed2670b243b7771b69d00000228000002240000022018136a613d338098291d54c9384f3d7e3f59999dc916d1d8f0d453f93d479b830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d28a59acf3f500fddc7272dc30293e0c87f2a51483568867298f41a03fa06dcc2e0db75be2d656e069379a9aee405c3d398d04d23472b803a39305d0ccb0bb91e818bc4f385ea0ec6d19c5b1e1df4d090f1583ba5e7e47bf3509158905f8b3bba5af2367a85d6a2a5d888eb5f2a34da0e6da0d1305292676cbc0d103219676683f97d884283f41c496da135806f5e2a6534ce5ad75a7e445a656bfd7db1f09ff3e38e6a1f8021828dd5c8a64b7acc6334613a924aa5670a149ba8035339b8189c52484642c061e6d1db64578ce66729822c0e0c56158b6061954533d3bc2e5878c3bf53026192b3222f71707c2d8dc3f99f5959cb7209d6ee74804f36a3088d51b5ae3634c01fe51504aa99c020374ec0e1f4fa19ac95391b1824170a267d02526b0e12640d57e8ebe386dc5207cb7311768937aa2fa8bd01003db90493297ca4d15427b607b6f57b7e12aa723ff8358dfeb277ad7873d83a951c9c1ecc2948c8428de916480a05926924da701eb0dfbf49ede43d02f0f27ee91ddf38c064a207fa6087ef4eb945aff658074c583cd653624b306ba4e1face8a9e15cbeb11657e5fe0c21a22fb26fbb04061006bdd41b13486b09dcb4218fb77960302cc6a6000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012cb0e1e6c1b27686994400cf980ae30932438f57f0f5f9659dca0afd924a828402115f54326d3c967d8035aaa92ecf9124e7c113958b091ec17850d07ed0569ab51ee9daf6661e0962e59dcbdd0a5210b414c564a0e6e758e20bf1675aadc4d0d90000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085386cb0c3a7fdd88c53eb187ee0636e8ef1cd5e314cfe43d773df629703687bd64e67b256e170b86f5b23e21beb73a3b635d51c6210e354e6a999406f80b87aab981a2acddb430a85056c371c671aae27a04563e314b2b4368c1787410d8f5fb28399380b7ec905da4213671fa95ef65a7112700a0db7a02049be3d0592ad7bf8aa3d6fd1737c9eaf891898d8d6887dd1644fcbf9b8ccf255308e12d631fa47d4ec950d68c84d9f6fadf26f82f8f2c64d3e738e2780f7736b501152b501c378a7a4d53eb378a778a9a9923cb31970d093026e0619646f22ce44689f40f5996a804e9bac7069a98a24afbd5adf50b18fafe5ef7905476e4e63492335fce6953e8fb9f84d6b56397c8e5ae1e97ca734c9c5009a167c6bfcc58853d675ad4fe43704ec29146b69a97ab21aec4c7f5ce64d7e2bd56fc4511e32dcfb672e76a996ea32df2dcc3238838daeddfd05ce483e338c955f8150dc235064d20ae4f3d7ff6ec092887f7af6b0a007c084b350915babae9255c737a88fb2eabbd1f1923e3408082653082573ef67e7583e2c58e009af2847a44bd379046c3c03c911d3728bf8fb555230c2d26d24d97eead7d8db816679092e750a6d8ed1c6abef6ed11f6a922f36624aa302c7baf64fa9d34aa6f2bd7e3e874d23891649834cb54c45a167c000000228000002240000022025d0382b94906aa8a1ae19984fec64f7ce2e2cfe4758ea46473ea24a89eb155a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b1f449499c262e6ceacdc5245fbc56975c1a04258b5bef7ae984302f9b61006a6d216ac88e8e40e06c2c9330ea4e7532c0fc39da6fb8145501730c944884d4881ed9fa5f4cbbfe46421dfba0a73e30031d1db95a78c002117b0076e95b36a35faaf65bc258baf19ea868f65d78d54a4d5594a838fe7534f16f9ef068bd6cc35f3059eff81d79a22113da47eb4fe56f8568002eb6e059bcbdd115c20782bd6a558d168dd55b6bf89539c557d65c899c7fb2e5dc26b40d8dead4f1b8c46c872cae20cd6fb2f2afcebbf4b52fd2e42a51beb95959545c6c151502e6e4e75fa9496c4d07e97c31ee5f8e72045cf2cf3f411c849899fa3c52224826a5f4a857fe2e75a925fdf75e75135e58083652e251b6530f55eb7cb952e7490f87b7a99d27f1e14441d67eecda3a74ecaeb6385cb0b17632ae021a035e1cc22ed2a5825a4aac0fb6158389d5c5b1ee84ca966b1c5f0c0222af357c930345522a5ed847489ecc357da162b4fa298dfd5fec016311501b8a3259fcdad12142d01bf98dd431e16715ab0157c867d261cb53ba345025310138c97a2be909c162fd026e4d70ac574051ab4d8d6ca3124bb2ebf663a86ce360feee79af631feebde5fdf09c39fc8f4e000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022a1f98f4a0ff0e267892ec55a2badfc1814642f474d1b73e39a9a358df40b2c40a414d5abba7988416aac24a31e17da12d557e0260f42aeac70e04f6075542a902132ee28867049f2f81aadd9454a10c123f7e1fe9aa8b698b1f17d65af5958ff02f8551e1b036d36d72850ccfe31a28515a3c8f9c7735eb431e9c27ccf92a53420000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c8145ed9d5f8821f9f039e847bd985e1ea120cb7267ee04bde708dc082fcc5c19af63898b1e66b881ff9d0c34e153b752835236fbd6e8bc65680bf18c2dd7d01c7d529546c521d5646e7fb52441a2d7216e267b9926127921f18feb477bca9efeec0a17c28b7ccb12287f9eb6f4544c93f82dbdbed2b0da6d9552e409ccde4a636ca59a5e5750ecdaa8436409e6d83bd6762ba22b218a1cd89c0ec5700da13958db76c6051bb7d6dc059f68687c9d6f2c77ebf707d5155bd9be4f72b4d38b799055bf3a351cd78d800e2e25c6d1d7be689bee3ebc5e2027f3f62c09b65c5d4b57e8de0b782ee84e329a06452ae2cc69cc2e5fa806ac9ef0c1563cc76d8bcaa6123e790848cd54e3f2ea21b2184a25bb4f7536b5a2e4260eb110ff909826cfd09681d9dd3aa030043254234365d823ad5d1f8f2aaa8d722c51433044401dcedbd0f1225ddd2ddeca03a47d017d17ec5018333a2d9222dddd0af67a1373c4431f8cf46eeb5fd1b989f241ea40f7d493571e6763b6b67b2faf405441cef685b510ccbb05272d4dc537bfc8619ad44fbc644a425de61ec143073f0ba6eb13ae5b642e4d5569c39d9a957f322812be782b657a3369799a6f6a6544e1b3461c7991a89e65d431531d134c1248a75b06f65fae9b196a63b68e004bf96b1b984af248ed00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017435c6e688cb4778f6d840ef9606d77fc4b3a02b2992c380e9aeb77392b512df9f78eefff7886fe68e63b12057dc9edf2665928a0a279c054620b8cdec884712b75dad1b12355d6b6bf9a008dd7824cdb78bedd9f4a87dd0598bf3e177f81f93f46b60090974cdf029da6d6c9829f08e2073eafdce6c1080768978a766f0e181f734af2b24e314ab1bc64d993b9dba4b193a33f376198b2d0712fe6d91dc1f9af1d491e5f6deee4e7376fc42b300eec5ad30ce25b756ec03e446b5431b0b4e05b106101d58902367fd12db1903c530798301ddfaea3266fb3a5cac7c0ea1c9f468b127baf2d488befe3bf17cc772be50d31f59ecbde865d43e924ec0921be053cfa58bb72f6ae1769f7adf585215157f8480f747a6992c5530f581068fd45b17b4092e46f92ec3af286803ab1d859c65cd5f45e9893a61a2094dc494d797ed5fd59dceb52a290a22316f4c7d8632a70085fb1fd406f7d263d95a62634748e6612b89b63a606fcb63d4dd443f310d1f686556dd72d718689f670e2f4ab310c24f0d2ac68e5699174f87073ed776a8875695d77c1a18a844465ebf1fa35c40a81bd1eff9731016ca83bd0d87e4489b999dcad89c853a93b23cbef74bd2f29b7f3f722fe0e897f928cb5b01b213a13a4eb8a0f3a3ac526ccac6d70a711c3d71e9500000228000002240000022001353ec136fc3de5fe8106a6c85055aebf4e9e44c311c2486f303b44b1361f16000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c68ac2bf412aacb94d6c1dd221cd249c9dc617ffef5fd695a64a5af404e1887c661645482be03cc4f6b9f74f9b2bd902660f9bfb99119d2abd1c90a9f64bc84a41fd990d36ae9ea22be9eefb5c420228fdd02a77f92b73e9608d9ff490f252e38cd6563d2e21e1a28c8327d1b1403945d9fab2e7446e973ebab5d6485864c688a89e9898e3007d6428b7d751d01d9e4a589b1ac6ac83e9e0dd3156c4d794d78bf33ff0edab926357229079478d63aee4f7d8a96daef4188e9e811a90c1f5f98bea0876fe202d2dea118f78861f67253ad8b4cd0fb87d9acbd836cf40b36fd881e295365ac0dc8b571d1d6f99cb08249b88670f2274f05d2cbb5450aac2a55269432454fefe80abf926da07e482f73dddb242da6d696dbee54d962fab1cc31fa2096a16cc543203279cb6fd5cd6cced2e4a97a03bb29b7611f70735b57b38e743461c8b8625b800f24f3d4f61c08e9beca3bf7ff867c79bdeeafad0270e63da85d849d8a5e6ca236e9a1fb021a95191c781ef011ef9b5d0738135429cf1d54645744e73da9c3f35e2ef357a07c431b248da5ee96075b952eefdb985a5752ebc4fb33ce86025d36e04597a6f59cc27f3b1f313ba9711fde5da974c34d8c977817000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020a4962ffc11152951e5d9a9e688e23ebef4be894f77df64836f6ed803758737f0bce90a309342d79d0cc21b46f32ca7e7609db95977f2eb51e952a632024b8590214b4b6f9de41e60586c400413adca86bb2e87fcb926fcfdc52907aa3a875164c2905c47c3153d44fc42067a7c4025f5d7768d36ce8f5389a14afe5c867cb5e280000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099ac227332092a072e1ebbb471e4a67df147f8f9c017f47d13105d9f223e003d2f1699114faae8399c9f987094df453f6686af8661dd7ab39b90b6289871f9eaf65d37e666bceb3525023a5bf33f6fb859076228747fb786e7bb04b1eb8efa4f2a21b075c86d322057e6dcdacfd4f49526828c0fd6740b3d87d0a78a48b875e1b53967b2954aec47f13e1aa4d18d869bf0cde6492f5c903cbf9c8270d8a5b643c68a61581a0a5d8006f96162cf4a295699bda5ea982e15eea6d80d8c081712032e5a8821f56c499aeb1817c9195305ad4fd60e1309dc1a4f334d266c2d12bbfa9c86ff0509d545a791fc84d62e5c5389630bec54f6b66b98c1f5afa8298779d84adf0d55034c61c18535da38b7bddb340de86d2dbbe38565ff0440f3a1965b0858a088457fb3a20c0ca6f53e765220a8b85ba0d687fc53ebd34f5ae1a8a11c3d5e2baa5c5286e1ef6415073ab92a5a2476c0512cf7b63a724b568bcb98dcf42026f279b145a13c5c6092db17054ed1f360a8f181838b2fc5b2dca8eee5cb2b065d65fff5560b4b776928a0657f8801a189d8748fbae7439c46ea3d3165f7c0ba45dad31a2a9d79bea7446d76209061b43cb489af53f518b8ada473115e9170926a1f74442c756dbd114638f3b99ccbad59f957a7e5449205d849e1714bf6a6d00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015a3b698a5b818c43215084a5d9bf6bd21f45ae2b012f07681576ae2acdb309ba4d1f2469a3777ffaa43a291254e7f19c3e0bb88e5e544b4f232534ba07169fd86186e62af4ebd0418749099a3e42f25b007c5d22187c9dcbb6e4a831388240c507cb6cdc0941c328795b770961b371079f12f56a529fc849211b5fdca96f824c66202d965c4c31f89d2e94b02d737949085034e6dc54a0fb14e07cedbe7b278eb6005cc29816dbf20f673f8c0e1d6ac941ab572fee4775bdc275df8b0945fe5ccad90047605477b6f6ab58dde725f1153e94897f743b7d52221b04c17ed2f2bbec45b75c30cca6c55e747225aeaeab72e8ef3fbd7832a1bae182d546eb99f7c83a54af9fc341814de02e7034c5ecfa8b6f7b70e208ef706a1caddf11afba53a3ded6b284632f5dd91d29c4cfe4a2d112694cb955b129a494e170167898c6392773aa325ece6d808933dc5021e50acae47d46374d89059cf25465821ecec1eeaa11dd03aeab5c03ce87b5425ad0681da706ff012e8afac0daadf3e1b76a4d9bd69f3277e09eabe8de26a3a47c57e7546a94b71d850238ec25b52da37688dc85283be0441a370d7ed87c565ff9096c268d665ab30f48457de9bfddd15f61d96bc478752767d755c530a19f81f981bcd1215c4b7abf357e6f5b41f61bcb7116ed100000228000002240000022022c3f2c4a3dc8a5c2f85a47fc3256da24ac20bdf64c22373130fd52bcc66d7160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023d780b30524e4ffd43b3add429c7583cb3de6940a9a59c27d1ba24ad06d91aebcfae386da0869679068bfc1d771329e75d00c7489ffae04cd21a32567c7224a0f81b5a8eee6c918ddfc6e34ca86d8b87d3c6573a6ee808d2cf2a32aaa873254a71ff3395eee83b9af9fd79f659dbb5702690e31fe08776d7b2b8fc18d00c45b2d4a20334942c55e005317596fbd40553864b4a9b357912c45ce8aeb5ddc3d5cb70e4f2924de9b65683a3cfbd8bb09641c79a49c9aeabdadc4bf00eb45faf0f5e2351a294ae294dfb89265f6711235136525f1f6f6ca245745f50a74bc83c55593cfaf16470cbdfa5095261c300671760afc7ccf177931db243e3d20254497c14e7dd811b29f0a0dccd2f4391cf7333cc73869903527f070fc284f2ad01d7e38e8ea13eefbd736bc5e85d56fb4c74d4b9f108d515d41421d2f54ff2a550c42cabf2c2e4c9a3d9514005d0816c9b76116b3085f2326198789f13656d1c27f57d16b04ccb355b2c65539a7f789dec0e441b3241b4a8d52408f9be6214e2d8856a98ed8f6ff963f4d72127d22712bc788c7b406d26b9d4a7ec2e3bbdf0682971d898129649ac87711a307df84a60be9be152440f97a6da0cea2e8fbfa56e425c8f7000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40111d7fb2cc7ba9139e72e3986a8c1f87ec212ef325978bd21b527514b8334b6fc0215a0785d62ab30805bff72d45e81a7fe9fc9b31e4e424972a5ec3934bf6367ac2f1cb74d9d65c8346405ba8309aa989dbc2863dceb03e59ee722fccf9512836b0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fdc9789aaecd137e81bd0d64903f1aee274a310d3c9ce903d9f1cf0975532cdb17e43d259f460ac447f6165c1fb4c5188132fa5309fe61708a266566829b1ecf195732a6ac5a22b7360176136ae482e682d87b6a27c70d880b50c41640dfc0b39c6a64a480d48ab0a9c573c2374839eaf7dbbe960ed6f8ac059b9d2b005af06ea5e8eb12e86834186b4ea1a0e6bb76f6a44eaf9fce7d5f92ae6e3bb6bf4f89d0e2aa7c73ca44b01adfbfe174c47c97dd489c9d8e76933896aa244dd289f2a046d07af071b4c4bf119bac0b144fd6ac514df27e5c2207a49aaf3a89d614f24d3a3005c15eb6bfc13b0e810ada95d532bf453b389cd7c0aa15a92a517a47f0873eb6645808635dba99d8e184fe8382976b2fbf80e84ba40219b4bc76d8884703edaf8661421118b15c40eb21b2527353e6451dbe69a83734bf41ad543642b305f82157151f6b1bbaebc3d3cee3bb5117e5765f4779d17ca0ad49270b31ef7a02b47968986ee3b4aa2250008b27b75aa353546dc1206e7d7ee79eb0fe0a315c627b536901f0d6b4cbc86c1dc3bdae68de96fca2c82bbef30eea86bb0ec3c63487221c3939b4564f6b82ef40d21760d2ba001b5f06c6c09fb5195a608b16172fa13f59f41e6fcf433d36b62c9e9d7469e6d99ff961a109f9d292bf50eaa67c2c960000022800000224000002202a5951c326b0916014780b072f6eef656a8b5deb834426a330456e44b1dc6930000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e3ca226d9385f44061b4e86469ae0eaa6054dde9f8abecd8a88a6be821857db2a6bb00b9e395c7b71204cbfc7c1af2d2e3551bd21ad86bbe10fbc4b9e626a56c2580947bfd7260d674851608a8134460285063d5e916f858824148047bcaa3b5b21c980a4a99537a76d78a6ddc1a1dea2f0b7853b8439c3b277a21a7bd19dd0688e1798453acc6cae41c030495a3418d6d4e5ff232a96a33c6758e8abd192d01667ae3d66b489f3bf33a219695d1b71d72cf3adb4d1a610ad1cf5fa30f1ec26577fcdfa6118a3219c520b054a599da3f039a8193c0e1d962788c65223666a726bdc62489da6a39c0cc9ac0a5bb924cd95d108cf428172f5e621811cb52f4d15a90bdfeb180a42f3889f82b37967bddd45f2a97a98f51421ba93962bba4220ff808c9a2a7ad2e71fa110b14ec0c14f27f8695b1c2c615e53882d01e1f98d4063abcc22ad019b8846dc87e164b35de9f2f1e92bb1a67ec84e1f4c92614dab04de5d477035eaff18346e68a1820593ab68440fc281a651ab69f7c7a959601f596ae982a8f8ad475f6d0403f0f82ff693dfe571ded2e3e8b2136bba56e98fe25e28b5afd828de83655f12e53bdcaad13940e709532a4e984c961f6b6757147577b8000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40104acf8c304ccd6b559e5de1adc83c826b4d1536dac321d953ebf8d146b87417b021646a1b118fd9dec69d3f4985d445cfea093dc46817beb802ef07fcb0ed7a9e20c967917aa3e2cf986d429e874ffa88ceda01071d4344789341ed2b0536755c800000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a929479fe09b15c1d1628dc889dcf749364a0fd9a20f6ca71701ffae568171ca8691169467ce6e36b514a007fc92b36a7709de67342e670a506920ef5750bfd1e23e6c71dccd79329c726475418f2422de332751cb37863409f8996a2b805e9cfa8ddbc5d6fee1efa513796996db1816f72741da6016c7a0e63dcfe45d2a55acde4c5704a0c8c1a55c0c525351e36248591e2dddb748ecd6ed593b511d1e06addd4591eea964a4f7461b4ddd0dc41398d13ab782b0385ec091522410b9b450fdedd525767703409b888fcbdf539b97af32d44b16a94d31e518f18a7fb62ac1ac2e718063c4cfca28d5f75f5c605c059f7a842a8f973de45f70263267a0d0ab442ceb7c402559ebeb2a013d23583a947cd2360c2b74762dec0fe0ff779931071f2fe0d4b9f87c2f19bb0f1bcda4f00e44f05570507415e3bd0a72ea942bb22ccb81f5e8b54b3a66f76da038dadceb3a2592747e1332dc8232f3cad09b37f49572093eedb7cae8b7bb5c51805002fb052d69a2df4e5a4a3175d9c80f8accf10dfc970060a13a84659ca3241f976778a504240d4bef40a65b0d0ccc33c2aafe0b82ac02545610f0c2695d6d7eaec3239706cfe997d714c2bd80be13f8c2614fc4a2b345eb8c924190fee3deb7438acdd8302946a22b97296ba5a1b5bbde3c4d8c5e00000228000002240000022024d4c2c65a6af2c8b9396d3cacbf3188e0a8e2901df1c444850891696133f4d300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000152f67d20e4189fd5a30b3e5fe233177802856e26ed1d62f58d5e48ef5a4e6b1817034f6e7cb5bf9fc77af506990814b9f8eb110215a9cea2399c04b37aafa01774616e7504cfc92e0c370525e9636b8218ed88b5a39eeb9ab4209f7be37bb163f01a997ed76ce6157df6c45fa0dc684afe8e6a879b0d58eb5df2f99162821ff7e01159c5e07ccbe57abcf74adabba0becc4f6dc0fc32109a227af40d258120dfd1c45ebfbed5e08176568f3fb035aabfd8eccf18cc76917d0b0a42057cd97e198b43222692107724785ea44c4720ab9bb43e175a5a12c1a76a78145bd1f96d9b7b6dfabfbcf1e5703f18057f609f6e4b31832c1714f9c248b3d44c45198b27e0fa601c144ad27c277fcdd77912e71859f62c75a152d72e4e0834247f59524626a7c96c227cb98b72d276af6c4d9615cb328c45322b522a21b7026fc41c47ecd11e71213641cd066f0b093cbba665aa2d2fbaa3b455bce7c3526096319dc84bb42afbb64821f4253376cf2205ded38bdbfea68dbd4007c9be82e38de50a909280ebd697aeb127edf86ee2ec1a5e1be443d5eda63e41d8bc777f0298d5e0f1f8ea5a4527b2a12841d9d52fe677d658e91c2b98e9b27d1a00435859175f15b7283000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020df8a7234e425d46558b23c45a929652c99cf551667a4e7e77b16f3b17e7d2fe049d8685030b59222a04c0dd4054144e6a1347327a8ff11502d884198336573e021666504916c665405d2a06071d3f8fbdcf65b673d4083d1a793828bb9546709d079de1dc015feb88ede19c21b92d31167fee6677220ec866d505dec28fbd1a900000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cddd53d716fe305723f2c8baedcc00079b0707479ca1fee6459d37eeaca7dd0c007cd12a849d075392173837cabf4e0e24ade072d5d17a76abcfacda1fb1bd24982b84ec076c9f778c4023cb816382bd3fa15c6aa49e05526adee2b3116585e9a082fce8ec5ea6bbe34238e18c87c4af052bf551e33e86295c5d0fa2d8f3dbc87195bf14905ba123ed5937abd3ca20a43799ffb847e1d5af221fb188033613123d5b1732402ee8020dd36107bda0ac7aaea484f3530c66914f6e34470eecf52ef6540694500e4d46d94c4e5a30f50aadac9fa2d240f35e4bddaa969f3707b67b6fc2346cdab7077563a7888f4bb6e7a60d197b2a73d02495811001f42aee4f217bca32ef0dae3237ba81a8afb10d735048f60eeebb3189235bd16c48ad1adbafc06f1bb111f33ae5487b6016e4a42facaccbc01deb8b94b855a5af2416c7ee04a84e6664087f88c9aad72f29d5054daf404c0ca23d798f1d8ae3b42846ef4acfa2046baa0049ae51fa779a75c4e23ba62800020b365d29ab9792b444caee116895bee93543bd065b8cfefe0379cb589697ee872644320e9f47c19d27d06ff45b89241128dfc7f9f37a8db51612083797387e1e8e585482768a6f7c414537af1bddcec7b5f63f012955786b809e308d6e2c8e1dcd4289102c1949c70db5e479d00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007efc71fe47a932ee930af70492b8532a71bd0b8dd58b092c8a4aeb6e70d95e6b2e8eb8afce643bc6c62975e06f9f94ff2feab3e58f977a5cc1f97c370ede4ae549bc2ac02a7e31d3fa37fce981bd13037f3faab41303eee3b1b376ee66a8d8877c1338b1c2bd5a99d90c7ba6d24dce5436edd6ebbf01d7177be72c899ba4a6606961849f3dd2f0dc9595ad22dbb9e62488b36ab8df23f3e8aa640ba3e85eb7492bae35e352964bf0334e44239805ddd6c9cb7ac41b18a9f85ec805e5ad99df13cf75d06c566709553a00621e0f649e5e3c72c03a80fa3175950d4de52e98fcbc022ba9d62272ed366913e36d74001fb4003219c7d5b4d101f33a4983ee5b0ee209b8c1236ded82585142bd9cad6d39e8459886cc9541ad32cdef80bc0c3676810a32e25241f6830c899942b90012f6460fba1d89f253ae2bddccfc70d43656a32aff416e93365daa67212ee5af6ac15a0a64c0a70a6c4768e7956fe85e5ad6b1053c6160709543a8b195d55a2307a206c0d366c5770a7500962607348adb1c176eb899912517c163423fa165729f2ad2d3f34ad452b2c2f2ffcb539d4351b3f4e18d19d4c87bad86322745604468f8216228fda476017181b01e4fcb9024f9d12c448e89cf7b0d8243d23668072692694f8b25039d8db8d166c025f9cd091b50000022800000224000002202cc5c957a7a038cd8b364a2b6c1ce2687df5ce6eb8a63efe32e6765eb50f5a6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000880d5daa1d2d5a3178251cc493c5af67bb3d9a3d1f16166fd2830f49ff9274bd111427668376ef59c00378bbcf9e0f96bb46dd65aaef86ffb22a09855811c861bf683106d6bf11e7590a3d6619ea56e2968fe651b74eb13b56f06bd6e268e9a9b4feeb82ee7c773408f0f303019f99d75a163affbc8d1b23b16f9f13e3140b61efe450cf3da5bca076c0d9177d1786cee9bf86d682044e45bc4779f6513b731d469ae778c3d8d325a915290ec2c58b5f998ce742775b368299738f6ddfae22c660da7f67f00b59cfc233fba84320776164b945bb31d54a459a0a715caaf4279fc983fe4ae9b8448e2c09a25eea32ba2058a83fda55d777c743706eef9eca73a90cfed2f5379d5b7027a8226cf172bde62b683383b44a7d8e715976b4738b494f7dea4f81744538048294cd6ca1a637bf9df01cc0fe25e0cef3dfbdd7e01aa61ea06b44f71a89a6640861facff1a27ee4facb93adcc178ee9ecc618c82af65d6310d8d52ef17b17a6a41487a320b9988d4b4f66956c039c865cca63bf85e2e83055b60f8562d9dd1db5a2d901bbb260020fe3cd1a19683e0a4933316be9d8df0a6c6ea223f66de2c79359e64208d1858bc020e66e9f726a728a746a55641c7bd5000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012d08b5f31ed5524de08dbbff2b7d673dcca13c3051655e0b89fb3d36b1668390021689683e71b77b144775510fd1428826c4e1ca36135e4df32b1b0edc8f1390b11f9ef37780a6ad6a0ef5ab94c1abaa283f744cbc1e9fecea46c54a282759704600000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a803057a1521b026127e04ae12ba7961b5326cb9e3ebde0e1e58eb6c57e65c9ae79b37eb24d9a342c24c0754e87c00ab9d21d7c2b375cd12da5330fbb97b5f429d19dfe4cd98713c4801f34d6b60877d68694548a8d3423db42280685cc30f6f344f75e38ecd0ed66a905eb851a975130b362421a9d79bea1e14d24d54e946bdaac4f673e357881b25aa28f23959f9d4d7bef7bc8d1b6cfe915e60d950755721d90c18a37c616c096d2a631fe68fde60757fe8fdbc1f977f931fae731147d1dc1ed18563563a0a3f76f30786bbb9487e82e712ca21bc5c7f5a8ca14fe512e3353580f59c7d2f5d3be57bdac7f127482fed87e366038497bba78598f9998c51fa9d3b7bc4e9be34c3390c16f6016911d88e8fb10d0ff04fc91e94787019c2aa825a771ecfee4ec4dacd8674ae839f434de87573fea5bbf986c4934c054389ca93cb8b0a8f8bdda891d3452e69ff746ccf8207f9f4af1546b3bd5e861366b25b1c91c74625ea3f05f1b5f9b5dd30ff4ebf62c7a1624375c3dbc62d284099d3582718891784698b32dd00e51ec17e87e2d3cd5d338f07151b9715087f8bfb4ed03dac5bc016bca0771de243120de8e91af7b4923bfbcd526476c0bf2e8749d4c3fc1dddf88f2199b719ffedf2adf9ab477d406ba3ec6019713b675b3a42412637d30000022800000224000002202051b840eabb74c98a97abe12b6488fe75ad73a9cb2056a268d8fd2b2a039d660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091644e4ec3ef88aa2ee3f203a30851979025d65ff6c405f0461e374c1c4c2950b4924d7383a790361cad5f60aa9bcadde29e7b095cc961441c011fa0abcb8015f55bf9c709bcb1645a4bc38b2d15603ac000ddc42ca2c5ae552b05b5f4bd01694e65f384e631463c96ed46c6ef62872518f6846ccd764b3f73cc7f259dd14837a1eedfa1951b4135104a22fc0d8badbd4c6ad273ecea4f241670afbc4a640d3b35643ba3762e4ac9b7004f8caba360a6ccf0410538648481cd31dac9b02e98460098b330b6fd0396753834f5df04f49d8043c97bc764bf413f65ee270507205d9e14c050841a84fcc69390005cb692daa2462a8702075147218ddad39d61fdfb8f92ebaf667b91d9eaa42340fe5571177dcf7431260c9aa43aeba268fb995190e398da5ffca0b1fd4be0fa09c642345defa415ba0f4b55fe1ac7a6e14bfb2c2ff18c02913410bff5c06576153adcc55dc187d8992f6968500e7b92ba3d093de083fc34e29a2e574e54dbd5e04596d119fd11f66e2242d3ab6621b071964b49e3d856c63f330558aaf6a45528214ae230eb5f56bd474309844cb5e0361270cbe790ed63e981ecc420cc89fe0a73064ce5a204b37603b066c54c3f4ca5ad608a0a000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40107ff5fa6e57c04a79b4291be8dcaedc1d35f7858af184d596e02c7c9b1eb79bc0216f78e09df1e9b6d6472d04b60e9e91aef1a63f8fc3a3afde1d798fbc2e6279a21eaf65740bfeb99c97ea370149d02667781f8c6b358dbd566051169f2a100cf000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e1e7dba09e9290e5f814154906312ef6f99d04a2b662ce4a9d05b5bc8c21803f254f0c4039509921dc8c6074eb60e8cbfcf2c9ec9b6c4fe802f4319fa8c75476ba48205f42269f2639ef78dd20c438bbaa7b20a661677ef4ebc2205d3647c8ffc5906b248a180913de0caa261dffa1a749e3479d6d01a1c07fe022ee84697562ae3ec1c9ca93d091e5a1e352198af0e34e9daac4aae04d235b8d3165eb802e535ec8a9cbc7179dccbe96bc5427b0f34814be56546a81360267592ecb50b7818dabd14cc69b4b39a527c2a48ec2bbedb8363d2873cdfbc58f98f72c22a29a0ba277b541d0553d7e4c248628bc473dbe6c9c244640b722b2e29159662ed64dcafbb8c2a12f0b396ae72c7d9e2e91e7b3961ed8019b9848ee1e4183ff4496d9bee3716b0037081b150729d7ca58256667a4491ceb6a117447ddf896395bf08948abb8788d91b90d08035f85b02b89869857d418bfe557b2761e59fa270cf614e6821293133ad246870176f62953a81e403e1a4f13a4dfe79ce99c087cb6e54d5ed79052ded1790f9859671fcde01f7e222edd2cfd7fac25dd9476fdc1d6b2a8fb393abfa168503540ed461abd9e754021c5a7eecbcb57d2724629ee11242f19422fa2b93c874ad81382c6fcb48a9684357c3e45457a02a695c474b6aceb6a01cdb00000228000002240000022016be8a3976f9efc93f496f99e5e0b8f522cb06426947ad50d2980fae2eb82a3700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808942ca04e1cff8e409434ec06bf84253e39969843a5cc161ad0f053b12d1d78f2a1e01b9baf7ef3ed53e7b6018a6eaa37298bb1061f15957f536b195829a8cdd6bc84f685368ef057d1581ea47591fd2d534681495139fad152cc7947892ddaf25aed13dc1fb82c8383ca95faf96047cac3c2821acb2dacc33fe8734fe5199aa2b96c090c1ac5a0eb86966d95bd694c4ecd6678572ca91a7f9cc1dea0691c321ea7b46807071103544caf2187bb7ea052709fdf538221ea7114ed5549d773da8d4cab7e14a62dfbf031a46793071dbcc3e995c04360a1ff13c29c9e2196eb3a0d87f2b35ade86e07ed776ed6f1f0580cadd57f942418c4715261a14b514bc647cf13e1de97566944e9ae95946f71f4dbcb6d4e69af0f02bfdaed50c6471afacc22ab513dc79e6e3d794f8c280fa0ed79b47cdc12977f3e31f7fe8bda2fdde93435ccf7866151b49f4cbb19c176e5b569116e1b3952c1c574ccb3e700ee2fdbd066f44f94f0df60b1c4a92900ab498c7220e3b97c2f9c3eb5862e26942a73f21d0181ad62016ba905c804f63826802a1f1159c0c32ae1d77a4dc832b319109b9c3ca3b116f6f7286e53bebaacc2c7fc291db514959d8f376c6375685ccc2496000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021e4502c9be2d62bca96d1eb3b7deeeab5b3bca56ca4b8fa15b3f00e055aec04d2009aa7c65fb6808ffb1801055e024fbd44caa124a7f145268137885a0c9f1e9021851c3641dbdbc673e6d6e556d09ef9ffdea5c8ddb40f25569ca93ad0e8efebd151e510eefb586162b71d89eb32eab8ce862ca29d617e78d03e380e373d027eb0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095256c2c2fef3e0d33336673406b79a42c02f406c25bc33b100793cbf4fe64086fc0da7e8aa640fe7229ef4b3f58db54c11125650f870e6f3042dbc8bdeae24448121d2a80d9cf6bce05e4027d3ccda5ca92ba5fcb41f394cae537b095b25c2701e81be89cedd3fa2c75efe4c21792a0e6bbc875046fdc60830c559b49a465d369f4bd8d8629587321afef05da16ef9987b3759661c1b1985f02acf10ee03f8b8e0fe82e73087461279a91578655fb34d25a376a50f239f1ea428aeef85d82e4bf90556276a887f6d42e38c4794b26bd71bc5b9baea19fdb40a7f65088ed0612cac174dd2aa0f3de24072fcdefeaa8010bd6c4d7f70fb096505f345a50b4ebc3fba96b756bb941ed053cdd16997573d4b74ac1121a694231d798a1c920e6b4165b2c06a9daf43560f37de72bc718c8ae5a75632c8fddc0d4481b565805f74bdf0e74f12747cb603c22e1ea25ddb7516bfd471459c17fbe4b6b4871c48f251c5011ee3a7676bd46dd31bbb3d959ad7cf676d6b2d165f999679d2d4a3dd1a8c82d717a87a5f74d2d5d2f7318bcc0a7226107f8ae499042f19390bb153d1bc09bf2a7924bd5b739064a2ca7af88290a3e3f9894e3c67e316172dc222ce9a25e81fce1d795a57de12ab506ac62a45bf2fd8dea3fafca646a27ec1f3bac090020e1dc000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000260a041ebcba3401d01af2b2aa47a06efd5f1ad8dffc9ab515ff7935d3a891da881a9942dd6a3c91fa99e1ccab92e6993792b90501e4887b0e43a63022788c09b3f2bbbb10da1af64ee06690d8a7a94b73e1b08afebc4bdf5ed66e2f50d82dd7f81faf39ce76a9c23af673849e913c33e85fe5c7e6bf788d55bfd13be28dd2a25d69a4750db6dfbccf8cd53742cee2b99c9da2636250e610207844843debe98c349fed2738992085730add12ad4c90924d29c98a9a53ca16d1c62710411d5f4b805430d4a846b3c626de07a51dbc3d60d6b79f74dc007e2d786bbf29aec7727e7df988f885fed9bf8b52b947f272d4c371e9760b01c85d773076d36a89dda2e3352c7a00e897f05410cc43997c3f3eb1ac8b28df2ad80ed40bf08bd9ed63ab317ecb985ba23b52af9e768519f900ae5ed4cb688acff0b1de1e1deaf07dfc879c65913f629379fa8b67535c3654b5373d0042e775bbbed275ba96e9128b6cd583a27432c08fc37bfec7f52ea4b4f04647dc9838965ade72f23d9c8cf514033b5119f1e4aaf5fb701fe0d01d13928b53986d601ffac6d57cabf3c1b1e51620d3b1c5f45cba9835985a74760bd7d0e862ce868d5c252d6bbac614551766025d6f461dac3093de120284b2646728e2f31897b8de9b970cc3ae2bbfbe91708087e6b400000228000002240000022019f6e021f7942fc01e0b40d946939f980763792512340d7f838a9772802e5b1f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018c0a484be5297968fcd972f5c9432ceb75cad015a0a15e1859760f3210afea5a7a5047325bef2be7f65a71bab21d4ec21e31b613de58bc9792bea5a3f10f487f2d2cc3c1d016e47d7c607ac628d08d26e3d294fc8d516eacadee5c703cd37daa5e4d3144b401e308cee317c8c3430e52ea681e53d9101534ba3344120d8d53f743748471fa54c52f7cb01e055f9496efaeb15af9a222aa90670b694f6f8751ae08fc40d635c392ce42bf5d81f8c6568d7f46164ae67bbf67e8f305959e42cb83afe95398679601ede7a8c0dae22b253aa59ec1bfc756de1108056093dfb766f86f8a51887a8d5096611b9ef0025036bfe991aa411831b1b0a5803426803ab9fe96a4d5fdd674e84c6e6d6dc1e1132ff21755fc2671eff6a8beeeb15303e451baac0b75417d248b1c065a8261bc35b5b523658450951fb9c15cd620b7fcb25aa3d380e94875f7391a4e2acd47fa953cf3760fcecfe5318998ed4ab022ae913b32cbe22f2f0c8b208654aca1914af06b13be2579bcb6309a2cb83429bf2132e72a8c2c6e6e8f471d304186b414faea908be2803db49a2841f3f7730d5b6a31155ff2ee5922e3e515295cbb6ed0378ff750421426088b9afea7243f2870b8c556e000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022731147e9c47315dd4704bf6d3790ef60a2abadaeb74f37ce5a05f2f8afd74eb244ed95bd6fbc3752dcfa411120962dbc7eef4192b11473129af8d919950a2aa021ab707a5f53dbc4c54f504729d0131646762b506d075e4155852e79403edcbfe1b142635fc220cf52825a39c3d5aa7b60bf92a73703f08bce8e6680e5fd947b00000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011ae2362ac393ec06234a70f470a2054fa6bd25f1f87b7ea402cc66d8c9cbf307b873d75a224d0742305071a537772f2219e5f5c81e350818293e3fdfeefae8dfbc5c706d038843cb022a9f5b0b7765faa302a829c946a345885978f130d7895a019c4580bf04c78adc19f76c98a21b2ba97c04cbeac97c861a4f4b61ac93ca44fc21cb3f2f120314e7960af014f5f517caa813ceca4168fcdab2ad544aef8d87ff38c1d5e738a2ec900961c5065cdf508f60bc24a9e8b067c9ad2dbf55bab3ecf4088e60cec7c1e703480ae13415132b42ab575c5bdc9790cfc5f2e7522f7853bd4329626ed0a56cc6047b23a7f778922d20cabaec01d072b71a5640da51a816f8c5f26accbf8eee3048aa4591b8ba3e911b4f28aecf6842762364c9d1438fc50abf2892c1b6643e285ae016d6bdeeff7108650d21953377972671c702e536850f792f204541a31b932d143972940fabed3abcf6c24e00e1c1cc588f472a36bb125dde49eabfaf04f6fc25b1901c06ce302a83b0cd8abed8f3d778fbfc1bef0b926286cadd0cb6c6179b6a1a1cd7bc8bacf2544007d680c2c9d6f631330f920306d7cb4f6e8295fd94f43703c9126b2d00b32f99c9c1151544f939129da368f86e4a84d4d56cb2a9d052cbb2e8770c0a7ffd9eca29f529a5cb71f91f34cf53d000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000282b77861388222c9b6a0fdcf975c69162a4a2288f41ef6927eb823a93441b2c980cdb15e66acac8e8388bbc1bb589299ecf9d9b153f60ba4ae71a7d2354d879109b3e774b8d94cb94bd1da6493df1dd6d091acb6f24a065fe3f42c381d6e6806553b263d6b75d0cea9786179d51bcf45bf9380ccf7aa70eca5cc332b3bae73b913905905c501df4d9dfeacfe5c207f7c498630353ca18a9ef88472a20dc67113418874acfeeba33de096c340e7a7999441ea2e3969afa4da6220341ff46cad72e7aecaa2c3c686f6493bc0fab132845860fe35b4c49b03b99aee7429044128147f1f6954db7ef198c767b74f1e6acd40cfddd30f6a4dc5e2c550f6899adbe34c337077183be80f800436d8c71245d1a584cb030d849239ee801152b7d75a43b0dba242763cae341553e4e2a53e9a50c27b483080721f7437ca3a3add8445845a0a7a5e0bdcfb03f8c30ac75a6dfd3dada7f9a66e1d8afd94c9f815ec338a59c87d0b10457f21e9126ee7ffb192e8c318e2042c518d9617980b3f83cc7e24ec8bd27dbccf1ef1842c8c1c370acc87a3ab9ecb947ef88e23250c577d6b459eacdc47033e6a4f39b6d980222537a48ce02c62304e3656a3caffa9a601da8ae6236080b80ef85604709c7bcb41c242aed096e47e74b9b0d16ddde5b68aa5938c12000000228000002240000022026ec3907d14ea800d6b89f4cb753cae0c2d71044a89c03f9a221bde93788ffb900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9584140309fa56cf6f581b73bd48683f8ac483773cdd195f81a9426787b6e421ece953609a1462593b6cb7c1dee6441ad8bebe8d4e427d547050ba9b34973c64e2ad8ad5ea78a3f15343083c2a5c189ee4707da575fab2287f6a80010b82f0d3d361152eb6003da2cee98651048394367cf357b614497d2f04304cd29ac19315579cb525728f1840fe719e5fb4941f76330e0b294e2833d64aa1761c1e23d83a1c150210de9ba8d3fe5975ba0cc2f3771a6af67fe1f98beedb1d8af8f31b501fe8d834a2f1002fb466484f0385359bcdd6a95a5ece8976a7ab7d93dfef4553c88cf3652629a5e7bc74133f514eb1fbc0b2f7d58154635f53259d3dc1abb61f4b178ad8594fe1a95a716e5022e71de08e0ab4ac2995e1b89d64055398f0166e5bcc580e759c5ba895d3afdd0a41394655faa426ee92e357cdf1dc52657e2adbf5faded3ade525b04f715481b7657882407a3291a9ca3738c0019cdefd369aaf2a636547dc0671bcf07191ef2c35a49be5265feafa95c6e0d0c5627194ee5b188bd5ec775f86ee679cad7dbc1b31b645e9420f74c928392b3afa34877f731ed67ad48c69776a72c5165e3b0652480ec3f7d24134abb49d584922666a70bc88dce000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40127d66c18f4582145f636d068a6caabf20179d43a2cac16df5c139468d02cf43c02205482c38e6638ec633da76e71646a6924dc682a5002f5482c39fd18fff020b32e89c98b8a9d0df5cfc73fbc8fb7d79715bd7651dcaa3e9da738b4e03c81a6e5000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008fa1c82433f6a2df40756a4c1c91843f55ffbfd5eb04c672e4e5dc6574434e482db8a2325ab1e31fb3269c8034d798b877f86dceaf92982c0e869cf9ac307be712dcbb146306cb9f084ad26a8a1d8efc970d2c627dc12b2f5b4bcbc4567436c87f5b6e3ff7f83a1669e6f095d5a91d855eb309b89b2d0ad6ab2522f8d8ecbaa77e81019752cb0e9f40dab35f3ff0597cd056a56f8e2fb44f642a51e8d4c014033c098466e3f906ca5f41f688a42710e530c5235ff6ea61a61ef0e1d5a5f5225e2b5fcb5fa4adde431c52562a54f8e22ec43362c81919d03a8503432ddf13f2bd53a4d2a42015b56c934d9d766259cbdf3d61b7fca33ad33c60b468b68bd73b9c93cfd8360b5ba7ec5cf41ee25df0adeb61e87ff43a9e2a5af9d70f06bfbde51906d694836c6ea5b1f03323307136b8faf3151279b6155fabfc2aca6195c595e484d29a546d60f95627b226aaf98b0d270c4d574f345e81f3f95ec701ff9cd8632a88fd8ac38cdb173eabeef7b73492eb07bc91d82def468d918afeff2faaeb5fb8aff17b799b40f27f8dadadbfa289ac70d9def43d761240512430c90e08aa5b049c570a7e81fcadc94579f380ad21c807fe697d22ff6cd89fc79a87a38ab638fce14a4cbdbd5b78781e1a46a32f2cb246469436d6883ca4435103c5c1336e030000022800000224000002202b0eb8faf155367d8ccbc208828a65bed9516655198035001a9c66456148c80c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a51fd77445e1f115388e4d9086ba1931ed23180b67ca264e60e85f18e6f1006c55a899f8246a94619a38c00262ed7f518b5598b367ab35cb5febb6f61ef4a22b6c7da3c1dd08dae6536374589d01e131bb8fb1e36482839bc625c8f01105565c2090acf0bb8bf575e04688466ee5b71b8ade6b4a85af324f2d42666baed7e8441ceb9a5f45d52a29c6b17d1e88bbc8c02ab99d80de02eaf17b114adcc5742105ff1c223a7f84ddd4b7b3cf0a022d31815a74a62de1f989cd88b06b0ef9c72af5ff11bdc33da3048685023ad7628ff13c354039a549f291555ec38d4c46b58862ce596c014e4592adcab44489112e6655ef80ae9d777f261c12175e11897689744b8f1aa9239e6e5095a3331afd8e69a0dde1054bda6fe96273ebce4334926dd93dc72ecf3d920f2b6afe7d25b28a9bb09b247e97bd2ea48f4188f463289a1bf9a611d25ef801829b866029c9001411037e2caae761fa7b81c88e702338fdcf092d13f3bceeaafe888c8203358918934c57facad3f78d44ee154b3b75f2a72fc4a52acd30a4b8ec0ee962b6d8806904296cf9c1d4477369be44722811c3e3755f35409455277aea60200fa4d83eeeb6a9ab686a9d64f5bfbad74aa07abaefbb25000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40102924e1ad0426638d8e8cf2892a11ed2c452414d026da369bff8490197fea749022083b6b548ed3ef28b7f40c63aba423e002808e4d2ae0c2d656dd245e56a151303466c3a82758eb2e369e239495dbbbab57206a3ea4eebee9cfae7ca7789d5520000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000992e6c4e03e9151ca29d777abaad0beea572f0eebe77927b3f4c41da713f4d89884292daa1b0274148ac0d3a2a9272036bd274d9dc5dcbf5c961366f53008458adefaa3bab7b3f69227a901b01b313f1c1aa0b2feab04ee59b249e34660d8292010ad9844b58cd26516a753cba358e240755105a58249e8beffd70b9af9294e9db036ebf7240d3f23c9d0602c35c59cb1152af73f27e36f6ad03902ec9a5ea38dc14e9ee076d3cf5bfd8d6e74ed7f60c9d8464c6c504b58bbb8376880cf9e2e00a30a959fc5d0ff087becacbc2fabf7457cdf20eccede3f3122848761222230dfd1de9cae8ad0de023fe4dff807a04f9f93277a707e4846701b0b17c49cfd2e99633efdcbacdffa029ba94909a9ac2b81dc734b5ae197d2fd337b9a0fa1e7bb4e93ea6bcd1d2c479f2760f9b517c7b2b86ac1357ff4e6d61d4de84b5e1dd9f1644bbbf498f7690d699ad733a52d2b985c4e12f44421f05a47164b4089cac3976918f6872cddb5ae9daec681301acb42921e77fbbb9983b8a1ede357a01c957a9c9fdf0f60a8254b14902a642d40b74bdc6cb3211609f07fa18858e9608810c3d1a6e1d3c1ab8b4a9f084d13ab8efca60aa64a207a9ab4a83b7f0b9a6993876cd0fe8bad5895249f408b01b26e24bc2f505ee7a9f7c9439fb1eb42d0b4e9add0000022800000224000002200b6ad79c6b8db2dd2bcd8789b9cc802c8d54b8c9d244ca4fec3c9e6ed8f041c60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011cbbde337aaa2c0d065a92b22710258a6bdedbdb25d3455fd971c9e8e462277ed1d2cb3fe66c5a3a8469ba0c2b483006ce4a179bd6bb47c087e999ecdac5ba6bbacb7ea9ff0da29e8ce1b121b0cdc6e1c587599281c7b8d2d741314e32204a8a1e44e17a7bb1e657423610674ccd0b0e1a995a915d4a9784e68fd726a73b281f6d5c414f2444cba0dc7c19241f33a48c6b6ecd74d902280873d20b9a3fa465d00699180ce46c9e6aa14dc66d680d83e4c641aafa51bb3596a254cc15034b8f27180fc34503d7ae3c50e6e228a05c70f164019bf4731812ce20ba31f6a7b80471f1b66c2a95a527c6c00848b24fec4c68dc4eeb2d95d581983eeecbde7726a0a1765828b5c36abceea24e7a75e7f7dd34d42353501c2da0260367220bfccbbcb90f9e70d0e4fc2e5b2bf1455be1e17b637043856379f80b0fc0b4e5ab37b0e922530952e3e9595dcef3c70ec6b566e2411916109415c7f693e2164802f71a3dafaf1a002fc4319299d4e2b04a7255cdcf351609984c8521a6580934d8e39ce1ec6f041988fa96d629cabea965cc3263f5671f077e7ff3f95662abf114a13c45470f8787c8930d6809895cd26c37dc54392119ab5220d32fb03e1a803cc38e317000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802139771d0789d27d4b8e88c0cfde8dce394304fbfa2793b713115e61bc18ad2dc1f75e655b789e986e7dc5830f1959337b789bd2fd6ee507f8ed9ec83d96086b80221c1bca3433f44324dccb6eabbfb93a154cb9cdab0cd7512834b807bfb8a40ec0868e8c1a493040af51ce8d9578c722cc0aaedf7c2f21c0c229d2488a02cff160000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a44058ea2eba39735f635c90b9aa57d34a97709f2a4df3eace92fc4f97dd2c32ff684161133a1c101aa36d81fd57b703a2579cfd17b0af333761f69a8416bd8e379445b111fbbca6d501110d341ce4ff7ec5e214d07a08b9688d9d39fab6f13e70064335644589a556e57e9ad339cb1acab0d5ef02267d459de0ec3a3280d5cb9c5686ba3d4619a950907d9192e2480c619e467185b8f40a36b39de93ae9c21375ffc20f3ab1dd5fdc4324c6b77ed55e1ff7b7f6416bad6c00111bffeac79ad027179210656fed4adadcfd3037603bf5d9d28e24b72ef4c832c8577c4b2246d84fa80fd6a207ab463c91e1f5c77c6ebf49aaafaa150d42adc0fa167fc66faabe589feb15edeba499af1e14213ffd6352ee0d51fd14dac23a8a6ed369d1eabca8dd36f31c5a8b1df90bf909955ac95481496525f91b9fe7f61a2fe0ef0ee79ef91b9a7b501fc9ad51b0ec12510aaef27ff203fab9807a514a17d542b9108cd663bd94034654fbbbbaebe0d40ef34d90cc6c5e5faf7d27d2d1a1d3923fb95e4e828e5e8c57ac9b02b4fd44ab9490711a4be6ef1ea14c23f25eaa01c07aa4d6ae368ff984f0719d75d8aace6aa0a4797dacd3ad11ae2237d6d97ac43718ce28cfc70bce9514bc7d9642d57cc70b418569df3a997abd61b3166462c8dd466212898000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000152f83203f7ec995217d0d5e659416ec73c45e1f6371690b02c758f336522f8620260067eb3a61c09a3369e2e43c91003e5335d8c1389f6c0b662d1ba69e30fc998d8f7d5d0f6180280040ee470153106904c34a2ba8842c2b894165128633086cff5a71454abfadccf0db6d52f5783349b7c6b32089452e8535c0a0c16cce7158d16682a17a7435441c03f2340e2982eb8b456c4662e8f14a7b789061e8279b06f925ac2ab5626b5b16d7db54e04cc2109c2afa2c6e3b244e2bda18347fae0539bd52701add5ed2e382feeac8137c5abfcd7312f498da4c62013e64182b010113d905df48bb47c1e3606d255558394b5df42442a6548358bd1c94e7f22f8b7cc76951db13276ac9c250431a4943a99b029c70628bd116bdd3ba29c866cb4908f6a274fccbb468be3398278bda5c0c95b46da617e74e6691e09fdcf64a738d999ce13ec2bac48fc006e7fa6fd0cf8b93ab72cb22bd28b6dbeb2978d3cda2e0a58de9567645511edc4d90b30b7b6ca889d41af810cb8598517ef3727264a926eeb795f39e5d66467c0e7c16526e3a6b33b51a8e268e7e7dc2ef190367a31cbe90472fe5c1cdbe1df9f309b089e0a920e019d4c4d008d4cd187d5c34231cfa614e055632b10997708db2717033a6031325e0f71dedf1483ff288a2ed8ee875120e0000022800000224000002202df098b8361f127315fb36de7e1099686e5410b17e0745f545b432b2ba65c930000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ff589d3c4ff7ad7e6b3edb278c00bf9e552e2005ea308b02409cfdb4630fa93a5774c674f202e5c8bb8fa110fad33a9d98ccd410d7396384ac4056778461c431fdfb221041fae9fb917ecdca7b02bcde1ed1633472e8efb085f96c334437e77ff4a6834bd6e4022bcc100fbad4c572012ce0fe075fe6209af303e2478a1daba3430ea91854cc881c81ce3a0d42ccf9835cc5e5614813ec774125f4c5c21eff805d72bbba00b4b0f2d6b4f8525fde7504550675a368bda3a3b7d68017518dc345ddd434c1c997c382db9fb5398608fa0d908cebbbb46842beb2b5ad9c0b73c7e6f917f3653564ac522bbaf92bd35c33682a15b45904bcc983e81e3bf68c8f38396672f8035ab92804621f42790423d474889da5b48c6783b580d280b1f3d8615bf741bc71649c93433b20412a622dd98c95832c71b7676533bfa0ba6eb970b668fa80f69e7da2e6afbd38bda9f0f67f39670e88615f0a1ff716ab6d70f839a725d9a27e0bbeea8545ff13c96b03cc2995e4d44a08d09c900699ed65d9b7fa1322c0faab28798c039b41fb2085f1031b60048707bcc89664740db8a8dc4ed2164e30f7c548e8d6e0d1d000d72a159a1b75f3bcb9b4d70b5a4e94b0fcb8360aa46000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401116266f37682f84be2b8391f2312ba0e69d4deb6ccf637b3a4cd5f907006fb810223aaa88195c4f3d07905d2cc240be35df1be4c86cd76ee7f1c08ddafa88391750c9de5ada4fd5eea13b15ad6753bf6f1a56a51ee1dfc76552809102d7275ad5600000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a25175ab6be6ad24306d07a024f9afee52adc57b933e3461c1ab92663889d0737d39dea67988b82c19e739087cece06429c3e46cf2dbb734c8e993b7898d0baeb330b5345dc10a60c70da79fa0be0d3aa27183b89ab5ac3d6b0e608c3045c684bf9a95c9d757594f4b0c11f0895db18be7ddbf359e1d2c9de345488919a28c919f54baec80a2c9edde8bf6157be451949cff98074e5c427a137f735f8666a5dcbc57f8e17038cd579f006ab5c0e52bfc1dbb35e59f2391831218ee87926f4e9c9b347915bb80981c0377206b7e60fd5f4ad61684cee7a4b7f04542d2bb7463aa3ecb26d8d71319a6b36542901251d3bbe9539a0c6536eeafefbd0ac39e717b7f7d7d5a522f5680f73355d96b5b669f986e2e4cb6f62bdc629946f5a8fcd2923e6d853744ae07ad11142158555af326949fc26071a1fadcf773984a90f893a2af819b8ddc8f4724d84ae32304b50d6c5eb859637077df49bda809e62d67adc9205bef63bf6bd593bce8ab39095d96917355ee53f327d2ad9d60dcb6148e693a40f809bd7ea36de5c4f09b57c799778b1eb1fe889287ff2fdeeffa74b7a4ffe823a91610aa8e3c5336e22e7bf3bf66c2523ba5ba9a207fd61ed255bf0929fba58cedf51239e423b36b6aebbe60e780811fc551d666b10e092067793783de5bdfd60000022800000224000002200e5ba9bf79ac17473b81fa90b91dd79e40d137aa613a5cb239113f130861e0f3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002825ae59f90bd292e77d4efb5ec5590637d89ee0e37ebf109bf4adc12555097a013e7e1b57fff2a77ce8cc4957e9fa71483f0e3185d09d83c2b85ac14c30a163ab0ca06d6a2cb8c10059ad22499ef42fd266766a00a107d8bd1023624bf2658cbf565522824389d4e7bb498b69b52ca98a91f24192af601a3329ab70346c010767985dca3425796277b1eb23773e8b5c2b1fc3b3ec4ba9b4d333be89489f76f046aba1199f133b26a0d69b1a9c9394ee4aa84f3181b7955ee089ff8ca8e2c219ee72a09744108a55d4bc10c170f47d3f33ed6254e2dcba105adb8a4e0b193524dbb6b018d1dabcf7d864b4ec2cd29e73297ea5d8ec9edfbb8151c1c0a073bfe70e5ad10c14275865271809bbb91a515ac688928ebab69d07096d7a6a2458bdc220fd96aacfed59fe74652b246e22953c6d019c7f99e22155b51a2ede945c477750b5959e46fe08c445ef7b29c68043aa24566d671de7153a1537d547a06088f910ead12a12383e44d064118ee5eaffc48670d91c9968c2051594f844861c7bb03de362dd8c89d30dc7d3de122ab354a3d787dd45a05f0cb70a6151777c37da35f093bdeff9ef451f1cf11f500d4e3d281308dad2749d713b5c348bb500164c3b000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80206fe34afe14fbac45c3703a5d05f7be8dcf6cd1843c80fa576610a05224c54ba1bd68156b4a641f81986d1f8f3817f63eb8e6ce055cb09b4e7be1c489df9b86f0224fdf1297f51a6876d5892da9a0766f19de892a0108a52a6c41ae7b7873009520f3f82924c721943f992bc3a07e0ec6b6fc80d5b203b344dd5209576a74300210000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad6bd1374879bfd07a856ecc061bf282f24276dbb6c7f3ad48ad32fa0301d01bd953197dd4e8427e21f4ecc2693be362c788088e76dd0fa5af34f1a8c6c16b9a82fc591113bf5b12731d9c413c84ef75c9697c1b97f022ad043bc48f89fa1679127260cb6ed2c3df04f00cfdc7083745facfc263336e1cc0dcdbef2776a7c77a9c2f8ed5a685d8638407825dee8f3f7acdbc5a5bc3860a78e0df53ad53ca57a2d0fc45feaf8069b1db8faaf0bf44ad6f13d8dbf5ff0003f9f5b027777e07311c66b2bc1ccb76d667bd0f6c89cb7a37e29b41bfcda984bbc443e187ce92823396a0780881aaa3244be19d0802122cd55d8b297c302b909c8851be2a1003efca2948739b8dc3a60c1555fe9c3125a7d9296941f62cb1e15025bf0c6e2709a23e6e74bc3cafd8e0082cae76a70ecc1f967ae5218cf19ab9a20949fd0b36551b71aafc3781de0edf8527edb8bcf1bacb8d37318ab1d352603a778c5ba7b3c1b1ad829f348c89b7731cab6cbc5865547f0ca5e25b3fd0e9823ede5830686337121735ac187b4799f689e0c1f10ce71f05ecc4a754c297fae32275ee355d04b25e2b5d8ea39e3d3b06a304020f12f921740b8e2d9b63d5ca2bdfae57b52f2c7c13bada40c8fe90c577a67f85112e1896a51bafe95610ec383afe5e9e6beb657c1b631600000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020158222c5f3f45de0caa0309bbeb84eda4dc9a3da06be19e612e1e930438bd71ffc1c4f42cf41667dd87ec20f90571cbe003c44e36445c3e2a0b8766c31cb54c7023a6051c99b9a1324660ca6348aa30b310280a6af17c4288d69dc935dc323d96e010f005ac82ba6a9cdcda5f9d22140376e97d54cb4f0f4b47c7f1336609a14566d85a697a9395f983f840a83874467484ed71d29b9e43e3e122b6237680c67a9e74087ebf3a662e0c493d18dda3aca51892938dfd54373bc3ad03a0908e28790f589087f28f6af0630feaf422ef62e5a17a3c0dca77bdc7aa6797c8a63d072a5924c217578ac6938377bd5ad463e4a5130601902a0bca7f358785f5b584e69de4f619beed43f8612dbf184cbcb0903560fcf2e0069ed2ebf3c5e9d627509a41b1eca7b7a1a39b2768eabf87509fc081e9d6fb6164fdbebfb9fe9ad4410629ad4a225f8a7d5a5c08300f896ac08cd9e59366832ac7b33766f081946947cbd7723ed9b828edf6cd2cef0759ff3d17eefc99b3ab92cff8c6bf64ea093a03aea0bee1e23924587b490a9de57a939af082011b202a63c0db67756cd0f79665ab780d4b5d6ae6fb691ec4248f5d93a0cf2f92f50b95638ceed739b71b9d52eee32c991f83349c9b60248cfad36434819b455a5049b8c5abd348a42bc3af388a0940000022800000224000002201c8e3df133ac3a33ff5bf66c93811fa9d8f2168b9622fa001196e56badd887f100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a61dbb82d2f7a72382d4b834be96897c4e4e50d9ee8830256d3eb33e16a359cf6f255e1d3762a525fb40df469dd01a693545bf8823cd9fd315e92900589bcbbf4cde9dc3f2187be349876ff98530ef9fd587ed887ef2d9caa16c6ab867e5c75ae44d7b63aa56f6d3957259c985f08e6f3aea214bb2ecb224d584e80afc7e35e112939787e51d7cc050c6138aa1db59f0cba7c1d4a02165498d2e6bec83a9cf70042259926a086ec88c00dd8d0c27cfc1a7aff8fcad4b5dde303abca481d7fc9ce3f0a4f8043939bb5332ddada99d5cc3c9b32d92879b46a6cb66e2bc263cdae64362458d8d2dc1e8e7e177cd33424b57a774151568f9e3dacccfa18a131678cde2fad32a22ad5150bd63f56f2e823f6029059e6f7be03497dd6536b383e3395fbed11766943a2c4555e89344aa3fcfa1076cce474f9695dfdbdc6224a6dc94088a56118415941b154a079c7bdd4bba91ab8c41bd9fb01ef134e0174fdd072a96ea1d85b74711669216cd586f55a50e79b2b519bd3c6692c07c78e649227ababe0d3d3c41b00245e4b39c9267a1678aa789dc659f5961b261133297e17ad7431c0ea5a67661a35a44a7748f8e443588ed2f844c3faedc680cfd9cdb2c0a0cba14000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802125655d42a131cb9b88e02728023f4e8a7e67d9edb9751a3c0d369f774cd6c4b15ca034e84337ac0bfed51ebb12345b372a58cc764956d0d23f27b1443d5f1bb0227d7890be8b176d0527de7399493cdebd4b2d1b3274e528c33fcbef6d32f40b727c99ddc28f1cc4ab4468d6004b367eb8ac334573b6e6dd2c5ecfda149c51a510000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013846063e833cdc3e2f32a46aea01a822f19b826ce4c82e70d04a12687272a5a769126df48c5ebfb75cfaacd7846ec3692b2e69c6ed54fd9724e000da4629aa757341affed87aff244c017e3e5986ae3a302da14b5710b98980b5f91bb526117d6063a53519c5a0eca3daa739a1754b7e984d09cee441785e2f454e45a8a913fd807ea763452f695a8746d7d5375a2d26f2b4edadba341bb72692ec9d62ceca242a3a5e55a7bfd4ccdaeb2139d28de4038db9f6b981b2ce6f817520f4751a4afc3e2bfa5637a287f854839761fda89925445c23c08c69c2c1ba3cd9357c35fa8d132db7f694d386823761fc916b663a61965555d41ad16287bd927646c962b07acae25dc39e1545333d3befe2d14692dcccf396ccb9772a8f8a0da3054dfdd42d39d42941c5ef9033c51d138ade5bd222574aadd3f47e618d99f9734edc8fefccfe8f19d35da2c00776beda46556dc46b01d678807370216f45941fd6bf0c854c72047d0084efce151953835359631b28962b8c97d1ae8140646c08466f807f1ced4ff5a8e5388a0eb47a531ce4d251f99ea228496c7cfe1f674b2f94897438e5a036e444057d876f8fbf87cdae4212a81045f1866f203e6efb96fc4ba83b930f3983295a30d77b5b49aa1c1ef4fc74b6d3b7e6e5fed451e4613aa56d1dcd6540000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d0f4b6fab6557a4d8a8b002de17e5e080a0a3f16864f3e9fc990327aa30e535f285aa5f1803a1920cae34f74021271c79146419cf055f81f978a8d826de7b9c3a21573aabfe5730e0ae8cc507cb91cc58a4f7cfa510d728cbc76f547c7940576fbdad6516844c458e16ed6e31e39f1903738a302e1722f7bc6c79302e25a08b883320b3d1f9f026d73a733d90c0670cfac3a325e5a316736aaaf9b16f54bdd3cf36b9cfbceb6ec1b5fc6a9b5e0abe3754cfd5cd1c8d343267883eefa46c85e85e5025c994cc6f8e2f94577cf6efbdb7b95afcc9ccbc6c48a449fa06b8131295b15bcb184e7c5bd2f251ddeafe16df9c0752151b67ccfd5056b6628aa87c82f6faf92d23dcad282a6f509821a270971dd23d624c3abf0dddc93147c1f56b718695336c098e848279110f8ae78d7457f4b1905da1491dc8d6c9450efba1f1df18cb23d3de9f65fd2ba5f9f7681654d26676e1e23eaee44e880a22b1f4e58f9cab51c7cd455c509d840e677720c259136474924bb1b6ade267599d19f498ecc274d5ea23c932fffa1a0b2cef13557ae870a2580255bc105d2550e081720d1299d93f888a2622b2fc3869fac6e4bf628ad2a918b44e03706406cf7e1c07866ffb1a7ef214b28d77689dfbf9dc05721aca72d35a57ccbabd9f401bc7fd2d6dc78d94000002280000022400000220280b7d7bdcac156bf35d8433487a2153a8fc7ac8ba17d0817452db3dd01a5f12000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008dc68249756b57264b82a330235f0b737ae6c7fff45f30611c5d7cf61a9c22999b219d619b74e5f0d96a4e5a4c49496a1df24217382ec15342041a1891234ab7cbab007301f68c708c7cea4e54fa859e848f5fac84b2c19ead378af8283046c038dec2e7b5868fd5f812f6ac99cbab9fc0532c450d93550a04375f38572deda48015ad4a3f27ce032271bab303de1c97a8b734f58fcbadb0ac14fbfacc9b42ccd96a890fd6bbcd60be7bbe0f6bdc663cc88a6b386fd5fd2a256879674cba130307bab79c1170d733567dd5fe5c143dc345475d517d3dcc997cbe0039422df604cb46d35d857ccb80a84015a4f108e7221258761a7cf688ca26249e38083f5558e1ce68cfc8204be4701ccedccfb9aadaf4f05e1b3f8e7295992ab065f3c2f5e471f927c81992e185075e7a5a8b5af44dbb743ee81c80c584f949e75432dffc7c33e08412bc97f1945625243a757b4846be9e3ed142e9915e93178bf403de49c18027bbaf245e95ac827d27b7a37bc7f831a3afd9b19af813d908e200a9b1dcf864cfdb70a945e5aeccd8c95088a6fe6e13a58b5e0764003f4e44b403c2a7943b655072b82e36d9ef3ae4a8cf1542602de996079feb16e2b8f06a007c383cb8e3000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022bccd4990ec37504b4fe2b2673d0e16edc8ef4a20fda4e784f07b6b316dec5a0235e32eeebf921ae0aef6057f5f0d2372d94568650c0d1b53fb9180b2e9afeb0022b1dca8c5e101d94293f83f0ac5e40ed22f459553019e2a9d31794f0a75daedb2f17a8567b2600dbcf28af8fd4386fe862d16a81ab8e49a56fd0d46423a50fba0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c83a88b410d58532d0c764f5d96068009d63092fb409aebf37ae3123d7f9614e51ad4dd30c113aa3e7f9eefd5115855ea3b566ebb3c1d1622637cfc16e9ecf1f3f7e9a2bab909e5e332a467f39d700c00ef2e383939413ad93ff60cbc10aa1fcb4c32e8993fb9d03b240a1489dbee255caaf871e7d1ebe7389c1c28b4b9bcf70206cbdc576ce0fe98e24c2ec395cad8d20e1d0d53dfb6382eade8d8125d84b083afa7384749819721633adeab6c88d4bd4b70f6610d5d95efb826d9d7b8970a7c646293b91d9414d60a8fdf92337155b3b99a4f151e19316c95bbd1f507752f987fe35ff8a9f2b46233c91482cf84610c57326dbf59cb8aa0e76c4fb03fcedca59dd243f8dfca5302e9b4249329a8a6bb9760e5129e46c8eb4808237ea12257d8c6bf3203cc118e6055ec9cf1280752bffe07b7bd2b68fc32083009505051fdec1457754bfecbc2fedcc02171c6b98d113566fd4235ecc6b116e8f8238e8eba1fa06160a4f4a25552d0e23a8ad17ed3fbe352bcc86ca9f7cd3dac59288099d213b0c9874f6cd74b2334f22f91938c76ae4e39819552e31fd81976d21af827312970b174cba8bbda2b964629a476c667173227d8312243ca831328ec66d4a172d478ef764b925131b833c1983374e494123a4b391161d221ca62cfdacf7279e50000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002323ca4fcf74e007f94617480dc20a19c977b5033710f29eaf7dca50fe5f4552e36c1df4457aac427ec26cdab3a47ce8023cbd63bc610603e701d7f85b538af949524ee084a6b01d75105a573ad88f1f7a63f1c7600627a8bc704af07aecaf149b742fa83a4de70bb39b0b73cce0a821b3394dce7550a55605f1fb8c3d393c5e1de6ab297e023690d019f91c6b744dc335d8327cb712965ec0a629fff417fa725158be79abeea8f086c9fd32adbd4d9b8b18b4b7cc97beeef1dbdeecfda3a263d999d326609c2696ffd710a215ccaa634de7f12e81a4e75386e767b069f06fe732b641694f1fb6f4641cfb6f08b1d28565d9b7709127dbf3281f5acb01f2b8c9505bc6e8f84d7305c803d12ceb5730c12be17ae28126cfd9f66ef8e906d1074ddd4f93c76f27b1e8116ce7fa3724d39ecac11a5f3ba315484e4520d865d665ced2bd3b2029230f7b61d1ea676e6ece4e0a6870e7fd89f0689f33ca57a7184a49dcdb5dccd8f322f284696c3e4991a9d286212d61683cf10684f9683405c1461f69ebbac885fd3377192373210cb21a2c5f943adb8c956b7303c9503d38f085606df7f5f208b4d6683e19100814393bb5b352e9705d29e524b0edf522be7816d8706bcc26de18c1c87e0a4d9c8c23ff018d656766343a9ee32bc109482527b2590000022800000224000002201f583862bdb95126844f810a244eb0cf98a17da1f2b426c7a063a88299109f9e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8bf40d5a216e151ab35588db2c8a54e945d695a8f64dcc9287d8b5a12155b272c7706b16facac9d6223e33c8bc925fa7a5f257382b20bc31c7b8ee0c0de03a079f7b40c67a01b867c4a86b85848404594e40d0705b103683b06d4cbbdad08b77eefc7c80affe91934b512babc03b208489d1f06d1e4ba6a9b438b13c9dc19a6a7b5052be5a6efb388bbcc6eb27d69b8d0cf0874504cf3401a3ff38110a7dad0a71a401417a3a285d1abedcc3531927c910b89e23e5140914999dd01fb72ab3a04d4899139514d3b44a80965b90083e3f2f7e369ba0cece1548290660cd537edaa560337203083fa177fb0bc28e14cca678cd843a27d5bdc42d6fbdce3a5a4c6a789a7a6004e287cf606de0a44d6d2551ed17e5e4bf55908fe39caa3381bb21641444472b80542a4261aeb82d0d7f60352989e344767b5accae608515623a22de725c0b6e8b668ba09d5ef64c326e2231ab86b5afc620809b7dd901ebac5a398aa3208c7fa3adf1ae1e4d5ee420711fa8568dce0ebbaa8f809d8575758a5f3ad8255b10645ec78363f1609ef18b4839736f11fa2a7a4a5bfd5329f97788a153e971f48140c67f44a9cfec998474bbf8b64d194797680731cfbcfecd5b47f0c4d000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022866aed71c98638bf0ebb16edcf993856020059a31809830d02b95876ac82edf231fa8b4fe8941b695d0b66ea942f51c11d68ce33108e67b06c7fb4e7952d1d3022c0489503c70849d2947a7cb003316fea51e7320304ae3227ca0c3db541f85fb2aa2ce268d691576634880a62333fe995b2fdb1e019745e4d1719733c3bae0560000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002694d7dfdc6b64b7a356e0101472ffd70ad1241b357f30387470129f11a1a1016e60801275c4a7838e1f4c01bc4d6a8c012e94762504167d969bcbfb13e6cd0393206f7bd675d2181be59e77b421778a7676135d596272e26053ec7a04643a8061d302e8545ada78c8744496bfc9e6a5fe6ec434d61a95da24dcdfd9b53927d6436a0656b594e97d0c6abc117e9c4a31dbb6a4bc9ef188311a0d93bed16d2e9d667d1bd2086fda51d26c78d4159fd2e998702abd0d577a748fb2d0e0da3c79e0f01b4f94c71b5301d2ea9895dd6f72b84ec5a37ef2210157c223d90f37b102b53c825690d10fbfc172ddbc91a74afe7fb0843ec6d481be1cdd74b569bd8560b3d2a00bb07f29e6a3d3643d7ea6d7549466b3082cf70b0ec5f884414c0bd953579a76d85fae8fbf9b8676d82e4354f7d734c54c588af9031e020745aa3c2f885a9f1f190a6336dbce8da1b58526b3c1e43de4ef355655a9af7387b00c51c8d53d932862091c1e5b2f1a80be18f24b2ba8ab41d5d72600f214c5cca0ce80382762cbbe2de922accc40b48c1b31ba4a25b224049806989ab6a9c9712e52b39475fc4f3d60a39446fb05fff5a4d53e20912946caea2b6724d691ad3ad47ffe7fae12c4b8f2d03be90762cfb9934db7f9facf4dd7a8a278738ddfde4a6aee7cb7bd0a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091c241bd18a4a128003798e6c96ee5ade402de4717d111cee3035bc7eba06ff4eb7926b7f02a02fb738b0084ce5b29a8f80ccd94dcc5187d0725887c2f8c0e6d368783cfb89e91cbe7d7705bf8bf99c6ef0bcd9729d1a3f4216ab4b47994721ef0e955933324c663ce9ffde5916e8abad28d8d5b05ad10b1645d1f623c4a1e0190a4545189e199e8cd563d6cd41a4df83d1ac78a383e45f719662903c805290420cb683ca8e4fa27bf30571ccd683dde1bbed1a8640f97ad045367414a6c50890280be76a0808693051879b355048a9fd22e499660fefb702cb0b31439ae2e377ec95746ed79822003eb8f6644b1f700c3f8bd38de30f7cb55b15bf20bf30389a5629dd90193a150f95640d900af111b5672e23db70b596aabe89862fc5d6094be3d838e5d79ec8a17a3d7f513e4e097ce60c4bcc23d429958ec9104c96c9d3823fc41d93c59229d725f3b36fca8a6c0a488282e1175a9439805b3e57534ea2da5cb1e09c2dae3319fe961a7be9134a2f6aec6301aee45b78d112ab61a8be1fde560f93b3d9543cc5e82663e711c44e841d9a12e1854cfe9c3bca7f05fb3f59946bb63a60d1692cd93c519d13cf58081cbc177a222ca565020c27d8bccca4fcb4ce67e1ac61eadbc553aaa781c3c3659b886234d075301b1d7b116236c3d02ee000002280000022400000220244f3e0e32306374de3929657e5edf22eafa3850277da7a56a84d8c1dae98cda000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f3fe2f0caac90fb208627d0b5141ebf27555707244eed53da249bfea8a97ce4ccfafdcd12bb7ed74c63e4eba30d9078a2cca0b3d3acce1f148238d9cffd2dd80c35e378a5d55232a026b7e92f103926aa437f8e8b6ba75e2544179658dc781eb48dab2ab45d5380f91943b0f506b9091757ca87785e43de1027e435935e04214059a49fffae87cd3bafc260850173d08af747f300a8ff8af27288d241f157e7a3e556174e2025c7e6461fef37164e41507e2d6970a00444025ce01148d57231018e98c3544aff7a8660d4ddf07e2949a2ac98414ae94e46ed7bde9b275ef0ac2758b2133b9ceef734a98950665611a310c2dc878b718c574d1d2a2dae009fa3e56c5adcb8fc34915abeed4d2f15aa36b101152051fc37d9a3377bcaf97a51868409b6537281a6154cdec030199c93b8e4d47699bbe5714f6f69e01a147f34e12619fc4e36b2207d9e4152812a7fc95fcfa5f1fc128d337de35db03ca834b98a7df033ec08338909113df0b2f92417efd943cc10d7905eea59bfd5bda039a5d62e7ec4a7e6476930c4cc00d19b9ac9d0eef24f877ac70c4de95af1945b7323bbe435b508076e7a470648a4f606ce4c193ee3ab5d1aa486385202296b85435b47000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802002f053fb9163b346e77f5ac2d8757a28691cba4bdca8bd58831a122763e4a421d1530f4cfa0fe58b77238e8a497c82f1115d73b13bbaeea4bbe411a7cbb53e6022c41eb319313a3eaf5bfd9aafbbc6aa95f12031824bcee2f7aedd10028267317302c0c94500855e55812183c2d57db7c9ec9ef1954f0b33ad9deccbdf06208840000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cf231828703977a4cc42c7b1239003e46d0ee2b59581b5926fdda0ea390f07a2cbf44c948b447793951886eee783af925b0b9d4b8e60ae85c892d6e0cc59b299bb602d1cb35c536af3a919567db762a8c4680bba327fdd3e4da37bfd9719522fed2ca8686a1c129169445b576eaf974f3769201ce0161547bc24a2300f2681506db3549389c9243a0268906b79770b19daa3ea79ec6547fc83e161bce4c9b5bea48a0a438216c1688dce390e96a0b34d105a877db562dabd6ea46139392b2fd352df1cfb26c6bb48b249c9cd61ebec1376a72e6ce6bc77a4919565ec96c719e986c9b7efd634b10ca05989f783137cb4821c92ccca67c6f0b00125dffd627b47141b649e3116f7027dd221e71bb0a97af26d4e7a0646c94a3018feef4d3852a6cdcb25de54850223f763dc585ebdd49e07bc6bc3d868ee1afbf1745d05321a2e8f3df85cdf31e804ff9d022f59e9edceb08ee922fca026cdc74bc626e0d21a2355a13fba2a04ca21c91079725630b004b6938d8b9ad37acd7f7c9980c4f046d7519d3efedf06cda2ceb1281019b8f3db16c7482759b9573b38298e99ae3045d2454c839e2fe14c0f5e4d119b8776d105d263cf97007f80d9e884fc8089f7c56845c7baef8b3ddef117cdb3439861ddaed9524796d432ea025a1011ea8ea71110000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002afc88f0f49818cf4359c80d2accf76b530b5775ce15a6e6ae035ffc63b9e277d665d53c094ff1a18dda9d44782239bd1cd30f80a45dccf443e86aaca7c054c240ca6c83b87b225fe2475be811b8bed04d74d4fd7716a833f8aaa5080b446a26007e285dfd4c2e3f5c1cd9b6b77412114253c0e069ca1a074da391d758785489baac21161280d889283f81acc20a01795675fdb622aeb313336e634a60cea63a83e63e3da501cc98245d16dd420e73bb7d866a000748c8ae52527de7134db9c859f66e8538ce162d289c04f08dec7ed362181f28a4677c3fc32e15786ae9488879a5939e2256327a437a3d3e2ad046e731cfe0054570382eeb0472a6bea313d6ef495bfc6b4ff74ffbd6930896870e4742a01717f9bd91f3fae7a6757334205330226cbc526857260bfa47522fb73ba01a22744a0d83f03031ff7a653653dcfde8fc5c4efdd5279d7a29f47474d7eb603111a69b139eae98f0e15d300a81d13e74608566ab180ba265c602db36e97ce130f5d3dabcf897cf0972577b291f3f7070c7bc5a837a102744ae5e7e062f15f9ab25f6ff9143235207f75e4724346af71ac96055761b7110b58b1a2c5540cd69ea245fbd58205bc821a2aed95e9d476883d4f980160c005208b54f98a76a149d569bc67b00934ef50435fe6cb53de81f000002280000022400000220139737b48d0f25f942916644597060f777ebcfe8699e92796974db274845300d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000869751a39423b37724ae8279928a74a15ff8402534fda4862817857756f9eb5d64abaeda54cd557c88764bfef570d0f318102bd35441edae629cbd2de6965312519ad724d3c29ceaaa1670a1f139e81e9b2364909c0c64f32698e93712075826ea1d2fc68469ba7a171dc79f71a710637af8efe94e15c54a6300d45a8b2c238c8a208663a472fb1a2d6a17d340e06d65dcbe136a1f90b278e5c4c68434c3b0f5835436a17efb157bb368bb88551f5cfbe910267fe20ba81b83a41e257816cdb0430b3234d499d402180d84715e5a7466b46cdc9d6184963484fae7ec44c7aa9c6ddd95d14ed68e74809a4b1091cb573a2726c48c81163eb0dd8537fb111793aa15836efe813701e7ee50b653fc837132c31127796e513aec5e038735928b77267360af78228701a466313984d3603c801d1fa4e2a142f2c76e293e10fdf3f1760d0657a6ad1b9bd43a1a4d5fb5d915a488f44b8767586b81ada4a13a2583464078b86b6a5d23a63661cc0939c8635d0e5cc64945b1d2eb54748ef923ebc21c369addef31309def4177fceeaf7fc7b5cab205551c6cd21cf3a0eb61886ed81e005d4a6f7fc09319bb0b86a196e2073806d77d2ea8bb16676dc9b7eebaf414a43d000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011db89d65d7ee8a6d207557ccf8c27951b5cd0360e147e87d3cbddf992cac4cae022d9e68ea5d8d7114f847e63763dacaba2380989708bc3e8db5b090612fb9cecf04f5f9a432a9b14243161dd9afc996367e4033ae13e245cb09d881774123ffad0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bf9e38c7e3121b9e25474ce138cc7ab2666554526bc0858572f752118e6c4835aca49abb7d227a196cc4304b3397a30b731eba13532242616c9de97c916fe32583434ea016f92c5ddbdbfc920b78b34854e88eb5dd10b122b13324577cbde1321fb8daf7adc907be24622813b019278ae803d4bf76f9433d77148680dc2298f2e2daf331980f8ae325aadeba15dd88334c9fb2be6e0f746e60d0fdd386c49e9c53168557ce99d05a5de45d1a8b0a02a2622657d0f62098023c94eb0a0a1f6bb99ebee66978b3e3f42822322fc110f58651a9864699f612d61b92acfc91cbff8eadbef3f040922faa4937b8f3a862e9a3c2cd0a4f698516570f17d4b94cb315c4e419031783525d70858c2de6e4091d12dd06a212902ba83b63105792ba205a559ffc7c15424da3f36e61c38385eda558b9b24afc5a6d087d624c88bce57db1b332bf1c41d4c511601e4fb385a0c3322298c0759e5952268adde9e53c227e6fd33867a8340501fabef1c132c50471567771e97c5e949ddc666c6bd7cb29f5f8bd94cfdb42343c95c1d522d68e75c6922fd2246bf845d3510bee3a1e74533ed1292f9d7e7fa8cc93a5c309d2e12c8deb72719f3ea60270d24e76e7abcade14e2fec6988e7160a29cdd4e5fe52079d1ada4445bb2a1c69dc2bc01e523d7d9f00d0000022800000224000002201224760d9e216b4bcd1fa9b16a59fa61c46be7268d6206911c05436ad661070a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000875c42db0344eb284ec6ed4bf097234de374c14919d9873a1eed11f97cbf096a1335c04b8b01ef1769a50b3b8793fe882f9468a7ce6e6d9ef88ad1b38eb3cb745dd2ecff3006eabd09e69191e7ff17cb94e230fb0781fe789d57611d998a366ee659b2224222c5e4f2070c9c93f462663a80b893d8d4868aaa2334504d9e87900517c4cadaab9aa2da21ffd3cd8629f85e6957e2e9fb45ca6e34ae300993bd41f5cf482065fa784f3fff94e2d43490d31f4284180eeee7d31ae592b51ea64b118730a3d5296b3cc8c47eb76df15e4e88111f2503403104fb240144c35ec092cded57aaa2f888f96e5a7c678f6b6db4de21b887d945df758b7ea6b069d5def081715636521aac09194d530774c78fa17c5271835774aa7539ed72704a305b050e6df507ad9db0f1fc145f8d78e2e650e3d429b342b1c563df2e863618a458f3667a27e6ba70b2ff11978f509081c896f20911086f71bcdc81cfc1f0f9008bd2e60511876be844cead4b5653afa18433761e0d58eef3c14012819c0105cb09055d534452915b81119a104112874d6eaadd9a2bbde1ba220c75a2b89da085afdc01becaf354832d894686f503e72d9a5e9781d73b3087c15c5cf5fa90bb6278ca79000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401276442fbf673004a0932ad0457ec303ab7a0e6f63b3685df2d8272a4b925eb3b022e84d2a1ade43f68952e1874861113ab9f95a284d3a038ead9ebcf8884db3fe22c9fb75dde0f5ed74a62b88498f733393ae96dcc751e4ad34b6635a94cf866f6000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a8e176895eed86165dad4d83b6ee6a0abf9b595c1490aa9adfc960cbfed8836a4bf57ed396b139f04c7e3990ad45fb178e91cc002c8642339873247ab100b89714baba3d2ed5c93d5eec9269b24ad84546bec6d9cb0895dfb377f8af32e8fdf6d9670f5cadc791f2537269093ef2db434312e715d1d494e2c2fec63c6140d067b36af21329798f4a5746733e2767b713bc08fa58efa268accffb036493bf591b47670436ca7035d3f6bfccb09dea49f1e29ddcefc190c67b60c5462bdeb4f1e18d16850745e4863e1c9fbb5357519a828e6daf33571893589dfcb09162462f9d42e5c19118b06eac14e0f6903ddb9c743a8172f4bcc6c4115ebacc1d0d0556022121dd220f2012673db258ed70b774714aea8434c619023d8500c766ad07a3c7aa66c389e2c70cfce8c71db6bcc6a0d05df1ff5119366d5c0b9b763bb13d4ffcdd6145924685fa9898bba91fca486074db821c5ef3cad200be9d781bec8c104b626ba17c94d17426b66eb41b6ebc392988244c32e6b786b11c451c94597792c4d37bc83e8e6ffba35c2f4b335b982a4b8e8e9e15d748a488b8c4cacdd9e0934caab2fbea56373ad62cf638db6acab31e37fe98a09ef03fce4192c0c875056e5bd1b8a8e28bfe973f9cb59ad92e19bb654c02abbeb02735c4ef015126f8cd024000002280000022400000220291480b12895cc900f24dd83686365b319fc300c21a7da18d01fa70fb495ddcf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056bffb60d6620a9cad41f4d58c66f60e97a877d31b000bc71211e7b17c7d923d61c6881e34e92aeb9b1a88878737bb5bd8bd198aecd1c7cffb4141c23d5813b2340bd65d7bc23208c1848fcfa29c1f551f3c5b3c3a34050a189f592fc46374991e6686b029a4b72578c4a01dc66e6abcf150afb26d225953b16c66bee6ac60eec09a494a94d661ac1e253b0505df504acce0f9b774170215f9e97509d38ed35d71c3697a4a47e3ca61dc7a583943a9639fc051436adfe3008bbbfe9c29e1e6a93a1a49624e4000e816dc3fc8e850181117b0060ea493e712354c47f707557b7190ee7a4f4018a75c18f6cf66d4b4774457fc45967a6e38512c5355dd22d48e2f059276a678fc0784c15e68c14d6c5d819580b4f29d3fa95f09d87346818de5de355a3bc988136c171503b5ecfa3208f535e38cd836f02fa633b0f6fedaf0652b28d59613336197015b67a0ba53a7cd8a4db944d1a4aad7fc0c44a06013d40ec0ce6f543d180e27d92051f2d02a38840cc4271657ed731056384b60feec4469e4ecc3d688b5941f36dc86d6f9f2fcde01f661eb072543fc611e4ec00ed502fe6ca7adee3627260094f4e953ee86faa4631d3eb57916e1e32e4ce199d95c8b6cd000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802187b36527980b6f27ceeee893425c91a56262715b1f107f809d530b21ff186502d5e4b633441c472c8a1704ce7a08349d102e96541e94648b95d22a251d1142c022f837784637da0bc6af95e44f711abacdf44bda8282bfb522a1e5b2667310f82025dde8be9f3a4c1febc1216b45460ba99c13af2357ca90b8d1974c45447e0860000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000152c71acc5f1056fd19492689f9c1ed0fe2822cdc04a1fc3add401912289a4e735565f9102d14e82db9bed9f3741fbda35f5e01a25b83a7ef366cae2243a2661a506eedfbe6bd6284a6628ab9641c7e07e822f4e5db3dbde6885e5289036cf2618e49b3a3692bb56f770de01c0bc70edc1515d0b33f41cb94791029738d461563a4521387400c6e7c8e6a661572175920a0b10b12da61c64b1ab3566f2b15b1d531ff64e15eece707d49b9c64acf9c27c01826bb2b574758593b46fd3dde1e0a6927d96ba39eb7de4e6573c5f85d7569c177d100977ce3b6685ddbc51f7f6e7570f1664e3703b763bfa85a605d9bd650ea8562c3d66c1af10026af78dc33f36e4711e4974bf155df4ade1ed96f459b63ae283cdb602be0ee0e72a380e757fc4949b2c4babe86f1b4f9cbc41404bf86910a5c55d5c8c7dfbd0b0092235ac863e81ec4ab756cc8fad659152750bb3c6676480dac3044ed5960169a07b9ce5e84b076df532356811053cd2c461889c699d9dd6190696655caf4f81e8b6356d8a80c81c04e33717fb4cfd347c7f31e4fc04b91493689c532a264b05a6eef180cea377bb687896e64969feb03509590474eab721b11565852a8c193a5b3c0f99d5446d5889988092363896a22e95573d2f6a897c6492fa5b5b21ec61b9ec8daf97f1f000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6eaa84cb62f4dcff02efb8c295b6db06e3c85c85c60531c72662870c8e2bca71dd32bbe4720c4290bba7356d0a616bb846a50221e4de67c939a92211b8cfad193a3690740c6ac3fe7234c22651d53cf9c3194bbcd5200abb63c8bcf147ae850d93fe38a2585a4dde31861579d8b1d78dc26c3ac5a7c4014e130bc7c546cb83ad9a8da7dff844662ea1c6f44c44b96206fd1910df0efe465e042c4b86d6d6b772089d239332a89dbacef6452916ead8e4e1fca4e3aaafe21cebebc50cf96abae1477c29aa57054cc3a218aa679a0e353a3bfe6547e501e36709ca0cb74c10a756ac1a5751ed0731fa3e005b32a9d5df1ea1b899afd1b036769fe8818fa8e78f322f772b47fdee31ba034c287c646dca8cc66e464ec67aa4b8fc31acfbbc8a9832169f6fd393edc7038427bd06a007a398221c590b46d5eb1a4c393b571243b59c4ef90f89f6195c8b54f73f75c8131436eae45a529c6e991387f91119487eecb3b774ba9a30133121941131c45ef79108396492bb969908a18a4d8cb13606e42c0f0cd5e638105fd8ef01c01a56fa8d00dc62567ef3c20347245ca128de2bd0a6acf44623dd8f47541cda8518436dfbd3c141a84167c0d5b042c7e0847f5f56aa8a7e41209d02223645d5d433d9dd8c6d572e3e23b19177df832bf86bb24d30900000228000002240000022013a549938a054fe0f0cca93967c418e9d1e97af70e8f14433616b517577afa8f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002818f974a2be75c9cd48b53efbbc02c23099b7c9790bcdd35d26d620cfd929e9998a15ce56a58b43dc16a8c92a222b18433355e3bcc8beb33e13302a9f72a2c9ab1e010609d8eec459cc73930a306fa8ad82d5571ab59792354f63b5fe8606fc1305e69ae229417ff6aed01119136802da0547692ce8436868feae9dac3730ccfa12e30544067c14cc3270e185c2a386ab26e28083a670e210ed1d77d52506851b2bebcdf1ffa08b87d6ffbb1f6026bc82e1e78de1627c5e71a54019527a39c223f89e46923eec22385469dae383df1bfe4965181f90e830b5ed98c0fb7f7544d29e4e074d4fb52b9e980ab27945349889f386d0a1ba1124ecc58b81ba1eec9cb66a5767e5d79662a021b34514eac3002179a077126188b31574d70f7d5e40828099998a38072f3c4bae3d1cc7c750771c1b7a4172a2f11efc76e87c22f0d6f9fffa819c78a95db783bc3d0af68753b881089af8e675c549f30376f347570901229497c707fb637a1db0d87738f8e3f0914dd5e43035c2ee3b54edae36d9f1c4a188961eecb29a24cfe8abd8d9047970fbea27992237c3c891a2100bcb63c3819751bd08085a78c9b956b9144c685d670ba29e8c36cb7b3f4c38fabc3f0adedc0000000400000000", + "14f888b557c208e724f638a01c16a4d5490fc40ef3e601630903e56c5a50dc870000000c000000000000000000000000000000000000000000000000000000000000002400ae85e5bac417c12c08221223dcb741cb2f4ef46d4f061c0ef27d91857c92e600089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000c00ecedab0b5367609a8eb95393aca87967eaa4c0e485eea5382a87379f6cd73d10000418002123a4ab316d93e5461a39fce28e40e736ae2f319b3547703c0d0afad6c9faa00004200190b2bd9a61e15de13fdc0dd5db50292162dd32e7193b1d73f6a966182f7db89000042000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000070dbda60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad3668fc26fe7ce3ced69bb16e054c83ea22fa35593112d36d8b3ed98d532309f84a9e8f0000000d0000002400000000000000000000000000000000000000000000000000000000000bec1fd4012f63e2a3601c822a2504ac02733d73878049cbe0e14b0506ef3f1b11104fabae0200c85015a72697f6d0fab975dfeac211af0ac971c0749e927b460e44a56266b11cb7442a7703b703ce06a4749963262f939c99db9704a400dff176ad79c7cfa0000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002de2f3c0feefe1d5aed009f6cdfc336c18db326ded293794b1f51b578c36b95a3e5c23f4156f334f63d4f3c2a96124c2212a3a592f32d6eea01a99761f8743179f6551f76674d7485d36e2ab3fb081bd37f13d5e7d8cc1b4bc1960c329ad17c9cc2177f2a87d4e4d36c23741bead9a43750ace90f3288ef776b1ad5f0e8917924ccf16ecd4405982d492d064d925b11cc32ea3a14964f650ac51f385a89aed461789995da1278bf06ee5a6f39c83924db6853141d35c404b238983d8b7808bacb9272b1b797aca594ddede9e7205f50963fe4b62bf0657316c8204dc7e140f4aeb76728e19eb0e586b82d6408f8af0c7b87d6340118e78219cc486ece318c13d9c7c41deaaff718e1f8dcaec42789a37f199a3f3ab8d4a314378f597307346185038114dd08bf45497b71f3bea83786bc41c02d0c025f1a76eaedfab077048c4a6ce28143d494fde4801d08695162ab8f29b57be933142abb9ec88b67c6fd9e1ff8eeef47a96b0209cf6f6430b9cd449bfbaa7b49c95fd1de945c981d4ae0183736b1f9b0871e13c3e8a93dbf4cebba309e7567fb2702ab556cf65f863fea807f65ba507a064e6e673ed4e04c5bce00fd3643d6b0b52cdd2590ab3e3c154b956da62dd8b354d7274949a9546be07967b7c3f68edeafeab23641658742446b88800000228000002240000022013b30f8416f02719d4886be8d9be0b8ceb14500abb0f78fca3d6f3b6070b5d14000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a586c1358fda4f68824acbca3ae577c9a210204f6c4f6e615c0337a237d7d282560f362a8a7670872c04084b2c7d071e9c6dec7c14562b980395c0a0efc5715bce1e4a09c29ee87d0d1f2ec8af0a880796d63108562e362cfb09927b5efaa20ee9a699c0f55e04195ff1f8c11562356a8186118d3dd332aff053fd607c301fdc6c2e58a8b8db6ae83c0fe432a12a87b6f008ea6724aecbb3b33944b7620ab99d2bca563aead129a724e2c3c3b7e539d31a7a1ad0d7141bf80d620bfd595c09e10a828c5efb6f2ef464a1c15a458f01d6a583f54c617381db1e12eca289a4685b38f22bd41abf2360f58e81b2b952a171bb6e44b516a24f104967e49417775bee563e4b91e9336ea3539445fe2664788109e7c496533f93c5d02bccca616c2a8a216f71f89b5edb51decdb4a01b8e20e6cdfb7a3e0e98f04488af110d00abc23efc24793f6a92be5189d0ced82a4e95877d9fbd5f175678ac4af172fd0531989d0d53a70d2225f6a0c164fef87a4cdb7d32a46a1e7ea9da0397f60714263f5a56e4c1d86e12c21236aeaa505deeed6c154b5731b3c195cee78f8515f304dd04cef3eeda055eaa2ddbbec9ba408f7b1fea78537a06c5706ca51531cbaf754e7a8000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012b0300b6db3d812ee19dd7cc8719ed7b45d8d5ff939e008aee0f2b9fcf98571d020139076b872d42a32bfc77c2f5ce8686bf63d709bed64651f2342748f6a300281c6c6e92b3c4fd26fddcbb65fb62f91107e91987c4c4bff1c6cb6ed708fec3390000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a84b8ffc12006bff880cc31abb10363ee9f217f5bb27a21594c4de43a0dc9c0820f12a75e10a69dfa0e18c05756fbfb04cf10d5f2fdb2a3fdee9c4fefb710f9bc177a109b126cf35aa310dd791cc8da0a5844b3269b6608096c4dc0667cd2a14834f227f226c100bca4caf95e99958bff79024d3485eb8e17d302a4b81bdbcb97776d96bef6bc0378379ec713426f8f1aea75bc5d0eb37d92aa08596249b168dbe1a88058ccd10e6ec7277a1cc891d40e2b0024594d57813897abd56924b1fbfc26ca594f9c0c8c1e91acec04a1aa778b0b348c46e1964ae747c6a23c57cdb8c80dfe59c7ec357ec60bbab6126f1a11e3a1d6f5874d2b722ad7930c964a3ddbb7a88d77bfd12507e0ea33d9aff1c9b9d00b2d9d10ccdfcdc5b88c052325748481d560b9c6e1919fdd31e412fd74d20b24511350937d9068977623e8ff3b8a0e1b8415664780b9a7fcec97453ebe5404306efefe04848070df2f1a25eadd07556ef9285a50c4c6d1236c383e5a4e496ba35d92d2ab10fe01f77c0406f8c81aac12706dd9ad112470ac64b01fa498f9520a66f5d080644900a4a70ce91381ecba01682bc4aa4f4b045cc0085e388a41388bc0b767cf3bcd16d3a535b9304d90589bd8b108fe119472eb18101d074e690f9b733df1c48ce738ea8caadf6ceb52e000002280000022400000220181b9fa635423823b6660a3dcce7547bffdb58530e18eab4fe32f9289d53893900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000982aac865d21d8afd4c0c843d7d5b32dbff2262a4e1897af8b0f8483c069862ebb47f113d390424bd240d4b7e558e6ddc9262042aced8c0ba9505318416f60eabbdd416f0aa7d97930ffe34007f3b1c8da2e80f61d7b0659066e9d8471a3dee982db1de467305be752ae2c25932accacac074c011d19a7b4199e1de09f3886ff18d743eea17507011131d860a4ee4c0b3e3cb73501a2a556d95f2b773d797ed76f3e2094898c1edd4be226e9fb7f6726af3bb337e751590b2243e74496bfcb741d1de3577e4442533f13fd889dcbd46bd5f33c1fbc8d572659e910d9ca7e0ec457c4f1ea7acef3b39baab882dfffc63ce42a5fb3735e89ae8be205f3cb8e0c0fa517aa9e07c98c3ab09e30e8c2d65d08ca313a25c5f293b16a3667a229361a6e841a4b75d909e6108c1b98ee1449530a292144b03ed3930136206a7c26ef3ac13fc2832702b94426d99bc409878403dd5c437d7a3272467247f3230c2bbe5d8df9580a8d133f3ffc88d7bcf030cdfd69f7207bc849fdf04869e8286941350328bf648d30c95dd93028e38c1a0a3547fd35a9251df53b85aca557064e882d7110a2770359eeadba494a56f59313c32531ce15cec53e306b2b254b5808a90aa626000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022d00de488b43c7684252eb4818788cf67e0fa0469023e4bc60ae06adefd6ecca11d1ed1fa842d216938b57db46c360620e6a90d1ff0ba1308f9063ff5d302f430202287518138967350c9f12004b4bef6003c390a02771510bff7b7619ba9ae4832c40f30e7b465870ca1f6b85144e02b9cdd2c53196b4efeb02391cacc42533830000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002db2131b41bfb2eb1ff085ec00281903928537365719c277db37392431aad386646624b8824b5fe5940c8e4ef29d71637b33e78ab16295dc9f5bf1f71f061cd4235f6dc0b901770e05023eec057437322c68c8ec0f7174fda5d77b2f63f6342aaa53cb0bf964cd4c9eaa320a00b2bb903a09341ef00e8d08fac60f5bff0ccc620d5fa04d0e58d562f576024a592f91a349c5b1e25798b32c6cf3084dc5c9bbee1a88aef6aafdc18efcd596adc0920c20abd6899c965604cd38ae302d618c753c109a68f26416fa74bf703f858ea06c981d5672a4bfe418594423639a721a50664f9693185f1135480be92f1ca0e9fea734bc19c2eb3275ca71517a938ed206307d195267716c064c9bf295d9c52a871c8b54983e4439275688fd95a83218ede238cff57127436a85d90e0f7dbf63e8dd5220ca403cb5a72e1140a9a45c79a645c1e3bb7e67206f533f4343e918093a7d3879a980eb5e29bc57701e5ae60e9ceff70ae5dd3d568e1db5ac0815fdd26eaac28c9f569a987ff28df5ab434489633385d991a56772692cfad90de3da59100e37490ff203689caedf22ecdbcaebd257f31e7b7dc328f9b35538b6bb4087679be715913f49d46f71bdce6be6f23b94a4050741610cae664280427788ad302f9c03087d4fee01f4d0aeaa71f16d47fa990000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002fdee8fcc7a7219e3593d621a5f9925a367199145ced486541e055b81aee0047396e78f8397b9b5b593b5944efb8a177736a79d8bdc65c2d9d37f22d1ff9539b4e6fc2a3cfc46ff034d06b5ccda29b14d7203421d6d90cced7acdd87af437ff60f87863638cadb3c053286863a9eb0821bf2a3e110e06fad7a88ff9fd1c4814e5d8d3473b60b4af789cb070885010a82499d1174c8dbc45779c4144f345fe69eda19c6a1caa1db48e1ed0fd71cfe6fc6a0c0450b35d6df57b9e5b1739f5a871c34dad519ef25fe8f6bdb789c944415b3a456d5316840ed02eab62eb6800da3faccaad1e4992c00cca4a3311a878f7bcc7fe6e86d276bf5b1dcf20ad0dc54ef01a081e4a00847514301bc1d006a224615b0160570d482f9f6a60a55458111421f5630d1bca7f4a4bb3caa67ea5846514f1960c36b0633eab6ec64ea7953fcc56e2378e095d10d5edccdbb7f18df7ebbde33e6ed1a4af9e5b05973337cdcac60a5b5975d4ce73fa5895d116b10d540bbe06519c7480a61e496bc920a03b1e9ac07fa53954a0ba69439ecd9c6e9942179fbf399f9628c03cdb6cc131c3466eba96f6c763272ae1a6a5edb174dd960ed36aaf4a151a850d021b77a92e6caebf03f41b6ec8219a8217e41ad549fab40ea46bd95cdd4d02189b6469729de94b34239d1000002280000022400000220153f80e42fb5d0ba37d564df4dd789a845d70182949850a41acdad7051e73ce700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000986881bdb26e1119c8c4e00098a333975e404aa3c4971839c7afbf0d231eeeebda4996ddde3725e86b6ec02c770813c8e4d9599a85e05de515f190296a17c2f873322cbf6cd24b9d58fe33f2a897f3fa8472b1ea4266503a8924cdf2c762ace16e9f47092e7ca8826135158cd966cce2f82869703c7966785f983243b41ac992da1b711bc7c3e07c8f743ba7e8f4db8a366eea9ec6167f3a12d855a4020e9aa014b66f62c70403c3afd3886363d28fcaf72bdc369ef2fdd129bf11a012704c3e900802c92bc66f1667f9aad3ac79a099988f166a32e9a724ea323633f5cbbe39d408dd4d3b5b888f6bc07a9703f7908b8ee2b1081447da7eadf79ee3ede400a188819f7f6563767023a420123e50cff035f9f0d70b745663d5c3b809d06749464b5b4190426299813f99c3ce648a901f159e013121b00248b9b2333dc0406452dfe9444853159f6adb75adbcdf4d315cab8848fe0a810ea5d7819b566f66e9bf7ad83c4d4821e8c3894478a4998f740e5fb3166dee6a99b7e3c796ff148d3657e810951d867ea8cfac7f5505d69d25946682fb02adde581cec18a08dd24fc43b2d957e338ebf82477b0e2e1af5e2eaa1487b83b3070974e68084d9bf276912fc000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012053deff4145017abc2ec15ef117040caf592b18e29479bfcf658b5804e6487402024a0d83b00d6c67c6f271e42390c94633b2c8ba849f506225a177d808931bf91eac23347ec16c6b0e63e00868d2c95f6ecbe65632cf4c1a13bff888097bad4e00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000129dafd862690a8c8f892f9e89cd6cab0e37041032309486e7c55a58e16bdfc426268af6bc7e3e77a96eab1f308f3ce8959bc86306fb0439adbc4adf8931c20aba92a12ef038eb288ff4828a158081a374b289d877477ef9e9d0502d71e8b71bfdd7896919befa14c9c246757217a6d128a00a11b41c08e4bfe9ab9003e498b7716fa7771cdfd55f1f8a1304f23c3dcd1439c3add62578c06def212691aba0e5d02dd96ee45195079d01078346d368bfec624a3e0d4a98f7ee32ba08f196ae6e38f82fb8f02c44ef28b77309a2f76be1488f6069486bcf68d3fa5015c9c25f2717439a55dc3c94a0689caab7a1a192c2d25520be0c6dc5d2c21071f671be4fbf4469bd914c834637bd9b824ce6cfa25b7fdaf26f896850ca63d7ba1f1465572242ea1d640ef586382280fc2298bbf5ce3c8dcfc1fc71cd39f8f713eeae7900d5e2ba7f9282db5da40869e916e1c85a10fb7e00505617dac15705afe97455c0e3167fa1c093a59de4cc9889ad9e9dc872b358b8ff6e7fe6ac2a1f979825a93f006327a6f7bdf5ccc81057b561b7d418e0a576cdb58ac6a7a254753239573cadd5f6f2e2e840ff86c3389420552cdbd92b14708343af938ebc4b37b12e2e46b1c3a46f5f912ff0087e91fcf9e43c4478e0b3c24188275f64b173927176b6d21e9e0000022800000224000002202fd513c10a98e2984031cbe63693be1272d9b2c89bd5520829c0b133be884a8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000285b94b3c8144f3b654e70d8741fad5670d3342fa4d891c6f9d0b0f16991e78f7aa262899af7569a9fffa9000425c6c599b61548dbd64fc3b0cd9037d184b0cc2be170ab00a81a0f40699ac5695a3972c74d4cb1ea455097fcd130b86f506d273b3c2cbd1b827d349d0591534f043628fef3e74436c61ffdecb0040466360a4a292d9abc944cd4f7c952ad1c6579639963770d22fb3b0a388d85b0e573a80caa33cba0f99f3b96655facf009603c7805bd1725c91ce8c35bd27072321796f5cdf76066d254a69cf92fbc42e1c51e17d969a25e4345e9b1f256d3762444cae996b189993a31581020fc9e51a5fd73c958f847b4f836eb900480501ba22fc7110f77d45e524554e7f1f1c9093c9158cad7a433c14bd53b744e99def46be377d85c1344c681fcdc04d60c75f6299e64bd5c76b792ea9c33286908f4185748513fb7f4aaebdbac8391060b38ac328eab14f7d4eabd65bc3d226ff2462218a23e8939e9cc5da407f89143d1b6440c0e4265b3fffdee0c5fddc5b22409cd042f647b31383b9d9494d6418687e1f248b0d5ac4fafaf53f6a6f8f5ef2f6b53a79950df8a899b40cc37fac8d98d6bd19dabfc2832f5bb2dad04e24bafb1b0800f78472ddc000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802125a916ae61d088b00143edeb5836ae4ab741d57a039dddbc5a1ffb88237d54b01430c47ea63b6b9dc16dfd88868f5d45fd3c6ca5df7ffea53a1514e8b3dba710203d3016e6c7b5aced73947211eb2e4892804cf3867cb1b937d10751a4e740acf1800bcd61431d92f133a25a901117cd1ff66f1fa95be74593aead2f405d255570000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015150e0480bc6fd1d7605114551c199ce6caefba211cdd9f8bcdb0a1b08a3cd57795b2a26019e05a92ffe0e7a32ae93d9dd88b80463941edb78f41c7cd1bcaa08d3c213212c2b277a528f9e2f788d86ef6ae173ab29574696821be6f6f56e517a58254cca612bc0ad8280e4d2e32b9ac4182780edcccb26ca886988705232f3d5d3da6ebab9093d844ac22987ab25d3de84d0de9b85ef329d9c46d670059feb8bbd36cb08531e447beddf9d3dabacec7d24bd4ab9cbe19a9c2c6097717e991aceddcc072b13eaf5a90f0fbcf006e6b40637363dfcd5ec902365ab8a4aa870a15fc42387fdd05f01f0b153bc9260fbb1cd18e75426b4bcbe0675675ca2b4ad3d840b78bd8241c86f1177d601b841e6441124b1e1458341f6b3956d2c088c7df5ba6123fcf341c769ee167248c0a44268aadc7ab0ab52b4a9d71ad8593804696d4ce51854030aa32cd292371875c38741a151c35758817f19da8a7acda60034db5c50edb68b572b74a00be3977a30f0609cbd38eabeedd9c357e62f9af315961910fb850450879b1266262a0c77eecd9c73433a60f5ae2133f1bd07671963e0c779a9f74b4238f6210949fb7feb048182d0f97f1139bd5077cb7775e2f9e93543c6baed83efbbc43e1fc4712c197385ddfa0c9bffb745d783f2dc3179a11e3f68f000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adf5ea2629be207f5eeeb4295553a4e6cf0278a8edbd58a51b14da85a1ff78ca4bd4cc2a0505e5893e2c3f935dc22b41c3a4559e84dbc831db52ff4430125626e4dfc66c90e3108a4f078a972eae07b681e396aa6421d611cafdbf80273733202568efed2015a70adda6d28b79c8a94ea4a6b8f1f500e7458ace24ff8da29e06104348253564e334549a368d038633b0b6f96387cdbaac587ccf4a8d2a138af7986c9d153719d87d9591aa50bb264038c844aef5605557dd7736401ddfac07f052e14de5bc69fb920bf63a445d40d4a88cac29f98e8b149562a792c4e643084a9092db2cec05b2b18764cb9ffcbb6a32220174c232f6612649cc5788ff3803fc7d27e01a52c04234555cbf7d5fb5e068914e20f3c21bcde9c0f618dad2b40de5ac6dfbe1bda6867ecb6a2cd2d56f41eb5343a715b1b2b59bc106b8952cc2526e901d7426a1d14019c9041731e50e0c06b1fbf41cfd05aa96bfc723e581c564261fe3f1b3c51bc251301952bf807e0aed1f98bd84563b64c4b9ee313edca4e19dac4bba3205afd7d257d9b00a10ed833d1579d579249880123856a0ded6fed918e165c4aa56e99aa0cd0c98a10f34ad9c6b6bd13d2f2a565d1d73eefffa7451abe92602739988b99a49e96fed147015c4600f9274503a961f32c722bad369de95000002280000022400000220256f7a8a2650c6b4655d18d407d9a6b3aa72fc0eb49b30dde3c3f9962cfaf2620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019f9e0ff536fcc43ed703a7c0c917ec7e37bf2bdd7ecd8ec1610bd5777f78b8ae2542ecd9b4c6eaae493ed38494a947cfe680d5bf6b1c24bfd33f31b356d2818c261f90a238ebdd68fe873c3b25206247dc2698c2272d43de1c482159c2fd042bcffa7dd4684b7455ae909757e33d029b40479025db0d1eb3667417efd1b1de93dd36994ebb9b172ac41d514de563ddf1c3b7a5e77285c9aadeaf6ebc554a2fde614df3023f4b73dcc4c7ba9751778cedd5705f1d9048b7f0c841d352176b7a9cf29412520942855238660812a8a214387b9dd67f8af1c819c386adab752ff0591c8a3fe27d69e18b834342979cb472bed49f7c41feb89a3ecb28cb56755058894ea67dc11fc0c38a4a203c48d45018f09c388baf2c201ff246d4a8e162e43ed2775e02d697ffdbee4715240860b41e30823424badc135d94bacefff16b76784b51e878355bcabb119671be912c469e48c0dfdb3c4b8cc29a40ce048260527cb18c319f99f70e6b627025a84443d8dd3ba4d8087ad3f0f968b5d8c48cfb7667b2512908818c55a07b217edc52511d00f2ed6720a4a1b28351082312a71e9b3f60da72da583203022e95aa24f0e38903962372e6af27b81e101118f05d3c5adfe000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80212dc0e5dad480d62e5501b8eb246bc0962d9c9c9e5dfc9160f01d7e51beeade31e2b8573f060b50a9bc89166246b919bf20ff66f3235eb4e3a61e242b634639f0203d7c865f6d1f873af8bef8f3f7187bebcfa39dbe8ed1091bfb065f699060ac8047bb135c264320973987dd2b51d7c6f32d15a69221b077eb1caa10938e7da6a0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002715c8a3f68af977745642ec2c5fdc992955ffd38696999254fe94d162b38263b8d8780f7dafddeaa2504f1cc7fb6fa28eeb15e1dbccfc6169c2c4d57d1d4f8a03c30e3f1b9df06db05f1183b88b380e7a6ab0de3ab14ba2f03a104cc254af7a81f902e122c6f1f7814ddec563064a451add58ccf7e18e864e69f7b5cfc0f4aacdce9f0d6b72a809802b0216bcd2460e9e0296780fc866317e959515d3ae1f1e8ecd8ea65537bf59251078729244ccbb599e6307682fb954322e954261037a0a969d71b54b76f6091cf4580fb61f911f39805dbfb35709011050faf9df874467c9218b0a50ea0edaaca10be9552fe1a7e80cd47920ed3629fbf8111f0fd4ad8102a5a23bbe957e4b94cb12004647741be84a2db55993fcc3c166baf72e627134373e40188ac00793564391756ccda4147e1e32dab6a6f25ab47cc743ef8253ed5cad1a4ddaa032a04bbee9b7a3a879e6179589c1d060f209c2aa6e9cb072f698063f9e6455ead2b7a65be01976c1e51268427e1330dab368bf6de45cfab1daf380445af9fe9b4f623f454db2fb65e37b6381c62724f48d0d7059e858d0d4a36770021ae8a22d2795b0dd512e427d7e2b71c81bbb52b7ced3323452612a105f461568029b242c0933513f64240c55a1c67059479f4121312bb08cead67fd5166a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000afb9201f785a63caed8636307538d8676d15be6fb005b179ddc6d0b5e0703825a863fee346eee1e5f132c11889bd548519c7e1e1ffacf65f54b250e2ab31d49e29a7fe91deee30dbfbe57e4cb86640be637a26277ef1974f62a739591738cfc248279085d0fba8723d02413bf9761378f421a95c3a4a81a4869e30e5b65559bc4dec52b44eb489d49059c7f06e2a3314ae5c44ce9d2ebdd4a6aa1ad7c6bbd860f9c4e7a8f7a35f77ec4594271382bbea1c7a980ef71009cdaeeab025c5c369ff4880024bd3f99500011166bc61288bc8dad64732bd5709ef35b64983cb72261080c4d1cff0af8091ca52940a73acf77379e833dc70aea1048a3da8d019be9aef8e0c6b3a08d8e85b4d757b139ca93fac09c53cf9b3f2f8dd678cf1ca3f6a5838ac6ab3a430ce10b7ded1e33dca5818f729b49f6cd8965b61793ea428010d61de8f10443dee6c973533b7033f8a77adf17d9b992874653ebcad85bd5b571c750d55c7e7cbe5c89cf297095021ffdb7982d5d9a21b5a6702e8cd8f63513eccdf3834d93885f293c92d9976ed3a392beb8b0970dd94305c7329c8332b0104307cb304f4c99b5e1654257912e85c499060f57032fd6b9c315ac3ac1838a838bd2f30e964ce8c8fbf0044106b4a299155e2ae55852101857db14f825273dae3fe09f700000228000002240000022000432998ee36c3fff45caab7be4bb51ebcfc792189b80fabaf5ffa786f05df6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad34aa3e53c3ad9ac9ccb9ad1b64be2fae6b74182e72f14b1432bdd730ed3e9de9b2c9f44846992edcf53c11ec8ffd2fc10b5f16304a76182a897967ec736d9970ed00940ad91f562f33437320fe6b54281bfb583ac1fe12b9ac099a3ea40f84214e54736dde4b74565deea94e5e9eba5dea183d17980fec689701bafdb4854f53ac2dbee3dcef08f7913c488ed41111def39570c7d9550c14e37c7a0593a2a14e83404cb868510392758e38efde6411f9c94ea9c226a62a0439b52f7315a5d919fbd27f4ad035c1c616643134dbc0b15f119e635582eacddf30452ebe37912a5b36e35427d9975b501b894e4f37f658ff8a802c3d74d9f40c0b7a723f988a4d64cdf0c9fa68b1906765802519881e3bd52863362e0ad5b9bf04aba47a7aa2ce3973414f2259bc496252b5086b445c267dfc42a692eaaff00558c82d06b475c0fa6e6e40f93bebb77818b65ed4a77fa78f4d983f51d1c6e10f2761d1e5d2509389b52da97856315798cfb2c2df26c7d06ad8af306a9c6e21ef6a9fce9f1cec619f3081607909f2ca407586fbf4a765c1993a22b0e2ec3b3c3ef96549ca0425a7a679e09eb3173ca1cbfd15c2b4a14b47c406949f48d6eda255eb371221a81d10000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80225ae9ec0dba73a0731c82475a3b23df6fb0b455c71fffc0e7917c3f5a756c2781c39aaad190f8e229fa401ad9f28308f5bddf621dd2ffa93df3ef29f6d835842020506f71300ce4d1e8ed4e95d9524c57277e3c9fa8fa4298e9d863b1db9f06a81264974cfd4825e62d4d5dd19d1dfd3438203839558d064bd829fbff41e0fb81c0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000925ff88619b0e82387a1a953240cdf9cbeb99dad33e3ba51e0ff9e163c14a0ec53c629b3bf71097141cb4a1af71e9859a27ee13230578d65058a39b0e6de3d1ebbdfbf2e793518d6e0b34a921030f91d3efeaff969883c2f044d4dca2e05d649f4c5a2de6867c73b5c2e54077a2e374f8861223dc532681665d089c3c159472c6325e84a74d98a1be2c6fcbd152049dc60bedf433e6accf1d7019e816602314d3c5cd49bf1e3e4582d4b36fe03a6ac40026989f724b472259e4980ef3585a46b991f95ada975ceeb559ae8c086d8c5bc04cc2ce9503ab452f6a442931ce6e9e23eac9fbcc85ecc28e273408abf15d291a08d050a3090e4049fa8f240b2e587c8d9ea6198e1d97864a03411e36a90e996169eaf429c06e311197b1dfd8a1c1f5c049d8f185129a575c30af6ef0541d5407679b2d52f5a014549c17756ac876040f3d68de6cc732db6fdeabd2764fc0fc4ca1152ab30cc0a1a455836566295cca3f9544b36f6d579fcc17591694c26229769d4df81f91fce73fc5e08183eb2b84538aae3cc3c0d72083977b17dcf0dc08495d5e0b787c28704350b92590c7c2a1ca96a5478d50285f992ceea7de7f5ba1abd859bb51cdb0beb4cb9d2c09032d1979b5990e9172a9bb25680e5b1a6bb688000b95e13b163a0992a9b70d4469f2ce1000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068d55157208df339261401d2701f5552cdd65e68abf5bff06d05791507d5a766e54d37118e1cb3fff30837efbfb715cb201b2928f5b2bf8ad5408fc10327a839c33c0ec0d92dd1214b751964ca8dd3d9519650749833f511b25c54b23c14692b51a0dc5b85a5adcb33deba3abc512fc3567a4c0a189567878fb5577fd733a49f1f1eeda8befe02a43f8cc95cbd740246b06daa51744fb0810869e0ba710c7eb65659bae20d74b05340b94b2fac2a34a3168e5c61da2f4e4548143a0cdf8f0821f4dcffacd1b4826d93a9b97f7f9e05259def37e5982f31edd995ded4b6749ab1fd7215f06a4c0c1b25a497556dce72b90ff40ea1efbb64bc3313e17a7e396723da1d2e680df6da8ec6a9035711f4a5460800d28cf14ad4e6aba8cacd35c99033978f157caced618f8839a9e6a42141b58447bdec905c82e08bcda6fdd36f47c51c18d178d18f21306d59f255a3af4253675ad7139f5eb41a7559b7ffdb74718bfe6ff2d422fcabda42eb8af8307df32c851e647a67521932eda1a9b9d5db6e8cafd18a216f538693da8abbda0d106670d5ebaf47dc618a81ff638665f16bf343ec26039df1fc9af8b2190fb0314b6843a8da27c41999623c05d724b510db8424b20cd4a2a8023da4651787873dc377755a88270355c7bd38041ac474c0eaf04000002280000022400000220001ae1f00dc5af7d3f180d08f20aaa1356c33c9290ad59f17dd0ff99a69d33c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a552549f70e40203c076c0690ac332ba574f121466540df244ccfb6c9cf4ab11c1144bc03c35b32430a2ea08118d601d2229925f3d20d64f73520203201778503c790bb2c3ec856f5dfc30dbbbeb682ab56b35ac3cec89db0aa973c86231f0b6d5bb9deb3189eb370693f8424f9cbbde4490d1882aa2b2761242af6efd02d033c1ab806b864869542fed878b781fbaaaf0c6ab9fd228874bae1faab7b3137dd0ae3924a101c04698a82beecb889511021a26219b3b361a5590d0c73d767e910430e43854d41bbde8749ed66a468b5b41fb982f3702ce5aeb8a18008408bd98f1e28b9db9b944c8e2071f2cd657be8419116545921365c1f122b7e84335ea072d61720069ea1af3084d7815dabf16247242199035cf4c0cb519ccd3574da8c86d6d621db87c5a87719692cfa72b50724ea00cab9ced99ec5ab47e4a1eaf11f814eb3e0f48e22f58198ca1e429486b2312418e1b09e9f476e597228e88dcd98878bc606cd96b13ea928a16fd052d0c8f6d80f3a3d4d8110539717674972a1a04ecc2fc3da749a3cc1ccc6250dffd6d1ed4d7efd555dafccb3ce7429474ae064e5e2b220dc5cec9a270888bd84166cbda997093da0999ed1fdd658e9682fe4ca2c000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020c80062e58b7ddbfd578af49e13168a0e631097457a9ea94865804b30c7b052d2d97400fed5bb74b656c244620fde8ff476f90422832cbb3c8f4da5f3585ad0702052ac8969c492cbd11e8b2ae92447ddc210098701fbf1ae2cbc0be9bd96303b61ae93620aeadd2f105de4335c1255443c51cf4549bf16140c52340b7200e349d0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1fe6f0da1e7363ab64ac4911d48b36d2b5d7cde9479e53e632beb13fbea5141409b2200e1b6213cdb23e7db3dda468b39bfa61ae11bd50f01163991bba9765040a8474053a134c874ae27ce10774f401f115f2bc25ac301a64ca6bbee0be18a9a402cbcca24c1b3c83203eda67a408978a2cf9aefbf46b145f39ebaaf8915599dab3869ad066ced715c84f0c48bc636bbd51364a5f640a138078db8726111b9539e5689c7a8cbde582b0324ea0199c4569c065f74eee5e413f61f5dd8c29bfcad3ef757e66c62839cf6b24f659bb5080ac63c07452003fdbe721c5919539dd2d578fd20b8280307115feccd66ff3a4e94f0c969a444868a4eec2304f5d80e063b790f598e4ff87c04861d009b8c2126a1d77a40184266454dde8e3a35f8672edc2a4756a2ec224b1e77850288976fb8cd230929b9df087aee8a573c476f8734161b958ac5b391fc57875e3bc75fb03aad99a95e971aa02d03437bf5dbc66e3daa1ed56680272d62fa1275d434b33fc174b50d68a19487354086a6ca06f05fe82a09af0ab1c32eec1e6645f70a00accaa6b4415a474a0a85469fa12837f6608cde9e8755bfaa4480562cfce3856acd2f21cf8952280f0e1e18b89609f6769dc87776c189873c9b870c5b8f11862b6ab5a0d4a19f30c81a0c6ff09d37537a9ff10000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f96232199a71d9c237cb93a26da852a5213314fc63bc8da2e604f226e5671f7c2cd780345dfd598b274b3f8331bf2146049989354bf160e00d13f9156ff0629f5b18809c4fd261fae49ff3d46b7fc67a245436e647a7b2117b331d0c3f260b96c583f2699f3b5c77945f8bfa21d9440e98d1690cc5aafb9a7aedfd46a95ea71f42588612c6878951d7384ffcd75472829dda5eb6c9177d4fef6f955efc4e25430c75cfb55aaa7e1649100fc7e20b172a2eedfa991287b01b8d7f9a61959a765fcd27b788158765f6c1da9d9a6881ad54cc2316e941d001dcaad4cb17b0f644a5d80ba49f43320a459495c2d453ee99837d30bc20ca29e1a133787104cadefb8439d27f1499707c1dc004b4fc6b3e4755c785d52dae71e33f058244f42f929319754b6927f166048a2529a222caf63941172781950be1b855c5faa926a5fb15c9eaaeef21ff101530386c08474edcfe74d269561c0584d136804add82b3d48248a75ed4ab089d50c36f9848374bad2402e259cdc8e7b434b45290d52dddbe652623b446035ebd8c42d219f376dae9d0bbe81489846ddeeaa8f07830938d54f74cc61afd7ae49fe0cac4bea756957ea2cdb26769e9b9c93e39d3a30e3ef56dc89c55f2cda452c5d76ddf556b58e13aa31caa9def5eac63256291539268966268c0000022800000224000002201772cda8862e1b59f61bff6cfbb94bf9880af35e05a102217d11815d7bf3c44a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023ec51e82d640a01adea777462a0a958c1de17f4151404f1dbc838984581c161851fad30452bef21d9b15c7f6ef8f3dc8f28e745c88063d540f2a5462bce0a1c3bf6e943d0d703fcedf6ff5b16de719c6544c9cdf37dc90e3e859267cb0bc94f1b2aeffbe817e413c8a5dec96f876861e3678ef2ed6d2a99085cc52b0cce8c6ceef83d3ea55cd87f605fa9e5348a40468c8a9bba6815855ca84ed1d255170482619c1a6659769d3237955f37762dc98c1f009c5ae4f75b053a89de67b1d36f1c3dd01f88bf8f90d5d138b39cda8bcacfa417e07a702fc8f3aa746ca0001398d1ed2022e6d5e11768d350ba04dec080fd198843a014a113dfb302e06682682325bf030f1eded915ab586bda7436d470726f550b671cf393f8f8d039954714a8d46d01a582f3decdd1ae1df9e81017a24e90945e136b5e951d88859b3971bc279447b0a7cc3712608f6f5aa510c06a16fda3534366d0ecb31a977632b49ea500300a906abb152eef13c18afc650702d5ee26359d41f8e3be545ac05897a73819b1cf03618a2492dc75292cf2c832c281cb880ca011c69219eb530c7db3757f7f22da6f55cf6012d13c338d76b6874ceac88bd9e80d45758c1a8616102daef6ea90000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40119969c270ab6b3a78803c50fd6b3cadb81e9d4e5b228899160c013e5b8a422d20206e091dcf3112aa15a08afa8d64b05ef32a2db04ed6008b1f88cc15fd71cb5412777da2b94dba258462111102084aa4189127e5c668757c6c36b364c0e0252c000000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3eca3a211b6c8f02bc5283d4a8fa074f6a909bfff0a34e765c0ae7e1e52e90bac13ef00c463a4024f234cce50b872d19e56074e1d32ac8115a33bbc09973758a32dcc1e22548d5b0fd906818a78013bb0d6b9dfd0ef95a72500c63a2fb94d960715a927bdc1bac9baf394872aeb819472ce11b0d774fc34b43152f75a9f54d6030687f2b044ad7916d9f133171bcf2fd81d5ef509dde59ae43881b2e7a541111cacaf03b6a99d5d5848c4925da7dfbbca8411f996e7ff92667d809784ad782e92a9b658b6b5c9ae40b3be71517a6083ac212e16e0de9229179ec4b7e07586ca5bdb190976d5f745e85ab7c2f2e79dca94a693cf5cd481e7b212feceb683c859717554c099843fa51f30b9786b8abb59a8fd00b648f933876af42ee4f5829833c6a06ad8b2377382e0b84b5f461a94e52f087acd0f356bcc8f4636e0411df65373982be72252521216ce0e67d79d612e701b610f467ab6ff92d3035bc486f87a479ba8b19f15dd7b8623338c7376f2207e2a03b7c42e4061754c6eaa5a42ff42f09ae1d832db3b0bad3c18d2dc4420f19152bb5df2439db3fb85127bcc7b9b91237e4555bb88bd1b7b9f0310e8974b6760a85cbdc4a209ae6b37b31e3d92391610ec843ba8f50b961452c57a584b204092c583782120e8572f519e46c18a1ab800000228000002240000022019fb953395533e9059af89a543754c6ef38fb3abc7a29613386f4d3816ad3c56000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f9013958586d4fcc855f262f5df7fa00d65ca0c9da33691d04907e6216dc62f1e10af5491d89c54132557176efd81a70cb0eb31532c91492d37fd9b305a02262a6ed38fcdc33ec25317133727998f2c166b68bb69011fa62c833c36f239c61814318930d618a4f7d1e0b2d7d0ffb95390d6cef63a62b688f84943e6609cc1faf02e090fa46edd0d8717bd226132bfabffc7ff8b9e567197d3e2649e34afbcf54ba8ef00ef73e0ad1983b268fd502e2065052641dfa0fd783216293a4e66b2be54585ac08edfdb6607d2eaaa11a5f8f97b54c89cf6b294f2f066ed6c6f90ea08aab645cf3a33127b5ef109a5fab0d94cc108101218537557aeddf573aa40630359ef4e93d6e700bbc3547c7b2e24fe3c691f2ae72c650afeffb96b64060c552cf75d4afda49bcaf5dfb7b58125724e9e7e5ebafdce464189d825ec7017e9675b5d7be548f921039fb489edfd6806c97b93899fe01d703a16d798a802b9104cb134a8b846f879e45075e26058b1304f6c50a0f0bca49f30f678a2d396830af2e8ebe7c0ac9eb8ace6223cb414ab327ff22ce1898065658cdf38216096b8ae60da01b4bda5e9fa6a33a24abab2bb307882e961a049963a61cd7bde4b07ab123da8000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802114dedb5fb3de98655ec3f11b20c67fe3abb010e062a5a38caf616eb464516df03c0c869bf14a85e160e32085e8ec089fb353e95ae3f14c36d6249bbcbd2feda0209369263e74e70d2e88d98569ad3ef5ca80e0d830f8f6362e06e165b06e6763a16af49cfa08c13296dcb8b2eef6871b62b32d7bb8ecf676de5ed28ff2f9b47610000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b928ab90ea3f2c9a9c3774e5a1c4704d4d7be4ac12ede44f527e0b9efe44ad3ecb9a0279ccffb911160855f05f4ebd4d67ecb876c8feadda35f2947afc0d16ee2013f6970977b321c164ea9c12cebf01e79636d892cb2e0806b49fb076382778623f5a1e7e23128b713cd642cd3b5371b2cfcb7799dfe5e87452ea0eabc83a2cb0a8d2eeff2bedddb5355a850b935a2da628d5b927c2d31672c07aee167ae33eb6025a8dd31002f51404bda5495b85cb3f298dc75dc78d50003b3cbca6c66aecde87034954096ae3f9162d019c2ce24f61d5946714f3f7783571545d8595b51bcade3ab2802426a53e2f382f5d926908b7da865dee27a8193d3f965efed6575ab18d1d70da2bb58924bea46777b7c5a7ea966d5e1c456f033d47a590887241a5de4bb88d6a438da7ff4ef5f002115c36f066a70f7190bc4559beb0964ee94c872ac72208cdccba2b6ff5a7eba62d0026ee71cb962bb93e80683f4f43234dba6f41bbb7048cb8899982a92b9c43cd3baaa44092a8008ddba566e77a7892e008682b31f69a7a72b2856fa0d18e078ff3b0e018e520a5937480feebcfe7c9cea29eab9da73e1f70ea3ba0731b2df807ca6da28db59dba79469a7c9cbe1a45154176a35a328cb44e36f9c7aafed1674173fe8159c21d2b62a4889a205991cb2debc00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098a1a0ef2080d3fbb6c298a36d9630cce4e5f61e8066e4c48bd06c12d951f2e5728a9c504f08f25de478da33126967d100116baa07aa0c20d4b774a85b7b11d01d13bbb3af8023c00c42cdd13817fc9947d4501fd03ee628c8dc464f0498bda6476f6d2803eea46196cb457f8479afc8effbb35be0272da0d6b603ad2009c2e2be2d0f8e4f0553f1bbe53a1eb32a8582c997f4f5feb44ff182b29f1d136325508c6558fae5868ef038c943e8daf39271d3a3a60f60353566685314a89b029d8e54b52d7dacca28051a13a960674ae534ee82530861229ba238d016c87b8a455b350bd57ca810a758bbd79dc2b8f2394962c79cbe091532e00cd8326edcf48adde4c7bf47a0d24614a1d352328eccf33908d08cbf565360fbe8a6d9df43bfb042b6352421f7b6ddd1047b703a4abcb84fb805298a4bd9a741b39558b61804d301998cd0e217b14dbfe94a3fa9568ce3f40c8915d684115e925f87483abc6126be07057660d0be799270dcd53fc37c5257955f679ed9dd7b9bbc9a00938777b38d9bab6cbd02752def3d926a25b504b04eeb026fd55682f189287a6cb286308b552a3ff0da4c7b2e2959a5c7a5ac91bb2fe2ae849c22cf27c59d2348209134a871b47c01e8b3b9244c7f195dc870c1e8050821072cd604ef17cc1784501dca0f980000022800000224000002202109d8ffc818a43eb0550a3082217186676d8befabebdbd9523d2d2bfb9603890000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085e2e2740b1dbb8724f47a821ae6231b5290fdd15bbc6b617c5a5887b3efdf8a7177306617699680171a31aad5f0cfcaea1f5f23a4cc78bf684161c85e741703c30b986f9cf2bd4702610d460d90815a0392630f430b019c245153186674cbad94211340819461c07e9abc0c07755e3d9d758d31a8085a3024affcb652e4d4c40d6158147dc6dc0f43f20e1c26e893b77422b120db6d23f1bd260ae15a8f38fc92acdf8f8c32ba5c3396d09529e4b6c4cb84ff9156937fa063d365ee0e039e9c880e44087669e75803cb101d47a1731f87fc0588d484a70bb6834ccbdd0bbf9f695a01713a0c2b9fa1d8d8a3f46460be4e090847a76cec56684e4a9a6c97e8e02b36b9511d49b25a43202c23e7821e29659bb88e32ed67d032ec0271670a94f301b97cdf0eb603c80de4937dd4104bf5ab1e5ed55dbc238f4a1bf520f137e7b3d915357511332280f16a9018939c651053d6ea8bea776ff00c55046e5384f8c2fd36bac4b6bda48df214485ff3273f42a9d1bca84300bf86cfbf68b0d7f2f59a696a569e893cca304548e247283d5b089181d80ee913ce724f1243ea0180dc7f1c48db96d94d4fbd02dc14220f829abe90826ac19a1bc94b53725caf3e28d216000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401056f934d7114b2f0f2e75720fe795ac43140b188882e6c906434dca2918c6b8a0209ccd2a5fdd8bd84dacf02a663da21de1a446845514c90b89d9e6e9af5059aac1b42302a0e7d573f78d14aafa537a8c33431828705cbfdef27740f7c281c649a00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af1774a14e2079a072bcea885523a73fbb9aa2cd61963f68074f645f8bbc5ed4c1ac6b5a7d2fd9b5ebcb496249ac7c0e602316f787b8f94e49ed58109a5bc26a7ec3bea230b10218e31730b664852b6f0e919acab466851375700513b585a8d7806b3d3cc0a4aeee2d8b2fc89431d20263a3ed22c8d231a43c6d40b8a2f635d09129b04b3480bc2838fb7b2060e974435ab61d7f0c29002b213bd2cd8c01ad5a23a032112e9cd7d594bc59f270f36604a9c955528a2bf26841b3b160706e2914c152b66fa30f565775715da53ad0ae70246266939b25a75df3c2b69c9091ea59ccf7b5d7c705ec470cf8814988363b84da894e565cb70b45475355db90c9c6c86278af5c842975ccdd62cd8c653a58d96add2ff4b2fda740dbbb8027add82316539f097828baaebe1307b6e88b31142cad1707d9c260788ad86cb0469f8320c318f4b6a964b9ceef0412962a42471f5bd0334766758bff543f1f175f916f9355a3ea48b647b6d21f049f506fb0f59ddb4c841ab3d0ee77f9b17a157d386e46744508bdb51befb84da9cab5e2c72bc649c544dd8d663a981628de4e8c757c5fe95d70fe3784e5e85905c7a20a074df7b606316a29977328f03d0af50cfd393e24bf05f1e5d81661a4c5e478c7c45b7a2d29f06d1110a8ddebf83fbd00bcc17d9a0000022800000224000002200ca04ca9f555d3a0ee6caff47be1f5eee2fc0a7734e51ce98e994028c990972b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002004b6484ca47517a8fba2b67b1d8cbcecc317b3c640117da0c473a19efca97ae8ce817573f102994648bfbebd695cfaae0e9f1d06a1c691817090db03518313d97bbb874ca5543b3b590297372acd02659d1622a6f50a672d439e8f8bcf295f2d1669609dfca22309d86f46e1d5110a50d5757c9d493b6ab055d11e5a009373bf0904877006a0db2bc6a02194e23fcd43fe120ed993c18fe3e0177cbaea35133802124b260559fe02007047bea78f7a1dfcdabb3555b91889d4d54d2b1ed092d723f464638518c98cc4f36a040145cb13261735c390794f984aa5f5521d6e00442db45e9099743f6ce4588a4438fc2e92d8c11166022cea78fd597db5895446b1e35c65904e07dc7a84689dea6a471d427ceef38b244ed2a3c160bc9f8ebe9c9fde6e30a2aaa53f042c6c4bc54c46d87f1100cb221e65aa4d073b15de8038222e66580d344fa4b6cb85e0706c48a68e47672960f885f4002c7abb59a197c1cd3115f4033eb2d1d4a64a325edfe3d6a193a81b42572f525c0cc6788a867cf577d0d1276683b15665cca84b7e5947e4c5deceacfc8e04d8bca5a05ecf734f76b6d73916e0204b3713672b4a01d7c56cf7e625e57fddc0877092f3d7aa82f18c96000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40110cb1453abfa1632c8075e97e505eb4c485499f78037b5abd206aea1561c28b7020b4c169e6a9e8b29e1dd7c01d6eb79c9451150bfc24060e734a7bb9ff8a4c27b13cf499e3db12b5895d90d7f5a5631a943ec9c5066ec526bbc7691a5c7db473500000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061c2d2c9a4b2987676905529e3d2f5e9efe88989e252f1b696813e992d1363f78e24bb84c7104e2cb94c12b4cab7ec00eeb66d4e8c11fd7473a71ae9c04414bac1d91b4583a74d811d1520fc434677b68c7d454c8fae8112fc9d97fa44618a4e12542684e4c67094dcc5d679eb66782a84fc4e56818f33964ff9bbe0f3f25a3d0cd4e302413f4c0b5d651bf65b19f25cfc1d0f6ce76871ee24517d777f7f97c15f599a53a13560ac0ebf4a2c1bfc7c920b87391b9bef1c2436b9016f3e43552b59386d4376ab334a4dbf154ce780362df996d1ce0eb4f2914489b65cea3008d64bf1ff0ace5fb288a2f03c27c0c97bca865b1839bdac3615058ee0783605fe02d7a77b1ab2dacb50fbceab7cf9b48283051bffed752798525a519ebef0da321964887f03e8ced759c9eb78b5af7ed5f7b632dc7fb4655e812fee9e051395747c5e2688fc0bab86c4a7c3e097dc8bfa2fc089a5a00e8802a5df63de4123c33dd542d9c70268fbe8dedcb60e0424fd7e565dc2641fe8be0b66ff0b0de831b33615753db00dc80efbb6a43a6456b221043d19607f0e084622ea07321165e01a3c7d60286a8e736813584f6a63ce1148c91f8b972b0e0c70be1864c6dd47ac3d5d3fe33f8c6a8512f4a1abca7ac90c7eb129b875a0e58eedf15ff2160c86fc630df00000228000002240000022028739559f8001403984af50b7b5c099ec94e85b6320855fedd4c16a84bcbed1e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000838c6a4d85ccd55466b20711d3eb4897dd620b52dedfd0eed1dab7483973fc9622a9f11d114ec155cf54d5a85e9626f5069184a588fe92b08efbb416b5247880a8d5f9c559f18fad20993999d773ac5790cd40fdac014b69798151c952842732540669f4749dd3b84aac324ac5d47b8fa8dde7cff2c687392d0ae83b2196372d24a3c723680e140e415d6fd861f86792b44af29489f81d9b1e5659ef8b8a35a4ce42082d77346b2a71da381d8526723f99faeb4f03cee0ee217d523070c0651aed6acc0aa4b4307a194c03ef9da3d190656786cc2d277b4c5e4aaf003e766434c8fd3a7c2494b27c2f0e98d2519b400e9481732e31cb391c4be79e1cdf3b25a8b31c86a5439a90abd7d5f2016e3d6684da5bfc0245aae1d5dd1ff477d82b0777864b2ab2a50c794620add6c462e6aa2a728d96301c11e330c6ec97926c2e747b8c0f056b8f048722840d58ee0058f910121d787df23c5c03d673752a1005e81b7a6ff5a2d4d787bd9281c8b8d1f1d30ae2aefe98fc8b65e07f87c5f86be6c9b8757333b345540a3587f71a7236867789540f5a8b2a08c651978ec77dde3d8342a61245017c38ac7676025d0c02625849b036e28b93600ef16abc4bcdd688240b000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011b7bb3358e1c01e586984b97f29cb598e48999015adb5fd770659ed0a46ccd65020b5adf2203538116e999e16667bb422a96d08f4c1d2ee7f2f88dc74846992c8921ab528a86bc0eeea43532cc4b2034c1cbca7ff38532800d220a46498e453a3e0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086d9d5eedb320dc30510ba7b063cb7c4d99b2b717deb522ed344c74ea77119a84da51b7e58eb6c61e9e5f247c73c26c2a270836f88a43075e2911d7193cf4f5ac6ec1c0d63e14148528d163b24ee96f40fa06467749e9b0ccd24a97ba3b9dc176d106674197de7f723e9e3f91e8b20feade93b3320bc20789795721a0d5ff7fdb7a397c3b7263b1a4593a2903adcfc384db6a9aea105540faff47bc2138ef7d9317b332b5a0dfcde0be7a27602213b7435f04eee5c4c826aad1ecd0b176df0c67ce3bef7e4babfe1fcecd7b787f5545002c6cfdca3bc76b469f3e21de67e35cc9b608887c8c76a423b222c18c8d7025f4732dd1e550916460d6fc63d1940867459fc82f0e12e60c6ef07479d609274ff91f5911d40f9924d8839510add36012a66a055c7d73335c6202c1e80506f072c45a22839879cf85e23eef8a3455efce9dc52af3cbcf8661069aa57df7c1e51d12373420d336fa9f5b106a69afded19cb2818358d7ff0411ccfac2652b2b6d2c7a00d8be6190360691fd2a57fcd64419e5f5dfb033425b94edf8bb5118fbc8d25cff7ba86b3ab1fdf5f974ab37a5f522d7767b4520b462f610c3500ff6cc6ec01a2b8641be74e1a0b51bd538b0528a18b03a05070ae613c2f3d4a5aca31ab24bd948014d904a8a1feb92a97a47e2c626b00000228000002240000022016c75071b9d5deafe3d4e686bbd31a7bbc830b5768ad0e8a6b6c8f9b6c41abd4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008568fc8244422597dc6dafffcad8d0501b9ab826d9b958ace8baec124f5d813857c0042af2783ba903e1f7c60101de637bb773b9219a57ce7348897a5f95b183c8976d006030d0fece8b99daed7e6f67a2d7b70f47cd3fab674b0ca2152b4cbbe22acd20da36456c83eb8d9455c28caf9fa60f8356c2a688ae96137b419d3d2a115ce5c08cebaae652475dcd6d9d4b83dcf8a771b5e02b15d3150ffbd1d72c0746b58cddd7e993e5389d3c330a22f0c454275e36a98a7a2b9702d5f188314f57da1f039ad47a5fd89d121afc1ec01b1629435cb0eec0636ef8297c74963fcd3492004c0ab8d9565ef38db22b41c9fcfd679f0fc2ef6bf62310fa34649963a40df25c3134f041e17e589eeece2267f7a4e340594475ade902cbfed06ce5ca6c6b4b8386a326bcca702102283bc135c56fbde4a894dae43a261a30cd15a3b6ffc96a45d44d126933822ead79845cbc0cf86f0e00ec34ca8b4d2af7bdef1b73f1b5f328216d957c39625f76f5ca65d6a9dc996b5442f63e60539332888924b07e0cc1de3c2f0dabcfde74798a099993b751940e036d9d67ea15b7a72e4bc3f3e32818b0df431fbab375be278760c592f6ca1da9360f995b7a55deb8cfb0c34d3ebf000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401184f4752f967a48f08085de779ce02c6f9e424c415ffc423026c67a9942a6552020e4157b5b3d5023373c2699b3589525e762452245253991b02e8876fe0ca1ea41b0a694d1fc5e66db6ed21e2691e14a319f329d334acd22970618d749af2de7b0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026404449a1a9a011767ddc6774d837ed4e016a155539f439a1f96ba4c6b95218fa5329aec5c9792631a3e8d15e87073127c62704a8e40c387dd0fb0dd0866513aeb98685b09bfd0b744151878845f968cf7cf8ac5a2b71bf06c5032132a9d79184e926d5c2320431f5ad7d2cfd1880de7174a5ac9618f44c5c23755389ea0371bcbb491f51358e8959a1a925589f77c6f3db6760adf200d71f7fd95019e7c2803e58a3f8c40f8477f5fd802cd5df24faa7a37790f496e7eeab6030666d2410bc36fb773858f27a8dcb0313a430484912df03de3c7c027d3070af36b92c2dfd92da248cf98ad6ba4d1f520b93eca9b23609e256fd2637a2ce1c0ad1931069e491db80a2bc85f84dbfb3d1e21d0da8055cd046aef86b356b77fe46704c573a45ebaa78c3d69f86ae9b43c2163360cd9b554eacaa5b50fe135e3e53e04f699cb44bbe11b5149f1de4629d300f0f3da5aabc24901cdaa3cfb186016536edb75bf56f95ffa0e368fd13a16d7e419b844b2e1c19418cc35a9358c30b1f965d3cd2b25effae4d96d68323392d61e474334ddd4b37fc21f5d372023123d1fd1460c5117f698dfdd7f4add8ee5cdae1dbf41a84f656411db67bc5bbddacc5688d01ac1613a8fc6a4deca2a8c644f17bd0e6e7af000bb5bf3c7373aa9e010d64ee9b62e89a0000022800000224000002201899902c08b19cda3f10592096bbcb645a4aff9f63d2e2af925b59b13612953100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a87101663f5d5cea746027407d8fd33589490f7deb2a988ae815f35d8b73ab1d4869f991b3e08d59847f7e8f7d2862ae13ac4d0013442e947d951933bd06b315d244dc6e68e02076687e002a38f802494ce32f77c0f597bc4d6cb2cc1704bb3213d0908cbed03d4a3cdf858328c31f3a6ffe9aebe075eb52a234359071f4e255090398cdce320e910321227c5d49404862585d8199a87fcf21bf74741dc3a1a2d9c582241a2f13fff294a8002b30c0e4f5cf89577080293e038eafbd9d48fc179e28be9ec414cc3506caf10d4adbcbe21b2bfb85863a34ff32beb2cf1a109550e39b21cc3b821565993b6d0d09aca428b53342268bba4310b8bdb27fade7e3f552988ad23fb6c8c215f3d1c8d4cef294b16c78172d87234573a8803e295335d24b9ef47b74a401bfe55cb0db7abaf31707680b527685532b3e37ed62530abb43fadd088f46c9012392fd312903ceb9b75af08a4316b03a86e37e21de78eb2d9618be757539f65febe07875c4ee34feda0d302f5a3f287f2f37d2b963fbd13abf91f9437a496d1f82c5d85f469b751d60bf5e08c461cdcaf9077e9452facbc9ab160739b61bbe0a0311f2acb583235531762e0d87259e83a9b17bc56d13af4f05000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401085ffbb08b13b0253fd0adaaca7c16a34c8e8709a66d8d00d679cbb3866a4429020e8c7aecd69e0177cbb9e6350cb7dca536a8b2627bb774e8eda0cb7f00bc8c7906533ec3ed7877eceaf7943b07518de20df647850c33daab5ef7dc5b8e8cbc4e000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cb9701d9bdaa665a5a724f3b14d71057f409e616c4f4d39123d19efe1f03ff085b40abf2327a0a399cf2c70cc13960b694b38bf1e418c14432a45ca86d16e913ee045f5350c3cddd9b854f2b62efd0e787cb80d5deea0b6a41aa239413113bd0c3393c95b0f6fe93d8fea088d5132629a3f2f08c3552a6001f553495cbc622bd2a659bfd16ebb3dd28f202735b563e479ae2b1489ef98f198b891940b67eae14dfe8719a39f61780702ee6cad69a996a0b6d837c82ad368158e1874dc75a64043df591e0ae21dfe0c7e1280cd7044bfcc9c17b81a01f7fe2b7f73145495a8c92123b68e853bcd6b41cbc4ab93c4bf66da2ddc80ef38fd6aecddac0246eb124d6ffcb5be2f7a4fc5a9cf5f7ee878eb43573723a5aea208dd3e90d27a5b1005c78ec51702577c34e6d1df70cb96586a42ec6771adcbd6267396add8ba1a4a55efae845bc86590dcdf9597f60a1ad0eff7008e8b095bf58cdbb68446bc12ab7daf2425cda2373ccee573ea8e23080648d616424f4aba7709d7f936034140eb81128c5254864cbce5eac348557d3a2c3aad1a093a22095e783726edfcf8d1c8bb03c84d695f8901d4a2a3566b966440d08f8f49472b99719647621ddbcd2f1d09af4495221693e5f8f1bbaee9a596425c69d1320257ead5d3407e7d851cf898e47d0000022800000224000002202523771ebe29ec524f1febf429674ece179a27e80177f2c7bc621640d5d356bc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012a2ab88c8571930b5dfd9b1c9ee8525d8c73b771d17fbd8024256a318eb4b21a116affa42c8df035b2580127b12af5135d143bee10f9aedb052f3ddf6df67baf14f6c758430aeb68076e7c854c980f3a54d99a6861b56fe566901cdb1c452b23f5d15aa7a9e4b43b73e62b11582c6ffe291f4820c5516543ec26e65598c72c71a0f5f97b6a30510dedc7f032a81a1d3266cd7f6a665de80af6217035f68498290d0e35c263f66e41e64843aa213a598dc1445d4d55a71163a7abbcd9d113ec28fe82df122c6e3485cbf93712a8ea1e6364812c1e69fa6c31c1255695509f308c95b0fed77f37d1f97595bf0d042a0a6ef01fbd46e546f15b018b55234495e3ec0c65380197df4d0df1bd1508ea5df7609441a1128992c4d90ef5275c58be69777b4ef66528728daf1f38bf977954066ba6e374e2b06e53f422f331fc27840b9ff97f5cf7b013ad819dd3d6cba72fac6ec4b8f82220fbd7bd0f22e2ef4288ae3fb10a37fb28884f818fd390c768addd6ac07b13ead6ee98fd0fe1ce1f087220ade8b2c7489d0b332c4a5c6f926ec00f8047b72af8b8c52db8ef875953dd82c2355e1d5b895c416496e6a26bff8bf9cef31f3d942d5063552466a751c90f55289000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020f4c1faf47e3e2ae90cc1f798694b2ef6598f3b80bffa104cda6d650957ac9aa0acf2ee2e9326c9149e8d3a899a094eaafe72563b1710b76d5cf8b43f7cb3902021113d8baeabe14d0473fda7cad07756163f46815be676aa5adcacfbf00bc3bc60b5c9d959d84cf6c9c89efb9d4dc1afa6142d9b118be503420722b5ac34e2a320000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009132c0e7e64ebfb253bad1056c2beff609b979769805248aa785ccae8cee86f60742535f1d7835c3b4b7f0469ee524b06d143e14c2eeb85401e1c6ff87b5eae0096c757695af0e855ce0915e08f5782fe365fadbfb137b8951c30acc8515e342d3832461db948635e8275f1786db37e140a8eaf0e4486c4c88c13b6c70fa6ebbf036e1460c9aa4d9cb531ee3c1d0fc0403a1410db96dbb6de1c43252b584531903f06aca7df1102d7268cfe5273c4a1633ad8f6b0832ab8e0576bab334250b2b6e18c23a39b647e3c61cdff552c853d5ea7167424ac3944beb2fe435c042bf13018676bc7ebdf2986f7aac886618417acea93d2cbf9e6e18b3aa5c39138a2da07fd9ae155ed11a2bd55d5edf96e9009f35ec01b5aba212b3ea6e2cc166d6a0f22ad98aee4943cd8802961e7e8ada3035c33e32050d846ddfc6600167cee305e9a1cd36e2fe31faac90551716c74d17fe025811da1efd307ea2712c1876cb11413bbe36c87ba86e7116e38f6200a81ca769718ecf59fb581fbc6f55fcce6a1861115b655db399ece77f8239bd64b772cfae9073f38a892be3c0b225add6d67faae06d96d5dc098e882215e53521dabe0e67464fa4375e6dbf6949f8baf484a69222beb34da168bf1e90e489253e8e74d04ba015470f54e44bc00adf87819f37be0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002387b20b7d4488cd2d8f8bf479f84102a8b50101f4a336d35a8d0a764206ad1b3a28583b8ef1ff3e626e6b11433fdebb78fccb26cbeb8c2727ced02f7dccaae4689ca37a5295e742fc1dac6029f23969178daf61164ae00484b4e186865e2b4493e1d6b443f5502d7343352fa0035185642e3f241e736c59456f85a59c0b9401e955d80ca70372e23623597a11322a9ea46651d2de9d0d4e7f0fe9ae91f1bc5cfd6c1b6ddf59c23acb154e851c246353fafcd99e8be982ea9ff3ce80c0c1332db40b555d142fe53055fd72e6700e433b81598e6873b22520458107b4f20874d58801b35308fb334e674cba293ae5175be6c178fffdac6c053cec14c67e2ff8c7acb15cf2d782480e02111b7fea5ec5ffadf1afc02d3b058e3b75c0831ff37e25cf460d565bfebc53c858ec4d9f27215d23ec92103f40becfee97ac6b94254b353320702b7faf280d6d45333ec8246d264aad3f162198a64a8585b18f068d1edef25effa5caff1b73f1cb3eed78f46ea530786fb2dc8c6ea02c293bd42aecf05e4299ad9d2c36a39fbf431e8bf55df2b13e77097e7e8a6d24daa23445264ad3ae70d8aca4aeef30b9c5f880f8ca7590c5f6d9fd15ef3493d41f1c778ba8b8f375f3c57955e0c2f9e2f24cf05f9f7769c2aef4c12951eb6070bcba64c8920771640000022800000224000002202b12609d9e1d3da63c6173c2d7f74c59de57114bab6bcb21694ed611bea1691e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6b12d0982ca7ec240403ea4dd71ecd9204653722e622c44a2ee518b9652eb81384a6c79ad324e9316fcfa081ac420e1e68fc7f5344cf965c395122913e52463544a9305c4b38daf6289a0bfa4832c1ccb0d2d88502cd640c52d6b7ac2a4fec7afe8d147570116ca5f3e81b4d87e373438baf7d1fbe0ca971a21b32ec31dd2f4c2a4d0ca51707fb2d444a517b3b53fa5f90d70b5dfd112374d7e7fce7598836fe7bb8889bbd393e5d1409c64f8b6042c9c9e1fb8628ac292eaf29a9c62ee3534e7cf7f0321618f6eece7f97f016d90154edec350afaf0693f486b8e3070a7c996aadb1c8e1a1dbad93016c25d38d33e87cbe5d0d177fe82acd1a018bbdaa384f59caf426e5b38598d6c962e331ec329b547251c3aa0cd0d18294030f679f9b4a6514f259a0bfcb6c2ff387b16d936e415020cae59564b741b1dc4ec2e6a67e2f4ad738d0e44711655d249bd4457a23a534ee3924765ceb115e1e30aac66ba2a5fa7c6980bd6797e3d7d3505d097969f879e1b9566b6154661844c1008b2592a16937c143508acc5622da3189e6b29e6550c571b15961571b84816a5f275e64fbfa743ea3b77a5c8112b1a4628944234943a2bcf5c596bd679b762bb529af3dc8000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021e7bc9a49e11aee0395db5923d796dc0d3dce1d8ca10c70714fa6780c3d3bed31e0236582ddc9c6957c7f7b90be853827dbd481ed91808fcf5f6da160ed8ae4002133f9bcf041b371056c92b06eecbe0b367c5fe72dda0f40b75328e2c3c5439741aae71a2cb633d694ac7a09d7420f1cde366682526c000a66deb760a23f9f05f0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a45ef232e4417c18e16bf71169f044931db13c4cce16201dffaef9d7d0ae71f43ebbc2bd3934bf036eea202e06e074e80ee11b5b62b8374e3a1dd8df375241fdfd37bb42a4ebb5646f328cd92900f8793ffd9578c7c4ffa4a2efc5f1295c906eeb897a8b07c93bd906452faff59732340127edebbab0b28e286d2a6ecbb109b810d699f66520e9e5aac117bcddde05a12e38f66950a3ffce102723a0eff5b77e21ed4c8fe87a2d272e135aba9b1599b5230217438f717d397d83364fd28e8aa5704060b4fee11c942847343da5f1cc031f89703fde0536e1b337951ce780ff1667c5817e4df1fb8d48603ad96b75e3f470fbf67cb0c8248562a0fe15f68463bed6fef461423901efa37267b520701599f3616c3701e4a467f40c64ef38ee244918ec3aed2b96c86ed45bcf22dfdb8a983a42eced513452498aab3f195ee78326f8c9934b7f354cd2687a6f08920a897acf0d514e9cf132c79ac64934b3d1b35c04d9b31a2381bc6a14d7c93e2fc60f2fbf8ca7c481ba144fe6e93a96d55b499efdbe13ac55da8295f66b0901bf93be4229e38d1a2164da01a1141fc93da6d62ad1e4b86e763303d0e0ccec7964b226b68c5a7b91656b9eee454c44cc8e3f72df223ea63c9eda6b06df945e18950c98a56cb31371629ee36affb2943ef236ce360000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c24a20a192f08547a64f4c799504878f40ec3b849d5b0eb6577d37263413d99170291c8f445665ba5c5eeb3a33017666f54dc51c6ed0179ece9a07011c0f49bec3a200113665d084d3cae2c247b3db850c23b183662420dc3d3c41e0db1a1a7e442d5e26e82c8159e0a75023c90b03818170e8792aac8abcdd51b2d0ca39e90059cc6235cd9b22b28c6e3cdb6b730675928aebc0d10fdca47d79fe6a1e9c4723de70eee2ec65b29655fa5f68c6e3cc5950130867b9e33454c968c5f8dc6a0f8234ee7c2ccb82e4e8771ed923f2813b55c70cd72dc3ca245d901147c5b226cb1f4d766ec0ddb09b22edcf95971fcbe4dc4f3b5b6a609cfca2eeee87690268da81604725be791cd119986702834fe068e174f900fd970349493ec0592a725544d2d66348dc095abdcde04e14d458debd067cbd0689145c91427a224830c14ddb513c242091e5e91a71fdb83adae82784e1f336d64e4c6fc08334c733eecbbe0947b2727e3ae2bb87e931e122434b997445b7fb846a7d822d142c2152ae21e877b3f540f95deaef7acb65f74bfde81c31079ff367a0c443c993d8aa6a5dad2938b261a884838efd6b51c53e91871b6b38fe1f22b7d97a9a1c1fdd8587365719ed02d0b21317937f961ab24a258dea326bdd284cf2c6884c76c8cc91faed963b13900000228000002240000022011dab85957201b529bcfd619b027832dfb248b7cc777f0575777361f82549f9700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7ff27cd7801ab803c90aa95383cf6964c2e58205ecb8659aa4365dcad3be5d6c622a53b1f0ec51a360600c6f4659e43dff75f32305a10df5d18c4c5fe993f90bed03f66e1257e459ed0d2beb2b6683f871b6a9f15ceb1599091845d3f79395e550db3aa909086ccfa7cd3306c0f5441b979df70d6ecfc101f814da68918edf7b1ec342a3395c0a32ee34c8f854307c8a3bd859872e9dd9760a6b350e42f386f59dc332e723fc14a4a88830027a161c038f3edce578238310a46b3f5c1bdb57600831de4139f8c5b057bf4364cd327cef8c6d47f29b2c9b12d237e333ba00d7b65d1b905b1ecd4c612da54979d6d498611d11527de02584d747a0af4b82a57f59a7502210721f927a6b569bb3a7951eefe993544ff6661cf50f095da45371922bb80d85f695edde189bfc256267fc0bb24fa779f8af47cefdb89519900f69afa1adc70781f6336396f5355e19696277248818cc5ff6f23f152547f471651ba73908f9b43daa096973b49d7084731d3cac47b9fd81e28b3cd01d23bf5faefdeeecc8eca5133d08f2fac368d44f3bd906a96ad3d94385f7356a1830aa025e8d1eef526c433e0aa7981b655548661876fcd5c6f35b6014f81af682e8644e6bde4dd000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40108577573ac41ab57db7103c3c409b23f219f7d28c6fe42f22e8b69d0618d09700214b6cdc36380f340563847ed04b584c3dd23a43cf78e1c5701856275726f92131c3c13b14172d90fbeb04a7d15dc3432788b3a7ba7004c6de91eefbeeb6dc35400000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b01b54d452ea992232d4d2a7292f88be955835dac2a8749468c36630d0090720d1db10637c1e955f815463f40d62c502bc29b7f38b528342d3c57a21b2dd5f2bf8335207d04b0a45dcd8866a2ddfb72ce6485df1e4864f2bad63a80d85f2e64fde538b3b601ef263103f921623bf68d18cc512ceca56b0bbd7f63df8f4c77fd0567439a2e581676973e775f39d831725eccda59b7500e94a67090e39125bded96be84cf70197f3a78015baf30b8fa9ef67e00bc62e8c96395ea024b25656441eb701338d77acd52c0bb0c5e28b9a1f84cb8b5876c644c5292589f05715a2effb4d1ae17dc88feaaf7b533e2a50e8ae0b8e53428bc40670b505f10948e4ff5303d7a9c147f7150ded9aa92082011045d99e55dd4604429016112c81131732b57855114ca6bd96fe8dc26e86c18e5932d6095c96e8eaae7aa75aa8a8d50b219866304be0232d20ae33cafb5e66fc60608c4fbfd4b9a7e64d8d984e5dc9f128c7b06656a9b5d62f94546fb293b9858830ebc586bf4cee329f6e9cb90b4a7baa48974431834876f161f50063933f1cbdf69cd88ccafd09d6a023841341c46e4ad00e921e2f6fd5f52d348c6415d1095f6cfa7a7efb468a456816a66bb269e1caa4358c5dc23a431fe1d5cb2fe099c5a7d31dada86b94cefdf1d3c9b01df049ef3ffd000002280000022400000220150d29c9e7c068d6cf9bfb61a9573d4c018fe3aba7cecc0a6d3733a016195246000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c377fc29a12911acbc65f00b80a9c92d503b1ef2f847d9161488cd19ab9b0f0d35cac6e577d6bf7c22d2be861275ab534f33027bbb98f567e0ada7ea177bf4e02358bc4ca33453c1d8a4f61b7706a020542f229cc747b44b2429a1c9e0c914f46016abb5c534a7297f51a9d43699f707ce2f2cc2baa845dd9cd77a16aaa72ba287613cdb88157f897e805a088621dcf1651b8cf07756b6dd15ee2b8815836aff74c77b936c4e62c4a90b81e53142b9659558d8e12d008a19aae03c41e6c43d4c5cab40d6cf50233cbd8b3abe126d21efcf55a5e5a65f25b6550c4e90a31b4095bfa7e9635a41166237657dd8116702804d9a6acba65188d589761c1a319dd98c67438a1ccfd04f79a013f5c53b412080f6a60d2e855d9aa97eeb5b7f993d183ea46a2d32294baf2ca6fa40a21c07c7bd2bb2681e3c9ea98aa4c81b83d86269311f5102ed0d832af3c72d23590e544d13bfc3a0ff7e1f01f05a6ec767e7e7210c24171a5f76572b19cc96f6deecaf9fcda12db45a5382b71a9afc6899eed84fb1f0bfc2aeecd1d7134764b41c52d13d15ba7762100e9d82028728515db0a9b4d8ae64c6521457ee87dd5b22af6b871d0c6dbfe69de28eb9c5447bc791a3f0030000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40121b6cbed1193175a69311720d645990cb69028707d757433ee8c2b2930e0df4a021583bbbe7d3987e016f7dbe2abdcd386979bdbfb6b1119aff9066be977e9243c15fb8595446fa88899abc119085b34c4fb37d97ffc21e1c7f5f95e750b922ade000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d326505d8bff0bebac59878f595419cb2b26b7e2a3f1f5432945ee216b16ef73f81444fbe2fdc67fdbec4f31fe3297d120c09d34be207e38def8a7610c5f581a7337d936babc969ef7be57b23d7e27a2a651e88b51bd8d4e32c544bb7ad96766f10bdc84b6759cd5a6da7e90925b021ccbffa534d9a134ed98570ca73e88cd4ca3708a2b28c125592f4dc8a35228ae7b89cc8705d63effa3f41304cc22c46f4ece0baa76795d0a46a0d3d698f30b6e8c793d5a38ad371182d4e2c4e549709696804f7d4657d7b5aa4ccbd104952093e654657d8b5ac5abaac192dd29cb2f8c7f880797c28c9dcaa84c70bb0107d67b52083eeca5f2038586846188ae50432730f4431615e4b23849b5de29ec05706f99ce02badd7d690242a2e003d865c43b2dce82abac2dc99b4fad674585b2c148ef0dfb4b3fbbe911cf237a879b4610740b78db9e4c1b31d9ef935635370a3e8fd7a98a0ccc229746bab7ee8c25ff7e43c7c5cc9de6da72079661a15e7c7dffd3d8227897917304b0730904b1fedb5d6e6ecff9587245f4932eab25d4ae3c8ff929ffbb3a60ecf97d4ddee05cfc7ab83407112fcb28b85ca25d7760b29019b7134acaf045708477b183c4c8c60040251df972790bece8b55ebe79cd877346cc6a0985f7fb62c51ff3400801efa9620363b0000022800000224000002202a91850c8d7ac968d34771d9b2021f28f1258c25ead1128138ef5edf5879092a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088ec3e5efee49c0d8f59dbd34b74f0a49005f5e411dbad6019cadddef923328859741f5326944851cf4e7c4bd00cac0baa4e5426284da59d057d030b7efa9ffcfb824f0afa377a11700832d74dd69eeb06afa4f201047ffb4960b9998f94b621baa0a143b773a8f22a1458ac967e6b23b29babca4e014d569b58af76d149680dc6faca7bfc224edfd2170ed180be1ab39276895393f6ce0e10b15641cc888b94ed6a65ff0a7944bca0b7f896d708012e003a316d5cd90cb8e4512d84b453c446c6a4c78845e1c80a96ed62ec0e2fa99d9389e78c1c567aecfb80ceac9944121b16317e695ec2f2b1b40a9ebfaa64f9638af1a12e3d65cd88b2aee2b3fd1e97b2a89e124cf4e241b55c8b20ee83d31a511cceb1ba2e3d56e698026a4720daa042407c19fd4c19105f8b54b509b0a135842c3930532dfeaedc6c7815a87ab2d1f118c7b8933a3bdcea47cad06292f1d8706bd53efe48a93d6aced15b35553e5743290d0bd3537dba1fe20dec58a02aa3b7e47ab7295027c27cafdc3bf6c89d0720899b945316bfe714ea3c2bc0783bda3a093158a68baa513ee12b8b40dfd19d04bbf8366872769fdc0f5a477294b151f27ba2ab49e5046ca9fdb23388cb5b42d5000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40111c86f4a6b01ae32afade15cbdcf54ca4e70ecc4fc0e94898924d879d51bea090216571627cb8cf3b2fd94d74f45b3d6f7a9f3398623fbdb1ced7d3f17edd2a9d228097ff0bf12a7862ba1e1fdcd4c1eb480bc095efba4ba2c27cefa5ef652551a00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae0630cfef839f8daa35d79960fa68411abb68760ae1924ac78c9b8ee7d827637a24d4012d71b0bf16b47a9ab001d93a8f5f4a2183972195ef5a6b90c08e111cf514bba3eab8733c1bccdda2d6ecf0e1163b30b1d3cc5de0b4a46e8bab638718c4ce0e69386ded4ee21483d0649f6464adcc15610f2f3af0d0bd3147c39b5577ffb1ef34394e0adb72f05dda97c184cc8d492d1701db52505f996af16b80f91cc0a9a4353f78c1c0f161856591f880550bcf4717de1a9448a8427d321d7a4d8b3fb357d751bc51533997e544cdc049cde92d6ff04b0d6886693122cbcc9d110ba51974ea962a43e93fd05f37ab8108fd7048afa414dd54f2fc872471d999877a8f3f08691392948622274034633bdc6fbbf4f5bf345fc84265e0fc916d04f553f8ff95e4bedb525bb7052717a7e0771f9c96e26ea29851beee4e27fceeba7ac738728233814a7d08a53c2635473c6b4b90536df753df87c79b485457513cafff6aee0b5eee99e13510f5e08716797072c8f862ab4863da2adf7495ada6bd5e4e95d18eddf48ae06efaaff6c96b61d0979989c7a37bab8600a2c422396512520b492a00dcfaf84cbb145ca2afab11e4d6d0abba468aec65eeff6af41121c73554351bbaf966095348b9c8dc5dde895af54c68a56907c3e07a0a5c39832cc616b3000002280000022400000220160845a74dce8b9b10c4d3856fb6ea537a18e5cdf7983537417c63e09aa5896e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec61513fe2e9e3ea45a41fe7ef57133b438deab8f2f877690682fe12e42f64303f39ba07a98f549c997a47ee6195213c4fbdb32019e1ac0e3a64a95c4b80fafbc6a357a62b6183ab030d56f15919f3de8373d407d72e6b8f6cc7630ca8adb3565a6a5fb86f6d73ef610d1d572d2c7cd33a786fa8a96de68b7d85c54762e1135932252fa4787c47e82c28c1da56e1a8ed9682fb5345524d00ef877161c9c3fd52419ff0f54e4e48d3002db09d374a21f515c626dfe9b22a5b3c27c91fb6a43c7a30257156b6a919d4b66f23d7dfc7b03c41fb0613797c63aabe70ba5ad620535d3797a11bcc11debeddbf1f84ee2e95ef2184be720ef9581b4b3d13a4bf1394a5c11babfbc597bc13acfc376071d0e637657dae4916e977722345594d15915fd51d585ee10b392282487c86bc6552f67c3b0bf9af1870de07b49d0dd1585d70b62a1e135f059417458a37a19e4241f2d347be33399b61c99be45578d254e15910c39ff04612691624b0633493f8b31dcf9cf132c52117ce11d9257d8328a8baa367cfa546c23f9fb77de5e8f33ba07ff2ae191b8064f40f8d071af35324870ec6b0f4b17fdb9223475cc147b587ec2e3e6eecf5e23db29b810c659e423d5bc40000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40127699c9df08b07b89a84814ababd630a9203bf8e4bcd8c1c045ed7010aafb2d20219169b6499e9ab842622d9462270eb83f35129965478795c38c21c577f7e1c1000f71b58093868c7e7aea307a7d026c01dff412cc19f25cb477b997272342d8200000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000893718f179e8352009888434936dff5d82c6245ce752b3ce63b38c185440bda5f5975d07fa2a8a726911be2a41a2ebd70752f1a2eb78d4a5ca9b3da60fcd846b6c87841e8419795dea8e6d0e31a29e020f4214350e7eec16ddf85f0cf49a85fd886714b488fe02b453f62bbbdb094fcfdb6d018bc6803eebbae3480f8ee45131a8f3ceb5d736303ca1bddbd91f2df55a8988084e076f2b8684530e81e022042d780e120dea411f490a8c696bf92965ced40262860cd7975d06401d93a82eace42c435f78a3c5635fe9a5d03f8a7edeabba357d405d9cf2c611502e3438d218de22e7285bfc482126b5298b1229bf6e19c436c5aefcafd54814e3da5e3cddde4949dd222d610ce622c11562b38fd2922c2203bbbd160ee150bef6959d46d25e0374c761cf4e6065d08f1deac103b81e161adbc2822dd4a00a84eca44c8ac91eb91fc90d96b8bfa7944c08dbfe10b483d9e064cc508c2f20d0d096bf45b95e790f017e0958fa26015fee01278ab95baf1621b573b91ef778600caed71d21388cb9bd8ddf565f37da7044c7848318b7ddd4ea7b6a3c7892a8f2696902315b2cc18ab8dc77b89e1a15952833e370e98400b7409b42da80fac05ed3c4e8c417c748975d84f0edb5da9b0832ae217c1daa01de13eb8c03444318256d9f79e470ab93990000022800000224000002202e326942638493dfe9134107a77fc2db58b2fd33dd9ae92a5bba37dbf5660b02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b98ec8e19c28f3b7903a402b566c704feaae2c605f3cf5ccebe1747fc28db2b281565e80092aa303d98ed0bbfe3b59457fc51ca5a7bbb9cfcbd918de2491d1cc788f072a0ceb091761f62e5d8e005add9c7973bc25556b4e995c48082a787332ade8df202281535047a5d3eaa4185a8d2ec6106dfa12213ad33b44512c6e820893c0f3ce7072d5139cd3397ec4787ece804f8b58309867c9b09a009b0148b510528b4f5c36bcb390cdda3235c18b5c199043963ad380ab55e45c7542a77079d007b083b0596a042194f31e9ba5ff5712f6338db1dd7e0ba90cfa877e53a2ef3e0fa66f1dd4190564d0a67c6df8a7cfaf9705b0b0e80f03fd8696315a49745536bfe883d20cd7da8c0955a33d3e1318bb26d9195725c1e7e7a5ca1d6d53609d6a0d34da57c0398fb6c202e8215efbbc40c7c9416e7d47b6b37a013daed1c8748c4b8dd6ee648e5f8adb2e783be13018b87eabadda0308da98866d6155b7fe07b3d27d405cfef4cec7e62f1537bda94dde1301e8e61c2e816a49c30db8037973ea283058d335278d3e81e0feed4e4705d0935c4d6b48e44e3bd6690c50b9700cde803655dd8697feb92c3ed59c91c297758eaee28862b941de41f8ec4f4611990000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40127e14c43fd512999c0ea7ad9f5d757f7e4923ab8aa24caa4c67163b2540fb871021a38afa769018f438fae1915fe2dde3b40d221c1f3268b067a5e11b9461e7bfd1de515b36273d253aba8b674f3df80c655884e878de8a070b69e64a77d9c56e400000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1a79dca4b0f69f0ab1e4cf9d39c02f7670dadcfcb92d33cbe591fbd91126eacf34890e21751414edf63f0afd9c3f77f6a5dd7bc151ef3470d24e3928f38a0e6613dd99528a03f3ee8b50df1a0e3e5bfb229b408c976b007da69f63275cf2d7868a0ed7f65a0aa2777e0b7790287d684a453cae9b026d2ab66bbda87a66fe77e7ca957cd651c94491860e4e97fda4f85b6a934d4838e991f6ad5665b32d91a7e63d6898c1013ff48c734520a5240b38b3f6d22f8eef026c37de52c9177e8e4aaa3e05e8cadd55a20afae4c0f3e723affff6cc901035b900b3256664d36a6a42cfe4ea19c078f867c63b2638b739009e613abd97186c8704c920fea8d278c10b2850f30725c2ff8f51304c5e8360427fd5efc6744cf625f2cb15fd8bb5ecb22cad47ae8e8e2eac8b0154a4506984e655085553b4a08de50d89d3a5bf93a83b22de68b271cd532b0128592585f06ec810e0be9f18d16752f7ee4edbf39223fd97ed04f75dde895a15b1162cbfa67d84aed58f924ecfcd2f5d2f3258e90653745289ea5015c9b8640c5a69aa966e5036571098ad8c03c60c6317170578835ddb67b68047cfb1c470db6a5a00f310a2036c839bdd2278c445be390577ca41d3b8d939961064be377318e1cb367984c5be1de8f70e410ac13fe70e0ed61bcdd860b7400000228000002240000022003b75569053256902ccf6dd1c32541555983d74547ab3983c3b9a64fa83a54d3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d18a0039eb95831d9ed45630cf79c1ba9cc384781a69afb747801f0cc6c5447e18e4e7d48e710edef89ded8411763f896e28ca04fdf95b803300d64be1d6845bccb0a649bd1b1f8d7237be777f2a0c50306dc1fceb48ccd5af82296189fd144267aa7a51eb091d5af93e03e195c3136d91f84639361a6ff65646430e4affbfa50b2902a5b93498a562f8bedeac81ee0b3144bb141c59ebe1cae09fb7f375d108fe518a3dfd21bd73e2447181a1b5d1807f0bc0d6ca9e1975bb2f71c155e55182aabc0f7f8b1fe5bee44566e214b23f9f512fecda8690e04a32f914c49db69486dfd9c091081b000d0eed2a6baf4ead53214d5d595ed532124ca1b11c7141c1c126177fc83b883174b5305d98b7e6a69d25c616ed5e06a2e10d831ccaeef710b0a65b37813bbef59c7a44b7e92f1f952b9f92c68e5edc7a1a391abb71b77e225ca96db9c0dc24e3a1f5f2f00794f60d8f160dec524a4a6f0546099d788e305e2a4d5d22bb72b1ae81acf1ccb5306165a950b4578e7a506988df36346ef29956910c2c1356571928d01c447b90f9a57d47ac1794254d05c3bb501f8818966b092d454e3154fa8d005172ae0d17fcbe15af698b1184ebf6f8a0fa56f43cdf8db10000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010850d3eaa50e1e5c47ab91781b3e6f9dea8a76d33fbe7b30392ddd3cbcb3775f021bbd33d339197f1a103af2293b6748a770b11e0854d8cd917e8fc26aec3c733e1d7231e85f0ad91c24b6a34bb092b6e8e7f4a6f5c3ded3f1571a279324c64b600000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088e2c5090d7951af6542acfcacf86465f47206a5aefa1befd5d1b9c651ef98808b0078b63262472c5dd80bdc253c8e4c03761d8904c4a744b038d97a2a6522eda8c6b62ba92d742a5ab01dbe809c49018ae4a351f41ef9d6f06fb0115d4a8c820b67282616c455be990720168e80a53991f7a5243e87a7e32b902b7e25dbb2a617ac7487e78e9459f2950033db0e3899b2d1729b7e8218e28a25c877e6732baab4de747851434113b116c2f774297e4f60d55e0d28b3cecf7cd404ce16c65ec84188bff1e1721da0fb3af8f7c9b473f72103f2b36a40299eb378926e60733629a6a6d3b10a479b04b4f1bfc910ff04976b2227c43a9bf6036323f362b0a18d0a43d759b045c3a7af987a9c19f7c4bd4892903193cdfc22785ba62032ccdb132ceef96c8ad71fc9fc3edefcac4646e1830bee8465927b06322dfd3f3ea0ad3f79b06c1ce852f9ff0b81768f340b7abecf359b06d3eb309e1ff61d70f860d2909a8fac760a7fe655a797fe114134d1882cf5efbfddfee6db4c470fdb4f7f3db2ed129dc4dc991a7afba04f10b120d3be5b25ee924f519828c0efd170f50ad2f7856d64d2aee5d6765de86dfeda000f059e64d9cfd7cb5c8904439c23fe744dab1db703be4b7edb9b379cec0207caba0664f5e8668328c9b8ab09fae04ed12cb3f800000228000002240000022012fb1845176e5388f3d88601038460c36b9e7794a6c298c2d9a465a56cf6f4820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086cc43d5ab40bdd875dbb508c4f3f9755a3e0d3aefebf410e89127ed98a050213902ea3191bd5fe5b25803a358ba2eb40c8a70aaf5b9da00165dc93b4c6fa01c03afc9ee993fd7972fdcbc74c52d2aa6dce6bcbdf15d398cca9d6a430ae178b99b0887a06cdc4ffee1c1a423c056519c1f1a6244a6c547294bd9c83e2e635c954331d8f0cc5fb24cfeb453537802db8b79eaf685531bc946f593a4fcacbd3635f9f56649ca4358c5eb3838f29158e6492b571dc0af6a38ddeb03ac3a4a863ef047561e2931e961b973e6b43e541728f01bf54c7f0afb5a2ec4226f678b4bcb2f580b621a691ab83eaddd7d388960e77ca68d224afa24d28923451d9b16027af4dcfa41a1855e6a4e4d41ccc8d0c560571c72ee12328158368df77cec6d5d8ff345a076d175e9c728cfd249f07571b1b01c5796b5f32ebb4cb3d5efe4c59369b42087b0702a501b4e5632152a548a6a7210405cd5ed23904b4196238fec77fe6dadc726fde42d8a2309cfa3a411482a4ae34489865d4dd3ffcb28cfc99f7b491b633fd5db58709dc2c3a720155aa88fd4f32438a1e5cb76748d2141c8b04269a03c95aff34c445a1a2fd635bfaa51db83a431e715e290e9fd8cee79ab38952f74000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012d850f60016af0c557716f39044e8040c6486e5cf6757c45f9ebdcf955392f1b021ce4a5ec42c59cfb245787bbfc11b6352aea3e91448f36233c02d043a62bce4112a6019cb14b73ef70f06ccd96529f622647cba56405364258677142e755bae300000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae19194f470948aa31b8093e739a62b5f643e9e22d1f088c33ba25d59b7ae034fa11df5a2e22d7cbc2b2c432bbfbf2b3a4dbe91c3c5b9150d6e4ce79514f69c5c3093d790fbf64eeacb5a638d60ed0b85c0f96d0ac66316984e4ed79189f238701a3f547ac4c106b18ba864d520c1802ccbdc78b9b8cbfcbfeca975dc33a53240c20466839b4f9b3f6cd767fd46af6ae8d1a8f18df48f1a6a72d695a1a44ca65b776890ac59d0fc3f01a9a88d47c1bf25086a98704298e584e280d0aeb8dc1873af166782ca05d691f36a4a86fea86459a7f2ddfb36cf68e85078c731230d4b39fff4391e9daf0a98dd7ca772f75455c15bbafffd4c10fdd67f094af19d26d3f079e211226f042dce24979d7df01186524b88234ed6d6cfc423c8197bf49ec3a8e6ba9b747443da3528fb03b9e2e7a3521717bd8ec4b304c7c2810ed0ce34f7460610e841abe9d386e148cb153b12fbc9679ba89108e305d8132324f1ade74b6def26b7daa084e044d53438e7ab9d34198f6f8b84249ae9b70f3e0f9c9e048998a7ce929c437d1a993989dbef6c80bf2400f705c160b44c28ba0953b6dac49100b53c552b8159297063370bb4c3576d412ed9f6f8044c0cca8b8618fecf44e9652980fc807d83fc7a91a219cfb935e917c2de553f004523c58da4430fe8c6e1900000228000002240000022016177a6f19ee70edac71033566e5e470e990cb4e5fdb1ee2490e6ac8ce760198000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e9ed8bb630867e8da9161abe760ecd2564338c607e0e0a9b3f6430dad89cdee2fd1b87016076cd4173ab5cfeebec5370f91abe38ff0476c610c3f52757153410bb91b67889f52225544982128e20a76918d2881a48cb09182d50dc132143a73b93d2ecbd01d26e8656a218c84e3d40b2012b188b8cfec4032676f2e8b4eeb4f4924f37b1d09a53774e19d0df65d8fcf2d011bd53585ad06e8f71f80860e761e2a47074b529623950180a8a83dfd6a0633a1bb21bb0bf21f0af3f66ed73b28c5ea702aeba65ac89b39dd82f87d6326f8fefcbf791e5fce8529df22dbb0d75f16c8a7562e4cf329337ea7dac9267b2d7e3dd3376e183787468699975ea6f3b5d72f75aff18de7e2594083e906e9171d158cc759701642a183e28c8055f494d6061a2fbd932e27436f7e0d8a22607c48a037236e26c0fb0a9bf3131537874028ef3401b4ae1950adb439f90911763f586c9c8cbf3bee62d50eb6b8042509f23b53cd935571c21f4fc1b42e81b6645382f90fc7ed0fdf1151b09c89b22680d652b9f949c376534e5d4cebea4a9654d493f5d724f6e34ea7dde23e5d24d9636356bb2ce5d86f8b10cbaf622ea2a332680fb7e2a7432c7cd52c384ca5490ca02a8d13000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80208a873f21c0bbb91e30f162da513ce2893e75b11c3468719df8e887cddf3367f14e7773b4df607d82bee0b688afce292fa88f97aa3cc7e655cfde029c7ea1e43021e4b61f08b5e02a58c036c3772a491b9b6963cfaf06b36f821a41806f9cbaf720b065ba6189bc5f2c06dc1c533229d446ad9d522209669d3ac0c4285925320f80000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f03ed5ea944a2cfc6d164ebc56f10d6205d6708e2b1c723f26553797c69a202625f7f41a77eebc449eb4cf7fc183b9fdd3c431125ebf2aef1bfdf1b90934460e1ec5f7884dbd1e359088a34bc3cac277ef0bd600820f24eb9747b664f703a0eb6e0d290115487548234ed9873eeb6e350b485559075c8d525940d3e75d6012212c792c9352947b248d16c41d88e438e910442ca2934fc8fb194bb14a3bf8a45f4fc855bda96598e6763d2f139d435134d1895e50a83d6c83f41cd5425a9d94c4d0626951f2576af2da5b5cc063afeb3ada2adba457c0bdded3c873481b38f3df47584acd8fa4c8e8523b8992179f6fb78c89e30287abff2f386786cbf5ebe96fa715b2be0f06b8215d94a41aa48d65d3893320ec97dedbfa95b6565cfcf845ff231af87dec32fb5f628a5dc5093f23d5ee7833367ab64f40ea55d7828c0927661b92bd2c9b25788f31c8ad49617989a68f83a97b2d073512ab5eb091e4ec5e2ae94e2d1e31cc08ae77d80dcb51678eeeb5e75f38894e0b3ea71b9f4a7ce2cc61feeb389acb0085e1a5b1709f86798fdc69a4757d581305a3c61dd0b2ff8e94951f605309ae6d2484ea225b590251b3477eddca7626cb23d12557b2361c04fdc9403b3a57ca8090e9cfb0c04a868c32cb54da1606c8c5c7c294a2ad3133955400000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8eb2532fe1bd51099ffeb85842f776a4ddfde086cdb0bcc5b2744c00b1f984d8d5647cb28767adec6c996e89ee2f99cb6f58f1cf2f092732507a4c7e8c0ddbb4f743a37436aec4ab63c2ec41921b823db09e717f14e9f51ec3038b84d525db9ca322fc1e6366903354ee051861e776f89a54944aa5c86ca39c23f93b816491579b2abf879d48efa4cb92401388490f231cd10b7cea8677880695db82307b54a37eef7d29ef46bc3357885a206c342a2a6bfd1514029b7f7aee9059aee28c55da7097113686ebb4c6b240a1175e509bc99f571260290a0a4716963cfa896bd0d629fc3bc17b2cefc8f1309e700695faba8953099d380a9017cb8f99bf8f6ea94bab8501466be2ded2560ac28e9d8624e46aed92a7fdcaaa6ec88ab90050c940e8448dac2596a670846a03a3f64aa4962096967a26e672f7595fb044a3b0c31e85f2018cc5cbe2f36c28e787b8c17d126266f017ba1dc9b9df3ff24e49e19fd67cf79f951aa0b1d5b4b0e5c3e50ac5c2b58a70bf5208067c15c907c4a98c1cc4b1d5cdb811f102a333aeaaa384e70894c1112f715928714691cec318391da6452f4f052c1870533b911d7b7461861b1f88bcba0a3dc76689b125087d9a40cc042711bea999f93fd4829aa09cd1293ba53ca6cf12a71d1eec8ad35897c90ea8dc0000022800000224000002202e821eec16ec832b9fbb5e0fcb76a18e68e34d23a0a6fe6a36f40daf0197e9a400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0e2cd7c5da55cb697fdaeaa7c7e267d1f77359c049837280b481cb389e2b773b5387cfd423ffdaa21301c1725dc844196d9e986e8ba2ad3a45204e1783b0d3788fa2b89cc4b6da3d7d2bc3770470cf675919680464badc76a6240aad045df0ae28b4f8672796ef4ec7b89c17626b0b2334e235e7a2bbb031fda486fa06341a3f22a44b93363a6e5a35d61a5ef8507e5be32059a160fd30d42b6fb832c600240586a678ed4cfcb836b83376a286ba5c31783a827b9728d5bce1b4c5680c387587e74020d64abb9028e347fc5f99a6039093e70afd7f35b8fe82a3a3836b680921b6cdab76c1c0ec70746942b79f3626d67b67f53a90daaa1351e8101a2023085ec6776d5c39ff06de7bdeff1da40e95eae51ba9cc635f4f2ca62aceeca90298aeb2b3b2429b89767580bbbf97bd38eec61bd190d47180379a1751a56a9b32ac10dddec5f342d05f0cc320d7314afae1c944d53a5e8ef297dd6261f55206cf748cf43a0ad877ccc263532ce7114d1aff2b59bd08f4e0599c4b5145a10cf11ad478e63addaaa6ba04d44e4feb9a335d6ccf51ddd69a530b9af217e80573c3ea338d05ed268dcdbaae3f39149c47180abcf02a6c9110fb228eeeb02967588a226e8000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010545f56fa6b8dc15a1a4425fc52181e8925f2f74ffb207a0a37328f6931d79c7021e611dad4cec48b9417883cabf047cbe8bdcd4e512951eb3ca680590e0c97e50154ea64159ffcc4d42a76ff38af8ad40a4a7574bfb81aabc3f98747b6f51963f000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001174ce226807036f14d48b310d03ec647c7cc25f35dcc4ef7fca88f4b62e404cad24f3a2e0302f1a43eb4912cb05b4b6ea8150fa84b690b626a912bd508956e8e2b05e49bc937982d12b958b151472f48ae0962e1df55567127bc71c217566d0740a391bc1a7e83975ec44d7ec6b3b0b111767012d7ec06005dcc29fb3af0ebf9df2a036a9f2084628ac95139b50f5e4174f48a14ca3a2a9452f39c8f2daef312ae26cf4ab745dc51adc9991e1e9b45bf18dfea0c3b3aa78d4ce74eb90d98f8cbc722a8f997ccdb78dead439e7d7d77b0c76ed32fb0fe5f60f6141546138d5589db6813e97b4612dfb3cfce3d13791ff3ca45eaf6b97e101547c178a7122d3a2f27e4852057a755724f591818ab2300f94e6e0c66106f8d72b4cf717c22b2bd61163de91cdd5e3ca7e64844fb13e65535f935c5ec0c197eb91c152a17e04cb0eacba92ff3d7303c23440aad51348b30a2758d4aa73d3f4dc935b231bd42befaf8487663763e33bf7cfbb39276b8608d48bc4b4ef5c61c7a9012bd64dc2daf3afd8551c37e3d077e3afd6dd510fe0a7e95545ad46a95f5c7dd3401ed0d3f559d9b0c4ed002e6ce8eed48f41ca789dd5accb54b1208e2ae0272df280ff1e97aefcedb498a8791a0cf654884fceda0faf296613fbe5a13e0c88e8b0078447b364bd000002280000022400000220068c770da74ec7e614d8eb91f594e7be61422473f066e4741bb989030dc0a73b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a165d114217a2807c18eac67f631b6ac86e55e03dbed80d6565ef97e124d3ee83fb7da11e69a4937b52b4b5dc54bc2083660e6d0046a96a52a08a4ec547507e9d3a3ceb9cc8f9c9bd8a97106fdcf7d4634dfb5ee85124ef22a888c57ed8fa85e650f0b5a05155890cf6236dd5320116ef0a76cf9cc207d4ddd433fda398ae81c925d80b557a99ddca20c4d9e9b6312149b4daff6fb45f8fbf5f759c674d4a1bd57ae8d7ccf83751c5aa7df38177a602704b4fff8d3269f6a1d741c27f2daf23e8e2a88df1e7af35e7a1b917efcf290ddd1a55cbc9a84ef4fd9772e2ba8615cbfd90e2a8f1b4f2f772f364449a1969ecad2b40ee48608d02adfebc235bf52a5f6313e5686eccd18f7cf06bcbaf2cfcdbd8d18ac12804dfde2631ad078ffcf481f8f21de2341ce64e4f694380b2b40c96b5f8426706fb0c58370f177f1976a371724b8efcfc675d1892c4662ddde486fb237240d2c1ed71003a4345e9cfaa4c22fa5a7707e1ab3301a7a8fd597f1d465d3977636486bf761e49229863c41b65d7018dfa99c9334a89153f18fabeab0e3bd3daab54bb974290f0d42811cf6edbce196a84f90ecd236005085055056759ea50930f3f7149e5ae4e20f478738d84d7000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802216c49bf753ef03954138955b20747faa5fa60c9cc8770b4496850e31e06534f046ef8ac0f642c96a6c6b94929abe1023b28a90eaec0550f21f38e3889859fb2021fdf573b17f01dd05254049b68d10005e9cddb1f5090a0a49d91df6a399f390c2c40065c1c7ab6a610049f55e3d3ef995242b4e51acd87d3a3b6f9f1cdd9a3640000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000be31c7e9ba3cbe32ba4eb17aed4eac7c230e0ebc256de99595bba91d4f016c2871579cbccb058cd727dd049218021f60e969f87735ff981aa9c3df7e178cfc53641c66e8d57532376f8ffee45dfa329ee185fb8e59cd1372eac7786aa5c7f269c0e5864058cd3cb62069c23a35caaebceee4123d3cf98bca843d7169c3db99ca4331c0f01fd5193aca121befedab21c0adcb68e32bf4f13066af473ba46142b1291b8ca2fc20071a57a48a13680e8f6203eb93f8766ea10db6023cb8c4dc748e17606c18b14d6212ae0b6ff60a16160a6f032c4431ea051dd5d6345c22e225a06f0f73388298d2f032ba791227b34653b7323f2a0ccc07936fce222d1eb548651a2debeb097c002499c59c27c809ee0aedc6181835da6c1e575309fd59dc7fe418a01f062756f0d13c3e475afbfd903c0e955f86af42f848a15c717b6bec5e198a091024a7cca1f2bb26c95b0bbdb06166b009e6138d08edb1afaa01f9333e53f376436fd034a6a03d59bbe7583c8d77ef8438de10e5fae1c223046abec8eac54abb26ba8b64a2b8452fd29522945eecfc71adf71237afad4804a47ff5a33398df7ac05fe35b1ed35b71a3cee8ccda258936299cc5b4dc491b2daa7a284905300254c3a496b9b7d4b19015fa1aa8634b50f07edba61180414a8af63b78e3349000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000152f363c9a0494c35e820a6c484fd5e99a1476bdd78f15fe1375bdada516c7f0a61ee004597155c9a2d12997b815eca61053ddcf22dff60746b8692012489175e04132836148d2956843ba9ff9a513780dfa8c4e6bd3adc570a3d994e7503f2bb91a1c5b7ac548ead488990e21b2a199616903eb370beba4d6a45daacc9fda683878bf9b99ac4aebd8d4578fc1e2782ec1b57cedc5518fd69342dab42fbb98ddc88648305ce07ff4edfeccbe57872c293984e553ba80670ef58c3cdcee5c00310318512b706313707a45a171e6ca1f3134f4280a4975171b681bfa7065d8030b36f567ee49d72bca7005a37e714695caefd01931da6f1f1647b74a44028edf7fd88a522efa81f59de80eca55277e768dd0f12ef0da41562af73dfb5f812622ae41f6f7de5e2e9d0cefe82c3f27f405fb96f5c784aae9da6438e94e0e13ec99b4227d01e29c58ff0ad521d09c75829f779830909a46a6bbcf60b7c01011f16f909b89f01dff379c3c50a76644ad085c4cdf281a1097be956eee2eb6e1418ff878628fe6fedcc12f961962dbc1e1a14639a7a40bc2a8238352f37080e2f87843bee76066d81a5e87d4511c6219a4a5afa21925588782493296a889a3f38dd8758866838cab673604fda4bbc5fdc3c4892ea6dee6246c1d40999e53bf007e3eb36f0000022800000224000002201d04e90b12b81bedf307aa9982a95678c924a5bf814a8b6f9f551323df150712000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c93fde60cf605175d2108be1b7169ee8cd4790a482e9934add7fe4085c630af41808e37934dcd36b7d1d3a9047ceb7d2371a56505b907f8f8f3020d4f822bf9c01b7bace4e89b7e81e78b6f1f3797764353eb40aacd2841bd4e3506619674d54c684e726598f2039cbf3fe2e947f82c9182041e1f461d8e5a646f19d12d63e1ffdab91c661c2f7f8a3e2170838bd64d39a5cfd610b4e64cc9ef25938d1b59aa1d6fa8cd2c3a3ded3752caeef60b033b228e81a406a1bc29fd79944d87815cf14472a66acd729afd3e9cf20c577b7045d9a3c300f9dc8e0ae5af68258aa63efad856faa21820f2fe2c6eafa7059899d281eda897a12a5fe1a9dc376332ab9269c8f372337273a8b612994495bb96f1069a6c5e7c9a050d80126e78fd80ce54fcf5f54eaaed7e80933eef6391ca57df3db32beea5ec06664c923ba657280bdd85aa9ce18af485c2ed3c9bc9aaafbb33718da2ec146da248c1a751584f281d6f71a5647bd6c0564704c95d9ac80fedfc4ca747bd4898c9e42333aba8b9bba4e130e2d6e7e8aeeffaf935d0a2924c31344493312f9008abf34790f503e5709b29946b4f81adda7a56c9b1fc308487e9d4ac87d113e2a19bd9de07fc2c72ae81b204000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802154b28aeaafb1fb100333aae6459c5b4f07935049d2888f8baab6605d5b62a801b634e0ad34c165a7bce7a97f78fac648d071199cccef9f1f902e5a0836821ee022041c3e765d5de2d9b56a092cdb1dccdc8781034dde9bdef7e7e955a839f7efd0d0dededd8ede6ca4444ba40a67d6d51f84c4ff4508534d2bb0aa33c4be8f1c50000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007023ca34a6de59c5036f524840992bdde0da9d7f3a6aa5755ac3c9c4ef4106b48e5b01101fcbb805bbebbb9d2da399e43da1739838b46dd5209d1063f589ef427fb2a142723c8eb21ea3c99924f7ca8e1a96eb44e832aec2d055f700843b9cf17d65ff709601f675eb4d324045370d3b7bf05c1dbfc08b27b47f3923e9afba91a84b1338d3dc5f5e483643fe81ef4b1085f1e861058b7c8cf94b477ec6930d32bc63c4c2dbbdf84abbe1bf27c0681bb184d276dd7b56ee31819222e61b0cff6fa3fe20022c1c589993599e6067d4225597c4001e8c178ad9211e707a4e41013e15f92e4a10d28fb207b0d759aaaf44b1736732c135e8fe55922755d0a80f27a749b823dc6be6aa11b4898466c56fd58fea0e1bc8f0b8f6c5c76c819c5e7f7f3b7247a3054a13500ef64464b4ed52282f83ad07cdb32f3356bba7d9b6e8ddb4276827eee8474df74c64ee140e49fefd46d8ff73323b5cf1c9002ae0668a4a706e56f00b76577053d0e7459b0552fc15c82a3e7e1897bcfe734d5db4f612817496a23d08ef9f2b7072cb406fdfbb7c7674a64337459ecd0dd50888cacdbc4a8ce17adb3b2f767a5f7b5787727ede43f410a1558363cfc0be091666d2952134356d2e42d6c976040615937fc3acc2e9a64ef4774c9e88cce971891f3e47b0697b000000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096b98f65cd7abdc1bdbfd9cb022833c86649c1e1d3821c1a2bc9738c93222dd6b2e55ca258c18e322632c035bd01d24bc4b06208c593b3012f952bc1e9a1054cd6b2c4984dc27f376e31537214f6e7901261fd941d6b515997f7298ab57225792bb06ec582d813582eea3cda8c77d10d2c6248f7d620104ee42b3ff32390008647f39512af0e951b2342e8c89bccc507cd954cb5012dd45e50c36332af9fb00118810da76b9f793fe3e3dc04dcc0638c712681de6119d4137505bc9a989816a2b523f61cb0074c38e4d10c1b96214d4b97f20e0a64d526e067c9808357b8c05cb2224912f66b75bf94538c9ae9b7dd2f2ba93f57136d0f7b989b15310ac56fb78a57db4b1c2bfbe5eb810bb1a9366978a00938f1fcd3a4a39438bc67137668fbce2a3330af1b1d8f53f2ef1268721c218b2967fc59a978c82daf40360caa3d007fba587b856fcebbbc4573e0e555687fb52c0f6f4e618966d93274838a015887e766c1812e1dbd59208f87a910f99c1c60e5e449ec208ac6f015b3045769ce540282fd7e0e7a7db8dad9e2a6e08ef0ab2558875943fbb52c74c19b285e36761eb191a9ef0b3341560ab6a7f887de9c62e20562f61bc4780409d75e7aad25c4be468c7eebf02d4521009e872b99cd90e6527d492003414b9e7882f43ae8ce40ae0000022800000224000002203053981721e755f4e51ffd968c514a01f2200e69be769d0be0379c73b2371401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000363059a4c2bc99fc2d82c8374b57a48417c38dee460af8aff4f7b49cc04144a16125da298e8088a297c853d30bbf6ba28b62aa643fac34c06dc2f866f604389a409fe611964d0be417b29c29adb75663c1ad21cd01909f0a612fdd9f217b77799e3e8ea163f99e61a1bbe342e64c8cc11529b84e3849a73da4f09020f1bc2734ab964f33952103cda812e4a6a1fcde3b30f56d885f6898876d6ecfc19b2b323eeb8300180d91abc148a7bb2d664da66a9a499036c0f45a0fd874129e0adb7d5d8f75aa5b9a5d1220684dbc0f5f11399933b94c01cf72a67a5534d24b8943f1dc697c89fc35436831a16d37abab88ab3531911d48fc3d8f8fefe0e2a8a94d3241d139125587dd9d1e93a6a88c0031be2ada51696deae9c8d6751bf69b2a1483d0d8f3b10ec16441bfbe34ef6ecc43fc8b12db57b2bd75b3a3c47d2d06a9a10536f0a370ca95a8a894ea5cb08ff6c26837adc4d35a8956352fd971cb6480cb7bf068f131335d11e81732445340ed5e8914989eaba2e0d12b4ea68a6a0a55b8a27d3c88541843408f907850aca6a58b21dae5c3ec1f59a1b843a1389804e9e99fb7a4743a0dd91366aa82710ccecd616c5b9ca254984296df6d5209d56a25e428b000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401046a8c3bc6a9374910994f9d36e0d434985a0d16148952107a8d4f84f7c560340221175c8f640aa295a8eb9865a16bddbb333918facaf0a1e5430d9a842437ee6621f274a67db2d20cbaec9112278ccb995228c55ad2b4eb2fc95f6a4b5e88b157000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002370674cf6df31f509bfa2c6d3a75f42e2b7ce267c799a28dd855dbbc5d36eac684d1b060fe686cae73446a20409de6d57d2aba299dbc1b6a8aa7bba59d2a064cb84e54b7305432f94d1ebc311e1991ad5f68a64bfe9aa5332dddbbdeb18b09ef7e6701fbfa84861afbdfea0a53ed02b4e4b619614087cdec04b78dc67d0c1be9578481bdc90a0b6e385fa4a9b652361734ea5cf1762e9ccae6938a265f529cbef2f7a284f1c1e862c2e8412490c9a1deb55590d0ac39e235b3f5d4a30afe9c4c48870bc9fb2c17fde934d8328a78eb3221d2c576927da5df7d535712f30644d3051ada1b0e12ec256a8e6aebc162a55495167fbea1dd20a443c96bb3dd8989dee93b8464983033be8cd73e3a094167858738e313f22fa00f29c5f1c69130f5fd5f2fe8e825810b3fca2469564fad20b412f0b59c65378b0b1cbea607d570d8436c2febba308f9941605b64efc2e93e5b069306347f778b00e5357201eb2b298fda482c081299b4f9f2baf89b066eb8745253bb392aeeccac46efab27ecedb68371f9f45fd086b164ebebd2a01e85465845499a83e486f2336e532c5b8878a99d85403a7397f8d751ef75e5ac641718769b4dafad8301384aca86aa278add60b15098a1c564e7f66419417864a2beb5de632f6ed72c014e584837fc39969038b0000022800000224000002202b5a5709c8e8a7a307ae59cb823c7162c48e979e1e14338f313f65e1c64443d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae1c6edfc3e72e010373295ff799a62f8f47df0b5cf9d79f9e21e2d876d932d82b15479d120eb550718003a86ffefc7d929f4e21e67fa25ebdb9043d443470232eded6b42674f7150d381135ab4f88ca980bbdf0a2e9c1f43193947508b565ef673eb4ad172ebbbcd27d4abb5d5d2bdb353a866952ed307d0744973143eee7a8fbaf99141eb97c9502f404834ae6eb485c3a35e739eb7d2ada0594528051bc3d400541f3b411e3223bd2622d28a820e6ece6f9f6b00f4839db64ac1c5af9b57ce2c6f92ead99e0e80dd03a691eec470426460ebe857c32663bb217e99a041a70b37984fc752b463539ae1ff6245483937503b675ae1166db212a0df5f41eb1eac34a14b5f4ab4b3d3bced5c53334aca4cf678522d9e712a8e17cd18e68bdd283ae76b1514194fe7ab5814542605d55c386c8e1d4b90dcaf057729a020f3d256b2a268df43553c54044832b87ef2cec48bb6079c4c2630cefe4ff7b3c77294329cf74af7f1037f3bb20ca00c606844e98a367daef9406142a9668cb9260f6ab0812b20b202a580462d42914e109555e618d7b137a189083872db25b57fb784804503d0fe77965647c6ae1163331196974a84318bfc8155c0051164a3159bc7d19000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010b947fec9c5a531522daaf4f0b24a81804d633343f9dc3373900bd024b98751702243a894924e911290796660b1659249f4225e856a7e7ef02507f33f7af77471d286c505fc02e84f3a41ad37c38c02b998918178dc5d62a77677283a18c96ba6b000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d9e7d7259de33027509c81afb48bc21a65cdbf78648843765d16b8c8ebf8cf49f03c92dd429f727ed755cd84cd4890c464dec40b517ba69e8923cf77f07ec1ac087aca5857dd3866aafb91733debff36bd52c1fdae9abce2d4a4848a9fb776f3d351fc21d80a0316b9d066dc53c02f90d1855af907af4de83133008b10a1c87185a2586c2d06228dad1e33dc2e402653d00c0cc0e925bcb4573df6f5e3a1cd77b69fc4ac350815d34bd0fa799cf954bf03e084abb6e272ae87f46e61c3d636c4f442b132018ad96a095396a258a9613e673f2fb0ed0293c65eb64d4e621345962f0d39d3c69c0d0cf278657384f0f156a0291b10dc1ef33e68360c62065e44af8da0280fcbd9b992db5ca8fcd5c830d3ec5262e52ff356698deccee2e79da8f0b0394f4fadd1d4c107525070ea47357b73c4c441b994e85330e70f2d22607d6049b78d548562c695412f42b40cd04065d5d1885b0d8352de2c523dfa7174c03c3ee90684fc5b751f4d1ae6a6d03d9fd32f8538c9ea4d8e4f89e3467343af8e91c67a31f55ab00bdf1d65d92cc250c879ff1d886735418a6dbebdaade8194609ff4910670156fe62d0caf5cb55b1b09378ef470950bcf019396d6fae8823a6f3af9f381e226b2c318add28cab2bd3806fab40924ca01fe3afe181d0f18a1625f000002280000022400000220028232bcbbc04fdaf07b5c9d6185585ecab0eb759af4c24ac7fae363bbf9c5fa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000930f8d24ed973739f0495838c5c893e406c6b5b88b675c5ecdbfffb81dee07e6fa7e51ca51e2c82d43271ba065d9e62f597a5eb5c672250ceee35f9dbc3d3e76b6f6eab52604dce02d2338e3cc0d37a7d96a5e9eaab4897cc6283005dce31ce24d122448dce9b3c260590ec10d90972bfc7c49421371b68b3b69a005e4b490c7f0825ccee88f2d78d02f23871da89374d275970ec0113ba4f1cf14e3b5c4809ce5ecd5c18963d0119073b4c96a7a12ba0868e5d181f9481ae9f85b52561affad0d519dad37110436e01e8ce2ca23ee5a95841753053b73d3afa2784838dc1fd67275cbfcd4e0e816abcf3e68372c770ced6cabb27fed264fee651b49462017979e60fae762fb32f482c8cf3a41f99442efbdd1292070f4370b1e771ccfca81a914f8ac66872758baf417a16ce185258abf1069b89b86fa91ff18327c9a5285e803f8eaf9bb2a68dd9570109166ae24d4afe4259473d73e0adea52b1eef3ff1f8d0dded92e61515097d6096ae307ffca2fff33bb598853ba7ba355e304312956d92fd9344777c2de07b3528ffbe5b8862b1a9655848ed34d2d8e23044532a1aa3c47f3737347b7574cf926830ff46661b119a8a0e9e85b57247e904e27ff033e6000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401048d0c3865872108347d40445f073b0d34284b3d5443f4063d684400699e9c7402254c1297de2fccd31945e9c2bc4fbcbcd58a83a67aa67b7efff792b072f7972f13573c27edcc18204a8b28f438368105f95d9677a7fae4412b92ef3a771679c90000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002acd0293e5a441f6271fa28b1ae09b8848302696e5b806933c3b00938fc5d26f69c899c5d68a7f9d495101a0ad5e287857bead0f3ec956806768f967acc156ebcf8efde38372b28995e2f13dd8731c67679770f140624d6d3c1f104046776ce1352e6c5556eb7906b1e25ded5aa78292231f68c29b060d83f460148f8ecf232e60c10e62af2941b864342555ab57faea0f8b146311bc05e4933197fe83ab9a6c155047cdb0f450eed8ce26e575063aee47a7eac43aa92e0300b3e472ca05100756d19ed0de1ace6b03e309880fce1d02b569103756dfcce9f95b4d676377b126b81510cc7aaf00908b14a25703e7d3b16f0d639f8c07000e2dd9f9f780134fae7abb06ae75a53925167bbb14e4076a84ea82d2b3a916a0e54d3350f260b8ef6c66a870c6a4f48ed4be9f5c44f69c7408731adbbe7076cf4906eb78c86ae7c8b217be42cf6ce4f6942b95dd956b3e330459edb6c0c4b5e3abbbd4dcb37b9920432b1a88fc122f4cd4dc0d45cf46a9f2987d17e56cf9f646158df1dc71aba1de40a64d32790463fa0d09021cde86acc3a4b944f844b7653254f72a8b8563cec9906cb1b9fe438ee23cfaec30372148e3bbbd7281004aeb8bbacc5708e71a5406f4b4ccae153d1d187fbf5fae4aa9ee6c31647f621d42d26fe4d72daed369e05ed00000228000002240000022017132234475d0e73cc85e7e9e4966162d9a165fc13d30ab293c02100398f261e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070a70c6a89943e9808c7c3deaa1f2d4232c08ca1afaf9b15dff2054881d1ec832adbfd7d4d8319035c55b654071541da22190a651cf49299800410896b823b12d6e47bf497d75b67d98e6aee2cb973bd1a63f1bce9698526e18561dcc1bf7037d1f41533ed78d0ab0dce4f36112dc6479f364a19c29cce0ec7e0a0cf88d19df2408b7a51221a8f578fb68ade741d76b91fac3c42364e035b871143cf183f267b4d95a1bbfce589c58b4d4e9029b89aeef69037eae27638c6516daf6b28403dd9cacd32e267ff531aa57628ff03bb9c9243b1f385b8e09638507a056d831a656763866fd12542e58340ebab26a334b530c056ad81c2083f94818aa9497149a9389f873037fcc608ef529312cb5527970969deaa635a06e7c9b0dcc63a4a0a8955b1d0da7607eb5275ab4f53f6ee92f8f63ffb6486cd1eb526e65e612d8a26ca011cdb025200bbe3b8027b67596dea03b6af65d545bb4cacdcb1e39db1476b1aae121c59d210fc32b5dfe86edc3ea874c19c2f62ed99ae036f82520f1369af2552fbbe79f58f95e0c877c7aacb022339c7b66620b62aeb6fddfd344be31d28d387be4e535621c770e4d910ddeec34db267bd831aba80d73795bb27c5b33db7ef1000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012522898974f9e2f846631054907bd48767bd9ef36ac0ea13240884385fcd49680228b5aa0b897015c7e39c5bdd5d9bbf10318df22d70fa76e62698f6cd0f72551516a657825c012390e3ca418ba18fcf2e7dd181777335d54d040ad81c8b68b4b700000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000149578e89617563a5dad53e666618d1936c83de5509eed7c7a22e3528db5ffc5585523b0b18d8353e48b4cfd761fbb1a8de9ba9275627ae68bf4335481b0fd10291a6e0fc8e076e8d60491738e0da619707e82819797925304e0c755a9e22115f8d6a72dd988f1277cc1cad655420740fa9459ef62a32ac02a64ae11fa33c083599532e2ce714205488e6de194ed0413ad0ba81efa8f4c050d4a1c87cd116c13a18c38e23836a85d0026d394bf9da6405931fe711b3503ed83e6104e6e7ca3bdf203f65595c813756f767112cb8d784b1e55f866454c36822a14e4c5be005edd124b2122e8d39140f768eeea32c12858fd2f8d05a974cd420f2335bf9ef6c5923a7550c0964650391d5dae77aeb8e7c443998a2f5b67f0b17f2b3686a41981561b80c7a1f067137552331f364731cd6daac44a2bd048199defcf6eac0222e63f6d31ecd4d63554636cbcb6e7fe64ec9413a7afb44072e82b05255db7f6cb073424a1eb1faaa9317fc6a844af2d4c69e29146bbd49156b41a9fd8f5a32df4b7aa5ef212a38782ca99ae47a94ec27620049e7d86a115dc2e469b4ea144c02fde5b610b46362634ac8acaa1bb64c41d1bf51012ce6dc7c27a9c5955650d9fa82a85d9c43cc81fe8061d29d983ca77f7718a1419432c64e143283128327f079576d10000022800000224000002202fed16ef171224e011bf64021fa9f050c43c425fc6563aaa332034065584bb770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012bb74520169b83b925f80a5a695b1ccb9abfd5cf69a5c0ab963ae24077e308ea5c6b1be4cedb1223e8070fb18ad8610c3517184e5d9162e21016674229610da9bfd4eee4fef46775aedf8cece47a972d402bbe36a7ed346cb92c32c602aea8dde227f556fcf48866342afa3110135bd2f15edcca574f5e9e22c5f1746b16463925d80de682e72ecfe876da14e7e7eacc7ec083523ee98f44bec470487dd6947fc6f337c8a4725db9493878ed987b54e597c7d4acce1d640748b1d0f00b9f93d3399ad8f8a672d7538de4f4cf840ca8b0a9fb24ca73f66fab10f7e4b98501d1462740dde952785d3e802044722bee193f39da92e65ecd0fe4245e12e3bcbaf6693b8242ccc73c69f717731e1b3c434178e1b8392af3bb80f7daf9507d44548303be9a8becd3ddf650a15bdc06cc69a552cd5942b19e4f79ceadedaf16a1531a9fa09f4c4fc68521dcb36625e207fd0ba1d27282e489ff845505da212cd57d607b73a97248aed6cc8f118d5eaf7134999c7881cdcbbae1a95e50f2509dc1512f507260966b10e52e720a3a499747482a71abb6ca1b1d4e23ff71a156c5cd4fc8e4a841cc89333b09a7bc51d2c457da95e6f81dc45fd625f6c36b6cb2bca62624f000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010063fd3ee55f6ecec2129e37c2313201107867e509bd83d2263c2ff6556b2845022ceea85b8303be87f2cb016f42bf17ba85319051794e80f1d1e2044ce952d8bc2bbc1d0159165400d00fd82c6a4b911a3465919a37e89bc719645d93812ae077000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002455a88b961d5a7b266ae8e41e125d0dbd9ba6266ec1035f7ef75e609ba2862f1b56171c3c2bec2daec6b4232135b854152dc8e39a0d8971fc561590401548983e36540f4345439c401a23f700123999c8fd60a6d679a46bb0d1c5ec60a63b5fb3484c6ea0eb3145c03069212c3d1d8be69b8ed588b2a32d6c95cb9ccee6701d8372223e6983768c74c3d124a8dd1c649bea0d41fe76ca0e224d13071e74f7b811db2ebe5cd0a132ccfc3467fdc16925e2a7c478b96bbca8ec490dfe53ebf57fbb8640454460db069bbe230226ff06234b5abae56878a9e2f15f1e707f54fd38021bfe3ac3da846f6cd74a195369f3378170160e54a878679d587d353eac4fb9b02f13455dc223ea8207627e6f39e11cfbb573e18f55172768855ed4ce489092dec3df0f9827a8c3f785abbfc09a6fcc453c09a1aad7e39ebf214b2ae73a4b3da318092d7eb53070eea678be4208d19eafcbbb7cab66a4ade5f8509f9754c377031d421ade6bf56c3ba2db66a606d6eb3ee5912f52572ed3aa6f93b1ef8dd4a72edea37ddf8e0b91ba7ae76587b561148685a9be74f9ac91d474ddb0696e769d156bccda0496c856c74c0d52e896126c08769e36b7f3971df34f5517e3d2435007c9f19b8c1bb4ea6ee4344891720ad3cb750a23c27e2928e19af58c2b320b460000022800000224000002201711187648de04f9f80a0543ea16d2b0655de7da6931d661eefe5c3d0d8a052100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083d5a6b90f674f63da9ab14c029c1fbea7feb343fe0b5751f8bb9c308486bab82620b1d47f4677f91f5e79d053a3834c7eee18601ef9a1c3f1e46a517e01f70ece9fb6c74dce11205bb96344542e71c02045aa6f404b480f3aca3181cd5758fd310721524bc93ee315284438452e55845cfbe5b24fcbaafe68196ec566d89948c9098b4fdd633221d098fb21b716902f32a42f08ef7f0012134e3d3303af58535268cb47b745c737fa2c8cb0e782dbac2da73865d1d4a88fe4bbf8f47bc0013af49d7c5966a364ea59777c4df204494575295db991cb340ef9e590095de85dfa997fc25268cba983f42d0386dbeae6d01d47d8ae9b6a9ba38a881e2f67a0cefdc788b82adaa0c757cebcc7678b57ba1de5a00f1c7fa58ec687c465836e0c30fdb51d47a6f845c56c4615065b7864cee49483381e7f730f971012bff1763ed30441403e776c81ed39fc4a5fcc56e63ed020fdb9b477543b2438e00e7c64a61fc0f42ca19bde2175a70205bbb7d8c79f5e4f7a9327921d5ead037c0bec6e8fddde56ad0a4169a6f7800a24d93313bc376637526119dc16012600d55426a891010e3eb67053d0981b96677d410ec1dc3c66596e5fd692b780cdcf06900f7686772000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011e3fbfe2b8a42a0b0ecf43985098a1f706135343be86fb6911f697c854cc969e022cf6e8173ae064f08578e3ad61a1d03a46d0860fab28268cdfad76cefcfb8720215ff2f2b6f55b1f50ef80afe291aafeb9ad55cb35efc673a2d9d68d2f407f600000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021061181df48999132e581cc8cb6e4f84dbf1208e3aaef52df80c848a19a9ced1bc1faceb591976c6fd6a6c55d1b869952bff93b8ff8beec2430ffc1c442258412b518462f9bb1a73fd62da86e11fad9103c8cd5e097d80b7b52659b021ea283074106a76fcaf20aa3210f6449320e8946190501c894600d512b52450b29d922f94bb35269a079214eff0464a76c7f319df3f910433c3216d440375953c31e6647af0e4df2993398d05c00170f72cf8ecf1179fd88ddd9958ae3a3d8ef0aafde1293d06bdb2ab02fce456fe20345a12e463e86991e481623711633dbf061f6ae6f2bfc76a39248f465a33faded7cdb4a543ca824d200163258e7b3dae4c4106559212b6dda7e238d1aad9045231884bf2e126a5302c48da9f07d2e17e788adb9cac4b094ec088acf9e219abc8f801fc0309eeb86137f3757755a020f1284e3c59f43215f35b2ecb1b8baac753279a643a7d7f58950ff5f0c079c68b2b549d5d9ed5436bd8805109eef43be3ab3085d93b0f08ea661f4a9164e505490023c80bc56c1132394c2798fe586c0403200d491c554573dae3f17d44629aa4692316373d984108442c37e8141b1821ff84af95a4cb98248d2d66b0bae40b9523158283935e6b83e6cfaabf706e5d30220723b1a298170758fc8fd116d5c592c2fa559f5000002280000022400000220212ed4512fb3d4e3f6316450b8d49a609bb23ccbf1638be44e94259774dfc289000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b4372f230aa194623d11ce949b65ef28dd665933e342ed158bfc5cbabe4ceabf931580222d625d039b2770b2c7babfc2f02ac184182016404e33db05410700cb7f1a8c6578775292299442454b71371eb44b9d235cd1e2f0447bc9af387752dae4c7304c735216deedfccc858b233394412c3c6d2b942113920fc0014de4c53d669185d104c3c915dec3419308610bb601208393b03860239290ff8784ad09b47b0a9d8dc6dc2ab9739ad872cb132a511e852c9173c7c1ef3ebab7f1dc51e0dce19f8d40b3afc2aeaf180f0db7080f5071ca7b396737175ec02f58cf4bee8b785e6cbaf0ef99695752da3ea636987672824dcca2e6d855e466c9cec1fffaad220b308bc346e2656c7d49f4df0fd9618143d576484e412f97da01749ef3a2ec68195a022c0ce03b6d8c707baf22725ee5c386f287d3987f71288ebaf89b737b75a6ff98087fe2cf4a564e3785a1599a91b992923947f65afcbe47f0633146f2404cfcbd1711c03ed214397b800e5fd3a032fcd72d052937eb8aafb16c8e05598321659ee1c29064326a544aded22c2f835599e38dc25f4af868bce62ff164ecd212d24193b63f981573576854996913b73d8f0382ba75d7920def44cd6ac30db000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40113ccbb2290e0e77f0094b907565adf9465504e79ec2df46de7e326f85b410f5b022feed4fda9387c466640e0815e76868e51ccec6f952dcd57017d1a5fb23ef1f902c9c038cc455eebf4da70e69eb82cb3510bc37272f39cf5704dabf2755ce92d0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095a0e17b406ca7c329583b72f76bb5736934519aa0809b2dce4ede20b332449f7523c68c9417837f807f778f5dabe08c77d4f3ccc6e09003f6b36651040f3509d99bf996c2114f4c5f8304bd6c3079b410677ba98422a9db888017b91fbd019948471f57c3b6d406d27c1f9b1e69aecacc64b7d647ef5f0a2ebda15bcdc5fbf08e0cd5cd1db68df8b2e26efa90ddcbcf7579d7d6295e19b1324d72aea934afc440bac1baacda388613836f024435990d410e410dedae8563b31c3ed283606689467911c5ee4a2b42484f85b19e136628902d72c332c65c42ad38baeb1d4afaebabc04dd7ecb8d1ea5e5af254616e673c8771a4c1a3fbcfcb34a3899711e261e0973827f8699e1a258837dec96a12a3e41f5c1c549d239d62a833b1efdfbc2ab427b7ae5a4867b0e91435b663d2848492d7ae6da559cae4fcf97ea9cbc598de42c966ddb32e49184506b7a9fe640e278dccc4da7e06dacf1674a8094d5d439cc28784de8694875bff29d14375e81fb695e414f41e85d7f7e3fc8cc6252c93bd835769a0efbc74bc155641af78c7342a56dea120ead54cd222da2ae1236ac00eea1fbcd5a9474624d72a2029a487b92c852c23e41d9dc8c7f4a64ec631dab7396f42a150a071c832d50257407ad0c36ba9b1da0ad8dcbed833cb9516f2622309c80000022800000224000002202a09a0549c72dbffec6bcec21823811f5363a86153b695b9399c5ef848b4774d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009efcee4652f666cdc98ae25c6eed71004e5e1c81ec6f8e2b90bdd0017b8005d43ba2f045da56790ca48ff1b36f3e53f633772977d4ef7657f25839ab21dcbf3c2cca3308de6e8e86fc863bd7472b7f3c85476d74cf18f0082248fd2491b06a1dfd3fd71de83ed4b7ab673e86a8e737b2bc10ba1af2c89669108ef991162e526fa13ac5ae1e2333b5c79c516b3121b61c5fd65bd5faef96e2a20b25395d17c6c5d085dd57037d318475e3fb26c93ec849ab7ebdb7f9f80c7c7d5f249bed4f192db56f053139483b1efd6eead6dacbcc22d08b0b328f48fff8ec986884ee4ae0d26b104fdf68bb35e3069ae605f68968e593019abe877f44f47f38782fed09d0795079751c8ef35b6cb45988f71f24833483300520c13c8bdfebda0c2a9f669d9a61bd0b711f4abf19155e836f40c469aeca2141770dd4b0e9dd95df86b9ceb48646aa3cba9d8b02ad044691e11ea417363cd8643a629e1d8fc0a967209c7abbcbf80c524de433027b95a994915f3f4bccc547e1b9198ce10bcbbebc90d348bc4dd7543c60ebd67eca64530418fba6138953f1c94edfc9df74ae154e9465fb7aba78b886305993814c54b8febda2591cef0840f5ff519b070b8981604f00ab361e000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40115776194ce96fcc2602b82884b3da923fb8ffb216c40bc7e9e46bd5a1288c15d02300d17b1474ddaf8aaa125a85360208b2c65cf39dfaace27beee4d4b016294b6121063f86edc3cff9ddd841c2e59686fbf7aa0fbb8bea9de0ccd25bfd73204720000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083fd85df84604f1c3ef54f544bdc7f725e6f9c136b697ad101a910d0e662b0b14aa04258c66181e11579d24c9d1e98ff6c164c24f145013f777db009f9eee0869fd366c93fed23a77a8bb0c92c7d39eb09c74ff73db849790d301781e17b3b4b17dbbd428afa213b0a50ba498ee375268f5fe1c456346115e886472b887f557ecebf236761245285874441bcf979f21fedb0720dcf45125b6a31481a73db8ac5d0227e3affd78bd3645f581d03f77aab0036e3c5e192a1ea1e106dfc3be8f6ebef181492587920e585e6fd1c5f4dd8639fa46d55d3724f44d63c8a87e463c3cb0ef4d1bb0717320dcf6cd7bb38309164f60db9190e1f6f119edfae98dbfd4d8b394e3fa2a000bfea830e861693362d5beb6616672d3b847b366a314c0794723c246bb402e8d0341576c7b7fefbad9b0d22a55625d5f93fb3e14e4cf4e774a50fedad08b91545eeecf3c74cd644b100d367eb434110b8bad47509da606fcba6e6f38c16cd8ae0f82034a8b890b015a0d629aa379565309b194fcca34157c5ee76d238f0b32654a4dfe4b03baf5b8d0dbda7e55e7df1721cb3ca1955026759fd07a1a3ac213bf2d82d8103a897a885bceb8d0f3f5676421cd94d4fb0c47a7dfe11d9bd577c6b9890c9780e9ca1bd4d669eb01abf7cc7c32f4eced8cbdf8c25b5ab000002280000022400000220175c3a1eaf280c81d7d151bcb202a45d0b9c0c63ce03155391c42ae2f032c900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008afd62ace8918a5cfb32fb91465be48ae5d03fd7b4f1c26bd310da57b9b848d69c887561e65fbc0bfebd282d6b8f8b5a5436d3391cbdae00ddb135b73a49480666eedb87bb20bb83df06542b5c61e4fa74680b806c43598bd99e86a37e64793206546703207ec5c0ef08e90db2c0aa1e2fe27c443ac65df25a2310d59166033582ecd80c99e6ac4e6f19d25e0e7f3705599b726f31b3d10379fc8c85b5fc86ba80ae0326f74bfb05896e30580cba20e8b5b05434342b8038a599043e037abd99e6778648f69de48287f97ae19372cb40e13f02e558c6bcd2d6410f1e4763eacb418c479239c381072f4ae664f0565c20ed366241220230a1ef118ba06976dabf7e34e513c086831619c69ed2ba378ca3f56a4955ce47e3ce0aefcf41115369d47528fa2b97a292e9483c4cb61552593c717941650d72b2e0427593974636e546b4bd20bafe673911f5913e5efe87ac5fb45e0fe63f51218dc690c2e7a3692f832e467b4d4bc959f6d79767a9ba6f8cfdeec22ed22550c375005ae2f726d39f918429f5aca53aab7f0b151a305a50076491b5ba9feaa551b722c33e1644dcb8c340eb485f666d9f084892bea739ff369074d7c861bc3a75590e3718a01d8235610000000400000000", + "26fe7ce3ced69bb16e054c83ea22fa35593112d36d8b3ed98d532309f84a9e8f0000000d00000000000000000000000000000000000000000000000000000000000000240020c8f71577c4b14a3e832693d46518e2fa6a4fa324948126f5ae88642e7cfb00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000d027b122a421277c9879fb3511c8a674540afa19e786277feb21ea2d61e4398b9100004a800705fc311f916550ad031a52404768aa25bceacaa0266b1f1ee19a158a0ca64f00004b00190b2bd9a61e15de13fdc0dd5db50292162dd32e7193b1d73f6a966182f7db8900004b000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000070dbda84000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad374a102647d8e7f86538d5972d2e11f65485c5fadc5ded0b5a589f0e5af030e9ad783f0000000e0000002400000000000000000000000000000000000000000000000000000000000bec1fd40119cfd248abacda78c0810febe7044e7496b767ef5a756389825a88be4bdd3f2702017c21333bf4f580f27ebf61df86387c22863a2d99b3845a9bc609b134feda020e8c197e97e60ef02b6234517d4e48f426af8c3c7ccb68a12dba91fb212ca099000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002be05a2be6bd3d771fd4b5aaaccfa6e2bf0ee476c01cdfa9518feaf1ff3803dac94e1baa46af97200bb8436fd4f15188b3c02c8fbf29646ae7deac3a94070735b4062e7a6c6763488f3cea68e82742132efbeb6247f532971882f0bb62ac79574780b21695a5af74cbc6e3d9f6e0ef2257ff8c7b5fb156bda678eb5374d619d5bb9f33a88a8e7848a2b73c24c6fd0eaeed45526290ce0921ff4f4097a4650a43a0e57b78d348d54beef0631cccde6771d9ce57d2d848046d3885ade088bfff8e2dcea27044106eb7107f6389b560e2970056093c950ebb81dcfda16d6cce2dc47de39e7d51a894b2dfbeccd39e6324a2d865dad8718a4a09e7205c74ee62d445fd53d5d1c789c2aa68f3bc31462aef20638fdd4a2984ce772888fd4d5ceb18f81f8cb181c6a0fd7a93ec0b803fd45af97f5ad3c2711c79ca013992779fc098aa30e8b6dc9ad8fe8a7b13aeb0b0dd9bb6540601bfcec13034d502979ff264489d3df5dad292b42e6632831b17612bd243f93c7ac9e8ae4f6e8aeb8b7ccbd91bd72075524792557d789cf9a7fde1b65ebba47076dbc2a16744b523a092330358aa1c1087bc45ffebac369ee70a7a050973b61e81ebd88f0c10e45d0fb61439c718daa34ebbf4d1154649a576ee6292a84f6b74bf532a3d0b0e718fe53b8575e6120000022800000224000002200855e65566847dd2033926f67bf768799ffbb814351bced06a3332989725845a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ed681fe6e9b5dbc6e414e877d1dec89773c2648cace831e06cf1d44f93ea27636bae729113db50ec2f46e759de8c84a6594af85fc13c8db1980f1c6be46f1adf5da812c95c883b9b431dd0be622d460b01583ddbdf50509e6016f7f05ba89c1928061398261163f8ec6d88814895b5f63bf5e3aa690810c72a1328f159e277d42e27d653bc9e2e3a461e428820f1e1c869d74710dda4a86e98773707a30e6fde7399a80f8919f82d89c1f0e12779f7cf9128765b8f761cf1dd79801c16440b57e4209b15cea9b036ada0d9f1efe52cd06ec384db1b01f20b63300a13b7287882d403b5d9821e787d5184f64189a0e67129ec67fa2a1e3944d55e0840b89a7a56056eb2e52291b2a53b20c4329c38b1efa0c8b57b7b7586118229de39e652b17fbb0c8e6d859ebacdcaf4f384809a3e86da79babb54996585d6736974616b6abdf4dadb79c5bfb5575dd6af05cee74c3caa90bf19d68527bd8f8a38cacbdae6fd065645dba521e0ad307c51441475a5ee00aba9cf80373fc98f4be318ff308cfd26ba1bcaef270d56a35e3934966a63bf3067350b61c73205354e7f031b35f4ca436c4c199797761edd091b19bbf156546297dfe6fa5873271e47eea9c119893000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010705412f937091bd36368107b3e9a37ee49220768ae6f3cad2e820b028d55d76020198843f4d42c2d4f41bde41678055951a34657309c3f4998c015fdadfaf89a90a05565187ba1a56c5653986b30150c14afa96a764c147276c56fc3cc79ca8190000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082e2ba9e12b4acc2cb3230da4cddd1c81d879cf4c13605b49a300e97be32612c4041e6e9832beb514d72aa9a4a6ec67fbfe8e958914d85a82160df17339f63b0b931bb44bd27e108facc4e186923c3ab7265defd2d2a4a44d6f829a2746d26b45909ea510b7cb86b00161889e02427285b956dcac39a93e30385edaa3e72c6025fb285f06db0989308bdad4d342f97a3aa6aba9adb282f0a65e112d0ff26bf32d267534302d7b6067f7ddece21382aa7d3d0699cd8f44c18ccaaf0b061c181a6d0c8af7e935623c70d64c4ef7d51e576698a338810ea96bd6157c6776eca5c7c8236ae26b2ddb408e7203a2ddb56f28c1793e9e5d7986a2dd0834f8c0f476f1452e972a1f98a7842699882bbf5dc5a7fa3ed8d6805458a1881ee88eb4e93a3f66a9b6c6c8c420154fe74d0a4b8b6a05a5d5b6b3371c2e3183ce8e10e993fe9eed682808920da780042a96ad659debce93dba12ef8cbeaaf5ed65b39b14e3036df07b00267ede4ebf5791e6a780d7d14e141bce9ea73f716e3d4ee5d398b8da16e9a9d85d9a94b99b18862c90b90799c21c48733ec8ae0ba2e22ce4938d11a90dd5fa0466d615abbcaa3d14be8a8bff9e784a354d6978ce7744473d1c60c8d2db5eddd9695dc13e1fb17f5d03cacf4192ed815b9c2e544c6f3cacf21aff2bad580000022800000224000002202bc0b947855ac20fe93bf962f45a64661d44355f545ac879aefceab7768898cd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e6d65b1cbba7346ac37920ca5eb40200ae8bf315a9b1168c329dd2a50d1454d9fa8988630926c4023ee2402293451d393df94652084736618f155fc94006b240e1d48143ddb378e929e9080a07af67e1ad1b1f8ce9d1eb30ec4608617cbfa28c388c80e6fc228d4c1129829d67b81208ea8beb3bc0078755e04a68217a84576a7e52e18d65cde11047f83d90140da6d022e6188c6fc74419756d18426020f862b0c4b7a5e0b375f5613bd9bb9758aaf3f76503a52ed11ad4eb658745ce0f0a89a13f36bbeb8c11bc77922c46791f8d0595a30cda8bb7e67b74245e4d75f64ae225e9a9b8458ab991b518a66bcf5bffa07ff988e5bfb16d5c90e883866624a0179ede3650fe90e00acab627250435634150210bcbeb82e46f0b78869143018f08448e3cb1651f1edeeb5ee446f01bf5636f3c2e833e5a615a4595d5a02bf20d9c75006ec378936db9e6aaaf68c28e2187011705aac0913653ebb39915c931328d4ec5260ace8c3fe29e7744f77278b78622a92a2e2fad643b97ae2badd37d98add5ab30ee9714cb7f21fcd34c02f1eb1fa3fe0ee8d6459fe05347fad62654c04b6574323ee3a1999e8fa70144852ae3e2c3fa46e83df25d51c2cd87a75766c38000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012d4486cd2705b915a9146d137d78d8f141e12da7edc5133f9fcba40df1eb73a80202004fbc61430fe3fc7dc490d8cb3af76272187b9c78edd578ac8d435b9c0c891d34ccf52038e5b1db4d6a244b38144e48efa387a138f0c9734af04b43a1189f0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018d8d496dcc84b0bb2d55bd12e4ad7135055e07331cb4be44d89c914facd2bbe6c2fc5cc13a3a539c7213eb224593062b4b16df1820da46fc0ae923d6a5a203b67ff0312baa3b9786801553ee65db5eb8237d89e62c11b4a603308d821ed41e924ebaf73760bff4822cd48b4c61a76589b46f067a458589c55fdd93c467f32d2c780f713326222fb3d207219091cbc484aada23e6e68d29d316abe6839566afcc9bf75b02da45a081efa9e89773252fe0d07d0b27ff037ce0f04e070a7320021030fa99025575271fd9483176a1a642c3f99e3f532b85101199c702fe15a7193f578498e0afc4d3e9cb252bfaab1de1f486856d455024789515ca4ded4badab0da5f1068cc7b0faf2a2fb932bf393c7ffbb60c44e37095c26153374ef7e1c0df4fb2038fd0907d12025a5a564039d8c4c6865104a4f9d885f719ea65fc74cfdf57a393a4602b05f1581f57558b361ff8ad916d035b61828ceabf1d3950f7e86f0ed44bb815a75a005fe155b54d5dad2b1b3d8cc908792f693da12f395b488f935a6b7503b2d13fb1eff99e2e4e33c49dad3e32a059493cea489f28e542442761434d5f988834873ff2dda02e1a67291c9a84a1c973fd83ea726c0a9378f2bdcb41f2aa32195c13e84f2fdfc81a9b3521ffada1d9cb5fcc47a19dda07ee0f4aa50000022800000224000002200a1fb2cfd2020c956dd1b40e8cfb655a7ef14281a5cb3bb01b63dccfd081a811000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e39b8d92755ff8c31edb7c3cfb0bc322db9457c083d25de832193ba411ec6e43af277f8087d245fcff398a0137eedf59f20194796658a65e0b88308ab9460c16444cd91354c3fe837aecff54c3e920d8fc32004dacbf0fc221786c773c3fa2e3b7e5145088d38b9ab1f5ad8380f9ba0be63ad949514ac76145dccf5a50c17869bc5282d43993ee5f2aca1ceedc2064bb06a91810e62aabdc77dcb8800e67e2d16c7b79e6b443e558fb61b9f0c91af2464c2a3f71875623ab5b0ca6a4118181c60f79a5918b33b32a8029c187179517e4e5f178c9fcc82c008313e596f55cc101db026b14e8435c8c925377d1d949d01c2dc0fff3f2066b7be9776890c20df4113863de95e2c7a985f4150c1ae4a408e8d47c6e5d72abc1f5271f36e48dfc15679c56d8a5cb9204c3da7d7ce4479213fcfdc02bc92049c8f4faf73fbb25348e3a76e97491989730c7aeccd98b4028bf02e301b9949e5f96b62d8cf0dd7cefd295a09f11d7eb64348106ba18a0c2fd4cfaae2faccbc44b171aba05687b53497e9258ad94c25ecb535f3616223d2f7c4b0f58e29bb4249d2bf1fbc457e776507e2dfaa1f8854cd983a30d5099ba6ead330d394248090fe5f120689b297dd504aa8000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020b788eb0da2a602282cd3ffe3593bc697d6585ccf42889c2d49b8ca8ab69bf2310758f8a67fdd8c00432adbb9d020dedfe58dd574fc307030fcad193d6112625020484f504562fdfaa38f44ec9d79a2112697fb908248575f186f002b8b342f2100a54a8fe5366eba16024f12f9b0af24994539638438b4382229df9ef88e918c20000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008180fb4f4bbbcdbabeb4dd04e54032ed4545123c7470de627dc3b79a8f8f2163d0bcb41479e2153f04f7cc1c8852234972d910ea35a2177501698590e6b3bda85f4d2d9d9f63e1ac586424c0a14ac989390fa8b00c5714211ea2b637fe449d5693eab44509ba698603acc89579cb63e1141cba3ed5e4c5d980df3cd87a06ccdc8548f1ce4e13b1bbbf9bce09f82dd509731320d22c1dcf1629cd4e73a1db9d246623ba50ae18fb2678d31dbf65bd8f79cdf7207ce6e8a68d75e144ca0130d6f0d858ff6491d771c176b36a4d6d4cc89b4a73dba7d8172964bb4bd3c76665345c9c0a1cdff0bfae71d7947cb80c872bfc702b222abbfcbc653ab6f5122f9d56798cc5ae3420b450a25fd3ca53592358e5366027805138bb231c74cbc8fc82ebd510b94e3cde09df3ab5727dd97baeda43cec417828e09b466605914674316dccf3a37e252f499a1024fd6151ff4cd0ebc936848f0dd58d17b8b63bd9bf0e8ddfd38e686fdadd428b81940cbcd8047d4f9424fe89987512d404fed48c7962d6089e5657a7574224083160c211207bba636675a822e03e946aeb077a8b44fb405c1949c5944305d6219b353992f8cfe59482146cba9787e58a28119d37f1c1ff8308b0e6f53f49b01192242fc81ff631e0f2bc8dca6b74a9973aaf7abda8785003c00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff548b104637dba0f3d2df320191e8c14a81b0cd1460752fc72c546eefaca4eb28ce09fcc15f749f94216f5b8ea932dc11bd7eb0eaa45eb015e60dda78a0f7f0a3617341c99c3301e3a209c889e3c225757c21cced325ebbbd2dfe2d5c87a3be66bc0fb9bce38799109b26274216fd96e29097e68c6fd85142ef622bbbd7459942e6ad282bd75c643ec944763a8daee8af5fc042d41883e39a69a272f8afe47def404f7eb104a48e4ef853005ad274dedc165719d2d61b67e26f75b7446d52bb0242b05aafa9269cbdd8f2146bd069bd516d446d3cf3bc2f1e2a3eaba03ad5b1f9d6081407e697f1128eee7c84789227fd44a80cab8b9d20fd349a5cb0e0de8ee0bf959b9832dcbea2644bb95151e099e0d51f14eb7a3224c66f5e9efaf6bfd9c253d8ac31ec510b27c503a2e1bf05f9d3ea475d1f52d5af949b78ca6ac7db59ab39bd12d45f92df4b12600b287f9ba861ed1931319b7f66e1f17fe49cac421f3b63e09654825ab95ef95c21b334cbb565810df4c25e30d9f2e11fadfdef4441736c474eac946a8acc8304d94cdce7db63762325a32bef508b1314b7bb2652f2b244aac379d8c79f928639b7243b38057dbccd77eac5eeab4da98a40bd238c9cecd57a7d4ba40601210a5228648c5c499119900dff87c0886c1d79f477431b0000022800000224000002201ed6293083a8289312da94849ef9d180d7e04d8e6e2f823d18911b3971a1056500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2600791d94cc10f83976ba5a5149e2feba86982c504e3baa65e47f76211a89e91e77c923830f8f6ae3bb2ab4f2b3147d2e4ed10bfdc9152b66434d2e46a8000ade3709112cdc5efe2e1c3bee6fa0266fc1029c81b956d6ac874100506ed3d2c814a9e03f5b2c08d6befd7ea75ea9762656c4d2459dc34cc51013d5df1ab5d4b78e33efd9eaf5f9a93d3558b9451a70b073282be554899ef98e5711e3e111049a1362b6f422a6852818f613c6821460746445ce323c163acdcb577e18db3d57f95b940e9fa0692d8d3024051e624156d08bf7c9156c84634767dc1c0f493584a376357ef9bd8a18e812bb45a54ffb48fa54a780666765d33a8099d588ff0aa4df2b0e1805a5d0c939bd759b9ff8d4fac5390b48dd1c048e3e3c9e4587ef4113462c6bf4f39c6aee66e8b8482a2ac7292d813100ac38ad3c3be1b4bd3485b77f9d873b5c6868a51984661cd4dd93bb3c158f3715a4cf3f952e70bcd7b3bebae36b773e6272a55c0dfb5941f693a8576e6083ab7ed28b62a4834be1b4a7a4a147abb992379484e3f6a4c5fa67fe640a07ff1aad721d2aad0155e28e4d7edb53e88392f9ea400cf31de8921125182f10667f865e02b01d9eaf6742f0b8dfbb64df7000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401200baa699358caa2b296930766de0ab48f0a4967d4e7816c8aabeac311b2df6a020c16ff13c576903589d645c428f902e799375ad791df4f75bc585c1a8933e1320ea735bf58caa288b4d4da24311893e2d3a8d82721b2908f3f2bce3f321a2e1f00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae88003bbf04d64f31b77ca3c0ba53598cc8ca4068252a402b28e383181a1c09dc030853d5c37ce34e0b290066b4221588a18369599903078fce6bb320a82723d6353535a176bb842724c25080ae1f4ea868c62e8c4e6acf4c99d6c94c5bcdcebc100ce927d2004d95cceabfe96b697db5500a805d166ffc23c1d334bebfaf1c3b855f1e0f663d443f31d95acc730f17a57bdbca1830dcb991c7d9d8aca93d07676912c7ee803e84d0f383174c456d3af4deedc7ded1ad1953e15f965987ac69e1a7b18e81e46b91c5608d26f5c9321823bf4106ab0192618df987d17fe8d7f0e7d3a77488259e6720f4de158983290c5019daeb6be20d1e2a6a1b3db8eb4c62596880b6f887bba943694f2c4fd3df9b9d66c734eba375b27befff9b76b56c0862dfad18e3ef3d66712820c33f39344070c84acf551c6603bd34723fc0b419e105b47dc092b0d268c7768a00d6b36202e4b90953bfa11bcac035026c22a71d47742cbd8c08615d95858807c65d92d407bdb8f39e365f3654bb58c34f8ce1b763c4971f0d6bd453a303469665bf0e46aca6ae0e7cf8ad78a5c21754f5e6b4ce94ab9be2d467d8fcf65739bd65a0edc35c1745f280b605f57cf8930d77c0dd5b790d3907badcbc66fcb78207acdd5fd26ac71014d0dad98d4f1640c643e86e8eda0000022800000224000002202c3b02cd4f0eca3ffdb29930fa400a72f141dfd2e920e53163801004ddb55da800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000138f230f05077b03a875e65939a2f6aadbc4c8e93720753bf5a8856d84b872aad334a017976e0811c52871b009577abdf41fcc952d8a2a666c00e3c32be0be61b95f7930b24c41c1b89ac49ef1ec6d4487af1bb757228676d327f7f27103a8b163f3f461ceb8d618e3b3b3f13eec1e57a8045cbbc0a48645793f705fee5c295d93f97d270d53dda0eb3b16e655a4364076adb7bc2d26ee10488a9c8e92b7d19e949ab4b4d68f7bf79aa545cf07f2d1ebf46fc074665fd4a73544a01aa6023af74db36abfae06a06a0cdc1b7895cea253242d3895344fd5fa6666372634c7117a13c90b61c90c37e1067fb9020ee43cc8cf461023c34f8afa59178d6b26fe4385f99da0b452acd308e5e786e5e01d7bc9c91c1062104452d2a2d63b3611aa22f5ff6e88967f7ffbbe676a382d09095bdf838b511b75eb62bfde5cce2ed265a22850eb1da705aa710bd1420a8d591c702d7da3078f5c664ef07ac15cb49576c219bd00925f5eb227e71dfc75fbb22c99fe1ec50719c0c8ca40e87c24bb1d5d168c292a638525e3a2c588efa2e75a8ab30cd58620b2a7cbd215439ed0f4612501d5714b1be383889e1c08fb46229d709bd14e1573014c982fa4d188d95389e993ff000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401022638664751055c421e3f01eeebf23d571600ad6bb3198fd1a1fc7d7dabd2d9020db7ee8678bd449194974f1db85610bf5b2542c4058d6bf82bf838631eaaafc22ed66ca24eb6d32da782408e80c7553fe721ce528cf4f39cbaf52ccf395c186a00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057cfa101fb4e7578d36c7a4b265ff6bcff424193a4d4ff6a86cc802aa876680c34df60a6e9bfa9f6e87c8bcb3d0b608ade25998ccb72c391fda8374ea4519d7940b8906e09bc995a5e2edb392907a4d90263a8d54987f5a83b00afbb1e2d2db2010ddf74308bf8489d7bc28da0c66d5e402d1f3cfa10b8a4297e1c7a9e19faa3996b94d0bb92aac20343e18557dd50ba1e422dbedd18ac4696883bb0948a07c03af1ef6f99d67bc54722a2e350b253da06b269c97b742ceef9a7e050baabc5031d3a9607a4687a79fd18ed57de1633915a4d404f88b95a148cf46cb0fb40ef40403ee88ce0c73319c0d6d5b19934c06bbf5829d4d5bd854cdc31be6aaabcec052e200c721f1a6ae284d6ac89f475fd825488882884288f71bd336ac2ba65f4705375b0ed01ee879ea52b7c0cf0086448e259e7ad33871bfba6480f682532f1afcaee9d42d4cb105d9c26b94eb4eed69c780fcb06d5cd71c3b1f9135962344d0d8e96bacdad3e7a45b60baafb75a05bc686392b235acaa1282ded5c48f67d6595ac04c7a0735f71b5a69fa6e51142d5208132a2afea8bcd85272c033846804db29e18f62af850ef82cac97abe7a7273c9fd4214cdf9d691f99019c63cf56c056dfed080c03148a2d242890d0bf439e07da4e1b9a548961f6423bd2c6e3f305e5000002280000022400000220160b99c9790b10b5515a15bbf8ad35b859b8268d3f7bcfbb840eff06f07d6d420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019edb38213c649614813f3562011205745e71cc7938bf9155c48306307f94b011eca41713a0cec37fceb7e2ae6c73834d350d5cb4b3ae809214e46e358383163232aaa6a1900e0d2d29e4b189f4d4d0aa6d1c35b348af1b8a22e834b8b866944ff07d77bbce2f2d6b077829e1dcb87b57d22c60a0cb0b78404793f54d16c8321d156c3a115c6da4514e56b1272d30dc3e4e6d480eef1478fca87aee085cbd8e8fb93da0907d2b6f6af186081e502cf9a5670a048156c4e4220c32af53a38b0ff803af61fb17cb2d025508efcb367fd0f24fe9ab6149efddc399813db472139481b777b2b43687c5e3c370c97d8963c609364371e78f1d1227d73e74dc8f87bb8949318c9e29e73273c0555e025d9cfc99d53e063f6f0d8babc9b1fc23bc2adf01f5dcfb8756a80580dbac839a1c7f6d5b5600afa29efe465161703ac4b7a596c331a978082b6bf0b8ba06bd566bcb739b5b4b2cb9cae95a3435c3f3df8c3138949d5d23a8f59d5046cf38086d197df2e66b67bfe507a7147b627a99f2273db14163cb729dfdb7f11ae6305f33269df9b68397e5a5c341365d28b062eeb3b0d69237fa6c2e164ce1c0c6181e525d28212ffe7da7939b1582837c4db1629908770000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020fdd8c60ec4f73b1eadb34f6492cdfd5436f7124e8d60bc7ac655c8de439d8af0486e63299f0a5b94db91fd17f32b46e8488123acfd4de0dc0e84bc35f5821de020e751e6457b35ec11aa86a6ec4f6ae84e03fc11f1b71ef6705ad012fedca7da0154652b4478af9438b7cfd05e1995bacf2f3f9b7a2dfed65e3467f0e5ce90b120000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2a84e36f341577eda48340baa3d0088d10a6aecf30491355f5056f510c88e46251a8250dd9dfdf2885ca906f459544e4e436ad84b810f9fd019d5a381ad735740734d68a69a5b199cd86ddadcb1fd5d7b8e8c862a36c5ae3c8f3e669ff0aab06a32f29804e66261e4edb6bd87046f2912812248571da36bf95ec434fd162d736cc70675b3590151aa22d0b354ca379e4716423d260ae1253d5e45e5cd1857f19ae865af7c16ad3c4333079e7c8ccbef8eea32ff5ad285246ae355223ca584253eace5d733c82b4232f653b93d7cfd08d522366372cd1593bd87b5938676b7838723bde7939f0019d291c0e31381c9d532361b2fa97354facbfb6d41be50c2c3145be034ce35a5ce39707452f1cafd34c65d83cf4a71b2eb385398d65b7ff2aba8313bfe39dd7211645c5c519735c77f51110b919b36d9780635595606b5e2d475fdeeccc12d28224f78418ad8746c8f3a146bf203410f5b42882a38744a00bd3e4ea3b12abb71c871be5cd2ad9d8654cf8f511241b9769b799cb5b770f8ffc7264fa921555cff6ee4551e65ae38767d67259c3384b8c58a2e515808ed9889758047b1d9f6ca3409cd3308cf9b69473107ebf8b487d76f244392b94ecb8d2ff487b9e21d93922612f6bdcecbea56ff5410ebbcf693297a9d7b75358a59445f830000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c9b9fe7f2214518d0d6e24d78d2e40bce25067b6e44c37ba9c35bb0bbcff40ebdfc9fffa26e00cf63f4ae842095a00766e71c77cf629b5ef105b46beccc9dd9874b69a67ace07aca8793b9217c1316dd36b35a0f910741b15070f71b2707d0d7d7e04921dbd2b72a11c083bcc5b311402cd08be566f8a46b6afdd9713b89c95f6d23cc425ebe790ba0888b76f637c0d916ef4d7555f8ff75dd5faa5bd3b9166aa5d8b84c5b5bc5c5cc0623c6b5c6ab78aa0f3352e2e4b260bb9029e63ad6c28ec5d2679d67c3c5bcb76c90de32be74722c4070c1dbd333799e27778e6091caad510ad3ae3ce886ab59c8ace943bdc26e9946cf14bcd82b69d90563e4d904fe7fe09f4eed47167609e8c8a4ffd1cf4fe72ba7f30ad7923c027bf77729489252d5d3f7622989f6d8c4f531c7fce40cbef4413dee0e173695a210773d0a155e71d2e39990449790867d9c437f785c999a886decc887f908fd634556d3074f23268fba9ad223672b32ed1a43350eb0c2abaa5214a6224d8837b0f1817d49172140b1189e0dc10c010445160d2b340655ff144bdbdbd19f9a9ae4c34f1b2ee63b51a939820ae5bace0e38a1828ed8fa9ccf2ff5420bb23d32cb5884c6ba3bb16737d8268cebc2288388418ce994a774c93d8ea37f7f114670d4fd22f9cee4a11de4800000228000002240000022012656d53b201540902bd47a08d48f1016a89d26acf8cffb776cec44a0c11885200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af97c5228dffcbd2f5b3b58531ace2100d88c033d547786dd31229c9dd9dd86ffad2b10fa1304844c63f12b48b335f16bf5f31d5e7b5b1dd6c7ec8733651286d55868bdfc855653b8ec7d59cc04f1f4979637ba5c5b22f7d95cb2e565c8efd76f3cebc37b9f4ba34703cc8b0c6d13ba59f73477af5b4313f6f186cdedb50bbaf2bb36464444ef2b8454e2efa82f0af7ebc01be8dabeb7cae42bf782469cb806fa090af709027e6035d165bb59f3c436a36c81f9e4e42721cce2a20605b7a5abda5abec59a77d79f975722e57f4cfd2b2b073f5c150ba65dcd6e7ce3e9cf82debc44789abd84390236d8bb091cb9ba75a17d169c224db281ba7ffdb8f4b61f78d755397919c7f7878e9e86d4155040a45a77dc77303d6e5c29b645c71010bd28a2d08f5768ac22c003a031a4e4cbbdca4cc2082772ac80c68fda03516e39a8c9f63a61e3acc2d663ab4e46542c685e11f5e35db2f9ddad983fec4439c28af2d00437051d71259e8bc07c9924912bca9e9353f4c8128d215665b2ed8e999f874c5d05e71bb11262f4ca12e696b0d67df1568d326ea38682ad4880ab3a48886db934191730b8727c5832939eb6cd78b5ef9fa6ed38a05bcebaaa1d83071a8b173f3000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40125fbcab5ae56b592645c101d096189f6d75b1cb66b16f6d1aa73b0463e96992b020f04c1f0dc37b8a18a39860c411f9267aa456f3b0c4512da031c38c3e13183511396c08ba42db313ef4d49f82e522fcf0fd7b07f728b1e9ec40f12e6c436015d0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083e9230fdfd9275c0c4cd0da353c91f9b8c361e2904bfc04e7478e334f4bd715dc842e0500f93fd27cb272409f042d4008ba55891803cc6cce7f0f43b5e9b7bb41b9cc9d65c13e8b2be42be955b70d70eb68fd99cf9e9fec2905009eff823fa87e30574c979218eb80751155d8de5ca97c51205d4da33d6a1ca5288fc3eddf2b757289d5745d5c54dc9a1e0296f23a341bc538843c8a8c848fe527c2651106f1113b9e44ded5bb77267786759d2b49ac265d1315bb5434806aefb90dcec074a6f65006d60634c2a8f4d6e8aee35ef40ec65d73129af3edc5ded264392ab70506b9637f4cf9cd44e61eb9a662c3dc83b4803e7692df034cc8973d838a8680c8d29216773df52d8e965087fa40e8104b51ff35c2ff1297ec90148665303f96e3539eae9e028acc63e7af9a928ac5f88f8d9f2d49a14b17513df2322db9b88570a9f4c2edf4034f0ae762f3f8093db89cdff23eec78fd5fcd16d90356e621d86ce4fbe16402251b2249ef91a2b9887fae0128d08dc4d5c85e59a2d47fb2b8bd4ba34d44b00a493748f2c4c2f10f3738beb048d3eb57bb1949078339827cb373bb925ea81d1a6a75dd74dc52b2696d0c68a6e7d2a48c7834730ffdeb3a0b9e7bf714221a27e7b01ae7475c64288b0a4323af117818daf0c40e4313450b2bc1ff8acf000002280000022400000220141f505f57d090785870a10eaf691a60c996d95a7983a60ff04795c857b2a8e70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025d941019da062d2aec5592d3f3b8aaba0f10f7e6e098d4cb4dbc4337b6c75d1244e041d46cd91de87a01c559716723bdd1dd9f8fb796b31b9054d2594f1891f4698f569e1a19ddb70b6e185e6b9090bf163b2ebfbba2c93c9919d473d125000a378f3bf9c5f7e072a0ea5fbba6171abc2bd37453969d8639115d0eba1018be19ceacf95e87fd54e3314883ae8a289d61f62995b11a158c0d49e5e3532ac72cbf165044ebc8b52959ee6618faeec7048c2882cc921c473a3f47e2cdf2c02ed3e352000b0fb0c08d9bc76d47c9fc60b6b67ef8a7fea3587e40690b0212f76ae89621c358727157181ed4b3b0ac95de6b2f2a299b9128e89fb566ac5b98b3ba164e1be331e37e17ff5782dd3e28d6d322a8cd23036138a29a733773511f158aef75ff81e17ac2279aff8006708bf3f37e9240313eeb27cbafcb6e37c929cde5013d83109ed23b2bbace191ae9db0084d639287dc447b45a9996fa94eb7d72cece211dcfe5be7287f7b62750f730f1feb495e33c94e40c1627268c89cb5a597e1776e7f6568f3f72c51de4e6e6fc6b71046aa9b6141364c692a3c39dbbd1d5ec2b67f02504def953f09e81fe980d3664a9860c8e2baaa08f6d13f474b336ed5b110000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020d5ea1c58560960dfc0a73ee3043f2f2e6db4eaed69b6908158e7fe3abad82071802cac1b7851f9dde27ec67d3c905952261bebd9d00f2dd9dd4e0f92537d0b7021244a4c4e6e4f426b46a2f284560b93f218754e80291293b664f32aeb4a95cf713c3ef22ea6b08de2fc67d2e91a6d9b2010504cfdff5b293198bb446cdca63260000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aaf8f10d20f3904aa5c501be452aa395ded08fec6d3172be09dd052b49c7bbadd6918ef261e43a076f2962510a7a897baa7e36f1d5f1ded25101a832f2710ad43658836bff11980b9f2dcf1664d1b9a4f6759a5b9fef247ba41cf531772b01338307e3baa9190e73b51361b92e68c0a3aa1465d9801937185cb71c518051d1d41703bc3a876e7745b3fa8e66e2bee0ac808650a0c86273fe9d479baa92b52604ee53a79c8d414fd4234826dcec77c252c1ba7e371aee5414003b57c3d5bbcd7807bd9fb06a3c7a7624ca6e01d3c0cbcfc8c1d1b6460fe58dd6ee0d54ac76eb51c1e6a553f25da78c2bc065262ef5e3c851acb776fdc674ec5f8a12ce00d8e3c35428d89b0a0dbfd4545038daceabab62c1c534e6004f97f23f71d3c7dbe2b58939c27ee9b6e12f94c04b2dc1a557908e5ca85bdfb740592d13ea78da4dbf2234931bd698c6fc79c6d1229fa2e4a4bc50b3529bd92435b3d46eda2016329a69a36a6bf74058df95539917ca7d0987eb96e0b1b32904a01f031ff157159e54932aec3340fe13c50daa1735a1b0fc8a91c25aa8dffa9a2b9e3390806451627284b7b6a89ab9627ac584c8c2c0cae1a7bb964efc2d67c6302bef7efa135ad92c68d698099ee5f408d48b9f97a6fafb918bdc5fcbe02a8ed28b009705351e7058b8540000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001112615664feed7afe4b4f4b1f4c24dd75edc57a8a1e00cf39341ce3e5c17a17812b9d4f3bbac09dd6255a7390547526b237db1701fbd6659dea723cfc75e7f3da9c521290c0d69896d247c6f826e3a8d26bfa7c269a882d513085f1af612c3ddfb3b917f6d31cb70903f11afe6ea27c15b2b894aee4d00680109e9aab4ee817db7cec82c1757745019d90e3141aba37b5eb75821134fdf7489649595f9ccef47937066d892ccbe87d6baaf91a90067bfb7f6162052340e1aad342cbe8b61acd6483bcc72c68cc0281202afcfd7ba50b4f7f886920a20290b1d4606b6a8a2c2327179a7385a04534595f81aa715d9df6e2c8faf2890e38a52c770aca847ba61b1449ced3939ce6cc95b021b53b4e3d7dc5fb913511d9ca34a693f83fa9724f45c189d48aa4d223965da53eeffb6addeeda677b2e15c211c259d10963865ff23b8322f8f5e7427ad6cd6c6e736466adc9dcc707140a485619c937524bb10cbac0cf1549d03bfd6416ae0612e59b4504b40852a0557b5a61cbf35276a0932e965672a8f2dbe2ecfd599dfc4536b824a58d687dd0a6afa645354bb7bcea6735b6cf981d8b41f15e3d83d3d2ff2209492a22e5ad2326227437fa78b37fab7df7ac82fd9b4ca13e5cc254c4e7d6d7ad1ee666dde7f7ae10500a2195c6da3afbc7b7c80000022800000224000002201998dd320ddf67620a282c17eb6de88c366fc875840ce734c479961550ea1dab00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000959803eacb0d7474db71c8c798e13759acd76e139c4a3694f29d27822c549fed704be51fb22fbe9dbfbae27b95c0baa716a8c711b6158d9d9beb69bc9d3083c6216a6348e158430a9bf13e677fbcb3a5f3fadea8acf72dfb3528e6d358effc04cd5ae96f996f9c2bf7f15f6ccd2a0c95d8308203972046b221dc6f2b0fb97a15da4344a5a72bea6c3fe52f4d7e80d5bb0fa59e8791cbe09489c86804de3c3b4ca26737866e1e1f08de317cddfb5597bc4a2ebcbc7795cf2fe09446670b3d7576775e72ed3f6de5c56882599d43969b1cfd45cb3f47ab8f15fa5368917cd4d0fdc801e95110b538dcbda23446211b492e613185cbf7ed90635d753abcd431372ef3bac54a5338cffc6af05380d02f1b06c1b6070129deb2f6abe7e953066df01c5423e786007b505fde61b8cc5a736a734a273ba029f512c70ef6ac139aceced56553ea2a818636ad6497674df055e29a425d9a40c419436e7b0d0f3779a4a432abee03061a21d3853298b06c18ca97479a32249ea781192c3bdf36764a03e0ea315b8af9fa88b82ccc1494dd8572f5df70b89745a29939fcbc2bb6755b491cda67faab5a57b9ad9436251f2960c8a06851af475b3b99f51fb54c9ac279369bc2000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401050c39764772fd2b7fb2dd2b174e74803af538923a73d1380e48491ee5222618021540992872801cb8d533c70c109828b7a3deaf640bf5898343ff15f0ee6e6bb12a0ba6c5ddae501fed5eb82f4f49a3c3c2128e3f0b1258832c29287e09b074430000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027b18c2e5d1ca79976263e162f7e938b60460bf206836edafdf9688f34b110a8eaea3f4b0708abf03d5c26cc349d217461a04e96ef1d3ff0743d32994331d259fdce66f94ec2d5bba570f1ef1900f4654715d64b35f4f8ba455a95903ddc208c0d071bf70499bf86e70f486d2440df30533e93babc9b5110b68354e0857f75496bd07781f05e69d3c1586d1ca6798c3534ec6ea752a6943c18149c200167a720780cae1978abfd7a23e3c9fa8f87258cafe4e02ee7d6192771d2a07483c0fd5ded3762812b3aa18ac292afbb61ba8a823a55f2ca0d43e94f02c1b5133101b6ceab337c08fef2fb599d80cced5fe088c409024d6c30893565a98c860d48bf6a389172bfd014bc3ea614e4f8c6f821f4ed050c820f929d73a31ac896d9cd5d2dec91be39c062dcc79fcd52e6bad30120078d190be9fe556fc6278f45b5ba69c85d738f67f1f3fd1cf7183f4b74743b39ebfbb3cb250bb08a07b4ab6da80e1a3026f2c73ee0046f345461167cc44c3f1218ca36c5cec1e24031220a0b90c4532b3578261cd3c6417319cfe6848ef0787ce3197a0ad853814a244e1e4cee17e10ae69ced07b08485789d444c36765b28ae883ff3b49e2d128f3585f732688fe17ce88dedda0250a501dcfab779870f3058fa5f900592cf6089c74009072a927313dc00000228000002240000022026ea34d9def2f5a760d773be978741b9186938a06ca3113f857bbefcb44160c2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008487b632b6f597a2814de72502920c455d16fb70bddab21a875ca82512fe7cede7b9d990491b90fa2fe654f55c2973e1f2b2f9aef6c304822d81332c61e5772f6d33b81338a56c759809c786110c695c0d74efc30812ad4bd162efcc8ab3a41b9ad51e960469face48df75e83752530d1d865ed3181cd9b9eb1ef797ec09a2dde7d311346afeb3737e2fb9d88edd932ca30304bdecfb85c93d2e01c91aa56f76092c2eaee6ff7caeba1f8b03ccb8712025e1095382e9d1a49ef7da313610ab7256f11feb8e817d0871b1fd9813d321defaac4a0d1ab6b461f797622d986fb686c19867d2d43d24b9d3e0c96c9fa326f957c5263a650cd58d72c1f6db7f40333ee4bfc91a149ed94c4ddd6987d46accc24da35fe5d0fde7b7a1d2120321cad9df61fe7a4eba478c8a5d279989a312785848740461c3799a7ea34594116f192ce6ad225f907fc97c7f495a4fd3654b92ea7677eebabc2d4d6b5ad89ee39dd5566dd55dd2633bc54076f9193e73ca6ebe0ad445af25fed51102aef7aba4a5625d47675f2b14e3ddd8d29f55ca6e24bbfd7c450b2e30046dcb49139811d8f52b8b83073e106dd06df644a90e5ed4ee3caaae28020f4aa695ab7cb995ac9d41009f08000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401040ee284760b95203a852e0a722b4490ea0c20451a13c4754687ec44e348d2220218f1a6a3129755f19eda74b50b5134a3f656e13cfd12c1199c795c1956dbbb301cc818d0645c6c30400b1cb16a63677028240996918d62f740f57a47ad6e372c00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8baf6d1eac5abdeae3761dc215ab78541f1fa225fbf2d0f4fcc0a15d7409d8bd3d94b512c4903421d4cbba9e064e9dc6a6c0010710755326809a748868b2957800a71601cc8ce0a8d447e9ca688204bb89eb923d31bce23cf75818591a0c48d02f6be139395e507df5c178d90e125a13105a52a4f83000c9c027c87041f8af20f317b227509097d0cc8a960ae4536b4b21038e7bfc9e608801a107362c330c6da3d2a40907ad763797863b2b2c7e243d314b2e58548d59893951d5c4cf7ff3d27434fad23a73bc2a1385ea459eb53fb76e3dc701b64ae69eb93a49f34caa252ed35db23b93573c48ff95e5d64a256beb8c2e3674961cd522621594250a335d9b8d3d8a0f6beee38def1fc6180325018ba7c743a035bd9c872138d945e766183ef43c90048049db5cd566e6dc5e59d7f029c544f4236e8e863b7cc9ac5c86e6c679ce2b846f1365b5d7ffbae45745f42e0c600ccaeb968e04d4cf116789637b53e24c5629474e9a7ad26d9e5043b2430bf9155edc2ded32a319b891333958bc13c383ce1e6a1890ef480fa0d1624a81ca1e79712fd684b4cde43c9090716878571a67e4b7740a43ad9cd8cb1215ec7da587c896d1a55eda4ba07f7e8cb25f3525df1f55ed75dca2247aa6db4c4a7651e812690afe0b6eb8addb15fa42a7b037f000002280000022400000220246a0f7e5e57356a8ea037383bbbb8a1dadcfe748695ab6f1dd8b965c698190c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008221f1d591f040866720b83292bf27cb01ebc0fecfc99f1411f5d4f9ee1ac3408558a73cfdb848e1e9563bf09aa031c82046dafc5efe49fc2a193d3c3cc492653ce86ad20288daa90d01481fca96bd437867ee015dfb9b1b2b5250586804369785cc690676a0b6e5c3d67f88e1bd95cdc7f3e227f1d2051cb764d6860f4506d6f26256528a7bd0b0d9da9d8af1cb43f811e9c3b4ec0913a48d8e6e60fc3be5b48bf64d836907278b8db81bb22a16c9a92e513dc42fc035b491fc7abb79f603256241f1f11c8aafd108e810dd990cdc04213bda4b1596a2935a71544b3ea338b147d67b87dba01479e83b4065e07c5153c0e96b1359df0205ede8f5c995fce1bed11c9e215e6f9c17d36f30ab6e88d69f006f8d5b5a3d655257ba7d842f61930ad889c365f88ef77a954193b72691e54385eafda7ae9341edf00ae7ff20d5865415a2d2a7fd2231c0a986c0961a056eae99b669f747f093b0a2459f84bca1e3683872eff94127bc1ad73b61a05671cffad1691515154e1b836a24b1b97809011358794ccdc33dc6f8f8674265efd64973b9e5fcd61b89490ad5edc5994f0744d43412fd94dfe1c680ad8d6fc294c50c548ee991253d2b8f1a1e778456d1944433000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40112c32bff7fc89e1ea957775519d38f164161171f1535225b7cc6089509f9a78c02193d5185fbc13ae7bf8a5fa9d061131d98d53ca87d30fba004625433c27573b10f79a252ce8f0fc5c2470a3a90bd6980921894fac026c251cec57207db1e809600000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000875717c855fca692824168917e9175f85f8fe3a05b50fef9d0e89c6609ba6984e2a3f837dcbcde5cc408bf87c249c503a6eef912f61ced2637b5970826d56fc3b846f0b746a6c2c80add26b10dc2f77a23986153cc664bda7623056e03a88218eaa2cead54c1236e70cbe3e7eff177914babfeb23aabdd3f1660a38cfe51d17daef13eb580498a4b5350931b4f536edd803d10f152423f25f84271a386e9709164b8b6ba0c2f6908674b8879f4e145853df1e6bb01464d85a90a5d1f295d66442d0b82cffb74d48f79512f302d4c5d9e7d8cb208e2a0e3be0ed8db6b3d4fb67e3d303b395fad6da65f31abb63ba651f8429990099ff5c8caaa76554bed19834f447b8edeea8d22f5bbfc896b1421f2c2035760478b8c6dc50048b0de2a797a7245cc5316d150e2bb4d5273967bb0cb31b0b43adccd89a667d346f1bf801887e7adbc4a8c3a1d709a861a19630c8a63df8ad6e6e76ce9baa9ab7f3b5938cd418c72f81d3cea4f7946dcad66938dbd8d1a2d8a57a8728ae932d3f7a9934c3168c40f9ded24a712aa9bb34527ed3bec88912e71e6809e1bbdf00a62f52299bf0c65938086b06e5d5ab0f98d3af8b68f818e2ab1b3f57c24d47a85278f9ba640ade74951f35fad4a72356c485ff0b7b04c9c051a440514e82f3031cc38082efefedf0000022800000224000002200364fad2ea2e94d2e68f90c92fddc81452369521bbe8b97c7f835a7a098bb7f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002516ec08970b10d7e42eb28993e0b6a95978030c783513ba5b728b24e9eb77ef05bfd342fa50ef8c8382593620e114ac7f64f617511a0e2c4f5e4bedea5cf0fa380aa3da8b88f0b7cf386e28c9f99a17e3fdeaaa4f93ec3f241623614d5a01663a231d75a98e3e01d7eb8168735818894f8bb9874e4e97a7da95e43382f34983538c0e44670269343da6c021d78bf79264584ac02f9197f87dcbddff92d21a4fb89bd56c73504648a8413e7664d4685696cdccc145b3d2e0be7b2dc3efc1f00a6c5b42fcf0c4a30811e6afa6ec4a5fd2d28405ac955373910fc5830b2e50f30881d5a84ad267990ef691d8ca9e3bd8162a79334fdaeb411f6e02db57e56c70c7c02c5bdb76cfcd32ede905f3e4941086ba4b820cb031dc19be1f1e56c7cbbd9e5841cede0240bc2085b88c80853cad69b9f6ab25ace8e668c2ab288b712db18b9bc985f95f33344b70a861be3fe24d6778e84466dbce89804d7348695c695fc28bd0f35c99c909ff46b7448e32ea4ee5e26ffe4cd1f48c53adcd535c26a08cb2ca163ad14f6a0c12bdb402f6b809cedd58c7a96f564c6013dd7ebedc8e135e6072a28fc22b0098fd32c9466a147c3aa9d7989821422a189f6a24737af6abd77f000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022b7ab4b8672f473e7fd6abd40bdaafaebb99bffbc6e8929dd91eef87e1902176142f35c45a10bde04d6b875f938b2dbfcacc1b7e4f23fcd56639a2e98b7f1c87021a0081322093959d19b8f4324400e178f1dfda2e4ac15afef5fcd0f394a7ade8107df92c31e43cd5fd8909c724cef1622605fa20fdf343557e1ae8345d3c4be40000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000845b79e7bef4d4146df74002df88f02f0b4b3ee0b610b04c2a58fcb938d4bbc6bab234949726176f5312305482c5ec849e8395b09d5be23e9b95ade1430b300d2f799004a4a22431287c01f788eebc299a33056cacf932677099dbaeb7766c322602425125477313cf0c884c8f9ef70a4d0a44ddb71be9e71e6b5322464647aa1597ca9fafa466d7de210f2ae54fddcfbca2524ffc81b9fd7b53cf82cb0a5c572e13c6ce9904459f0e57d645067b14e371d93b99ae1c1cbc1e815902224968767663c09f534ddc81c9449c442890a2c055c3004dc7a32ede6c454c0b0fc14158f80305d2305a0957c5b2f20326597f1be0448d79e41e3efec84ced52ad775881eed151c84820c28a29a66acc1d34e07b62e3e3af084cf0596154d5eac73d70b60299e53ae6eaca58e26bb2674eaf14cf884fd5b845557acce70a5a8f230fdc735a2af16f108c74f8923fc429537779e86c8fd8398db8488f4ee9bc1be57039feb2c9ff9d90f56c5a481faf998cf90d29716eb0a767347fcf60660b9cbe5343d0142310d76e10ba7d3bcd9b88831a80b02f0b5776263eadc6dbd534bf3e2935d5fe2aa7ac03510ab59c217a12a5a421ba118100a127978605cbf006beee4f2179985e40d8ad229f4ae4cf1cb052240340cf70021a2377731b93c52d9d3bf290cd000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7a7acf2654b814262b3e2c49d74fdc96046c0cb797636fad6d838c33b626fd08de1f3923040774b581b3b20dc0b0758d7ac5cb14af03497b275d2b66f1f88367ac37cbbb0d3153f9e83ce410188716706d02ad388c10d272f70e2d3a5431d3df9598fd5c9e65323570e6c0169f2f8c99f016ba1bdd6f4bbe1c123f0780f57502e75b1dbdfb6e0bec9e6c2bbd38598621c46527d61d665bbffa0b10eb3bb060f62cbcb22934511c40498c65126ba4bfd44c9a80321c1b73265edfa919b0dcc871f52a813d5dd9acc29de47ca0f5bc21bc4e71ec54d8940311d4cdf76b2978d63999fc0d2c26cce6ccb2564405aa4ec42423c7a3a5892c3eac28dcfadde7f3c758858306cb16ccb64cbe28b951b0ec2be8f651eb7a968232023425e12e5a9829797af4d9cd97ae9f32d1d7cb8cf878cc2a2c8b4fe5b5d3474f04014709e4cb3fca1e2c91957e4563547837df4481e5057b1ce58bdaa01998cfac0ea608bee0f95fbc74ce2486a2f1ac83180a803b47c6a3cd3cbbe7a02d46a06153c6b964b63a753e1e9814ea66a16410fe4512b0ca79eb6590edeedd62e82df809f703a1cc0487a4ccf9e8181c7de51501ad19ea562c930c8f38128a56beaaf1c8aa8c5ccbb99e1961024e156f3dc12393d03dfba01e52a6018f8c62c64449df0a862dcbb28b70000022800000224000002201ad897f489a541388a36d0bd2e6836535dc5a94c4533fe11040b0926c3e95f0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000acbb8164abebd35a6aced6904a29b17776527603373bcea801f7565066234390ed097c85fac1b36a791918250039e079b642de60b03e9356ef0eca152495f102ce4fafe7e363f89c53617dc5460afe9c60ec4bf6d601b9577978cf91d2296de16d3e7ffb67cfee886ceebdcd35c8794e57218268067a617a871d4a1da220288ba102110229f3e2a0d1abe68c704c899e60a4e12001bd87d34838e4fc73d8db909554a0cdab245b88c928f959e6e4f5e9d106573169ebaaa926ea6b846b11d524b449a8be3e3ab79723531e4c340a22681b2101f9d36f63b0bce34f58dd185af30b90dd5267bc8bf3b2df1747a5ec6aac3e9dc5416ad363336abe75e4c0c17bd8b879e41e36fd37c3033eb358e0bf141e4a5b347d6b887023d8ad189edd4af51d4715fdfaa8a7b6275f021ea16fe528bba7cc7dc7da2a318536fbe0ea8ef6af988688912d263011e488e0ca2961af97f880de6da671621fcdb1c0f6ec4c1d98229a7293b6d992465fa329d46325b2d7a0d32b1c3b01ba5cd6dcd9d8d4f4bbcbcf23753633723207729a82f649b448bb3db4a89e250f9079938dd7b1ad0b24dff76e35e6ee8633ddec49fd8e60ca5bf1b529fce65c715ca5637b80f47bccf322a6000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011b6d464ddeb80c06ca007905c6228d82c20bc1d621e622bf568a00788030f940021a54d0c9f8ca4c43591a3c5a26f3c3929d2fc6f72fb94962d6d3bf7903a406291917adefc7f2abd0c728e31a4e975bb15705d39ea42194abdfb599df24164d3f0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019343454f0bc01036ed8a2d6cd1a09b411dc6c04eca472bdfaf46cb7f156c8a635c83cb43e642a527597c6f3a20e290ccc1d3a2262cb96b0a7e2e8f5a41b1f0bb8941d9d8bd1f95a09684464f8c44fd4a7c036db53c19ada46eb45a993eb0f2e663d29cf56d7a7d70476013104dd46d0f1566dba1a4764691db2c6499bdf6542dadf9d4a12c840d03fae77f15d71a3291061119b692543511809d9a17225e42fd3668b39dcc1766c44d8c910ee5b0f0f772535e634c5e8ca7246d4b9abdae7a3a18966036487863a7c0d859fdf94d1bf0e9f29900c6c054069ad7ca759ffc2938347fe4df49da6fb11e80cf0e6d4e63bd3dba72b58e0614ffc3a0d4b7c57c29004802c113f3ce80b2e74bd3738ba357355f9527c5eee99557f42a5f09564163eb80bd498b6ccd754fb777b65723befa74e713fd5822ba5f3939bf0dcc6a5fce51f54ff640890e1557ab40f68c07647d709310ad61c4e1ca17d98ac1710ca79658efed40fdb775cf138abe1e9cb9c63971be5c99bfc15bd921b0b497c80bd1f836d2d8b6ff444ec829749a2dfb920b843ab5472e8b63919d996b1ddca65f3232be3339d22d7addae4fe4ef19566cb44f78ecaf88086fcd987d60cfc66e725b37fe2ed95b2419a81bd39068dc828b846b04a6396b46fe35636d1a0e5d95c6a385a00000228000002240000022004122c2801dee7e8328b726312fe2f8df423169a7cb08af8f9ee72c1d4f284640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084023ee93bf19fe89e11c0e82fb8a741e251334b7c4b383242dafe602d78409f22de3d7b0c5576b24479550d3484efb193bd6c5e22f3465047c231c20e19c9db51be089b817d6045b71a128b009959eea66dc19272c4cf03009d7b757e51201572a3d1125e41170d3a283a4940f18a9c002dee58f2e86bd77aeb1624f822a3de4640f3a514f1f56162c9c55b64db0760f5013cd070b4617b388a9dcbecf5aaf5df92edfce228b016bcb480685ab6ff938f62f554985b32e13cb1d8ecbd0928c6f72b0f275936e7a0e278d029b38e3d054c992a04bcf3836023a9b3c9324543504940d62ac288b9c4d02564400eccab9acc7b3af3bb96482c65499554bcca9813c913828a1d0ec3a347ee0217e50e007e7e1ba7d805f66199a42c5e3da1e1544ee371e878e5919584026d0d06d1dd5b4c9d4dde595c538516adbf725d016b1273ad086f09a004f67dd27e5ae0872e993d68bf1d2acfdce081bf3dd5f020575cad20f5e917bf7a787812a09923c448060394350bb7c50568c38b1f96ae434d8f610f792aa9907c213456c16036b41a728b4a58c4181641ab41966c77eef54a0c89a7b37dcf411b830a0c746729a4a33a324b3bdabe38d81e3f0b026c7206b895e5000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010e1324951153d4fef7a4960c96e6f9594cd821ec68f855539e5fe5b0adb058c7021f848888328f3eb40cd7cec8724b4a4c220ec65f7b134079aff36c276a599a07183941dd00083177e1c241083280f18cdf3bb2db0a40f9c7429a5d3d6563e5220000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017ed1de86a3a71c5db629ed513b633141aaf58f460a853430befe0146419e9ad7597e0432fb44088ab106f2e609a78450f6a742aa1175dd83779900669f190a60660754fbcd0683e6289896dbcd4fc828593f3cc10481708d85ad88569f4b17744cd8a61c408e02e6e139fb8b8c9e75ae4f90ca33be360b9b7a06671160a3cb6e1a51757deee166a661e9413335411795c40b3a6c5f2d19ff9e126b3d080708ace5deb87a5857867729830b3c2f4b3115ab242f75ef87f3a737b3711c582be88de84e9ea078a3e4feb0db89493c1e01a06c777c45a6cea6e9f89017fd25a631911db2dcdafb90d6062fd8ed302d2f5de542c0a5d16afd91508ec89eb468706851f239fca8ed11e0914ddeb6a560a241d6209852f465eb3b7108492268911358e4547751174520ee00952b3a5c9c2b429a2597e626be0c625a06859a5c3254a06ab736e2826b2dd27a5a5dcbec286730a767b2d240457b8743153872c43eac9cc8f355631cda8bef35e50fbd62d7d75f0f184e15eb744878559649fac3b4f9dd82695706dc1c30354022b95f274b787e2fbde8880d191112a91eb5a68369645a4313516245d1dac61e906eb77589efee457dce65f0495dfcb96092a44fb2109d7efe57291d4250a15b3812793cca7755dc0854880af3c5d7cad03f67e65271d0600000228000002240000022008eb8a0f999cbfdcb6b34154c18b8109192dc35831f768822dbcf9a23716ac3c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001eae9fd3db727d31f2f4bfab993b631a672e874127679f8ca4aa9ff91f6cfca7228869f98f04c9e0e4c9fa2dbef959e614277f497a00426b30dedf3069fbd3f35d19449fd62f9e0a5d1406ed55991bd2e29d7e7d36e3597069c6d1cf6b35087845c3ead585e2d5edf30f0b0d070d7db932d100d4ae13939f07271ef3e8efd7b6f1fa93f5eefc2973ca8339492b6396194aaf0065f7ef4245fe11ce91d36090d7110df3cb65d6ff9fb5b9f1ac821cf6ff696a1bc9c9e147cd3dba5c8c61663b088dad6562c9a04efbf28ad84a7b8331b82253cf2b45b5f801cbac4a040d95c6cb93302b197380d74162db4d8be903cf366b7e1f9047092b01b2edf3e2a1e121a076fb56e62b95b47fab3c7adb5341f437a9803e7cb4666f9bd4eb22b0fcbf970bc94ca78f2db56bb964a9f7228d7b19cb5b5b95fbad8a243985c9acececd145bea40f1d513e92bc2ae221265e7a4368ada3d8c8965c42094c55207d338449dd36400301f1cd9481d583470bc4eb6e0c09d5a7e5086a1ee9fc670afe22b6713723ae0c41817e45fc331533e2cf26e8a74ddf4a2ff9fe8cdbbe2dfa67a517e7c012e5dee823bdf87e53769ad7d95d2e221273402f8054cecc6c1197be45980d6d6d000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802238b065af72ce62b2ed0ef1bef4a8803669abe6b6c22a3df2cbf825ffe36dd9218c2ed07d8bd538ae9556a89bd7178016feb3eb2dadb52018129c922b39e75f9021fc5e7b8981af64be0ab46e1554391304c14689bcaa90841440627ac91a4ad9311a8cb5aabdfe622176df7d9f07bfe43ecf35ad82e237c3c37b1aee8e88c92d80000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091491990588b6be4b709aec61fdb16a0b1ed03e31bfa8719544839ff2a310218cd2f09116d50560fbd36283a3f6acce26e9e5a845cd76b250b7b7ea35a61cdf6d76401b164803ce56562dabf0a214baff51ba1d95380193ee053b4e77b4cfd61c37ffd0351b3559eec8099a346b3011662170a008111b3ae42e2d5be75c616f8d0646bd6197a6d1f305c84cd8d29f56aff823cc2d508a3564a2397bfea10d967afc6b3d369e4cf82365fe5c47c27a1d2dbfd80adc22742b1ee8c1768d9806095c40c7fbd15019da5b33b8575a5b3469f5e3aca1895c739c198f98a8d38c28fe82429db1f414ef893269442d9b9df024ff72d2b177564990c689e7a6e26869cc1ee14b682ad6ee3be9c03c24230911ea31858ca21336bef99abe946c6f0f2d79abced585232aea7d75efc18fba6f38b5593e295917c04dd415cb4771d6aeeac65272ba9b185d13ec2c98a9afdd7598e1bf0aec2c9e105b06cd8a7c169d06bc5a65141c21f4ccb0d035836fdb2835e4a2a2866fdf6a6823561dfa5f3a5a3a65407637ee4e7cca2d14ff3738c2266c22800b2c01e945239ee208b93e975b938b6466b084df601ede4dbebbf4cc00465ca755ad5851607ac123d3db06570f166bc59fb3823fb5d988bf4787aa09765fe901c810266d29ad4c81373b7d7e163828c1a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000884ce5e8fb5d337371b12a088b093850eec3f2f0dfaf1f288f355f9f291d775a1fc9d1c086e3f860d4cdf6c71f3dcfa08d7f7a767ef63800286ea7586af2b0882ae2e837daa2632ac1b2b7284d3c2da26fc043da0001046278d5a35ddf644d0edcd2a3531c0b2df4975406678f9dfc77bb75ff2c75cad9e2bb8dc6c2ecbcf72b1d3bc71c7333ec12fa3383be6cde259e8b6cb9c85c149e8d9b18729b3265a4936a765a92eb82e7be066754f7b40d59f6dd563cc979f5ffb2621f0a010b1ca8e8123c20e614384f1632f541843ec202cd3f67faf9cb8c47e5870fca94b59f53257e5e81be8d20d2382ecb0bb650052bb5bcb6d4666781bc46aef1f6697c21e58c529d72a5c1c8e61834f61df490b2eb139990d7f86ac6194458f99ca314d0ca2a7bc8902e5c3236db26d17014d09abb6e6ead2fcbda5b9c79ac4eae6ef21cce1123090ff1b4162eaf0ad6aa6c82c46591950f893f43544c1a53998f8c01fe889cbae2197b9357deec1ade2f8ff1ad6cbc270cf62104228ffcaa790ea08a5550edc482677a41f06eaedbf2883789de254e0d6d3a86c18b37ff3c2deeb651ef68cad59ef0797244af4516f1256443e03f1c5e7e208274d1ed737f6923b35c9fe98f77d22505884d23f395b59ceac64d0efe7b2614e588a68745cbfc0fd6d816a6ca0000022800000224000002201a75e7b35c9937b4f6d3dc5afb208d190a07a56b5835ed56eecea667ef33af6d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087f7ee54bdfb129b539ca2e7d18d7b1ef412aa61dc24f9fc57cf89ed1ea276e90c75a905aac7ccfc452a2480ffdc475d4da660709d81668d9dfdc486732616dddb0eb000c6af9c87b2c58d68f22a264c39a70f577337da88e68a121eb3475e4445da17d05e72523fea392336204835ba78dd32dea6152ebea852ae92a5337de01c9d8fc16d325e8e625eae2e4a2ffd19b3e8a26dfb6608f6c23f40330312d66ee9f83c53d58a8d6c97db489029e3fefafbf916e39b5ce36fdc924b88b0ce25eb38a6498eb54bcf8ed3c8ff18bf1fae66ac3b9f062834609ba41f40389e60f82cce46ad89a404c4ce900888962a066c2815ad0bda06eb1851c12d1af4b27ae6955b282776f2154fbfe0e7ba7b7ddf58e8c3b5232d98b479c3bb57089f735f8cd8eef7f10d9f7d8ae9dd66d006f5aee1a11153d2f39d069e0b50df4ceda569125ecfb5b9b978940c453e261c48f4f931c06611221b9c31dd756a17f9dd05e93f671df2c16219e6ec93ef315239b9a7944abdc708c020b23988f58c19f2c889e9a4d7613b690fafe8c7261f82954f3ec63e323143bb674cef3b0e7968c489c38ebf8267e297483fd9c3febcc7c0f64c94275ec048e0b8c177ff7f24c4716dbd3a20000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401182d387cf345d741ae53b66aed26fffb61cb39e0081bb24b124770934221672d02211a6473106d5ff51cba8f3c9ab8e6690c89e684ba519ecae85f2bb4ec2d12541da497990a9dfce8c13f914e538367113032f2344bec8920f662b756cbdff0fe0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024609e3eec1dff3109c52aad24411bb7504dbb9c95e201941068b082c2c0b293c694d79909a4812018d1fcd3545ee20fdae7c46d9069c95eed6bd1a7125ea5493f4962686c02f17a6f55bcc62bf1660e7a76e19ba161ea83b5cab7ceecbc963e764935720cbe6093a19ae94c14f00d010299607135ac9d6309854a52ea1216bb52b55f41c9d15387d687f5f18823796594d6d507694abe16f648a35249a40a912d20239ff4f159eee1db380f7e831861291c698dd8a2b28b018e9981970eef010a9c484985b4950c96a92af9d3b0506bd071be60d3ec4524c816abf9764dca8a27db080a743b78e0e7f86c64f1f4cf636f9f636aec9562c0b0df59866d8453e5b60d68b45398b0a882df77a286aecff1ee02d9dcd2dbd9420fbf126208a0f9d278943576ecbe97981bce0c86e2737d7558f36974921a49ef3335afa7c80d8329c15dfa2070bedc72033d7869d35aa20f610eb5bde06303323a7e4fbfc3208f21549c7862951335393efe92acffba7b24f9e014ecda1689ef177fc94ef6723501209f6175023d02192b10e8cd4a5ca40a8bf046f9dc28dd47b8ad12a98f119716d282596d559b12cb27390611c1eb137c7b738f9a30289e0aa01ecab8bbbcae25c4caa57e39a4bd2a34dd162bfba56625e899a16fc9b4a04656db05024357a0270000022800000224000002200968a0b50856ac9e433dce9cce9a817b5fcdd61200a821a956fcb849ecdfb12b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000feacc7a68ad6416b0090517529e3167a88f347b4e60f880ed09959aee6144141623f6d3a90809dcd70c223317af6930c829426ee3fd68b7dca60222ba2f42e92307aea3042fdd6cf5d5bcf74e8f99acfb27ae72644ee6ae61c0ebc9e75b948a2a40e8d4bc18a26f89a0dc99ed5eb3ea2fb8a682ab1bfacc05b98d6224d49cae42ea6fe63d1e9018a784f0993fd03d857e33ac8d19541821299233052db7b797a5778647976d355b755b1cb8b95bdd01276389c7bc7359b47d7d3469d26818fba45d0773d52d82011bbec98ef03dbaf04471677231ffc13a12420e13414d55da6f69ab58d04c8c8798490e7bb2504a5462e183fd40895f424b9995af0c499492d5bd3206dcaaa0a66e6bae68592602c5c92480f057f5c65bcd9bde016b4833649fe8e8d7175d1947ec10fb355efdc0e567e04e04b81de61ed4696e288365246ba9d8bb59f5d02c6fa384304c00937bf6914fbcd00fa9858b0fa83be9f969648e78d85ac345301c0eed7557b9f7de4290c8c9828c49e10f2be31d391e1a7840835240b396b67d709f39478f1ed6e389033092b82adaac9ccf54e5b4c5bc96339307cb9e656f68f380a8cfff49169cc4164c0af4fd23d194af4746608a62d05369000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012cd23beda052be778086150e490aa423ebdd3cafe66cf2f26037f5723b81de780221712f18cc191c2ba0cfaba311c31257fb87ba5c6a32c083ca2ad1a0ff3606680336d83ce6148722d0db448a4afd48c33d08eff8079a1d5854868e136fcaba230000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004bd811e20b00b3d3ce889f5bad98c413abf7bd5caf897a7a70f25d5eff4a206e193b1d7c3ef874efe70edd956e4f03f32a1bbaed8d832bc98591b58ec762bd8abeb191b62e3b9f32a98f67bbf400cd8bdc605d8bbe9974bc1dc6f6723fed3906e8d30c4e75dcad4cde3dd62d27eb6421595d5546b783f0cf052acba965b1dcf967cfc3aad47c190a21d9e0c324aa6f93deef22b9b02823107093b7aa3d921c205b832a823ad63097f68d8459dbde0d00fa2c4ff114570577e3a688a07d4a796fa6a31e11d18ba6db8d03665b87e3d6ce8f0064a1a6576de2784e910f11d522f282d8c565ad78f33ae28398edb7ac6cb1e72bcfcd889a229f9b82c01e77552c15ef7272cd0b0c75b26676a61baf9c2f796e7e6af59a5925d6e4f300c97e4e7c2159cb165dd69fdf87850076b8bb12a1464479f96d37964dfa396dc2f9e269b524dda6e302b05614c07b281f9327b7f16751515adfc86c2661111d08f37b6c8acfac3d7ec586add8f34dfda87f9e99f3c073952dab7f3ffe69ec1af41d910bf2ec6ac7ed179515ca465511213a28dcc06a0b5ef58d60b6c3a2cf6127d323fa54c0553de753cbbca3238621176556c6d04ac4e1d6f454b0194cf612ec097aa8ecff674b727f228d000bedf87509f876f2e3900d18b505db1029c0f2512f0acc3070000022800000224000002201d9273cb759ec43bd409bd15fb06efc9c679bbcabf5fa974078dde9ad6303286000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f1575eefb95cc7f6158d89adc93b2cebbbdc63949139ae44fdb5395acbb5459bf5afeb4ed2b6c0ad0c6e9b5302d052094cee2f7ff694cc984bee895c86717194adfdc0a55db5bc31b7c41e2ad6451ff42b616c1715f1c107fa8ec7838b81792b921502f3f7884d0720b0ca9dcdfb684a2d52360a1387a6c0803c6d126385c05e3f2bc244678e47daf5f0d73d4d63fa51a20f2b7f8d63aeb9dce72852fd633acd022b8210ba2e38b6adba54a66b49b2662163e5f53c7360e815a728042d584a7ff25242c484dd2aecd317adb207907dcff52ad2b26491a2927e28c8c83c6586f72d20dffc58a321cd397c606986c54f555cd29e4bfe55d6006bbeab90e714002e260fb8c4ec3dada9363a06b72f26b959955a9c94924ddb4f014c59d5d819bdc57da1585579c618ac739b6b76e20bfb6f2f31b812a5191a2ced3801aa4dd0a83a69c8252d04e9c212dcf559b975ac79f073a0e7b55f28f25caf2b1b66b3b9eae6962a99b7e2cb8050b532836d08c659e0c802846c5628a400af19de2703015f142c4310aa940f522fb614f830a6871530bb59e06dd41cda1680c6cfc022d6c90901afc11893b01191698c5426dfa984cbc07fe31610031fd19eae8c6862c354b000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802298bcf98cd42418b26aecad2cdeae653fac565a41482ddf532ab27d6766d59a911b2bc17caf7105b070e1f2b46e970acad4fc83d48b681f38f7f21c0586166fd02252b51acce730857b39c3a25b5203298fd9729aa257eb2779ba4b8727843846b239954e95ef36fc3bd3b9188400635ab45361391033eb6aed0248555b905a1000000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad4be25a618bee0ec25e1395dd628e21b5efccf798662c142f4f644ebef2c5ca2854e6d92ef0fd019ffd59dc3dafe4c875e1bc9b77b03c303e779a9a27c422937d1b03aa78163b822687a63a36affa0f885aa4bcb03de701fca4df4915ffa94c73809a8dc8d91d4e37c615a24feba37c3eaa87381eaa787ebab644cd731895f88886332ed07065cf487e8cf16cecd72cdfc779793a823d609ccc7d7334b9d32e309bcf644f12a349a590cd389a45442e7c2547fa1d2cf3b42651f94f25b460a8462dcff89124d1a60b65658a29bd0e043078674ed931c167a4fb0184fe76fc02b7fa1c0b2c3e5d12a88c9ea477b139d601d50cee272e6afcd19db83ee21f0256678dada64f467b14565a7f569af12f5c17c63c77683c25a052332aa8d240061c2a2ee8458c67458683dc78b687b77ceceb3a97c2d52248587f3526c1e5d70b585a48aa3889c6cf39c4d2dcfd3028a4d4d6e7b4090f4baa3f7375580a41f317f2b839eb4b0dd74a36eb29fb8bc6716ee828b0cf6e5933510e8298e2489deaeab890167a57bb67d66e831d31d7125f36459861fb07c654767d9236e0584c95cd38149d514c78d54f705ada83cefbf50e67e989152e75df10d3bc9b77a09efbef826c605680d8f773a52d66decebea9887189f7d0351ba2af9a0e52c86963ed28a700000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b9ec2310c4b596be023d80a8ae94787caa953748928151fcfb55b825226cf33f1bcd30b0a28386c768d908167f3703f6e11680d0496dfca7a154ee0e604d03c58a3f4e2c2403052ea1ef3752c825b9ef71b9ee6fb440ad322db1595a1a55b8ba6b2427909eed2a33ae794212c6fe4858899efe3d55367886c4bda4d6f1cef7febad5f5ed864bfbc41185203919b94afe0ae0d02c4ab921eac9dda58fb3bdefe8e1d70e543808711ffb5fa1696e59085eb312b3ac6b155f4d85e12c87a793b7570520120ea89d48c5f9fbaea28ea1723c1c3fdb7a41b95faec3409ff16dedad3c745aba86e9d08562f3fb5a6af2f7ef8d1b6dedb4e56a5e80ab3e7ccc917994f6047933ecc145743b954e111a6c6a17c01ff509ea565cb79fd422664bf91571e4b6d353d2517deb4f420982471028cf1992f36416ece273dd224e07cd68a34b9b0c6c589520dca611940301cf71c5ee2d0df51296f8905b9bb9829331221c97fb2c5d3e3cf6ea42ce0daaf7a2bf60e806fa7a09314b12cf88bbbb7875816233b8f4d780085eac8f743cb1b5dc8b2f9afb093e49632a03f0cd41da9cb2a33e4a68e89a70623313a62d9b1cbf09bd49e9b2115779cf0d99d0637a6b5b7db6635da9840e1dd54a74710c67d2ada1339e985063bb40601bb4a1c008e7058057fb43000002280000022400000220113de52fba155a0d90887ee9d9b9b95024b073b8f3855e2b6a18d390ea0e89e100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085f330edc1b8f03988bd6adf73af3f4750b1e3d81bfd26fa3748042f0885a1eca567bebe0888b5194139d2632fdb34fb5dc1a78bd2e8740f8198e28e515449dd60b827de38ddadf806394954317c9d273ab7a3e6e1e5aecac5a9e5edf4a447f69991d58355625ad74f1a1e811037ad66cf5543e634732fac304c5a22639d087c3e6d06f1d7ef2a5bd59e320c772b83a8d673889c371d2de73ee2629d8950ebf60a6eb2a44ef1c3632626376c51f315fe6c4ccb541378bf937413004adbd0f46fc76b57405ef12c31322ab06e7e04e53b84b4a87490b1840e231f6e53d16687ca4ac8598b4da7937e237c8368b19f4490b2d9f7bcd1933b78586e6a3a94cec687fae365bca9541d0a31fdd38d9dd5c2298bd7251f70a3716cf16539ccc8342d08afad6037640baaecc3b9a31d0fe083ee1775f4ee59860075d527e6ac3b5b236850ce43973c51efe872d1bf3adbf22da1aad6ab17b528ec198ec0b5d56d2f8238c8dcb4d7171a9658abde4da9c27eaea19f7e38c50edb5c48d788bb21443d6c812834e8deedb07cbe6579ae87d5bfe11595825447da3ee042a35655c82dcbc00f7de603610ce015819fa8fcdf37e20e76b63f1491aedb9f8556bd2fe894d304b000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802233c371cfdc7af67030dff36a089dc8ba3f29fde7292ea2e74e633f191084077000705945fd3698d4ae63499e5322714304b7f2bc3b2dfda24c8241becc6f357022603702fc78c77191408ba7bf9d6a9753531bfacc3dc24a3abaae1add2eb22b7172ca93cf32374d6d121812a5c8f702312845c4aae7258ce783fbb044d2806260000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa46909097e300aab2b16b687274a79a563a496f5b695c582993828bd62f4dadbade0eaad0b518e6f8ea05699c309eccccdb9be100ec3156440f3b30de8c7352a6dc826d88f25a49559b0dddddc7ce53ff0c188900a4be9c28f382f1291c73cbe4ea5b7e1ea3c2821463155dd1df257d8dc3616b6959d97bd5e8dee0d926397d54c84a4df83424fae051159ddcf2936599539ff4abb204f87e13eab07e39c762d268c5e10227cfea044daea974ed5f0611c10b060a03ba4a93b288099be512d4c40c5f6de01ebd309f0433d4379ac99853226bbd996c7d5ad49d378048d1adbb17107f79db6ee3e93696a7ff2976a2f5551a8c17a3d2abfc606169a4f9c60c9352e4e816ed79a9c96bfcd879016a2638626d605190720e659b6b7b3ca0f2c35a327adb23c4f5ce25fbf7571675309296b537aa604a9431a6c7065f6518af446172f7da972b2d81c484417a8714eac7a61ef240bc45b2f88ab6ddbb765063c823ccb74b9612257e8677ed170fceefa51b76a15fbf11642a7f49b68e7908890a5f60925aaad735be04147d657a43700d934e4cf7ddb6bf8c3fdbb8d404fc454d8ca8a678266f5d72ade30dec14df5aa553947ed3b703af59a9ab33858596902ef1ba594ef9b4b40fb8389791a7b0888c4de8282346e18357b6e9a02c93af5dbfa20000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d64a0de521d91fb8634873ffc0c67f6e7869785e295af089d0182920298c17b71c29ae9b4738cece638e378f0a57a7e1816291d9d895303b91e3802a14d8b2f682f1cfee014cff7e95413372818d57b76eb331002fff171fdfda094a785f9469d160932d6a2b051ca9643b4f2e7e217a98da6158710fb3d4c10083dfef53ebb7bc53f3ba8469d92767de0019749fa1156e49e464feb0281b059d8f201302c2fb305d16a7d19c7452eea48c2c6dc8f5e6f4dce53effc8be800c2217fa4e82f9a2a4fc25ff9c7ae9cd2d3796ce8138e31e5d2f4e97252ab1d799bb7c71ecd9f9dded3e5e107eeb6e400e929934e69967c4af43e11f3789f9af816dffba03da0439029be3d2136b58b24e7c5db49a0caf859906bbaa4787d78b96af7b3ac7b195ce5706d22259b531fe8a345670a0007574ee68065b874a3666d03da0bc592f5982f9297f31004082944c766959cb680c14bbb1b23c979bcaf0faa3e75fb3fd19a784b76d1f7434cce0855f7301a1990c6f2fa6f02f5ef20e07428cc1a75298088b1e91e64d9e3cde46993897a468215d14df3739b016986af6d77eaf9565bbb3667dac33ee4393d8c920b8235913150281aa924604987739d5bb0aeed81ec7d35921d5bcae3ca409d827c920b784f78fbcbd4a346298522e9a997a2e875a034970000022800000224000002201e11bd4dbcb04dd3f78abe1363d076fa3e1781e929796635971cd0828e78199000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a01955aeb7ec5b8e3470043c7373822109af509f52a5678a5aadd73f538bfdfeaa007d2f52551efcc9b9d79d6d6d421f543dace5fda25143b0156148abd0fe121379db37a0f89abcaba7ef912e31a45a87b83fa2e207a041fd45d490c46925567453015797c12fcbe84e8b98f05c829e890d6c7c9451f8f411836be47fb7f5cb060c0ddf3ca1226ea91115b3344b7497bcb60b84e29212ad0565de886fc522e2f9b7cce0584fa1b75cf7f3f042b68f6d0c0f0f043e8f372f1929d1d98bb32175c362f6d3e58779ccdd7669703418ca53790890deb606d40685b276f89883cfae89b9f97c8070ef128507d602d0181caae29a63ecf226198dce2694381ad0d91f4dbc3ce262abba63e80314368c2affe235f6b6ba3b8fc19015c5ba18254995746901d0da5910ec80721f71615f730ae1320471d152f3ecd5534732e9a52165ebbaf1983b2cdd626298b4d795d4d3433dfc8349a8e27c3f86a64bd6fddf8ac031cb6a54ca1a669c222ab6f730306d78a413541f61d17062565a4cea3c86fb1a74435f36141ea75f7eca5d764c16b95569682e358d0fddb7674d5ffc8d00d2980dfd8ccfdbfbd5f37656d096fbf4be176baa25903a907eed1fc881856589cd4de0000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80212f8f9673dc83fdc3df897351817efa91983546b3ecfc0125ca97941b68a4f96051fe47972cc37d9b6cc0bc36e70cba4f434781ace4495836928b5f23848ac960226521d4679b559622bfcb8b0c2cc16ff8047c6a20817d0f6cd4fedfa8bda202b29df067354c06743e3213c43ad6db904f5d2914ad46e32af4332a7fc60e759d10000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ba4f3a9e7b4215bc3054e8bb35c1d746248dcf3c3ea121cbbb91b1ffa9a10d13932cb91f8323b5add8e1471c8d83131cea04c4e81b0af2b6068aacda83e337d1da4949abb2a00edd8789d2cebf9958f6a32245cdd72a32c6d097b4c9aa60c021f23ac63304764260dd92dd4e6677a60cec1131fd42065aac9cd81ea0be8f95bcdb66cc5222e2d53d9119677414c367acfe56f2bba29698542cfad44ea937a0b505ab6e0532ac313bfd1f0eea6925bbbe8d0390339acb2b9313d26d455d72ca9e30b31fc75cbc3bece95e9117349d30a659765c8dfa68ce38466b56efbc41bf7165827024efba02f3e117f560f63be54eeb1c8224835504da5db78a438ddcad6165df38edf7009df5d423cd0cfc8492cbe3fe2feb29c9c0bf6105b971179a04af36a8488d1d83acfd46f5ea5b59f17e03237b96c0ffda28791faefc81fb7c11d3d17ca78808a35b78660165f5c79e40e1aa012363b2a3f51037941eb35832d162e031eac8fa602ffe8ba0a8d736bd2c689b53a1817d603a7a4b285b20dfe4ca1b2289b4f744e80f0a5f3b208ec0e8d1bdbf6da3115703e48872d7a23e25b1c507f81a9d71a6ea6354d96b353109a1435d007e18588044f48b16d0ce055b44c6d221763b74ca8a309e105dcd668fa89ef71461c6fbb492ecae97e95cae44432600000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002fd949cfa80d6143df99a9e6f1659d4f6e238626d8552d10c956b5db1e801ac11a7b9a23a67e734068c8286ec5947cd97aba43b8056b1c3dbc408670125941ed6eb872fe3de4552f57e9accd09cf5c034f112e9574e9ab7f5ca903b7f26076c7fe633477d773a0616437770eacd5d6754a222e28756cf9ca61c7bb83be950dbdc810300ceaac34c95a8ee1306984f993abdf2cc4f88ba222c198839b7503b05fd474f9c5a137c6cc0dc407ac11b08462c123a5c5c03194700c8b92d80c2122bfa24b74f5ef65b1c64610c359beb9fb571a297b10188738a09e91f94605b5ecdc7b8a4a992df02d5da0ad8eee77b58a341f429d7b7d4a3914889b7a397e9edd0103b9f9cdbc05789d272a1f8cdf8a029b90b35e009c3f9199680c98c307f346cc48dd2bf0955c1c3c067bc82c553f651cf7ee9d9a32613fd40849dcf3afb384825a432c668a3084e0a74359fbb5932b06610e0028aaf3722b551b8c223019e477b0636b02931bb37311833f4292f28b3715ec98432ec0dff556ee30eac3d1c4e8d3ce4c9cc11f91912d1ceda26ca7b021814eb6d714e62995fdd5422421a5cf5fcffc05ae4ea2b2ceed8b3a54a1820555195ce449656703806b2a2c40cfe8b6d5a7bce28b5e1224332ceec6c8b69b97bc169bd1296b0b3ec88679988f01a79cd0000022800000224000002201a73bd43e6d70306214828471c1fb6d80792cdd304514887ba9dc3fc7e3975a90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093f277152537e0e4d2e521e92afff7870b87735cd766282bb72a23274feeccbd87cfac29023fbc5e6ac9e4f45f14585be282e77c137d4ae69124e982681a0dd07c40a9ef34e1e37cde089d25543d7a7897dbc2ce7797aaccf048561f7d6dda2358698e43de594509cc8ee5d8402ad8cc595761c4d828f8acd4592996b44530d9ff4575c317b6f8821b38da8cdcf8bb30128de77fcb689337995ac330af330caadca5931485f89544065f95e4dff459f2d47cfbea174645864ba3984f6926cbe70713a0ddddf5dc640d5b6a04e67b4559ba0ae0911fc6806db19d2f7cdbca98555b4a8238ea87a1df7ea2ae8c84a9a59806b294fbe97e3102f728ba4aeeac4fb81d8aa2e958aa2a0064face8ce93275f43836282782cd4d12f95de8ff34bd84cb2c2cf7e33bd0f9ea740d2bb14cd3238d5cff295e2b487550bcd4846ad3ff7570ce35b980fb1dcee1989b52ee0ae14928a0c5cc94662a6bc10785a177ec6b54926b3a92b3339ccfcb47bce880e17653a8a59c124791e38f8ecd9675fc372b3262a3ebcdda4d54a974ce9eccb9d58225129074c6fe887a0332c332e5eeb0ac03a91ca856f419eeb185547468d88a519040d6c19b1b16f6ddf07cf8f3430acd6b0c000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80214a6a3a206339c46e5e2fd66bfed951a7095e693e9ea90722a9e26b2d801c1700364491e9d4c6f33349cc01faeabf650749755cc74790dd21c0389ffc0fcc0c60226f47468a89e7b6a02cc101c9de77800426c8cd6420c2d18fefe92206520e16425d97177c5e3b146dc9c2bb070146ef3c5bd317b28e8d51e0f31f64077bb48d00000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025f5505c0af7c30f21bd6f42425363ea7b702a083cb85ed761d49900b96f61fac4f2e794c212850cf6ebd8d42779a243b4b7c63069590bab3723580c3a3cf621963a869562af4078844500a38217d170bfd01b99d505927d5bf2f776ac23e720792673674f175bae0211da01190dfa2673704477583d321403a4779cd54c221e4c912be08384e09c5a1b03f044c12b15176ea8cae868fae8265f74d4f9f934e0e2aa4a118fc9ec1831394bee57116227d7531b21ab23e1dfd20a4b86e94b18fe4665ad4994fd94e8fe8934ae450fb96298809b41a887b5e1fe5f9086aebb2ba49a86427de71c2f82d8d826b74c7b00c6d80cbb1797415cce41b0a0c034ac3780f17bb0acb58ae1673384c39754c229b52742af6014305ea1fa590bc5415897a796dbf6a06cfa9ec43f009cba62bdcc878790efcac5e7c2fbbc958474c62fd2155a4b163915d8257609c4c1bea22d9b4c33f7f2040eb8533e209cee39b7188933434e8618965141cd0b91d7bb608f00077d30228796ce7c20dbe9283a417708d89d8a675cb932ae917588238c2fbc62140192eb6e608fcf30a691cd6451c9d7c070af6bd3bbfa21d7934dbb472e7fec2654b67db249edb5053d19bb8b9434c9cb3845a32fe16b424df12ff4f79d59a4863b1ed2c582ff4e9250026ba3abaef3cf0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d1ea73072f87346a233d033b9502dd0fdfa267aa8493d2ffd465d97c877ab20628f00b40c4d344ead6102047943ecd20ec87dde84796c1d85fe073be9cfbb2544f92e821846839423f5d64845dbe15f69327b3aa4a4b76ed98f9d893debee19e60d1b94f0f67bde3bcdab82742eb2d8bedc29fcb2bebd5fbb903d49136d2e3e80204f3d2c79dc097d268c4021281a3cc2cc5525863c406f87c42fc05aa2c61a21925ead42d7b93a701a740d396b857ddc922aea3595f9d1a1314c1030d7651b1ea5e7c100123f95248fd5666c25f274c7527f46cedacddd57321a1b02b7c95815e7545b63b5befe7f200a40aff01a0137dca33707c1658bfb9e68c5b9794593d9d99236b34fe9aa056fa27c3a478d2fc261ab66173894266e6244aac83619e12bb3e36107d77e8603dad5c0879749e231fdd7512eebb1b5ee5479365fca5f2abedf08dc31b340bf6db7e040cbbd3e50d53f07bb617f0d7c7c89c2fd95a7901930076e39796c3aa2dfeb1197e48ed094b6d3f306eedb2da151f1e0a7c8c39e24c0e5a1e454491cdb84d4f4d59688b0a637e50fe3e8929bdd3fb1ef48a1065e6ef3baf64414341d982f8e65a696b0af22b864366c9aaafbbf5ffb7b366f052b1fb92e7112f315b1f3aa281705007a4bb0ab22f209ce3df63d2702fddf5316a3fb00000228000002240000022029d6e2e2ab5c98c14511ad219d5dcadb98b5c3a8c2b1329a0696f83f1f7ce96f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed162a66b7dd93d6e09d55cfb68d497fecc53e3b757c6ed4f7661309223968ddf35703f207ab4939de4c1159c4ab1d4115b3e755e67a9a4528094d46a9a15f222c93dfece3f08f295933c7436a011747792e5de3b4fa999949821bc026135e7d52b72495e3527c8a89633cce7f8b80663ca8cd3f99f7868fd9e71ff82e2dc12ecb3a1d0540b633e204478c311a42e0c8ec3b90635853efd86586f4165253c16b1c5e1a06c6a8d5a4ba7a72e2f55ac2a24b3ec7c57c999cae98eb630d3545ecb61ff16ee695f238b5041f9b028b854845506c34929d9e25a851322984d9b51c0f4a21bd6ba5c0d5453052ea9489b7039a6df239f10d43dee6f1d15422d3cd10f8328f5dab8845bf30abf457d4a25e55cd605060e5f6402217bb39f37821e7975eb87f7b44c22ec78288534081ecd20a0d5d56781c08a1126646da0801c19e4f0d5094ab381b77a3812a6084ea26945429be6330f927a47231da4f28af940dbddc8f105508a1ec66eba428883732382e40dcd7c69eb1af55623cba6fa4c134f9dea2e0cb89bf26ef401b3da60c1bd674261ad7bc69dff6565cdda7c07862652f15909792415165152fc9d9a0c27a4b1f9658491e5c08f56b968c678a2e2a92ead000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40102becca3c1b560a7c6b55b8abc156ae140d20116e4ce88579ab8e3f4e4cf146102284795ad3f5239abbd2f0dfb1b63185c7ba021ed4e235187e11f0111de70b412021afc4e18b3e860577509b0cbafea516745ea8c948d9c691cab9300e2cef847000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008fd1a2b24dd210b9685677c3b573d3a9d5bd7578b4eb64337c4da1c9e51d59650f21c5e4cf015747fa456a1c3b57202bacf90f784f4041964f5a6056f2b001d73e0755256c4aa1eeb9f5631114825c904bb1fc65d90c61bc5c28c8f533f771e213bd3461092bed2183b8e2c1cb187a7a3c5a8106f0c4b8455f767a9793eba87bb2c3207211743ee0a17f4741e1e61607975e934c98ce60b8cd81be6fdc831999a949a98ff376cc0bb487f89dc693fbdfb6c1699f9e69ee997e5ab4bbaa22357ee9975fe1833f04d70f0e2b10591df0b4c10aede3dada262926bc783fe194707d8f90bfe8708ad30cf20a78b5dc068b6215839e0c332601c2d5a1c5bcdbbeb61e0c9e3a137ee2afe6279f5d7b487ea0c4d4eb853f7f23832c12d5d750174537a57732673e87eef1df775fc5752afe7eff0bfe6f5b1ed79e4fde4e9541c4cf6ea9faee74ff271b82145054d7d5a21f8b3d8c34e6a19fb917193ef2ff874b8b14ece9374b01e5ade13ea116e73036c19f5d2d30e08d0c6a4fcfb34e28a0ad417cecd69f54643efb71d79e0307d56d1b8ad62f1b69394bf8381004cde99c76f311d8970ee90a3864cffb91ee0d82db5b7a9bbb26fb4e5a4c12de534c573b92a81d842ce5a788623c1a98e8610257154449ad714309095d9cf3e7b23dd61272c899380000022800000224000002201b65cfde34fd7883942dcc2fa0763d6d2dc86562f0a93d668a5f1ed99996031e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a47b18f6f541006215b66d8bdd9e69d0377d9613daaf695055210ea7ff418e123111be2acce9d395b66205f961a91dd1f69e697f3c34a46e725895a4737c82f1e673fda8ab894b31aa6d03748c534ecdb768fd7b9d0e80459561b7c982994ce6316670a57b07730e4616e5b3fbc8995aac29a3c9c73f9e8c54452587e13440cdb8334eeea22b47aa5b8489e4293a4191099a3a071af52fe5e7effa31493d1e113c74ab8deaa4853fca49d365cf756808a7ad00bc961def26e9f5bb58c07725cf82364cd151d3461dbbbd20e82e2d0fa193efe0e7a443c1821d4f831912d9d5050120adc8d9243942feb6c1b09df273cb9fe29552578da3a20e837f5eca10933cb8679a4753bd7ad18466c395c800779eb2f0081dd66abbea1a8ba2b41624d4625a0349b052153e93230b5b80c718635b2e472fe032cfc18e817b1435ea23dd84f2fd551416cfc9845cfac6223c1a5ca5eff52fa221e4ad1bc43eaa75469718e1d2440b5fb310512c95f9ca9e30abf328cd2d5497522ebdbe8d9d41d092bba33b441428cc8d3c8886e97d64ca6fb917415c5d9eca2b3940b5a5edcbd4c95890583575bd52ae5c1282a824978f5437e8364e11d21d23fac7864592387196a7f86000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40117d22c58fbf72326ba76cf4e43643457fff6078c01be446628a7856ca0fc8e3e02290bb3d46922236a3d747284196a768180a5fcd6468adfbd2280136a1ee6d6d40878dac4f084d1f692876943eda2ff14a1a44ffbd15f2cb886b28e8819deda3b000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000958d97bf195d399b8775253592806589af42682a80ba669dd577b2239608277e6c56425c19996e5864e0a96325078b3591dfe81251f8fb0af7cb3dbcfb90542c49263ed151e02c386bd0284c6cfcea9e39ea5c28e20360bc78841a473b139d65273b07814408d3f50ea3cb11360be1e9a830403579a71343a302d19d7282df4ebcfcf712f05c3fa3f23caa1f2d6b3a9a5aadd39bd062e8ffb4bf2226b5974953dc330cc828c7bc89b40dd11817bfa309bffd571e6d51b9c09d3743d8d81808443b6e3cc908716c08edf6d17d454851a54a229f91d2b544de4745f2377a6e9d77590a0e706b365d84124b2f7cc3601d48ff5a9159f4d41aa57c996c0f676d3b927eea9133c714e99225f71ad7974e288c4ad7f2f49572e6daf1cc9e6515d533eae2b5d98cfad18e5aea2dbaf9f0b643fd9134871817b3fd2d2c39228f840761d9382bb7b784be196c836b0a15cc577cb68a115bc2dab8df581d0ba36978b290c16da026722c862792af97ecd2a4c856e0c0faadebea5df717a9f928aebe5354dc28954d5c31df6c3ceb6d4dbb54e1c394981b482afc3e6d5f852e07d39d6cfe624b60952c07c051f23e05eff4a062edd729c41e239205b89d258543811726f3e2eee27ef98b3587103f3f1c4e1304924b229670ff7e1f6ff4491cd911915930d00000228000002240000022013c731f27685f52551bd0296f36b67af37d561d41dec82151e5871e64e6f831a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b659828a692e24ded38bc197e5bece4dbd384125a27a868619908f0bfcea3648f43765e60656a467d4ba2be5a75e505c215db578b1de32edb816fde56f95820476e3d1aeb13abfc1b8d146fcd03072dc75796525c7ac8fa02c2bc2dbf9948d11c3193e0b71b0f97303c168eab46df8650e39cc818f8d7274fc83c1c1fef59452c7879edd1431f0297019f584b19d884e44b85980c08a938918b64c91ed4516c614ad201661628ae421fbf115a339b8206713c35db5033341d9f84c1c87d6d07824a77372b8f2ed3f9c0e11c28313cc62fd27be47d00f142307d52d302de4bceb593984ce700de1ecf47e287e7bda96c8d7c656f7e64a5232f7db350cbd7df1d10ac618ae3b900ee728d6e756e719c2d6a445d2209c9d8f5fe2658462aa4a920dbfa654d38c76e376d27db18ee3681d49192475269d0d24770d04eb0318743ac56c5efbd82af8aa00c7d33c4c284f4f9b2280c1ef57da1163a7646898f858c1cdc90935043d0380ccf7cded52479bd2d18c04bd839089900b230fbe4f2578ac19c6618edd1b3acfe8f9d34c3d2f6293c2ceac30ac56f6e8cfa656e4f85f08dc06a372ab6d30d20ffa97537a4790d583210be7104a2343e460d48b3e25584692b000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802204b4268e8540e753a872beb750fbfef7b340c935de56323d45a3176ef1625a02851ead8a2a9aa0e96c3a5ca3ba3a38514845968df5f70dd39ca311c29cbddb0022913b4065058251ea50823cea9c836a4e13d0368b1eb0dd1398def415c265a890937802ec78d0891986f465b81a56cbc6b57a98b0596e8f212329034dbb25dc80000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830b759464853ff8ad636c58837c99cbe54b913c30620e963ff63ba4164e6d2d65045be7caf55e13568c19c326cccd01eba0e5dfc765e89cf2614f3a4842754302531c3e851a426e004476c9734d3452e7370541ffd586c1144ea2ce045ca1839b06c9cf7b0591af1beff537b0b960cbf895bbdaf0a4d6dc415033b0d0ebe4d4d16a511151651f955e1c178e550c1b58cd0f67dc8633ecb0293f197f3cb2073c42fcceba9e5daec17ea40c35247909b8e4dad147851226848ac1b574e386c7f8ed5c5360e679a7bea7dec41dc6af21fc085d7572a0a2f5740b6ffce2e4f8f8d4a3fa0fd83320d98c274735161e51820672a5b3853cfacb4d0f7dc41889de0a17b3fb5edf38c28cc06c35e87f48ba35160dabc888745c802bea5577495b79683e73265da33ce950c4bc25b701c1928cf54e6269c0305a6504190d0ce428af20236ded08ed08bc71b53535a3e602037dabfdef12c0519da97b8ed8ae1253d9deeac699e69078a7c7bd494ba72fb297d5b5adcd269472c36f870034bbc730d42830bdd56bcc9e74760381dce1930b65053b551d8f5f6c80981ae69664233c0cf988cb0fefbcae897258f4b9e58e06a60e5810e613e3ce9aaeacd0df4d7fb2290fa9b999b70645afa0a9fb2dd77fc73de122c73ce9b7f69697d825d1b32a6cc0827c000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000103815e5c15c228a472540087637ce7d52adade8fd80d4495230a36232c91467d3b4487875860d710532fff1f22b30d5bf0a60cd2f7985f93e8253cc66c3604995e1e141fadcd610ea21e4fb00006aeffbd6ddc842c1e546caf5d5806b07a746c0019eb7e5527ef9666d208a89503a1a0267ff876d511dd68b1f0f85adeaaec3257f2edddf84b62c54ddad18d3e33920fccb119bcbc44f5449d3a13f8bfd079830680739ffe372246a8962749d17ff76e75548815ddc4e1a3bf6caee33373ba229ab2a6ea9fa4233940c33d3f53945b0e64e5b1e143a73c10f60395f9851a55298b986fc1c54bfa5eb2c4755cd9d288e07d5edb1987b8dee6e8b0782a62fc194985310950eddd0016553a34a165c4fcc52a223177a9e15c5a1df06ffd2a9f735f979f1ecbcff83cae215101adb4b91d16093624186519c7a378607677bb75171eb8a9ba22a18a6fe4d4a4d1a2fea5470681cf563fea5791a96ece4df0a82c46e3e4da25957ccf4c9f78e4f0b068172809019d0be13bdb8bfa8df4350f08322b6dee7a4d7ab17735642b89349d1b4d3702f4535e5bb4e42e02e11cd79e1d8859332cee4e6c45eb98fb23e39f261ff7764b16e89995fb16b29d317f82b0c6b980bd1210891d73c3267b62ba90fd70e52df3a0286ebe16661d094ed66eff7f5bde20000022800000224000002200e218dd9ec92c0826e04cf6ed689d739a7388a2a197bc48b67acc7be8cdbea6500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091f1765ef9c120dbc3723fe75ddab036af476c4cf823a201621567c8c5dab502290d10b2b425d1264842aaa1faead6c59d824abbab00f2a4f5bc04d3fc62f635834237cde49fa8d26d4e8bbe38829367d69ba0cac4df1f0bcb62733cb204cb20f4ab29fd6b312f731c9069a4d0a8edc6d4a4f766f3d7ad270d2233cfe3e1177b2504006bd4f79b896f614f3fc19895d48359ed50acbfb7638f933d27a90bc74d39f0d583eae5dbd950b4ef13f759c3fd93e8ff9b030b5d397ab846abc3698d39a8c4e4ea5ebe777751a8ae44f31edba4cac37eb05a4ba5aed11c517824301d04226577387e097a216e534c94b1a9c0ae805bb0d20ffce8f372b9dd2d355ec8c67f91eb1922837346015fdd740f1540739347f9fd9d811f3ff2605ff7cf464ed0283ed08322666a86d37e32e77f6de4173ebfbfdaef7c8327ebc08db9ecdf75b7213e82d24301844e38bf4f8398971858a1a7ed03cceb7c6298f2e6085d304162615c8ae8c52c8746ca05c900b29412832e302686854edb7227ce755b4b68ccd357138a8d2a6f291e3ea3c0d3e6d914f5b20a4236b69645675836f08dc0ca3812dfe0300c76be72f13738692d1fa9e9203f538b9a600fdab368e6dd3ebd64f93000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021ae450d1756e78d6be4502abcd81f4a2f5eb29072a99cef5300beb6f91e199590eab0cbaed8c6619d34e6831381ed11f47a168657f15c5a86b9063ea8f808c22022914739a7f64cd5f39a48672143b802f19d83750a449bcd40a25aaeaf391711425966d9ff56450ef9179d393618a4f918c0644bb9e59c470608f7f4361e374900000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001dd2dd7bfcf41ef75a38304beb06bcb33d586696bfba6befa79329563c57b5481a902cd231f940a9b3b2bf23c669ea7a7efaada19f2b4b43ccd58b9b218316db4e250ca1684e291893f7dd237e2488c48e70d89ea1142303fca1340aed918b6ede922aa4ec4dc05802f9f1a4dddc6ceef704cda6484090694935c479438d04a49c51190fd75fcca2528583e222a7b90d3def33c3181e417069abc6f04e24dfeb2aea5a1479b80ed0ac4d5dfc21c50d893d9b373b555b4be31a440d027a96929dedad7e993d868e9613b6ca908b27aee8916bc85f7d8ace97e5d51a3f6bd41067fec6922967afdf82d74a7de5d139ec182e32c83e200c52244ed5a1ec61f8d7a175dd936ce532aca0ced0c2304d9e266e0f6b46aef5c76e98f520a940f02a6712a3684dcb1daae318d6aa02c220635225fd48b7f02ce906d7d2a372787021b34d22c55fee1c30fec2a75fefe36b029300bf75970f2540223a22777a610ecb813263cca3c974e29982047e298ad9f3e2127708777a92a71b8a45c96b93fd66a8147063b392f909f3a0dcd3edcdb632a9ecaa1ea99e3398e473326519956c8c5c35aa1560fea51c905f2739c7c9ccdfb80b9e1f4e8fad3c8c97ded4526e4cd9dbdebacececd67a4f44d036a861714d1ee3083b6364ee796c7d39458e1083eb51e00000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7504ffc828f95338fe81252841d2d67777896b760b196d81cdc98159be364cd330f9e895e18cc4f28eaa26308bfc8a5810b6c9a001c94854fb77e93d3de1f4b16dc796d371319ad4de2b7ad7d8f231c644a3c56086f2ad0f383de426cbfb17a5a62a7bf9d9c81b8fa2aa9c37fa7a6dc78dc7bdbaabe3ac9c746910c92966b972f6145954ee2990bcbd624ab85ea2d87845a50caa82b1100b1a5131ac2fa544ef27d77cfb6df34f118d1463e35fa0784ce15cffe88147d9a2bef20f5731c74fc6496237d22905384322e045e7290720afa108e17a79afa4a00392828b1296cacf39325802c2b112c967035ba77d93025818751759045faa1b799f27ac06a21227858014e1f8e930f8350615bbb63cd7340e8bbf8078945759b512ea835379c4dd276e3c73bf665d2a03e644684ae4e1625164ba77ff1f465eba1000f70e874f7eef8a00915893ea0cfbeb2a1943e314f75d0b79b1ee6fa736754bc5ffc97ac316c6bf2ce0e94dbcbbc055dcf21afe75d43527ec12308d8e4b76c96387c1829f9548d39f2f9e9374d94eeb6ca4f97b2082f176519396c0b72b68054430fc5c3850d783431b1442485cd755852f3e1bf62c11409752c86ab2411cd661240042e30498b67bb260cfd7bcd2a8f04073c972b17cb82ffb0f1063a98657c534e896ff5000002280000022400000220108c94e001a8fcb02dbf101d16d6f0000d5ccd56a0e7e6b0a7299daca8a9354400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000841253449713d08fa15d5625e37621744d5d1d61f0c983340d97fb025f65ece0b429e61701369ba7b6a5313f882363c393158ad3040f5fa0b4d819edb72502d26c44a258fddf6458d7abf27dc7497e3b555fd881cbf8655085968f20d55d4f333269be4680e44d6dd2a65569cf0fff42e589f4ecfb06cf2eaf5de073ece124223339d4ce4b2b778a94ceb6e299e0210b1c6933825b1e39bed1c12ab3d3fffc5267aff0b80a610c0d0bf58ed64965064e06ed07adda26989296c59227e6447afb1e6e12f397d8730319a5e39d83c0ec6dbcf213f30be03d43e5ed41b5f266407d25772e3e419f24b5246121fcfe0ab1518382d2451fdc2675da0f4ff53e0acf45c137ed12d3fbaca4db19b716780ad3c1e1aef0a49bdbd954a5db776a92046806416f8e61081deb12524468356736fbff1759c956d7d5b22db598d9dffb924a8ad6233b8fc2e5af5f10411256ca90f3593b12665c2568791939e6055cce1c3611feab15938275b6f8a1093ec9dcf33b66f075f1c3db81d1d292c44218fcf381d37a418c9fa087c0873a6bf27f12180a98690665418b3d1f3d39f45ff3cb006dbd86704526375e615ce87193c43d4d0c36bfe8c0d0f27e2aceeddc0f75903df920000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802237b417c8555322ded9b5dbbc327bd92609baec5ec0cb19c225ff9cf20412e921b35e5df2f908f79575539a5d813c3c124d82a646b2b4e4f61e4acfe6baaedac02293fb3fed06cc6d9b6896adebc1fdd35f837c3d9e667beb898c01133b48d1a3b28d6d0a433e27a2a490364337dc4a65d029fc7c7f540e2b5a06e1113774751bd0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008871aba108b9bd8a5430a34c2e5634586cd2eebe2ad188e824dcca48d68bf926ff93c86aec19940bd94d41d626929d157db2398984c66310ce20109e1d57c35d9b63ef1c90f5e512a9d196f878644818169d96ce946d3320f09cdd85ed569840324a53b22453d44caa4b383db8c6988fd13afa564c0edc42dcfed590748ef57f91c1e715175d1863ebce9c0cb9c8fbbe99e490d575302004bb662aee2bf8c62b40851d36a50b73515e99a28413ec671adee7d3856124d573d47a596b83d1c0ad296182593fef93fe82460e78d47014aed0f50a192aab2a345b1a98e3ced9f1b151a343a66514894f5437e59815f957139bc2ea8358ea9937e2e33fc41375631960b3d4721827615b7e68b685b13c15a1cc193e3abfcbec7118a5322bd46ebe5f326964f047a51bec98397497695f233a45763a16641ce41ac0587aa9e777d789c1163c424d20714c0294c6cb1c4e9d17d12242d94797a7f4498f004019a0294a4765b9030866687c0d977a41b3f2b97af7981d3f7f2c9008b1dc7694001fefddf47eb3b1e420db1dcacf9c9dbbe0b1006aaa05842b27b3cde3a4e8e64dd25bbef23e3b41745d607d0261b908b51b3d886f12139494d29b18344973b60bcfbc0ff76488823ae39d9471f2ef539ad53b6363b259e242a2979238611d6c3f5654d80000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fe42cab68b1943111e2f3861099da8b4329aa5ede9f41e7a414f0f8483398d095c61c02a20ec5d71e3eee0b190254156c472959b6863f30ee9300eebe8518e87db61302ae5cf32ad0349a38097c10a2e957238194a9077430c63ebd9837d8327752efd90cda29ccbabd6f1bb79fa5a3bbe0a715bdee22fa64785f4c26f33e2d46bcec67e0bf9d253335c875464feee8a171862aac083135a3a74733d44d529e8dcd78fe94b969d03691c6f791964ff5d2671b282a88dd09d8bb55736c6cf77439ae6da21d21004720fc94bc8d3ad64fe02e1d4e9f2ce0da6bf884acef1105ab3b680c01c24283ac85aeb34968e3b251313147c0a8500acb549d83d46336b42431fabf81dae9737f262f90a264d30aa44c4ff69c627ca16a85f73133e42235638074f72566ba01d5a8d4de2925bb92ec3609fc7c5671ee6950f782f225c132287127dbf4b977e3930879a0d2424cc96b3d9846dde71b1efd213c993939a120aafaf25de95f8484dc61912159474fc51cb3692b5b04d1dc4262fe3f5a8f734707adecf2ef49c2bccdbd4f09010d81b432e4c1ea8d32ae470a17cba917b2bb8949477a9b6643e12a45fa300939da87d53d0e5ce67e48c09d9345854c59ecdbaae379230e265bb42012c9350a2a1b2cd68127c07eef31a058e66ee804f79062efa900000228000002240000022008ed198f71d68f21da56e540b13d529dfe2642fabdd2b7e612ea507f39c8f4de0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092bf98786208bee8688f0d01ca1eadcaf4fa715ec05bdeb7028b615e6998ed49396618983d0f81629fc60651d7e29498105e597bf0b25adc0b1a9469393789effddbf147ef639b0d9f4712400449c7698df0f6022b9428fda276092e43643cf24fc737b066a5f7a421a1de9f11680f002c6f07f21d5df99c7313ee2834d7f649bdd3fa0fa24f01cf85350a56456346c2a9aac10f63cde7e0d23fbecf895c8dd19b065cbde821993d576ee87ef26625031b1105f05b5d82150d7af21c03aa2bbc5f09046886dbfd1f4fa8aa07ddf05a5862836cd76fce2a902cdad7df4d8945d8b51e834036f3baab787b3c05ac00bd836b74eb729b61cf3bb0e4e43d2775024a6f00b40dbc7542fe6cd1b2b8ddddbf56b51f93a404b0b0ab3efb33658f2cd8d48d68e0d4a3ef9722205e204b981856e33805884816692ccbabf946bfeb907091dc81e903cfa77284cc9c8df8882de1fd1482e7c7fd63e504e202f29e8c84eec687d56219bdd0e178163b49cbff5c8865c41450f7b33709c33fa680120dd25d260fde4920963f9f145b79502369b7c8fe37c74b55fb1ee07654a90e930600ac94c373042c7be49a43901cc62c156f807a1f4f004958b86c7cd5dc1d02cfdc3b9a000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022ef972dc9019dcd00f7a982d17bde789e0bd111c56476db77d38070ccb1eafcc0bf27dd000b508f7f5015c94cfe3db7887af81db330c7b6a4ed455b547850188022ac0903a46775af286ad807b0553b64957011fe1153e0989fc0a108ae405f6b70d2a277738f5d8ae39efdfa7614933ebd77b60dae63115a3d78dfa8df55fe2540000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091b8c029cba6b656dd82aaa9f701e2b88bb391eaf5be214d8083d82e0112a34ab61a58ea3e5d51e94ab2af816d86d351b90ccef5206b15ca23714f4b7b903fe72ea644f233dc285262c2f070e30cd60bd71f30820cd5644323cd31c2f0594aefc0f65cb49f8fb6cd7fe173ea2019aad082d0680f3be9db33c1bf03b51459f507acd9ba10b1e24c50d24a4d24f5ad3de935a36a11227fec81c77abd31dfb5e8b7614c33743f0635942c5f470890952cb30249d881aa843917a7e733222d3c8dd865a0e7348d4629c1714fd5f4e2f138cb820d6cff402d6d44a9d273a1a2b21797b0756aaa5138cc5ae559dc81f543fdff0e0193ad86b40477326088cd97c8b89ac53bb18e49181761641281fcb86347d5384a8725452056cd1c8ee821c6a2c8eb7712ae7cfef98f84e6d20bc27649a2ecc307676d3cb04ee798ca71fcf5fa462f533f39738617b839a766e5c5eba726835e033bbfeb4a139d8f2b16a3c6f53a57960f04c7c00fc18e62da89ac742726388929a0bbf36d31c53c49a16935c744985d66abf844b03b512f834388cf038f282911ef8a991719ec2e4fed8966ea69a2c2506312b749143a205ac5b460b74bcb2bf9917a5c8feebb361aea5d71ad33920c4883800ec3970f9f8db38ad4765859c4e2d43dc9bd49d20fb436ccf27193fa000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a56b45f26287552ecd1224041ab67ca53ecd60630a5c478f172e4d8b4e8c5d76e1dbe95a4393b8e8cff8ef8863a65799c60de5e6c3c0c9a41b73e86616625c247bad265952213e094572d0318364d364d5dbf092034e66f1cbbb7d16fdae528b516a647ad7f27646045fe30eaca1e58d3ca16bc339a106c3efccc4ed91aa4f7ddb4174c1e35f23a281d67de6bcc8ae90a9790b16693d14f7227eceb50b0b2ec9ac303f1bd4d2facc420714425621696fc221a87f15bb3c0f47c31eb8bfe59575cf12f104948e901f68f28260fcc280ae70ed57c9e38b3b94c930e72836009161a7435c6f09293e77fe872fb53470094025e35d21d142fa1357171859fdb918dea3986b16126b2114e756f98365e3e163a00c779131322b7c86eb8945f29b2b9f6392a1a9acc977176db0ed95cde87dd180e7d8a4d76474f159e60a9f81e447936411c81d5b737a8491cca7cd1d02d478f9c121c36e334c36a3ca68892e4798919f19c55fba220ac119cba32e0b74f40ef26845f0d75b3d3329c68911ab0c509bc1dd7e8133efc1e916fb22886683f73740c76c7c3abe81b7b1763613917e22ee180ded5ff31036be66b568881036192cdf0ea48489dffd37e329e06ac054ee0c8c3d9011c79ad4b10ac0bfe27be0683c89022ba342b5936d07350c7afa1445630000022800000224000002201b1c787c3591ac711ad95fcd188796bbfe7861472c7ac3a3eea9e65e51f5ba9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085c6fc747b9fe80b9a9790d4bf3d8ef3e1bba7489663bd9a48d8bb8b0d537c3152ed432107a0704d1d17c7bb47c4a7c90f7d81aa928e87b82c0a2d77280076f1ea4c4e89c83a48231c3f486bb4ab63d6a2dd07e73b2aa9ea92d25b38a79609289534e99375f93d5a506e3123ca24ce3da103aa1255b20799f7237921ba9768626731c70505b8ed5f81ab760dddd725d6416aa3c435ad9223b682d21dcbf672d307cabaae45436db7b403c790049cff78e68d06116e9cfaf9dfe92cb9eaa3157367def39f4781382bde6deee28b1bdcf09701cc48f2faf1bcf8fad2da027b7456033a033761741762255c5fce23a9c9af349d699d4ea6e58dc7706d4e25ce0978609bf12834600eca630b169ea39c5e822951a80c6e7f22eaf900f44b9809e37a96fda74ac842209cbeab21df1c29bdbe938995f0e734020910849d617c0d4b3db21b4916eebd7d788f745e0281a1ee264cd44d731dc1f4ebb70101347a702382aa3d68b953cdc4a3a251e3216f0b7f2bf111bbd92f465e1e237130bb15e96e826695c846ad906ffe3fec809f97c1e2eb54195d128162a5653c10c212cae1bed37cb4ed1bd35fda5b66d60f44d836ddb27d1c58cd5a30ab061b51605577388d8000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021519d83e3ffd554d53c4c3229a9f53c8aec4e1e14333af86c612d6960f6873ba1e10d344a2639c3ab02da31742fc47d58be9b8a3be4fa2df4655dfc218e825c3022af87c5c0ac0944f1f2ee8e5c77265dbc43d6a02666433660fdb3a9badee74fd0f0092ba3e190434a4480dc778061a14b4d457a714c58cc4ec282380498114380000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a985efd4f7cb6def5c6126b5f89b91a8f841474f8c5f470361143e2bc064c5ef04bd9d7d4f8c20936f9187eb571c6cd633a4974931b08d97ba597cccd27691a379b42acbed2118f0eee742856ed984f4299aeff76de6e04272ab9c4daf491d7a3f5f814fb790d4e62e4647aa0d11e3932201afc25d0fde5be6385168763cc7d665a6e4603b6dba746fd1e9b4611e09f15fa01d85b187a11e6c0081865142d4684900438ea4b6bfaf1d2f62ad4d364cfc8d66be89ede7dc943772a497008c2a808d2d79a34320ab798f0f955a9455c8a7592e7410de3ea8c086ef8499510ae829fb9d64acc4861127b8b4ab2ff4551a4af370dc2e64221ca3469323694253040a4b115b7c65e9b501e7a515b3bcbeafaa865340a3b6bd665bae294f329406dd756b94f4b6e2e3d1a08cee9875346c38e8e76e122f899ad61b8851e314930ffd78a28580c9c84e1c1aa4f88d105dc9032be207e921fd5e1cea981a257cfc9f47ce0e7549cba14dd282be78a9c73a987bd2ab724ec20a5847d0c355f9676515f88f7e2721475221f902564d2a75d81b292a1e2d57f79a4843e364b0dc4ce7f8e331f69c05153e7b69f86132a8c1fa7ceeb42b81dcf431abcda8955148390efd6266b4b35b2fb768e1103738098544b02629e44d0b64aab82ccbdb80ce418169091000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b80f145751ce06f8ba03bc0127b905b2e2a6ad5b0d740dec446fae6aaa7fcbbd26343457c373a1671ed30433b58619d49f1bd2d8006dcf00940726e07f424c4dfd6149e7c7dedbadeaf707fc62193c34f27aa6f8a1b3d2719a72b6797fcbd78055b8811b9400ed2ddd134af4d73893f33ff63c9e757c838a8178e9183cc09d6eff511891b17d48a12fb17a957cc62af7d394808fc2f4bcaf5ec57720dbb151358b0321f37c1f7beeb9787784dbc0d4f5fa9e633dc8606eba54225f8edcebee5882149039b7d6dabb3c182013804f843c9d9319ff5a19009314ca86e3f26de246b8d5ad3193e640e90f4ffc0b7563fc206a6150bd0ae7678fcc43d12ae0f2ab17a7fe69031cdafc2f2dd85f01752dee766edf43d88be41b7cc1089843f23b46cb1ad0d1ca4ad10253a4710f102f0e83d27ada98f06b4ce774352c05bd02844aa959dc0885a70918e57d1252e8b90d9f0c85f3fc3ab44421b02db94b25598ff4bcb1e2c269b0318b1e3e36e5e8c6473f36be24b3a43b5b89c66ae58e665c7a3c2a0bef474aa898f5e71b878e5baa79e80be53ff35c9df9d0b39e34fde021d03c364a176da864611507cc0a9c1bbb4f1314876b51ef7c5e86ac44a57aa641c18013bcebc8d018eec1cd15024baccd1bb45d7d0fd2e31b875bf7c66d354f0ab0600000228000002240000022020f85483186895899125f63d3d5cf809d904614fa65dbfaf8616545c5339381d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cc52f8f3d4b2d921dd18efdd0a67ff3cc2f6747159ccd0736cee735c3d8771aeedd43416526e5563249c1951f09881b7c37923c37f133ff06d98e2105af4712d718f6b7b74478aacf7f7386056b427134f1d5334b19ce9372e4f181e9c52c814493d0a30f9ee86ce78d5df84370ff733d07a0eb2a9b18eab658e3c858871cab42a9fbe4e417f2d15734bb81801e928c17cffdd458f9888ffe04fa85e656e1eb8dbc533b671475d20657d11b82703bc843902b2962c83a0602824aaab84b110507fff6ea34853078703dd9e031dd0ac065427a45350eca07492b41362c89b389a8419f988858ffb3f82118fdc28a675ec446c0ada03b1056213af425465fa801cd897787b169aacdbf9704c66e8d496d3577127455b2ebf32edc7a5b65e6add9654ea6628ec20e51162be6d8a69226373a124413c2851a02354a485e597055f78438406e1192b8e8d80712087b7f18a3b76b7627c258b2ed69603f3402340aa9c34b195a2e432fdf7f708fe8b6da60faec1a95d9e40080df290be1aeb5bbb656a30a19d46e2e5789342b56ee74452e943238178e9072f7e4ea71c431bfaed25f32b4c492a077a86d220ff39d6940fc0ec6ba7ae8e1e1c5c648568607c7090574000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40106a98a631c25984f8f8135433063ce750d18d59c126d8d87e481ebd83a561ba9022c08d31bd6d34ab9cb0abcb0cde90212b38eb9392288afc56957eddb1744b5a7247b6af2a404821b56cc5491a5703e7c10cf8a79a8be50391e31c01b856b4b61000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d7688b991282738f6d383a724eb085e97d3b20deed4ee08375d81adb34e176e998b954f127efa1363a10173770f68943fbd047513d3e11ffe47092613210d23cd04cc08519533239339d37782835bc17141f170457f67da4f7105b65ba3afebea8a0d681875f821aef0e85c60a750f79a2f9ace5179cbb6c661ac31f353ccc86cfc7461e0af4657a0c821006f7944f9d986ea05596b435643e9d46eff103bb95cc36f9b23802aae76f01113e46b15d6fab8f6483d1a14427171a0fc89fd5bd5db8db88d451164f6a262a8f596b84bda3fe3f1318428204f65e9c5cafbffed1bcb3e4869364305e86c5c10d7560ffd991258c859aa6eaff0ba1bee2c1c88f7a25bdc1c9e3c3e06f0289ae8a8098259b3946489679675b9d44fbf72c26294e115f24923a3eba1c0e9f48015c17df3c8613f44f001d343d223b8adc1a18c2b652fc965090398b52ddb3cb51544f621c067fc54108ba6b36525985d147b644e31fb6b98f65655e36690b489d91e1c5e257b1521141db9e42a142c8494799ea5b5090fa87e16e2815a8266e595e41ae1fc76361c17c44db32d4677b2ce6216981343316dcccba8d04cbe10586d0a04409811d9fa36ac3bfc4b48b7dda0601a0806ed3cedfbc3c112ad37fe55e5efd2cf10bcf10e45e713b09ea5edbfed07ec38a9af00000228000002240000022008f05ec91ded23ea6913ec933069376d5fcddca8c8fe1554b10148b8bfff7a5c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fc6ac3c005fcc1465caf1cfecc6a38211b35b61f548f7595fee80d5fe66a72f7e1afaf6b1c23af7591e80887684b0fefb69335fa8bd4163762960132cb3332f3cb22099c6fa6c743338be8c34362a20751b9587506eb54ed7ecad11c01dee6a31ddf66713ccffb4654843457d8ba67f27e36b8c27a3dcad71d5082523d68c948dc476b9d156f1e84207ad4933b1d87d680bad838938648b25323baa8d9948ca74928901b16d5cbe29f3a71fa99e1ddd030dc123ec0edc92ac07ff0afa201eb0db0d47d35d6e94fa6ba0f001d4788602c26d6c17ec4f492752b368cd10956aab49eaf06a24eb7fef59aa0f1b2441bd0d96ec07aef6aa8fc515e8fa878fc739ccfac9714778fc3c2c4db694a3b7655d045bac0263347fed05d697c156e24e151ced52903ea19ca3ea40c3d41732a0bd3054ce8de55c02b94135c0c0fc2f6d933d56d28d11c4b013fa68a0381d19d724e647e7fc63346a1c07b9256eb9b10a8d65b32be6aefba60207fdb301f1ee0565d967572cf2d9c205ef23ceee4d6b25bb51bc145e5674d0732a4210554c9e866c80923712ce240886e44dafa56f30249a8a754ae052fef55b67b8a07f5faca84aa73efe86f55a6a4e5a4d77e5f73bcc140a000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802011015fb0b16b9f9844146ebfe36dc4776656c8b038aa9d11b48063295b5ecd31da98b3080847c0fbd928679a9fcd84de18118b6b1cadb96adb23266cba1723b022c9374535b33e86c2330c71f2b582d233760c36571b38f07b381a40f7d6048aa1a7963b733cb941a1e4e10e9afea8b8de53f9bc4f07d423aa1fdb6b7b95f3b7d0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f1ca141e0f3bc819f77ef2e7eeb68c96454c69bc9c2bb5ef6e59fdc814e653b42b6d39a05802945e02c92b46f85c5cc0a6cb8343639d1bfa8c51566249e68125a0892810c4e547c31178800a0caf28d52857546e47733c38c945618b57603d823ab7f73d5246c0c983d4ca553677eeef9f86b221dd4ca8638431368046a9a8435008f5923db4e96d81d92fdc1819cb35fcc69d3eb21e4f05d3904210971dc3d14d69a4c16d3e9897a81f3ad8f8f53de5982b57236c72495cf1889fa8e46572a6145594defc08bc7ee97a691ed92556d1ba5603bdb5f1ea5d4a9e0bf8d70b88fedf71b1ce72f0975e569c35fdae1e3143629aced1319523d2a3454a221ac63f69c26b6eae8fdd086b1c0f2225c2ef11e5a28199493ecd294bdc06c65d81784f33d11313cacf5b4a996e1aa424659136e3280851186c73acddcfb1970ec0651b26a6e410813c61829c9044838dfb395f83bee3392fd8b093cdaf10a524135e31e600d3db33987d294136951a89f41dc26bc65b098a417f48396302fd1bb557cd26117dd5d302dcbe20964dd882b96c5f4a7b7ddd34141473ccdb6798164622ca3c64e828f88051b15be4bdfb08e5c6c5098a11e965ef81d7dc7112cce45b46728811e24b7d8544075517c5dd73a6b2d6f196957649e943a7982d244634ef7de9b00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b0485aeef7cde839e69efe3297f828cd60410010b454e80967cb222cf22b74247b84265c76f554a39de3e572694f36305cc4d01bace9a67deed796bf35c46ddce8968586d77b50ca5082a28f4bca36d5516a6f939fb56388ffcf113f4232c9122cc0077ef6179c0c6e235fba688025accb53498a3885576a237a64bf0fcd725b623c78e78e6836a3f07e33b89c9b53a311748ffa85764e7d9fd2cf2008a105b5395fd35c8d3a4b26588e3f0302f3860c37118a8cc4b1166636a185e41e2e0c54ec145dcce101fed6ba737d85c99f491c10083d1b59dbbcb0fffdb6f3b8b8ad2138eb5c939e3afe86f2cdc7b2b9c03adf0acb9df38c2354c966046a74db86491949a6463ba666439cec7f73479be3b7c7f3124e88d52124df553e3fe3d89f64f215a343d5dd65c37771874200e3ad9c27e00f1aef46e2a6722d4e323c3ecfebce342f140dd69faeb8332db1be8f24623b342081ba898899a68b72e67b49e94a3d122fa00b13ba2e54a9b0bd23cca5368f31acb01d3c8856014eac5aea013e387ac15e280506e68da95f0c1c31cf52aa3586b2c760ff786623056470fa4b806126910559766487b731f001bfe08550584d79fe0b53d6a93445a3fa22945e25ab37613c526e953b0dfe990e1605296df25884929e1d0a382138db0f0b184b1a2d0000022800000224000002200e1413d94a52e1ba486c61106296341622ac791ea0e5612adcaec29964fe7d7b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002565db44d05667a132f61f46fdf8e737ec3638e886d2fdb42510f10ba8fd96cd8ebd17b69211ae7a8dc04c37c42a6bc139bf324bb0aadc27865071e8b526a034ea7c82acd53b1e9b8d994f9103ccb38ff8d0e8423b3f5a53bcd3a1c4fe8d796aec9092319c5d3238af9ef2c35b0db0a2e3d04e6536aae7d7098fa27291e79040b8226bc32cba47e8b4997e4b0fe1c461828e4da7b4b996c6e533b6b3a59bd6ababea4be1d015b290c5b893c3da6c83731dd4ddd255bb783a5b7ca719a23fd266fac49b21b62aa366eb112205356db1109999b0c631d3b22930beaaf4e95cb1c2f796cd86c30d14f8fe0bcfd80630a7104b8f9c8e5fa7189a6d221aec91ef4cbd3c3b1bdc655f2cfb493a7ed1b00906533e29ee9d694d2aa7c8291dbba83a59ad06c5d92f5b2d8eae619b365b5cc2f16a4c42c42750402debc4ad24b5100adade932cf5767e1d470f5b5fdae04e606781dc085cdd8ed56c1700ccca807e2895a0a55ac863567d9a6dc07289e57a4eb218044a2ba7bfb639278b0e224ac97c29afea5b1bb3f04c8eed15124a7d3dd625e9618eac86a2f96c3f85d77fcd6219fca8b7aa45bcbad4fa6482442b633fd238e6cb3a0b3387f573d39e57d951208a64f7000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010947d6a17e0f4128f0792a91fe3507b5f70e446409f5ac8c95067ab17ee1622d022d63bc3bb2eaea0d5da8817d5eacde5c21017cb3f9134165aa1a011fecc1aab223215388edfdae6fb868e91b1576ed66248d4dea97765e93e0afa65fd25ae9fb00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000964ad2e7b5376df767b2206085e28e2ee9b4a49a6cfc168e222b94ecd8fdcf86c6fd1157499e13f1410153c906dafda28c80c36dc54528c53bd6d0efe04d5209d5a570a3bffc35f76d6c5348e71d00f8317392d908381dd18d5fa644ffaa4ae3b93ed8f7413de4bace2fed2f84654b6d12df21a084d7cdb77e5be262f1d20d433eb91492a642d8165844b8016941059dab8dc115295574002fa571218f57ce5d5d6dbd7377980fb05f300ce819d3fc0d18436b362c9ac48903b00bde21489bb7c372419199fb2e1632ae1b4d30c733887d3e1a68e566f1254b6baa6dbb69a1bbd327b225a61f5e321aad1f683df9dce44f0af2b3070cb9e1a98413aa6c3665d56e49c15f9f217890ee6efaf2142647aa897674da88e2a4d703f6cfe7a0b41e81e80d7e3c58bee64841e3ac784711450a54c445d5383dcae0fec7693091d3f1cff07b34e13c5787d40adf5eee3951a185a342e5beecbde8d13a430ad68b7227f393d9970c8b4732ecac3cf746de321964050b6f7ba9c8c7a609e11eb2b371838e64fc1029e31a28a5ecf0e5f1140a5c3abcd1fc05ee710678c1193e3343f7b3169efbc52748125ede573a2e27fc6fd449423f261c5d049836f1b5f14ddccc51a732c42e1cd475a40e89592d65059419788b144370f80514e367e2614b22d03b2e0000022800000224000002202aa2403e7323cd72d14957353ec565cbba427e348f09086e755e950ccb756f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0b963267b9482027989f440d30bc680359365774a2bcd1c9674683e5ae8f9e33f755363168687ee0281184edf167625fd89fbaaf90bd70865104102d246512f07fd837bdcf5409802e017706d8458cd791dc1e0e176689d48e719c4b80fc996fda25c851ca7ac38ec4c99334bc6568a581845b3adc9dc962dc4a66d9a52e75467fd6cb0446dedd88a0570a3590660134271a89c0ea2b2d0e8b62904f5f511ebb3d3e70d6072945b0e09156cc40c5f0e03930a0db44692ab1aa3d63e7fe4898e042aa3425f651096595ccd0679c4422bd178e8b5c360e505a8e3214b06e6a4720ead29ba4f54e6051ebac16dd02214ec76199dad7443d712059b8add54c7b68abcbe42be88d47d72c457cd92852c221ac8711eb5f45f758582be2464300e27dd534296323c3138c5ba65c4e0a6223b21aa7e6b4d6afdf5c2842b21254454052f98e5d36ec4abb727a66a4b8b682baac8055fd48e95c1651b9ba80ad37a85e3ca1669af60e512aaab0f342faf59834c53dba24fef142ede6d2179eceed107ac0e6d6c7c53a58b4fc2c95cf6764117cbba3fc2651852ba4dcc25ccb2e4f4cf366a9264aca0f98437a26bf137d217b717f744ce6b3c3ea83ffd25f4e17921931324000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021555c4774c3e1e7b9b08f9b69f30244b13798d42b9c4a5615d27724757e4f17b25198c48a652e8d02d3440eea600b78d44a681f83bf8f063cc94e73be48c3c55022d646ea46dc0bb971e8d46a371a534ff6953b60a70408fb38e10ed9faf8296992035ca1cb7e9e37b7eccebc870f84dc5dd483909f889e6114f6a9e6104fb533c0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010adbc52d32c0ff65c290b9888196a51a41b404a9d1bddc86d7f1d0c99a6b73e129fed9e0c6fff04330f2a0f9380fde4ecaff31caaaa623a4b542ca936e40acd218078a59ce691b0c08c8afec56220cef95d64c0394db8e198e6b143a5377a87b69974faefe89865799a7fa9a97a449f55f93762d980789f2615ebc16c05a3012b59a79358dc7114e6eb26ba508e1314f7b34ab7cec1ed008d4e4489df6363afd8917ebae452c9301b3d6e0035a12f8b5d67d4c1ee907eb9e68d267c86f853a1081d6630cb7a857fce1b7f3e0e3cd9a6e91a9a4e14055ceb32f728ecd3709d3142a3b2821c1adc2c7591b776207bd6fc74d1141a1853d908296e9eeb9664621dac506fb4350fa48e2f44f82005a3379dde1b80c45e8f0fde2bfcb7745a10da1331a9e0b87ed4c8a8bc47393d88859b4f4bb00ef4bf590be7e5f10db6ee2caecdcbc73d995e339a811b1a75174b297905684fd957be764ade3dc70029e6dcbaa23b99b253e23ac5c87d7895d33e97026581a83b072a1a48e350022c52300077025c4b1a89e332fe8b6f7702fd9b2669d7b8734a293bd3630d0bb2166ce91fc0dc91466bbc685faa44df0a57335788e5739604887a7c1f5ad85b41f91685d19847e940f28990567731c1ab0d958c5530a0e72374981240c0aeb5e095a0c1d1dc0d000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0056146599c5dcec76a120f658dc9b54ea1a8b39a5ea94ecc0f8041e937aebf99eb075d5f8b5ccc4c01e6e1589aaaf788a4eb880edc0affe734ea5d1672f954d680d51c5a25cc126c33c8f8b2aab5c1253da60783807650bef70bc8a9f878bd8666852ae53340f24bff6dfdeb1921a1d11061ff6b94d1e1146058915415153d2754ac9e4d7bed8eaa6e0429a14361969a9a7f48d37ceae4ef6badb9dabb1046ecadc065f51494bad7472a677a7012223917c869e6983f2cc766e9a24cab7ece9a43d71f04cb66c16abefae620bc3b1c6d3a97ecf68a2784edb3e0e36f7249b83a264e1ffa2681c4621faf57eb932f32619eb782d4665acb0574b7bfb6b31440cee24824ba590934dfd160a1c3bf767064b52f205b4f546b0be154698f5c1784fd74a7721d56c65c94b4b3e01638136a171ba0447082cd9661b777c9e7ed2c3fc46a1b19a6b7e269e4b3968b9c18e569afeb4d15614ea494ab3ee7c9c14d66c4f206712a631d56eb55b095bb3f257c447a8f869629518621c6b730b9c82ba027984e53182a5cfd303d3fe8baa49f34cfec3d264c9c0f93fab35deb9f4858f706cc5295c27c73e4a282e9b4b4bf1fd84824c4c445032c1079082f93199cdb9ae246f37d35aaaf501b12a178ec6caa6c2f0ddab66e67ddda332436c7d70c4028c60000022800000224000002200896d83f8a57684ffc9dffcf4211923c287cb01965d4ddafb9ea82069c505034000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1774de9a4b23b9816a19e74f1ffabfda1a82347e3cc0e0f88fe9334e10d8984c3b5523f1b5a97e84662d6e37c025b3af85db471071c60299e05cfbd0b6e2f799f6c5f7fc21b648557e741acfbea67d978aec29fcadb3ec60621aa2b92df5b3d763de6d617b9bcec56d4129d3d1ffabc1fe9f047f4195fe52986396f063c172b107ee3c72f8fd330f84b22f20d003bb1ac7a670a465703ef725855acc2d400d784c82c68e93e2fa1bbf7b3bb2939a07585e04fd2a4c7dffc1761206773f96de5527656bd80f4e312d7513b0993224a91d5650f6b69b3bb04b4631c71f9b343ef1aa60dcf22e0d6d87a1811db7553df1b3ed52a92561d8e90553df6d623750cea5d633d17c38eddbce2a4399f97223bc0c68cde517b2de2b4a612542af1b0a294b8c2c08905211dc47f9be67a46db04d2408091c348a21e3251e01137cb27b658892102f81235780ab56d721a435d3eae0457bb766ba9c726aa57717c1a0bef45d6c2e29c00993c678fb1b801ace3f4078de97eee60dfc169ab42864fdd9fbf0bd157eb13904cac9a28dd6c9982621e3d8c4152f8771d1b587ee34437ab30e204d49564f03321b7210fcd1018ac0e6b0bc4f38978d9a22da9987e1c5eba85f38000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401054031aba3d694e9d65824ae1610978fbab79d275ed89e3cca4b0974863f9ea8022dc47e8ca96789c8966bc830ddea51d727bb5170d9904cb8198c38b912a125020c079eb77be24c7e123c9de9fac75d0964c2baa00a202a679de5762b313432d300000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a49900e9f4716199b79dd7bd84effe3b90564866d640045c78a183e82dd4980de44a848aa8c4bd84925feb2bb8cb3067aa203aedb52216e85b52ddf7fc87b8b0a290e42ab45f38df9efd1075649ed6408bd82b577e8b1394ce70d4d3bb7726d1146aa35e0ebb33472640fc2e92c660fa95824e6d2087f57d40f4d41ecf67a1435fa8a55b689aea4302766dc3b28ce94a1ba74f89500b37e2de017d834712018cafcdf62644ef1788ea06c472260483be4273fb37f167e781876f4c574f40cdfe9ba60595e8b7715f04aa4f10002a7d18d03a26a4ffae09f38539b682829c69d900ebdd62c62aa60c9c585b527fee8d2a3a3a0eab3bb1aa31ea5ed164e6cb031997837ecdc323f54e35dd6bc15dc09aca2cbfe79353707d17c25ea95f96eea90cce9537fb0186abc929f2156294e729ec2e69a6237bdb37e63076db939de7bb2c9dc29fb2b0c8d82e2ba33e23b0786c4ae96808fff1b144f1c58ec2b94e1a822d3ec45bc81b8d0a596cf5d8c0c343d1d92d94553d1b4ad30cc80402523d2bc34e36976e5a2df9cf7406a84df7c6c63c434bcc6f35d8512cef9dad4084a57a697baceba1064dbc3d0cdd3aa51cdfa99757a679fc69cf4fdf0c4df16dcf7b282a5ca484417e5c976eaa5b930731ff0556738fd19bb222dadd513765d047a9b7ca1000000228000002240000022024db35d64f4ae1f011e3fbfa9962377324107cc0c63c2c4df0135542b5f477f3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e61d703deba16637b0c60be17bd6aaf38f23d00dc5fcb2f5e87de0ad302a9e8ccc6ae89ef25143c0a9a744810faace117ae26e306e3576473a8b21e4d53628148e9a8f12e160bbe352b4e18a5bd95360f3f47a068579495f8e850bf45240b865ef713a8598671cc964a6cfd74a9c2194b897d7fe8d256803a32e078ce285905066be75a2def177b4e8408c01f39b8e91f257603c033dfa955ebd8e92c8051adfa7dc3bccb358b3221b8afbbcc738ce4e7ced4f52572c23332ccbd94717ee5ed63b0d4790615c2e47b4e24243bddbe9e9e52eeb881c8c23d2cdf7c715dc7e1094425cbbbd0cafa846757dc7bcd095c87917d4f0bb79262c6334d0188bd871cbd8f1950ecfc34084cbb252f43454f633ca4eed7ba58cac0108151cdbba212a94ab333821c260af3981a95ea22d849b5c6f853f54ecdb53cd0a557052f90c3215636edc5caf6e5ce7b8d46a5f543a8a6b6819403d711f7d53a23734cdd0110ea15b54c2fd7068a0659fd0c5572ad518c9d6610ffd0f8fb7cb4f6a2fedc4ed609f1e42739b24c7c92e94a5dc279112b3e9f370ea36a3c1c58f6c6ae1d36fd0e92698dc81c9012f741d434729c925a6489c3bd3f8f9dc67d7e37143f044b562df61f000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012c43190b3a1c1098011d81b1faad99a069535adfbbbad11f7c7fbcaf54c79467022f56fecfa9d0def2b5222ab3cc130d97d9c660d196e5340b3a5c55ef170b695401b26a95c6e262e5e655643fbe78d3b1b0a9d47b1b39d91863e32f5b2b417f2f00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7f5f3bbefb9004485d036ab603168bb0614b83a47e0c970001511624ea28f557b660c9359aa73d1f8537cb13ec06e67e34aa16afb1a526a2d1aefd1106996a8b5f18aaa0fb18bfd6e6b3462c5b18b4ccb856cfdd87b985b0ef0bdf72e95fe1f5088ac7ac14594c6985d0ef76b77f99bf823126fc8c230af5a9a468c196fb1a8fc0912f400da9d5d5f5a6d5d11e69e2ccf0085baecf4f0d1853bcf8befa24a32e5f3dd961170cd8c1ddd55a649892bc1654f072bb09fb80c4ccae3588bad9cc7af831e25bc01840c628080a35eca6b7b2df2addb7f99758fff362d0d5b8f2846f3cab592769eafdc46592a717e889213f9664405d809965e5f5460f7d550970009c9101018ec59af9cce8f7a0ab9eed97549ee531a4c201042dad0b1e1ac3f8c3d847c12ccb7cbf9c837918c7720110ac4aac7060007d81768590e86a5ccbde4f3ff95df2ef17f87af95e24733cfb26ed66a9f243865e3f1046156c5f74be32a79e5662c6278b51a354f2a6f3b11ea52c7e5c42d8503646f64278aaf3266499bdf0b449be6fe899bd2324c6a6ec08c86432a093b5f009609336033e43504d61ee6e6c1751b28fbf7b64c46b0bec1cf7b18cb9b5b7646d9d32a4d2cc323c5b3ceb2b4f0b1868e52ae65d7c4276e8499eb6e9604776634ff8aa78f8ca23eea140d00000228000002240000022020d7e86fd7f45cb2384293a2eb41cb2eca74be371d03b9127f22bbc9cd7e803d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d2508dcacb530b8a655f9e0bcf83824e00243ac383830738b637c0ec1ac001896ea952bd3a7d9b67610cb384843716bf469023259dbd5ddee9ad25c9906d58ea9ae71d7ce00e0db98b9ac1676ffcae6e3b77cfd0e7e7c5d3d6e94ccc20e4d59b919e07f9869721699b9748a0ffbb378b0a2fbd62c60df28503226980b0fc2dda358e55a029ecb34e6171ae6feeb094f1cb6a33f88eaf4d70751cbfebdf41678589601bc1b0fe27b9fce76abde21b75f1838fb515761af3794f47ab0cc0855734165077cc8f42ac87d6f599da2262a0b7eb27bee84d22004dc42764599f432ced6edddbfcb39140fc176b8ccaf4101d724557170e8ae7c2e3ca150a400625b59f96aa82a15900d151be5a44fc9ce21f7da16d311bd5f594d47b769ed3de5b4aa2812f48042b5d74c256a582a2faabef6c26686a818707955697ac66246b0a66ce503af499a32ce42d15369701f30ebbdc07e58263cf6a5105bcb6beabd78f600c6189b8d5533d9f365e5d00da9752afe54886a64309f6ac17a80f5eb0986caacabd1245d573ee0cb9a1adedb60dd566cd1f3d66db438b9d1b44618884a1e6cf38a7f73aa877114c38e2865971720af1edde32ff8003c55ff58c13e8fce81bb68000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40115d26666d88286242110cf99ecec2c14b5755de8c88f2bf59b287ae7c6d5f4cf022ffccc6f770d71db88c3ada4f0893cb2cddfb5d244b01b850cfea17071a129c229898d873c2362406c056ca9a909e7af54d6e29f7c4b4f5faf45170f8e486744000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a344ba863443e792634cbb8f25638fe46983945bf603df065448ca0ac5d00180ff8ff76182e33705101f73c728def093e18df804bd3effd33882f9cc6699fb9921e6d2e5beec95e42bb44fa53f4ed2005e8c174cb60b0712525d0612bd52074d04f1117bc28f95b001f51b348a134633ea671cf8ffd07e152058509f946489780fb988e14b6dd2e78644bf7041b7d87082d3dd5627c9b0ddb01f92f179120eca1e83f910c5bcd489fba79e088960e404767f3f3e9db37c4a3d1623c4bb0191f6da40f00622dead1f9cb6ce57572f27141067c71ed6160158f204f48cdd600bfda7f478651817d17c2ce2a251e772a15b90bebd91931ee0f2b082c6859f6d41b3e0a235ba2518e3c7de0a22252ac1f8f76f46990f29c348f0ff6902d2d858952745e37e0829f661c080777e6ca671a9f3e4e357f3736f9b72bf47015b3812ce7d0a1c682c138bef32bd5a2f55338b11347e14caf825f8d3fd60943ea65d41805d7d2b59b2daa03edcd5bfdb73c44103c206417b9741beca5aedfe774b3239b0dac517390f67a87a8fec5ce87366b43e635b752585fc87dceb79e5a076ce4ed14468bd51ba85b05933e926625169b56c00cd536f6ae319477caf365944f82d45eb2901602a14dc8c43de9d92f9766aecf66f3d02aaf6a5c0aed4a9ffb14babc1c0000022800000224000002200265e851bd6dfc2be3f575961af0b198d563eb9c0b5023a0de02f34635eb057400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aeca4bb9ca4d5ee605af27a5f485492e0299e4305b6f624a82a666c64ffdf737a2e361501b2a41e8930db5d245852991662a4613eba7a77813c78d039fe1ce9bbd2791d2ce67012d371f7249b25216910786ac64eb4f55cdd2d4a208b21677360e46a1c59ba6d730c8b180449237dad873dca75a0b27c94796567a1fd5cc471510e90831bde1aabb79497d2e69621976ee5c830922323d3fbb5aa84355248aac64885615cd70126c6562bb2be89397749f7a01fdec715a73d1f1ad1c69c768de2ce18364cc3342b265857e6361b9b0263e565ea4bc71f5784d7904af1c018ac977a438c927708955962f24e68a661c7d25c30806589017da1ce3d47618d0bcf70dc65c4254585603b3ede11b242714801e0d07543968133c5bd76b173d1c76098038464fc68794775aac34463dcdf63b17b85b7267007257a8a0ceb615b3770b02ddc51989ad2e60cd843127194f3d2f26cc812d35be0eb375fbbdfbf7a934109eb3559ece7fea5caf0340e8e605eae043336dfd575b4c08d85317ed2880fe9f0cc2aef86b97619d1a68979c7cd16ff933fdc2d082c42340128c38f66af008d1abacff6497c54bc705f75bed859ff155cf6b5d8c7d4337a6b31662670b61a81d0000000400000000", + "2647d8e7f86538d5972d2e11f65485c5fadc5ded0b5a589f0e5af030e9ad783f0000000e000000000000000000000000000000000000000000000000000000000000002400a6d7ddc3bf8b02eedd64e702d9347dc27aa3aa6c283c492f31e4b61441e60a00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000e0278f5e6cbc7a2b3e090de8f8a2efa1d14b903a554ba0f75c04812e8876b1f63a000053802af49d1486024bb22e716e6e802dda57e7c011dec4f3cde48b0c1d87163ad04000005400190b2bd9a61e15de13fdc0dd5db50292162dd32e7193b1d73f6a966182f7db89000054000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000070dbdaa8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad360ef415936d120760ad101aa4c14c0784c3e49678e0e57ac64cd1ae8e95fb169c93e20000000f0000002400000000000000000000000000000000000000000000000000000000000bec4cd8021dc2d025267cca9875c14c230e76ca3e45a832c79abfc065f6286bf234e4c76926c343dbf7a64d0bbfbbcb0d08559d040104783441c8e4c266ecb46c92aa557202014fe32d970ef6c7371d682bd3ec891db009aebb55cd95c1e53f5d2a4a3f55ae08b98545432cd70958e65af18987ae9c8c64d840ffd4cc7394c4a05e4bd6ff470000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000196f61489377a53a626e07afc5950334401cbe53d6815fbdb80f61d3281afccd4dd614bc0915b6170fe95ef30a90b698de56dffbdec28f1b35972c90ca1c7371ac2e8d229ef5758a0bc58377bee13492d766af60eeae45c3aadda723cbddb5b51e634eea9438b197e75895b79d4920cd9f9b7df2d4c1b2931432aec680c67d869c82997fb5c8850128f0ae54e4030d1a94ca6b75d8d61698a24e247b46b8dbcaf6bfe633093d3f0f70d827cb47b104b61d3bd80b17a9270bc13d6653acef6658aa592447da0c58cfe3fce0800005d8777719be2fe6754fb610ca08699ddc16d0213e613598e5946aefc5507eb6fd48cf8ccda1822b4b6c424b9a85ab81c74e8c12bce95699aacadcfa1f0a9e2877a55d8295ec2cf08e4f56bce8009c0b538ea4b748c52b5b58eec9491398c5a3a26f38826a34cf16e482a8703eb3a803c29ba1b9c929dd8fcb938e2ee43b850ec7a4b6fd93d2d996008a31e2e1a9d09e39ca4a29e8ec4e4f64ec34700671dae0cced97553e824e6551a1c7ba140d483a9c4fd13367af9f2ead6f647937caa5abb68618556afe315df771507f8921c641c46cc35279143b709beb644a99fc12bbaa1b72bbb595d1fb4977297293c03e099688071b8da24a63c6e6ea82753bcaad65b7c6bd76724a9fa8617045ff6ea65f0bbc9f00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081fc17664711919380818788ec3c983d51921216ce4190cd466b1f69f74b93dfa1c72b58bf924f8591db6cb8b166cae1ac383ad3871153e803881fb38f9cd94ec148e25a76df179d773bc11f5dd8e08bf7cb3497ff3387fd3723e557863c1504af47fb3956a42d7dcfacd8dec3f2ebed58cd3ac8d35096e0f53715ccfc95180792ef9df7c529b874a86fa91cf7e42d423fd26ba57c225cace8d0d7f270035658ceb0da50f570130ec983b5070995bc600a7853ebb6259b5307318ad5a9e45e700f848d4fb043720e2d238c9c352474ee021618dc249051b2a917641cd6ec780c39037ae5a8c689fed66ff3cd386d858ff1797e9f2177d74e999fe1bb8ae4c3e4f8f64adf0dbdc1aa69f08b968d5eaf08ce354c76a3e1826216fbc101ce68f30ef5a139fc015d8ae468ee1f4d82770ad1cda2ccab8bfb1d18b6ee5cff5eb6496964a00763729ec25de8aa872ed03df6f01b6b6a9386adbfdc017bf9f2240f898a0e5740fd39a7c8ba0fd52ea38ebdd4526bf81b515895c20395fd622a236fef7eac374dbf267f4d32018811cf8de6f21c9ba70094e11190a134a766951629734d6ff8ffbc0920495d86b9e32d9068d090bbbb73f071e83736ffa861e15538e21c7eed392350cd49248ab89066fbae4e619acfc225f39a9ffcf53bfe1be166cbfa00000228000002240000022004c5506cbf3374b3ca0a221a6308bc7ce2d82ecb59ff434bf450dc2c4eaa90e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a573a302062c4f1e30e3372ea0ace86ce140099412b401d250281880891270ba2b1ed8e52a53a3a2e0ddc2855954f19a8cf9152a39ff74d8340e632defe4d2c7d79f73bf46e4f75ae1a4915d94bdcc6b3877b202eac77aca237e802e82d06d7adcfa7ea5da7b30db3a9795ecccc4c13dbdab36f4097d2995a4959b0a7599c19ff519d48db513b8933d08ae3d9a1b714424fc7b895aae1baead418fb4f61d4c8eeba3f1844fb8c5187d552bee74e7991ea0202f78ddbde91c51826fe5f85f3ef29899ce85eb3ed16ab9d7fa0f165fa4ca54ce336324125e3a1ce84f80f333bb80a5594966d74c99c772b8796ec330e2c9893b5169d5f2c8cdcab3392e14d52fbbb499f09a1d6ba02b863a6465aef4607983f6295be63bad5ba80f10ca698aed0710cfc31b09be4cf514dec903e46b198b54affd1a7f2ecd8d3c90733f17aa2be08872a24c5ae0cd815e297ebd7b4137ea5ff58b7d17e3431a7006fe9b11255badc89645c74d68f289ede9904fdf9234cb7348e9f0783da1b8b418a178d4803d62bf9edd3efe6a861a09815e54e52434fc0551903cdbdec52ffb00b8555a0bbf403e0a19a7b928bb98f1cdfed70d6dc9f99ae11161fd3e19296d1fb4bc7f5429e5000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401078e94339067aed8042cf3cf8e880c346322b7a9376cf178da2e71e9d44a836e020205887c34f4e7b2ccd2cc5d58486ccb6f2bbe71d068b91d53e46a072b5c362e04abc013c9222c26f0255a11780b0eb300e56fa0f138973e7efa635358fd864d0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082b2b57100159084b0c3cfb46e5234e8fe8cdf57a77286a914d011c638552341100ad52cf7c88d5446a681ffb782b6977d4713d962a66ec90b3d3617804f9b22b067e40bf96197d5ef79009f2399ff9b2007245792bb03475ca8d49b06fa3c3841ea542a0b6816dda4bf884c751717b17cbfe6a43190dbf058a8b9510f26d512b8350f24d3c1ad0198f8da4a538430897f567118639da6a10592d7e415cb29c9404d138c01a036d96325d78d48440857743ff361d37c58352d4885951601c65c2e794d2222c81ac4ffbe43d7118cd04657b1a16a6f37eefbe0ff3e944badeee4ed74489b71428496d7a6695cf78e2c8f8242a50c4833112adbbcc90592e834025555785587e3d1b153f5124187539164a5596a4ac940e1ecd730a03d467911d222de0945ba923c89434ac1ab2427f05ced649f38c1d86a3ecb14cebd0f1391cb5e2c3e59c3f4348ffb090e349c0678f39cadb8ce20a46bf7ed444c60d30d6d15a3ab92ee8d1028b207ed0feee675fbe8842284e5a8e4cf6e1b3bba792de77fb92a091264add335b1ef831299cda33e69e6017f451968f66ea0902825e62698ca931c8fb37d1b93d06de3f880a1a9ba6f09a69505a66467985b5e50f021edf15caa83d1ceb9d69f8e13dd1f4972c5407aa8a1d02af6482f65a7216ea1706327b900000228000002240000022019c9954b20da330f66bfc74afac53eac632e529c9d330a17c7083c0c937bb9bd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000988b238b79e9471ef4f8c5346f1a702e1a3ad0c9892d4a4385630865dc4d1848d398f331f049514d7cecad767ed35b29e6b5ade81c0fba99d1533d68daf0635f65ad32e3ca40ed6dbc7cc7a891fcac0caf7d8893ab06e4a83d51a1539fb50334cf39ab613ce9bfae131b5c9f771433b8017caa95a5ac0cdbe5835b2c8505a3c4de6c3a61e700898b4b6d135fa58793846bbcf46a20351c74cc9f4387a28699e9a9aa1f7c76d73eecf649ddf73ace2f10367f4d295cb7e5e760f3f037911a3f5830bb83e533f1d27ae87c8aa35eeecf800f638e496eda2290b0fd0dfa07227262c935008478cb9a710b710989790aede5eb7f50fde27022ce4e67a70ad1bcbacef8ed0a069c346b63dcb3be12c1bbde4a6f5e65419ed4af945204ed7236d96de7eae3a6dd61bb61e02d06578a3960497234dff2cf76949162f03c54cb611966c00e2e7459097d9cda9031f400d07e6f601846406ec512540a56bbe016744e218ffbcb5b480d4dcefbd1fda039444883ceaeeeacbb35ab6ec1284dabf32febed709eafb87bdbb73707738d1a609f0407be0f65b8a9e7aa782de6fd046e1419358b347ec151516320fbd3865c3bf1970705fc441763f3d8428e15f472e84844c7f6000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40110802f2a472656193a715789b7e7b2a766e755617796c6d8dc2dc033d6c1280a02051e0edc077a221e95642c080f90db984f9efadd96724270cc469012a6905be32bc1a63b77e740174af4f88af5bead0a8064c426bc3794831dc75bce7da726fc000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c61f701b4a34e3846b89be5da233aaa03dde871d4213e82081cb6572801fb6b20bfd61e074cf94f69c742d8a438cedfce729f2347244c11171359b47cae4b9f93cc3731205a2dcda34132b18bb18ec5f45207b3e1d9ed229cbb66947305391b6d3c03c121d46999f9c602569568fad12d6769fc0cee5349ac4ff95bd4d58160c42fbd04d0b19e1a3918f3943627a6716e95c544308f6b0480a45c2928342072064b9d8187ab06ca1238e6c3e62c728883e1117cb47d72e5d54049d0bf6b6ea039f6d7b165b56f1aad77a5e97bdc861a9ae13baa1523aedb136383d27d904871110236f8b971d43367b6992e52b9c85b816f45ec4cad48cdcbb0746826d6241083028958b0c99d0757aa60d8d90a614782d25f1d43e62e5d587cdd4f7468af9ce43f1abc54b2d72318189e38a61f36ba2fe3e25cf3e5228949fbfa64d3e61452dfc08983cfe76aac4bec8e78009e09196a89faddd20f760a32bd2dabf13815750bdba059ca7511dee46bb44aba2034aff67d276af1293ec4b7a2123fabc4224a9b3103e84616f0d079cc228d0ce9b0ca5310786f5dff98726cc9c442ac7cdb4540a01536b120af1774602e3e99b3b1fbe0d28ad0e9276254f6e908d6e14faf3c38f9512b16bbeb07c52f0145f37ee292a1f09dcae0b4dbd5dd8baae4d32c69df0000022800000224000002201da66ebd914d46d73412dfef404c7adbc0b9d348cad2538f7ce98e6b5c718c9d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ae384dc8cf560cbca62645342d4988e679a626a06da658df9154966f375c68e88f86cf4704938baea9cc43bd05d600a088f1f74b19c58b1bc23a4818bdb87b25c7fedf4baa2797f614c3bc215cb9e0b9c53d9320aac1411561e267c9d3f2aa3b4886e6bee3e111fcc324f208aacd9a367021aab8b45335f4ab3f6af0a9bc9bb38aeb2621f06dfb7134e604e1f6a1b778a1a9cdcb743a796c567a99b7036cd18946ea2aee0fcb0d1f8e673c401f7686dd6931688dee93c147766d823ed8612f9cce5936f1d5a90e83583d3097efde6a76cd120557a0cc2149f382aeb03dbb3ffa3e08b2140478de8e8451274199a4cbe3f9d29f7f5632dbb2a29400bd1bce613c95844b8389d7777d71b0bd44b1de167dafc2538b42b72e88ed4cd7225ff5c54758349479895c23a584d70ff34991544cf2aa42e3ca6620b056ad62f4bac449ea975b22408acd1bc22f5081c6f8193b92aa201566894a10ea97a769a65b799ba9150bb14aa4aab77469c8ad2681da5c6f1eed661d5ac4a6ee1bbabdde64d3778064a6e7761d6607a34af01c7194463d17b6be6f9ed768c57a8e20f451ab51e38fde945f1b38caa1857aee329698e487d7ac29fa8e7b9375650c5d93989840d2000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40116abb9750fd81b74804732c31071b7325c62ad876c4847be542564ee2a9fe7040205fb5991799d446ec0ad9a8057fa17de26fd8ba07cc0a97925f753ea97fe30f6159b6d3677ee2e0418efc0885384c359b00522c09391e4561a7d85e8643028d200000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000984ec5c2b846589d68f9a3fa05d0b3be7f39faeaafcaba455ae81ea6ca472bbbed7042e58d1b6b222d80b0ac3242ac61b3a78ab6d8d04132d9a60f73272a8c6cf8ef129b57b7aff63d57f5c3440292d37f46a9962a34009d414380ccd69a3ea0f45378927d48409d3b14d79fae618502bc978f558a02ce5515036177eaa3e5a9e9179fc13faaa76d596c8cf148ca7bfe5150ae966520c97578342b23add60ef72ce937c96a822aea03d5e48807033608a22b034c9f4ab10545079b6511a3b707b38789155b1277afd9f96e528be8cbf5fd50ac4578f597c540a23c65246276e33dc42b13204018938ca5051d733b6410c82498bc259a37313cccaf6d24cc969695d3b1824f95d7560f05b347ed7634da425c7495ac00e4e1c4f039ab8d5c86e853740616f693f12783011e8a8072a92c20a10670bb227f85949a7a1202a55642b857ceedca71df3cfbee1f69fc25f25cbf8e38c2a830f30f69465e7b8dc7d2b5daee8a47e293436cd474a2949c9fe992138c714d844a782315c777ce68a290be13f77512afa10b2c86464e5232bf8fd5b221f91c31f88c7578c3a1e11ee8d87d271cb0ef1fb1a68c81855d109cbe663d21acc5848c49ad6aefba7fc9c6697b95bed9d5d799b5f4f9637f54056792afbb1d4a6c045917cbe24ba6742c8fe35dde000002280000022400000220004a1ee8ad58561b2b8d7f4581f68b8be8ad9c6fe9df6b3fd789c5b4cf80e7e20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b02d2cba32bfd043d7ea3400a2d9ad6ef3bd613e3865ad3e8c827781cebe0b55dd53ae666f80d40eaf160256cba70651c6096591a3ced632b71d9f99c67dbfa12943f9c1282ce3d10585f93a52cd410f82e811589e258e2343c6f5f4c97f2e93920ad68246f2d26c09943dfb550ff9fe6cafabbaf50f5fb75f213be2246fccfd9c8927c6c04e0439b939490f3ac4d5108917baff0d533db5f4340e76de40744282e68efdd5a98e29056983bd106fc206e0397ff1073134c9bf3c9548a701365bc16eb83c4ef34b68f02c6839df558ec145c41c6933cc10d35c3943f567e8cbe5b0f115076c537960c1e25d93d6fc081187d0589a72753450d87d1e14ddec963780d9db9960c1df19069e47997d3a407d816acfcd49f761c9fcfecd1650d5e4973ace0bf29545dd018b79ef163926ffd4c9e93c981265e3891d49e6e3a8ef05a02237ed6fc3ce9da93560f949d996731971c1885631145d4121ef1ac70e3795dcbe45f95eba06edb0bc1658acc8b4b55f8e7e83b723fa866477231fbc504b65c05ead3f17b5e841ff4e2cf8dfb6d337602ed74dd0f7b886439a211ca18c0e31392f762f607c4a0dc795e1cccd7ff447511c54ece8652476c8bcaacbe935788b000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011ec93138dfb299eab1b1cb131c9b52117722ca3ceaac02a01e8652ec1b206503020656e86640f8cc05a55ee4054493fd052d3b904fa1eab734d2de37bbe53454b02c6f6e30f44f1164d9e0b602cb1c4c5c126a9f401826309baeb48326d49c5a4100000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000842b40a19d64e5e9af0e7e2d9830464e7398426d76b4a91682a01dda8750d8ef15a0de28f24f5ea7f0e2675d9b0672bed1e69d6bcddb76e76a617327910f8b96f6d14170e01136d4a629efde73c131e37f4b5fab96534b5048f65727c803cb24a0c28fdd11f0f86d0678f2ef122e0c744e0b215b283a6f6bc7201a7bfbec3105914857b3c4dc026b1df1c60e50f3aa06d0f50391dc761caa67c728a3f313cfbf0ac702b9efa1cb1469aba3e5b91bc7ed9f49141934c1a05636f0a4adfa1361757fe84a7fcbef3b6646a5d09244820238c1ad45869b806451f40f4ab2172e53de9e207f3fbb1a1f3bca49baf262056e9e19d292f0001999b1fbd4c8afc481df56466737e744fe8c54f407a0d18b08333541f8c5eca52c66160b8a2d1053122cf988724ac866d6a49a8bd1ba99611fd6100df161f3c533e6f0e7879bff88bb4e7ac9d22c115f9cfd2b386a5fc4c14392191dbc7101ee73c323930d4d7ba7ca5384058eb4cf141901224bcf0e39b6c24b8fcdaa264a8571cdcffe48c96af664eaa704fc39beb5c925614fabe38a564c27be80c74f8e8dfcee075784300626092c9d4dc94c49372444a8b77214bedf5967beedab593fecef2e5d86dfb1d33e1f107e4cfa9b53fde0b228c8d850d8a37a1909135676d288fc3a12efc7ec61df478cab00000228000002240000022011886b1d0702e3b38abc9c32bf4dca524fac8b27716db9d8d5e8811c5e6e8be8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d07e78efbd49f151eed09a2fbd65e38f6dc6bf1f2f15a3eefe46a072c02a71ed710ac5202fbc314fb77652934988f4f3aa4aa500a04ec9aaf7e585907869bef6a138aede332aa94b8e1085d9331c274835e8c1208e53def1b39da863aaf2ec23fa0c12eb10a19ac7bc0415662ae21fec9ad85268a887a16a96872029b5c2fd672cab1d4ef78b9dba4fdc56d64077419d2880a1920fd42f845ed1db7415b530fb736e5a7933cd97999f1206bbb0140df237b733109902a9035f5bd9abf8ec4b6302b733e4de5fa7fd4e9dd02d1ea2005cfc209636e281ae55ca16940af24e491fb5672ae146bbf32b9798e3156195f75a7f2a7693c2b05fd77203dd29c16f4aa7b88bba777b509a67384de5319dfc43f2807e2fa849ac1a933b16f6f69811d9209f901c1518ecbda8098e88371edccf56b497935121622855dc90f04961b3f6222754a0da3ada0d166c65c913dcfc0b66bcf1ab6b6894b1ab596103c13e56fb08464562e86e4363915f6f6ea56a59adb67c8b4b8c7bd4209a14fac9e34348933ae5c7c35407891caed0f2e0486f41262a6914664e7ee2267d05f46b2eac40db9747e894359a7e40f61fd0e133cabe30a124bf966a03daa79099a37dc55f611e6000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40113dec23b2f2b2d7c3ca07805925a27ba342b828bebdb5d730efceff37d2cb8b90206c04a398cd6a70a2e67d39e1e65e782af0df6fa79fe8452d20dc25d23285d831eaa166abaea45bea453bcda74e0cf3796dcd9bda06b13dfdd224b2f40577354000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008524db49b91823a76525d3e8102004697eb074848948ea8e22baf10221c58f2c217687e86e24b88ca0a303b4169ecae431029257c57de128eb5889dc7e0457bc21563976b1b34253ff30ae246bc67041ae61dceeaee7651cba757fd838beb7871e74c850237b2704ab1cf16a981074974dac0e423bfd3deda8ac08bbe0c46ab14d32a70bbebfff655b6d345ffe2ccc0fbdafb58caf8e333fb045d46b1cc2c4e48d4bceba56cf8ded1fbbd7057304c4dc731fbce6e005589f438b24d93399790de0d9aa7c15fedc88a7e7d2df97e877990bd7f1534970190b021744552c1af415dcd25f1c9597f60de5f501191e52d63b3fd62bab0464d7d5b1140aa057b3d0e997dd18c2515b2442c0f835d3a4d6d53e2eef16b8aacee812f7c00e7f39b3ec6d5949196469a5a7a7ced790b15de19f57762efa1a11b682b9fc1120c925d4eac9d06100d3ccac31bbb6792ce7309d8625dfd600e09317e4b8bbae2153dbaabb992f539484188ce9dd4952e3f80351bf0cb7298f0c467ed3f9f1a9ab496c3f02fc50303adee46d507b043bf7f86595712fc9313449dbc05a5b51300103e68f41f4c13a22214760c2c60bfcedbbd572a7950e5b62c9ce194f74cb73f1f95726c6318483513a082bb415ca2bda383fe21b9c3455a2b2be924a2deb4ba6321586f6cd00000228000002240000022023a37df81dd4edc041a80fda256798f2416261a41cb6759033bc359c0b00fc830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099d3de543d0a1e7a5e701eb3dc5806c3fd095d4ac548c27edb90e3aaca40d9d9a4a77e0709b3288ebf7bb7c4012dbb1a8671b6dec31f689d33f4dee5334db5a3521429461cb404204ffcf50e5ab9279547076de133e8840fe84d642f58ca8305ceb98da67985ef2e1b510df5946b879c0d99118c1cf5b5b077929fe28681ecac439bb2c0a83834579b426dee221923930c53db7b018604079f83ac74ee04edc067682ee575c6bff0a5eaa429360b90fee13355e8918d7217d1f178de69f8d20bd91e6898d6a25bc68699f0ee110587c2b7945114f989d644951aeedf8e5f47e7c847287372a723d19699c8b183049f01cc0eb261d3c6b3117afcab2cef22c8cba5dee9c8eea7cb5d1affa1f340fcebc4b7a3467dbbef7ec0db8e4016bbcd67ca2cd208e88c612c1ea0fe364953f0b98581ead6164a4e7a8b462fcb3a9413ddb704434ab3e966c85c7f84f3d45e43dd5ac571408ca3f7c9aec6edf87826b4c7729201a4360bf51c13faed57dec39fb0080ab9981ded8d579a42f8ef1a56eaa25a0be0d356d8392a4110a78ab6de617cedd916ba18530af80e785a9eb3414a45bee437f9d782389f3a2db16c47f7f895132347775c515dd259ce4e42f147f83639000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012cfe652c9ca445bf86cfd2a2d046b7c0a21a2b3da5de3bbb93b44b6fb1b9045302072d8884a541b3faf48aeedb48c2540319b62ee3864332863ba8e3a69374c30718db421960f93912a198b84aa9e4995310c8edbe087f0736c02d9b98ff4ab38c00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037eab0fca4585ff708ae25ee7664f8555a7f012d3d9626b0c5fa408fe86d844dc3e6e5efd3e5b3ed58cc1f4c85c006cf4984139bd65fe31716ad59536b4012ba2b72cafc216a90e9e7154c01f71c38ea0b6f5f12329cd14a062b5c78bed0f58033010e1e9e9d8e3c9da1400ec47422e716fa01fba6001cb39e6d470c7586adbbb0f5a385bd210c045160c21736e8fa105d476b16d7b21b09d1b11024cfc2d1cc39ab3242eaae0d5d2b3e6002eaac97082e602099ccb08a2c359dd381289e53c21bddf2674d19eddf556cd9b37562b8a49860d696fe8a9163db6765b7085a8848d4b2dd40fce288434471de7d44b0f06b63052198a3abf485e50251bf291d5096a6495c8ecdd18099d14527a8ff244a0a95f4a4725e74027a2fd8a33d8058421d8d6a9b8212e644baadc294bc6b510be6e54642f60c24e80709adae2cc5af341c5175d2aee12bec72d207d3df17c1df33701d0189e0c510e30d3e9acce4981ecf69c33220fba489cf4ca6393daf697ee1ec8efd2e3863d1c50eaa6673a2feab6ed38908006ad2c30e7ffe49721254e904b1b86dcb8e114fbd45201580a5afa748c81fa0c89f69361ce3c9f91a84d26fd0f1d7561eaeba0595821fafbcf266c159ed3a8a2e9bb6ed27415ea267cc85475ed298e1691cc1e144f74430f3b1c78290000022800000224000002202648f06926d7fd17d046785cc1285097800f7607ed8db80f51f8ffe34fc3a1b6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e01e81bf65faea65949732b51c8d67be58220a3d4fe6de4e06ca19bd3dccf66cdaa30ab2710834e2f8ab9b74aa282ce0194134abe4ca13483d702c12a1358f7d1e80c29f7a2db63e7b6197b39617ebd375c326fbed928f50c05eee6d534f6d3ddd99e631a867ec782823d3ade08d0cfb3f25f01f543eaaa008d341cb748097f6ed59476d71f453b307ca2581cd0825059e56e185dcee5e5d4c8f67d7973ddf8b9493d718a468c37db16be1d9cac6a664c38e4e4b0e1a72ba5c0d97563bb7cc7647588454bc7340aedcf8509ecf9bc2c9dc851131e334ae9558bd966b8164d10fab4505a668a4e729ac393f743ef18ebc230027d1a64347055c3e5f587ef1e44529871c7494ed24683756a91241c622f7dee55f4444718472b25cb5df7e19c5634b828763a560a8bc4b700af83c590f4c33d14dd8749a2a356673f677d3b28aad7519511b148ed4e2228108b00e1526e12984b91adb694cec7872c1ab80e0fa921d7ac3a0d17ec21d8157cbccbdaad1da34f619fecfe173768ee527e89e38d03feccd8ebbde2da08623e671418cb098cbd254a1517e48036925da8ef7b332214990fe54a45e6a070cedc121e00cbbf030a9135462ee2c66b6277e92573ece9b8000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40105e8a32afeb10bf825482b4979257c16d7282e9b2f781c21ed46b04e7f98bc4d020744a79314ca8cd5d5a6157c98dc53820c9b38451374d16d8c013cf4e9bedbac208b12f4516421d5fce4cd4886a3736cf4729146a74845c3f6b210e0e7c33d37000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009cfebe04b3c48ffe632e6e21e206f33146704725b43e0b7f19afc7fd3a05f63b2494ae88709c34722f1db2b550f994f78eb4f045fef3964070cf2043b510773a6827b75b7de44cc1c741a4f413920205a754a6dabefa19f8f6bc68b9872e34789232f77f3797f22876d694b7649eab78c9f6cb80a8b7c58c62f82c79e51b57aff3eb5f08202e77624bccdcbe96a9287a0c38d2883e09d27a78940cb413ad3dbffb46ccb69d314267e8bd1b0c4cf35eefac30f3eef4034e7cec2e66d1eb31f1899f759646db339cf80fb2bf2c1fcc3ab8ad3452ef0bd32df4518a890ffffa3cc4c3d008f71214e2a9e23aba50fe357fd95f0da0fafdbdcc6d6c230d7a7b6f3ed91004ebcf05d2e9614538c470f0ae66f177b3d67c26d4c996f7e8e7ab1c46cc6c8e0f72ef7bef438a5d09da44cc603eefeb313ae6e487f9b994ae66447f787e1e2ba37c4bef58352ac9d185fe045c539269f5d27a552361f75055e7b53f101cf5ae3568a4613e583a9f62b996af8814eb971d24571052a831aea8226bf2ee8beb950e205f9b331c9b7019d58616d6e15708be48107ce397da5462c5d7a5d9d7b95e697359e29bcbaa362ba5df41a7d1411362e8e19dee16c20cad9e761cd25b81cad9cbb6e16ffe6baef9a0edf32e486f05889eca4566fdff3a203e302baa55ac0000022800000224000002200ada22867bac8cb9d45d4bcb7fc599ce9ef36ff9aaf25e96c897b0def85e856300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0921455304b752f7550013ef5857b78eee283df2faa4bedd835940eaedc59e1e622a396fc95e2b1cbfe815e087acdf1ccb8c36883f368f1a9ca5fdf9b75c1b49ab406d3fd855bcf5237459a7ab4a1f9097188f09d0c1b066d3eabfca10880dec50ddf01831f1d9e80a423fe3673e5719a2cd6a4e3ade416a35e03d98173c5f4e8ce5501bdc94e157656616bf9cdacba8ea0cd5fdea2e31d20985d6f37d0cb4660ee932ddd7e229574c7d457fd4899a963d82537d2c978bc84ad8d28130e471580a3ec553c68103c2e04da7ede8fe2d6a33ea9f4efcf5098a7a6c6ba355a617342dc791d87b2cce2dda7dffe7b26f32ca9fe7b6c02e867fb6020f97473655ef55eaab7edc3ff3e79bc12dd4351a246aacfd6cfc628b2cc07de5c01dd7e83ec0bc691319e4b073e15670a0130fcf20b861d8989dd7ab68ab6b91c202fe009836b09f7206214cc627592ab083bfc0f59b381e16bb338052b583e05b954cc2b75eee20841f09afeac4e5325d4c682f246de88288110bf92a3dabdc6a74ce19a18735b3588ea6432812296883a14b41d9faeb1108b7fa1d4725384a24ce3fcd47cec4f8174bf2d1d28775214561263a9f8ea1620b85ecf41ac4ec6b1b7275c5ad889000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802002d48c418538cf853c5eb43dbd275b87e90cb68986a81485aecbf03b70fb9f419d530b73ab0b9fd5e8b5ff5b729afaaf7b48c954a1aef11bb3282705979974f02080a23732b037b9db335e8af5895e2168bfbb80a2bf0ab64a2cc22bb34e5b428231696bd6c171ed438bae03c892757608d71a1d029d05ee883a366035dcdeb3d0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095ed972eb9dfb67c7a1c409bc9c0787ee7ceaae4867a431d7a5e1cd248e5428187d8c89232ead6bb9cc2852bcbafd4380c7c5ef1ce6f185714ac43452d705a5b009cfe767628a422d889746de463dd69d18ef670c6b06302febb07028d28209cbbbe70e259637873b78363a4b7c44241fde80e632fcc47525f753c2bcc239ebc63d8761456b9dd44f71208d8d8b1922e43947e287fc067c1ea0f4e8eb6591ca73ee4fb3c5ba38a67bfed1ac8f712ebecf63281efae8768e2b513262c6ed452000cb6f9e2cd4cd8740ca35238400c0269aba6022f7265b63d91d49856c6fe5f404517cbe62f02a69c682d168ce7ddf128de098584820f39c4e0891593ba96fa2d908c5614370067db9744e4e8359c667c0de599534cafc6ced8c93cc3fcea2b3a72c7b1fa95bc5c5559a63b01985601d3cb304033a1e3ff112551dc5770704910d9bd96410ced08a3add6a5000b8902eca9993356ae53452ce1b7d2fee3a61d1cdc3fc5b25d11c83fd62cc078f0a690f7850b55b0e5f72a93dd96ef1e2d9c4c5058a2061bd200beaa11b24c02a0a36289af47cc8580e8a233869ed2533f193b460447881e070dae8bf10c4f7a21e373ec51920323ac18c11223dfb078075ee31e1d86e00a2a13f26349f9609c0d2bcaaec8df51ebe55ec5ffc3f3d14dfab796450000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002aea610b5886f3fef14f10869e26507597b4d8f95ac4a0cf275bc0ce54065156e1e1f1dc9a29698d071861563d9ba730e42f648e3d6ca877392d23fa69343424b5b67672611614a3728ffb333e831f95c7c16c97f332016353bbdbd18124f3ead748f838db5e958e687112e521711101e9bf582997df759cbcb8196636ad297c97a6ff8bb0a1cad77fcf7c88242a51ea9571579edd3c90ecfb5b2b694b2c8a48f47261ba9908d4a7b4c28043fff905b9dea00ff9f429c845b7650c0f734f87023a7d5db46fb01b6b5a101e2f66926d692baecc844b6e619cdf64e4b53a39dc9a8a6d95d9461f0b8919d9c9cf0a60d19f904393d64fd6a00503f09c7f2f13477cc0526e3b080d36dce5f1008c0e282272fdf7e77cd461da94f22789a920899150fb68819687a5eb709d1a2f4164e174a3c759bb6ab4369bd53f4f0f38a8f7c110315e496d0780dba860201dd6739869f0b27d153350cf336e4929b12f2efe4d0ec21adbea6d5b9d93a88368e7ffd1bd070ee8e097dd33cf23fde366f5e29be9a1522963137cce2777065780d84e1d829e9d3d82a8e14e806f5382e25cba93c138cc3e6a3cbdf1967a3ad7b9f44449fa49f0a69b8c04187b3f1a868d0d223467f47062e9fee4488ef894d28320a7b3e4569cc9b93c26d1bdee11976b56eb7542660000022800000224000002202d02252f96aa22b9b311cac62e30e0d30b53336bd65bc4c1be2f7cf3f35888b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000305c876c26a15b5c371b66a19746a59cd129e0df1a3462f8e85d2e880853568990ab2b5a4b125122014bb42afc683a01699b3d29757e03cd50c36ed0411687125049115e42704ab84670f2fd9b5f89604132095758b5b5137afa40247583c2cdf796d755ef2c5636edfbc6f46a2e177c51b37f01c1f0625381b82661f1c6ff385c16a417fe26d1a60c82939cc6d6ad94502075021f31afb5d8565cd90efdea1858639d6ccb1d2810380a823017fd2ade378f202de3de951a9f41abe8c39cd7107a347aa27104462d5e63eb68896500a5b92d81874b594ec59c6b7e37d04b17d5ee0fd24e6bf42ee08ac4fe1c58ba5896da6df88abb20a398d9d7f9f7027970641be726c165e80d02245bfdfa64d71410b53f701a78e4c4436ce9544fb5bee5a5db30d6ae10be073548d638959ab7656b50ed800341bbf9fc0003ffcc739f324fec595282cbd25e321ad1fcd0431ab603fccf6d656ff6a8a24a0938ed64cf0209cb07b2aa8d48777b9805e7032ca5be587312b38cd164b589a3c74a540bc86db65d165d8e387d60b6ebd22abb20f844308be8a5365c3ccd2bb948f88891fa44e1644b78a4fd28942f994402d63b1eddaba71f57dfd8ba53738969d78f6819d652000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011d1f4454a944c1734f5766163bee43a0dcb0ab5015d190237f960027dd1649d20209701adb516ad38f9f2438b9cf9d2d662ea450e138edefc5a0b777e0a260ee1a24413102cc0e4ea3b87b1f698da247abda7298366459e340c3a8e25647c9b47500000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7a4b979fbe8a23b15b1a66947c09b42082c6e24764b5e3d1e96fb73d69f058b04d81ba1c0922129d2e7a01ae2d701ddcecfb996b3d64ec2446e4fc8c7e01bdc9209799aaeb7294b65aa386e2f55bd03eb78c184b0a91f2d82c422e4fb618d3e7ae4c1d982b439253f16a6160a852c4842fc7bb8f91dc2ae9212a2048647abeaa402a0e4fb598f371b3b54af01ae4228626e49901f5f26cd383c8daf58cfbe51006e7edd2e06d1415199e58c2bc4e6a483623bcac19fd091eb05e3f3859c94f5ba7e0fab79772039aec172b05a2336408a9ca94bafd16e44ef049ba7d223c09d00e082a5c5917ee843ae4f89f473c55e0806e0bab48ec8d43a15e887bc264a0c27f78e096eb7397b5a1a5c3167752445bdbd70e32f3e18fed4d9f9ad9d158c0cc281d513e4da56c80c3bdcfb241ab385e6445b1b9018d1cd04c226933b43e90482b91f1139a5a0fdeeba227189adfd4bc66bb02b5123ae3bfcf76a2c4534a4c1798fe774aecfd7054fc5836891545965e33db523489f57ff6bee82d7ac7b60d66e9ba3e4200ac34d29599b8e62557645c0aa6851f95cc45a19abf0aebec4ddb72e61f086543a921833031426983cc52908cbef610b83b541451caa6b0e7a572f8a594a0f9d127298e441819fec3af3813a827a66dd99c2175522fd4dc8752d4000000228000002240000022005d576d9fefafe277a8fb8018c8e268974082d564848e51c73f9b5a9a5600be2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001308ade85592c6b23dfc7a304f70cbb4ac5a8d8d15af57d83918ab036695b96dc55ee34dfb1d06a9060506142cfca023fa30de480b24a993886eb31792231ceb48956f16a1862be0b5a0cf8796a96ab711a4c5b538c108aa5b8dd01ada8145cda6ad6696dfb8805e0fda1985214b70706209037bcd3e41ee1135fcde5b249b16c9b40d5cd3550c3cdcb3ac6a9b0d7943f7afc81f86ddf450c22fcca784d5d0a0fd9e047b264eb8a053fa6fa03e748510e7a793cde3492dadb5c327b23716633d7d82abdb9a78e6c1040f07709d4a902bdf0c2a8afee2d40cfe48879edf92cdd1a03b346eef0646a32105029feb07c1212e8d35d69c76d93a6ec73d483fb5c2b8d742ad8f97bf5251a46c093c2c5aa59f0d778651cc9a10eb5c8196c1dfc720417a91e7938063841c93f3647d9e091466ce0f44fe996ad4a8bc71cf410a624fb821a73d444ced09f83f2f278aedc055070fed530e8d0f3328cfbe6f74cbab10d8c0758e7a9094683c153c4a2fd34eb5fe7f117892619361ba753fdd8a45503bf4706e3c21bdfbe2507e160fc3ec831177de5c5b4f21ab94a6de62d577c739c25f1795e00e97552f4fd3d87e371f114a179e67d9599dcc8b5bcba0e36b154976d1000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40121fdae3053147166a15be84e36b702b6691a7fe6070821d01fe75c2c66e9c022020a5ac40ed35cb73cf7e93a9c5357c9c3f025321e59020ae0578e21e4c2fb23f926c0f38a80cb217429744d6f008a8fc75979ff56973d0a3623bc2a90534fc9a400000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091676cbc799757ca7c554daabba7781dd06bb6782001f4db7eb1c89d166386441f7ed81b10cf4d86353cce902fee3255df59582702bc43b137330eaeef1093899cedc1391bef18674d9f8db5300e9e908784a31cf8120bf9ab9eba6a224c189d39beb1d621331527ef37e33dd252866165f4873748ebd855ab8dd25e61ee18375bce59393c40baf1819993e9e5b2ab9b405d6603b2c8a762170112f10581aec9d2beb7b28112103db131059df6722b5894fcdfc61ae8c50533fec753340a61d9d6767753bec356870feed92fb8ec03b0be92fc9bd98437c81e85c5ef69471adf379d3e1b88be475ae003386660236a5a00f296b38eef5e74e21cbe13aebd8564bd4ae0062bb087bbbb7319350159a3a0bfd622228aa881266418a739d10f9148eefba48b9d714f0563c7457e2be775b876932af8d3ead0736c42a0ca82f52f747e31f310c0ea12f16429ec1a2a8ad1cd500aca14853fa5b44a6e2cefe4a86269f1d48e7dab5e863b5f05124d6da706564ae9bfe623a7dcffd7f8d4abb946eb6792b2e62c2b4e2e2920907b9b9112283146327be486582e41650b7ea1b4600da34046ce50b522588d47dd81eb2208b5422333525eb81cb6f0a0f46fb3a6e16a1bb2d7176a40c8f0da5543678647f8aa6fd57278b4724a4d9de5ac7421004bca800000228000002240000022024e1a0c05d138f5af3e188eceebd4d664f76c00d29aa9d15b2c12aeb93f3fc3d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086f4295dd935bb832f2cb074b5cef5f97a1e0d589dc6c9959e54e07adf5faaf13517f623786352881ba6a10cc3f48afeb3f7b10ca2096797d0a63168fdc678e13c31cab3a3a47d4e39a0323b9128cc69fe44770737a59f52439c965947dec15afb199dec83e8f05f7d740027f2df2604b8ed18a2d48b791f7d564d84cf64d1e67aa229a3488350798c8eb83bad30404d4616fdc4b6a63c35de7634df69a81e140d686d63386570fe0fcfb969bca2115f4aa0673ea4d16b1953034168cbfd8a738c830a286990b212b815762e3a50765f864e0df85f50e5fe930aacd025fc22d616cd7abd3e6e15409f41f34676fa26fa5e8bcd8655d240c81b25266ee8854bc47bf0ce997d798fcf4fa8dc753484401e79914ddbce3023c2b2c86df0e4fb23433b93c94abce27d3708728091d08ad04a105828e8a49e36a4a4bf9baece8e07530aafa1590c3bbcbaa824dd9685b41f7b3482394f3e0c4f5a3aae0740b05d8c50ac48520f8c52945a0bed9151a95171074a4481d60ef0ed86552446e745466d91297c2ca8ce2585745cbc628eb284e8bfd9e59db3164fe7ca5f0e595bd4e9d985ab9ba88e5d3f7906bd88e76cb69064ac94f862d1218b38aeef43a896729fc5ac000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80221092a2d663be6c7bd6323486fc043870f5f1b3a509ad4b43981db05b01da8a1303f0e97d6a8f4a7b9099dd8e8e9c3505ce1ca295f0400ed54d3c2bc3e47288b020b3efb904fe1b0bf0d31b03c8066999ce1fe1b320ee013d060e103d2f24b7d6a1b6be6c8e7f09178d18d2021bdf02fcdc88555b21998108ea45a922c6cf74ca90000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a74fcfff037d96d70f975997488fb1c9dac2b4b4a0cabad2654731a6f0eedc3193c9ce3919973d1907c0c4d8bcc68be44d57af5156d8c9bf437406609d9ceaa7c398102dc1ea34099d0340c37c76f4567f24a4464cb87b803ec75d6ab761c38a35a175136264a04371972bdd3855d628ca372e7bbe136a40fab8632907cde0ff1682411f2d2bb93c082932d549e407045c0fac7dc05ec66b837ea6edd23664eb46656c7c5c0857f093802460e9a4136a8c85cf880d6d69a6c0549132b50cbb801ded2668235d1e4f12993124a6aa627d26e8362cb1c353a7e2e6dec6e93389f5441c222cc55008a209a71ebfd0df73a86c25d033e1196b4ace70b38ab0d0c5b87cd3fb6d71f7037bc59c060bdef19a4457133ac59821029f5fdcf291b967893f855d3f82f92b640a0b69d112bd18a7af20a626d9e4ac53986ec116b3337867373794683c4157f958f03c846571bcc4a497c9cdca9031339b697ef944b0b74cde6910c1804db7d65d358d90bce53060adb607f97a8025d276ca9f152c5c2f101f6bb68f9fe6ee7675029ab21e72283f0d850cc779358efb0255535614c5ba123347aae958822a47d77877aba18135fe592003bfcea6110deef4f2cb960a95bd43507fa2dfaa294ce288b5cac4d14595da32f4f0115887b4c35db09785ab85a9b700000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029cee3eefb15b62464492c62bdf5b7ebbcb28b40ea509a48129f601efdee42b1e291cc4ef62ae8aa23d479e3a7148f9adc7ceec78cc82d6ff26367702b0cf528242b3bd8f6ce89673a1c539d1040783b2e9fef1b4bbe2f866b279aa87591d68b2a4e42800b1db5d16a562f925e76feaace6e1cd42f4c7bc3097034d231e9ca4943bcd916b045ec98c279067460c586b2f3a4ee58cbf1931611ea85a7799a9fa415f9eb7df40c6dc9bfa1d61b3f20ef6339cb862962c75b0b7dbde43356b38d46129110ab5a9a0ac88415ba608eb34dce06b39627d686fa285c333672d4114cdb8c44f5ec379a087b1fdd8a3ddfce8cb6ff69b474c4b4f1917104586d30fb1a57813b3af2ac43797012bb63f027e9301cdf60fa7ec0f62adeb57b77c33b8443e4943d62b9f3d064a54ef0b34748586849bb4dd0f29cf0783bfaf2ecea25aaed2962ac0c9164e00ef099d05b4b913af01f2955ed8a8dd4d62987032ce1d36c785790a32648e0801ee38aef2368391c1cfaba64b44e51d2c4d1e806124c78a78b7ff6bb3acad85fce869a161340e90d30761dc2effd97543b73deba85d5009fb74d64da472bdef4eec4820e303bbc933c3a96b63bf6d3facb676710397da943b45898f14e823ebbd69581121ed47aac8760f5e1b515148ec75b189f6e319a8917030000022800000224000002202edb7c1583a0fd7598a4d6cbbc8ddaf8e8ada3d4a70e0dbb90f3c6946b9f5b66000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002eabaf6b3d76f7faa4bf5c8f2262bfade28e9fc7c2e853800d454fd3e2f922efef2510c1d22b4b34d2268c3568f108689240e85948cc61cca4b8ec8c428bba97b9b24a90a42deeba3a151750c29580226715a2fb06b15df6ac1cb60b9998bbe795ee2847bd119648574725a3bd85ec4cac64c7cc35e943f01c5d8838136da91a870a8ad8b8cf9408e1a203ff0bc260daa689d8bd6df5742c2ad961505cc41bae3c17523b49f6ca5b0bc3eb8e6eea5672c6adeffdf25cd64e65ee7ac461a2609b2f9bfe0dc96d68f1675f1a5fd5b81352c3feef9f12b889338358d36fbb72db4377e662b90cfb8fddccf4bc1cccf83dac2b87d5129ea104fdd7e67365e11ae0062927efdf98e496725a23dc9cd6c226ca07c0451fd0ab7b3c10f785493f89a0115d3aae5301bf389822baa4d9903d4ccc22af3180c3f2d5963755f768c38b6fdc696ce3250767650015994cf3bff74bfce676b8e8e24381498e5a5be44eacf5bb89265cfe41e24f05fab98f8dccb2021f3c9af15634177bc52f59a5d0e614b536296f1acb58b8d9e07efa85e509347b33232d3558ec95fb60dc24b5621c66ab862acf2d0a6b6ea4a586746d8369ed7fdf0bc144127e32c9a5630ab61e8ea92cfc000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80228694082579efce4218dd8f4e2a2876b3a5e2cb114c5c7f72d153539d8c12566074a7f285b8cc779b38bac80b3bf9931df4d2defb094b5ff8ac52bb498831c21020de1032f1146bc2d68a1a646d9e226767f58908ba8afa9cffa6ae220215ef2c401bde6227a0295dcc4548e1510fad09ab16895e9bee15d9560872ba10c8600580000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001826ee0eb105b073f3dc71e305f0ecb41dddf28d90520f93bbe94ff0f4c86e63f50bf5fcb9c151bad87a43cd9b0ea5ee51217fab05bee4691c5b233ee1f70693fbfe3f84887dda5a6410ebb328c39b7cf17b73a2459eba9be7468f8727d27f0c62da5ae5717b0226dd4dac90ca2f6b36cec0445a61ed0e5d346426a82bdbb0dcff4056317ba25a5d09077b8c519f846a6547e144070af386e1f51369ee90b1ce312ff0e07510c5e302aa36785a464e04851027730ac88221391be02d151b0c20971e9d67c0b31fc10910c465d58d7c9eeb48481f53b6b6081c06d79fed8864487b3a92e82b912da423a35ae0559b012cb61804aecd0868836f1a53df00bc9f826a89ec573c081835deec8227fa99ba9587943ca2bc1cdd8c7defae1baa768ad1942851892b7a600f7f49560a9e4185f447222f1afef2ca193337d5449b1479cfc7e250ba09a70e92fa09fbe39548f0c7af3a81e896b00c655b724d9d63f35f4ba4d3c64a5c9c0e73bad7e694afbd9fac5346b2f21dfa88581f2f61a45a79ce5b0715ba70b703b3a4f98ac7f2448fce3bc09665e19c865e64de2bd83884ed27064b1640be491c32aec93c8e3453517478fc55e36619fdc3bb216bea96dc616052112f95acdebeb74a7d64e77aab27082b610aa056f2614771a34060d9c456accc000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078b7764cf6aef97a3f92c836ceafbbf2fb6877fcbd970a9a6d69a48cb1fa9ee9337bf0896400158927cb7b9b10efbce7542c6a5274a7d07708e3b7f953d55e3409411f7eddc57c329292659ebcecf921932c499b084bb18b2d57ebffe96c67919eb3fee3f9dd7cdc7e7b5fda5b4cac6405b009066ea305aed1e587658a4acc4955d69f026c4ee6e3d2456d1d89ecf8fd108e1d16486135479dafe757ab1747243eebb91f4a0290c0332a7b65e6d4d204108d713e1f213517928d43b409321644eebc4ea59da6863b447dfa8eee6a1ec6da7faaee44f80be1b6034714103c7b38c4121dbf74f83cf1cc286d4c9d9f4b79bc1f8b996e918efd09a5e7daec9243cd364f9f0a55de385359732e630bdfe65e5e8b09dd1cf0ab58c450a55fc7d78e7a2b41bee72d78339131510bfb83649a1a19969693deae3fb504424d4c937556ebcbece3dec0cc4638c0970c0c6ee07d12c403c7fa0db279e24325f67dfa7262efa4046c91542b11ddbe017fc871296e30813ebe5cc62900af105d2fc7e9a30c70fde50d2852dbe92d2e1c7be81b2382096dd86c12a07c9be37eda99420d25354f0ec3287d4b8caed997ca4b6b9132fa4dd1fe651353fb58311f9a227edbda6426d44667732a8e4dffe7bc292aa3d956d8377695bc83a035fec6af5ef0bf2a9f800000228000002240000022011aeb4a68d0c8992e7b5f919638476814e331f826834f3120764003fc766b72900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000827c85d10b93fb90df7328eabaec572df7c2d768ade4cdb0b74f9b3cf8be97fadd51df25f064a18625d90702ca47ee8a43f1aaa3f677cf37c4648da149c98005fa969c21999a96e225b5504d1e59693b40c7281e14cc4f17393afcc16205f3cc30db44f31fc10c21e546dfceb4a286c6bc14814780a7e3eee0bf27216145616c36582d4286d61d0123a4d2c25e21401d607d14f27f6b5950ddd2e4ffb60bde7112146d864465c2208377b9c0c1df9efc7a9928e9e0d54e10ded1b6f86c0e943212a935f4af400abe916e67a4306c5807261151c025f866b4e0477104a8ee6cbc6ebf8d78a6a70e974b3569b134cbf4a0fc7ba8fa2f3fa039a62661b12bf71b125aab79331f9b3ca89ee79ea4875d4878f3814fbaba1892710fd3414441a492bfaf704b4f740339fc803d61eeab9e8bf2dcbdb55538a48af0c2632797bddcfafd53bde827b61e3bcff9e14f06cd4663e89e5f38dfe6d6954f3edda0daffbeaa0538009c4e7c24033526b7697a4a0c9e0a099a5f9662f4b156035a80ca1bce5ef85a6748342e602f10841baf657e12858de66eb553e1b2956640da8f6683ecf432d5588884ee82cb630843137c735b82f4c4e127ca2cf67dd9478547395fed8bd3000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012d82b7bac53fd2e78442c7c49ade58577650c42e6f76e80b2cb99d88f1c66ad7020de406714c13949bb4a6407736be6e5aa632a50316751599feb4253393214b8b1bd2b49b76046cbe4a1c1cdb74bc65d7e1514fd15645e56c51efe5301d5cf93900000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1b94737c2dea808f5f84467d059789e61ff585b5582f53281b65ec8730413725bcd2e4a3d4c2a5ddc79e422d961f03ed5a115ddabae4c096a763e78a07c5dcf22881c8a44c5d69cf22e0578f48dde056da1740a922aed715436fb9f1ca77649b6bc017a0683913c3106ae3dee3d393816a89051b3dc0d41f4318e37da408260709e664f3067be2cb127240ea94602fe7a1e24fecafd3c2514a53f27148cc7dd5da252da49ee9c514cb03ae7c50bb81359c7c3bd683ecd5110b06753c4923f8bb732e2be4aefea08d9911948bdcdfcf75c70c7f33ef14025ea6011470e811db4623e36da1217ea0f936f2cb4384ed633fd00b628d1bd1d2bc4c4ef9696ed5303f55967a8ba0ae3f76ca696d89316002b74703e485b5c8ad5fc0255aa9137b91f5c2b357940adf7ea67356662dfb1d3f20d6d91895d2716af5893721e8ae58f2527f4170c50f6f98b2e465ac0fd3da9597aee14076feedc1adeeff5430288d67c1e247789e2959ee9875494d602ca77673710536859e2753aeae840350cf43375d5735a0808d58360f3e47c0dbd1856f15989fd5e0482e12706b3318525726d645d64427780ba40467abe72631edc0d3dcf5826a21967d7d14642b5160db577ada2b9663ee00b17a536a8bc25763ae31bdeda432003d15aa8145d2f5597525e0b00000228000002240000022006555e43b176cc81867622c84b9002520d1794fcbbab1ad8143be5b1cabe2dfd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000883743679463167fe60c7c62d6d3ff3e853bb4bdbc80c8d51298da1fadbc0bdf04e82479149c1c20e5c6498493cc2f28e5fb177b6c2c834bda39c59aa322d31bfeeae9b0af283de8402971c2e82a6b1a59fdf52abc3516cbd729b0a77b2e66e5e13d03e71d7df38fff904f6a6f2da4434c730656b993b1627a148a8ea6ff50cbc9878d2dc6a4176fe751d1c6e2ba0833a2a6d86d9b9cc1d16fbb8c882cbfe9bd8f0683d22473d3216d3aebf8c295c5d7833f6d6114efe5988397950e1ef1afc226f3501e099bb46585852937fb1f6ae89b999f5d371c1525ca1f58fe75ae5c1c8be13e9bf9a73462672956bd1d8b2dbf97b3f3c9df3442543f64a59007c8358f17dc2d6e9f667a2ba5cf6418273f712ee332166c17237da75401ec98ce89bbec9b8a11a10ab7648463534cb3cfe86f1fbd3bc06ef252f0239486f9ad14eea23ec1b4ee1503c1a264f9756a49574d7d8bac877e66d9b4798fe836493b32f18ad9fc7cf21500dbdd4da9ad8860c5b1218e00f296d73e9113c81433798c4cdeb0f162a3396e06476a20a0d8be796bf29af4c9d708cc8fbccc0948fc992a82bbbf045c9b6d0ca2336249a96fb078eb9483052b26a18760b4d9a6a9716286ded20de0000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40117c5087ef6c4813b27e0d1f32ee0de4308d7189d705900c5a1fd0558942b40cb020e89fd7dab6da0d2d370dafc134cc1853ffb43e0bb8921db38e4ec5a94ef793e29838407831db5df9fd6edb43643b61e36e81fab93033afca9f2df562f154d300000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020ff6ee6f883b156de771510cc8097186ea72c7c7d0ca3b0e19376cebf5b9530f451f938fafe8ec9896b5d653070f5a729116acffbfb08fa92d737327e7b3541f0181c0908f832f121c39475fd632c62b3d4be5dac4718c9773a511fdaa0cd7a3f2f9702980a69628c826817f57924be46dc12aa7386a6220e1ece001fd7585987e0b49c3c6609a4d7807ce00d4f0329331bad0104710b0f907b600ddedcb245733657d665da4604b7731c609353b70f6a8fd8a67440ac8c74ab00088b42d6fff5479436071dd73852f15a88830cc6225b420b61b06929c6013ab2904041c3c282c31b98f3deb9a6633b87c0994bef0875cd5ed2a2747bc70ee26e60996637ce7405ea0c96f5cd4a983c165dbf32f2677c0e7e9bbcfaf9b0f6b8638943101adf74034c8fd6eaf09f290750087d18ae2c8e346a9dfec985e8f5bb18ce08a3746829f455363fe7817d6e3d089e90956884464b2927f173044cf4b0580b3e85a08e25c1f633c30edebfc206a5fadeafb8154e27a79ae9cb602930f0d0acee106e844c4971f45554ba12361691433273db8707785734183b58fa8b387525397142a32f97870f5facc3ebe90168106eab6c4b1b7b684c534d9dadd6ed0a15aa55429bfd747fe6bcfeaa83bd2f74833134b9b5c1addfa9dc25a885c40c7e2e87e39a4600000228000002240000022000a8ac720bd90859a42c266eef5184fec8f46e24f919d525133df4bd07d552f2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001da5a0f21853f317a69e6bca4dcd119f3f5bd05ed4ec6e1eec1fd34c52a6e1580dcabe82fcd5ccdcafd2f788f24e6a04274f0badb6b0700f63d6faa5ff3f4abad6e72ca137703502419612ec249daae0963f872bdb81a97d1d6707723bc77e20dac67584c9bfbd60568e1aa10b8f8d24a0d51411665493f0c7e0c7920cc9c0d7b950dd8263730de2233417bb758b176b36b04590327569ad00ac168bc64fc2ae468d816eb54d115defe8b1119277fd7faecd38806a9e3f3e14a63f151defab480d3d4cbd67d4ffa6e9f542bcf957f82dba897a6b78efb5916f3dd7d0f2f5367c61a84e83485cf400cafa882aa5303e34a76bff9a5191ef5b49194446de9815366ecde98adf74617fb38e348c91919f19aabea1dbc8af835b82445f36682e80caecf4fc7a97cb24694f853b27e0a0e81a57a3ec8606961a3a10447df9345dd3ab80bd11d6df923616edb568e3c03a10c518270ebdbab23cb85de3fe035e7381d7f605723b86f5814660542d9444575941370bb79e9a349ea16943f4670da4e6e4296cb89890c5ce5f7c43459fbd0f1c2a709794c9b87d2e7d57f00ed5da16a508a99ef3980bdf29a0df7062cbb503e9ff56949acb819678d10424133df13d2781000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012a966b474f1049897d5768be7576e7f4cecd0de631a2bba48775cf2a9524a974020fab83dafdd7eb37e37ed4c800aef15acddaf64cd759d0efbb9969b064857fb81739d66790e22e11d4ace76064372ab53abc7ad0222e1a570c9749b46fdc515e0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026ef3dc85f7935f66c358884bcb02209b29d258371b8f5bd35529e7e130cf1437154436bbda43c1089bd4d896f54f5882ab96a25046d236d97ca9e3f0bb15b756888c14a2c114ebf47c3fc289cca494f6c1ac7137db10ba6053a6c10f34993e7faf5fa0a4a2b57fecb7fa39b94b0647ae02cb4e6fb548e5a73e714abe663cecae45eb2004baac25a1869795d40b8b93d5e9513b030d9278b4a98276b089b4aaa058c7fb12e88d874a737954c2780d510588b505c5ba5bc94d2a7d1a42233d2b1cee21d823908960bed8519bef6ee4cdb9c58c22a7569ad560e3b05051be645806975fe00b2383caad976fd48019a564c67e57ed63b5e6987d44b4cda380fd484c9a8f4e1d28f9d167fce8a75cbb9e7331b24bcc26054c62d99df0a5e7492c94f965f84a15c960ec38ccff23d40ceb354862595994c8a4f701f9a5a29a4420a8d744d2108add900fec572e24e47b77b2c7f8d7864984ff69d9880442a16f90be9c67664189710a6c12332eef920137895905f3af4b330837f1ac59d8e34f8c0fc5867be0156d08a0980fa0012d958afd18b77effa52c76aa9bf3e154a8e97451349f7a4eaf5c6cbf75e93e423da4864a97d511abd03c6935efc4250061c7197bcf210a58b8877d8aa747d47b1c4a08ab4365d9f489efc8fe98774876caa16fbf00000022800000224000002201c1117a30b6e62c7346d4479ee12ea1a92f225827150117c3ac18beb85a32bc200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000966bc57714d9eb3865aa09ab4d47539800c17a4fb8816098d3ca8c0e27392ce4bd6b2b4897189ed7635439a3dbb3bee07c33d39d3126533510a5e41fc7393cd58a0e9d10adf85a220dcf68bbc9470ac14689b6fd33042df22c692a778109252c957aedca29b32c4efd04aec19ac6682735d025b92828a985494a86974171b80547b2e06bb0bd5b479adff2d27dfdaf4bd70d730b3149ba0e16677c315d1c66d82d5b66896730757b3d205ecde2b83904795bcd2185364a4bcc71176fe9710797c094d1b4a04c8352c333ebf93f7e5a1677241bf6e7b98bc6e6412e5e55648a2d507e9a5a93a729165301f66143f4406f48c3d00cf480fbb508d59a6dc9f15bdcde8f23f794dd2667a2912ec9d2521463631f4366b870529c13d2adcdbe6c571379fdebdc33ed1e94fdc8640db3803147c7d359afe139a186216b8dbf9e665f8bcfc3ae188810e10817ff543e9f5bca4e56e72869d6d6f3639cf8e837da4258c8768bd204191551aacd4bf429a40fb289a619a444b563f9866fda3c316c49ab1201ecf265b669ca3f736b14522d77542ed6d2e4f276e1a4f6a27bad4c42f77bee0ab871124fe81435454ddbc98333ec6fe590b868d4b263a90c5f8fd3adf3d55a000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012912b3de2d321e187bb1da4e32ef3501e9b3ce944bbfed72414f17ad1547d7750210c99933f28df7c61e92c0f60bd8770e1f8a14c0aef992e9b1a94821e241881022f974ff9a21498dda287243ab38e8ac6685a3774ea865072a334bb51dca9c54000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d1fa3b803677571117e69a84ffa3a22b45e7b88f38f3457a791e232ecb554e1b7359629e88357df30b2ac92854398ba4728dd6377aa11c57c0be0b01a87c8f778d7586bc37c9849053d82f4cb01bd55b8ce9823bc648e17f0f0939c3c982cfabd6791f3662545b9210d7fe2f9fb3198e4e25253fecfa58dd803682f2847422e5f97778310ff1de7b3256ec7b29e8a02a68e2e3250eb9843df31507bb26fe5fc9b7cb60ae29ad3e4e08ec001ed78044c3750a94e25c30fbf3aadd857af471b69eb45537193fc90f639c71df213cca830d75206b7dc47637d89ba37621880de083dc8edff7158f58c91d14ee092e019a1b66e4acb472b467a98fd846b705d59114273365e5a536121dfea30b80ed87e072c84b870a1794c37e4b5a905497d6d208f4a534ddd4b121224e8b6db4e86ec9b0ba82742b7d66260343502ada66cc973d6d6c1b85b9d0dbf44d9deec7fa566a3960deb7cb4deba76fefb49d2cdedafe4de955a5ed63ec3f87706f36737493fc2915b6686fe365d65732049a5000fbb483cdc8b98579e7f0b29c5c3762c78458c5550ac38278e356d28bde952a6d942e8d67f0b15a4668dbb3f7dcf8d1848b90e553d7f0a494abcafe55b693e84d4e0b46cb609c8e3b60b2f1b4c90008c5a96d11557f85f451226ae59d10e518b6ea3570000022800000224000002201ec21a84f5210b6bde85a85a535824561aecaa27cf66aa621ec96b164c7c541d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a180a3afed93fbf0ad5ed1dfa688fc70977ec8305aa477c96ba64f97685fbb4d11bcb8ce3d1ef53221faa93f20b4d2fc7ebb62ec8ec7b038bfc8878d237d37c38ab406a08d0c7c89631f05e5eeecaf0185e41077e084e543c65fc76d5f82b5a0c32cb112d1395402e7055b36f62b5adbf738b6c6654f14452b2ff1119fd26084786372ae7238033f585d073e130ef73ab7c5fc033532b87caf3118b7577169350d79fdcc218c76722606ea9e7770fb06a7c46801a2dea94133633dfe3704af23bddf2e95571daad931758e07978c1ae936e4130f1c1c4175653f08ee85d32e8b1edf1ea2fb296e3146e5bd0e76f17a3a176bf682441b17ee27acbcaaf404af90772e6307950a872ed5cb42077c107a3c84b87af8ff6db9b5de4a1d6e6f80894065d45e1c77f81c3d2690f3f7ab827dd3b04763b27db6519b5156271ec7498ac8e2750860fd4351373b374b966eb6b68b48258bc397c998ce50fc49e65b16bbe6a24b2c116f23b73c0762f7b38d9444ea34c10cea68fdac7279a2ae4f74cc5f71df960dcaa8d487edd3c348017af7a05b2b694ef4750ed4354354eec1475322e0917fc7672012392387ea27032f9008df95923e31ac4e0990267d888fb174496c000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012f7becddf62ce8bb97d89ce21d63edd55cbef2022f1ea1bc003e38d6c99dd63902141bd7170fa3ef361bbecd32f84f659048f09c7ed87af494e32903a9cb94c9a6072eb72dbfd95ad3b1c30dcf11d7769f52b1062059e065401126769070c0a80500000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adaedc489545a9f30a17983df595b55e316b8452ca2defc90928e3897375a8c9b35ee2de5b65243caa924c1cb5f0393bccf614febf0b6a8a7bba33082af37480dd5dd613263a49f82cc58b520ec0af2596a7e1ecc514f1c11fb33aab384c2dfec5a0f60f58b8c1984ffbf697a54431bbe0d4a6692ac4e860984a24affe7f68b686c6d429fc9d0c0b4194444217ba6efe0c11a770000502cf19b6dc7d83bd0e8de6d75ef52d254dd6685c859825723cfae7e7a5caea1782e0d4ee2b6c9607e6ee33532940449ce6b30c635bb34f91dd24ec161a2212a3eecf7fd5b674a688c18d4dff9b7b9b35b7fbfdcf1a20d308ad84c6ed4c566750569d423633144cec0bcde7902f77851d973b1dc92186ea43249ac1fe471c4724b46b5c4deadece7abea81d81a5e7771362bf420a6fcff18f98a1cce37a00cea56a634791c2c89bb07a703a8739830a2e00f587bde6810f058673062d688d55d9f06fc02a1f5479e728b257e98a07fd032881c564d38a683c3ef1e724faf1c337996fdb82c5bfe72dfce3a3213ce0b89979bda38b74bd13f453026e07a72e2ca20a2583716016b073f46f129a1615a1d3dcc322bfb7caca3de4a6dba7c397010ae4ce9107f4c02c1f77e606d47e8df8d196afa310616c156601d3bddcc59eae91a32824a59f4d9a2fb43a0000022800000224000002202ff0cd4e195276b7b09234ffd13622a4de65391136cdaedf3d8f201dc97fd61f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ace55d3f475e07e08d30806a212ff1d23ed2ed8fac7749e3b5293a0d3742307b003d26158f008cac7179b1f501300bdf6348bd04cf3aa02909f87a8b11a5b41c89a4036b24e40b6818de217484a4a058eae391e39aa8fdfe73a743d8e4e29ba50cb9ea77159a066ea232949ff5388618ce5842e4d49443947a2338812bf599d8ba1e0c87444d5510da225b79b3b50c46211273e3925ac1cf9ad828b57e983f8b9cb669ec307917e04268ee1575a178e19fb051a2d776443b35c821a8a6a0e188b889d76abe5c39e21ca0bc29cf9d619b3c81498eb70cb70a00cde945f31e0a3f6739b3b30754672672f66572a8e33a26f911e06c4ffd470f5002da8307b3b14a8d0b5e2fe65449c46e7806f5640cec4f8fd6b33624a2893018be092ddf9f1a673858c074025705ff4adea43c6fe44909ad7eb8eee804d70bd3a8d3448036e66449037ea259475f309b1b2b9ddb2c210ab1d350098dcb4f63ffe150385b59df812fe1052c440eca613ba964c8d261f67aaa54cbcc9ef0e6f0fe65dc2fb02c3bee12fce7751f2a38438b1762efe638e5015e0760148ab9cf0558a37117d7a4500041640ffebdcd20a9a8a1670bad4febb931c5960e6aacdd75b550671e39b23045000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010d4cd54560a9d81b3676db8fd6910d6018a0dd2fc8f3badb1a324d1dc4aebfed0215330acf4746e360151c3a16c2cd30bdc872874cc2378d49ff176470fd06d58a1ac3fe5b1402a8dc8c80b1d64cf4009c43cf409eca38e0e58077439e1e554b83000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008125cb83c241b6eeeac720283b0b7b19e47cc1fa3ae19cc591c5fcdd3f6cbcbac53840f697a0c075571dfdc37039bc1dbbc5cfd90c1de122555f53ca45d9ebdfda7e730b6f4b93e31ea7d4e515e2e7b097003c379418458bcaf8932243b5352c5d2e90a6c54f9e650e49106c9a888fc1b4e7dd5f72bfb130cd2eb8177df4dfea80d31d252fc08a021d6bd691f24f617b3a95f580ae758e73788e7d23ec1ebbafdf7778b4ec0700821d4f6d2e39e0572e1d453ac2fe6252b7dfeb72f7ffad87c6b9cca7162bafc6672db65b8890dcec449b7db4cac5ddae8cfd010afad2a81c21efc93bf74e3826d1c711766264d6bfe103bd691ca9ce67f6271c881034dc879c1e91bff09008a400d1c23365cedf9158a17daeee605d440b5587f706b67c1a59b2ded9ca50e42c108b8f27d0b9a7f829d8f6a5cf29522053f673c32acf0cbb5e5fe24e412476953dd74731822159d81d4defd3940ca02c530cef18cb4b3096f76922ba5a63ca4a2bb6fc7d064073c3c7f3fafa4a81f1033ca72853b454a8f9a16e4ac8fea107ec021eb2b0fe36a3a0a8f3004a39b26e1ad178d0d138b9e8e0af85af2af127edd16fef7ac6d000f687f2a6bf4424e62034aa7670624e2c4f883438abab2e5568313e0a11dd029700cc557974b690a1debbace62a602e62a6788e00000228000002240000022012be06b65e7ea9a13916548e64843a6e6721643ba27273d90bdfb2eca4b91599000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f2e617a45c7f41ca43c6b2ebf4244c2d93120a994393398b5e7be7ae275d20a0fb2905172992e4456f228e0ea1585ffe72ef1bd9f3b20d5d55631e3fa864ebb9ae421cdbb79812c809ea20250548492a3eed4f85622e102f7b7015867553a431bd5f72881406fc7aadd664cc8d4d8477b0da31b781dfeb623565fbd74814117d65a9318b642b5bebeff402bfa252732547a85ed291b1fd9c01984b7a4a3ea21814f50a2a28378297e87aaaa0de3cdf0bf91f277a0d64ce162de63df070a55d63e1bb8d20b6f4c4a28072a12ec41992916b79609588047c3b64eb529e0436d92c9c24964efddefa7668778886f26e7d58f95dfb538aae9b2f7bb71137096e2f738123bd2b0eebaf114a9401242efe1cad6b95303b74d646f160e5ac2b24ada5a4af6a394df75b523a1b6b963ef3985208fb0306a8520130c52956db939300fbab02e95ea738490a4a393a7e7e8ac03dfe7a310e41182b621590c5d76b29ca61f468834d7c5f60b523eca7f34c3917cd9a299aa751d4a3029babe14bcc023c8012f2c48ce41162a2e4dcf06bc311d845cc9cba7bde297254527ddf36414eda19eb63ece7e848ffe3561778f4dc3a14d73128df4c75bfce5231e7daf4fc40bed90000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401305d8a4f404437adb8217b4b118293744bd42c60e5b776dd32b3a42cc419936b0217d147dc1359c60af6eb11b6fef6cfef98d046d9862e7e203df8030e755fbce02fb01154e97db8ab4e07701f838378b12c31ca361ac13d8e478e2df10e7da7e000000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000157b66bb49f3e2fb4c48001655a3b44f82c437fbf246131d3dbe02114df897477837c9ba0319b4d5bf1d061787038da22e6c04eb8536d19da8e773de24339514ab6006200ad49690deadb9ed4d303564ca60839667b8a69967d0d6f4c0e6b7cf8e166441e1d9dcdbc4019f72ddff361657168be456a1a945279a2c90bba146637c9470326e905fd731e2631645c021f2e3a7a1b796bb5110ea72b82ff2343290701310c47f8207d275b8bb7c8793ee76a57bc46b3a8a4befa73ca67b14e3e34d9e5a6bbfaf3f94740952a7237f74a91144825c812477eed4a4bb58298513505d72f2664f9aa9eb3dd6a09f71b228ae2f80c30a083fbaf50f2e1e0458659ec4f2c550e8a68a8944de30cdd0b88c674a58aedb0400eb00787f66ccafc46d071ee60208f80a6882979caa84d1f6182a288863f8525dc77061aa477b984dd17a9208524e510b20ededbe2e56a4b05bd503388a5e5ca804429840befc7c934679f31630e235c7f249f8cfcd1a3957954daa8b44813a6af4233990e4518e17e2a5d721818b9111357c4fd6be68e86e75483b72626ea0ee8d499574d661f1546a83037e7c240a9ab3832f6177b0332b56fe993bb85a292f2d8b4fe07c101d67ad0fa607fe192bf57a252d03faefdbedb97dff00c98e0fc81a8db21698850b137870f48000000228000002240000022028592e5695bb9c4a3f2244b1be91a8e3b7170cb3b6a278f39ce3d1a70dd443000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091f7e774fbcbcc8f01e4514b3fb4ca82eeae973b3c38b622347de11821987fb72543b309586f4494e8570ccccfc3c57f24e88d76a8ef54e4d5be672db7f6d8c0fdbe5c3f549c3960aa1dce7bf7d8f1e25d56aa87eb87a7bd4efdd0ecf2dfcacc67ac3084de472a2489c7a0439ad904fced8bf33abbfcdf622b4ea883ce151fb1683c78085f613b110abf1f73ebe2a323f8630702c21274ffd39a1ca7449b17c0216539705cc45c762794881755e8097ca941d25c0a5fb7ce23b42e034f711d1beb30094a2cf2cd175abcee9ca08b500f53298fbe867162f21d657db32a36216fe0871f9b1604f96ca67cf0e8cf5f7924c1d675d388fb372d0c6b3f61256037c1b2a1ee30a6e2ee6bc55f1c7b675fec142fa945556da47218f79b6d3aeb4dd93c39b607ac71b67ab4f728b10af15da6b3bc2b5a54491ce616a588374169caf0aefc96f3856e879be537fd992d7f2e1ad1640e51d8dc15062f4b9b94a561e712a27ef3f3499c3fec19b2d140e6c072af298c33f63a0996a016e9a3dafb702267061b79c63b32bfb41d2b80f752ee2f3666a7d8ef405d64235bea15054cc488d8649ecec68389107692e9f32cc84d10065aaf02322c0646db86f62b0e6d24ac06ed000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40106f87712dc0d6587f33b994e9e21bc071f663296b4025c6bfe113f69efd429a20219ee125905b7108dbd7955ea4fe4671fea0f4aa518d35db23889e9e1475373eb172348f2f19e70d7cdc6aac1636703ec7a4bdf0e4c4c69a20cf14e7539e4e5e6000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ba68c0c9fd537ed0c7322157638ba76387e838ff282215611d85f18cbcec37306c0396792cae7c8591f00c37f015d6bacb7cc014cb46909d5f52841cb30f512138171cbbae8482ac9a6bc9a5b43c7f955a1107c7184a6df5d9d92dfc03ea5e6c5aa86bbad1969963a55186cdd470c56c0388156a996815f0efdc4bbeab2c9e5b9bb28396f9572bdc672095e4dba26ecf9164b9b1d74bed873fa9bd5319546773366722e0a8fd29c441dcb7bbcf9a4b28218092d2ee5a9679da222fb217cd9dc256ae8d5e0767062e0207cae12849e1bbce1b9f878a55115976acefc8f1241a5fe439a9b06d5647632cb1130c2b2d4450a015c89ff661c4e2b2b1c6162ea510cf50668b4243dcce8d560346e54435427d60db6cdb55711385071c493b72929d498e7947781c153913e5c157252e5a2b2e20526752ccd69b136b5e949259838c9006a1b65b82b9fca6fb7ff830c9bf0c8deb293071676d4d8ec5aca00e349af50b05e91203ba932fa351eaf5317c6a2cbf0ed98518d6dbbd1b55930c2c3d35db2033e8e6a3982a5999ca85743da0b5660518a913c9644443385c2629125544d4e6ec63b2f431a1813e54e3aa2a9c507efe9b70d95dd49228b783fbc77e9a9e4710734ca4f2c06bb8862b4257f812a3d5c066e5db9e398aac2a1c5529ce6678f5c000002280000022400000220270891595b70719b731ebddf3dccff784f8097544d3ee8a811cbab71477c9f3b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080b49aff307828e29afc361730d93aabe3b5a036a3b351f18f5c62917844b8707adcd2919c886e0e69fcc35b2f55f884d632ceff0cb4d7b0855f070cafb127766eeeb2ab82a885e3ddd3aa39c7f2350b521796c16c3f0f4fc3ab8344ffb03f002619fa27266e8b939c193a991712a397491eff802f30a40b3a389127d4e75f4acc4ebbc545727ca5e082b3cab8da31cf139b946ed670c1eff81f9e763c384b1f1dd5a340cd4e992b801852d3fedd0bfa50a36e0ae4a1d6bd0c71b1f79ac84f3233b7b5f388720f9ef65616ffdec506123c3cd6e3fb7813b4accebd81553866520da4ef78da15d1d7f0d29bae0705a520f19e35eb74587bbc75983b871bf9f35f2554aeca8b56f12a180f88c4669b6c1ecde70386438624cb0e00273e0669198f37238f636d2350cb349faa53e3dfb1fcc49a41441e3e06fa61f97a7badceab399e96fd938a6d6b0fcb61a3658b44fac9e1fe71baaf0c267cd41fe4779b8a3c7cfe131533667c76de1300e56a07609d31bc5a1c36772545fd745d7a5da85a0205d1de1b2d8a57e390d366da962f61933a24be03da7ac6f8f49c676b8e368bcf96c8ee669f92157954c6a88febbc2d8df09b4246a6ffc25f11501ea0e5220b55b7000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80205bf7808a9399f705eeee12f9bbae40ffcac3178336f0681b1ca0431e31837671487d187baf821fc2fef2cf44888996f1b6f1bc58995fd66eae206a30a436ef2021bf8b3805a1edf5f628de65bdaf496e908d4cae320b7be38c5bc5a351df18fd922da90430767ea87cd5239ac1ca72409324e99ab5e406fe399848d5bbc3562d90000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1e69203ef08573ab1f6a36aae86bb32981bb78ffd3a45be32619c4f2db74516eb6c44357635b3c8994e31aa8492212e630a5bdf0831d900a09bbf99d856f076f108d740fe8c5cd8b712c766977c690e9b7d4e40806f7e5f05c1ae83a4fac589c9384a64513130e42b48e2016c98db9e4e2c790879a077681004e71ddfe09e98f6f8dcd530e116c0f260fd7f408af2c842dfd2088f6378e6d74b7ae8ca13a3a7a6f24630ab39971518a9c3d60feec2d3394f55fc439e848d588b4d26554b44e9fef85b3293f45538a0b6b480a0a7cfdd21b043f1106736ae1682a827084c8690fb0ba9f80d034915bb5ae5e3913a4144a11e90bd397ed450009279bde5dd6e5790d507179ee215b9891fabbd2f69b40f47e769c0be3322e3bef6a23779bd907be9b44cb11e39df2c024b641f0e5a2ba5c7d89d11f9f4029bf7780c8142f6bf4e5bd03642112bc4f2fb4b238d412722da5aa16cec1f75bdca6236d92863068536f2c48b2cc36f4688f5644e01f1dab48a29941c9a9097ad0a962e5614cf1f3f92b5179d12e0f6501d32f96caef484615d349178669d2127bb07cefa599f8c80dfecc0e1e6d8b0998eef7ec3e4872ea658515b8ae5c97ba5655db89897397428c1b6444c280c3ce3e908058cfa2e4287bce98b61e96c5cb2f2ba286241417c962c0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aee821a7f8309381a65815a8d9e0e253e14f4dba78a619893c94b47f73a3bf7a53ecf377543ac9fcf3e394dac155259c2c6f492d13f3228824673ab22923a29b2127a2b813cf07d82a903e038c9d1906ad46025e9399b0f8a69bd6692ec71ea3613ebb59fc3f5d777b59db013fb2216598ee9446842c299d90c0e2de12bef6cf8517789d861949facd70d6324dad1f85163b010aafa53b4255b3f7a5636391f217b314ff32ca4d9f3e239d88b398ee2afaafa9260b6aa354f94949b6e345fc29c164779db630a9a5eae077bae0901311eb445c00d8450fde1c84b9ac3d9393fb680bcc2adb6fa665febbf8e57a4bc60b55d3ee199276dc0f060743e432fe2582a2797ac6d839e101dd2e9688bce0803ffaa437608210e94f49fc009fa8993de7ffe10702fc6032a3eb4e605acf9e07f6573889a8a4a39c69d25dbf0b18a95cd1e0923d9579be71200aa700b72aeb645018e2a90c1adce10b1fce6b5942c4257a87d4a44fe77c65e310d382585d1c69e5f07a0e858163488bca31e34d2b42b52875b9e471dabda829c8098db91f99a50db7c210289e041cc4d9a8d7ca7dc806b79ae9aca6a7a3d86b86a403626726d3b2e1f344fe7cb8bbdcc514d51ddd5bc9cb9874183ed5fbb89e18274c63ab1fcd4278681bafa8b362880a5f59b23baeb320000022800000224000002202cd8a45d4ff546c25ae2882432ecad45e4f94a626b85c0da1c7b41bd91a56202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c80d53d9d7219dea2e41ff458eb148e94a93b292ee5d47d7a6c26de8aad1a8446b796d84a02f1af9c6e212d0dcfc58ddcf4b651586797fa21b30c5070aad8381a4620a82d026f167b729cb7f45f7f289117baa10864b6e326470d04ed543c1b425e1b1cb1607c9b77ff0e68ec4e558c08f62698577ca382770a3446fd8af0f48ea21c2ee2caf0f53e2ecd0a159bf2f9778b50154edbc256b1311b347a295d9234cdbbe581c05fced7eb7f981c38ba2466209f9ca98d6baa33f20ba25de2104291f1e1cc300018215903014062ace305491e57d8d70014a9ff6511352efbdc0ab84e75effd8821c1888d9aa8a2319f2c2c754c97af320c00a8caa9c85f26177f0a2f21032bfc942e147e23dd700660ee43b476a52862f586fc42c2a781709bad4fe80d825ac73d27c4035bc41a263efc3445992b1be78e33a1eeced0f8205e9cdbf79d6e4a7d338e99c83a3a6ee55572f0e25f2d24245cb69ace76efec92321fbd05abfab0e628f07b03628279f6b6d81a46ac67a32bfc435bc624f93ae387f75ef5ac9153b52eb9b0c09de4ee0a34ecc4036d7129f74c81d27cf881e4515cc363b0e5f123ca23833ea6ff1ae6fc43abf0e0e094b7794f00e53b9beb8854ac2d000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80221ca611b56bfa7f4580a75090cc531b187c4b8b18750dbebf291e7fec9ecc831180d4857c5df8ea93f96ca7a8f03e5e5f069df8d87b2fd75e8fda406bbc49ba8021f5745f5359641f932d454317c0ac67760fb1dc3184bf256ef78fd5afc1a60d30fdf92da09bf13704107de4f5c327a8e73a3f238d43e99b5bd2217a458a4f12a0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000967823af95ff0488831809e91917be24272045ee8a9e8352f37a78b6525ae9e621f1decb2ec591daf0ad01b1a6ded96ce7b421475ddd856623f0d0d980dde65ac9417327a437f86b4b45b4dcfa2f3b2f112166c6fd1ced23465c5cab867b4897ddaea5b3bc38c81d2a3683153f668fc4b5aa146e35574a2b71863b53fcf2e8fed5368b1eed0a22cb3a8a6e05302db824b96d5b2da6931b6234841f09de571e6046f8f92430640be81382b4e54ec51c4b8952d52a51c9042556465d38a9ac1174da0fa9b30e3f2a5cf3073055ad5ff2e984f4378bad6dca9f57e83ddd40440b9aa860e18c49412bb30b93bd84f93603661b674f6e45aa9c9c7afdc62843d36193630c37546eaffeb697c25f348290f5208082b29aa1c83ec64c734dfdf9638344fcddb7026791dccf95ae70eb08e54f9beaaf58b028eaa4be22fe9a881c7d680ba4ff38b7204329a9114a7e1632617369c31a74e845cb2cb64682940ed2b541d6a35d619b8adf464d39547cfff9bde0f1d7e75446d2e7c945df45774bf94e7a02fd042b378d2a69558862aa5fb3b039732a6e674cf51a6c40c8d6b5a12193ff79068ac71eded73150f340c210c72a0c5247a8b07624daa10b44a21d6e1935b6432dbca1073012ccffde6d7acb9a6a8a88eb82925acce19634e089d10a6612ce5800000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098300e246d9f6a55b2a9f9c5de54ff3c429e472692e89389455cde8b65d4cadc2f0e663e58dc8b833a9a3ec484fdad7eed7f2d778eb628afda5cb410d42700db05f5d792aa653be8335fa337d2288b89e23f96062ab231922a6227ace8d94d5b092c12b416a11e40e83e90c120b2f2f3dac85dfd5853bb57c9af898b9b274329a69f6510f441a500e39f2eb6969b9c87842f62854722df9ef9f32e49b80c96a0af9f4c2d7b9e9432d34303ed7c9c5e69277c2420f19fe7bdef225ca214ef79d47866fffa87d9594028b1241d8cf59fe14523979071d59fb96785fd7349613480f0312af70256115d9e08a6f26a2b4adefb1662cb61bc719e8f7a04a67684608874ea6a8bf85753e755bd569e70fa6e6bf29af3e98ca5ea588a0f4b579c9004b2d69731fd6d2e212843005de1e25898d909a50fbf13b334a4b75be834b5fa1f9e990c899ca8da60b90cb15a02451e08204f04b7472604689fd05a86e43ab4a9613a445414a62f04b97526b3b4bf37f8eec3da787a71055a1729b70ce80cc711c1c38eece51079b5ae42976c547803c8936bddaf81688f82faa514e27b6a955de3e414738e976d4d396f958bda48aa48159b37f65471e17c5041e349c9969cb24280eb62993bbf3739620ba8a96f3f9c7ac6a8e946e40b4206fc4d5e1a317640480000022800000224000002202764721b6738dc86d92cdfa9adad47a353143b99515b68fd40d07073ecaa454400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae80a72a6f33433c6d15c1e86fcb09d39b7a9a56d6f7c65127f74ffca05be59d75ea8e8c78b6c3e7b4bd530f98f00ec154c442f60f26d71fee89e30b99e9e99c849dc860f51d340cd2809c3fff4a8d4ddd9eadecfd88be55a486c877abd39865505b660f72061c531518a2c37dd3cbb7f66e4d0e133924c8f7f4b92ec2e48f8bc8aa770cf7348c7968cba836409f2c49c40883d898d6197e62ece9054dfa8e4a47b2ea0ad6d91356774c28e08429f0f57f89783f173f9c7a5f4699edf320d737ab1190d53b8d7c7b0f9cfc598f1d75bc28e0ec406d8a3ffd72dd919dbb2d2b38989ad7d852ce670cd4afdea5f3f7961591a0c5fdd50f9d91e765a189f7537e0dca27d22480bab3370c6e25b03ed4b5c265133d7419c2ab887b0ee9875ffddabbe1b14a546e6945afbc8fdee864d54976ab9eca545d39fbce65ff26e7450426b2f20f56448b5ec56ce2954e30a1e26b6f074409cba002c7b4f270d918301de780d24dfc42e3d2b7154155fd22b1e062050d7398398a4b4957c8f9e719609583271900e3eabaeb91d02c2b03dc231683de320dfea155fd4baafb2806b99cffe4c031a8398e27d788eba5f15ea17751bdadeedbbbd01d272ae2e8d85408a863b575000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021eab2a98920c4a12d1ae4b7ab1470d053f429ed2d257bb7e7893946c8bd27f9711f44c354c1cb59d6951ef7424aa6cd786eba2bd106bcf2f05ed6d709d7b3bd8022236492289e41bfcde0b65993ea429544ea8aabfe0ba9a8d5bf8299d99a5b3851ec0f81fc6a73c4b33237ddfab3c022f877f49bd22f29c070f036c7fa9a62f1b0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d2a68f23557e94e67f2f5aee61860ed26a0e0187ea6014e16bcc250e27b9b61c75e2f50018cd5d1eed312b02d26f7e59a418aa804a7aab9befab4c316e38f239139254802b3bc3e68287c78527eafe44c7ca4e3f750948e5803adecdfb63d4264d0837691cfb450702b410e1edff4ecb801082fc688edd8f79f8f4e08c058929f73dd5f0e9d28b2df1d0abe676e853faf2cc3262aadca9aebe4a13acf056938b636745774f23468de729acfc8c0e8c2f22a287f8f07a41de74ce274717867942c4bf49e6d81129b74d8ec2243556bd9a3c98f57b60137df8451605bb97d62a0550ce0b1f1e63045064e68e528513c4a7035123be2392b1f737e95f35552b477819235d3a61db5e875bf4e07b1e7746942be1d07928b2719c67fba24654a9677ecc86bffea69867bf3710a8044d85b7f251ae9902732f90d86024bb587ab5bd6141a9c516a1fc965a911a7f5e2025adc48b19c2d00a10957baf6a562376c172779a6dda43c63557fa54d6f7f2d615130d23cc5ad665bd074de45e2bb12b054335ca2181b057c64e22f491032e12dbd684f7b984b15d8db37917864c87cbfa34eb6b70e6f37b773bed82d12dbe7d2857d3c157dd8b7d6e825aa8bdd2f818f93888ab863ab2d1091751fe5f3342b250d2324493cb32b3b9982828ded81df92e6a500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016d26e0d97fad763451ea225247199cb715b84a887ba7c5bb74b428bbcb66877e86b648c9e824835b84f329656800a46a63673738faa95ad3097c73aa4120b6bb4a1d7e60e5703ca58cb00aa3a0ed5b618fc3a8ed25b588613e9259041fab2f065345cfe36e7b8b65fb47e1c8f32fdc3886cc45385cabdd168f7b4041a8cc15bbf84160d4a09871ca1fc4abcf8825d0a536fb25d13294c1f55e50111eada7165045b3685d773651227d1bf2c2103c83dd446fb1843790c2f81497e3f3a03d569baef0a1b5fd02cc7132b4b1c30d29ba69717f04280b79ec204603efa2c3696851faa6a889a512a12dee01695d121fb5d220fa7af1e06377e9ec57f8660b4fcdb5fa31f4e188d5dfce28f5b074fd31b143ba3323060386340461a4af1de7c8adacd97cfb43dc4fc48950feaf936a53bbecdeb48d7fd17ae3fa2275a2db0d3d7f5a543eba7811f521e39657b9688ef2a794a2068bb7152ce12b7d74277833d0b591bf993574205a66eb2200db3ef22a38ff3ef5771752af96ed92dc56b3e3ce39a9a26f70d49bd6e119d0415d10685c15ce19aa31a39f54aee4c86204c0674f78e5808f1cb15d8217d00cc048aa74d1fcf645a082618c0bdc1e25e5a013486670bd1f3e12b0a1dffabec3ed1b692c01dc9bda97f6f4be53ee418bf0746d9c73b2000000228000002240000022013938947abcd52a0a813ce873da5ced181eb7e6485dfe7bf0010497f0b2de4a60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b698f9a62f569af269e51d9486e01c0232e6b7a8ad010f8c00ba0eb160b9d48213859fe9b9318cd107bf2f7bac0b12ed58e711779706882b5c7444d63e849b76f9c004a8f2cd0cac8c0c3141e28d4ad82c2119a68215ed8d93d13f6adf8cd36995bd7365aeb68565e3286b6d7836275e8eca6a5b1a173e4670be3c61ac691dac5d218ea03947f7e427f1faa7710b97f95b27b233453c4182f357fbe01a019c7b56cf3afcbbd4875b96e9e2af2ea0fbcbf1c44182cb63c26ddb37bb702d108ff3712d6a7688b011f80f59dbd6b9231117f810972fc0027de6b5793953f72fe1304880e2e201227f6c95ff3e6acffafdc62ada1c3fba07a1c5989058c23a3c782a7d5fde04e32b8278c38f3a4cf41cfaf38b46eb62b3510d17a387d65494dae02f340079e56f412ea08e90a45c8ba2c533e36649c612e2467da7b415b78fba9437f3f1357aaca37c54017ee4e24a00f70dbd03ea14937f3fcb1aff2fa838fbb66cd29972235a9e4c6a58f5616094b50c1d8ba026dac7bab5fea8dfd14679815c62caa9d0cf9d02a7dbfabd2723789a97fd6420b34ba2b090f4803fa806f2268e38c83beb09eaf42a407e56eaf2dfc57748118a6f2b6f9279f60bd14a147c8a37000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010670399ca4bebfabdde76e1d7601508a06a5fccf2353020ad6b32a969113e3d802228357dc9f222987b152b65b9d594e10f74a91caca42a839d6ed72b21844f26708bb659a69adbea26b26371a26236089b287c5ca2877b25fbf312b46f28a81f3000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008764e9fa2390f6b377646a8bcbae4af8f8fc2c6199c6e2b7f7f0b5a7108b7d0db3764dd86039833f97bcc3bc9a1bb42213c6419e82943d55baf3661d1c998e59dc0c825aa66b93fba987bb9095446cc685353884211367b763aadf1b97a2409bcb711d1d75f24d610084d606f1a7136554d952ee6d00934c605d1186c64a5326132b6748cad04a67b8d50be3665ac7baaa7bff00d50a598d2a53b3f10bbe9013916d85b8b28e73710a9fa49b45c37d091e7922299dcc1b2dc607aa9c311a30d1fcfc3586779d11b5f05335c305234768c1e232673aa64beacc908bff845b873b026de36db8f051a3d639972c332e6d21809eee863f16f5f884b2867b195471f795c4ea904f9eae4e86c9a83b67ba35cf4d4a0db1437594138a63839400e1380cb3908111ea7d663eb2e34948fad84543072352662e7184258c3b962c9164013cd7234e27b4705989f59bad52c893e76e0b9ad9a5616b00c99629f3d45b8713f0cf61afcaf9c9fa7b227978a7df7269ef9aa847c11303899a6254a27e8e71f4835a18a690b78dadb6b17b2c89fc4661b9a6c34e057e1fac46478a8ab2a9be0412e7c1a4c25769e24ca28c5605b93282a2d7751092b3fa4eefd085d89736186192b825559b6c23d368a62c81c11a07fefdcd4ab85f176d564a86fb019231b69a8d0000022800000224000002202529ca960488fb5792a1d46aefe75059f342ecfc05d94e22839cdcdb552b40dd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d2bf53abd8d8a3b6bbb4ecf166cc04d2422dbca526894b56dc196fe2654fbb2953cd03aae96932ff8f2fd4ac0236fdaf39ecd69e3963e7b098c9c74748c13bffaac497067168b54c8400ce94adeb0b54669224b94d192892c93859d9fce781f60994746e7a9739e224f21df85e4c4ed0f88db6cb20e11c6c420f249f4a740af53e405eba3099aab70191837ba204022bc768af03978e498f65e9d6bb179ff65bbac326b2d3de732f58e29f407883710c72f7cd7959cb01c271fdcbfd5f99899e350abf671a49b6d356f412a6cbbf84b439d36c242d37351a7d90567ec4dbfc4555c5dd897fc8ad8f1a0b1d8ffaa7f1f2d3d44887053bfc4d2de5bc63963836da74f46f4d0816ab2f69175d2737825edad632b2917d8569fe58359dd700950e50ecf92e8e9183f74044d5afe30f67b78c51fc0f97c8ad226bf2807e4af96db3a56a55287326761fb800643cdef1a9fedc870daa3b4a94bb8884f8e51aed4070e560e391332008a42effa642431d03b47a142742bf332e9c09774c448ce2f78ab4b3a91a645179422cf8bbf92cc859463d6a804e8871f5a771f1122c8dd3dde06f41ba6c024875bcde879cdc4013cbd2341de50e8318eaa6f157c7042e6f75717000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012cac0528e2bb26bfaed0653857630170c191fb061e0d36d356a531cd4cf5985e02255833a61c57a465eacb384ed90f212f7f2c41fc621af91d01f508accb7f80e22df0456ce9a4567031e9729f25c6fd86fe7457d8f5197fb59d6c59f0f92803b8000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a10d1735f9bd6a368a610da03e151d0c8ea8e44a877e5c088cdf62e932b2c62daab317cbfed5727e3af86708783177c773726c0b5b0659ab8423dc965f37bdce389a806ff4c916126d7cfa75c9687f9ddbdfb970701b6b3f609669912d82c469463634ff762a793f69bf85f5f7cef24f9d35bd3bdbe54054b705e67f2e1dbbf39d3014917be163f150dc0acc38ab21b4fea9c32d3c9a1656f1252a033734b49abaa4cf1241e5b24c6678f8e965c628bfb8881666df7962ba4ac4a89145410dd67d43842c6304aed24fdf657dfeca08170821513dfaa4665115d50d86059d2367aac89da251a817f6e54535706d5961d44ed22afc104a14f85805d1d4448d2a966e2fc61b5443b63e8ff192afa9034527b09226e275d3e126d78b0cd612c41bf1a875223bf35f34da9473d5c6c2d643a18bd1484ac26a3e815068f36dfd284746030510e0c1ef6429f6c0ffc70e5ddaf13a60fdd48b20daebd27a8522970cc5a6d1021ccc7e15f6e0c00f70b5b881a976ff80c9c6545ac42792c36633f6f119e3cd272360b1d4578ec88f41535499cb9c6bf6a0b299dae577fb1dff8240734ef852c1b313774a42d26fd99769b347e17254f682147812163067fede875ee94f79827adf18401ca2d489cd0cc583c7b39870886f788dcca0b5f0753ad4d29b07b00000228000002240000022029a18f4a77d6cb740f22cdc9280690ef7ded084680353af315359bc801d20f0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000961e05b0be0b893a7da5a9dd7323c0d8a755a4dd9ae0b78f8f93e7a12504c34b09a305622f9d5712318bc1ce7376a20627aaf6095bc9b87210c94da3d6cbe2cf5a5263a1e40eba7b5cfaf156759cb915aa35b790977c57b68995f95a6334ce3ea156ba1bf1757a0a2c750905584fa1fe788cee16283106f13af57ae3b06042bd36cfd2cbca942204342ebbd31311fa86001de194346c222ea57f80f3efd21e1fbb2c393bab390e5bda879185973d77e89d7f4f339f7592728aa2239d949028a8fff16b2373c30c3c7058a8c2cafa7c6441d6e7192b72d52121699c69f70f89a3d8a83f28fe0a9e70bab9a7947b5ef13371011b3e32f27d1a6066fca3464ebc9349f1f4bf1333c9b2086bb4f4d33c9c6e74b2c387586293341a459ae9c1c81d451db026ce2ed9778180bacf9a345e5d8b6b264766250467c1c8860763f5c2e0c58499341101c326bb605fe4f1ab6a6b527bf33c005a8501c188289c19ff63eeb33fbe4b47502bbbb2b8750695e3bbda004873eb7775ab34d9457a410d04cb11aa28d644df22312277b51d2fc4aff3396aae3bd6afaa1d0a06b9dbe0c458a32523433073d862da92936c66137857276d27f645a18225e3930102798f5665967ad4000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40129cc2d625b30f5a58154339a2ebb846f7c3d4cbc8d5d18700a49554e206b92610226c74ac01ae694aaedc6eb23a27678c475bd901ab204ca0aecae2be2081663e81e9d0318e9f65557b34a17d8faa79b223453fb1f251fca0660ff57ac36a116d500000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083d43223697b25646892083aff72cea086b81912dfa236fc37bb4144a27c217eda6cf4a3619a8c06580866a6f3158235cb32f32fe4437c9b80918e09eba9e067d70cca6d4772cfc1c5b9a8404d80ea443b88d43e284c4dca6c5aeae92070bfc0e1bbd1cb9fb3cb2b3582c46d5708fc3cc4bb1584a0a14b242325544122a62697f708b16f14b212834f24f348a9c490aa999cecb6c8589bf1fd8c434cdd2acfdfeb7ee4a93df6dfe3e18b5168bbf477f4cd2ca1d23a80fc154ca394fea5489d9787c9281bb55277fbba26de9b5aebdf65d3dd8ee0596aed231dff4e9c2842eea6177fd8dd0a88ac3a7d9621e5c54cb477fe277e6663d636c232013bd5fa7ba6da3756cde5a8283fb58e235dbb339203f0848f15935300c7cc0a00864211a20e07536c075bcdabc6c987786a9a3861197a48b53c937541fe2ab59ed39a426294cc79117eebdf7bc0780730b2335c6e017fe60c9431c8d78c4800e707871daedaf82ea5cdf770b622c664935f670d227e31f02685fe25440c17a7ecd46f2ec95571347663b96b3c83ca43fac7e485c563b091c17f7da240be5597511c5f88a921b1ea822ab5d3d2f2d63977737143a8b05a796980473d2ba92d017400523e2c34d4c9a6177a5bdb7c6dbf52882423c89452aaf8ffd69dfb89b055a6d1fe5ec4c45000002280000022400000220259d0296fc73dfb903b26a1f3eb6377229588603304f5ea34df33b881cea977a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ff4636cb988aba50ab52a2433ae0a03e8c01c4b1e9e04ad89ff4595f981e9869a739aa6655598bb2a2170900224f6f2a210a24b0a3b9013f43d9b7298bd2faca898ee509db8cd0179e3430288527dc7e19073c8153823bdccc9eb5b2953617a7bfdfefcd34df12757e629d28faf0ca8c0a9ef0f49f9a16e31c37b3021d8651a8ee0cd53143b51d02d01b4dbb51f09f5ee4fdf599414ba8e79d9620c17fa4a9b3b7168827903040e9b3f1e941dbb2ac86563a17da392c3d53e6fd67bdc93c414a3a1cf026b457d4c94a6cbb03f4d69ef79ae5ccf9ff90a1590e7b8ba6cfd3b104cedd63f355ebdcebe039c1f50678e84de5ea77925ac1237b2120d64d2215e5ded427c3d870c4237563daf9eb286b063d3b0747b437ea94f68f5dfa52a0b0fe8cffabf1ac1032bf66868960b9c6912ee3fa8c311e802d7bb7093ffa8fd4b1497a8fbaa09ba692eece1556bbeb44d4926ff983ad23a4fd72bb0d35b6d4e21c7fcfb4dead2c771efae1957f35effe8b3c9198f97382cf73d4093b6c85902e7d31fcee499660ea6cbd9933523a8b9c0e5f808f7852f46224fa1c6c4960697d054fc98d351550b25585b3d12271f27d5fea048b898168b9624ae0b7995644f5671f7000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010c5e1762a78618db42336cb7e9b7dc2390c8216bf61e105e87e4bc7953f3221b02280280e90bc16dec15d15f219a1533cbf2356397120d33c08a7ffc93bccd4a0a2b486248c065fa6974fe3c9dfa6e3ffe695c0f07976db8e5da4f49c22cfd8c39000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbd62d89aa423356cfb735e6ce83e2a600a8432a5c662a06d60f5f072d8483f0f1c35182724d44fe5c3f3e20c6e812d49e7c22c892f9aa89a409e2aa6d8636215f94c7abe2f56be7f1059ef8a63d7789624a8f1be18ed41789f6330bbef6b1cf5bdb3536ba9ce0687003ce95bfe31de0485d544471878e62937ff509c810bf698ddc2c0b8794b1014c745642f9d620bc4b289fa9fcb8d3f5136205de3f47dac781dca441081b8b4c259786f5a02b7ba7fadbc635c4347c2bb1cd2c295980f41adae21e0fa99f80531a45a4e2a6ae47708605fcaf5c21aed53588f513b82cc6fb47372587f451d8f091a20ddbd9ad6902d9b4ea3572597b3b3c04456661743925da1add8909bbc3fa93df6dfff2a97751d00a41f9106991e5fc569523fc7a37be1bf2a4f6b36f9c775399fd57c7ee4a17e6295802977dcf34cce9cb08eb13c14fd7324840deb5b88fca334a7e45d00dad12d262719678846fbe4f5a1741b447c5595943d8689ec4cba9d98bb3d78880d72f933efbf4ce1457dbd9975a4069358c614e2674cd97b7e57cdc834d0c10e4f54c02767fc7cfb4f8554e4fa1f9c4f38717f62b5a1b8ac100fb9dea92d2c8ee18eec217ef74bd82359497831d3917e6af7afe0fb78cda2979cf0f77ea9540c1f5cb74b0c02ecb381a5b8c249c0fb0472000002280000022400000220189b9eb5815cf7bec84954fcfc4d3916d4cf05c83bb6f59ac771011015974fd100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000869bf349db65697b3217a0a35a21190e8e73c9db773ab83395721bcbaab0754af54f7d149694fb1b42667987299c2d86104ea7fa0a7f7697191c40dc3ef2a1dfc1633f48f2011aae8dcee6784c9a74edf86eedfa50e7390fafbeef7a58da4267b55b3e4a4ce11313798522ba822f46d68f6addc2a5b6faa4b3f92e1d282a19f3f4d50403d9d37a776e19b3fa1fb63cfd2771acda1c8e4142dd597e7c1ef4031eb30f0df4a46276339b23fba37ca7f26ee2b02bfd3590d3b6c1e4d72a478d33135b66f51b81a95d66ac585c9d1042d87f11406c2186a95e4245e6169be062d1ad67e5ed8bc7b1400be44239402bac886dc8f4c9090fa2169410eb8c5d2044cf0d8409c8c3e0dcbbc2a978bf1b12b8fa3648ebdc3042c5aa5bc702e10914b860caecd18dcb3351da116ed8d93706859beb6e68dbe0951492890cba95e968ebf05f88edca04b3e4af4dd3643224d30553e10dcbd16f086f58a96a97ff7c3cbe08349ef3cb559ab34f864e64cebeb5a40849796b693b987fd90fd3914a9a255ef18d6dae47ed6f6c67ff91627be14a79bc59ce10fb5c68929dbcabbed1512378244f809a07efa277556213bf53f34cba5db5d51c98f7aa959f552b0b08e4322c3de8000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40119be8e882916805f30cb3d8650e1f281424d3ea46fb0db8be740a200b07754750229c80990b105c16141fc2f1c374a86995ab8b3b0facd5e9f13897f041b0f181f00bb358b1c5ddefdbec6223829aabd21f6cd5e57798f85c89389ecd1abae62940000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013fefdd55bbd7c1fb358160040fa755edd742795564e5b64a8d74705ea9ff8a668b6485b152eb41e2867792f12b7631741948d6407797478eb8366b0f57297491ee2efcef026c977829aafe79aedb83851fd94e061199e1c19e5fe3828f0970e266fb02d2a1c2a71d7473ff755b0acaab3e8303aef33645f1a4afa469ca31672d68a2c232b465cfb5d22cef23df336d9d31fb91e9a338fa420506cbe4eb7ec4a3cfee75416b162d7229a74a43d00558f09bf3b729902875c434f6a69bcd2cc97f1b8758c8a1a1f6b24d97d15c2a5d44c273327c40b3af19dff6a3cbd63463d9fd383b2102b9740d80c0f87b6cd0351aea525c8bd2e72de2c75712752f98d211edea8223efff7b9627affd11163f6a8847dc913efe67d1f182b302fcfb9b0bf985a63cc25436938d6b6b06f34e9128ab518c724e9ecf1beece8834ba36443c4978881835438e260e960101df63e226a705766809eeb8fa506eec5e9ee5524b226d075c165b750c5954a03d88007ba2769c422463f951278f365d0ffe327e6f04ffccaad666de5cbb882f145f4b9f8e9e5bd199c2bce0257c8e5ecfa0ee8674f18ad63474ff2e0d79763289b1106128cb1213eeb33692c8bf93c0529e53bd627fb074b6e217ac310d5b3a27b1099f2c1e92761f5e2e6bb950625ef2b64f8ba8ae600000228000002240000022006e22bb751043df725b2c666ce7edd53be89b6c45b495bf78ce8b2f29fa07153000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0bd5b7242105f1fdefe10f8e7fa1991710093976c1e652bbeb8785e37e7da8661553e3b6a6cbd353e2c81c518574cf2c0713ea84da0880a91f8131df7395b8513a3d9ec0cf9f5183fea9e8a11ad96c46b90ff288830c78bd5d3a76b8d000ed2e7d9b259ccc47a677165411366cd3c281a03a8436383a7b4f652de4514833688e28e02a0a6b43573b2e83a5fbc9f9b98646679d1dc4d33b66630859571b09e74cd220bd5724071b841a3f8c16f8535ae1ccf4bc818239a673174331e0bd697732993e089d44f9fd7cfda741f8e9b4133f6f14fe301433dff727c8b2595337701c3865b63e3aeb02fd88f79d2e79dc53954fa500b2bd41237257c6993a10ca52cf0af3c98d1aaf4330c754107429828cb2640a56438379a91f08f8f7854111102ab90cab29b5804b8fa6558333d76ed1bad0963945f55a1ea70f39151c5197e375bb8befeec4f9d5dada05c799622d0e3bb9ab7d1fc78dde6034219d3fcfc070656856145fe16d4c79121676fd8c4161b35f8015d8c9a8215a959edd956bd5522b5bb58afeea80ab16b040e662958522d67a3a15a2c218e5e1977b0d697c7a9fc695a0a0814808e970b6aab95fb7c162fefe4d3c41022f71c693c2b28191dc18000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80220fee8ea6786f91a560ecf9e62914a370b29e042122133abd43988a922323b3f04c3c50d449664f097c100ef6c9fbdc7d804183c9636359e811cb74a87d4d758022a379de95e9e0fce6993d5399afac9afa357922ad739f611a47b3e2f2f2d20d22cefa39a2303b5f328ac84752b9b0e2619fd0c1ce1f59dac168951fcc3d3abe40000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009194865575286bbd09fa881d29a7785d78d42ffc8bf0a8d544b0ca8f2226b700559b48cbca6dcf92ea41794ae4368090caec555706ea673c0f4defd0f0f477a95d7fca65611707c42460919d0ca9a77c57a300ff64f5907693142ac4aaad8e35950dda3982080b8f9967331678e278eb9dce7bf24616befc6308f4079d5b8b10d0f162877dc24c86f5db71c1552d0bb78c73ef419e27dc032f3ea65895079dd135849750b4fb71d273f35593e907d9f5348ee6ee63d292b321ff1295629d70f08dcf491e7e1a49dd8b73e98ff887e2ca7adafea415030679d2f6305b346a0fae64f7869eb3c9d7360a7e488d9b28e684222aad8e9e44daf2c3a28ca36087bb481f05a3bfaa4467bc2dacc1ecf3b0cd09ee30b5bfd35a719b95e3e10eca337458fac7c45ecd2ddacf9bac434e0d7dc28d3b43e9ff9818197eda3b69741fa90b397fbd10616b3b232967903cf8caf443d3780a0ce647e6b01401f73e164909ccea5184d52fe866546c37d2393638dfb4ddfe14ad1f97e2b395e2476c4ab600f02a620866e92220b52f3e072576f6a75ba590985f09ffcfb706f559a64e55d621fb31a5688b73b2de240e16cb5b3031ec6314e6819aecef433e63a4dca9454655ca68d94ed2a2307f6e73fe4207ec79bc273a3276562cbc1e7c5a97d33365a192da0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9d1d4e2fcb2a019c9ace673761081717ced927b3b91937ed73475b5613be16852350da37a388a76044ab69e643731b6f2002f7519a77831f7558fca7242b68103da6a0f0cb0f2527a106057b6374f8b57ea62faf8c29124dbefdc212f505a9198f49fd8c8ac520057fb77ada144062aa5d556115ccebbd95aabbf4118bcd6012a76ce99eb2cc2e443cd9c096087169cc791638018dcc46fb5c1ef8ca7ed6a8bbe325a95d161063c8ee18862e8f0f0491a6d00a3752ee1ba60b5747a9cbeff4a18e953ddb734d2deff0dd256017b5f2af3405823c88796fe7e45eef46470bf6cd9f5089dfd0137ac6093294b467b65da6c21fe7bbe92cb339ff9c57fc7af33353efacb71bf94a8a3e087c86e8eec41712c3da52e0a6a7a68a65ea46ecf5db655bb311b0def10ccda9d9134a5e599e3e7911201f29fe34636c64c6fb5540ecb1a649a1f531b32dfd3b3f9f625411f4bec75aedfe9eb55e6a9d451a35b053ecd6aeb37b9588f184668a7deadb40ee809eba458590db68381119bbfb3b39d012b3e7891723ec174fb42507eef780930ce326e68c5a8518aa2e654e2b453560d11fa1a970cb78a6dfa0dc43be18d66e356e4e6a37d1f9adc51630f56c652bb9255fecf344437e594b0a9fde30bf5953254d240b24bce773350b8ba64a4b2114b24b00000228000002240000022028d765d83a1c46a48b14044b0e37d76770ec00e0f53ff9017a9b389dc75b8634000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001dc6eabc1ff262da284a29d965d3e2a2978054ad9744abf20b155657d9dcdf91d9a968d72a8b5e89aee6111eca5f8ec4c38acb50cb1417f4a61cb8a4fbef5478b7c82080f2618b7e37df8081446030cdb4b83364ad8def0a7d2c3a8011e8a946ed1d103cc226409a3c6f75d47167c6be3b62eb6f74842657add22c983ab63e78d10693360e504ffe66c925eeebe3e51df7a9294d5d7d4d505e4c2ba81d39da91117190881997b49a7f66927cacf001b917bcfb17f823056dd1ca916e8f939e45a0e8b8b4795086b4dda36a172b0077dd0d7b56a745d50e0002d3f22c6014854de712908a7a044f264c6ccc6843485f4f2a38d27e03b48fff417cd5ad3da360c466e0ec84096a7fc777a3480d81c22949a574de4961eab721546532f996ad4ba8431305470bcebdec3c7ac746584da60ff6ef3f906d3a8365f34ed1947f1c290cd30248fde7d9bf99a137528d7fb45b573b3a60145de471bc2b315c38ff94d427c4fa6521738e779fc74f52515b95ea63ec4afe86f156f7dab2658094bf6f861896d8461b99026490ccc10d2b161cdf924e2308061c092746c9aeecc0f86fd48941592ca1bda0b183e089440b68ead03a27e4dee4059087921e6cbc155833e321000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010fa5b16cc6b89b15324387dac0fbd29e45c2272ad3c17b0862626f7fb0f43644022b79e65a6abecf48ebf228a85d9aba13ed67fa558e0c7c5ddd5745b12291cf4a21b5a6c0baf7b69dec9501104c924b7af9d36f40631af9527304f33672a5184c000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b3903506f226c8113611725764a8bf6b8669fe4b655c3c6f8268be14ed4a15ad2199888727dcd6923bd330733f734ff93c7edd81792f2c6a85e6c0e17f6b463c494598e893be6520081d6074d12e030aaa11ed1b6eb02f25116746be67089ac4d707d8737c807e72565c553cdd2a45e1a4fdfa0dbe55e3d463890c66536b22d61fcdbb896154bad092b3420f4d382f716acfab211597945c1a96bf847577f047eb16da297fa63c28c19127c4405d6dd2c6753208a4ec9b5e9dcead2e44fb16a6558c5d9ab7e05267191332fb799b9a619c2446134586f6611b618ce88ed3ecc50cfd25be18314f229215336e4291af7815ae6f56acb564779d4470b02a380981bb0bbd8b7486fdff8a82c5d74f5866e884c23776eef0eeb2b514e6353fd3a0191f69d282635dd6a7b64db58029afd7ec037930f231a22f3fe85ceb8c03a3a0c7ae7669591303b462103f8473e1577124405e5ce5641f6d26377b127ac767cba7c7a7e99d1f86687f4a2672b2bd6c53eaed25d5e2734fee2c33c8c69a4d6d15f51f2319a11e00545a66941edb58616e67d0b7258e1c3ce3920df828b698b2e030578bc8b0f4d278e409bee2ec073ee757b63152afcc84d6d55c386df3e1a8679c6f8cc082e12a5b9d17abb0291779e4ee6b51a6a4e5bc394e1e2f1646a99cf15000002280000022400000220287f732cbf8aab7865c64043deeb945a7fb90318dbeda2b04e4499a4aafbeed9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002784075eaa1ff9334d3410bcbb77cf8cd8a0a5908c7420f7ecb9bd48ff719f122c8369b5616cb6a9d41c075e20e5ec0198f363d695424b416c725498ddbdc61ed12611293a4e14ec51f2d8040b606d63812fabc807aeca8903de5f4d45efe54c7f33723a8f8fb9f7c69a4cd7ee5d3214a44d8afdfa4dd6a8de195b2faea22f02bc9b585a299f058ca4c1fe4f525c0b0282de4ab4d966ea03a85525260dda44069dfe84b2f13d0161453ae3e020733b434933aa779bb2288094a5664899d65b3ab63814ac654989518d5c9cc69d3dcae5dbe686aa2b5c9c96934cb25dbc9d44a782eeb3e7ac3d26420153687e1e928ce5fff1f56ee0484fe61006b30e5b96fc92dbf56177f751ed5c61d40a2cdb63cb888c8d548227d3905da188cb0c0d59d29898e0507875794391d6c0bfab463ebee9b6a31cdbb11a279906c75dbbbeb726dbaf73733b873e0e597e0f127c5eb024f94f6583a48a991ddf9e5d108a3012fc53fa68f538cb5b1c3827be9c3a1eab62a048b86a249d46bf4261125a9bf69c8c7975be5d3f3553ed582c813c499443b123df670cb00db2a3cf1c4ecaba660d4bfed11f4811ceb5833752ff351caefc86e4c8ba4bbe050293f05db6105595952d96000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021bdd7b145b227f28f35541c344f49a8c794b49a10f4a418278f7c21a076e57d61df581b4dbf321c79bf65177f71bb3addc3dc278384535234432407b4e90a3ab022babe6178298f68674964d4dc53aaad882c32ff5d3c9a9a43dcedd78d54515ec2d048be840b5f84c979dce79dd98b66dfaf50b1001b973616d55d28daa1a22e10000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010ea2da3f5a0ccf922684f21593e5919d69614fb7b96c085766a1c9bf162fc01787cdad0b323eb5f4c9c5cac4cef629595a367a0a1541cb9d6e873db23640d99fe0aea6de3d65235bd4363b1bebf5a46d83f887ec14bd510465ac65f73681c836729fcbf08e2f47fd9153786549826f4ee084cb792946ac10e133f8af8319527bfa46b04b40f27ffce850be133e3fa9a883cb43ca0d6c79772508a730e6d283088c7bbeadbb83777d9cb6c65931eb3b32d95e37eec5426d6aa415f06f975ed03a5bae0a7f4f778534d5862f786fe2898dd6ce4a6547a05a61148441cf98c49a3b35b40038d46ff36a79cb98fb38e81b664831c480e11ab08225523cef4379f6cb92571d23847f22a19c741fab055065e1501279bde79a00d992aaa4539e9469c151d605b59dbb774e6af10d3bdc4b346f87230ab32e1ecfacb252baf5b446aef931ab30fdb520e0e7b908a2a4be0e7fbcd6fd87a878a2e137fd883a76d623f2950acec5509df53e24ffee5222e40d305e58f8def6227b0ca6e70cd724d4d675aa45f090812a1f3349d723c795306f09aa3e30b6e4f4a159def999df7fd6e1467a042c1ebb4301161c7d514c077ee72f02d221d6b5d18f7e670133292c965b4a24b849be8ab1c091a753d27a532f3e6beeb1027506bca1f2cc1bc6af16608b21e0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002437da09e0946462ae6f60b6a3954061e735ac38b460adb258791b7ca8cad5291c02cb0a44a5803c061194d0223f80fad51feb8a711a285cff925ef37301d4ceff8e92111c5cae2400c0864634e0bbc17eace6f2926e8f06e7100e88c968b5ef80251ee41da588affea88ef54f8d1062f2216499a9fce7c75acf87402b0f15e9c7ff6f4e6ef732030bccdbc34c5ee9135e0f6da8ea9e70117128dbc8ad7f92b83e4469041d9c921024c2a5d41e9031dfb377c451dcb53be5940262892b31a1aaad15502f922748ab8497c388352d75d577646bc6a91ca671ad836f648b2de4d9f7f111f76f7cf6c3de9636a88f52ce5a2a1d0515368be87ec90faff2f97b51d73399d0f5fbacd626891092af0ed95edf16f6cdbda680e6366db504bec12fc285c96e9034d6311fd23c62251197a1adb4157336a8d88afdd7cb635ed248914163411cc9718e9bd9c0a81596238529356ec6bffab22d230218f0e2c74eaf03f31b7974ba0e3afd8d6649f50c0601bd388c61052cdd450e86ff3843fda617a8be0d18766f0be201ac8d518733157de44cf7a203713e1f578d744a1af1110d0673522f1d293a7f6a4a236cfecfa313b02692b62594986e5491fdfe98d4d1b0892144bd65042d2ac1fd0742560bacaedb5c36518881e2a175278c2079dc6ad12fc039000002280000022400000220241f2238ee100054cfea262cd4e5d710a447192d4e2ef86296bd73e55d8689c4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d0ed1a514f231cb163ef66b12c29627da9040ff9208e681386216c0c96de3312af1f04749f264fa85c99510373af89469668fecab7c48f8d728275038d8cd904076c54985c88ecda5eb22c4b7438a10f40ccd0af2c66d9c15f12db9683778478c5498dc74b11a0c3375302891d6aaa2131879533855d0a09fdc606d0ed6096cac25c48d7186572812d7dcdd43c6b1cf342ff75bca81fc7a96e8d9c95451402656504213400c1bcd54b5aa1506ac68389ad7daa6f86e6c3f6260cf283ff8276c1ee576d9a7950f4fcb52889450cc76345264e28c32675b627fa6f969a1a122820c47f709e9e962724e98f05ffd130fb10a79364fd5b34fa7f64f57a93acc2961286c7e2c34fa838297ff9fb49b0aa5b0bd8d67b8944d294356c4b99ec2f10d965ea9a5d7efd29db774080de1ad695a7bdf7bf0ca297358a65737d1e0366dd32a5c7ffe68736f45bbb535c25a31173c5089246e108d1ee72e1825cfcbb9db7bb758ae5b4e4bf80f2064b48c61a02ac6a37230561adedf013567815254fda8489be2ec1034dbd529375ae2887519fc57d5a2b23921504926f377e2b7ebb8904ca2af28bb0e9ddfe68a9bcce73a425925a2d5d53df153f088351ea52a0cad9350d7000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012a7a9f9b1517321283bc966a0e39d5b489ec5a88ba22f0a8c9b154b646de74d8022c379beb5a62c3e41703959e227e67ed4bbd88790d29aa779d5811bc508d65100095b425a1775c8d00651e0ef6bb206fee94e0f0dfee20b0ed79dc29efcf7159000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ea1fb16b15d95e7b4b77f143fba0b8cd7bba0c7dd58f21f2101d5b3d1c2cf5a11dff3d16a204a4269597cb5472f307783589cc3a76c2416b9d11fa3951205afd2187c6c3b48e3b78c7393d83c7b04a1e006c6b4dc3f7de69598b13ae02e97d3578a12392017ece704bab956aed3098cf7a65eeec0763dc6afd85a70228e76faa8ccca5ed36ed1b66d145f8a070fcb0f2c91b993bb6b90f8409c42185182aea54af871694ed96cde7e41914ba603b6bac93e52cf23134e2d7601951e55a38bba40ad6b5dfbfdb94a5c08863bf792a6bca8585ef5749d6c1fb20f87039bb5ac6887ab465b8029f78b11f3bd141acf44ed41f872e89c29cf601e69c8e5902589678c846b2407d67c746b04cfc5da6d35b734bfd72dc2ef1ea5d030e07062cf8b63d8543e48217a33a82eb72c8c134d561280b2e5ec602669659918c386d130630c7ddd700303599972ba92de67bae1ec955a8e81003061caf15e09fd3466cf31a28bdbdec7a1830408b1d2d7b5479456fdc466ced8642772718fea02212f5d26838a2cd0ea9c90468680cf71aebdc33afc83b9178d2c5fca54f24fc58bc7f50be2dfca920a1cb1e6768d716abf5c13bbcc8a12a00fc4016624f8d0deea00831f5ecedefce34417cd22fef826af4cbd4e7c902dccb62f2c859c32d528dcc2c1f4d80000022800000224000002200376083f855ffcf7313e265e9c79f3d76648beb0d9a2668590cf7bf60c79d1a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011413cce8caae8d21748971be15e12b3b0c9b0db22f177acc767c019306907dd5be37b96ddcea666529c966a96f591595c970e97af80785ea5c41fa1abfcc73ac81c2220172959d3925ec0c386a683f4715b0fe144f3bd7c3b7b39ccd0f28678034b3d4ac64917265004fa31b49c657ac20d864263cc6fd6c49dab8a46b8f67339686cf42946e0d64ce1095bf697b479b3c086a881826be573b6a7f309febc2b65bf052166ed9956b36a4e5dc28859a3564bf32c07ced3cd0a5ebb1b479fde7d085b1551a375f9597775f4dd00476a22bf405de13bfd5cd7efee2ca1c49385e4fc8958d9bdef678979067150a866b9f8ea83a65789f450b8f13af518036bf8a7648573c7850811490181ed8b5d28f961213f37c4b8bfafcb1c68d0950904e57849c402383871c1f127ef603e2a7fb8c2fe33b84a38d70976b65f8a36b1953fa0afa7c484cd277d7b0af75b168a0c0a94e89ca1f8a5d8aa45685e22edba4f3acfaef746c647231ebd08d9b52f38b1c95f636535d0ad3ae637a033daa4d6d053e74f671db4304ecd62782854e9b9fd30a65ed3a336872de7c896a6396462d6c5e431290466d7a786c650ed5e239a9c7b2571c031ce60d88581a31175821fe724fc000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011da0c321041d57420206ec211d146b3ccf885381779f7ff9dc69c3cfbffd0217022df50e5bcc7ed6481e52728beb4d474ba470f92eba13f3727f68d07e1b88629c24c9ce1ff83b185c1a4bc932b658dd1a68aba79b69b246041dbc4f100648a8160000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021cdc1acc7c233990933ddc767e0212a81a8bf925c2ecd7f08559e5df9cd63092bb7ff7ced5dbc9c7eabca4f7a37ea9be0780effb8d4bb200ead1f417c5b0c31be72aa9c160ce2e003f7dd1a6bcf7fb57851253ea5e551d6ec74a6c9433341a88deef9a191117173b6ba47d8a66e0025fadc2f07d23ceeefa98daf4123f8e75a733fe9738f30b7406e8872e28da3ff8848e68ebc8bbf54b05126c82979a9f6b381c1a983607f2c426c04d52f527ca97a8077a80ca5271d6d4b470df49ae3ef57e93907610da4034908e267fd1f011ce4ca0be60093dc02912382c5c50e25e30451efe8027445df2409ddee6dbce618729fb3e6fe51179bf01bf8fabd25a9483a76e6075628dd4d8d6fe2833c627fd8804a8195ce7d34823625845ceb390a5a9716c5c430a50edd8b0a51859424742d053864e8516e68e1c3497c1d18d9cd90ab275ed326dac99fd520ad6de5815eb6dad6757141f4ab5240ec7d5b4f9b6446e1c13941a6f4b18306c6fdf39c9d05ad8a59e4e8d2fa2797f89561ca2b244c82b38a0dcfc38e767cbe7977103adbde8e4b8e3fe40dbd60ae0ab9edc916204916ed323d6d4478bff33ff50c53bca5e747feb4e872ebe87ad217a2d238e5d0d4e62384656105bc1e8430b65bb39babc27555c9b71834dc1a77406ab3726a1edcf4ac0000022800000224000002202167a42ace86e31a3156593b5b5c4d62b368f41a9142d8e80588bc9d0249ece60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b39a93b217b41c856cfad5a2941fdb30405d99e4e8e901bb5b20ce894e936e060c0df7dcbd1805d232ecd2821fbd3dd644bd10be795dfcc883622a5ba1a71232d08c1eced1fe927ff932566dc53510e10561a089564330e58276796b7bee27f58116845cb693de28cc56f4a9f509e1171df9546ea610bd40de1f2f192d3d2f8e4b224dcb801515446b6ec0400514230a9cbb7d4dbe6555be4309f4528c9ac844279ec98fe370a8586a95bea59ae1ae1f00d5c280b9668583536e65923e9fb422cc04d9e845b1b8c53082593037e0c91cfdf1a5e6c7684ae1579a4af7e2f3573ea516198e6b65182dbe63f98ce835deb3150ec96aee31ec636cce62dd51a14152af6323382d45a12d804e3301c3878c52cfb631414b4804eac32c4cdd6e77236a0cefab2b8e14605c3fc83f58ccd5bb9f3771694a18f88e66aa0823c12d3b46a93435f69525ebb82fc9248b8fb5665d4912c89ce93e6a904121294ca95f3bafe6fafe33a3f9a5d40a14ef4f21e8c74cb183fd6255d338b159fc70f6ec47ca9ba9505bbe73a403e6b0dc1a02cb38a1d3fcc8cf7c2a303f9df5397bd81c73419b17de23d6507f8a3f3e5974a580709ca45c8a4c16a18fa2ab0309f05f86d2a090000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012e1bf40c948ec56797020f50e00b71a68c288370a7fbf3ec4e1b87ab37c54995022f26d04a2bfe540de01a447dda4c7e3eed466f11e946938bcb48acda7c61af741dfda5be02745d9a515b5207520c7738cdd655f87ababf4d4bc6b6df6fcf53d80000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026934f120485bb0b2f2c8f2e9c12d362c3746f75ccba6dbc3db2deba5764346492acdbf56724415fb0be7091e51acf441e6f88b5241d8583a05a8d2f46d50be9a5b6fa28d817c0b9459ca6cc21a3f3f24094331cf1c7c8fea1ac0322fb47ce3af1b8ac73f705ce6c6f9896a001f12d3ac4deb19c9b8d3864c148caecbd6785f5be6fa33b5067c9a25530e454ed03584f73250c663de8f95aa809f234fecf6e95657bb641ef3752b0fcb00de3c4a4381859d02fabedd12c545a41986d77b17653bc656867ae9877f997e3531706881f98ea9a349fd45fa403488c339140a1f6647a1849d363add573dd93187129e88c56eb81cf704ed3048a0f13ca09d18998b7aad58950d7d34805e1531c2fd04f628a92eea786bfd953da3814fd5407b0647ef78ceda5b085649b769cbbb68b236ea7ba5ac32c8aa7c11061fc48aa898d648040d437888976d343e7479d888d2050072f30d6994d5617752855278262aa867ef3910668d92f778d29c56f9da545716e5bd076bf4373c836e17ec407f0c27f1882e2ebb79e256888b40b2b14e3201b96a6891e36ecf8b8b103203394a5d0eba45bf99cc8094f082d503b451a871158b85c109d79a382ccbcaadf0828ad07cb070bd32f942a1d84e2f8d7bd135150d98844bd30d4482e8de3dd75fde2e95f3ebc00000228000002240000022009222047134f952a0f9aa89d8ba6e70cdeb52a4ca829bb7f44364bfe815ec235000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002dbbaabcd92205268fb98285aa4c012ccadddec0c5b0f6875ee3df23315de9daff91cf5c1e91f28f3cbb2aadc0009f6c07ef35d1ad6a1f10b90fb2e77079daec544c5a4137901192badab26c01fb3e9db9a49ab8e57b88133126e993ca6780fe905eba83e6d9b7429dd3134bfeb5c371c8c3ca16cbb489170a801f29c4611b96b1ea1019112bf44d80acf89b2a78d9df34bbf63a6f114eb9b7d1b2ade8d7f6b454ab2498392dc54d314f61ab54a580392de58d7c138ca6e31291675ae559720e7a59b9475f3a94ec78d2330bf02ce9b3be4886508ff1a27711f8db93efee16ab53ee5254b2df0b5bcea5195f99f225caa7dcdcaa8176f7a5af90d25ddfc75e6d7f912633f86668a3e98c4e0580803bde9919ebd394a9e2578f62092f251a429464a6bf293ef05725e076db8b15205b9596a0b52dc5159cede9966aefb896f9343a75d12815edbcc1365c4ad3ee5affeb8055a108aa9a19e0cfe109d99dd66b88b9dfd7f5c2a085fa5a7ecaf4f42b06005fb7dcf50781f27e03cb6931ae932d3cff1266c240552344157e5f35f259594a469494ae6e120ee3d447b913f586096c03733229d29017c5e82355b1e8209a8db5775bd026cdbb3744d71f011de0e5b9000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010dc3a384dedac3dd4d096374fbc6bcfb76ed7290d9c5b8c66d9d58a1b4620f73022fda69fe40445b52907503a1a0080289831da56c42f7e436667c2b4c04c5ab070056019b500ef8210c20d5b3a1a36e12c5163edf5da3394504c79c930a67f1980000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002377e390f916d445271568029d72efc355b66f3f5a41bd7bb7e737bda32e73c2664e7aa55d5c88ce1782cea329beffc7988d1249b92fcccf79224bb200e4f924358d7e9ce8db86e64bc3e7ff67d20eb3e699c8f7e1482d77ac20792e9dfe8fbaf548431b793e5cfafab53de81879a1df2bfc8399aaf62af08396e10c23c1ff9c37298bd83367c3f1dce57dbb49ab6aa5ac6f36f7c12f8eb0d3715b6474346a4e19b45b7126fad1017d76260d63a795ce60fcf9469a22173b83bb53b6fe58bd480ac07ab8ce948dbd7de4357e50b9981d1698f940a3852bab8161e2a75153a9639c6c4afae9b63cb10513d34aea4c758ed68773fd49d5bdb0753a869843176af45da79fc9f6ea02ee69b270535a9bdafc956ed8596ccddcb3d9d09f767dda13666bbebe235139704a997cd9dc9a77ad145b9c91f40d6e226a635be2a3d68238d38109040cdd9bd344e6c2db6cee3eeabb77c6f64a0d834fab27bf004262e2dfb64f2156b92b7efdbdb92f2efa799aefc9b2b3b2931b576ebc52979253ad55c3a3bc81991f247cb5d5a41d73153440df2517b0fe10ea43e5bc8d59b414695f9713e513b96af18b843d85516459977bc3ad2a2862ddbf1e6209c1c78b9032bb64c969c3c66b1f6cd083099a1a6c5a1472dfa72a9e5cb62287370f2a8b125be4c5000000228000002240000022006806b51f8ea1a4959ca489f467a532f05d439ce0357cd1a38fb5f50009f2b51000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b1b8e6cdd24b346312c012942f2793730e442df9dcf38184f735c7c321b4a1948caf8bf9635afe4f181de602d215e0a0a0f037721f4023ca1c88b235f6c124055cbbdeb7f63175d0347c5f9e402578dc5d24d8454604f0dd696208c7b4f502f0d7f2f7edd4c3c2a374278d8ef2a77a6513aaa855926dc7b77f431c3865bf73c3a93a44e0a690b449c06dd2fd09e2925d499de4826afe86e677d710e3b7d7810fb9df680e83819e34849798f834d6fac0fc0d14ea7c149614c64a46a9fb401126be67fd92281180d2324f8c2b559ed8bafa58fa0dfb59de32e53c46885fb9aee70d4b4f5f78fdeb69807bee71d544763fcb5c3deb7c7d3055692d7532f22083ca509776ada0424ca1555a2b43a7b57b21b325fc0c8d1a8c53b63f7bbe7c5342ae0ac8ae9e6902dfddde44efd1ac664a22482d224ee482a30168137f34d9f68d67217d113f4280b9b245b1534d4e4fc6523183d5d446b3a2b95237dd5a01f5f97269b44b953c1d54ed08216e70e82c6106b2d581bb179d1bfef448142407f09d1598be1178a8933e34a7b968ae7e3543452cfe20b20ddc855542fffd6c634406c228802bdfdac893991178cccf12343ced6a2ea2d8191345a697b89fb6abb38710000000400000000", + "15936d120760ad101aa4c14c0784c3e49678e0e57ac64cd1ae8e95fb169c93e20000000f00000000000000000000000000000000000000000000000000000000000000240039239e6069f172c4f5bfd7f1a13fa433475bd8f82f8feb62ee7085619060d700089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000000f0216b0a15077eb9ef45fb2a8c4e32dce024cadbed8762a95dc044c942bd89d5c900005c8010e93b9dbdcd7d5fd35a4f7bd1f2906557bfed9fe46c6756ff649e8736ad2eee00005d00190b2bd9a61e15de13fdc0dd5db50292162dd32e7193b1d73f6a966182f7db8900005d000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000070dbdacc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad35b4ec24864085bc5d22c3e0aac3ff6cda0030fddfdae68e3eb4ba678b685496ea2a10000000100000002400000000000000000000000000000000000000000000000000000000000bec4cd8020283b91085d07e90ea3e6e05e4e2cb150acb2cf35537faefb7cdd3f602dea7cf0a37cc3217fe555cb47fdd69a08b2fe8737f9d9b52e1ab0450283b0691f4e5ed02020109c78d96d412291564809841b1a145d569b588415b9a9d8c1841f553400f195fe2ca84255a4a218b5ec32363a83b3c1504ac83d4f8aeee4f6b46899f74ed0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a0da9a5db1f9d53a04023e7ffe25705cd63caf9fcca4e52fdfb34e103714e9519bcf6da3c2e61386590947b2f5b0ffbfc875b58d852c2bce9ae1bd946ce0ff7121ace84908493c7c68f4901a377c27cb1e3fbe9cb8a46f4d03ac990e3ef7acecf04f423d93237c8ef87e9651c63a0af1a5130df2ff7fa8b74c1fb99f1a6e852f47aad67c21d0d6f37759b3d84acc31c4dba73e5539913b4105dc8e3314d611ea4733246bed3a7d4d8a3e4027b5f52247417c85113d20cfb6a09ab996c74af0610ec90df3bd63264cc67832502fcf9f771f46ac8b060aecf83f6f590bdc0fe3d96a53460873c85fec9b158f657c42c255654ae462a3424eff0ef23d27c67f76526f1c99cffedff99eaa219884348bf6399d154431e12e690c7efb6e622ccd401a045cb6fb0931d504d28819c66ab8d75358c203c1930ed0ee7a39e2e6f94547e32b61ae5dbd73441c756cd86b579fcc1164ba1cb8930801fdcac7f7df9a86e06c8a4f33b93944c200f032ff82e7bbff22dabf186a75340ec4739dc9afbd990483907ec3a1a9b71e3325e76dcc51066027ede924ceee29f1ae26d0b31a7f6d73e49b845be3db4ba5c7f0c51606da9a8ebf13461c4c62f707fdf9cb3003fed62dab5b764a398b976c5a2aef168fd96dcc2d29f0bcb591e764bab1962091909c18a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000947e2b6ef0f02fc34834dfa7e65826de92bd5dbd05d7b205156e07f8ec81a15a04aed2b1f6eea48d1709c2ffa5a5faeceff17f91f180aedb03cc11fec1f9506181501735f01143f7860a5accb926b4ce4dd7e5d59d9c08460637bf3bb865a17eb3811a030cec0de2fb27d5b9dc2104592eee73c3ff5fbc9283951432a71c5f3515eb040e90f8acc50c365e1fa106be2c290304566c53ff081382aed30da8f38b501a9d19211eda290cfe57bb1e6358c4b75eef20e1d082e31641e19157ad6d9a2227d60fe9d0f215221f397a3dc1ea48589d838c02a40a36a915aec14585cfea0cd3fd102fff302ea7aa132dbd33545610f1554523180ea258260d52b90974b0b714bc5d1e4962daf693c26b39de196dbfa86764a8893116bb027e8c0e96601fa79140345147cb803db3ca5b48f00328d61772af89c7ac5f5c12a9b9a9c226e85afb5861b03d0fef79dd1ff8d4ee381da9612387c29a456bd80465bcf63e43a183570cf601008a514678722057c9948c5691fc6ef7249b0fb0dddddd7628a3ec1a8837b8775bed762700c4c549cc015ae68ae04e894cfc6ce1aeb3521a595b182215064d8ad88b028e10d9dbb9a03abc299f35a7acbe5bc37407f6f95576b9b350375683de0fd34953e71a9e10ab5cbac908f91aa14608ecab25287030d2e4ab0000022800000224000002201db9da573e50d0a983d22049bc4ca19620f38fda79a5248d68aa1756e438db280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002711878be51c645260a483bb9ab0234f0cd123fc40c76b53bce2c8b9b5a25db2bbeb858c70cdb1355cb3b151625cdca933d34c5108d57a8aca42878b6250571950cbf86bfd07d9b5a5d4fae51cfcae6ef57a4e846601b4a9db557aeb3c20a7e0fb8dc664d2b75e7f27ad371c506480235eb9aeb6e3dbcfa5d5413e697672d51427de2ffb8bda998bfc3c7dc88ac5bf23f11b8d92e300244895931868642d14d8cfca61716816e253b65c7d2c5fc59691ed25c71d19d67f950c94a5ddf9437e2ea31db4a818543d54e0fc8b705a3d75f5de4ebd23c67ebad3d300b5ea7c9a740e74e0eb536f418bead730af196390dc0e9153bd2e8381e879a928d0e98b59c97a9f9dd606534082ddf820a73bff21dd0874403865d3a32b793eddb015b406d58d942c4e0f1c784d9c2f0fd0a610fa09e7b8525cc15a0ab0da42ca07df9fe35ee0b8e1ea67f1f23431f09cf5c8ec58ac588aa5fed0d251a55b4f743837f027d6c881d3ecbb81ce12260b51ca67f66d060e863262b5af6e7d1283fc4b1a44a824c748a0226b1476e9bca099559710ccc645cd0931eef5cbcc4826e49478da594b14e02254714a0cd9c46625ec5cf736f9552c2a5a3d93c26454ff3699245579493000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40106dcafa0838848e6c017e2f03dbfa5403067fdca6ea9e951403debca5bdd59f9020237f0971d1eacbc6760a93d83d2785a8e8712f21c31ad22a177803641e2ddf51000745c077c214a94aa58fa44e2874e07f4767999b1369e04f85e2b3ed3226d0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f9b2985d1687dc1b29c273116c01db85a459bc59974e34c0da5067f84b8f924771a0db28c2f28dce6cd8012e3b0118d166afbb9ca94440f4ce0162f6aa60eebf23563e9e7d0732f014baeef29a0a91adf3f1e8083ce78d6b4581602de707511cdc6ba402489381ce05325ce50c4e7daf671e61ba00cf1e2d12f0e66b3ac4b44922cccecab17b5d115236230eb455e69ca9638b0630bfa0bf456368c323f51beda5359e19ff87e843ced4411b575d0655772564588abdca70fe338ab10eb1ba9202fdb3be4be01b513a901838e80fba6d22eaad7740927aafeb7516b56ab09af57757c147803ef306d801cb2787cb5564dd4c501a6010459090442d7121a39f6a6eddfe2616e6c7f93d7fb91e0a55cdaf6b26c3491153adf29cb86714ca458efb25dae6e067ca015e8b288b13645d074c08fd9673198da421fbbd8d1a3599defcc8db33fd2b1d721e22eecd5876d168aee002a3bd528c7dc881708fc6b29ddadeb797e9aca24c562cd5e1034a37080a55d6225ea367175c1aee5cccfdf04321c85b3d53b61c1fd0490bab74981eaf0364fe93318233bb58278e1d39319e442f4c1ba7145e45ee325f2a8cca27d41bc8818a15641179c4b4a243ebf52d03d8498ed7e476cbb044659cd8acb12b8c59378ba1c1cd3988f76edebff6f19b4a00110000022800000224000002201ea6b4763130113e8acb64678f761d44afe32ba97adb3b50ffd797329957b2d200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aba67621ca8bf990f91b5c939ed736135dbb3c0d27175cbe2f8560d5f2d2c8cd88a277c8748b00dc082afbf437d75afdeed97b2a41c4593e95effdd201ab71cf792906a2ec9033589a8199cd619f36c0be7ccfd86841cda29387f5366ce778d9cdfb3b4170fdcb7581b08627b4096ea41dd169310aebba6eaacd7d0bcb7e34efbd4ae562d0ba44f6cb397942dd564e0f3d6e51ccb45b50c0479a16bace3e95b5950d707b4649cab276b2f8a25950e53eab40e924ab56815d93c5371b33f13d95d2947fbc617e5e0b679e44d045e8cc8015232e42bebf14afb04673a7e051388c5287d5193e90dae015037954659bf37353c9c006e97c9cacad53ebbc1ebbf9d5512098c740db0c583a6e60d55bc09b7afa5a369e84b982f93e2567481d62a311fc490e1475a1a457d8e4ab54b862df781cb3daec490a76333d12e33b18ee27f235fa37b24935ec6d29eb936627bfb9d5d658cf8f8802c1f9c6053fd5e7ca4c2468c94c75b1e40d14b3963f747c5ca692338b0816dc976123cf89665ab1edbe3449272ef8321315bd9b3814398ceefd9d6fd42a6448c7d8849186ed6fc6ad86ecf0cfc69c810978837af9fe6e965570910a1b733d2de0758cd18996c78f195d49000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022ddefe45133550c9e808e6121a91bd4ce256f474230196bbd524236d33c7e60513def71b692d337a13dcc58e86efaf3f927eb9f98f82c40eef625a06653ab5ef0204b8bee3b171a13ff1c6691cfe043139e6db9fee5300bb49059682ec1855d7aa07dc26943fd4dc73395ed6480428bc5027d5c98d5d96b016bfd23b3d24fe46070000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000da0f74a98ed53e88eb030d524197164ad4318fdee5ea90c6fed29c3efe7c684fdaec10826c1c14b54faa745de7bde40bd286ce871652f1e7a4316c3cb6f64e0f86137677db9fff40e0038180b4ddbddc5c5026c079807b6526d1ba166ed19d265ca9ed7eb9aa70110a0263da355787ec6f13b609a4e447a9f1b5cc76d2171e4d59ee1dc01447364eb859ff79feed5ad1e8b654feea8883549586fd2f2e31798ca1dde9ce49647901ea6691933fbcb84af52653d750841f200c76971a96e341ab0c20685820198a7d276514c796f70d963ef337b6badea798ba55d0be38232ad075a1f9a6f52b0a322cccb70606e918281db7688077f8dc915b18ab92d54efbc488e3640ba610ee19f1c52685352d0438ebe45402e5313ad69b099f8da3a3fa70fa0b6ce880c5e099b60c7bc43b7eca0040078f0644929e85c7fae8555dfef7a7b5ec85a098c1ceb2065aae8bc3660215ca6c33ec0d97e5ad072841de60e2bdba81c09323bd320226fb453e3c274ae13d2d7b2325cf2c547f374649e960d90a9af38d1aa4772898e3150102784a4c750d2d8fd5bfab6688f1123b29e0439b93203a6c65ac3af18859216ac6ec51d15b4242fcb4ededb9979ca4986e0f09bd6975843ce38a1b9bb962ebb7b13ed6da3555036a52ddf2be8d4359c9cd721326e2700000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083f03ced385eb5e61eda03ee841d4c084cc9d118961e96f8384eb241b6975ebe74f5b3e2d90795e4f2de650fd27517f0e7c64f9873ebeff38c3d720cafd02b6b2a094ac4cc4beccaa6c104002a13a57ef0e9661ce1e8eb24fe00ad967806fa9764a1950129d5ef604bbc8930aa1f5c0ca8440bc6a696e04e8fd53c46c85591d3de6176ff05c0f752670d903e2d80ac2dd8336bf649bc5332d04f3ed6a9074fa047f550d028f6c75934c42770249210d61d1532575a347332793ddbaf5516748caf3af1e968a1b011e9d5b96b8a3f8bcf220e0784fac17dd4bc3e4e502e34792c6657d07242be38be092431aaf7d344df6a8ae668b583e50f36a36993522d018da32ab85c6d0412e62d77b12cf3b49f9319345e0fa00aa8caee8247fbc34c903db66af522f3511567bef2c536e7c545cdb1e2b19511bd1e3e964b7844ff1bfe0bab4e027617383fbf4e01ad42dadbe3ffd164179c4bbde62f0c9fb02626c4a1b247bbd5a18c52d7f79ac58f153d17a0b52de09332cd845697114559ffd60e5a28fffeae777f81577fff497035c9aed055503d58317aa9432ce926524ac6e719198a698f5a213a1e1d03eb2a6da4d45d55761c7a7383df96f14163293c66f434ef14cec6cb977a3fb90e8a437c7b5c3041055c6532589ec2d3439fc9e3fde73f8900000228000002240000022023b61d164b2854e32ec69d56f26b7bb6e1c36fdeb8c801a562737ce278d8cacb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000219ef8a467079dea788b8dbdd5a576ee0aa4215e6a68d9ade20edac24b19cffb04b00fcdde8d3e8b4a001de6cde8fe976309b15a6436b9cd6e1985eb90461466f25986c842b60ebec11c26ae8455fbbd5b00a5c27513b0902e2d3135ad169aee8450bceb8bd4432f22d9bf712a2f003e9cb3eb75677e4cefa3a01f4754af6037afa9631e6c0aa5f9295b23fcf42557e096fb3934fcfc0805941b80f791ab4f3d35f3ec884534200bab319fd3e2e2863db784f1bd672ef2a7317895576aca3c70e19079bc01e1b12f849b2cf1ff54a8965386cb8b1bb03e33f36ff87cdac29dd9f4d4982735cf6f3b898ca20336a791baa6f6df2d9752eb1d6aba777f71541874d9027fe85d0e6c9018ef7156a810cf9c664591cf0d5959949698b7ffa795f3713a901b396a59fcba341b01186754be804000974b0803b1277bc787b4281596e548f1a757511d81156db1abb651b440c4582b375defd24005a7adc66a48f2bbe0ebf118f55a01e05caf4cc95a14fe1bf99b67564b2eec1de0f333e5de0a9ebf0cc34331aed0d017ace5f62417f07188cc1ad20af12b8ed208b649549c5b94e47e06fb47202b049da2fa4b5e2f034c08da847dcf72fbdb7361ad71ad8290ead39e000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011a8c532590180b6c44bec2ef8c43a8e8f2433d94dac0e15bbe2a281739a7af5b0206565fbe12569707e23ebbc56274aa132ef12dd8fd74d404218222a52d24d74c1da637918699955347eb64f279a7ccbb0085e1e8b2d9f45afbe9a29336fe883d000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ee9a9fde757f2f42aa25493ef9a000e1fc522eabe36d316ac533b59adfd5b47ed222e615326a46c6735f46b125c7e974e5dd39ca659aade42098707d0d7af4de5df0997d1e919d6329547647f9a9d045a1b7fd73529b1491c1ee01a30e606998d026a1182d07972ccf6d7f90ec279571c549e68a14f212260dd1b85f79b22f0347255e7dcacfa928085ab64b4bac1672957acd0408541f553226b4a5726ae26938accae42f42069544363a4ee83af76897a098ba7202045cf81a95fe713904dfe8c2a2fea57787a388e71d7a36fb4694bdc375439ebaa55edf145cff0b529e3a3c1469b33d0c3be6f9cc549b547100f26f3f42d2280325c924a3cec70df288c45979d064be91f25ec8f12d68c2cdf83892a219f560da03eaa9fcaf459a4d290498a0ff0ead2c56f52269da93c54eeac47f68245d801b4a397d7e7ea82e986f556bf8a249da535ec50b09292f02aeec2ed1ea265f6337ee0b33c7f23687244ceaa19d944ca43a1002f1b94e4dedcb580ec025695d79a820c26d130f0cad27161b435e6975d544746a6395cb47c0979350a22a67e773710b3cb0001e6076d058d0afbfbbe406dbda6ad941d92b0a1cb0618515a3d0e60b55b9575a0eb7d4bba1c9c02c84d332c2c907743c9b6f9b7aaebeaea759b3eace548485e5e139b152bbb0000022800000224000002202c49b5efbb76b56722524cfbba0c85352640b3731cd8b1d6d2118f0bee5b6929000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009658e762dc376a5e49417c04da478377ed7436f4699b6340e969cd2771d744b79a307f54daff376b685f5b934a831c651c2ae724df20718489be9b1396aed3969c216380a338d38772424438bed1ca5770f64ed54a63307904393276d60c97b65881631c31d467d49a84d43bd3f1ef0a701e2c88114b7c88212f4194b36cce4f7b6bd8cf2510345cb69be8c4e066c0e262cb51dc2ed972a41f6f3fef660f6c3fcb69a5172dcde527a6689f70bbdce3a967c48b5fe8186dd7640c7228bb6a3bbda2fe012b349d1cafe54b4067901bb7202ffb5901046b3a559ee64db91542eef024e0961e264ba4ecd6f9aaaefda52d5134e2a4b04d8c2059a34c8759e0941884b1bae024d2efaf17c1ad1205271e49775fbdb0bd8b4c271ae0b6be8ed72f18cceb7898557737f83e049b38ee48ff56cd17e9e37abb77f32fba782bc75b4d3da0dc292843840d4c7f085fc02579ebc366473ea93870282fa3494268181e8e5a0da856f03bd85e982c38faf1188461244bc88cc1b50888ed87efcb4c8dfa47845716db9db855ad4f2d20dffe515f926a4f71feb57973fdc90f9288fe1b4b723870c966392b4aa6297b7fd27602b8f1834ff7177b8f0815aae14908f3f5bce2800e000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010856cbb475ba773c75224bf4d6ace09d0f3435c6e1efeec0b15a0bdb11d27bca0207bf362b93268d051917937693a76c826ca10b425f4631333801903a17b03da906c56a0ce9a4bcf3a9503877a3f2d39ef7d3265e32f57649edbb7006c7ddc1e100000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9e46df4a6261b34638a96b807c5621e4d5430dca1cfd80f7fb9d53921760f9769b1085fa6f9ca6a8dc425c18f2c1b2ebc5cfeeea31ab63d4e8992c307e6ff8717ed75093021237264e83fdf74aa9e91f83fe11c02788ad49021a6632ed5dca887de94e6413bfb6d0a409b5567c056188ddd3c42c925daf94cd4dd33fa537a3822cdf466ca9e2e637fbf34b38cb444022ef2805b65278e7772a8fbdf96b15a80a6df207aa719dc8711bd2ae6b93f8a6a42a015c376637d6849feda74ea343d64a217d10c9ee611a262014458293e063f597919ab52f03ee5600d9a8e498608412040ea4b2528dda4150c2d565ec8756763fb7de949dee5d77f8e540762f6f82bf52c534b71ffaf224535bb9fb35e5cc64f2a5ae349473c6e510c853d3a4568382ec8c10ee3ebd7202a5f90e74fb2995ecea610485ba22e03c1d5c5f08f07a21a35fb6a9236b3ccfe36f21b4bd74d66ef44450d16cc5bdec62d11645bbbfe79402cb447a9b16f01af041efd0337f05414a6a12440dfb0f47660438672e5a157120940ad03fd0bfe8644334254e67efe801bb998cdd30441047b2d6be6746f7385ade1579d3a76c16e644d2428196678bcd219fd10bcadd052449bdce5be825483badf5876f3b6e849fd16392360b57a3e8831626e437d46fef5a0ef79b7dc889a0000022800000224000002202ce668a1391aa2dd55dc90b7c1f2af15fa3e8248fed766fcb4efbeb6ca5ee591000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eacbe0489c3dbc0f3f520bb5b2edd9a1045c60894fd1744cec9fbf13b621b2f8aaf75fcaf5668db4898722be20db9965848c0a4d831adbe806b754fc21865054e8bfa46b883903d002c8baa97cff206cedc5a8ae02699b9f3188d36308f3a1d186b35a9a6939d7b4ab809c3c5ee6e3b8a993276f35d26fedc029e394198cf9dc580851c57e8122bfa004c23a6a0de5481900b24ca38b021e88ac1bfafcc32f08f0cd9549c4902105f54395524652d8ca33e3185cf9ff0d7faf0b568223f0fd2b70f2586ae2db9a81cbd0f1f837533cbd3b54db4c467641342f6912c40be6f25ef227eeec9c9e5e0bf332dbf40d99f7a1d7c38e2bc6834eaceaf7e827716cf4e794ae693af39c3bc6ed315ee0408a48bad522a8617218c41bb83eba5a8ba5c3eb21b69f6adc72c21350bfbfa5e259f98ea0f4133ce448a2518e34dd981dc0988a7684341e1411b702cb68bbb64d767d60f1a504602619f7ff1836e87611713c6232b5eb30dbef625b41f7bdf577ff7c1b2cbcc15df858f2b2666e5b18c74038383c65bf94d7c2a7545dd41cf9114392dcc206f5d22dbcaff644e064181bea0727f324c796344d1a5d1607cac3ff14a788f7458dcd3b0941816a79ec7d1832e4d000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012933659f6099777bdd471824c10720b267a2b2be3814fa80fc625948aa4c2f0d020ae5553279fa2928f6588b91869ee0929997d310576146621fa92026c89fff8b080b20876a77391395b3c9e0d2c56f7a4f59ce1b9b31cb4174bb2fed5221e2c90000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012eccb8b678274aa7a9f047613ba3e2b4478130b41953eb97c5edf83bedc6bac1d1fcfc1815a291b35d853bfb717376a8131cc65a3a45227c59b6f2fe7655fec36a92adcb33fb2f2657b43933e9791b4c1a6de7c88bfb7d33fd041cfa72432c7d4b4a454853638a63bdfaa8d29ede1e810932aca5fba3c39874e6da65c13b8bb21530d08211150853759ce2be7686d596f0cd053f0a56344714ad224928f24a8718ea19523924a51a26261628812e11034b38134bef13e72269e87414db1c0556bc784b48c053d6e5c6df71f6f4c8bd82a90c0f748551f730acf5b0b50058a73057a12c2ab87879a8580cfa9153472445ea04733b97b0ffd27cf93806acd9ab52aec75f9e982265a9de438a8cb4893575ef09b396aa0de17d30f4911d7d3a8e90530cf69775eb613a79e57ab17e4b5bdfe44d5b8ccceb059be1050f499b898a9f88ab6228330df3b7684bfe66a582062a006d5f7c87c35435783e01c9c0d888d3846f0d71af4bb3d1fc28565a6a165340252a6c55088fdb9e77b149c9d57ec1b2ac95f8c9b353eef49b365ae3c83cb822989858970b3826e6bf6b0cc810d68b54e42854c2db5a9c58507dd67f5473b71c8185627684cb278b2d3b0a9c35923cd7f937c5d1d56a73bfd1911765510eef080109eab30129a1c4af015b056b3b86a0000022800000224000002200f47f5ad7729b0768725446ac8fc1391c7c271308e6a6a73a33ac7e8e49f56bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a52b65276c836c8f3fd22927c342d4e6c9ee119ed01c01973b69503210eeee57b67513e668f0774cfe32e1e90b4e017cd5e25acd23b67ae2556083667b858f3150129574a6cca060d7b5b9a34a26a46b388cefeda90422e512c3a4c3afaa191c2aceb9db6d0fcc923052a131d473241db00aed9801d611485a2d97a90f839222254fb4b3a362bf897d560edcb5382ad04d7d655d8c416f4b35d803c3af6959f5495bad561d0b01ae1ec1e15bb0df254a00aaf5a139b89e54520d8be634802c763be953742efd8faee5e40188829ec0666f041e9b0b0bffdaa968334cbc71d1ebf75a341e23e6499bb470e135ecc1eb5c0e410011b2eb27b150913f25b77517556213bbc4c8941a2b13021e16c613b9cbaecb98a5b7640866571fcaf3ffdf3e8a42029c3cf07402da9cf9219f668ec4383f2b5b0066de6ce8784459f80e83032714b7a61bf8af007652e8fc853bb9b593a965eabeaa75b5dc82418a1301753f7ebb005517dfbfd2a853f26317f57287222cbedee45ae5c98b3a7599d6305c4e52c5590ba9810384e9c15fd35fc0ee24d0e7a02772fb12a62530c363592566a6d78e0c28f2085b4ce541abca49b8741611245404f885f94c865908ef7a88f2b144000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021dcc10adf8a3f7f895229b77cab9cf57fe31512979a08b2ca61eb0dc90953c49156cc9684bdc3c07adad60487c85ba0f38f3f15c685fc1b2cfe753e7c9a2adb5020c5d4af486bc1de92329754d15003ac6ce280f954f3654655fbfd9c42881f72d1ae35c3df76fb389ba9b4a1f2634e80bc0026ddc81959b44bfe7fed2f0c4acdb0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8fbdaec8b0196271b44d8a872e81b776e8ea7cf5ca8479be22c85ffdcdf00e7b86c15cca91a03f2fb55f263c720415b4b59051ec647ae4cf3142defa8b494d281409a8b38a3b1399fc3baf82270e603e0dae0e6b9bb198ecaaa89d491e796974f8c8cf8e5dca6e65e97288234a2be6cbd1b75c3b129435741cb33a389b82d7c9795f35ccc8967b962e779f5baeeb4ac0af63d5395e984883214f426c72188d4f35fa540a9397e9d77c9b291f34d2c8e3a4e6232cb0aeabe279701dbdeff047aeed4633da7ec916ce6af08f0d0f532199874c5a380680fb9688413b108768c5d5c73c55d80325a4db90f8425647fe55448c1ac634f2838a055a9b983cfe0b32b0f5078d7a9a2bbc46425fb16e202818b9daa707ab3ebf7e1caa3f69d900e1978dc8b075894659c9cef80484cd7d11adfb27893314a9aa127f28a5ba3e080a7c6e030782ca3d84647fa3fbce277d76f05e9f76f33a5f98b209d55dcdd785632c76035005d0ba0248fef662fbecd3b635dda3dff028c83bbf51f8d9f2c84235b20367dfd05573591a455040c8ad21143819ac4fae37e19a1fb4b7c76aa6291ec6998e41a6ca0c9db7f772622dab6df874c59a6267f708a91073117b9a8d3f3146258e0f85d4d107b40b76fcace9ae35df6aa634de1f13d18f6989ea87e7ad870e0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002442ba6277cace1e93a2baee01035a2b20b9ef7a44978ac3817ff6ffdddeb699a6e61d6621b2f25eca4e83998b5de8a47ce7e5a0b771ff705df5885f7e86fe5f3d801137ff69678e655de55e517adb13e7242ad7a55308b6e7ab3354f64f5c8c00a375a9d69fb6d85a7385286283bcd405cea4505bd91fd86ee84ac37042b8ffbc5601c901ef91924a14d1e6f706afbfb4d463ab5bb650b208bd4b2311949bbc7ba7a6d20f4ba5acc693599e9fd36f2ca44cc17a93c289f7a6ac9e89112dd168502fa1c23209ae31eef1c2a99761c737b6ee1c4a30069d1fca597e40b2dc318ef4f5d37340f544796d00d6d4116944bb8ce278d0b6bbc2fcd6807a2e225147f06a23dbd1911bd66d941f2fcb850a286ce54dbac352148df7116242c305341d900825fcf0566fecf2eea15062283c57e9c6b9b6573a2c739e129c39bd92319f104e6d4264a42597c05ab00f88a9e9dd1ecbf31fe3f58f03de1e3baf67cc42da073a90933829cc7c7d5f546a7b85191fb73d4ad7580e0cfc61a3d18d36bbc28c4973ceffa0b41d7ada73bdb3f42a8427b25f8f8d2400b0300eec04785965b7242f221cfe6542e9c3aeb93028b8b9ac5fe0bd1032950ee58085d22c91fc9e14213856e2cdd9ab88648f36bd0596469c56b0bfe493b002e76ee247613945375833fd0000022800000224000002200f48a53c62e58fe6618861496b6954b5b4d36013e9f791a54e5cbc479cc4e22f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085ad61217f68b4bee8e3c64eb782d49647fae9977c48d0d45c3ec7337e2aeb83e13514cc5f5c15a4c80a94b751ae01b80399290108030d7f849a184d4b3bbb2109f9559384a64f6cc6f0aac080e3f03c3ac3e4aae9c0983dda3556625c752e29ffa57b9a6fd04c6eddcff6552f864abe7b1aed7b4e7df78b04d16de518b3dd209f4dbb658b3a1f7fd0e3a83aa9bb8d6ef45751eb3d9306751355b5b42122e15c71e292aaacb68df96cced9c4553b61776f44fcbd7c9c151604442e8e243cb3f13d782ddc80eec0659a00a0273e351c8413747e2797ada1ca865863c63a8a02b49092a950356f7644976a3a4b94cfa074331ae2b15bc1d3f4a6b881aabb63659fb6b66bd2e7d1bd97426349e8476b8422032d2f11058b36e4c1f5f0854c54cfe5283435d572d7e78be7f9f4fc647deed9233a15b6889dfe6c4a7cfc6be88bad4320a6b4a2d677d7ba003a7f30eb64d87f9e86fdae6e6edb33ce7e472ba63da9082457410e60781ab09a5ad027ba4077e76b230aec73bbef47aaa30e85cc71cb50087755f648ba1ce866612dd5cddbe9682e76dcf7de4664b11dca0425aad4a4632a1a25d9d69edc8b672bca358af0fe5240f38e776aa8239b10c9a9b57b7fce42000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40122e58779b37edcdc93e012e4e691618d04c385b70849d439603aa895d0776496020cc7aa504ad381ff04c7af18721948f6b526acc1e8e21075e7f53c6b032a2a7930032dde3165b7d39a81c3cbb31e2dc4d6fb9181eea5aaada160aa62cc68520800000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000947618cfe967ab5d17ae36be28c36d847fcab9900a3edc20ff35986f77d7e8c3584f4bfb21703e16d05d3c5c53b777ee95fb5c0db24a22f7943c46bbe0ede0f87d14ef733e4ca1e1bf79aa6db115728cb2609d3f370203f09d38c9ba7ee55542b5e2d19fe7d1545683674fc99e67e416d601dea65a037b67814637e9502593f9b336c811f966c5384838c6711a4f25c72c30925ee7ec87ea24b5b3c58781b38b2d2981d70ff7efe5964e008e16c1e82fa6d403766215c94c85558af280270dc8e6ae2ef0b39076a0a117f5a0bdd4aeabb1808b29cc4cd7aff28ac278f69ff1d7c77443f534e5ba86941c590dec21d83310fd6f55eba119aca3438ae7a0e5dc796e6b5d8ce6dfdc385c7c407ee68a1bed03e7a856ded897e1a65e51c7cae1e9eb68a5d49ad2ec2b449ec4e28e06182ba2eb5e2ab0dbfd294ba221ac5a5a4cdb515c18f2464a3f45dbdb7c49825dacc8fd1d51d7b7e95085863d90527df8cf1119497e266905fb6a1ecb2df4ca7653fc699991c30aadf64f9431362d55f15a571712a45273a3b55f121c582a376a828429d74d5507977852d77480dc4a3002e4ea8c91238bf2ffb850be2ace653eaea456e5687a589f59d60245ece70e277c982aef1f0a67aafaa28d27c00ab846d77cbaa409d651f73e51f209a62d118946c8df00000228000002240000022022f00d8089e0dde0630ec992d0ae3cfc241b50d5ec7710a6180acf0a093186ff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017db656a0853c53f623f9885d45ada201b0e13e6fa33484789f12f1e9f519ab533e393fc164e3075081476c2a1705e45dc69a5a10de9d40dd176ef7d6450f9cefa021e9d0142d5c4e8141bc801e47702b52dbcf118bd9dcc17d4ad2944f57bfb51c817372651ba98e03d6532c208ee55b00d2240974236bd5c115cb6b2cc2f77e4cb7a3bc852ad25a8696ecf843b6b4882ff207f56dadf6cb2bfdf803918b81087a52ad460c77a3d4e1da0808b64359c79e79c6ef2a03b2ec1ae62705a4782f5fb0ca9de77c98a4946d3dedf45cff013f929fdc1f46f071338320938eb1d2332c4e5ff6d1abd0b24c2975f66de3daa0842e0369e663bbb802c78db4c2303730c166cc1d6041cbb47d240334328714f0e3c0f258f388b9755efcd2966df627a081a916bc23db6a241ab8680bef732e36c96036a5a3fc8400043c7baa4e1c885ca63ef4f86e7580382fe5f950c25378a0393887f6ebfa04e2f907cbcef1b77d8b0129c1e02373d253feb0cd74b549f5e272186803962ba4adb6e4a7f281705b95769f324a5d5da441dbc60c9efc6538d56ba9370da00c4e993d12b9ed3f2b6e32a8097413d5766ae44601dfc813586f29bb8fc09a26b52204b890c5404a646af2000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401146b125ad1957171d18237bce01cf1ce628bb3fef3754d15bcf5cc6549af1b2f0214b7d2249286f99ecd892881fa2e5e10d69c82d7eaee5862b930d044d27b9ca92699f5fbaaca33ab9f6debcc8eda15a08ae43e0826fb300b3b66fb70c59bfeb700000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a62f26ac29fd36b1d52a2bc4ba814b20659b1a24b40db01240034e5580059f70a0ee9ee494e81e856860c239a04251345016dc10c6ea8f558d9308eae98cd9ceb32a32ed0ae70b86a2f74193743a619a366acb917ca9b76dfa667c6786cf07f9a8a0932d27d153742d464299aaae8c064b8b8415c437a61e0c28c6ce9b17aaad70cf7a235f15c90b9f76036b2afd964f99084017e7571020e3092cf4d478a9f18a46e135f4a828fd6b1989557fba380f9d7b2c22fef5873b9af11ec74c7db60afa93101e84e09342687511bc2b6e175dbeef5c2f2e73e23c2e957f66c918ebcf443ea40952f20ed22ba8fab36e87a303d48455fade43b0641e53b3724ee7bed81551215e10025f4710c2d746f8966657a0d6f966118f55d0da452d5619a0fb1dc94be56270611f4695e34ae561647ec9e3d7f3968ed94186d4645ad9285d7ce6f6ea9ee41091c3855f2406c36adab037abecea5c2e298740aefc6d9053734c91069d9ff709ef0a2dee14f564bb9fa46bf98260492d80ff62466286607861d37b7c89a375e2a5c26af910d4619ceac741b9b7559f47e18e688e6c0d6710e0d4903e5e13d0e184fce4c860b0f5a422c190fb0763622daef96f2461ecfc80f6ebe3ccf6ccc3548c63f7fb6bf436ffde6015e78c3fe73c2b06984675124272e9715a0000022800000224000002200d725851f1c4d76cb4d6253b6850323f2df89060dabdfeb49a8cfa0dbf15f7d700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a727ce48b8d765f6cc55ed9da80478d754c50f4dcfe5e6b371aa0b4e2764c13706782a84deaa827756abb13c176ba0ea51cbbd4633109808c398d4d109fe334c5c61fb5c0a7b0cf26f9ecde3e8cf9489b51ca3b4eaf813e8c79fca958d21ddaac67f778b2c9ed05eb12df438beaf475d08d0bbd492e45dfb0209e722db0cfa791fcc4bde8d9f49ceb0b5c7a3059df760d92017e353976287f3d05728d6528cc7b68a677304776f222515fb15ead48bac0a21f95e774fce174e180c5050ce76e8e8aa89530ad1309d5792a2fcd735ed6d8cc4e002a161fd1364cf530f7af2bc18a490bf8850f056932d137448161098380e2a4a398b1ccf1d1f30862e4671555108489cff5f9f176b43aa0358f8fd5b8bd65aa51b562218f6f9082dca18ae4ad736ce509c3c1588e36043a41ca36d2a5b209e7c610be8b83eb8225c0b8670c8503f496da478acb5922bac4afd6d4fe3356f9635ca7ab81530e8891c60b75707f8b56094fb0f5997dac24700c5fe78da095c6287775e8489c6f262287e1ba9501004878a569d398954d1431bb72eeb00aab2f1a8cbf5bb331fc8f7e54bdeb49a9de43c665748e7207495c15c681a9780bee74b26e56c30d0999c4e68cb0774328d000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401017b1aefd1c58097bdecf77fa7641c6349dc05c7b10b56b8272e3dee3e4d77b30214bcdd7f724e2046af06c7fa1ba10a53f0fee743e415b711d4b65406610327e3154c0589a6f9f94f78941db58600bbff63e0961afeb2503574e4ce40c40abb050000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097e637efafcec8467651456133d42f2a81685907458ab8bb6bad4a35ba3d09cf55b7feb1c7ae5712346f66df1afeb52884477e6b139f95d9ab87ac4cc36dc9922ef44e508348e21cc087af67222839efa0d2869143881e637c9a2be12f298d7dfa11a249ded03428b4c595c0f855b8c4646850f09c4f57f402f98178d06ee1cd8e23e1d3da5837df1f81d9b3fc54926d998924864be35901f7877bcacb6ed271aa2ca08f387fd079bd2e9fdeacb7920b75ea312883113090dc17c53a3bd1df9f0935832f190ca85ab829987a16a730fc9d812c0cba45cf1e49f69d9954b44d2243c038f6f5a6fbd0e831fa96feb15174ced9fdc4349eeedcdf20c1ea2d88d2a0772edc58d3fe4bec525e1eede07ceca02250b0eeb4bcd8c45e37c063a2e159dac07611de9d5460d511ced035e6851beb6fa73f6b5010800a2d5304a0bd0d9222bcb4dc7e0c0d122735265740e87856ecec342c80ec35bcfb1f4b04466c1cf25099943580df08604ae6c11933798e29fbef0ba4ad03206a8c6bdd4ade936ecbc148229a9202c236c2615899bb06ea6de62bc6ea56b291df782479d414d04fc2be463d2b441967604f46a4ddf316ffac1ffcd80fdc00ff1b0bde19136c84434b105f630be5c3e9ba2b97a9d9fc0bd700bd571f7740d48ce442d2b5bfd7c34c5a5900000228000002240000022020b3b9b335a51d053a3d042d1d2eed503c7294038d6cc4e3dca65396e13f15dd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018b2563ed4fbae4b99ee84c453a5616de2eb062fd24389a19fa89f6fe54c20e85b4a2a0f5da70f9334fa56fb14ce318ff626187345115e7290792242ba912e8206e114918f65fa27fef8c62fa356c1bd11942a81517aa0fd61f7d4a180e855465b959bd2326da7fb52eb8b96a1f54005a14b4900e50f45d3ab89585719447213652b0838990fde8087e72ec00d169fe8b676afe3b0a4e621f8f2a414b287e7b8c01e1aa768bac8d584b2728a2c1034c5d7837f60a1b04bdb4fc5c6f7534bb785ed98732c59cb54f2b5917ffbdf53073d177a040080f60f975014db64d6c31a43476b70f31c78e2739c592ee5d2ea1153f0f4f028cb7cb8848600f79dbc97a0128f8f8a701ca1a93ea10675ac59a262e0b62753fad940fe17788593e68d91f8044541bf489a5d1ddaf261d3d6b87ea86b6cb99b852b555bbf03e4bdeb65abcb31d85d376aba707d6419b04c360326e9641e6e8fe79980336900bced5a0fda58f6ceea741250b79d545b197faa897fbddd5ede6df4d654ddd6027ccd056c6e675760bef9c728feef4a7769336e78a874e8d7f943da755613a1aca12bf6a84726c925bd052ba44aa8d45614ffad2e66d91b4d6fe3f1fd25e672cfec647b32d5b2cb000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010a661340ca84199d15fefbb4052e81ebde5593201d9a2119de27ce91a59a921f0216400535ffdeeaa699b27e37bd0dc54dc034585c0db7f195da0db118b2380b4c0c73a584ee6738add8f8f9a153c96da25aaaa137528a0e61eb02c84829ddc96c000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d31b2872fd16b8afbd054ac855c2c76d6e77e061823f149cd98f1d289ac9f2de73a2d4fb4a079c2fe301996bd03f415e1833a92e09fc33a9f161e90a891699cb23089d2ec8873a45452e534491f2bb7e8ce4b3fdda72843dcfc60fef9a1af123bd08ac7721ce61630d3c4feb2128879bc5f7d1a06b850d1a7e5b1dfbeed3acd3e3fb721ccfbb3a021a33039fe4ce010b7dc1fb8985cb4b58831b9a65f65d34568e3907c89af992817cf26df17f45829222c93b36d523874f472971318a6363f0f108cd8b655f0c370dff75d16dadd2bf949c194dfe2aff56215e79e3cd030fea2e7c83a87b5738d92d3bc72953525c9e1ab8867b4939baaa592c084b0a89a90cbc6a29e1e36bbe5a2a60f36b27d341246b522cefbe0e062a753c5b9a7c0d00e1ce90494289320241819c2231a13369b362c011d7b7c6263116f9690f7ff3b508b0af74fc80f5c082a4d9e020818660c8e44c81056bc5b7771221e0a753750e5a40917c0c955d0638177408aa0ded93666682edd18ecd841c012fdc3f1ce712ae63a55c7d1eba3c260510f916f6b09c0e48f7db8c1458399580a136957ef758d9200fa6ffbc277aeae44a26147d7f1626017c4be4cb4f9f76ad331a24301a803b683999f405fd58ba93ec9a988056d7b39f6c4a005382de7aa957c3a97c050c3000002280000022400000220069d4ac7b5f691351aec50fbd11468e3a9285fc265bb2f5fbf7bd66627bd0d0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b83d5553df39c8b3a36b313c8ba007f90afbe369e04099b9b1d6a0b0d2b744d3477b225b5a3f8461a8c49fae09a6400f2ba47c235a57d0ce5853f927a99a33b6dfbcd40b9d5aa55b43656233c90464268ee0c88506cc8118d9375f219f4685ba5ecc7e273d84583cce6b48ae80b8ed24d639babfb6f59d37dbfcead3980e51262113330f015ff114e7024d15a10fa701121c62c6949169baa52173d9e300096431cb53275178e3efd73ed96b0de1b74b6be3b6a8fb50acf9a57942bfef680f4a59c910cf08d9105cfca104fad347bf611e47f7ee836308c38af60db14112855c927911eb5f1746925abb2cf73927179f092815ea172d173bd3972af6f39a253ba40e96db4452844f4fa2fd34a32dcb4ace7d3c4764eb0454a20c19905b4d1eaab9c700e34f8c553c29f6fb7ec2f9108c06101c29ebdbccf6dde20e92a6295e0359938c14a0f7c966d95d4d737c00f7d85fb046cf1d5de55a1c632404449732bad5d03a774fa06306169879bed9ecaa5b7a2521a1196c9f4408bdf35f4727e73949638094023f0c04a6e22cfdf35f40dc8c9fb6649dc4fa80778afdc6a71eb79c0b7457cc5859bff092d42469614210623d37b533d8ede6a997f608bf6610604000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401140c5bb02f98385993e00df1dc1bd25c657dcf4d1869d1199aaea8900fd76f8b0216ded5b25e73997f5dcfe454986d0102736477a65acf58daa649b0611295023f1445ab5d9a81f08f9796c591f100ca4ab363fd1723d2cf5f8c8744f65c435cea000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ded483c5d19ff127500b8c4f42beaf715cad3fc1e5bf02ebac4c801f7885bf7042dc3869d3fc46155d27aee7a637f66db96fef6de17d74a0d65b73af3df08f5b274a607f3732368c3e021a162091917ce42ab2bb80555720ee0b2dc7a9a03408f45649059851acd57655282dc91dbb19672053b74b1a1a5f4f8a76ba6ac453e640b2b9a7f488d864bd44fda30d57bf34bdf654497e891862fea0e961d79e2c2755451bee6d33f24bdb778ad905a5c49246c61249253f734f0fd429c1b70bcc157d18b005a125f0becc3c3c78f2206b60d907b61945347e432598938e9048e6c7c53667c9601304ea52781d5849825b08ffceb8d5ebe69d82ba8a8ca8c48e2aa98cbf9347038eed9b73341b912e448e318ec371c6dcce26488f49a935fe0b14cddda4d8638f8160f139950ec952c25a0c6534712c2c66ce6bb517fe67cae0b687646a218edfa1e4ae8d1a321b8196d452b62b1dd83e947050ee8a42a88c3cc29eba84024d8db0700f042a6e047044967cc2967abe6a4accafc75e606d06e3284fa72413771cf4bcccce1a7316bf2410b9678de3bec5c8c6ff64831d41cc7ed72cc3c4797b8c929a46b157a9f9a5dc73450318c634f4841db5470152e56da706178e57e20230b10b73beaa2deb09e4d3cb0ff76a57c6c3d5b8ab393c4d22eb99800000228000002240000022013b129a501290211fc30f1a67d40702a9bcd1b5ab215398f40e74f9e8150e75000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a135e6dbed75c06d9ed7d8c77626cb0d11cd5df6e797f65a7135f61d0c1849416b83c733fa14aad96bee50988c50360ed5d5b2b28aa6f23e1ef758b88e5b02a8fb727947cdb1da757ad6ded5870b475f1dd1a55a03813b99fa9cdaa65227c357055fea48abc74c0509ee58044a8e0de30d1aea2d0cc8aa617dc73b36ef51dd3b874c8b6f5aacb29dfb3490bb8e57d5357c86f826a3f1dfd7c67d1d71c3899a438a9654b4846370e43590d5b9477efedcebc33138eee5f670d5d81bd50c1d9c7361a0f14604ffef1edea7c8d2b8428a56d83bf59b7c247cb89b907b477703ac6dafd13944922ee20d764b9d70009626535734ba3bbb93693a9bd9183030dcb60e6f7be25a258fb5d7fb3f474b19dd7b02a55f063e8ed64bc42c22371a4d7530b4097945a8263b8a95efa64a19d8c4083561b8fb0729c3d56bc6d2ef2737026e6f5ed137312289169d2499fd6b3618edc3e39685f28b8261aa53444271b55ac0d8abd09dc6caa8cda5fe348c7abc9c3166a6593f13aacbaf47d17cc0d70c1eab7ba4c48ebc8b8e4c0c550677c691c0cfe65857e1cbf575da6131baacc092fd088fc0c723b5f7d1b60a1b548ff731a98243ca50f69aec0af7e5b08d861abdf3624a000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011a94d633db69dee0b4754e11d37458552223c9e15bb439de0a1a78c2dc346f170217d9d7a10e00875eafe513aadc02c5a7a25fcc382aceea4714b1b6134d6a1e0c1efb9c1b0164851104d50fc01d4420e0d3a90e869502dfec275fd591461c41890000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0fadd15a43aee413a6be15fd811ce72b3054c84b2ec858613c7af4f72c5c162838623111624fa7136ba1e6fbc3b906adb362249615a786408587cb65a2dc1df101ebe101e5672cf82cfdb74584e01e65d1b4aa2f5c91bbddd32d83a16a452605fa9816256dbb0ba670c3a6515c68db5719b0e5f449bb55a49d57114ade1d547e5dba667732f872d07cc0ef5db5de6992c98ee73a3af33e6b5b5835737986acca8cd2d6b00a872cfbb8ca788f0bd9b24e0ba16122918c77fca2a79d1f30fbb6a330831597c1b2ad5c8478deb1636b06d0eb45d9b01917833a4a442f02f65318c4bcbd806123f94213a34b12d465551f77e606da75ba3a62b992adf4908de84e99eb39c1daa3565e1ed7cfc163fb9b7b840a5a25c1f56a0d96eeaf0e9dc6c924091b08692d08e48e2461a5ab85e9c0ee9bf1197d36f0aec8a8001a78c6870467fb2abf87fb4f19111154b9d08ad81c4058e87d375911647fc7c66c8208db2db6d763aa18f9f582776abc7cd4dea1a96297da3c8d26da4e214082d8bedb1c8d458566502e13fb4af0aeaf6bc33cbfd8483a4792b6b995eb8a031a898dd7434f2a332f5af1fafbdc51bdd8b2c985895ab2a129518c832f4d9fb4c85d2a5230a713b1ee6a00a79c866ae2572610d2014b5892deb72ef3aae885705c27c9703412f000002280000022400000220304f76c94a4a423d303c0b9ef2bfe752a591dd2b29b44a56b4cdf3eadb85d9d7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ec0309df47687146292d4ebafff7286409ed3953ef13912a130a9b1e6e5ed4c37e0ad9f5765aebfe0bc5d2d768ff354f598e017be1c98e56af55f1bf251358cad696a0ae5817ff3f76c0e447d0d2b2ef6907b96c9abd30a54e9a585f88a84e020c6e277c56260712c07bb522e437bebffa14d403f6c2293eab404cba74cd4de2ebb69239d5a12ccb93869d0dc3ec5dc5dc944faa66dc2ea112fc48e887a822156fee7e0f3c5c9a7b5a665d2f24d32581597e7f66114319bb7e946385ea5cee944110daacdeffdb786c62a7b83aa01db4b3c9b9641164f7ea37f2df799cac5e16913060ef7356c6991cda956d7c8bb2f4ece37b16e91bbe054639d7c603574538f16df3b346f8989c369866646cffcdfb1fc67e563943366f55942970af1f301939d5b724ce1a5606775dd9892902287a7b087833f2122f69d9ec1ba3a032d60a6c3ba147a128b5ed23a401b3dd5d74af1388dcb58e54ded2770d1a057c4f0109b40f93511ce0e89b8b982ae0a73d25a1c8e0c874d99471f4df52730beb2229d3ea742de5f83cefb2ac8935bbb8e5ea1dd31e33f2e980120c490f6e55a9a3cc065d91c5b9b9a4c4d2cc6d5be644ffd4ff6edabc19ae6669b1d3161e96aaed2b0000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010d98b3994a923a7e8e40f62388d4ec41539da51fabeb389a99014ded16a29eb202191d811cffb2dfadc38678c799fb1e29154db960de768c077488fc52039c601f0c43a2d32107f9235513b17e054df690f5cd4ac7e2909a0eccee5db6eb3b5a0b000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f712686e063e57661d7c316e985bdcf863e0576d571b2653721a3e7f2aeaa7ed614eeca56c527ec8ad7c8cf7b1768a32474113b114729909b60e74987a63d261867dbde2655e50cd4e0867a555e6dc595679e43b4b63267258c3cbb3550ad9c2bd72fb144b13849ffd38229281503d737d76f556e1036e32df05b7e25bec7339343ab52b8aafde7670e61b2bc8ff4131d44d5506d114924e69ac132afbeab1036cf10e776c1fbbf626861dc1536d9a89a73258b8aac03f0a6533522053ddb89da3cd7d294c6710ac12adb5bcec62f99d2c3d0815bd188605015772b329231c88db35a757deb7b6c59e11d7eb048c67bb8416be74782c965c5a258b9a1a783e7355984661154869aafc311fe05db04ec2946a30909b1353df612c8cd67d9d0fa256f8b8f8e8945d65f18cbbd16c977e5e5070bed0cd4539f9cf217b9bebfedd3955cc99dfa169eca2cb153386e1c4b1e1911eebe771c41823153c22e39dadcb4936018b8dbe2897e53f0d51ea84d3ebf8587f4d3367cbf1e49dd7f4b67faf325ac291b9b11c6b8bf446d25454c850d54ab8c104f13f4d86c341c1987e9c0b195ddb335693fedc8540b2c1474912922042a38e71f9d20e826eb91347c984011b57d4bd7842bb99a199bf2cd46562bf43ded00daa2793b93fbd230c1ea68a5553a000002280000022400000220159d61888f249be1cb954eda58b02d1573ce084ad6b9d638f41301d38f48752900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000298d4ad5359f34af09b1753aed2e2fa0d5e61729830339d3e7d922601b981f8c3a243ee70f5c9341c18b86dc1063be1a6f39d0f711e75181bff614bd4a0dae4ab703b341bd45f81d77fdb63d295822fea5a12812124bb1f5dea722656d4320e6e57a1da50aa380c33d7fa838918673e4717ed62b1f6e690dfba5029b78fed4be8354b1a31011886c5b90c74a7ea8bc30652af59cb71f70d505760bd058b97b5760fd6d6291508fec19badd3f3575f3b58877b65f201b0e18ce7e0d20022c5f1ad9ca529b9cd461bdef5905d69bac2834619a92f1ffb706fcc7e3cee0832fbec2a921f1dd739f41789760f3f74ffe859adfa05ca742b7d19605a532478fce422dee82b66a2425c04c8edc51fd39d6f0e3bba5501cf9b64a9d3aa8861101bb178acd6055d4c20fe58e7d674d0c2ac0f5182540e0c97dc39c0b1932b4f1aeb2d87dfc73dd7647bc22ad1ccf3c29a201ec3ad9d40386618550d8a2ea47a0e83731a5c55a5c7d9948226a8527187dd21140ee6cceafc24f5a612b2f55f3df87106b9e4c98413de32e8fce0f665feb6093e3700cc0b885b72b294e4b1540a42555dafbc3ad1a48dfb778aab38fc7d0889b7bd09e540a5a233ed6daf73f3a9d63ea7d9d000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40126c0e9ff8d3eb0b232da92ebd4e31c938a9c01a2670b5a8afd34f6fb512fc9d6021bc61f66f4e717a03d88188aa62bb44911a9fd06d4fbb0009f27ab346fb8d1cd20ce49d4b52fe078c8e6fb75ba5ed6a01b7eb6ff1fde01a9454b150868ad9e880000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097924883edecec72c6675c10294e4f89993c12a8c16c6fe35464a073d9717dcc6a2868148af1ea40e7a2a97f86e987a71bb11ebd5c03d58850da9e507f8340aaaa8cb19c1c76246c507b523846634ffd3eec09735629ba2e4a79266bfbfd355d1bbdded1872403b5c5b7df9b100c910f86036bf18e1c7e8531961ef22e62ac6d7f45aa2148fab3a486cbac42634f467a9d667dc449c6e5c30195d467731d6d9c5b089df8768bc084a32b794d65a8e943b3ba183c67abeed2e923a2b6986a39fb6eb4b684e23bce67ae784e95bebef77e7844f8d3615e6fa7e96ef71e6c1746a809f6834b1319856cfd2c5b7f1380e2d0437f4877a4afe32e01e7c98c6916b2e291fe8104dcb23ffd892cc80db7fe429c9beff9d6a8e823885726d44e1ad830ac4bc746f649859ff8c6d5fb06f8dc7fcef2a4479db01ced3fead7215b987629c5d0cc0a8dbc2a1fa981baa5b4295df33c8c1a05a96d69b1f568417017d6184106763851bb069b102c816bd74305b52dab5d21b844d5ba07a0b26cd7c703cd677b8b40368b0b318bdeca632e9cccaf023e41fd8f306690be7bfab6d1d3a57e5d6d0b12a2d14e63eef0e59b351478b2c893f1d89ca30417b3229d9b035e0cc402c3f67bb66cc9ee0c95b7964049f1e0f828be2dd599bd606f025b57b9d8c82b407a0000022800000224000002200d066d4ca8548012abab14bcae1d5e27f91ff9d91b4bb1a327b510a8bb64e7940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081caa5516bdb13788c544cab7f6da1c60ebc921104c26fe3b393ba61bbc0d2c84bb6adc8933c0edcaf95e09093944207415893952dc477bd8ddacfcc50ba7588061be3375c80eda1edafe0ad0a6de3618af7baf4c1fe103e9e1b414fd107fe0234abf1a047b41256058461f9e3d1c27583d86b95b7c732be8c6aec0af5e707f4d49c598f134aa51229d41cbf75dfe0f81d32963d79a747a8e4cc53db80f6136bd2abfa9cb4a71d42fc0704b63fdc692a5ea9052ef85c5afebb4e5d574dd7a916564d78141903e82e3007ddfc726abc56d6a7fe760b6c66a9ca8c88f182934f2d852b959c8d7aaf26dcb910d25e672cacac09beab4fd26e28720efa722732a4cddffab5e933fcdf4221d983a04d5b7b84039d1923e87700641aace644b375f6ccd1b93093a4aca2ff4cde87dca3f072f20e5264dc85c314efbf080358f07b2de70015440af3be90241dac2c74b4afc309d0fd829690e8fd6908adbec52ac5b26bdfafaa3d0d527be6f6297da067a863cc35e2fafcefa759b84d78b0f4a6f97e7ff112d43aefa9236e64431aad4cf1d31055b27b4cf7417d3c76ceaf335237271fa6c615af3b6a55dde837ab187d06cd088505f6ba71dc59f536416a208f9e435e000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012f539afe44f4ef97f0d474364b89c314e4418ad3cf6cc2050fa9e974a9a29d2c021bd03e42e2f338e356bf296a62149911a5d79e94ace3ede742846ef179b54db703b667d64a515597dd7fa36cc84d33e01310d9adebfc2ce9246f54bb05242434000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b55df5d2e31b9c5f399798bcd99fdf59e752acb326a872525b55d762b9f6a868b747b22ee632325bb27a03e9e20115e0a7b4a4d9e988ce9b1a464601de08de333824423733f97959efc35530e141c7500a0c7703a9213b1db0b7d888e1dc03b691928e0498e6e32d8d50302f823379f1938fe25f883056d6dec321a0b601bd46d766c367b558036eeb49a3f1f35099a0bcb5b585616871ef1a435cdee7ad4a691bce8d8318a389ddcbacb1d5c7cdcff7656773d16c594e9f72679c5fdc75f9e4ec222c745ab9ba7b8372b0c1fbdcaeaf59e9c444e621280305b71fd9fb4290895ccec5a1933ebe190e596887a032e1d05a2a76ec69e79e36b804275cb4f579fd629462def903edfbd5dbd30b911d151546d8cf1546ebc5fb450031968c8f5e0a92d3f06028dc3a1e3ba76b34168604e9188b8be56a984f3813f29ef42c6cc83195a02c58ed086a92b10718f02b1331c9bd317424f1e97d1671d59062386ef87bb0c1868fea3d2ce78c2ae5b5d53312edc35f23348b79128607227f90a81caa9a956123b0d6a8692cf81ed15558c97c5c4492db2def770261ca0d394c6a95bd5a9f6fe1b8492b0243690dfb51b6f6d797ea80259283b5d7716344b04b2164abe0abfa6f622cd921510516a8ab16189cf1076b6107738bfab3ac012dc3b6a215f0000022800000224000002201f193f996279b20ad128b192490a7a5eb2c0107866a8eb347c7d53827f6d84560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011bac695afaa055fb7d77580c429732df711820d3360e0d44c722dd3e4d3d0809695db1e2301698b80348c2da1ab9774360bb65e69b3df18932944939a6562c9049e3cd7e6804c5a2a10a6f8d3b5da37f7371b9435df6c62f38ce4bead8c90bf6adea0e1dafc02b94e51e4bd7ee156ba08de043abdf1e6f228f07d1c108976bbd3576440e39efc3f71752aa3937c4f3530e989008a3c19b75dbb6af7ebd2c40996cdf5451a19265c996dd0b981f147a965e09a1d3deef25af258da7a51dd99fa99ace29962c2fffdeb1f8c8c74b9a8a0d434e33d18867ed2e8f93caf4bdc0824dd1b0227dcbd6002b851967d90a8115cbb84a79e66611cc795c7e9a7f4663b1028a6c0ceada9597d86e0124efbd4cd1fc00c6249440986a573262d051bb17ffa4d7d8efcb4848271a5a6b3615f253caea296c6b290a45073de04947a6dd5a27c8aa190c08eef62e06cac98e935ff75d29c6f91d03b84e862e67b489bd7b93fee1682c70500fa19d51e789cdaf839d1675636722fbf72bf68f7ad3630abc31fcd2ef57cb6f1a20cc647aeb5febc56ba9ebc978e58262d323f15e58d766d91a9afc1f654b156520d0f86b01bdfe2a2024fa2fb487412a1354c3014341ffdb05de0000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40111bb7f48722dc1e431e112910aa02ab77b5e8a91c9f8610f7dd29507e5a5a618021c408b32a1e03f2aec44358332f317ee36724d0606e59d1360b05902d78fdfd60e7460e4bde558c8a5e8e9a15f2535ded7bd9e5e91733e34fed4428409b253a80000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007af9f13284c3d98c8711ea3a87e78d28181a838989f18038f4c74f337d9fb0b5cd35d83957f7a059bb7d840a1d2b428e900e2279e07b60e456eb45b826989466fd227cc555373b6a49d089ca027eb1e0f7f3232a71424e573775536b89bad1af277245fa8b60314472e9f1ca9da8d51283d735f6677aea9b2cff52d9cfb07588dc20be169a55dde9a5143eb33ad5764a7faf6863ec68407a4eb24808e0aebfdbab2b01bbd2e7d818952da71e91aaa3c9d4d70aeec58ca087a11382409354dcf92cb09ec2bc91b041965a4d570de541c4c9d1a427e154c58d11de8a618bbd61767e330fae784ae7cd0e486abcbfffd7df9ca489f26b61231c694785ccf6ddba7bd32e19f4553010914424f09efc092e57a812352fe60a12334ab32bbc56d92c4403e188b1ab59b80dbd347559cfb00cb2087dcf7fca0367cc20fd2dc6a348292bb95ce3d45296da952aa7b54d3ead58b465999c18a15d7c9ec5b8776a985ee6840edf396420ed7eecec8032db4add419cc73d3c4e2ee9077223844b9b6b7579b94f66a75e2a69b441ad91a857cb7a45cef0cd2263af9a28d655f7c58d57dfffe6070379cc6cabe7165df98751c6fd3ba09a3c1dadf5c33ce7611c194b42d320f251bd34b3e981d2df89a82f89f66e38d58017b6632e10b522bf08e016fa7b09a0000022800000224000002201c7252f223257239c696f0a0aa75d34125cb7ebc3bc4d3655d02428eb193a17200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000882dd10f5f558e996231f80c103a7831033aa4c044bce12900f7bca536e8f9d226396d4f0514cc3a94625853ed3e275ed4a73217f2e3c42f46f8b383c6eb0c70006b17a653ebb3507967d8e0f9dccf9af0891e6b4e1d3b01832000034454621b5835ccca5126da1e791a5efb6c7cb87a6a9a1e11eb2685825d5e98c93d0299c572e92e819c09c15cad66cf628a3b0a2e5079b3abc0164ef0a40a4e17fd1ae9d48cf4949c61e021bf3b4912c0f9eadd5b39e63c42fa664291706acc6cdcfef97dd2a5bfb447eab17f99ee20a7809a6d7f7a325a423c93abcf2cc22d5659fe636e00079ee8e40c45c9b9757f19103a6437cb0a4703d8f0b8d4e46c4c88b4592d12a7940ee2893d7a194e1493e6d3c5720fcea1fbef7f8d707ce3c7364118a43999a17ca71aee8f99c92323e43bd869bcc019ed7530fcc3bbe9eded751a2d4c7a7411460cc950715ae1193c3e74ff1019a8df55039dba7a84728410d8b75b4a40ad2282b2188201a9161c9ca3d980c617df22d9eac476002a9bee69760c12c2f9da83bbc6231b7ab01330f42cdc1bace45fd73d785ac68643c3d1bc70b313d5625c492f4cfa4fadf1e9b614b7dacddb74f88b6eabd68a040b1e5b6f1ecce79ac87c000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40115f0a8dad5a4e6442a146598ced3741aaab040a0cbcf85abc548dd984b459e49021d99b822b44ba8f25d517a1f768a3f37e8b78aa02123e8c1f21db140851467ef0afa0a3b62c458eb8de66a4ca0e8722245661f3dbfec3898766776adff206fa9000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009cc0559f06461a168aa4a1e9f1e56a62c32e3c9bb877a3f3e44ac9cf79fee60a0d8466c842bd1ffae4683227bb3c4f4eac09aea6be850ecaa6fce1cebefe6dde544097a3f2b65acb5fcb80ca918336a0cb8a16a803328193d6fc0e732621ed137e0c42b3706f5df723355d8e705a3a8ae82a7d07bc0c11c5e14bf8a20b712665cdaaa4eba2ecfff5d9bd3dacb7b1675174d2662d86c341c940a68420214d895bf2ab11c7e6c6657b54b30de0480746b2edfaff2df3faa55304be52766508a9342db3288e0a8bb54a47d7e24490edd70d0602e3821d71cf7f98a8fc1479cdf2ee57939decb2906c7dc3f6b16e4c606a39525d05c226fca23954465ece01111f395ef1705c9742f5ce204ca562fd8d5aac0413e69c0b9a5dd7de98e63e401681b375d81000f6704d0e4c6cc3f5cf56456522f942f91ac0b0113fb05756fa7cf44ba5a53b1dc71e3e178a95c87e602eaf8f8d319732dcb324e914ad1910bcba66ee2f73b6c865aabfa503e7a24402c12da6b2542e66c539602b5de0710a7c090f825c7a74d303f05f0c7a6b164fb9b9a83fb2e964f95dce87842e906e8ae89b3bfd3b332aaf9083f0f601f708384b086b96a9342051afd2064e47fd8f719ab1bb4567faf91072580d63d3ad762402bcd948d9613c894dd37e25013d57b8dcec20d20000022800000224000002202bba80bb6e6be5e3754700205202f31539659d8cad07a6693bf78c2e2471020b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b813b9cca06c57e6afc0dd437cca6a04d0cf5d351a955aa238cf3d8c8997f662275f708fdb56e792b6ea59b7874392845c352a47eb3c0bfb76a50236108e81eeab7c7a55e139b8f81a821947cd306f59e97006613e3f6f15a938ed4a7594c6940f1b5464bb77e067362be5e046caeb7525966d1b5792c1f0f51df3a8577a224e8a2a3a6c0b8734bd04036929ba1b7a0d5cffecb2e959b09247a4191539fc63c3afe4661ee2910c16db4f640cf9bb687dd93b4aa5f6b54b9c83173dd86202d95ce299852a6e8da9ffcb2d902963127a5c936850fee5e85858189f8690387fbad8b2471161edc352a7e56749ccc50813d23efaf6a165c4247cfd4e5b4c08e4e10fc5dcf8f484edf0cbfdc8ad1a85ccb6429745958a3a9710c12966ba173c31999891c3ef0854f5c224a0548b86de486b849fda9e0208c21eaefd6b7a96fa64679f0afbc6b5df7ec06335af5f080a09507e213dcd7a231843803e962c92903919a45ce62cd6168e55371a03e6d08c21d33cb4d6af52ba0b2008a339512c4b996f26f28ade6810634d26e9c5835ff05f9e5166ecfbd4e6c8966b60b66adece038ccb42ceeb8df81cc41c98d0f3a897ebd57e56ae5614d203a4f6b96a1dc74a4061e000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401167a436f1b550263c4835eb1a59b052a36c252dc151114546175bd46d18ea9d2021de2e54067a239d1dc7366ffd995ef651eebf448efc6cb4a7cfbada2d5d584411fb77a5c8f18b87f1aca1969bffa1ec27228b4251836bbad2cf8360dc886127e00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad22d0587154e931e5b014fcab453772504ef734389d1885a26138fb26eac705a4f8d53ba1b8162cddedb8711975fd1550b799af5e579086711dcfb50bc658ad2114ef6b9f40df14bb565e9f58d3ee8e7eb0973f5a621ad5d7ce4be9a314356255ec445263047699fc33ffdb481ecbaf90d38d9b459749bec372f8eb27f2f284f8a8d1ce762aaeda888580960cd0544b89289b8e8ee64315921e2babd587cd65d068a1ed664e41c36eb66aaa21547a74a17e5f0ba7d300868ea31a17b3d603f2af6a62a0c086079acfa8fdc715c4e539695ee6cfc6af6617b716cc361de2dc8b3128c802a9e2f82f7e64e087d4d9ca31cd3e3e93ec619e16a7418faea9da0620d4c5647b82455511da4742bf0adfeb03129d7ce204766ee5966b1c238718588611f079208d2928f428c4aa3685bc3405e8d82e5c4b23aa222eee3a59555c45af79732f7851a9df8009f1473644eab95577fcdd67aea56056839ff9990283f3852cea233b1b10a56bca2fcb0ed2023cca1bce342bbbbc4de803e37c52754a6eecff9a7d0363bee7ce31398cc9713d63913db6efdc5da91905cca97c2ec5d90f258ecef0f1a6b14e06daa68c27590287900be0daa9137e4a0fed2bb5636ebdf6d3181ebf03a54f65ebe17a7890027d1196fc49336a200bc6d60f5ad345f3eeb98c00000228000002240000022004e703540aab524e8f215cb38a6d1322068c1283999e88b63fa27866127d50e300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000162e0bea200bfbc7885efba17e23bac8654d0ef2705a66fda72d1599c29f289f8d7d53af7091e98b58e08b457461bf4b6b02256f87db28789a65d989f98bb303519112be841abb191aadbb9eff06302110a7ddad6bc2376dfcce8d212b9c7fac1d4f06abc4dc114c0e62bbec3568539f57d4e93ff7a765685594d97da3d6cef55893814c8577280eebd0dd48eac773ccaf4436a2056ce365370e6b0651d320ca255884f25a8ab21185dc4746a0f26f45718df94602cdfee8bfaa147d18ed19569d66cb423fbe6e055151ba41c59f3ed2478138b3dcc6427b666a2446cb773bbaa999e93282e2ffd56ea01f62093aa0dff483485c6a8cc5f8a6f836740b38da800f42199a494aed41a0c2175072e9e91ce5dedeb5fc956423d7c3c64b413bc733796c98ce6dbecd79596e179724d42ea65c67ed92221bb76c1e361efc85d253e34f93275c5592645fe32bfd43526b13cc18ddc8a4f8a5559c6684ca58c4946b0ed3c23198d009c2572385f6709caa41797db7c30adf9c565d5e77206e79183075a275b8ef200b017f9a6e81801112239303192b349c0655d3528332d5bcc082d507af5f2e030e7349faa68a3c0fd759f74f864af6459de2cdc5d84c708980baf8000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40104a0cac6b768ecfb9d2a94e4664263bfa771230f050a3b718ed2e5b1f8833587021decec913df0d42f31c52c07d7b0a2fffb98027cc55dbaeccd38613af66f3b9520473c1ab13230dd1e2e6e3a7029e3313f7875ca99cae4318c93129ffe60719500000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093399e6d09b316d9b7e331fd6293acbfecd18d35a1debda675f1e5be36ab354f9939a541459617e51b66c3849fe3506206d0da0055a329f1a5fb31029511d9ab44c9faa61a7e5f76cb8f8d724e5d35007f494177f968ea406b9ef19011269a4e78544a16fe4eab59e7488344c2e32b7e13d5800f4cc6f2d953d2195b46e92ba837764d10fb0f0391ea2d2b8d5f0a2d0c9129694ec4760dc834da2130dbf07edcfabbeb626abdaa10789f8086ae17946d8749bda806d50f66ac11b07b9455ba7dbb2473879076d98b765935cf6c66b1c700942a94447bdafd2bac1b29617183eb3c5b38bbad91794edc763d8704e56e280c25ffc23a299541bc591a3273ed58ef307538f456e266084edff2c3a56bf3a968afa3d921ddb8fe159dc9b9bb0ded05edd9bc42a0d3087715cf0f88b4fcb14f73f1cdbe8e14b6a58089045a73627da141c01e86bcb9b37498ddc5da17e55f829b3a56a9e2b4e2b0547951c587446c4148abd6b3a0d6ef55a5e30a434cebeb9b5e990b9da1a49266168b8e1c14883288ff2ec2dc85c55a6f9f222c0c0dafcff4850340246ea1fc30f5bb3f6bcba5460eb0a71afca6b93ff867f26ee591936f467e5657fe1bb36e6d386e946a09e8e5e5a161fafebfc79b5d539edeb8bb31b3e238262a08581d6dd18bfeaa998d6c78a00000228000002240000022021b28924189f36d913b9ea6b8db91f45204ee2fe88de2eac289e72b4b6901ac9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cfa4d70cc15a6645189541abd3f0d5707c87a10ee2e46e561bc6391f0be2b5c68042d13854f9bef10a3a4c7923550b0903a9e14cdc92140cb4154f0f2f49b612303ae15365c608ed8a1ab1b80ed865a64a95aa889e4068ce9e31d0e855b48ced85cc718d3e5ef666cae343268b3a3918794e8b0b36e1142c6b9172075eb8bd6d0c2ba82de21996b80e94b405b1cac96960a9d1a7135f4a940bcf6bf36d22079eb853bfd7c1df8e703c8f563626446c5ad42aa6bb7404cfe17068dadedd94777a6cd6f3c0c5f736e1d6fd02ddaed709bb1cdbc2677723274d58c23e8cff1dfd3cc6f0fdf59a6fadd2fa3899b64da1870016c73388bb1a9ba80adae41192ab417f0f04df13963a98ade60ada78ae6ea8dd8450eb68c0e712069bcc2e28d3894a781c29946b1e1ff43861c829950252a15c1936c771e5fe77a1e013980f41b4a59b012a005184a2c17ff4ad8247e465c69307c97dfb982c6559335826841db24f39903fdcf59e5f212716de3fe8cc4f6bf8620ea68e65a7099b673294100022b356d494dd48b5e34e893787f46154270fe8ee9c5acdba8328c9c2d173c1f4f2676260cb7499a84fa4fa2f701490d632da7d30a862288b4c9855f649dd6b95e4cde000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011fb669e4bf826f1619e18674e9d16eefaab8d56724454339f4a206cc6069dd18021f47b0f3ec793dbb6968f06431fb274deb6998168c5193070d04e2cf1065c66a06a834edc2562b3bf09171aec661097e67736f0e1233f87cf963e409c56e9f370000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080ea3b5ad281afe0ab33fc2e3857b97e7c70d4077ffe0008b39c1701e2936934eb7c447b44a12e0ae47bbb264b5a4fd2704f450c9c1908875cc2120f867ca9934eb3d83a2c5d7241edbe1492288cc205655ff357f6ed05304a847967f7e481ac07105fb136e78a7992814ec36f5b1481cf03a588b8a48ab4cd42c12482484bdcefd9ba5a1f442da6359eaab2f077daa3a9166871f86e7c07a7e7b959ecde03f4a83167b026912d433aac01daaaf72ae2e1c3a9de87a0f7b433ee8a7c68d0e5bc6a4e1bcf0467ebabea8e09b14b29ab5256ac65fb4794028e4a58e3e023c96d9129dc2ce0e6607abad956040b871044c006c3b94aab8cf84cdcb7b607c7cf6765dbdab1970a7db62ffbf4b54d84c73b1570c8b7d8da6d42c06dedf30743ef92313d738cfc8752452555b69d025fff41da3e235890824e42001e01b1b3af6e7bce2c33ce5034dfc964aec1e564668260f5ec8c81c75899f6c7bdd0ed2227021d997e1c941cd3aaedf476dbbe02b9941713fd5c9f030196934cbf88c0f8bde5745f2dee480aa3f82aec305813d8a17ec43761e652b79e7a4f21419d579e570165e7666e6320b6e49af7fae6ac89d01bc967d16d52f25a643da95f91fba5c7c2b7a0831d43ec4f1990168500a2192df8c915a1e5a18d199b40ccf633437249f91af00000022800000224000002200c11bd6673a3e6007fc777a5ca31e73189fe58319ecca6973ef3a727aeca9cef0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a478b83f6030bcd3506140f0d31da7166f2725154bb78bdb77b888f04aa1a7e6b2167bb323521ea599097b1593d8fd797df420f7351389f9c315efd5a8e911b08b7663a2f360463706204be173c413735602d140dfaa53fa43683284edc3d2a19f6ea66c4955ee16e1c634ddf76dbe941b8aa55da7b8c3dda0fa8ea79df3683fe1a82a59129362f611f0bdcf559f29185c839ae4aa89f0c3c836745dd83036dbb0a6f77b9e1a98f88b91cd14cbe4c13c679876229447f19fc54fdc2c9b4a18d15838048bb9ca0cbc49fa92e10a29e24df3e13309ba5820805a55577d294aaa0ad15af42e69a8474becc58e5180a33916b60028c25e8864f4dbca73432b2a188e89e9d8d9c478f79dc4b7555b323f039bd7744fb5c18eea91760c8bb7b590a01e32a204be594d7c03a238acd4a544228bc6c33fa7f7ed39317dd43522179b985075bdfa5ab642c48879e3d637b8f2b6c21663d44034511df362d38af43a2686c8ab7e13c9119dc42e6e1a5f47678738ab8f020b5f517f18ab711ba2b0ea74fc8db5d237fa5fb13124164b858eec3ca84b360507a78913e72573b972cb6ca31eb6d27209ab27e2ee94f17361402c41086bee9bbbbc96f51f6e3b20482d0f9011000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401202612fe823508d5b5320691b36cdb080490805b326e51861520a65bcaf16d2c022037c38e783d244fe6e61eabc2c6c357efb5246e5c7f78446612878ebbf4b0e102f0535df3902e1a05e9c0cce78792bee675fd921ee12bf2b41523fc80a6291c000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002eb9b6d9a790b05ca984c17877cd0dd516db42e82f58a7e566cc16f171578523de088f4b7a6be2d8db1113e97a25bbf726c2e13971b98dcadfdafa4c324349c0459d1e868a0271cc82e58427dd4008b12088dcf6aa550c78f8f1250d7034497b6fe6c041d1190eff905951b995fb8a04757fde3a632c97b0366c56e6596eda94001198b831a56f13c7f6cc282a949df6c178fa42424efefda8ac81da4e607cf6e093286ec710d4f6fb8deb6dd6095bc34491af7976f9cd0a4e82e8f23e8fc7d36281fc8738b77d5ba1e2b51aefb441bd2abfcabbf3feadb28fcf8cdadd7c9f6d0d288b1601514208058271240634e90f8a13f97816ee452e76ec6853a3a300a99a5fe7113aa69b99a64ee2357f44b9cbf839960295a530922ad45b43e3433abfee9030f56ea6bb16b8885c1d4034bb077eafa85d91c8ec73714ce879cc9968bcd87518488fa53a4862eea6fc3a315197683fe7e644a2e32659e0a736e2398c8fe6972297774165a8b67b9ee8aeb905e6964b0c7699d59a1eb9ca64f262aa7c1911eb52a49b9f92efe2276ce04a314e421952fe535a4e13e6b425110b46c8b25747ecdbfe7eb48ac380907914e8e54f52534a683e33829b32dce296842ed4f7f567bb7fe4d482c17f5205ee0404d149cf2ca70bad285a09dda130a22857a081550000022800000224000002202db68c6536f16c141e655e5b0acd8b6d77675c7619f134d7283a183e4c319e5d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000274f47ed930de322d75cb7a9da9ee38e6d65a2077319380dc6c65e4e1868c9381155a4b59f4552778f0425ed91d7b1ffd59ced1ed73418dc5960a1ea3641fe74e6eb2b2234567649a50535a956c6e7513ba9e9c4627a6966c53dd82ea9166d9b9c1a1cb96b7af18de804f210e0f72325eded21e2e0d9b10af88da6887e711c33d5be516fe42d90be34a2bb3c04795fc7dbef983e230efbdb98ada28c45be196aaa0b4bdf4ee46e9356e0c8ca2c56784409b4741e85e53be8dd37d58d6bac29accd8f98de8591d13cc4b28e5b334c3a6d1716c084ffab295ac3b58231fbba5895d692112797e7b32e2285303939250c4ad20d3ede152ffd11f34f8e006f0132dc6f08fbb80b00a6f245fe2bc029aca6c4c9de90ccb1354217612405f2ab99578f8d8d5d298f66de8821ef74449faa15a1cefb3d6f54fba6d1e8d1b5ac20cbed2bc32bc5b4f19be221a179286d8af6c1091ce5c7be06a84f1b3a34e91648a1b71b0f90451bbecbedc55b5eafdd91ce11291f2b8a798473b8519455a33e0171a93a8f1b87439b602d79cbed07dcde3937b935b6d262cf354dabc559d6526528aa3167804b918b223255aca76f8f718abee95da8ee195629c7bbc086376fdd614613000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80210839639dbe86455958a2d3188f21522cd755c4ee2e86c66684d19503632cc791408cc3543767ae7c03e33591f3b709a200886d5f3bf9776e1516bc15520a73d0221e3e2b84bc43edad1d659964e0194276689e981d9f165c2da145935ccade1502f602ccaa0841a12907585c90dc418d62f923ab1cd74170c32d3e1685d9893bb0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002214781fc0f8ff789c45adf3f9989d949995437905b9c6e32d9c6d6ba440adb0580da3028dfecba5c20eed8a5544e7307ded365febd450b1950b187bc9079f0671f67dab2a0b0006158321922684ecd4941faf65e5a62305dd4d6806b08e42d6b45ef334291273336113331fbded9d528558bd925267a3be42f7bf92607a92b09950cafbf419ef6440b3c775aa3fca66701eb77c53a5f8cff826900b264a5c2b859e6f3df38c18720b18ffafe7b0148dce2c8a7265eb830955246bab5312dbf262ccddc70c8597c44d512dc3fcdd470310e9994ca3d10ec410c414c35bc941d5576ef2c14f6bce566d3c078193ad2c31762aeed21a9e8f160451f844bdae84f8d263450fb57559c4bbb8e35b2baf4d159aa63f6889b80372101d8240f5be02255570530567ba53f9bb9b8642f0e6f6f607a925dff9773d566152346c9a1b10b3bca67d3853a3c20a225a71b8be78fb383c7b59adc039babcafb893fbea1abfeb15a38a038034d145f56093421e2d347bb8e523ab25a1f565b2213566b489d3f9c721a3550fa90a8db2918131dc5ec166f1e99f9a3d61824a03a2d173582a93f9c80f40ab93bc3de65c9eac0ca5841629fc9203f817182b32fee424d892675b8e715d506e05a87dae7c1129e154a282f134a384a7f6a994412514510d6969660f000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab8878d822c9cfbde437ee3ea30685b5b0c5a4efbe960413fae27dcd775cf83654722844ef161f718b9ee1547ffa9fa0b38bc37d00a5c1128ced7f505394217a26b55e28151a252d6bb8b131fe163fa4680b27fecbfae3e786f8c3d5b2ed295a268b938331325fe29dda79aad12196865dd44975710c057435df2f8b889c2a5d476eb5c96b269a121b47fb6be33f4fee20a71b99bc77bb8e939de42f394bcc54af88e81c8d9af3679eb3a864f20333e3f317bf05af2853af95aa8b55290303a4f9978be1d8ef7d97806083cec8dcb2e6b51f2f946b11d9cedb06f53ac11dc1f988c36df7cab5de9b7b8f25f600f74fe214fcc719bfc00944164c52f050389d9deb92314459c81a89d1ebff707adf42b7a842f0abb736504adaec2e7c685e80eb5ea9a3b7e3f4fe0779966727fbffb2ac6bacdd7f553fc39273ea762c9cf4397108540e03ab4e4440fd9223d36e2ce9f7cd75d190c245e27591318c4328c8c16362b04f8b7174469711ad8d597719096f5d2bf4734f3fe4ab3a04c7fa764094a6c4753d493830f44f798490f045cae7986696bf2955a608a9e6c4d8fb4a51943e3f73014b6bfe2631994091e0d9cd9dec8c09e9d63c44e18ae70fc8eba130626c64ef29ad0c78040970c346e6d428ac268849e8c0c474e87beac6fdeb7a42355f0000022800000224000002200d34c3745fec5936c191556cb7b979c1ea203de01e0b56d42df124e9cf6e77210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021be706275133ead95ad29646fef5cad43096417490fba51c23d5f95b294710bf19b92ae60ebecc6251f89083ac3894e7398423eedb33c46df4b9a31c72052891ca2533c92dab242d06d88b858d14bad8d382d69b6c113b71c5ae03a4b27a96bd229a5a7cbe6f70da1ab5e0dee20b5166a8aab452cd6556068f6def2c653c6e830ff9d624b6d5d49ca40828664d3ccff68acf9f36f4d3487f80ab9598d05bca98531df266c16980b1eca7782d4edad65eccb0311046e4eebcd7b030ff633889ec0f4b98fcecd0e3526465a86c5cf2553fa1475a478d696f51ea3e5849b2e105a4230f08089fc1d1e54098ba4a9de074f3505349c225e975dbf7c12d33ee44096b2ad500443a63a89c802f224f28b9dfcd2a58203273b18ecfac16104842d65d8a8e10f9bafed552f2c62e0e17a0d4f8a11534b57a1ebe1a4faa37bb7674629aaec056f79294df13409c374ed2286b5125117a1d85a7758f6662b0ebcd06f0c27495f9e8c4a290b9d2ec0dbcad312815420aafaaaa9778b107e5d6b415c89d2e3eca5181a16bca366e44a027daa9b4b24361415256d652a2a62d996cdb82064a9a9dcb4baed940a288729e966a1cb6d50d8a7d4b55f76a4349ed2b08257e937bc000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012d23d69cdeb2cf9a4c9278b922d25e3307ca2bbe4c5f9201ce5707aeb7fc850702246520f2e7b74e43756309046159566e2dc680beff5e24cb1a02eb7c9dea8735155e808b97b5dae056aead1c54de12da4326b5c62694cd40c91b48606471450300000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae2d2478fd2c4940ed4b0a06459e47251abd405d3291a4bdb53b69c7d2adc152db7771ff02270149f9cbad92ba991c0d3699cb3a20e4ce199ee1aaf7b13cfb9f89ecef97b37e0069e939ebc80966d18355e69f45b66d31e3f94b9f79c3766e622b35bf1f3af8f985de227f7aa74699f05f60e8ddc29924375e643147df226ac87ea1dae49bbd1aa252523c899b4f2565461aaeb29a7fb4bf0f79f7ea032e155cce484047b8e5bc83c78f00b519e2d0bd9969d9a4fa3ac9e227c9473a839a65917a38bbea8e01ba427e902581cc9d58f62049f9023c4333756558239c9b39a6f30ec33609f8e732d9336b00359a169b42c9b9466badcbaa65966c49956c83d3212aaa627f3017c21bb0f7b07902dbb9edd76f7e25359adde6a4a8964ad0e45b800371412624bfd958b2617a5b781e4eae28c7b8ab56a0ef46dffc17a599589e47ec1b693f064634ae24bcc1fb7253d055ca2bdf501785a4f7f37155c7bf1d707c82790c424c08eaab1b1aead0ec1024c74811894edd35f490b6a698ce704e0b7dd5c12be5519ce1210fb6031dc5fc5849b208db575c74670222b34db3744b0239fb3090f4cfb84ef1fca2190cce1b462ce458e7087fae47d6214dcaa88d54ba4daa774b1b532b14397aa79c3fa7cdd30d4d6c8a0bf710e45720c75efbfcd32b3400000228000002240000022002a2c423a229968923e006e50702f796502336ac0763055eda01a8fdaa23c33b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001aa646594cddfe2050c30bcf6b6d27b0d6cc2c3dcd11373ec4852711d5167c9826984100aa66fec8084272bce60baba575efb7aabc0a1db44c614ed28d33f4cdfd54398d0ca9b64b4b7ad7add3b6fa0822764c26f14dd59122fef106d9a99f3cf70824ac7614600c25d6ecd3d376596a9dd37361e6816c50fb67d34a247b2a5559ba7e7df2f8c72d9f073f109d0f48b56c84adcdc59b53f74694342a87432a1c1037fad80a83fd46c66b149784ee5f1a06e01d230c52509d35c9ca51c8e0ee8224ab164eb13babe45b716f3e20f078ff6f4527b170361a554b68d0982fc393b869473523813f960835fd8ec474a5556e356e4d1cd581ad7b8632a5ca8d634de0b1060323547ebce30c30e14b993e55a257605d51473ed239473cf10c6e194ef9501ecf585c780d8f77816360f2a445e48ef9c8184083d0d5c526069372ad30935ab407b3ee9041025912f12c9e6207d1618ce98ca94c61ff26dc3293c32366123bc4af28b561f8cb64b69b6b79645dc76954e27a63a443a0ad88ca98a4ac916b455fab5a0bebfcaace7e95441b4bfe66b708bc100e4d85b4f0342820b445c43adef8e5adeb14ae855a8cd592717a220add7aa2c4b4c3b018e5178cec136d7f69000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022deca2725e1ee8732576556a237b8039c8a166d8e501146972260d0e2e1fbf1827f7c067375508dcdaeadfe5d47192268a2d4178cab782c1a077eb2ae52d67e50224709ef533ee3863a5af8a458a7c9df4c3671abffe18c752d9411997dd9209ba1f46affd373bbe2ebd0db06d01114ba9a3b2cb4b0c57d06b091e37f9abcc7d2c0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2a91092a773c88384fae76214100aa06560f447fe3f5061438d4aa548c422b3317fefba558d11f8d92dfb0889c4b22fc6da20802868619ec16fa367bb668417e2777dc509643b868f9d5aa5340bd1934c7e2fa687cfbab27455f8dcdaf69addbfa1e6af7af7a1ee3db1c08140119e41e5240c711689f11aec6505e4a7d9c4e7d0980da6c57f97835791416eda96bb6d6fc9f5c3808a6af4a4c8bdb02b2793c33bc1b6e395235e966b64ad160d41ef570b1a21de8ee3b6fcdc737839337d81d3423707d445536aa61e13884c62c5ae13051f47459da7c6e0b0d71c0a9e1a3f17b38d54d123a2e5f0c1370cdaa91924227ca6133d331a220960205b9ff6937cfb1e914b1821c10126788d805f6183f636fff3e696e7ee6c71eaddfea7dde3c25a75be7be3515b6ce52a5606325fa09c028ba44b6906f8b9141e826328312d6adca7931e53fc584dce1c66d0518603a9c61a28c0ebeafcaff664fc51113812a8b3415459f79045d2686d5acc8c7a40ee4923ee54c2fb73b4a0644e03a1796c6e8b1b41870ccca5360f979b0a46b2873bda0ba36eea14f4109cda04049b6a8631978ab9bb11165c286f9d1687df1a4600c64be6c42f99490e8eb7e9a03e867e3991dbe99bfbe38560a121bbfe5875f4d0b92debd49d66d155550016d4ce1418fa900000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098daece078733d8186f95da07920c0d02f52e1af854ecc52d823743de36574415ae771aaa97d118e86e791c8c984af9a3edabaaaee1223da658faff39b4c4e9011f35302f42e3c0ea7b1e57ca7a25ccb585327235cb58b86a404d15b9665511dd30e90dac4887a6e994e17223b04bfd49849b06feee223062d2b48b95dcc64fed2ce0daa41e15e0a63464a38e6bba02659446892d9afefd8f43a6a5123d1acdca6494e4529efd3abf3413e8bc2aede89207c82ba70085e57c571d85b1276cf52c94240edccb7b3c388e0b92d26d2b1cad95e55f7cdfb73d47e1f5cbba87cd79be35335d3981cd5eb019e0858afec9dc3fb7814eee59c3afc351425a3979d8cee6aa8dbd8bc1fb6425edb18cc31dab769b432e85fd608db47bc21bfab19f3d4df89507502e2be329c456e117a7481cc4b50ca5b46180c0ed1ef1c9bdb5c67693327851fbcc689a8661ef739af10e0838be59ac05baa66cef886c5ce4c07ff298521c3f9b81cb4b97cabe47d0d42d027aee427d153fd38c3a6fb73b61db64b7536a5dc0475ca99e2c92de30163cd2296d43a55161f91c9b7693999967c4b5af8ac112c0164b42d0b7159f86cb1ebe619147aa7cf143e1feec98c673e8a20cd611a777970a7f87c4e70dc99a796b668935fe640f653c3ee12bf1ba60993ef4979600000022800000224000002200165b84ee54b1fd68f19cedce4da34e12e25532fa4a6ccdcf660c24cfd315b15000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ef02851de42555103a7f49e081a90af9de0db700beff0c8d4faea207e55f783d08fe563f447b98a5ba3f1fb550bc653513ab32f673a31162e8393a7a3a2e90a41dd06b5ce3f5d608b5ac39907859b5b3da624d7681868c532e9f73a0739c4ecff22dee92aca5d8e632bf47981ad54fb65717ca65946d2a9645edad435959511f3f83787607d5903bb4b9362d168b205848a8a116406367a5c289d98b307187a68dbfae685e4a44555dc7230734be3ba78aa8b38e8aa83e0c138ae409b50d34a7f44658a182a9f81ff5e6381e947669e737426e7e378f329a0d4670c6ade5fe8c495c5af9da6c71b2c9a0a6372e2cee1485113ec3e655f661041d4e28c992435be3d1ba540dedf8e030b86daa3b74afe67f903e6aa0bcf0cc2e1c6f25d1c1575a1c89690a59608011579185ebb58676f310e4b531d50d73a24399b7534f75d4904e0849ae7d0f101a268b5ad297ee0096b35de2ecd15931281e35b2f34676ea4c0eef017d5fbe2ef7847c5ee38fc704ae53b123faf20b4662e0b2fc6dae8bfe32cd49a5b6def7640896107497cbe053075c425e804691f2796d75b5579bd1a0876787f82bb60998d1cbd5943033440ebc6de535327f9346b23fce50d3ee6a56e000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40106ed518cb2bcf767e024b14bd842dc7a4076400fc2e7f48a4c56054c985257f0022693fb413cb1fe6526d0438ac9dc4b4357faa563383c60a50c305834db898725244e6f37504f2bbca292878d02abe8956e66df51a23b3ce2710cec812e225ee7000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e1b49b9c5464ee319879ed8fe8e9f9e3141585448f7d6de34a72ce0bd1d80262a30b2dfe82618ea3587ea4fe4e0338fe52d89f56bf6c6893c6376d43ab149a7805ecf0ac7ed27c23b9bec8696ff092311f2c4f8c7de1dbe0e755dc5fd7416f0bb1acf50d8add48fd2340bdcbbcf9da92b912ef0f0103f88c0a153215d15312dfe022800ee843d3d389f192b8e17ee9bfb64f242a517e25ecc8379fb4925fca7840772f03b61ff78010e451ef41fd57c7a6b132759211732ae51d47599c1d746a75b20a82318cecab3311da61e41b3ea65c8d3dd8e17032f406ca86362d584c446720bab9f7bc9db8a013c9cc556f342dc9576a36bbb5ef95da32803c47f2de1d62b7d78156cb74f388e1e81b630edb4d2f4f0091eb9ac75479b4b60bea309a3dc25ba81b6b2e2bcda1e97f8baec17cdd8418bc69061551850ce1c27f9feee7c623296645efb6d30bbd146148b35e98a3ccfe3ba9ab598eeaf128c504836136aa7cedd09282dbd9688429d5b96b32b4bb3cf25fae1217d5abee74b703a1cb8e2f6dbdc6cfdf7be4e1135503d0702f588ec97489f5cbdf05b33db679ebd4c22a5850f1a1ba5155ddcc9bdfd718d3f2a079f5218361840028317e56d92f62c5fb466a6a470768bb780cdeab1ef45eb7f334588d614878d8d42225ac40960b2939500000228000002240000022015dd81457199d59be472ee33fc244dd8007e42cf62cefe4a473c7505379ee4cf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023e3737e118aa9518a1d667fb4fa583de1a92ef8f8a8d190113117fbbdf4a650e368fbf155ea5364a489f1bcdb3aecaa78a74572d7b45f8c74e154d0ad93008c1ee2030b55c2c800df505c84196bd549c13f983a43dcb66ca32febb05e6647123bb2c13046eb88c981557e7ae12586cac5b16587e7dc96571397720b033e1472160164a06e6138720b0161becfc35240178432ef7ddade14b76e36ba6f20cd931c8461c943ce9a2cdd0f2c0bf329c91b96316c6f96c12b06dae13c4486ceef27ab98cdc5c39020dc218e17d8841e5a963d7ef3c6986543784257766212085e5ff661438b2f95dc7c9d0c33440625699c47436608e17d655fd0947bf598f6fd1043d4b666fb7cb050f2ddbea4e9176c9b0ee7e549e4e5732ad5b5c95f54f296c2e936415008f55b361275aa12a00587c07852c48e413678ef8df07f5d8a31fb3e76cbb593cac30f54ded1a591358307a758d31245a0576f75e8e9bc71cc820c5ab27e79e3f8e0d5c40e52f23977f2daff8c4343319c12348fb9d5ab296360dfcf7858d1620fd8132412f1a0bc31ad6d525482a0464ceaa503d6f82f097da38a6c8698ed2194c0a6de7cf9e8aa0d7ad786e8ffc615b2b7cab0d02e5f05ffdc40f0000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011f73432ae86c83349a4ebeedc1e525475b7d92d3630df7df6d07d116a667bd7c02272a4be58de2b78f20b5494bc6ae7a56aae32a8d7683098459f5fcd2416d8a8e2373924a51cc3be570302589df4fa0435a3a30312c610577e7f98c0b3173b83100000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000276d89f0f0f4a52ee383f6c28e2791421bbf36179dc9dea1f54be44b4c805a9e1b2578ce232781bd211f84691997eb0e2b3abbd4e8e976b37a41b1b6cf6b4bd7c158e78d462e99fe5d46a1499e4d8621803cccc2fd347bfbcf2eabdfedcbc6970977d1b33f82c4acf04a964270d9cc48fc835b29865947fd7df60cb0494e762cc83e60dda36df1b30bb505799d98699a20216b04b2c957ec85a876017d529c0a95ea14f5e215355093a343e7b4c63834ab0dd2c27399732e70ed371061e218fef9b078b925fdbb5923f8866c85a6f6e325d538c5d76cbf0403b5235bdf622475fb7ed54810f6c704caa83987cdb5510552bf51498b3321f4c906622fdacf751ea418793d11b4e40662e91411ad28230acf93aafaa9e019e838aa538cdb4e3254412769365c83e31675774cf6410b2fea27e91819757c985f5c908f4d4f8292dd2dcaa02ebeb0f09af42dd1d6a782a56fc84cbb1739f233d281d9c8e096106c39b5463bae224759dc29b18b5d33e0b474985a1b8064d745d24a9c1ceeb4ab908d115343378c678cf6e9a023f5a0e63c20bab86e8c1cc6eeb8815acd043c90aba1dc5c090e98490695beb213daa73c2c4f62be22e1c3ffa96d3f8f038d11a313f7bb4458a485536b7fc96cfad4b3593db2923f1dca5fe76173b398909899c2a8ed0000022800000224000002200ee384aeb0f506a728fbcff2fd54d1d69029d58eb320471c49809b3bf08ca2d4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a8e199590093a31addf943109319d4422d3d6624817a41c59539c3f79b58a162b8bf555a1a90830303fdc1934b6fb9c12420a563f38e7d08b81fe3e41365954c85325a150e7f2c9de7f82714f6e3a9723c785a7c8fa2970c8c312b415ac6439843a95d93a015c51f3295d1b0f61c83b42a65a26b4cd33e753433b144ccca44f354380c288a0a95688f10eecadfe42ca2ef724de3f0cef6a1817145a54b1531cefbc1aff3a31ca2f5075a4baf2dbd8fde6baea56f7b952bc44774c1631455771c8e500c8de50fec63ab8b82c8e6f1aece2e77155a3170a6047fdde28a5038f469276d5fa8b3db30864d7b0c22064c49c0eb66c49c0ca119373f07e06142878c196b3bfd53f7ad7d0ba7133adba5fdb93ac0274a6855d53a4c2516a5c9d4c418ef60abbd06c388fb3c81b55ce79ac55266ce44d3e8373d3d69651fcddd31c797c2098b56f1a3d3b34f8e4b9ac785eff2854c34afbae32118ff69bcbbb5f6fda7eee850d923955f4d0611411a0aeb44252bfc7cdcab3373567a58b56f56f670b4fca7cbc0014e7fe3b515e0d4cc55fff04aefe1c02f470a07ebf67c25b93c41dc0c0b99b54bc7e4b95ecd5f2393995ec163b72cc6acd053078da2c41aa64c3a3bd000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010fe730ba1a1b10e11123748228b43c400ad1d52cf8f69325d8cb12f1be16be17022859b1fc36cefd8352b41d1d558a46aae56c07b874ccd790a86aaf9185eb71dc17e8f951d85d453795fdc997df08417b474b1544a069a8087fa8053b50ac4fed000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002efbfad2c842112054ce30ac5251ef8c3566f6d0938089627f4ae231119f7d93d143fa547e380b2283c32decb337f96ef258b96189b6e686faa2e95c6c379bbdf5049b3d10493a0dca4a115ca1e6b41563c9ac71aa3ec99a68fe7d88c9ba90183ecd87f1382db2531895cacbd2a8427bb1efa1091c2e7656c4c667df834cc46ebfbc25457fa5451dca4415301917953667ce5ec1af3abfe5de567cb1738aae896f1467b9a17a35190d92c9c2c9ce351b69d8fb93514f51d96d405c36274e543e7881310abb3eaa88624c5511df91c30b7e2c23bd08e62d1250b46ccabf96234214290b610ff5de4c40eebd1bff21a647e707fe4d037ff482dc8b7ba3df5e7e7d716a14688431303942080c3f4240810a2d3a0104b4a0bfe025561419e05c57e647ffec6dd0e80740053a32947245187a85f8b750540404d6faebb61c36c33b05ea80fdd36ddbdd01d03b3ac4f572b808d1ea24422b161c4aacd63930bf5e9ec391235828b5885fa1cdb989e5bc2167a92b0c6992028864b322fb2f89bcd538aa3af4c2b1009526f0d2de5f1126c550e28aa5293c56dae742ce1035fcd012aa21dd418797542d084aa1beef8a13ad5c394092e29d6be3faa2394c48779919c7fb3da752fab23fe1a6cc48813e7f5b04a2f4771e1eb7e88d38f4d3fdb58171a9760000022800000224000002202082b731df1ac02827028a3ff10031c62c81881f3db45b8a73b1d6a12a4e99440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010aa7177e7e85321f2f84adc62326188b795e23f0f2359229dd6d774bf56c0a5a592340d63263c99287e9a08d5f3cf8284a3dbac2159ecb04a8f3b25bed7da306fb8bc80cdcb8e352332ba2c1171150532c8473b881d58c5bad5f6a9383f69ddd9e507b88b603f681887e5f7623f18a200f8328f88ca0a1f375639f2df8f8b7b3c20e4e703ef5fd753c87a71d34eb4fb11e4279a332474139a6714b951590fd90501d622e0378d7cda7c1cabfc10b07f518dcce1c1c090cda383cfa8b8d1796d0fffc3b185d9baa2d4ea94cce27088582ba34b6457fadc13405221f565e12febe74264e23c018c5d383bd0128637f775968556a8b887facf25fca706040b807b480061ded71adb70c692cc4256913bac9f0dd437d311f4aa24d19b8ae815e2afdffb12d3b9a96b0d74eb58fbadb9eddef1c560ad587517a871ff7be9a9dd170f2e7f8d1f2c86fee0b81c708b52bbb499140b5b1a92a0b21fcf73dcee5024cbebbd1ad5106f2dd92dbc35e6707004e619c54c79f3badc0d27423fa7d67cd917435b38bd8de7e2d4618fb377f79fe8d0f35181b9b42b87eb9d6d18693f52df5a9af60ebed9c278a374a6228e18c9d166515912f2a0a278f3e0c95d922c589a2313000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010e76342ca8def02269384d39af91d0a3b027039b69a3d4562387f680812835bc022afa97617f1f1be41b3aa672be25ce653ec3f00ff514c6364814769e42219e1d22ad7dd6bf23dd2ef3133773e867844a44a51ce150a4fde15824a2b2994a147b0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019c80967296d05bddd5c6893317b3af0a8364192ca762683f3d9e16d4212eb8807d6f7a9731a561d2f1dd8bcc8df80ee4657326ae7729c5952b24ac19cb775a26a1b3a0b9dee57c7215ae61ee18608e97f13a2c13b70ce5b0a137ce28996f3c602b132778ceebf22e2521b1131a8c067d0134f1485614d1a7c143b6d199c719c447c0599e86755565b7ccf34571872203530772727da6ffcc627893b2555f82b05468cc15db181930361c25ef5383200af234a28d31f5b246f61db2df8f88d84f43bb5f264147bdb5e86dd8b40459ec8eae53973ed01cba4d26ae06c0eff543a04b1b971d8dd79e74fdc43ed1e5d96bd3fb653f444337ab6aa6581a1638c1b39cf949fa4a3cfc56f553343cffcc96808cfff4760bebf6031795db56451d8a020edb143961604ca7a41faa558ee2c7f2cc0963886e08dc57afe8eb8199dc2dced7590bd1fe52517e31c78ff261b04de374cfd1865f9289becdbbd493aa70b94f26cc9f8349659e957a73751238cc592e6c780c490adc99fd8c90448f7b477ef1dfef78a8026b9b6de10e96c9d18ba78f152cdd649ff5b728302e339fc00582db1a86bea8c8b2c787e2024a35ad711a6a8a9bd7c4d8b31c64c626c0e701ad8c3d9b0ac1a532d3eca063b14b5fc1dd9efe9eb9e875d246df3acc36ba5f29a4711af00000228000002240000022008020f64ec14f1f53e86f88919714cd8feb6f38e80cd610840893071a366198600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5eeba377236cfebe3cf1424957a2ac7bad995b9e201c580f37a4640f414f734c749eec1f15e312e74ce51e2ed21610e1d4fe75d8debada01afe70554eed88420608431aab08f2f00b75b5cbdb1d4e0abb2f9aa30d14ed3347aca87e4f7b6d4d39c9b06499fb8aa7e8cf550c5c3457b10dcd40e6cafc5475aa94dd2d25afd3f9f5c6a55247b2f7ff1d52eff9f0caa35ea7e3bad67752528777588bd518d8cfaeb7810d6da40c6169753fb9e350a6849715925f77014836dd9d8067e120302ba8ef09279d158e3ceaa796f73664bb515f37fb1e7fe734e47e8719d99ab8da1ece3695cf10c24cbcb8f627cc8af14a708dc11663a8c835797551b363b2f2bc5cae1a10b03b8f787be84cf9e9791113dd4a26141fb70af5836274e2407a29f5db6db823fbe0e6b1e6cd0dd168611031e05eaece00eec548b065ee0de3beaed3e1760d20743b1a66586cd5dfd1d36e22a651e048dcf58bee2b7244fc8e61277406666c2c29cec069b7fc32606e32d33ef28a80086b9ffd80f228d94315c4b807aea6c18dac33e8d866aaa2244ced64c620340cc71fd6ed4201ba8d0ac8f9753bf580d6704511dfd5b8fa432c94f315ea555cd49b08b0fc9eb21902e36ecb7e8f7a94000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40126382dde4074fcf7098d083d2f12628440ab2946ac4f6724a9aa05fdb1e0de7b022cd0f4c2fbd05fd35ee8cca4dc4e37cf5f7ef4da9fb5e628c050d32b228400f7293964f949ca318cb71807e28b8c47bc6799f689349b09183aac3ceca2ee7bf90000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f7b837f13291bebc052843782c564bc4d3f18296bcb79ec4dc704f83575a198636da14b68357edfe73bad863ba1ec28915aa3f6ab8b1c21a3520f6721661637a0647a12e1b95f212da75daa81a546bcc84691a4c9f066716ef8f30b2b8cef30594670e0b2d522e1698220d8963cd1e0874e2c1a129d20b4963ebe176e42eeccdd750c59dd03af2881d3a5ea0e7e5224d700953689fafc74bd81fd9452c81d04fcd4682149c614fc95b6d94ad37bea24dc6132fe29adcd0a86f398f014b5e1f302bef93ae5cb7d0f4b60b585680ad5c220293e5f48b38ee6712e6bfd8d3a28e2b0b8e2b511722e6add32f024cdba109a4d5ffdfceec17b9b6160f1d5351a3987885f53102ef7726061a4025c724d8c5c82c32c5d3dd6b39967c7e8804109af4db36036aec4474d8621056009d86dd98eb4e70ef1ba6861409a154d976983313320763fb6a431656035646ec1cf45f82d3bcc1923cbed5aea2147629dff86842535b8f6c47e271739ae001801190e4df9a86ece725ebb54d0497f93f84ca47f956911340be407d0aed9827402e18e8956ef11c7cd6936b226deff34b3f80fe3fba3087434b29e731b6f7fd9b6a5e1cb6338b1a96273f6148691a6125c976ad4f1644c965bb21af24cb103fbe1f7e514395a4015a0acde1577c0ef03f56dd498c0000022800000224000002201c60f0eaf42db175706e204616d7983c4b02f882b1d284ac3d64062d24327ff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af2050aa6ea2c7a894c050312aa6cc1646c199bffc9ea2604663deb4ca62ee7435a09ad4eeba23f05570fe01a9f2265515cda3bd203785c3e8609e8baa4a99a07f7e4709a1051b482c38199a221d055855f4e020c087bb6ef767bf6380bbde09a2969757c418698742dbaaab0468c04608913e3c5fb16cf9cddb2385344d3b69d40216c99991d18ea683ad570e703403a4732cb3b7eb41b9aa0116587df67a38b2ea8d1831d8ce8974cff7be8e00dab89b998a54c3168c216f40ada56795041f42b0a99693a86bc4186970f28f7fbd07a370262bf4b08b858a1d2f16fc84759c2cf2023317715dbf4dc02ea7b0dfcd02cfc338874264b1863a54822347e1ff83750fbb1c01157c9b48badd1ab4e5d3b885de867bbda8c138ce03b796963e70b1c317ea696917e4d72ab9a7221ec0a4966f2421993a628a8825c0529c6a91040673b671a391d77f617adc39fd762120da19583d91f85fa0f21fcedf67ffc819fd4e3f1d20fa963c3500b005cae7d488102f1d5fe89e242f45c17a330ec55fc542b7df6597b0c97ff05a0ba0de0819d66315a80817194bc53d81eb99083bd106e6f2d4823cfbc464571bf0ff57af87e8312c134335ca4d3a42a35079199ee4168b000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011f9f532705f91cabee8e8ecf9d6c502a12b511702e5705dc6f7ef2d1e101783e022e7507fabb6173ef851f9cbf83f9bd6ec8155c8f314ddf8ec96f7e0c6ef3d90b27c83e36c97c2bfe8e7cd013614208e28156b1c4789057c84939ee7c43d5cb710000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084dee65b5b6e3b70a68f36212a5268912225bb8222180dd721ff000d9be645674bb163fe01652f73f372bdb0522c45340c2164133c63c1ef576551c606a4a73503276e1e165f1371cd6475c2c868cbd5b94231abd0358110ab5aef47341445936ee47cee6c9847dce3cd8187bf59d9265c014c70d42caaeda4d0977491389cd7ce6c1e5d77bf4478141bd0cad2ec6131a65ae3f9f5936c6851712fd99c05ea654b7225b69b2ed615909a595bda5848454c0afd16bd1fc9494e2619603c8edc6877ee664ce47f9259edd0164490cd7ae1f1ac5c068152ce79175af679464d8fff01c3cab9c46ad34cbbca2360fccb4e4e5b9e3dbf8bed81f5f746ed1661698878e6e5abf2a187eb14523d3c9e87ef0a01ae4dd193ce159870d4d5c058ff04df8138c9eb5d9a6d416cb54fd1fd60ddf3928cc9fc3ef03165c9718a95c9b8c2748e1fac956d3f641085fa8f1fd534d01105377db9dec0301313f8084b5260fedb434fb2a275561c08e5c0ccff4e752411fb6228db29a4d6b14fe2304bcfe22152075721894fd8cedc90bfbd6ca6b3ce8aae717b238d9317b5bf8a29a9bbdfbb73668a4f232bde68e435d4204210f3d59d8a055f97788df724d6eeb0a6db2f94f8f5b385770e45013b309170eb8972e1362c322224cb1a9734df705a1071262b08b60000022800000224000002201461bc835fd1fcaec2d819f2a25414946fa9137507bc3154e65966a91061c77e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c1b0d1be34241d1bfa39bb20771a8d3647b92a12c2c8f98c2b26043444e814b8968ff5dc63dcc019789a5fb7106162be71ec631515c6e9ab535b2775ed5ddcd1ec2ae6c9a9dfed4de7af7e66e8ae553b58744c36598e524d2cbcdf5489aaebce4264ddd4c6bc4af3af72ab0ddda8f6233a27bf60c0e7d56a4922f849421f3627e4d1b52dfc22fd0500c77eb521387f717d4d28fbbe9c3e3af7545d70431fe301ff9402da9b9f6186c13cb0128f2e5cab3540384b07350a9a25eca890396b6ddc8b6256d47d8feb1d26b9b5ad73c2c7f7fb3b59f0b49fc455853638801d8a97edb2686a92ba63fc6c95d37d3d29074d2e42b986bf9d5a9ca2b14a674a58425e767d75c111b30e0c373d4f6778985c1f79dd894e0f1198231cae0ef3ac6d88cdaf3d4a69792d01ed69877fce64348482ac4760d76f145f7d44e0cef70f6a3cfa506fe6c770b502c2411fa3dddc378ecfcd176d67b1a8510c65d03683b0cae6fd6ab6d0211d6e8083651b4b1ba329b132604fce5fc60c1304d2623e63142ade099c6c7e8de7ee75196970577e6eecd612a72d70a8e0d5b0700a864fbdd0cc7fa5f9fabb4426542147dc1a9d3860038efb063c79f9f9cc87a11b2e57bff425f6db000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020da4a908faca7f24db850cfa1fcf8c45ee5b8d09a50d2ca426d87b28c2a9c27b286625bf4f21977a6d83eb595a97351301bc9d1f26d8e61feea63608876b8f7e022ea4e956ca0c1d1fed29554dd13f93fad99ffd9c6fffef99a7dd2e8ca5c3bcfd082cf034dae42468ed90ff51bc1b534370bd6f0f810de43f4dcb5d851128ea880000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ab47460a707865cda06c191a90355f87a9da7c5cb65ee57064c26d5740259b1805944c3933b05108e91a77bd06da6c824795e0424b98b37fc3c653314d50bac587b1847eba1495d6998c01f13fc9fde0de1e232ae2b4fa354aec55b49e60b19fc82797bdce8fc0d46cf8cbd21296abb7c17e076c63ad2b3f1dc93ac99cea28659a7470bf6ea7a78b02fa85814a2f29e8b5344590aa43057deff7e1fa012c3b68faea7b713c5a704ecf05b77b261b5a5199d3b35bf49e2847383b2629094a540f869c791133688d317872b95047a9fd423182d729deba68fe5df633ab015691b16c45632fb39ccbbb51c444c996740188e5995452d2453c2bc614d77b4f4150bb461551887f2ccdb05e1f0e0b1cb4731b03783c3b38084b687380469edfa0973fe89382fb9fe892301046267652aec0eb3a62885256fd3ad05f85d20c63cae528474e63008b7a372b901296c4572be32cd6b0b13709d31208c7feaa337447a5dca3a82d2052190ffff070e5666e6d383fa7fc970bb963f64dbe4e99897e522c55c6211d5b0e86bdac0baaa1fdc9fab4163cd3db72bf07d69e1e8d7f946a251c9df909d0afe25e11c6e206149354bbdd986f26bd1a5f3a6929d33a3630b51a725f04264bde9fe8970afbdf716c83b4c2eefa1f70c75750c9bd1f3979e5e4982f700000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c913b0ba1ac5bbf1e65697ba050242fcf54aa844a72e60180465fea01a876cc494d33c2eaa9e23cbed4d86de4957374dc1d22799c717806e349510faf7b9874b80d56f73aed636e99248a8df4d36b3efe209e7a34a2c3a4ed8d15c1fb6ff6c6e47a6a6681b6b72d725db275bdd3835e02de938e5b6c42fad30f38e24db40240e1fdedd9692da95b5517bbb2f0825cd02b792b5b96aa518f0beb36c80b97d09a5a9f2a7e04007c708b15369d656290aff0d0dd705004bd7152a2c700b97fcbd28ceadbfd5e372371161ed8ceef4ff2157dcb452c7c7af7fb964a015b8b07b7e1538f7c0e4b179c6c809dc8ee0adf2d2ab8c679ca4f575208577f6fc0501e749971f9cbc845940396525b2979cdfe3fa583859344d4447c6d07b10147e7dba8bb59ab7201f28d418e405e66fa99aad4665586892d6af7072733a3a467abed9224c9e100168cbbeb5046f18e97059523d2ec927d17e7e4a73dadda362db1ac1e9b7b315b8243eee794c870e842dca143f603e3a9f5263655bbd70165ce3b5d4946b9dca283d29c90f2b4a7965cb508a1372fe2bf5b35ea5fff101bc098f06e806a581fc843add24a6863b50454d0b1bfc2ccaa5111bf61e6de07ee16eaa18e0dac0893877702d56929125af461b62ca15a07b39e53a16ac8a110712ef47310cc100000228000002240000022024773f45c87c9975a1d94cfc51ad519b5f095747b7723e94d812fbb8f6db484000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095e832b9d63be6942a82cce214dac585e521ea708dd72c56821f655f272bdd57f86c0caa3a5e85dd6ed22533287db592b34f2c1b45af6dbd10c48e6d4d0ef85b66e90d1a49eb951cfd0ffa7ff39ae9eafa57b8f614a1803d72c720444b55dc62a4ef7d9cb01cfdfb8cf647b2eece5f9b1efb5b9d689d9e0e1626313bf24b4dd144d53facbdff9de5fc2b5c22f2f086d0f5b11f237dc2550d289c24b9220d6d3a2f0bc47e6679e8fb5f2ae9fc2ef01361abd6aab88b194f8c7b33174b289a65f66a83b4d08d967ec697a3a38579e9e6b8de7bbddc8248c0aad2da1c2738c66e3786bd1d9fdc9d59420a80310327d158861dc0a16db87d415dc0a06e5f766854d6c7272b4a7a59a1181ee13769202ae92ed6d7474c07f2c55ffcd798f798451c53f09e12b38fa5495babbed7f0e3b36fcffec38355006e5f2ae13e883f087523496225dc10e37a54f613a7f3be6174d381a73f267a806230280595482d9ddf490d140b453fd11aff6ff98dcb0b58b7f310ab48ad694e83fc160b519701cf9eaacd2e821fe779337b2aad4b279fd4820ae1389ff084a8ec7e0acef5909a39ac06dbeb550c8604a7a856885b2f7757675317a39c835cf9c10285a8b5309b6d316de000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40125c9321009474226fb2aaae650cce1918eafae02035a4b5051268901b6a8231e022ef440912d46f61f2e184421dbaad845d96dd4f73eff6e179135cb0b918762841e338a0189e4b5d9639e5e5d3ab565ebcc2f7326c4ad28a334014fc517ebf3e8000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bfaebc3237b46c32e5df71f45a5f0ba3914348c454889fe84dea2d7b7a34bb76d53f966c78d167c79226d53661024ebc6ae420b8b95cb7a2671e546497bf7a6acb1a70167d5f4fda45a39220b1f2f045e307d046f881618bc8c1ec3eded85128cd915ead803be64a9f1a39ea84aef2a01cd89a288e7f902578ac0745c2b4f6c0f7a24ff6ac6ab59b514d6fbf59a7f30c073082453d7cc26a49cfcdec016c244b1a2429af40a267155ac16bf0cf1a598b2c5b70dc85e9d4e90cd08408e82a7acf29e5246faa342fdfd3384bd7fe239f59684008b19581c7537d4c45f470918fe1cb28ec25399c1f0a24ebb0a65621d854410a797f3fba8598a8fee451151929f747c415b96c1dc633c4207b81dd06d4fb894226a9b365f0c660e00df1f211b22b58be83d27304ae2fa5703d71bbd42c6dbbc7a3a3bebea343af3a591f04f100e5a3ad53ef694d9e55888c74a741c90d109ba40e6fd04ae824c141356d24d403129a874b8845142264006f83c1ee171e1e20625886902ecfc4af93acb3fd68cd8760715a598072cad50132945ed19c2de147d36c0300c16d0fdd2b3dabe4bffdbc66e4b5942c772fa4d18c9c2c4670fb3ba042615f2278fc13f467e664d522d78c909b6aed8c3dbacdd25167047dbdde9f72e8438a33480cbeb9179479c25fff3000002280000022400000220123da7bf052f3fd55af35b5c273f3576d978bd984a2c02270c12b346443e994500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a96de381069a7eebc32b07b9fb5893bc67358f7104d6172a9a1554eb3eba7899a0531c1e84d3e359398f3ed8855603af2d8541fc2972d787151f3224684465acc21932e63a7c0ea2596e6e1a2bb016196fd8180e2d11cd2f2970a015f68a81ce1cb3d5e001e9676d99aa36e46291f75eb226e0a0c7808a7eda73a390f30ba773368751bccd6208fc0dbe59b6dfabcd8e5b80a02e0c02a6f7199399d28f16118dd1207c898851c6c4d4efd085b9055d514aad5e81ea8682906db0a24c993586c4a924a46af586c1351bfacba3f0a8d17542eaed9fef3e93316cf639934e0db69d337c7f1b6e0bdb852c93a8f947b8c8a96ca241222ac897d0dce783f74d40f1e0bfe6eff1d38bb6c1ebeffb10231bd86568f20eb70982494a638b4b58f92faacbe10c803b011adce06c70d9535955d3216e76dd44853d99ec033fff9b20f2d97d9040fc0670c874164e08b48d95d6acdcc89ddb8bd4138d0ffe954e9a8590e08178c32dfb8df71912b647b0241ed77ca8db7e02aafd9760c470fe268784ee9f733ebfbbf6cd3dd66756f6f43644b45fd64869c7e5081e93366337844078d6fb87113a9afc4c727dd49734144d4dd93a226fb630875bd1bb9bb0d84150167afe6d000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80200b7824cdf9121c2aff78a763a499173f881c2e72ded7c4fbba873769395baec2c284c6beca1f351e9be87d37f58e2e7baac843f185ee124a5e9ae7d273717b1022f75678ecfb9c4768fa17c96349b8f56f93ac4785af0ebf03772d61cf8414f54304ff975c27c9a4f5fab55bb77cff4074fa3c1260920cc4dde26696bb4275ede0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f179b346694f53222761a91f727ca6eed18a1e9d4e7cb493ec08289de51f1235e9ba42124eb6d95d9a2a43f6e614e9dbbb997fac2f3c7f60634116a88eb81995e94b2d6f8655400e0dcc17ee27df6d5fac5d0a4b52817332565e5cfd13b042a1c53df5d1242b284cc3d38f99492bf6e178c2a0af831a0efc538ce422b94a1cab15bdbc1e295332e6c38a7e3fee4ebb09db27b1e152079ab173b3b4941ff7a014610fca854906abb132d351a79a5db306202f70d6da288e574d0e5b431aa73e4c1a5e370dbc85c82d723d39be005d542e4c28d2330ce890c2c2207aef18e60cfc85e48b549ecdcec4df0f8a43f2125b3a657e17ec94e509a5a975a0e64f1581922cd55b4305509484360f36c2c4d7fbf679f1b61b8ab790a5141372b380f1b12e37d5cab3f888f124a6db2a67b85feb940f598b0d9cb29a9bb6bf7ae2444798f779963f17d7de20af34096933ea4f136ff0eaf0ecf1c9cec00c0ee2a2b0c0905f7d84e49d218ae0e3e2aef6c7cf4a407faa40ba31c4c2105f46fc32976c259055f6b83cebb61f852e6e912903b633a2f690de10329421e7e501fe39cfac901f8a6fa1d1d9fa9919b3f9ddf52c0452de7cde274f6392efec87891a1b201af4f942c1ce5cf962e60880ee1034e0a124b4ed2630eef5291e4ae24187ef9c1860c83000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000acbf3436843c6c0137c61d7d698d328fab7a85367f96546c3aba94d6c28776577d14ab5ed711e8d5186d6df95b435a8bda835d4669fc384933029ac484d4137bace02b9490760b40e324eac9ae0eb34f879d3ce16cbbcc8a607e6a11d4bb2781d58047533eeb7053e71018a27adffbbaf92247f607aec272c44ce3bcb01c1fd2419276783a8512e71a1854669c1ccd8c65f9e4f5622f235d919a07c6161b7aad5b8412e2d0236930662d82e1f564cd0e2f3ba1685b48c97b7483a5fd67efca347724b227aac0fac9b747ec1cc08a7143cf8a3e9f87fb5747489cdeee8467410e0dff87bf8519888dedd9cf77e969e6322a8a9864305eea1ec03afd2422b754b9ff5391de11f5ec7e14a81a1998ea35f1e0e0762cd69ac42a6f08dee3ebacd61f7c4c4aae6b37b22a63fbd3434286c8d99424035b901c199140561a2b2f1460c529dce1780c5e9eacb94689607cab7f6fa2fba4a382450ab5e9d06b3e73dbc616e1f4c078a1eaad6d387a1b3bc38307b649dc5b6002c3f2824a7f118494b95f3ac20416582e2540748c0434f56f6860215a3aeed14bdb41e497f94c7bd9b2608310162dabddb740bc1927fd6b428d48a42906fca7161d0dba15b660434b2f551b25c5b76ae0bbc6ed083ba0ecea376c9af1b91bb767169aa29523fc41eee844df0000022800000224000002200710a2d839c9a5cfc8a0c27d61151a449052150dd846555610676c6c2e908a7c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085a2fe4d93518b40805c137118f5c6fac9bfde521da5550a48d8f03a788364e595448155398767ddf8b34050c79f389a233b00e4f6d77b12180de1c3f6d4d899abbe1db254baabd9ffaad04202c3be97c062e0453f74b6003e8e3223054c12040cb5d21eed01d4ca992cc93979d61b5c1393b43e339109c84f3a16ef595ab9bf8eb730d1eb9646ec0be37d69b622101444a33a42bb77ac949ada2650cb5a0e7ec1ddbd17e0ba801b1aa6cf1a0195f689d08c5ed9a108e26a8c9e578c4637cd1f51b9fbeb6bf8f8a00f562320c4a8ca8a26a9c95e527744ee23306872c28b6c969ea469cf35d4dc08a79b95ab6ea44677296d0b1440222a39db1d5d02574a7f9cbc2ea733f4b00d25e4955d523db426aac7d587fb1773948b5eb86ec21c5ebaaf1389b09a37072557be1a004f0fabbee82379676bf62848437eb866c628198e54896aeff299ac194dc8ecb9a0a00247c9dc824445baf6403550eb7ad942a310c8e00e61da8f2ebf7aebbd0b4d1faae5d2dfa7bcd4fd3b689445e3da0de5df6a49e147c2b75f3f5cf87825ab5a90bca6ca0efa706dd4b5a96cdc359b17726ab69270b950fe5f60d3a3a3997f030fb8f307bf78dc07b5c6e895d4fac47a71a8bc4e000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012b22e2c78a16125437df1b04e97fe5206f799d3f3f1ffe3ee80cb744ba9a0b12023007537a981d70f3b9d76980f99949d9c6cc303440aef07218e348bf108a49781cfc73a69476f5cbbf25b932f52f25436e346a6c188a4585863313e4b2450ca80000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005076661682aad14abb2073c18e464289afa9083274adfed818d36f17a9c535e552acf238fa4eba4457b95ac1aacdfb4c9b5d01cf267d7a5b5f60ffbef71af60079223f376b7a73ee54ad825d5520d0d9475e59755e33e2471d146dc1b597ee762b95cbadb5cdc91bf719532532a401ce64cdae5e3c97c7eea37d516cd308e2ab3b9efe9e3a44e6ae139b4a7a94f69c0148e145d848c7c0e4cebcffa601f4cdf636f7b08534d05e2d272f2925481cc7876cb1612cbfbad53c833b9bd5f954f6976020ba6bb4e08e843f3121ed683e27b6d5c2b7ce002a3dc582bd63c050af12a34c0256e4b09b6630d320cea851c95964b586ba13262d578fc5b7f040edceab65d7ec3a77421214cb1e6e14c075c93935bee9388e4e841aeb0c3cdd345219c192f548c88748eed42a408ee06f69189752c6e9deddf454e744b07ff9714d80cd65cc29cdaab598e1fd7a0da5a6106a8bbe68c5168a1819ef2cdb6c4abab1dc9acc516a794688c9296316df6afff3410990998d769d96a31e21064b4f6466573bebf90f18d6341da634e145553f78bc9b94a196fcbdd37aea6355a072b56d5abec4005bf176827bf682e84f1a3665a52a4a0f5cd80d224ca2e32ba23473378ad6134eaa20ce24e284dff3d761981464928137992082afdc85e9a284f04cb43d17e0000022800000224000002201018d4a148ec79e88c440dc6631b416d98447fd8759ee669a082d0ee79aaa3c1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a2406a9c6ced2c8bebf3cf1517cb137e86fb954d710f1a663470ec4b2bab4b7454420ea20357e4d2b97d7d2de1d42fa792a0b10ffab8735443f1b54a08ff98894e72e112a2ce64408bcbe5cde2747b057e3c0d26ee4346cc65c760b64a6ddc4733986e45b7bea38ba8d6923ff8c060bcc922d1daa39cb3c14462afb10efd2ea57202ccfbbe77c6026e1c87214b4c7541ba5d7608a188647f1f561bee588ed63585c254f265f5d9bf8162ed379678a88367fb863179a7850bae4e2033dfa01bc2586bdaf892a9fe272731bc55d968969b9dc3bf3204be184f8ca37cb772b86e492d88a0c6275f789c21231b051690a75dfeac6ac8045df509d567edb79e068b052876b285ddff237f2fea21ffde3d9173797bb364cd7423b6d8fdbe7689e84af798c0748131a818fdb2f08af4ffa8607a59254d4d0281f317a1370f97d52b6ac569c284a0fd66cad13040e94d589822f0c4cd1ca2915b8b37b1a0305efb6b4df0a6374c6a18e8f698e45a7ea7824874320c9bd499a17d4952dda4d593a430ceabe595806c2776a7e01f64a2d6ddcdbda4a19574500776ac9d54ccb67f896102dbbe1050860439ec477cdc7ad89e2418a115bed7f96036b308020ae380077c1b8000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401260ff40b06e211657abf513ba964119ec37a9b5b980ea781c9f9f5e33a86cb190230118d69abf327291fd11455d6d2125baa09734694b79962c1e6e0397c80b1c92e02fe7026bd83f0019db426bdcc8575a3a5e5e22fc941554b53904f74d20f8900000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000235a4a2c01d8dbb8166b6a3b9ee5f6888a9349d2ebc0283c3468dc95178a86a06043d304192d3d8e1f56ff275854cc80711c49d19df58919731f77b43eaaa8811fcfc83908446eb8991d3bda23e098a0396daf7ef69f86daff1b3e04a44e7e7e25b1b705e2537af61f22518d4e6b9f3c3ca44431cf0bc02369e71871d1037ad77ce4fcf73353f7bba94660ff3c64f3a4414cfe6ef8acae9743209372378231ba4de17aa27840ce3c6d0c1943f6f24bc28b1fb365367d58b596ee1ab2134f081057dddf034aa9f2e218e02a64c6f1773865bb5c39e949801c07daf89fd04a9c3f17bfb6ed97b153d9fa81ddaffa6ee8e44870b8bff59d448364acb57f77e8a7c8dfe792c0c1310f171a4adcbfba4a64a8aaf713d07c0ed46524d5a2b33f7ebfd59190d4939f22825784cfbb4cc94337db3c96b9e8daf7eb063eb94a9cdb27221f921339e92a9fa04e5188ff9692e2b09481cf5970e1bb7f39f7c42761ff2751b1b109d7442ddf1a7525e63546872c6d6626170b55f7058aefa102c4593b6f180498bc9bc59f8245f93cd2f8f097b0051370e046d1406c24a50378dee468cfde725f39b3782e90ca002277af58fa9a0f1118e14b1f7099d8771615f233052b2dd8ecbc801f3d6b96519c7740d982ff3fa073c52733658cc91eebcd93c448f2becf0000022800000224000002201440fcbc1aa5cc9220f3bcbd37a8351e020b6e9b558d80f867a6e9a901d68c2e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009dbdf993ec25ff544e288582e7cec405dd34512537dc1d047098b051966ebba63d66d35f71db2410dfc3f7099ec8ecbe9f2665104715c20a0669c8e5180bfef6af0c26f1c9ec48218bf74086e7b2d8543305455a7ee1115d26a325ed496d5f9ff0ad433cc65f05fbd97fb093a8209d436a5a585d81f7060bc0766d5e4ca2ed4175f77ecb91ef09c086b6276f007f54ae817879c2e6e12cc5ae501c439be75dc357d0e5d1d7cd58669c8a8fb174f8e240bb4aa33ae43a8a0bf186200c5a8e595152b7095e5d9bd8a576f0212a08f9c66e3165499591571edb79b9d5b8980a42e19e360b2e0008f0028515855526576dba1b3055d0a3edca87906f1900ac1dd9658557fc2b088efa5a0d73a3ce353ab5d813a1a4b44f86dd0be48402efa8b7da6aabef79fdc34ea054418ecb7fd49ac445ebe7bf9db6e58d2a562d24364f1debf9ecd1f0c2bfd170c94bd079fe1707a132d4c0b41db8f0433a15ffa7f3cb4e4217b5bbdd127fa5d3eebb8c62a928c2721e235bd5824348e52423d91836f263c4a539cd1999098d4ffa1f95f80b17d854068fac7b191c2106e58bbd6d167559ff20fed0e5b737fa5032b710ce880a578b5a59e4dfb05177455df2363c53f65a9cbf0000000400000000", + "24864085bc5d22c3e0aac3ff6cda0030fddfdae68e3eb4ba678b685496ea2a1000000010000000000000000000000000000000000000000000000000000000000000002400bcc025ed1e9f1103f3471b51035a261942af48d4e6c126663c4e7eb46f027100089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb30000010013f0971f98809612a444d0d28d0d1ff8b762e921e5e4628249e08a472b80c62d0000658008f6481599dabbbdfaace4a9d8013e86218ab873d50898c6ca072e6b0c8a2d4f00006600190b2bd9a61e15de13fdc0dd5db50292162dd32e7193b1d73f6a966182f7db89000066000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000070dbdaf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad363bf8140b77eec818ff534ad1fe35d0f0006702fc9f3d5b41bb4fd059e40c3bd78729000000110000002400000000000000000000000000000000000000000000000000000000000bec4cd80206a926220b1b789f1fa0f94c381ee5d0c9c84d451deb9c02844dbab1727c1af2066d972e2c24f29560d00844188eacf15475336f0270c052161afa7f0e8698100200334b86fe777df998ca97bd6558b9e8bb462edef735d07450a42121a3fdb17d25b534afb318c9e165a88e96d06358d6c8e78332d96104fcc58e2a92f098ccb50000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f38690da40c564f636857531090dcec19f202ec382f0473a8199a70c98f578fdda4080ebe5c8433bc5c1466b357b9a237566208fa662c42b14e2e43a4c409f955af2d90e9d12b36184cf4866a8d777859c68fff332b1f47bd2ee8c6204ec8b093d7c579f2fb6bd62a4d00b6e6893bdb91fc5bdfed7db9b45a441163b14848a7ea75f31e40936a40295970f65f174c030a06eac2ac8504855934bc0384553144862b51ef8c52d01fed3df51665c20374b73febf9dec781afdb1822ef9c47afa378cff5f35400ce466adb42a867af4550c6489987430ef3fbbbf5e3444cc6a35ce83cda465b068ebe94bd391cfa0e09e1e118faca60e75545c8bdaaf41a994daab58821b01ecec10879387c9c36cc51cce1ec5ff96fa4e75bfb89da2bc240757179e68fb7ebf66ce1e3b3a8e1b29287e06b7fef92d576f4414e2151f8225f5816d5ae9a1a5f969214906a9814421e1132b44e64ab8b3d3701f9c9991aea93c5c9f2794dde4a20479ccd8dbb97d57a9fa51ebb88ec88fe47dcd5524f28cce367dc13f162d7e23e6e686e582b20ed251085fb1a090f50526bbdc74d1cdcee344375f7c5ff72e34731fd625a346aeb95029efae3223e956b407c2c457ada86181e71eef0b5715ed2def47203f12d44cf87e0e9ceca4a0c9571701eaf4a20e75f533800000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016d74fbac46a4d0c61bb07fa3fe531407388ab6719b3eed54126e3903393f073dcb4357c28f8e75d78f8d2b8377eab1dbd35516feb8c9467eea4bca688aa08245ab89d6764e0194fb2b3a1ad8df3ccf97f21ed2b7950cda8d3af919c6681d70d86813522068535fa01662dbc95e0abf11c8636e76a0b186a431c2723c90060d85381f2f88e56a96daf1317959fbacf6e025487643895b03f15922e3b819fc498cc36677342762957f5da61023de5f00a0f6d3b3c46603bae8831e5ad7d7907c0a4304be04640c2e778fa296a34aaa20664b5e3ec417effb588cfc647f407e9d4fb6a055fbd16a7823665c28d26c76cbaf2db5e4492143d81971598e50ca0ae29bba34ad428ba15b04aa2b12d33bfabc4690a8148208a61bc655dd053ce46f9a44af81abb935a2897e6520161e52f8292973cd0051fb7ffb295b8309df6d9e2a5b5c232dccd6729f578b8637616a0ac69595e66212b597a15ab6a698d2d4ace016f114a3348508c6d6d2353b0c095e886c6c6f9b36703c2c19bee8faf57cad8992605c84bdd0481ae9aa73e94761af0ac738b4a58b5999a23b53d177e203f89ff991dc69afbb7140695fa7995405d7b1e6112bd60a4eb07ca3598b7aa72545112e076f76751498626e166b37effc13a5eb13d53211c48bfed9c45b1a4ee7ba3c400000228000002240000022001e6c26f7a9d4f2d03373b401ae08c740173f4d2d6d85e5a924f705a2e6bc234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e81e5e374584f86877fa9d3e7fe01aa14bc6d95cd02ad17b3229684bb63cf85a7e298b5b465facb3df3bd17fa88db32f59b8f9974efe20e2de92569c1e5454afcaa8c9590c109f62711c42f91963042968bdc3c2b6abb9a27cdda9f355604285be6c56f4373e065eb2a50fb1f4e247a2bad84b633c567c7c4b31929ba5be0f7acce46e7898066381c1fae6389ee36ceb0a47b06ca1dc620cd7f3774832b0b50ccb5f401a838f969fbcac2d49bc9fd2216c4dc909e2446bb51032411ed1b8dd5bfa05d222a0ecf39fc58662014aee28b1356a44bb23f9a186167a26759613963e91b7af05ccbbee364d0ae110a49adc546faa3dd610e9181f8d24a4285ece210f7c9552e42445957005da844f52a6532a8a26f7238503627c592aef43995910ec68dc1ab97ec644fd4904e7968cb2d4a1b57cea3b9df1ba5eb0e175d21ab676f4a1d34e74b7ad6f7705e799ba0815d57eea2afb02fc1fa0016c89fed49dd4cf300733b61316d2d612ca09f04b658ec6513f3f5caca17c43177d88be24d21bc1e54f69eaa05f1ec9eb80bf050b35aba89126936d6d9c8abd0675591fd30ade2a1221df310162b566b29b29c02f28152626065217e3be69a6eec18d9a5a4343680000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401161da326cb6bdb4827ab8f6a4dc0746eaf1950fcff1289db2d9dfbb765bb14e202005c9b6a8aa12626ea298a5e5ac63ecc5125f10b11a8341814ae5ec3631e41f2242f9fe8fa50a471e8b1588fc19944cb5bf18786d21263c4f219f77afb426d0300000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa5f33bf6b5ac6d27241aa923b783dc2bcbab216d8ab450b03dc5ed916aee485a1b92a80b31ff94b51dfacd9ebd8711803ad481e9547b21aeaf41edf868500a2632e7be06ab25cc966c3a92f4a1bb8cc363ac5942db082a38cf442ab38c6e78d1919ce2006f27d63f3dc4382561933e2d05e1cf935ed617047c211eaf296e7c4c0f9ccddf3c128c959f8ad0fdb6a4ee9b5fd33fa5efdadade731b7c2ad205bf4a0efe2aeb4bb63a86e7c3361ed03e1c935c407ff39c6ed5330113597f5ca2df20f71c8433ba3a852cbe6602e54f080bb60ef55f5984810ab75e7193dbe95136e9d48743e86eafa2fdd0242406d10a2095766dd30ce66f4cc1f5849f16617c19626dbd7a62f7661b072716794697a85125deb4a6903c5579e3e3959ad60208cba65b1f81571c6131b897c7adc220b63b7332d3be47da1902b64dfeafc4d392e3c467fdcc5a194ed9f9b5e8cf01c10a2a5c4742043b9bcf4779b3c9fd2ecb3b3d8280a8d38bbdcecf0c79b9808daed8c2944dca6dd52e7f9ce7a18000f8ae819d7b679e25acc0727db87ec10dbbd5184b3a065d30555c1df72b0cb449ca2fb1c7ab838b702b491cc53c86c5b2a9ce52502fb5642dba3721ddd9a7353a29b3f95a01b393c379ba0a21046403d9a01fb055badd5ae2871c9e50e4d65c246937598530000022800000224000002201fe60bddcd1d1c1c44c0e9f06023fe756322931bdd0e0270673547604ae6c3e100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1064e173d155306364ae27b560d18db2b4c627f4fee136c31c644fe453cd3686441165b74e6914b98d2c32cfe80c22ba03d27792e1304df9e3e604a3cd54917e5fb6215a8ccc06681fe76b7f652023ac8096f8299351525f62486946ab42a5e751617132fc905b89f1f7283a1ce88991f91c8764c1edfb949f2c0d4887b044399c96ac1f6339fb8dbeb6b4f132dc112bb6f01f8f0133af51d66282e04a19fb837e4b450d25ca005373431e16cdfe0f52eea2d52dd277ce051528155192cbeb278e740923a28e1e5ce6db081819704748254d61f6a7577bbfffe2cff730f1f082cf8f05f4d010a2feeeb32d33c5e3c177835d32d1a4b5f803bd7550e6882264f106bdbe7d213979efbd5cbf68f33a2c188a217337638c013065192de312f7738f99283f2068533e747cc2a32ca79f395cba5ebccfb40aaaaae52c051f38d6975b42fa0d92becbd5868eef892a19d7e605d5aa1af28c5737542124be53e9c200876fa6cf48aa1e737ee85620a2f98d173a4cf2a9caf94485e2e912c2a822152aeec20d9d9144277b271dd0797921f4a5f301420ca233b6285a783b7591dd6ef61e29e5c771b57a6360c0e2ddb482db6dca6514a2d8cd34002adce441ab2aae86a000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010aa94927201f8c454f17b5c6a4e09273ab6168f1bb7464acee6678ec1f4cf2a202006235d1de4c90febfba292682716a253e40d5a04c493b9afcded4589ad7848e0b7d8376922e4277082f363c2fa2e8aa010d9b6f15511f5700f4848dd5e97d34000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b2393d963a82a1bd93a9b2ace0c7c5d9727a29c778f9aed1e24534a2aa7839f44132a46f1b5ef3df5b422e72d55b5d0579fa0955fb6fc0394142fe046a47405f5a7b733632ac01bcea88001d103faa77387771ca9e3da91093e9ed75f5ae8fddace5c73e481f4cfbd550d3c837db77a57ec81148a28c8907c0edb6ea273a2200d5a522f77395ba212d6b9cd2d879ff6bc5dad35514426b868b9923c18b9123beffa1a87deb12fb52a5488a9ef56ea27f820a3aa109458266ca6d01ca9bc3a3f40c2fba390cb540ed7b89577f22c9586ad17549a27cb226704ab54aee9914282b81f67c6f262cf3407664589e0521b3726c45eed2b5f0eede51d80edc1de0c54ec251a74a9371c2d323efab6ee01bbf4fab27ed1ab6eec5c998a1e10a7b63fe84ff647357621cb068efaa961463f264d7655bd871efc4961b4240c192d75f748023ee461d2c069cff3caa66f386c1b5c2164a818807e83707633b4f84acb8d913c8be74b9890240f6849a6c8aef4fa863e783a4e71433fe03c50efb7ccd91ea19771a64fd40a5f741b73bed02df562b2212af4eb382928ede81ca1465c07ddefdd75d67a8647369aa914c72ef70ec815112ad3647ed4c3c97ace8f82a8469a581f5c5a1d15f0e52d5be31d5d1648746538a443761e2713f963de8ed1a96b33510000022800000224000002201eb96b35d94284e4a58a8b5ed61c15119c01268acc5e28adbf0b2969dc14872f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e4046ec6544a8361262d34f48e313fafa9a6af78005ca0ae6eccbffc823e8a79e0c991ad5f967b08a34fdebf5516b177b275f38be5de7e1f43a45aec867881107a2ac94b2d8e9f7804fc55b304e5c7262761eb4dd37025d88ce4822ee32a3cce4b8975e9d55993bf3429a0d81cfc8d565b2b1e46caca8e993ffe9a7b30d4ff691badaad1ec85d1cea1b7bf4e5b340de2f8efa90fbd7d2a029391a5bea5cfdd4ec81645401c06da88229bc9363590afb4eac207f8c7b3921c5a35368b573807765a13034d0a3bbf763a7ef272a65c1a272908334fd487d45099ecbd489cf598e3a0c6bd23e576ceab2a8ab1fbcec5a8d6cdcdda8ef244a194333de585ee4a8097c376ac585155f74992bd72561a48fedaa8722601efe1e035c3f6ad61fb112ab3fe7a6372ff99fa2bff68ba908a02c8832a8d0766e3a8a4be988d4b4670c5c5ffa398782cfbe513f0d143dddcf02dd76cf2d5134c1d0751089c9d4a0f358cddc26d54d3e74b2ef27b424d208d9898ce0c17fbaf343ea2fd0990175e59f8abe837883195db64d89facab6af710d21c531d5756565a218880fbfe5cadec924a9b9d91844e6a6ed84ec9c0ea18517887cebe819f310967db6210e0038f41e116329000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010013f7bd4068c890cc3d19d6b35028c23fde5fd5eb5a8f161628f5bd1d8d71ce020068dd51434173ba0bf051c76b450a22bbc4d6a59c1310ff62896399b2b3cb1906878f1e470120ea7a2f8021013dfbb8442a0e0fe80237448ae7c6259583f986000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002121abfcf0386e9052aa099d55db0fb85c1f1ff11a631bf758d5cb596f05e0b27de595c2b135e0d221042846f773b053cbbe9d668feaeb8470842055948f1169c9406a15ffd0575fa1521f7c17cb6745ec2dd07f46884370647cb727241646d2303ce294ddefe06e194dd67a75f9fcd71fa76306ed1e1ddccafb4e107cbf44b805e91c65dea3bbc510823a1395eb54b65b436b1916f085d83b70ff8574ed9baf5e1b21c8c1d3b44b2f32177682064467225dbf4a18ba12f2988d8b114eb557cebb09895f7bf43161e853be8f4deb28e9edb2980023bfa3a65865cb7f7ef942921eb31a5a81febf42b26fba5d9c016c4f7fa181c89ecb28e6eac7db1e8ae4ca0ec576d5ec3534139e6d1508761c0e8032c238b056343d1ebb06d0aa154cb380a2d7da228c4caf4071888956e5d9daf7c91790af1f1486e164054425b7244a3bac13ddcb11e9b290c70aca3872eb9c2febc7bb81d9e82c819cd1790efbd871ce5758e4ea9ba041529b0663f78d654b9dd9c4f5dd5a596f2f29871e0d39d652d9d183665bf72a20e97a54b8cc2e644e7e2636158448ae4e3b8c70c33e5400882bc9e305e85c251e10614cc98dd11ab78a08eb23f58dc57256a67467547e990242708df7ca51dd2a79b8631b578210250c9f05fb8a9082d7f337388a7e6014141a330000022800000224000002202c46c6a42d802a0e23c31051424a92c59e03c048db90ef63a32220f5722f7ef1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f436eee28fb5ed5db31c229bd1adfc14d4dc8bf0c72c4551a6df8a64580f787584dd7caac88c71128d982994ce7865d71b7a9f5b4ba2b2e91cd174b9925899ba887c8f2fe5fb56da1d59f5ce024d7848e0e842302a2a1e6d94d3bdbb1331e42f39c38b18b23ed0827cac0a658d3c79dfc1fa0660c128cb02a3a5eb621d997f8ba4882801d083aa791327a835c9e321cc0653096c66e97d326a87fafef327b7be29059763c690f6fa1dbc0763b6e57d75a8dfc4504dc82234acffc68c9327180bf8f39238eceecba828fc5d92affa2217c13f4710ce8c9baf616969dcbb822f76c89ee8157388e4a2e8a5cb823e22452f7491e3b883074d5f8b04913c8e25ae20780736e5be39c589e1ab2a9deb783bc4f71f080475ae0a28c263fbe9c2080ad16c77470ff68274a10349fbd690234d8cd995d855f27028393e6462614f7de75270684723e55b93b6cc3467fce9bd20ffa66f9eba5c01842b42c155a7c7fde4f70d391baccf8436709dc8a2af1295eb4ad8360631256a95ddb2c7230dd095468275f16c4af35924a673b2679cdec8c92f8f47affadd96e70898679f630bb70d2c655299af23c379c6fb60f634941dcad1375fc5e30bd3650abd8948cf40d7ec1000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40112e98bef14bef6e298d8dcc9c92ecac68f181e33f81b63c2dc4c85c6a2214bce0205e167b06106a4552f6a2273f2f964e3f5afe4b03945ed2ba96427503c0e183d19f51daa0d1b3e9828d073f27c03a42c7a04216a2994882691f9847f7927d3da0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023bb011b5ae512a405f96a4317d9a9b47bcc7ce811c271e8ec44c82dd51eece9f704084b7042cc1194824b3a8f5dcec858662764535d653fde201463077b8da84aac829917fc826594c0400617eaa761a0e652a1f12d5c749228527cec6e268a7450b76bd2853f46d390a53ee86a99e3bfeb50e70c9da3de148e974b6f3e9cd638a10c2fb5ad7772fe9f8e9fb09de5ad3e983d7d2445ee69eef3499483798ed31aa3b5e8fc2d9c874b8f6510ac9c8f9c44001b858b78d7c3d9cf6f7fd6a693ef5c889c98e6d1d6b99eaed06f957293c1ca5809d02d8087eefbb9e61225758d9bc815eb7302f63bb0b96a47fdc82d7ec8ed4ae15fa5d0e9a19e38888d6ca79d58eeeb0dd1ce6e145a0447a405cffc8a68442cb5f669803091379d38606a2c5f33fa5670ff2c3daa44f7e79ce86e4fac0cdb80977a418718268d8d1ffef5605435ab05c7b25eda68cad27e659bf75e84a62cb7480c913064a41922da0cdf227ca53a9b4cf5f8594e27a082d2d6316889704b73269e77fa22e85c3ce1f0fa67c1aded948040d217bfd3e5348909d6792f285cb8395fa1223bd399e05a6ba8b5bcf9f0fde281966238a343873feac804166cba7fafa11f656739cacd995126633238869e1e6e4478eb912bb8f2a2da3f07a6bcaa27b6ac0e668f77ea8a48e0af1a000000022800000224000002202863126f99a964c65dc1259f1aa4245dc95d3ea84bfd77bf6fac9e215fd10fe60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093398264a8de5f9368323beefb1ca9ad9397f5a0c046073febf4c6337a9a00409d5ef2c419c3f6fc91e716669f1e6c91afaa4003f78ade519d19c1629af0f69a9c88f44aedbcc91944db0f3ac0037ad23ab5c5987fe89d46bdcbc62bd1f3d52d93ae5510c1cf737b05e727b97444a73f5d30b93700f190f99b944aec1712b37b3e1ee9ba80766998b9777563a6aa0a9883738afeb10c9f0902457678dea154aaea1637268766b4817aaa04116fbe5b0803b86a101320d7f77828369c85702ce9997ed79ffe4996e9e7ed5ca0ddf7eb656d185dad1b9f6c8aa2270e6497ce93a24721e35cc6b91109fbc6fa3e179623d497bd573a0f3240917efc4624d7b9c7a3b3e2597b2dc192da749c585b25ac0889f7149e33448cd42f521844d4bf720826d0e80fb53050bfd8b58a7e1a18f0bd51eb547105de04aec736eb0b48f6850fd5f63ced01ef4ecb873a73d29a118dd0ccbae7f4cbc5475ad4d831134ec301d3442374a0280adff2c09660926fda0caad6ad33d39ca8f2941d872dcf17a15dbac26280e35321fece5731db75f2cbf068971390c70a9f14678f8b0aec3a3498030f438676c7b2d1d5c2232ef52ce5cd29bc14f3fd45aa5ccc8ea409cd9234e93cb9000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012bc2309f315830b70c34d24e8c523721620cefde63e9ac927d41880b309b5caf0206812756f71dbe9b479d46e81ca9f88a153e3ccc0a14f520817847cd2962bbe21e4b20c90b1e924d0b9b0131fe4e3a86aba5ff815d922fe3d7c29fd63da1b120000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0cc5056a40ec82e0e07192dbad4c384b687e4ade383c7b77d53c2602b358e55f96dc81a0b4d2cf67cae1a04a50e0338d8e5e43cc6de6030f70911845a92a1fe77ad32ed4404322809a16a00a974dfda9b8db97aaf4b4ee544beed0aa81838b28605fdde5b07a2d7db0a6e941cdc53624e0b587beccd2e40d8062d8332f8dc73aa41961b5b524751f0b308ca2657ec9bd88f3ad69c92ac73ed86139479f956d096ef3f17e78d234c09193709e2857d2191a34efe7c03b7145628fa03a6021874363bae33cdf929b7f370b70365ecf4ee9cfeedb79f3a1b0bc53f0b0af0677dc1f197f194ed06e4c22deca8735cb3de761d00c7fcd00c4d746c2a0315b7efa8d426f5fdc4a5e9b9c4b94577a73ff9fb30ccb138abdec76354a7a95c6711f721a1ea5f7d901f9c44f8b48b7b83777a463aecbc363f867b0fd7769bc54e50c4029ee6e3f985de9d112a8f1183713c44689537d95dfbd13da70d80cdb284adeb47edb8f69cff2411e254c6b59c35aa634be425d890397bb01ad669e63333b984fd3de38c513789162e05664f0cd19b65d1786b7b2a89d8a0da74c1a5dc01af731924fe3c4361504c29161be8324a7cfdaa3da8bed8cc15681539b99acd993fdfd32f7a51ae54f379a11d56acf1889696c83f69ba8dc7398f337d098bdb9224760910000022800000224000002200beaee3148ab2fe70bbe7dda2b62735bdc06edc33e027ad6a6b1cd1e0de26b4d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086e84c9e9e1d2db61fdad99b6f0ea41e98e18767891dd782b4a4bcd4af00c57a1001e768222d52bf2bbfa82f9aecc61c2f4dc01aa554ec2b7978558b854704bbfaf531ac2cdbcf497275623770d33d587bbf0718ecf9832a3778ff390c70ebf046a140c379160af8ac4333697510218bd83ca54fa3e7e7620c738c02d69273ce764cc0ba2b46023ea4fa35ef0974bdb25ee010f13a1d185ab4d20da7ac4e558de3d375529ab2f8cf0d9317b925e1c5a0935390db503f0ef00ed423a4413a532730e2521377333f67968405fc7da45786ec7f9ad1b5264c277dd81b64fe708722d6a328d2b1b3b2ab5b7ca365ce50c90b2be4b6f992c88b7639f614cf49f60fd1bf30e594a6656e3e8e91db14680a2509adb50c05936518fa9615f42ed8f9f1fb169d7159537b6d9a7bde780ea928dc3d3c459cc26c6741a1485c9b3cb572d37032f9d1c22d4fb52d851d89313893913cf9c801bb0535d7a3ac1738bf537f267acb16296bfd232c88155d25dd251e9f920614c0a5a72dcb2df1cd6539cc412536232d99600fb7eacf731834c73c1f9a4fb7bd01c171b11e223ad21faa892ba5c4fd7fc02a43bf98c354f8d0dd4cf076a01e218c406ded97befe0f4da8f1c184ce000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40103eb9324de81cdb32cfbf1536875c0b2fa9059f4a633df8277468cec9cd757e70208c4d5c4f7a6f8de1204bc6b3ebc059640fbe9f8432fef4ccab59f5112135d1a1a6471f1573744663acfa515491788a874e153057646746ec527f66576724f2f000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000888f35570cfabef8453906bcf09c568d90fea84125d2948bb3f9be88e5406a10d3995f9b04658d365cf25ce8dbc5ec65b7a72fc3a91c9b2410d876bcb4e911f19ef70b24f32773f704ae84c21a3abb1548fb307b1080f1d23d47dffa5a3da44b64cdd95da91a9eb8bc70c9e93f8714a8cd01857078a0e893b80c685bbad71f314f5ae120d2fac7258b6aa706374d23b1bb74d82f68d5ca584bbe3cf43b4d740d4db333974495514acd636e7449f012d1863375b932ce4dd2104982392f3a8b5c8ffd8991872a25871725ff6dcab6ed43dee5dd3ff884888bbd6f59f623d27f7a5c5bee23238e976e9e8bd17d40010ae75b9570a929b3b79ca51626467be72a433f060109df1636ee5a9b58b580c3eca60f55705c99037599eba0e9b0203b07255ceadfbad8501fe670e7bc5d28d138263b2dba4d96e67b1c6157060ff30e41dfb734659f9ba61d79c3ac58f3fede99b7ba941d60f8ef8dbf6d4d9c196fab8136262a9065a3393d4bfee812838faf32809a88fa6d756f60b3d20fa861c33b5e57bf0b9fb27b2be6fad0389060dfc18114e2fe38e2a667a70ee3871a8e52db73cb8151548e4e38109dd157688b42aa41d9d2acfaf89a4d7948b93d9ed316e506da2d51996f913e7dca9c5400fa897ed6bf058559166b63d6680dbe50b743f8bf6000002280000022400000220184505068fd551b60c1132314d14e4304d8a33ce41c415747fc86deb5b5a1e2100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6fa656521a0b3711134d280940a5617078f86a58ec1c35464f41cfe3150bd1453f0feedbce8d31d12b425275d5ee1a98c738d630f9b9667246a06540414cccb36659f321aa65206a6c180ad3dfe63096dfc4742744191bf0f36ae12decd4a3caf565de3fa27983845e0e71fb898706b8d2f3cb7dea917f8276009b77a6067fa98045da4cac6c40258eeb65b832494d82dfd925ebdc0e5633969c3d6fd7085c2e298e6236410d68d15b31c0c2eae54c3a1a36d93abad9edb081f53fe162d08ae35033dd878185fe2e5cfb4b247f7b027b97fc34259c09b139a60de7b9488706b3abb09fd0b7c40c20bf9c7ecf67a5300fec568d4ee8d1a55b2e4cac3e51e1c5539e4fc7ca7c26ed578a22907c1b4ad28665c1f590d4ac51e43c7fadc6580d7f63810ae1b0f59e42e3dc028a02c6eedac7113f190dab676612e0cc010bcd8412e6fed79024bebeb35ae81da768148e20bd8fd90351b7c8216e023581cf40d189f7a2b490108c44f81103d46a818a44546b7441224a3ed041cb925ad2ea4120919554210a3ed7f23b5324ab51915eb607eb681abbf3bbbff90ad07de2d1d5a8551b1ebfcddade77475414ef6413672a321063b68b06c90bc0b99eecca3b657c08f000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022355f82eba9ed4d4284a193b50209b57c2d5c97a0ec064442c7a77e770ba09bd083c68c3ea51bc6d8da4d2272baea30d2894ebcb48275d34efbc25fb325672e7020c9422b20c34fc3fd65024677471e6f56538ae1a531bf23b17a3dafed72bf5b600e127b5487fe91c2fbab93bd6508cd3645e4f55cc76e6548e2d97bb3df9597f0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ebdd153af5d61159ca1968d569aafd61665b1853886e1d6b51f31db302fd23620975310fca723f98455602397909faaeb2dfbc62c1560ed732c8fafcdb7b61315113555f93ecf8fdb3c5e44927dcf8fc283c7cd0307c150e9f74f0773dcd887f8e213657d2a1ca3fc0b09ebdfb33d7e87a2ad11d1f4c0360501ffa004a7b8c22530d595e57b6c076e0e914b0c93b319624ae9e7d0aa5e68ac4592628bd53616b0dd1b7dca8a315e52540d804725a9674bf6ee32e948e00fd3b04287abf26d382e3dbd812346d4a6be0fb461c4500654ae9048ea4d8aac6c3b5bb85ab5e1be8892752c024f94ea0c31be869d58c1017445c49652fc044fcd32da6d845f0b0a44710da42396746e24f5915fdd76df0d86be4f9c8a4790da9577859578c2ed154e0b5cd74e4ef0b3b1639f52deb00c1a5c4bf3495be99bbf4c12399649e523bbb0395b97af3eda7384dedd062c6aea83ce49595c48e90c28f5be4ed57ba4bc25b5c690b4f48d81de60822d6766cf05e87a4adf6f6e54f662ef0d28d1939d059d1960836eeb3ab15ba4c996f5e82b12a13e08441ec0a3845fc649b84f7339212adaa1a38f8cc6fb5696d25d2f9a055c9bef7e5022e58e8b8805d2ae2e6b5f7393fee69ec0bf4bde21b82408fa3ea6a999640d9a216f93e4fe7d29a42a8dcaf48f5b00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086d39815911c674246a264b61be0dd9ca6b8c29c96f0c3b3920cb8d3a1149f215b542cc4feaba2755a3a55bc7d03ee54a6fc68358011c4ddfe0d6d52918be4daa4c54ecd322ffbfd3ae960dec7e2b110465c8c3b7dff409f3d39969af66c48fa0f292f034f190c5529163a78a24a2ee77c7a3978fa143c1c91e8fd8a9ce83b8b025ffd0c16b2826bd1b75429074cb01f5deab61264716e10bb68ed436b31e6f1abc3d5f06eb6629f7b2bae6bc04c0584973fd871a29279ba63848e03ab5d5e3ef508c995b7c23f8860d9c5cdc398f9bcd3856a2091c2b9294b00de0de436e06e59fdad9620e37f64fcafdb2a2d0501b517f14f4b1dc6c10955bc3733599797266a5eff8ced650d72e4505b9afbc6a4096e2210f6e57c102c43f34f2d298831ce64fadf355a664929692209656135e7449288031446e184e0c481374a79563b7b94756c727583d6619209d4fd5c8078c5094e32479fa5443c35459849944c9a89caa31dce815c006f2f9863b741e26fa64179388c99366c07d413806b45361f764696db4b5b3511d309080a773a188e02d8230cbdfb9f2e2ae9bb6e64314f129c24ffa0b0f07f2eb9b728627fdec272165c27d9617b703b7b547c6c257c355be515b065a8c98623a06a1d33e66bd80f4aabe9c4df4a43f2472c465dafcfce0c5e00000228000002240000022013e5ff40c6462ac80ea858783dc1c18fab368f478ada965d80a1ab49c7cd5bfc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d283bc41e24f231a012fe5ffbf95c28bed678f8d50219ce70fe8dd8785e7df292015df20d7f50224e03371bf77206ca893dedf26eb082ab7437a64f68f1618e1c8a177945caa6f34e32204a75b052acc43d1c4bff42007e60079cc6713ba3cf14bf6e3b8ac1f397777224468b67f33bec9d328fadadbf57ea07c0cf5bfd77dcfd9732d390a23e763f76266da384b8bf401b270e72c2b2f179919835d524f50b8a308d0ba9035e03310bd6496271d68c6cf3e713380116fd3cd41235a9714b012da81f91021721b4b69de5b4f7738f6c1647a0abdfbd37366df7794c3de711026cf20d76cece77fd02cb62f1866cada614361d73b8b3e06182a55b64d764509ecc2f50a71d8e56d7fa7e82209df0c16b0f0dab398c00bd3215af09fbcd05fcf7d3cd5628fbebddf3aad8627eb5236bb50c960fbd685b127c0f585344ae84986d3a0701d6f1ea6f9a903bdb266c5d02c3fa1a0f417c509a019baed309a870d647f265abcfb3ed4c47d3d247bc418568ab1e10735ba7367b05dd0f28c10687f4c00ba5ca5f79b84b4e718f4fa356d0118e66f336abca166cf124bd5f9bef69179251ccb6dd0187cf086ada1580db79da531c9f127073a573337bdef7c2dc64852c000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022279c20ea5c111378f55d295d989e62c41a4c829b1ef9e1194441a3ecbb400f82b8e45cf5ce0381fa31e1aae6e3366ed442bb06c760d46ec75a4ad5bb7a1d801020dabc76a8a0a6f98a903e44f7a722066d177e031efb214e669efc0f70c7766972fda63c06cf1a9da3d51656828fcb8fe3129b3ae522a0a03969a25b1465165560000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000999fea7a0fc3bc41ce26a235ce53b291257e212f4f0280dc8b0d006580a741f31905742d9068b35236d7042a01bdbf9bf17094f3b6511e01cb55fe03f41965b870d49a0d9f5ef054f0df32a3df344500ee2135985ca413b0e2c4e6011af63963f627922cdb16f5f6c0ab5a61b49b19478f9a9782a2c1366cff8c736d4585f8348c9cc58fa36c57f4f9f1ff6475df266aa914c4ab2c286c48c6e9cf5766268d5d41169df3705f8b2db003821e9ce16b2d938062b10977bcfb0598a2ba76c0f79fcb4ca4b957f804b4171198cef88cb723c481a94411a4bc9705825e7b9228f716bb8af8d95ac7a2975d66c12e7791d11a842dd05b7bc4a3f544883106650bfb10721aaf3f1e205ba2e0b29f1f7d07d24874a592bb6761482d20d4344241960c20831a519527d547aa0dd97acce41da28d9d04b720d26f1613fd713f6a41809b4d599517f3af8d15f73587fb4f77b6b287b430f9ad6b2429c8b66df5b562354a7adc7182bf01592725051b668f41c4e37a781c76b9f93821bf4ffdd3a93ee43ed2f31068ebf732823bc7198451eac49487edd6e41012a45ba314fa3210f307724ff28d3086b48c18244563748cbeb9014a3718f7821c88b17131bd5956ccc4f958373ce3bd4c5ee4380c3c9bcea4aa60bd82063d68909c504acd5562f366bea2820000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b2fd6378445de2a485ac22edd008009916ddd0eb91cf43e19554cbe39e94a882091b50d2e56bd937b283ec26764cbe30d137eb0e4207afa45494a7498daf0ad1b3a9e81acc753696b8bd9e4d03a5645189ebf5c79d1df72b2fb42f64c449be730816838b033abd548717c81a4937182340c660879979771fe51079bfd68679a4060653a31a6f8e9ff0e1aa53d178a291e4de4759d1516bf967644726e887f5aa3ff41fa67f58625b060f4e76ce5f1d528565884b16740ee2d08288df3d0f1644c5d26d15427d24d27993a06b276038ae7db42eec6955e924c4770654071a3057460e1e72d596372757966282a8d359c946ee219bd39e23297ed46116967ee6599eca6667ee528c7429b35b7f49b5ea3368db1a5cf076c77d70fd6ef842fa8dd9166c6de16c70768928dbc73605b831027cb68e88a502f68891e19e6ebc59f6ca4a4b62f94ad2d2d0e2ccf6fc1d4ddca794fba516056c12e5492f814fc84f14a52bf58bae8d1e2822381f68291dfdcb065fa851e3a8d7969f29601aee643a696dadb15330132346fcaae35339369aa12fd6958712e6fa883ba76d9ab2db7106115dd4700a037fd0f092d3e9b916ad37e9f4dd1960d835a6aac1cd2d3d61b4a80bf8c93949db35c251eb966955e9c6109ad5126e139d62dee22438ada6c4c4ec50000022800000224000002200bcc4cfb8babefca88527e5a5891259efcf7cb9d3434f70e7d084115d0c6ed65000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002fd99fe40d0d1496aa123fe7682d047daaaf79d76f66c359da659e80b26f57b0489b04b5a442580bdabf70178b84e061693ba3daaea81ac27ce7e7de21a76f18dd2650725bf10a1570f7e3dd85648cb3cc83b85d48fb4772d4bbf687e6d321bdb94cbc7e8e44e349663bd8b1ec4c2a6486944bccd408bbdeae0fae5780bab9204f409a38db397ba4137e222d209e594a11900f98c8aabf63234572fe92192e088fbf581e2498b39ccdb03f21f28fe09dde4580ed35d06a94b645beab374963332f8562a6bcb6a60cc3c542b57577eab0ed816f7bf61ab8906fb03677fe0f5801046b3aa78643e7b240c0c81afd6ec69d262e1a7e30e380f969ca5159784fe40fc688662c4f5951f369a10179285a646b192765597d6787c095aa717e56a13c7d872147d475425fcff01af644fcde99392658db030df7558c4765c026a3a5fcfb4398566efd4b933e9d0fe90b938e44a7809cd76f2b2017d3825081733e38339fabc0d9771dc053c5601499fcc9f30f90346449f80627dc886989602f9ef2c49706705f736cf056115beaa746b62a511b7e5fa348c76f7a0057ae03c9ae35d29c11a591e08b4f27310845c554e23d831cdf6c6fd93f440c06d5add6bff39699cf000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012862385e1eda1acdfe09242decde62f9bdf90ab85b962c5ab0a414514b80d385020e7bc1d7b493e93f30c76a2cad1bd37d7cc9beff4d6a968521ec78c9ae8649bb28b8238fa798dc9413c34768043b36da17efe92a3feff48980a9a97419707ced0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020fac7f5ae74ad1e18c9bdd995184561b29e469c0400e8c883b80e815c2631194b6379af4d8b03c6b7020c36ba85338ce7b3138790ed31c346884c1713693c84596bec6dea71db250fd2e524382badd3793a99d75c44a44cceac16a696e348d482f56417558c4eb0ebc0d0a876334c556506a3bbbb2d6db7856b7200df2a148b137f64c4260b37df4740ea36ab97e9a51e4b255e082c07b9b7c423c30fe41fe7d8a78ad6becba315b26ec083d1a3a02d240233ccc6a90702a1aba21864580fe140dcbf2985558c142d0e2f1ab167f19f8e0f0fdb4ce9196dd2d1578a9b9ed4561367b813597217aa774f9566bfeee2d58d2d6729e4d9144fd513d32d5497e52b48750c9b8847fe35527ca55a77a0357930443965feabfdf73b7754ddeac8cee5424bb8c694de699cec02dee8b26a7754b26655c0566ce2cda2dc86db806488acf087c3183d59269a1634e31d0e83eef4d655c82571ed4d9b186a133e9d6da4d6337fc9864fba622371e534452a2860ee8a22bdc62ac8920598beefce589d0cbf7bf8dbe07369de26c5a208e30bfe7342b5f0f4ac0650fcd6363cd5ae3ee0c91c42de071c33b619e889da712f7f086baafa5376f5019b1e0c01edbc40847871e297ef741c504872f9887a7edc448ed1c0fc3acce616d78ef1515d0b4f4ef28e6a000002280000022400000220121d229480f884674bafcdd7dedc3367ced7856d8796f8b9b54bba07098cb75e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008709d2fecd50295ca37aaa0d5760809e42228d6942535516e863c42a5e00b3a405ebe0dce1e12e2000d41cd498bcd7f2d97bb2b1309dfa01c50f4f70ae011adc8395c27dff34b075523e8b64de6ed886d5f6c329b11154f2974b4d215d3001ae120bb3127192ebeafc864433e27b69a3c96656ab1ffadb42e23fb1a9dab55341e37e1bdfaebe219e074699795e10dd2c1afdf6e441508073d3d1d8fb7acde260cef4c9b0d8a198e6dea9039bdde7cf576b51748151613c2021d075105721655ccb11108703152d74dcd522ae1b0737871a3b83868e0052b3b636b27696f5625ceaed6109b22296e224a6167e0d57d1d952a9c5ed044a760682f6e90d6150f868054433bc9fd7167cf294360a0c0cc34d2cce4abc7fcda6dce561e733212d020a309102a28018b3e1a23a7ad9a4082c32b6e447d1fe02aecba1f001647e4b9f9353ece19ef72cc078f447e2cedbb1761b75404e4f77486bc276baf2fe9cd3a9eefeaa0a2018b388888d3707792bcf4366ac9031fc41de1e6c7cd9ae8426b7688d6e4bc2be72c728fba64ed42f686bbe3e1e2d81e6fcd36d966d315a597d1c350c5eb9c6d73cb88ef48bf7980ba43cabe16fb1dc0b24cb39c4c442e4eb4ed47957000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401259a2838b3e7cdb4f2c2b004304eb3876ebbd5b849e1f44843ba981944442e67020fa276125fb8fc92cd7b5d13e89d9d75b3c537d46788e9542f0a1bc3d855af060df9907bc8881348652e3cc88f232ab80de534ec031930ace1cec7a7f924963e00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a06a9eb55d2be5de9cd307b2105598e78a663fcd6b7bc793ab5d9093ca378069de79ebc60745224886cbc5757c114674f49f7510828289b9d48d870e7b2edf102ccb5ed0d4abedd273bf5d21de699590db56a3ee394914c179dad2057e562e4b16b3bcb07b4a8bba99f8cee151c50b03e623ec1146f8a0e33fbcdc634e8eab34205682cfdbd98cdc47d2056df01db0d42625bffc40dcdaa1d8701a52e2caf854f675748d29e49aa4174556649920eec3c8166d6c98fc5801a9295cc936112764d9d731b59e2eeca7a4bfcbb67b78cf4ef4bbdae4eba07313e16066bb3e83164bf56d086b3b1dbb343c2db3a01545c54fa3b9987ebfea4a3da7f847258223eefcf88878d4edc0095b329356c2cccae6cbcf5fd1cd55216765913b7f693be33786080e0532c14b4aeb2a3135851dee99f5732e0a7e7dda0ad76c92a4b98b81c15d9f86db49b686b3f65d6f8d834643ff14738b38be2bae1165003c686d9ccd8a6a40154b9d853f3438ff4ff67c6a999f438dbc4b78b16449fcd6b054eaf2e4ff471e9f41098379e9b7bd822e2e24d9cc40872b8dc5e03a2cad7bf4de3ac9a3cdc3368cd1479be3b817ad0b3ad3f48d0dcdc480e28a95d72d06e07ccffcdb6b0b54a3f0e85993c6e341d2a38fbddca66bcac62971f2a54f2032b295623571489bc600000228000002240000022000021fc3e92824d074eef547249ef127d611444060a51b60935a3d61adb541160000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012888866aa4dfc678c32cb1c7d7df9a3c7fef336f273f80c3ffbebf702eea70a6b1d6d89ecbb9c6a9d492b849bf2f750e415077d86297f0c3ff1eb69dbf7091680b338d6bc5043116eb14e26daffe6e97e61eda798dabe24ec6003aef8d97e279b90233f99807631ef63496c65586184f6aed04c399761085031d0db97b1fbd80655e1b9f56ec74909d44b970d2d18daecb5b1cc1d2907a5641a12ca711b6e3554589cb327c5c2f6f863b37901a02141e2c3bbd882762ab4d71308a075bb53737e4c97b36489ae3670c6109743278acbc8e0c1ebb1d0a9a32ae5906686b7a9f5b056a1234ba1f7db75a174ee82877aba9db2d0f0e9289fb536d5f2b8c5149e31e5a059802d9fc99f88b69a1e17f727fdb2fd8e788ea87f5b22cbbd33cb79e9495457a5488bc62ba61e1c42f15b5bf7573f0f4860daad1ace150abedfbe77418de7d44a5804ab724dcaeda8aeb058dc6dae78f9d05521dbd0ef4f0e1f003961cd07f831274402aedf72813c1f0f2caa0365be507f06ef8acd1c0e8cc1a8c13d5990faeb5594dad1659335cf1605e34e074e30fadb7ec2fba148d40e0466ede7a4ffd84607ba1b3acb28bd6fea750912ea1bf25b3865c0344bbe99ddc8fa952207000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012c875cba01e6a1a6a96bd9afeac3ebb1c866da9bde74acc5e203f2b44f31b11e0210854b4cbc38fbe511e0fd68c611fc3f6cbcc2bb5fd2529d15342428337c71aa16394dd82f3aadb1a3cebf05ce0fa6b4242b2baee13f56c417a5459af7ddd5fc00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024292b72021450d51934706ce0b5d4f2ba3dc767a902d40765ac5fb0b6a0f3aa1f04ae2b8685ce1c59542e3972d10ce3bbb1c6421532a502e525d2de30836bee2e8e151d15eeb275f0fc8a36be0043bd94f3f4cbc8b67241b92a283f08801435d3ed792bd0d790227ff45a0ba74521922e63636e1e02f8bbb7e71578537e9be008a483cb614a03d4d64ff2b3522631053f5dd266db6ef8597c34c4f41f7de9c11aebc922a2ba22f2243425eaceb1489e697aebdfa595c4a7801aa0767fd7ef69d58eb19f50fd99ff081fdb9ae9b353ea20d126bbd143f5ea68a033d8f6c288e638f1ec65ed476ee1c243a5fa8218ddf53b888272029da92b9d8bf1e5b84da081934d6220c50a2e5817cab63e990da6b339fcfbdbfec416ae3d3bae5d62d9813751f727976e27ae7d7b50162edf28ff47a7db76e222b1a6a6ee73516b6cadcf8495e513fbb522a1bc37b859748092cd4fef60c6d5f72ae4989a0fdfca7c54b46fb5aa24d886eb0a5f0e00ba0453e0fd5fd01c4f6e680eaa98a82d73283d0222563b14b020d8f725b251c85f994b019a70b4e9de597a5ae07d0e92b7f7e144fa568fc99b5dea0cc7afd47dadcdcfba864bd043034dcd98c641b35c0e71669dd036464707b51add10bead8f37b4c01babf5df958c7f3d1cb22c325f2dcb300432c000002280000022400000220012f3441021cf24ac14d8070e96d09e882483366d9e4e7f8aa8636c12876dddd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c02b40685d78a6df7fbfc4a8d98146e565b855707959ad7c9079c456118d1699b9d300cba7c51a68d44e3441de52140c6837ebfa86fa95bb17334405415808fa2d4c6f02269247af59162ae7502377b1c23d74b223045d77e1124bce4924741abcea2ce87288536c1566ee80a6ec57c629b0ff61879a6b9a67af3bd6d12eadf2fbc081cbc839f7bae53594bf6aadf1582600228215f25aaf045b4bdbcc5b2ad96fa51650652b6a3648d3ddb78374302b781f288160fbfea31924a1fc9a01e57f7ce631dc77fa526f6e74b860949e46ee6ed3bfee1ac0eabdc58ab225a6c7eb73937ad3a7ddaa61d6b53e5de2ff61a55be55b9d75903a5d82bcc2cea4ca6051ac5c826233146ffb2c8eea19d5db2b65b1bb800ea6402aebac3e3a168e49cb0add1794bcca79d2adbf0954668f0f36fa08fe6d5a90607343e688503079a0248685afa64ddf1c3f29cbee17c6bfcfcb479875eb6d74623f4d2289f001e57e8a2c611dacbb0fc309bb65a37743e152cf80fdaf2436f2e8a50cdab6e7c8e02aba4bbb3ea820c59603801e9fe0ccff61b09755dc2685a4db56b93b0a5dc89d52266cb242cbebcf7390ef262b11bc3f0f78ced0e91b997bc30641d4bf53c770fab9d3c000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401224b561713c3312233760ada2b2980b1caeba544bc151966bdf0c4370a07d6d4021119f085654ad1d6dd8e32c48dfca6cb75823a68620fb522684ae129dae862e6137bd3a6db4df9147985e2beb44490062080bdfad9ae555ed4480ff2054ff257000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ee3bd5337810503108e2f8d2124fd68b4354b801d2171c489e7aa6ef8dba521327ac1514bd2647d9eb811fc02488d05dda0089adadf58b6647d3b0053b94db48516854e3347417a8c346c2fe16689bbcdcf98901f54529ff96386e7395b75915472a295172e08f2ede3cbc6acf8bf0b9c0b956f0c704dd15fb0dea26898032439cd6fb6cdb0a741c4e42e9c57a70abd2fe10ddf9ebe36f98e2e37b5aab0baf17277e87d89c93b5a8a0897945e5d0e40057ee5c0620ab7b24c9a4d6529ea3221170f914df0c6c6867c98805f13b21793c0761fc5a936de46914b240268c1518a3f214b63b7502140a8e5c17e293616dddebfa6783d609f71ad91cd48bf8744978465c0cd6c401443ecaedad92a61b5959c54fa8164850e7e47d8fa92ada7714247d6afe397532c4124ef5a4009643291c3daedc7a8660a1f88635dc04fdbe7301c147d3ecb52084f65499c568b9c39137b5a7a496539cbd39959a76a8565115dabc338cd1f306c1c37190c834972ea795cfb97f2474e245e8e7559e96aacfe53db7f06053bac84b6a1d2a1d98f8b758b6bde366c457fab2482bdcfaff2b2b1f0d259bbf39e05d4c8ae7a019879be239da38e1c4e2b2ae54baf50fa0c4cfd53c61f6e2d52ba8f8587f0f66790498d381190c71041a7e3c080d223d7c48361c8050000022800000224000002200690478bc12cb4f334cf61297cf301d2b1a6a9cdc098a2703d69b03747b231710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085afbbf3a33cae10dab5288b1d999c8122c13b68771f17219189cd808572dc3ca5feabeb5d1ebd3777f5e6c5b5f428136d7aa7caad1e5428e2a6453f2cad6ac68a30f213f6a7fdb7106107a0c9230374f2cbdc84252ad1f0644fb66e15ac039d1f6e6cb2fbabb7046d8b273ec8dbe394149c5539fb9e3bf0e9db7317316e9346c572f36a4cc1c373caa20c37df0235fc39c12a9873eb2a7969e09703021a3b3a9292e6407cddfcbd0dc8755fb0944338cbe3c72d90f101bd6ae507167265e7adce732bd84287ba2de765bd0bdf23054ea7a2d7c4d3c695aa6ecbb2a70c7a19b266336890760fd95b71039702a95f1ff3cce48c51312d86b3b27964b393ab097c94bb5e81b30725dbf95cc2a2a4f27e76c5503a31092f2d9b8cd4ff2c12e2cf2fa8b210590c45e65e03c822551a0d28fe0c8988355a56252069675ff4a5a268fc6a7ef58544706d037f140e88e360752dd1ecbe3c6f7e2be8bfa6684737ed2e6720e272ccd5070dec7a7b284e0ba02bda0844f5f525a2a77345bd40090971331e62bc1f12c5ec574779a9b347467f74c035159635ad0fa7ffd080d34e62f71e5e8f177142ad85c43dd57bb5dc1d208a913c51b14def833cb8d98aedd909f69444000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011cd727eaa5dfc893f459419d1cb3991cd742255f92d480cfeda6d099c99e95db0211ac122f01f82423d052c10c4ebce72b300b4427d219bba29de30e5a8892e3ff02c1140cf09ace801e7673ad4752dd869e1ceaa0406e8f5557793ef7f3a2f2ee0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098369e138055980e4aae001eefe034a330d0ecb34ad2953bd612d87f26d56e743af5f06bb264adeb85b7bf93c1204f2f6d3ff256b0d091b2e373cc12f6fc8219d4b7c5d9e7082a47b1002c00b751dafdfc6e5a804e35a5c202351964268f83f5353f1af49b3062670f1785a77b2914cf6bfc4209e96c24a6453e5570214209a86620d95de875315cad6c516bd2a3ceefca64722e8a8efd746ee0cc8b6ff9831cc54c02dfb026b0d281e19ec9d0e80d6fc469b9ac92c545ae20d6a0c56ccc196aab820c3ede40e6a37553287378a925e5966fd7e80ba767ccea9534ba88954f58da81b1ea806dedf6f50c98b9257b1f042d016b04cc0cbb34f608969f42d0d0a15abc4322638ec56a9cb0324b0d4a26d5d806e7ef610850d71dbff9601d9f468282c4b252f3df3916b85faacdd31bc08eb5bed74cc26c42d8ef4b5e39790ccb79435d67ae68dd058cb73e2d8b54c768e8e0f384f699bee33552b274a4f53fdaefb1c04b8959400a786eeeb83fa9c1ae867da91cda1d26e29e7a3ff8f393948ec0a5a2eb0c4e70de1ee527338754226be88ff7efa533a753bb45b01fb249c2b63211382c6d6a3523cb92e360c1df1eb12582bb43d53ea15e1a80574c52d39e558c468c5971f8cdffc67b3e8f8e84349661d323ae534a935c991cb4bf6f4c14c6fa00000228000002240000022017345532728f24553cce933315368e6c17da1a40f4892644070782a1c8e883b200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac38637c8d5081c064d9e21daaca0ccc4b04ff6b1e18f1a64e91fdedbe34d2d1114263f50055138f9bec9b2af67fe8810c3733db12b557bae517f6258020f2e3eaf045dbb10e80eb56d1f0a27c505c8d956cb84b8e29f5474f206b8e30f7f9d3d4e54fc1dc52b2519e2e11541e6fbd53e63ae36536c5587710495db2d03ab788075cfee4e225ba13a84003b956dfe6dd243ea6c4fc4ee5dc37341d6354166abefffdc4f2e040ebdb5b16e7477e99b86ab72d2663e33f5a2f48c39862fa90e61c66b9d2a58391bcfb54d45caaf5e4ca52e6ef0cc0ebdd0bc6e2f0f165472d5fa8b54a7381941b6a335ef1a57732cf6af11efea48c8eabeb3dd631bb3edf13c52e0b6042ced73559104f942de81bf8187e2dfbc7095b9f322266a85944ae85fbd7209aab386f8d819fd459740582118fb9cc0d6a245ed3f93035853a962eec29eee3db1fbc587bd0fcb270497743c30cee707829f7e5fcae19e2657c0e66730cef03e6bd105b76faeffd9791ed3a1123426a798c529a081627ad9855fa9c0ab1d3a12d05e7a5aa08e38a4197d7dba1b58817b3150f27aa8c345b6d3522e5a12e6aed2bc6fd537bbbe949be82b103dd0d00b716b21b021d4a06f52ad0ca3a0b48fc000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40118ab48a6fc3ad4f34df1f4b05cfc9243b2523f99d593837ee5e966386447aa7602120ed92279d2585a10079e2a8e467a248d7ccf073dccb58989174319aabac3db2bb7137fa89c0ac8aa5cb2f305de3839d58e2bb4cd92aeeb33dc2b78a833c61b00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a38a04615ac5f417913e6da13384d0ed40369e509db41df73ad9309166bef7f5860240ccd552626f9e6bc0d02e1f0bd132d8b1f5ad418a5a6827534c4be9ea42aed7b7bc79f96043e7fa4b64f2f2d98e6abb1af889591112e3311b8c4e65cca268acd2960ec3e31a555483ade09cc032c965c440fc8e607d91d5d19c6d127a55a6b09af14e63bb0551a11ffedc7f4835488df2e2d0401f16c481f8ef3eba86996002bd3265593be9dfd13dc849a72c45611533fab59310a1d8ea2d299f73fb2707dfc470bd85813f8cb38f44bf5b8623074cfeb1be707ca8e4f3571ec0c382dfc3ea0c6c0ef2e6d80d2627ce91555636e8dcbd75ac424c18face461f1efe17102ff13ad1024b0ff5be06b5d817c89a684f5c10fce12dd1ef8c7680867f9bc6222a26356bb0fccd8f69a03041cb457961f065ff53db4a88365843d4e069ac3a40286d9d5ba7780e7da06744253be91effc2627413848769cddb5dada33ee2c352deb66ff6737396f6cc81161ef64bbecb59940bca2b21985037735e102708de3c637e3bd4d041e86dafbf87b9018260f5783a54df1dcf098735f9c69c6f951b3f796647c535349dedcd8a3aff4bfb669c27b6f00d7bf9fb82fa8a52ceaa7f1fae7d0415dc6d5838bfcfd5025a44b5a72694bc27480b56c12c69fcab6bbe9252180000022800000224000002201e4a84f823faa0f04bf05ba3b416151bc25573b953c03bb9a7314843ebbb80fb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000727108d107f17bc5f3b3322e7f1a475314861cc79000c0ff5376644dbc0563edc166b92f8f2329d88fe76bee9257d65b1dc65b79c0e59f20b7765d0cde8769b0f4dd6edf5f1162b50e1420caebe8758315f0cbe662198c3452f02d5deabb4c73202b4909580abb71761e3a082446e06d819c071280bb6ca145051c74477f1b6dd2f7ef51cff3056040052b20409b846dfeea7736e63b7a263b54c0e7b80fc7285a6d471a9e5dfd13335499131a44faffa0d64eef481805420bf8c68c59bad31e77928f40513fb6226b6fabd522d7b7d3d65f7179b852156921e7688a23276c0daeed1a0d604c8d406a9746c3f486b32d62489991342257bab0ea6a161d0c022764a13a840bc72df8ab28ed7cd11e775ac6135b589d9f8604f699b96e7dea1a6ff83a3d2deadc63f4a2f2174ea0974a83064d6028db2f844c81b181b5de03750f1f760fc02384a1dd8ad77611c7b8144303253e9da9d168d4a542ac6253e24588362d257c66cc315f45116fa514cbd475cd00a8aec545f57250d2852132f3a76db23078aa672e3ee59ac27504e42d9f5bce9ccf908751b8168d03545b9718e6399c56f981001fd0313677321cf9fb4912a60e40977d55663fadc310f0fdb66c3000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401153175368a598f97ce1f733c3e102748d907fdde5360976e2893bda85b588bae02127cdf4b02d4dfa5e7f2795c3180489d20b9159f7563a54f2dc46db2a0dd13d7147a4a127cf3103a8770ea64479ee7826df0b81126568356c0ac98406f52494b0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098fbe98d034e0b40b6e38a80a0889a4e530f3752d51debc55b270f6865183af7c6d2eb488f4f73f64cc3c01051f0d208c6ec53add5c3c679d5d4ccb1424fd561a961eaae6641c69944b5fb007f37d9dd480f4066f602ee6a2c5ee637b856ea22b2bc0859a37538d9dc89defc32a6a0e17ff654450ef04501aab33da521eb254e9ebb94df81eab917f384b5f29a290e093bf5905cd55f4b0de9d873b6b159fe29871f39197c51d7a3eeea9cf33d3695e3dc86510ee1cfdc6d3015f3a25cb6352c0630bce1458ee5c3d62969afff97a569e666ac71a0ed78f395377bf8eef5aa56ca54db7fffd20aca958a787bd5426a79eb2b58dfcbd42070b7fb42182f2a73235ee13c9e2fd321257ec2152ca328143caba2bd4bdb26c354f54cecaa27a358d1b851c2012b26c3990fcca044b02e959edd9412e330ebd4a0b659b01cd829b2fa495665e1d9c41fdcca1490f11ef31062aee8665e677eb89190df7364fe7d146e1a00796f51f0a1363e46e510f4742ab9f2cbb068afb08ca648f284acc2f661ee582b58207cae81f6187ec74e733541ff0568a75e61c1448a280345d77439558b3f3f2060dd82b1eb2a57f587210a517ad7a9ef4bcf2b997cd3b526297a477cb21c5c68c4c5195e3dc3899988230cba665b07f5eb7cc125d5e6856536f4fc16810000022800000224000002202c9f34c77a31923e49ea66f8ab579c0be011ae4ac82440b8d75ceb4d31ca52b1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e12403796a781f47a4a267ba9239df6f85aadc8ae02dcbaeb67d01f64c5f56549dd2ea4be6bfe5dab1d37cb46fbd2239a2a2592ac476d1e1d962b7eb0a409d495e54090f9cce401337b14418975ff996b1d5d39531316f4965fad8655d9a1b21cd2b9e136e79a9533d35b447768f5b77958e73b420222751a962d69e02023608884baea24c4f0ca69810c326b2af6433d50e484db7d3029f99f7f6d1b331db599927f6e0207a44bcb40f958149986b1adb7b0fd6909cd36e734646d8240ea5b87567a2f0b69fa5504ecb986d708289f5e0b1c2bd6945a9379cf449d7b1a89375ac7d380bf213d1b284a27736a71a82dac51d24a0b8f7b89adc2838b61c5c7e8226ece4f0658fb246141bd1fafcbe4fefbb8dd63df4a0df32a03d10706ad09344243b99b1727938406fcaf1101ffcf282905f1559b1c4a235892b50d697541b3866dadebab037d4857de43f1c52616d892514968dd53f6a4d48275443e63f1a0defa69e1dc71268ba7a8902096f2545290f815b1d50bbd8ec3f52d8c43db9570beb5c3400ada491bbbda5931e80e8b5400d38909b0017a07363616b8fd19c55f91db80823729af66d680082924c50c39a0f51e315a52d79eaa81b19f13c60980000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80201cedacd2ac97e5a39d9a59e92d83d07793da82e5b94e8b62237cebb6ba84c2c1ef7c5ec216fe7856d51a9fdb2555bba2714699389b58ae366e28e534427079702143aff1c87716507dab08dfed7ad1fee7734101d9ae5232d73b72b50d148f27a24b243043cd17e62b835707589f73db0ce94dbc00d531f1b5d1cfe1f8bb8d7280000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000983854bf87cb4a007f88b3e3dae064d998c9e62c57e8b99611caa0c74eaa37a4b789c80a00cb3912e39a55c7e2775677143ff949c07f3af5e576493271542ca4e86724293dda4013c129f1a1a2a512ccfbf539c21d97d934f7f1f511e0db819bb64e723ac2c02e274bdda5a4ac0fb57efc63ae13a3a2f05ec0b52fbfd5ac379576f407e241ef920572259f50045498b49eac19c25938f17427cc6b9d8b5f5825b6041ac2423f53d3788426e0224ab73ea6da13054d7b1df0d9d7706e785330044a2e1b237f34f554d993364f4b8dd29e24e9c5c6f795ed949a7961b376f5d6d107fdc0bf24d3c1f1511d9a5b7646f6ced512fe67555be85b45f6e0d3991ea366c8ad51c1293333ab8bcf3e7c73f6709486c0958d2b95bf5c481a633ce48eb1f9e6b470e8952e302a583060f2f0205311c1f3d52b95eb63d0714736df5615cca01ddfd74417a2fa6a38887a94d1fd3e1438934fec1badbd4404b38b7fc28acb6aea02a49363f833d7bede9ec99b6486a001db60b9c5658fcb79a40ee2fa5a9ccf8f80e53de6b5ebedad880f683740e5acfed83b0af4523c4610f71a9b0d834a35ce6e288e38f548c97c8f39c9ef33c0454c1da476503ce3d2587ef25734c8bc89eaf74f5a173f65c69a108ef46ce033960b4b29ce3e02687459795728768cd86a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae258f38687c48589714ab80b5215d7fac8192dfb67e7e8d1d019727ce165616d5306e664bee86709d413bb0a7a0d8ae265a5a0372b8212c29725c00362486127d38eeb8729f8c60147cbd8df783eaffa8eb0a93ccefb503a842890f12f55499ed5184bb673a117992f1a94e411e6c95be2a6b2235fa819f1b75e06da72a31da4639f130752484a6bba9d8e90b10d84dea60189eeb96206932efeca1e61cdcb7a5a8680166f9b6e9297ded3328a1d31e04e1f3a408027a73b6565d9b5ff13d5b155010fc39a4c5583b4e5e4a03e99a6634e5cfc371580caa9912352158fdfb49547d15f82eb3a2010e5f452d1bc13f358d12cab2539a4cd14ecc85dabe71b5d522389c7ab863ce7ca6c462cdeb0c1ddc75177c790696990026269dc3e524cdd9fb763c5439281e65fd12b092478f443de53208e28896e03a4425e86e82aa81906051be4efed1d878f0cf758456bcaba6ab00c260d6a1fb6268004a3c6712ec3d45db8e1cd2fc3a6db85d01b985afef545caee4a41945b6377ae394fd3786476ab521bc0e7484b5eae8771a3be2eeceaba6904f8a0882ead1e6d43e48f60dd9b67ebf331baa04c4093fd65d77cd51364549b4eb2818221100daca06e0d30adcc0dd1875bb41b34aae636fb0c57a5536c036f0160de89a66b3d25475cccdebc60f0000022800000224000002201884b0d40bb7a36a1a023a1437165a7f1e6c941dc371c7894fd3855a047f4ad30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000082e35888b8f8c1d82601e764c5a14d9e8537607abe91c92d0c165d5ae4fca6a878deb7e4c9805676afa4b00b1b15f3fee28ee769bf7fad079a3adda9f5861ed4afec50916243af33f5d5744d8a6e85a04806fdfaf9f7ef74e8849951af16bd4208d47ab2cb2125d6c4f61e874b2aa7aabc4f4151c4e3ec586e02faa7e9c054c15ab58638fde2da70a59128c9296c5a85478e219046deadb4f2ac5d23f9ebfbf90c51de14de8ebc8a22378c9c194006158b08e4555f88cb6da0cbf48286d026ef32a991c39ff6a442bce774c5ff9ae1faf62d3fdaaad218928efd82e213aadd8707a38afc49f531efa8818acf4119b6598b540efbefb61305efde5ae613a799cb59f13da6dc3ec863cf6ea23622d810ee8a47d6e44064cd4fc61cfdb670ca24a10cc914957ca014ed9160ebde4cd12c8d94cf456fed5c5b2535d3cc31c86682abd1569441dd4f74b2a8a931fc6d39e8ca2ac771af7796d48dca14fdaa8745be5d542790d450332635383df0adbbebbc78248549c9249f90a4a67f300e47b3538f8e122869631df37a110fd1cd6aa28b38ae58eebda0fc0a48b7af9d1ff0d8bf470783c4786c2cfdc2a16b78c689c137a1b96b00248c2c52feca69733e0f4d4809000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401054378e38042a6ec72f987861d4fdf3f1b5df2ab0ddbd364a76064bf96dd39860214ebe2449bea8058545b97db62f36e09c5bba9789dad1ea4d71aa775351bd26f057d2385fd31f9fd5826ad0e89a897bdfbe6853e93f875e359d96460048deedf000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001df8e1db5592c442cd448301026d308eb5aca1426d52a2e35affb6c592467959e844fc06f0bcc0dce5dd39beeb2599ffc5551749835b24ed0cfbcbe078d21cfa848d46b71468952eecf2609cb8fe6f285f0e0dd85b235a503cd8916a814d8e5a931b29131869c1dbf06c9f7d8575b251e8935bdcfaf5990f2fa857243204dc76e7f0fcfbd023177bcf5f4aca4f08690cc22c69e39891a35cdd043386c37a04c14d5e838a4b76da58b679ca0e79fe3c77430d360abf44095388946da7890516ef1d7d8f12f7f0720688f3840c2e9cd93a3ca741688c7d8fc8560e796a23b14da8d590a6744fc1333bd662770b4ed79971ec9a64ba35de81adaab3cb08c68615cdd54c7f55444e1e6ac8861990bcee4d3b5059a2c86904b0e4161d9d25ce2a4d7fcdcde73ae0a52538e3595216cb107f77e737dd4448b6381e88c898975b1f7788c27bd7703d886a69499a8d81c7de2b1438f4787e82ef0ddf1c8785ba4fdd74a3a64a7418c6fe090411d94fe001b0825649a54181f4ee8d9ac80d0f5d945b14230828d9dbe4f352a105089277feedcfb8115733f54aeb4c389661c0f3eb50e3020eb40b9961ea0eab42ba25f908536d67324b46d96698a782cc5a391ba083966437a5aa37bd607fde2101ec5f17dc1bef63f88b8b684e24136721db0b2ac7d34700000228000002240000022013cccb4922cabd57b4106b87caa6fb46f976d90a135bf8d9b38b96c6487e8119000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009303e5969fd996ae1e8fbc65f57c4f9c514852fc7979e61e01bfc93b7fc8ca4818ece2b2a8e5848827878f70f0072d53e1d7f9396df887ffad7ad63343f7f79d5ab3fd1f8bc58e4b0c813710795be905fe93fb8798d086f049bf6868848be0b809c71c3f584d97c75b00455785f9e5d9c443fd2dff7dc634a6ba397b203cc4c8eab8f854f55ccc32d3dd1cd4535ac2398bae23c05f7ed9dd6899e95a264026e776dc6e47ce82358a0f1885422b1c178c33be57230b981a8a59f830da5e6a50d430dbcec32f67efca80bfa3de976acf893c6523e21505defdcb567582da9cd0eb70db78ffdf6faaff711966bd4a3a9a45c3d23c19b3a159d42fc81642c90bd79542e6ee80e64a43e0f9e7b5df98e611fdbb717a007fc58021d28c223135db1b23646924875ca3940e8cde2e9ebf58f3cdb8b94ae2f9c2c90e2f12ff74d58e7f96dee239a5e4374668860aec12a6fc41982609ce59834214c18f25ccdcf68da121c534ff3d8a302f9cedf8bb18d6da0297417e7e24a1ef5d2f415ccca33eefc743dbdcdc70371062be4294630363fa92a27e501b93110890f4605f21aeec7d2ed76cc06a6f03f46d9ff1fb307b18779bef0fd715e0ca75cf344a23277164b690c8000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021ea419b02ecb7a0b674e4327935b2ff30fc72644aa0c1b35782fa8cd8651aea52149284aa9c2a9f9dfe6b2f13078183be5862d62c9b3f6a43cfbc866a91bbc290218e290f0b2cedc12cb8ab6822e778657b686ae59562b6d0ac12de645cdc9bf64010fe3f26c97d084800616c2da93735645879233addab513eac4e6a2996e933b0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000234347c4056725c2808d6e99b0b614a18b23689943876b31d7946aa2e9f9953e6424c9c4cee85f8a9ab2efa497750809daaf927c853bb5cc87042dbe0393a9ebf1f37b52f1a9b7c3e66f9f22f4cb1bc435560232a7a02b20b18222cf5d0ac1aedeccadca0fab9908932fdefd2e65b92d4b3be68401537e95b50fceb6b94db51c1cd9c6b20e36ba268bfaae218623d68ac26849553f4daf06c0739fe969747a26ea0e4da91705b68245d3bc3091f006069f36f6f89a239986b292cf03e1d22db4c9914e9646859a03528140bff92e3c70f12667939b82a1f229fd304459fc06849b68567b794740a95b6ae644780128acaa2ff2ded29e76ee03eb85959a7115d3b86757f87ddc148d208487e3f80ed16004a9b1196040eb74328568dc0a0e52413a7a771477f90b41d4b149747813d08150baffb656abf31aa5e160e5bce791e7a74927ce1c912d4afa875950bbd3a4829e6eb9896dcd51121f217df6b86cd995969059952a86f081b57634af4292bd885294189bd7d7f0192989c53f4d0a7337e0fdedbac2c8bf080abf9651787364205564777933c2dad1eb52a72b88614e6ca29a9e50ef4cd49b9be92bf2b7bc4a60c9004bcc838dd98c21ed37f46a1a7c1d28e8cffab02d10c7e11cdb0264f77a060dbf51be2c11342be1631cd3a113cf8c00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027abedee0cd61d96406a1593e929250f913640bfda4173419a066fa0921c5a81b3d20059a7ac869168217e9e585ed04083a734c0b0947bfd1921d6c419541ef1868eafd95f6bb0f1c52e85784d6b1d3153cb18763d6fef0343be33e702f210631e6f6629f79629f0925aaee121fdf84b42dae19d2458223358db0ed73db365311ba700df55495badd5415507a54658550259362c03e8cb1707768686a31ec5019253b7722942b3c33fbb124768a79b250888d23fe1880384bcb5b3b0ca2692324de6753d7dbeaa1f4f3be28db7885b0cf7a0e345b5cb68137ec49af3c8d14aa833dd5f9825a4ee012249a680285492156ddb381779fd4202c0b59e597a1a878958734383a387782295184f1143508c7fff09890c96191edb2f37e3e33ce87e13ff51a6d522d2b28ab8f6af37ade6053489adead7c31bd2c6cc5bc692e387bbd7aa211d0b65e8685424b090b71b5e68e8030bcff54f1f52afca7dc1b807010a34a32acfb52b800bbc6cd0642a80fa966e4ffcd4c5bc6817df9f60407e71d36a860d3916edc31df67ee1f25e86b674a47a5c51976a2ebe0b773252e280faa481899ec105c539a74c3e5841c1eab1eff309316e6e03b779734db5125954c4fc32c1f1b5dff62a058e24b3f54c20f73bb5ebf19f574c762215c28ab653d09b742a340000022800000224000002202706e6abb96bbbb4fc1a2b089597ba51341b12ce533578f6eeecfef8eb85a441000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f521f5e7290ac82db4a0c3f9e1940c50d7679ca7cf6c521dc89915e4931e5805009f28f647227ed18720c98064eaf77ede2e608fac4163609ff09a330284877c931c79d6abaa8a3f8ac623163030a4cb78a871693bc97e682acb125f482eb5d5d12e1162ec93eedf37ab90ed0bcfffd4ed0c0081d9f44132b78354c9af319a3ba2c377ec1fed9b86304c3b20324cebe72d7f3f5737d1d74bf514562ee7ec6e751da909b74cd37cb9be000afffbebfb3dff45cccc183c7fc6af01898c33315e50a924c5f80e5eb198f0fc083670ffdef8eb2336558e7a396107719f153ba03b18a13e0c71b8a19c0cde0425b5fd3ba46ed8adac4dedb6e6064c151d18ba616d6c4c42fbb2cedacc070e99d789db354971a0b892abcd3b4fa390302dd9f5ec8ee6647797f0ceff5dee6801fc52ab68386e80470a3ef4a4e68fc5ace9b911d5153ba852504260da0933c9a458f05941aad9a41e5eec2854c290c8475255734909fc06ba2f5ac60d3240e2978a5a316c886e814e0585e73797189d314db06b792c5b89f9291af4abb5720ccbd75bccb289df7b02618ae512919fd60adc771bdca60fd2acd905bb878c72d3bc1ee180ae35a4f009402dc6008efa6712fb5fed29992000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011b594607160e7105d36529e7b3fd7d0f50f0fe898df49a1476661da8f57a4be3021a6f91880d7f61fc5d55d775f7a074968e3c09ea70dfdc42d7c26aca898b350917704552be1007529172d5248129bd509d63ff8cda1d7c1035e362d39c6abbfe0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ebfac0768d50fb52b655767b1fae6d1942856b432d04c23c851d6301375a51cd50f2c6ec27c82b2bb7b7dfa5b72ec7a7d4040da172daab1d074e235050271bfef11f643f4920abd1c6789557d55e8982b8ffc72029560ee4946f1b3c729db622e8ff7c293fce4cceb13dcdccd0a8d59e844b3dfc64f6eb8eb815ba3ab98073eeb8e8abd040ce1b33475a0166e21291c46c0582d2d7360371af340658b72fc81db74bd14481ad5ed49c12362c7e20b78d968e5d437694fbc7c17fcd20b4eff1a2a760bdb70b438199e07b137323810b742f0ed60a9154177473daa32116f9a5eef012e85e3d37f96ed741ca8f6747a749361cb0fb2758723a62b9fbb7dcf595edfa0bd3ced371d978fab8caf32b891abc14712107a6b460f5804530928fb6984c8625d6621463e6cc39cfa4ea83395a1a22f64d2de62c667fc8cb84824ffe4bad47d6f44a8628ed1f8423f8e0de3389e998024233e070316dba0b62051eb499200281d1f65d8fc67f6c30c41037721b430b0d80ffe9dc46e55d43035088a048c50220de2d0e189827d842a4a16e71adb485b0b6706dbc47ed94f6844c40c6b2afa0566ed5f39da6a3478724287dccb575b8d671110a619eba9c89c5e44b61514d54df03aafff528d919ef321e94c94a127e68331d34f69b6256064c83608165000002280000022400000220228e1d96676abc02d2ca73cffc6e877a69082e727bb22a991f229107a1c45f44000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008488589ada04f8556c8854303b455828212aa336ba41aa895d36991df34d40aa9aa0d9457e3c6604589efba60c918aad1f6529540ecd58c45956d9b2f9d937e9e0f7f70dba53b262d280b413379137da9750b9bddecf1c0965503ca55df4ad93b881d1ec4a5e74c0fe88bcb75cd984f7d3792535f467c71213e8560e7743c3c8c563a22cd517d60167eee1ad739d3402ab9c8412358ead4412c65cdde006f0b13e8c4a525227b017f8a5408768126c67aaa6446ad3713af3b5b1b878a6d4b911aa98a2c990dc44325d300ffb10c3738c93698e4c74603c0d1b963a73b100765b5fad97ea89047426c512a99db3d8a10115c2c8f24f2222d45fda68af0c0b7f8c2d221e584715c4ef258c14b38547da31325180bd4f9cc3fa9dd3c4ff9bf8fd02259aa76a6caa0f1dcb6c9f9253fabd5b3682f41520bfde5aeb6999599ded03ae685d17d5cb5c09e9bf7602491ce91961c13526396d7952b4a0e48cc1176c62c8a8ec2948f3fda58d61deeb284bc8956dc31cf8a1b459103fc9262e3d0e8e09392d1db2fe7900c50a299204389d6339b69ef41247a7083c1afc92f26cbca975c13d6582c01a0adf0cff786c885f82d05a5a5573072ab6235b0525d6f5ab965269000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012bca50d94c14426a3c0c458da6615bf4559fe26fec8547c402d2a5805a5fd27d021cc0ca15d288563b11a1249f92abb79ce71f6cbfbb9a39b49242f4085ff1029008541f0a30b8ba45c6da3d05ac51eb763249e89221e8bc62141e9c3c3a905b96000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002523a622311fb5c250b11cfaa917d32fd00367b7a34b57df945a4c30d9ced074ef7c50c6a3fd8de00e116064d37b52e4a1c5f70547505ecac2271586c0106b6bb93ece6930004f4032ab8dc1ea81fbd29573906f8efcc78d305344bfb7c968367d53149f203b6f63f3780964f19845c44797fd735db11c60baa67b2344ff1ffaa4ed9dbecb773e3b6166319f635037b591b64c5503420b588c1c9b4fc8be3d95f01429d75f12f3b8319d875852d0fc5fb3e7afb2b9b236ce962cc790df24e71c433294b978aae5a5c4c4d40dc5a6d9e96ec3462c695ced35d9b7bdfc65d2c874993cf05e5a03df8548cdcd687169645d020cdc1cafa9baf075cd2db0409c5c19a3c68701569d74ee330a7aba6d47f3464fe908399c777c46cb972b93dbd9f12caed80cc2c8d3585e960712afe758105e2e5a9fa4400889c4049f1d3642bfa6bc4a7a6ce00cd1ff41fa17c57eb6d330ce24006af3cb4265d17d7c0cc0f1a0e1cbbb61cfb4bde5bc3c718875fa87706dfdf9552d9dcf21211ac08450382b4b8beaf7e46420a7a7c7479e4900eacc90107797e17e84d21a5051c099c8a1c342ad3dd24f1b269e3d9adce816eb8be62fb41d2502aa8bb1926dc40de51bcbd22c352daec857adb1d3780616cb8323d13488fc026c5be8cf04eac3973e9d28b30dda4a0000022800000224000002200c571aad5128c2be3d3c177f4d0d9f116c1a6ed1874d9c941a433b9e35814d5b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d4f15ef8d56d9dda7b01f62e532e70968e3eaa16c0daf35100affb43dea382db05e9b6ee82836752f2e16bd74f0a4e70102cb43ce8f36e2c6b41c4442809158978c5fd3262bf19bbdc624b73743dab1f81a2aec8d0c02e9041cb0875b38257dc1d628e6e96ee78321585e1bae7cc889d92e2e876cf91adbbd17af8073abe8f7f83838c175632c126d2fbd7704341f064736a6a5ed125fb7e5e60e5699bc85ef23c687463e00f97070bf01867e0823bddaf49995dbf28dfcd6cc16789d1bb9a70169e5770457cc5a2806bea2b90ce97942ee9e0f28c5b7f8043312a4eef0269bf2c0dc5e8cc3eedadc9f9478551937800ac0170a1864d0588dbab50b052b086ae771d962d85e50fd0428e41c8a4f6939349e7c72fc87c090124a8882dcc3f3a426efe8e0fe7adef8ab3a58f7c08aede4189e7d2327ef7972cf7bcc70fd58dde759caca8348181f35980a84f5facb250e9914f003dec17f875f208ddd42ffaf71afc662246c311535790f18fbe9a1c4bd19cb7daa35562e116e56751e9d0ec320b13e5b4afcba60b24d6bf8377fdb306003848c7ec69b072e7b0f344758400437ba7b2537673b6553f182b4bfa3f522087e8e6d825f53306db22214437ad62d75000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012e1185ee9981c244cd39ee4d2874007e2fc50f444204036552a5e338f47652fb021cd3b73f6314a0092f82f9442a100d46508052bb2857e267d8d60b20d26749c924a4c44bb98dcaaaa290476a8280666e9dc31774482052f9fd211750b4ae926f00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a861ebb32ea7ba8658a1e2359d78163fc96002dfbbb99e3b0f2ae82d32ac88987f4f319e1cd4d8f2bea248b3b93643ff8e984da2ce93b89e189cb244e34f5a5e8c08d1c7fafce4236eef373d3c78efdf1c15da2cd8a487f2555d67747a81188b44429ce532c8692b86ef4c77eca61f449f308164055309b3e450dbbbc4e0d527943b15fb247ad17db58359296612324c3c59ebbde0c165eb2584c4423ec899d6f03823ab50ab2681d147bcb8fbd82d0f63a43395611d78b55923dda1e12a76c3b6fba0ded1a1c22bb686df4dcb61a2116d4d07056515bae5bb8e468a2fa774e87e6d5db8b148750e208a6eff36cfe9efd8208c632347d253084b5f1fbd7a45b80d11f19788debe1fe0da624b1814220333e296050ad2082e57fe73683b416ae1fe05756ff3b2cf09795d7d1cc1b9ebb3854d818a7d62c735357f70b033e74f009192367513f59ad670105f29cdcb20c4283b5699b7faf5236a65771b595e09672475230742e0bb5ffdbcb29d5af1f6e51511eeb0ceb012544eeb9d3c4ab8ab2dbc6634f511f85e2e42d1e263ed5886f17ebe21bc33d06f4d8360124e56feeba0984281db39e820d380cd98e269e9a67da3d97cb9a98a44a3cf48d0036d2662bc41f19e374e990623963ba0cd916d84b0df4caa8aeb4a5c956129d47620908584000002280000022400000220268e3e65691840df6c711f61e995bb12dc2ce58b9a90b00dec3376c9245f4c62000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f5255448688a63cc9d6ab623daafed6cc0f4a72182befbf67153982c53677d2163aad6c5949e56d0429fbc21b302475a4749cdb5bb780b060edb9fb406850a70a07f57c4d914ef69802f547a358a7a3e532ebc4526b1a8c07eb17810423e62e7f9e1ede1f42404ee6664013c679e15730aecd585a305033fc819496842350c70f2a9439c4c3a55a26c5afa40fc0c73bd043c7d7c777d0a00d73fc264e9db90e33e2210392133cfaef71dccbeeb5a6bb58a3e57e9b60be1c5374ec4e93bf058f6ffd43dbcab9b0869aac585ded10351176ba4a69d5521047e4d6b78914cdda906892a01fb535a962f0c1cc9d04767ac701143ea6ad9acb1829d15e175e18d09d90ebbc142ebff51639bf0fc29b60ce874971d1f590695ce6d5b4ba3e348128bfd63e036453bf7532edb9e0d6026f37c7b35c92113f4ac06b0082598731cddc0160a7474152ffbc0dfc6b5ad52db3bde7c1aeb75bfcd6c5fa9127a4301b4d16bfbd4446652d6d01f17eef9377d0a402f42d9864562f72908b36b2378f555f2984617c24f64337b2058abff5e2ac1bc643edf9fbe261d3abf6e42b9c09559ddd8bff36e642c543dd11a088b45304ebd33b9fa0e80121114e968ff6c99ffea63845000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80213e0dd3635e4f3b2075d29a475f36d4514ae7690d9a2f7bf64356e8c8c8e2d671cc279a6cafc0015798f307cc0044698012b1b71d66d28324ca1d46f55d78dbe021eb392a7877554243097a45d4178e86b0be34d406f50bb5636814b99f92964ac0511233f6221f40b5f3cdf72e609d7f108da5e41bb7212d805a427ba4dd2ffb60000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009bef81f06b5f637be2bd6564a456215f48999cc984abc3911ec33e281201c99e4d5e88b7cc0eece51df635d2ec313ab77451f12c93fd85b4c48370fcbe16599a635e1b5f7fc2ec9f6b6ab980cf3319be6ff345f6b1785046e9b04fb84d40d0cc4706e137721af5a7e14bd932e9a9d89040c5c6dc66c93009e1716d3caad397027b0a1ae927102b533f55affee2b0eb7cc1c1f2919f3e853e182796ce8d0f837ceb907915e5af2add4b25acd0ae5b7f3900c6297f27b390365582bf6dd946145ac833ebaf9c408b545e70cde6ab950073a20aa88b7af4d7234003b56223665a752f9a5f7018c53b56b19818822fe1f0ddad8ec06be2cb38d3c3cedc38b68137b27017e44d50250ba20d68c96c6011bbc2c05239547c0fb5edb4ae813bd032af10502b799af3b6bcf371ddc51a7919e354be68da4e2a4f4fdf51bb7f2b318a8111de8a190f69eb0fc883d34ae04315071619c73a9af513c8d48dc60bef367dfac95f8aca8796c4d6d3a10666a8fb76bc2625b421c54ed6ffacdd8f6a5145c85d5e2e63e42642796f88485a7a5992e2654b910b2f184140a8dc723cc5941dc452e46c9800888acd91dfdfca60d1a6a8cce14641b79e1eb1aa13ecda6045cf7ed785835dbc52505bbd603c88d5626d935e54e79ef91472d91bc744c45dda00b1ff740000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f10b7705f5437e9e599cc65dc4eefb2f88eb25a8b74942a98b20c8a745a5afc8ed8c6c45803376e7af2d2eb2e3f3717bb8b9811b931ad8cf695cb4457515e853513c34f30b99345711ad2020ebbaa12f1d0055e2669a099aff1d57dde14800f67150bca103c5581c1a07565032300f98bfc343337a49884244ebb0c0881090c120ee31e5e247d611bb42790783c36a644300c6cb866fe0fd30d1c318625d8e55cafcba63715b14a65d3f8aaf44885c2347b37da9649327018910a05960ebc8afd480714f4b16b1663538c23e57885cc5ff65f5d77639106fc9ef66178b3bb962f77694fb83f11d16eb3b45915e6bf91985c14df1e3faa100c55fab9af559553c814abab7447ba2e75b8b9fe58e492b36fc64bac00090b46361d296cab0b67a24e7619413c4c23d4492e678262646e210b9f228aa419699e02c1d313b0fab9a6161b0e16eb458c19e53e53bd3d711cd6a22ede24845e3a311b1cf4cf4dbef3c9aa1dfbedddae9cb5e58bc29d9a8384b33381c2dbfb4572b28479bb696075f1b4a7fc83f17df615776de97046b83016fd8a5d4cabf37663720a16efcc8df126ba17ef658038a204118e1ca218bb599d42c648735faa9f71da9c8f8f2372f74756d8e1f51d20724c1d9e37e1013d57083259e090312825ce8648463bd7570a08740000022800000224000002202d2550b909705111850763207f5dba20ab451d8ad45ce77bbce8c7b15b5cea890000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a2f9f531de4abdc8d7e2e485a2c99d9ea6689cac90ea7e658356103387acba00354c5b8a1ad107908a645133ff76b5cee6d046b80b454515bf07c6efb38b4bd7efd9449c7cb2d7966d04b8360c78aa9fbcc25ecd69eec934e222f9b0599585a323feec4908c3ee913e8f0b72790e440f7be64a4020b8aa66538b090f70193b40a89fa7b6972687f16d2af7f6da4eb3482b59e9895f033af4b3b1d60c78af57cd56c277b44eb7e39b9a75e799e2daa3b384dcc70af9f866ad67f8489dd4631a9bdd7f39fa69fd171035091d92e3ae7e11c092401ebe3c17cde51c600898c57ffe69253db4d5e1fdbf460939c437c4ae549325947e196312855cabda913ea9e4b822def092c19176eca88fffe3ee4f9232d5502d581d12d54d16256ea6ad623118a2f4f4e093573a882c42ad1548a40baa430d80f94ba4f139490faf60b8fd236cf3782826e8fb461c8652b6235f971993ec6531bed0f51a1f9a5e600561287d99816e18e58c5cded9b56e4c9ac46f9b9c4ccffa5472d9aa210c383b5380946e01a34bca9bb452771a3ad0c8600d5db7e41d0552939d7de81a86fdfe226b33b664ff54309d1b5e31e9f7479da844ef57ee524b706f5e74bdc73ca4b015f0fed6000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020ec120acb5b0667bf0814c7ffdd0b6f8b2c7f77150184e580e241400e20c8ef808895ccc4405bc660c0b171d298792f500e3d9e44ae29b33440b2546c869ac4b021f2065389523da84136e2c1f04e4fca408ad166cce9662e1453115bf85eb72b3253d0223c041c634796dbcca7adfadee4ac43f36685da379486830bffd1ec5360000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083393d3e395bf0f19cc9d03d93d883d7003744d7cebc8a7f479af05931d4d4ad9fcf73cb8f13fec9e39661dd527cca610ed917431d3d11810fb443d7368b20218795a5d6bf3fe86e3d9ee462e2e4c273522f5c94612d1f1cdee625b0fb48202c303dc21084377127ee17cd0de137e8d39c87b4709959da09dfa2d23904d77acb113970f2ac1d8b8211fd51a1d3f02e8bb30ebdbc71d99bfc08a16aec6fde396a07a7f656bb4bb52e4c5f71e989be687919eb65132352af5c7d1908f74e5e554f13394d1d2f031c90f8c704346c4dee3c309e8fbf248c5e040119aa2dd51e0af9c4dc1bd02ccf043fc3bef51ecb609edc36455249bd0c6432d206d50daa0a67c1a42a5eca03496862a198917c4ae5678e893421f876f76d3f5d85c69302a2259330703a21dc3f20e58ec54a59b5cc21fbd4152a462031ba5ed5fd7177b185b24d5e1df9508b76beba920d52caac22d92c089f802c656b8cfda8a41d579afb883c79733e674358f6c1b9ea7b995f59028ce27c294f20c672b4f946e013efee45138b2526cf7abbcfa13710f2a13a171c513e7a5fb3a340d0c0ef2ce144ea78437863bf471a965c9e5a1777248af8e9b513f68bb70ae517de2ab9bf6f80ac89bf80f29f2f5b7e9f79d4b1cb71060fc0336395e90d57038335425615821dea626f20000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3a3de412a7761f368ed756b685feb1ac88e3d38c8eaedb7f3033268556d83ccba7c48ba521e669798205b044abe953294fa59a184362571df9014c8b58ea837b0aeec850a83676349a8ee24b8645519e0afa6472b8f8a32e1a6111eeeee056c085f731d814884d2151833f0972603001352bf29289a27888dc2cc58fea2c1dcf22b2ee6eade5eb29d8790527fc474bc861ceb00acb60dc83e08e969f46eadeb7d42e2378e77819e806acf0393446984e6505c158adf48e001d5a9d30d8b203d780927342df2dea0f1c620c19851a1e24f0ac5f408fb2df6c64dfd7083db85dc5467ecb4392a9d5db3d24066a527cab759cbe191f06334a64fe9caae96c103882cbc61f84cad4bb060e16fb76384e572bc17780ab4e5d6e0cfd8f51fc05dfc09348db95f770d533e6b094d774a654143305a0c2421bc2da90341c06b14139abddc37359d4721037eee31c0f2970ff9ecfe173b07a1a243e8d7d4c754d04b9371eaa69e73f3abd49aa8bb60986960e3073d416393aed19f89fe27cc030f5a0c34cc2a49f661688187476bd21e8ce1880b77e163dd37107f30aeab075b62037cc0236ef90ade752251d730e023972d08f63e6193143c2a22f9775a3cee4b1cd2a277078ce96b2a3f69419efbf18398f6e9e315837c6b08b9e58bb2a9ed3bd4d54000002280000022400000220169a151d4f896852bf9354337da727dfc735e2d08b38a302615f4ad541691dd5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001259d7f87c707a7196b05daf65146643e3b5638d1c9b8bbc6f4aa7d305865f1dac05ce76778b8c97dd7460b874d4e7dca7700d63912644d44abcf4d1448fd925065bab6d7bc586ba81bc850fd5cd7b2b00026dd984d2a39d2a8df75b2bd3305af675d25634acc85d5958eb71197b5c186dddd813f567f1ec95cce1d6a0c6431675931d2f3e637453c3ed518531ea0a9bb5110bd70b5578ccbc8e6da182d1f053731a65d56fd07bc7d36fd5ad6f3ffba6ca44a6c605cb9d6ddde1fd527067f6263d1a085af440a05d9002b51da28bdd2107715cda8a0732aefc041e9c19e35e98f12c563d389244c21d56a6fb38d873945b23cac318bf0641625e37dbdb821d3c13491490a5e76655dc8476d9d701dfa0d530a1b9ffd5be9728bc42bd512f1b13cb9a788ed7a5ec805ccd0bd3a0785c72be0468037179e3c7462aa15b6ed0bd0b5785606a1c4a560f513b4c13835420ce043bd8b4575cc1736980021439760ccc66158d7ec9781e23218a4a2af8be3b1deac2c1c9f313eaa4fa3cd6ff46dbc4883ad83a6ac760444d899be0a4058f951e34ca6c73cb7649fc7cf3c3c11d71f43649486ebc6b6115d81785c3a91c83cef231cf69e0499ee988d3ef901d6781a3c5000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40123efd68d575563dadd721863d83a38ac2145c6d543bae57237ce5966dd5dc6160220b247fcdd400190f4a4162cf7559c279d7b7fdd35726d367f51b28c4f2d50b4005a4f5c2507579bb3f17f7815802c5583c2172bfe8b3b46f92f5e2536500ab400000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5efd7c7c68ee1c550c159016df4a6bd21142599a619c970b871db642a0d344ed01dda73cf53750fa819d696a1c73cc540927925f52ee4b915168f01d1bda7430b0a43f7f2a7a7e9729e7ad0b6725650a32f39065277a7489df7ba67a416220bdd6cc09107203a749e117d3a58b082163e4197f8b7d47bd37969485be57192817228ec2aea707952e5e5db5743da3cddd16ffb1af692526bd2d8874fd4cccf6ef06b8c31dd0e877951b1954c10e1f39c37f44fdaad5bbb2c6b1736be97287d28e3927cee3234f0143180d570046ad0ae5d794f3f6be9479de05cb6fdc045e8675c40fb3fc7ce0e903df2b100e0f95bfe5dd5d9323d5cf995c83704465e9e41b34ed1fa0a0babbc60daac274c3765e1c9aa02215980dc29b10bb3fb6a0f5f7bc99288077383e21683e8cf4566d41bb81bcb473264dce4736700ce281415b7c76296b36c83af9834d5a5097f1b12a43a8f62fec87845839e22b33bfa3733914ef5714d59fbe0396bd05f82305fd4a11079c03bd80869c0255995013ebbec3ef30154ac53caf7e146bc176e4ae56e96e8f755781fe8f4a0fae87bc598a6ff776a07e32c225fb09494a0fe0c7bd4457e8d7f0f4cae57a3d2e543899366bb2416b5dedc68d2057347858d0d8996b6bb333ba4588b38fa66635f9c0e75e10971122eaa00000228000002240000022026a8fb2cb3fd39d0b413d1632a5311b57265f101cc54475a6c08cd632232a5b1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001622056d9dabf34ccc959afdfc7b4ae5065a19a878d04e3c5035f0a1f83b7d212cc664070feab62a06ff0ca4a638c6f9ba1d076c47eb1849b2980b2f707681b9e32f3dfa9b3623f3b296b79174f74bfeed6e979047d76f9a84cdd98e492bcf3c900a935568d29815d319a96b344225240508035f8f91b7d41071bee19d4ee8bbe4e2a163ce0ebc87da62c2f095dda1fa94b9ff22a11b873af0b9b3072cef564d3ef5640a7090a393bead8731400db75578e5d0d6db86c1f6436599fe41201aad23f295ceb9412b9eacb73abe0e6ef2d3369ae0733d7992205b82f7e245a33fcca68c82d944ea535841cfb33d6e2c993c55f84f1ed298cfc3f53453dc6ed67ac6b480f9b60b2384956d1ab91cf22a857cf54f25b34b4ab273d2476f44b1ca368e78206f020cf172ec000ffdcfb17aa77d14049cb30f7cdcf2a9966751dda22d02e5f09daebb82341e15ed19fad2df799944d8bec9bf580b9073f007a835303de08b799fce7cb62546554a1a25d46c027b81436a2136bb47eb6422784a7f0f9ea9052466dce523fd684c443518277d56091b1f7970068930489a18d0a6a14b55a10090a4a2273606bd3e70f21561148812e86a55ccda9c48946f1fbc3941d1721e000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80209e67bb2e957fda3da610fbae9c30eef6938c6294f49e27950235df74d564a7404ece774d5182eaaf98234e91767cbc57782ab3776dbdb651ba6be13d8a5f50a0220b7a0276917ddbb5c28c8da76dcef63a3cd01d32285d82a1a01d55f62575c55078601638af36ce2977bcd623697aadcad8bb48b009a14be3397d1b1575a56830000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000223d59a6cf54c27abed202d41addc28b3fcf0a7dcab1f76576425dccce84803505cec1d5240121bc013a5fe2dd2794adaea3bf6dbe307646444d4ab4de5caa3afa7936fe5ede8900fbb7e532e016b671b8e670c4ac5f00f4e7c6d1958cbf6451e06469735d9a7ac02b4261b389fa545f54b2889de9ba33449d362ae9529e6e247fde4a201bd3fa1115f404726ed735448fcbfeb6afa6c1ff099d989f579ca78f9299dae9b773de2c378e1e5c46a48f7ffbeaa131ede656be270187716d366924a98db729e5ab07feb7d7f7b6ff5b940da62a2e73076ece9a3582e7739cbdfd26e3fc00286133cad6a0308bd364e1882ea548813293dd171fe7a6abefd16435c0c1950650ae9d3b5f5eb74fcdea018c6568031ddb7fd2363d1321a653102642606ab33e28ee994159498509f903ca7a7a3ab2f837fcd560f73ad65e59f98d0fc88616676eb47fdafc62b14503e36ab3de112125e811c523d9d26b1d41600c066eaccb21007f5030b583c482e1232e2699f16898e69b5d6f5716e51c5c82270dc1836be030f123731ffd6f7e978dad8136ae0211d0e042d0adae7c3c4e7a41b5dfcc49b4e8d6a32b7009487541ecc4ebff5ccfdf8556d038fde68f5e5478652fb390ee726a36b94cb6d93c1bbd20f24f0dac5e9da5dd719cbf69ffaeaf95499bce000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000181d1afa65bfcbef824dc49517170b960ca0d6748d60981520c4fa07f4a3a84913f58791418f2749114be10766cea02dc2d3649bd1d9ccdc4de19d8796ef8f8bda1c44c304c41103aec82d62b6d68fa018c4257981ec5fe03ca9c06feaa7752823aec7b2edb1fb19ccb8d71cfb47fa9243c2f0905cc6b1db8bdd2c811db0f0b814bcd3da9f5c1c3dffde9e4b302cacb395744d2a86627f4c9807195f52e0ae49c0c3c1eb13221858861d174b46bb0ab5582cf82bb2a3a5bf1aa31293de388b9d5d9c839120befd8c2f89349e3d1892070c07159ed62e2a3ff491d5d2f5d1708dfaa17ab7ec70549078c5902efaa3c45765e9db478ddda8aef71285e3392ebac1124261ef430ba4eb6ac881dfed98a66aa1d64fc6c6e035e5abae33cf89fdddc194cc252b60a833f308f9e5f697b291c077d636656d65f28e670b696d1311be28bff784e261906a4ab799ba59c68fac954773a477765527faa66027fcb5f37b0b453c1a8322e682038ed167b9e376aa3b2cfa9b8fa4dc705fd7899e54e8edd914954b1ea619ce9b616ae788f727735a5288da4c62a35200181e20bff8770e5789f342e729e9989342a6b9a5e46022b8f63a4d663447e6de6bb50cd928a00b3f27162df79ea49b00346261ef598b0d58a1a4b3c4fbd125af2251574c9f305b73e70000022800000224000002202c62dc05182b5aeb4dce9438e4b8b50d13db057f5c87799129c3b2b2f95e1dd4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009caad7899774b02bcfe3da59e88d8d28e4364109a9ed1a29fd57b7b30c9fb9238a4e8f25079c9366e7bbb62c9989a0d23e38c7a55737b1eb7e9901d49cabc1924d752e41512db40b01fbda03cd1a9edfd0fbb38a3e93ddb09eb477d73037cdaad4a51f96e7dc5853734970cc9b5bfe6607c7be2eb3a3e96e64637b47d27c83dd2010840497f264a9288d87c353a70d1a4cb9f29cf775dbb3c389ba1ff16699834b9bd0441c78ea8f095de9e94b00e6f6bf32a2459cc39e086f771844afdd4acc29729dabde64ebb03e112846586d4172ebf8d4964d172861ac6ac5aec793869c6c227b1f4da28f232a3e87511ef6ec0c0d3cba825662cb2e5d16c43122d292b97968224e39ad9fec545ea2a37e5119322f9561701429e60b0307ae064dc1b617b6a60098e6a01e335955d82f1234866e6fe1e4df972a78cac848f04993ad49d320a8895a25310218cc6627a6fe2c8ca17babc798b07baf8f36e08d9fd2be2579c229e3b3657ab46722ca15cf828016acfd22355642f29867d9572d2bcc8957b18c342dc090b0ad34cb40a36ba011afc4bb725ff92f10b1c9102a5b38df9dd525dcfe7ddb88ada68a02c852f3efc247b2fa21468715f5d51dbd5c8c06c19b745e000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401001f288cf7c01a63e0064725456a5a4872753fcbeff7f602de2f455f9bda4ea7022242f0098291d156daf10dec2e9a7abbbbff9c116a97308380b4620d787a663f16bea82e0e3c77e795c4b2fff24ec2f358ed694c7e3df887234c52d27946930900000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000885a09a24aa3f3c78f12b6b5b8bfe0eed1f266718a69c20487a7f09cf3340c4f4b1e4cc3ff1fd44a728398c30d63ab4438ddb6e85579904f6aaaa6957ab1db074e018bb1f120469a303c64896a44df4322c310318460631f61a3822628392d64c4475ee9f97ea8dd9f61996403b7a49ae70a92de51d7723a448d0b536f6752308530db2fa602ca352891a5603b1dc849b91784ddd1aaa8fbd6aab6bb90224406661efd7051566168e604f72912c34a8d80d4648cef9974f56374e191041cf664b5c94f39341bb474b5ffa47e09a7192b661a57ed8c7752624c3f3b3cf25edd9478beff5825b9d4444f7dd4d83b5117b193d658e25805d738e19ece94c0355d86e40940d3e165110acc1285b192a6021e4e88eefb830a06b30c5197d8a2c221e653e6828bdfe734d419b8872a4bfd915e7ddd3fd26789923709c195523eb3c64322829c67462ec287638b7be7ead85fad65f23f0bde68f3fe01e7f703159b2dfc56c61fc8156520632e7d77a144f92af7ba9cb13e92a89bd504611f8831216a641aee1603e78868a7d76a89e97ad5d2c7753b3fa379bcf6cc53afeca7b94b06c46ff48930774229fa6a3702af9338895fb096c6f8522998b9eb590f5d894260fee5d2673e23f2cb26729cfcfa7839e5b04b1d1d81b312b6c408ae028e4103336c000002280000022400000220224a969cf4c6f68918bdcdf32d50cf6148f36dcdc583b1bdab719efe33a2224700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac20bbac9b98dd2c7bcedc734d97e2f4e3f166ea874d60c2757fb6f83ac1ca76f6417dcaf1543045eeac0251292aebe561fb0f74dd2ab59b09f4dfcccc0c4ee5c5bf8c7811329428f041aab691267ee6ea9687859a69bc49004c63bf2b0e16dbb9640610fb6e33a723d53e7e65607274e53f599d2d5c50df7bb3c0fe496cf81d7905dae749b16ea9a682754b54f37bdae46006a23eac8061470fda037bd7d5bc794192896838281ac30e19db1dd1b0489b8f69eef84e279a30a7ae2c500690e7ce35097f8efb22e4f7f5d646a76fc7087adf9770909440898944bd5d064ce5e35fa53dec6883235ec4b197a53c8285bba2ef1dd081720991db94ea6149fc0cac4cf36b7c77f04741fe273261205a1d2b02b8657080aa923fdeabf6e1759bc77849fec05456af9af6437b01d450cb7e71cecb673b2fb4e1358852fcb529b999f639c229a0391149fbfa888a083ccd4d0a4187273ce6652c57625b18be2eb4c4bdc8a929407acbec790229c10bfd559d305f596402aa1eb30608887f69fc4af1ce9c8300c393da251d2b060c910a89739c610d9ca1171c74860c8a455e82dd2ed0e43e53ffb89d5e6a27b79e1bc994e5a2bd5a56b1a43ce7644d82633211bfaa14000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011cefd32bbd5b8229fcceb81465914d0963fabb096b808b1446b553220178ec5502261295fad7ac2f3939755c05783ed811fbae0754502ff646540dc07ebd010aa818c3155a0b051a46e8b54efa76af22e6c25e9758dbcab7d2efea8e2163149e0f000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e988b9b60b37cae2d470d044e9e86197c45e78a8a926c2a871776cf9748ec7c278e34fbc1f744305c307c0f8a50befc1006a54080ed0f5d9754810b3fc6f9ecc3b979464d736a295c65a3207d50d7534a4233635b233fd5ec70b1b729e8c8a603ad8495c6b860e3cb295f6c38916163e3f2e0bae9c4c10888157adcd3c1062d0116cc7b122baaab71f201b7782a4c4a652a585c955cfc17a92cddaa95fb77917ddbaefb7528b061f88acb36c550567d7f6657f185bf72e74fae9ca1ff36f579e84737c64485a1e604d20dd345338389ffc30ebdb23982abb12d54be0ab8a4f9968b445237bcfb3d6a9e0ff5311bfe0821ffd1f5e98c56e6119ac692ecceb68f283dbe1a088139cdc80fa1b4f7fe160abe2cef22f26857c36b6cca84ca000a1cb2c08a9d0de4244d015b52b99bc39b84bce861b9c0a38df171be43c252645462de1813e4e7a8845daba6294c8e8c9507b23acad0b0881dd3cbb4c430400a48bb6fdedeae91d3d22ed8447d9bfd2f0e2cef6c820f4e02c4abc446d3e75c008757f80795757bd92fc1de9f393b4ed571880af3883fdfb18600619a3c360a8a9601f20705d0336f270d90d6a88958f1636a0b5505e49b2d6d63b27343d708bc688de921cb400af029a45d25f1bcd81e6b555647b9b7dca93162976e70e45831114e0000022800000224000002202c18cf54ee8ac4c6735b07037bc8ede4798ee53a145618fbb337694d0ad7259600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000959356bc4df6f90e7feb2bb1ca29c3379af2686c0ba6960be371a92484d40c5e6ec904d8fe8231d4d48cefea5ded62cc90708db584911eb472096085d47fcfd83bac91afe37653712c154372f2ce44a8263ef02c86954caff0149d6257af09dbfe90591c304c182d4261854f7506cf5004aa4c6eb0d8cc7ff6f85a2c94e1831b35f854f99c1c067cc80f58c6320cde97147f9fc36b7c930521f8ee0d06216f143d52fef416585012bfdb0105e89c1606d407cd3aac85514e47148329170a598e26383572b45ec8315af8b7e0d546bce5024e8d61ed610fa7644e82771d1df67e80d764adf53ab32a021dc9319b61b0d11497482f64e9f8f13d7105b1e68b914eb858a826a52d863ff7721878c07793547a0912642aaf15b9e8eb7c3be2c4ce29f04172c9aaa9a46ee7e6730a4b1881b6876bef0a6a35c4dd5fda9f14b78a05e9c5a4e02daf9c5d51624b2ee7ca1dfe4fe24dc4a46e24bccc1a9aac288b746942bb1e9475dd95a52f3038e52a74b979fce9541888d4c84f226f69e2679e8831242278f879c2e8e6257188ca099698c0543684f15ff8ba75912d60bd8312e23fab6874f8c6d697a355b93d409053cc0578baff7793435b85aa228797e48e6e897f000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40125b76784705766b67d910e5b97a5c239a66fdd7811a138396e1e66026a60e82d0227aa102675b1e20f9cefc07be65eb133ec67c882a3e5f71ed37e75f76f5a826301b92ec48f7b08075a9c7ad1b4fa220c308e114134d0a6bb16167ccc829c048200000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000266aee4d233bb04f080aca06e589b8e7b3f37e14158924e136dd41c665abac07f7781380f2c9d33f49a155a72ecf35b8a78852906bb53ae55e648a98c190b65b91434dcf5c0aefa672f92be9540999a148bf66a46a37b4679d37dc7f1784022418c4f561062fa9d9d5609e05cd4cbe9298ee66ee5dcb933731320a49c51deda577b39cbf64598edcc7ef0fb0bc7a1c3b3fb25e0d515616774b25ee8789ca25b83cb38e24db646d495650e6792015a77544bd2724ed7e4cb2af3fa033b5325a2a464ca53338f4e33ec1754f6098584007d0e00433765780c145e79de25d2403ffa6cf3b021a13b942695072efe05e422dbccf7b4847ef686048e29940d880f211b16f96ba1f91ef2db201cd5aafb0308bcef6ae2161a5cd7aed5f246f9521dac6191cc61851ba60182017c20013039b1a892dfa3d8cbb929fb739d8361efe2ff7d3ce6250b6c006fdc691d5c838ef7f9e0132c420448d951f78a876a38626f3568a18f81795709db7edc4919af85407f9f48308390bc21e99ca440857bdd92f932322ef2becc543010a60dcfc5d74a16dbe74796d1a16124c67105ee2afdc836b5bca5df8b4eeb1c681520d53c71afc020052e5857e309eddb134d3e11685e38d6f8e953427dcf91040296d7f0db6483e399c094b062160c7c4b67724dc41456400000228000002240000022001ebee08bdabd087a171bf914dae8bb338b15ebfa21b73faf42e3f9373445131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b2b4eef95cce1bd15af29fb53b38ed0dffb8e4e27c70ebd924bc395312f79f22627466a829961932bc67c75ed2a242b91bfe67ec7ff89ec43d1daefd0984fa4a9d136d6c44483e3a0f7bcb9e2a833178511dbbacb4ee28b9b54b9382b7319e765c9ef1c95a78c5fe2c79f9bbf60728ccd62ef2c2ffb18857be216b82e277bbf32f95256922cdb45ad6657a8c1297097c51b91ca2c4788c55ed9836a8c5dd4f3571ab83f977df3f539a5d18dd9bd1b4140a1920316e1bfe39ca3427783709d946fe4622ea7a2816d61032bfd051b8fce44a6c340038a9cb43be82fcae9e00066a99da717684872971271ab2d4bb81c13b17764e33fa742cfaf455c4595b07ab40c898c9ac9150708a7e9f217b20d6492165621a1773e6528668b6a2cdd40f73e46760dcf53c1c288e52a208baa37b592cbd1c0978db48b872df5911ba217bf34fc64bd9fb7d15d768d1eb906a467eafc23218600bb13d97fa57186cea1ae5fa9806a1fa7b4b01c63c8bb55bd790d33bb8b6755b46a9f9c9cbbae2b5f3a3b27da8daff4643b697833981261f0f9aaa941bafc74e617244cc0233b7b0fdcfc300ab7633687709e53f163122ef2c047382836dec6a0f8a308417c3f784d8b860b90000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401004e7da89ac4afb47fe64568cf7a77a31786567ba97cf8e3aaac23b2af146e2a0229025788815a8e277a8b985199833587068585e9ccd3ddf548f3068e34bcc4da0a1463860e0479395d7881dc8d2ccbee59bfb43de0904a44926cc9dd9b20cbb60000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080b1cc9c231f5cd2b577d267cac0dc601a8de40beb4a8d6fa95a97a92891d28a8d7965fd51ece0cb3912804345a54578aa06c4003208f090817ebd60f7d2e4233ab505084e99500cdf0d06dadfec1f00601f58536e3bc6eec8f695dea069baa3226b2d6ea9ed2b9b79c8615cf6d4aa53c25bf9f3452788112ab774878afd9ca23396893321954f066c4b01c751c965312433ccd23680129a56d70a1a06620983f119050ffef6529f78ddefed0c52f5f14a8106902d44d000cd0ccbd07d21b264d1b0caa55dfc976e8de6f8dcfd20ae5b03a0d85a9fb600ca126a554ef8b7b2b8f82f3d6acacdadee32823adb1814cd5aca98ad4f240bc010a1e16181269c356604f854abbc979c1858503737985c33ee7e88ce9baef35299c0c61968e2908443c8c0759e952e125df8f7c0308f623e0d3b1c9e32f38d4e372f5cf1067eb6e650ebe6cabc048124f3d3928cd7e82d9ec72bd41073fb584585002b00f2f76152d477a221eb233af2e3f0e1619f4c8597ee7e7004813401f8530d19d606a922eb296eebd61c553a09878186894dfee8b3384419749eb0015fc8bb99b1cad4efa57c116c8f436902ad91cf154c8f2bbef1cd9822d54ddfbde40d60cd6968f636da0fd520c47688ac96bcae5eb2af644364a87ac197439d6ecebf1c04034266eac1270000022800000224000002202a77197389955cc84371986b10c51c5d9cec3709711ff38f650f5f3875cb86fb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062d39d8b1be7ec930220aa9b1d9ab1f6e6d94ad67428939c030306aad0847f2e5e11cf64a4398e9e778f346329e1f971cc93acf0ba1e19cf4d862aa560c9538eeef5d96f54a1800acda529b53027d1defcd48ff35576a8c0af18c893d7d6e3aa2e54bd60a36e8a1030a1e1b31eec879444c8bd597ede1ee68aa0b7f375e5a598bec4eb73c32356ffc3ad2567af61bb31a22e155af1d2b5a14cdcfe75069b28207b85039e132528a4b41828b7d7ff2e25a711a8c992a45f3caf7759d7da33e5d69cea621c250e3ea81ae9af6c191e8da928f332b504871c720cca8414af979fab38c6c66bfb65abe8ae2d0431908be538d89282c60f690c3bd703f653d0ad8d6d440415b0dd5fc63409a14a4d5ae86821ccc5a03908505d0d161ef31be642e0c3954f1e750c41159c93b14369e4033201092cd05b6c457deeb43ef4c6f900e810615b55782c0241a4ba558adcd4220243e724fb17c97a7c1fbb8f07e4ffcdb377eb0b69a8faa00ef38ccb5a54ea98de495c8d75a9f58623d50e5915c1907c127499141f6c9ca177fc93a5288562919df9eb9fad995255436888d7743f7d856097243435585243c9b4236bcb0bdc4a5348ae96bb32ca1c8822e9bf809ab9fca3f000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011b981685e44e4357a04ece06ad1bd3ae8177b6b1bf31abe22d56817ae21046ef022a77dd20ea534fbe1b9e24993ef6a25b97f799c336ceec317f16748cefe62cb516fbf663c77470d23239308c037fef98743d2e78282f8bd561575b595d11c5b700000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9ad55423598c0d2395f0344c3ecfd4e85416e764e85926e20794fcdcb5cd6da36d1193c29ee11de5948b3227ec358653928eab5a2a9051262d024be5c6ef16236e5f3c5d88924540022c1f23a43c023dd1795d5ad433de0d04ad8cdf992a757628eeab51aa337a9f7b4edecbe6df50af950c24ee31d316bab6469d4ddac134e3a4aa9f6df70bcd7f2121b4ee65119250b6ec37ab6aa1de3de4288675bd3f8aa282f414823aa1e8fa84df89e3e73c6356564ae313135dcd8f8625c42f883c80770ec22776259a58fad80ddff0866f4244eb97afa463d42e8ea5231e924d00dbcb5dc1eb19e08dd51ac2ff5af9f7499e9228f6912921632f492c2f960fc6d55f073c15a8adec1207b827eb6bf06fce438bf7c947838241f8a35e90cc24c8e7d9405cdae26640458c45325e8973cdc928367175713d2dba431dee13ad651fe940bdb620a88f0a165c9548a832c1f2f2bac2d993d60afc706197d7cb68394eb213b243a05a9f01ba4bb8734591765669fb7805ce084d1b0093d3abead03c869b8ef7d9ac7343942aab1f6dcf3e87cd7988884e6e1cd896dde15c164358d87c3dfc8a70dc926a7734c72d81655041fda19fd5795a65485bbcb276f706ee8ba666b45a8c35be2d1ba3d10070560466b920e105d8e76158ea0e87c864646898dcba44d0000022800000224000002200f6b4d5e15657d2ed0f4e4a46950144fbb4877a2df9bc446e84c6a59b290b4ee00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000182e14c1451128e2c26b74999d39aac00e905b309c4ea6b41b5543c2714f7921d272d34c2038bc04fac687034205fa19d898480a2303221097ad71534ca17bc2f46cc659a651e2209b74f29e554af52ac7c3ed7f4cdfc15bd9ba17427d924d3d5c4eb58caa298d87ad74b1c39b47f239849b1609e85c6461a881ee60c2f040a294f8c340197e509bcfda9b4f3dd08e32619e3c2fe945d7b5f4841ae1484c7c28b89157c20b3c4126b037eacf0a0abd3823ad269d1031b6b7ebe13d8cbbdda08aafbb6ba8aa4f78279884cc531ff751834b58b1035479e9dc12d31862d3ca60c34fa02783937071f0f1451946eadb93f13235446ee99a6d4dae148d1ea6dcab1de90a3cd89519bc426e2b751ea00a32fe9a6c7daa75d69895d09baaa0e3a4259db44adcb7d1a8a882bd2abfdc660d85b59f34782d4fc293e2543f410e0242dce16d4c4a0525f01fed0de7d31858badee122c795c44b0892e38af33db0fc91385c482bf315e97d609f5264c3fa511f7f0a018a41a84dd362797ea0f57ba6f33397f121c4470eecb216fad0c41ad841a5d0dc053a642295822ed6594a3501259cf737586eb13fab144b79f5bcd8c198440dcb4ebf8559d0f971f49ccaf91d406838000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010140edff0f54a3df797b57256b9c513429f3c9995dd357bd4573979144dd8e49022a8e35cc4fa4e759d44c60de008f8738171ca04ce4362b7030465fcb3598cee401db063b6e9fd3a19446667115bd1830d60ee9343fde61fd07f6f42ad6ccedc20000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024a159c7ff66ccbbf8a1039cefa9e9752a44e2c7e0f2970e954acc24661ecb194b2a8fd5aa4b67d4785777006d5a8fe9ec6ba6d12336cac2f56ed4b145528dbfca733891c139a70ed9ede223980df6e4f84d506e17f9e95d311bd2ad0bea80ed8fe2927f44a19a8e9fdd3b8bcc5231c59ffd22c63071ee60972f07a17629ba8ac504c891128b63dbce1ea2bbc81b6adc51d6b3b7da111fed571c733cae76e1ef0a9259d5307fc448bf2d883bce1ff97b68adb13e55027a05ff5444b159ad7f1da125cffa02da81b3c9c140bc120c27fc4c005c33df81eacd02b5b47e3ec13c8cd9443bd09d3201ad3f7dab79db2353a8dd9246a3eae78ff59c426ead5e48f7553f72b2be319422cc705f3fbd7ea8fa152a50ec87c593ac3f8b176e56a80857a4cefe9f252965ac3c23f273bb9cd53c682f569281b50f389594cf84123913d5010fa1d5f8ecc9ae0f04ca0375bdbf2945cf5b6b9394b997a0dc748763f0469c9a71ef838a18d68eeefd7d7ca8966561c596e00e1bc050f274f941e3a7e7d304bd18ffd27f5730a0ffc574c51bb49d1afcd7e2e60c59e231dbf5e4915e0333f69eed34d01167ee3c050c94ea1b416899be7c8638e25d4ab7948e33b17040978a877ef800f6046070a79e9a12da3655a4f0dd7708add4e07e5963f6f998cfb798f6000002280000022400000220232bc0e62b948a400d09b3c9784374e021a1e36ff697349f564edce5caadbfd4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e16e6f150876cb178c19c955287002f983d7bcf11b002669b725ebf50679ccb6ed7071e540b21724d0d47d5dba1f3f89d0c99d576e01b99e5dd2212ec4820eacf66979a4ef1322d1ef3c9f09a446d6497e0439ba208c3de2abf6d256203c68bc25d6a249248a318836e2d165923c9d6520e2bcb04f9a0fb967832b8a4dc76249de3c164e48040ebf3457cb2347a6c51012789cfaa3574217407a66e81a1a66af3a2df4b7f1eb68bf9809b4393695fc2a751cad7ec4fa38da2d1d583a80d9bd8bb86e85abc3d0bae6505612466baf2ceb50a388bd41aec60bae8455763d4c8147a30501ff1664e7c22f5f11743b93bad2038eb2f360d4015a2e30486fd956f134352482b09e8f3d6798ae66e2642934f723212173a664303b98bc4444bd29995df653c7adcbb5b7f3ec8e25efad235b063b55709db96ddb73b46c4cbe7a114c8d3b92d7ae25aa13acb66e2c282313ae8128084d4d4890420cde0f8275df5c197c4a9c05872c54fdee607e0e360c9ff8c7d2ac6b3a98aab7576d73b0b040f5329c644751091c405709a0a823679935db00add79a72d372e669152e200b35212d10de65f8c2f572958d6f05ed790773717626f581d111fb8d10863a5d3dbab8c66000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40114574959d06364e4580bec7e23775b5384964e150382d8b9c2ad7393d4fbcd0b022d1644fb487d501bef17f8e1effb1a371c9a5f80ee6b03fb1fac9dbe258c06b324c340cee6d0fc29bc7de71a4e2e25ab29a13a8018c852d36d35b4feba936f420000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022e4f1db47900670bb8b96d068480287ff7b611c0c66557970cfb1af50074000b7ff778cb9edb64a9e496c79b005d30f6b492484714bf771f64ad1344efbc8ca19d19517c4b512f2a16267c494d11a3c611767f96b2ea8a7a19199af1ba81732a2c21415b5a1e83d0221d264b9ee75dd7b56018199030c30f8abb6132dff16850de9dae8e74bd9d3316ff7e60303c0026ac858478577b3f269fa08cdda99120fb23ea18a34267f7479f4a737d71ef2e00e3b4b32d9c440f440587723e3bcd5d058c7b7fb983a44f310a91ff84f0ec29e442cac28c501a4ae30c108e6ab76e314306fe029f245b2088bb40b202c4b2767df0232074a5f5ddbd41a4022e76983e26c645b2e89f86939b0b608f4432b6dab1a3e8eff4a73f82c970420e366fca2800815c4b9e973fbf6c6669a4785ae971dbaf08128057f21e81574394a1cec8265547a21d5b05603f1fc1b582b388fe88d163f6d614b3899450b86fc3409c6b7eb6249ad9d2aa5d278f122e56bcd1fde0af990276a9d1a8019cbc8a58fece6363ec7a0b90bddfefe0cd1bf359944430c3dae9d660629271b8b37c89c3d1cdc6173a59c1ad238801cc61f8c0bc56acfb042f2626dbdf8485f64d233d3a0f0b3cf35924fe331343298686d8c43ef40966639f821b99d476a4a91748a385aa6668b0f000002280000022400000220272315a01435a8089ee7277d3657f6049124ed677587b8ab4b7335668d044702000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cefef0c6420bb4a5687eb4e88a22e2ec629bfbceaf0dfe3705b2d9ad4f5e746bdd20acb4cce526be11e28516e3e94971b44c29875d8487515d42279138fd89a7fd3f02cbad66e265118432c175310a65b4f13b7d80c134adf22dff45226d20cd850e701186ba21228169972b64d0676a5f24b0087a870dd9f3668eb66b02a3c8b1a88857a6fa278a8469d3adfbcbf29584b67ec04c5f54af2e8ef49d32dc3f0478889a024a30d853f526b23e20c96f58d5c0f5ece5e1ffb08f8e8ab8a298b44718c32896fd34eb43236ccb8750051ed0f9d06197ee15984ef946e96b5076d4fc588b102377566489088f9946b2430da1176ed6d5c771fafb065d61d5e31cf3b5f4bc47b916ed323ff16e70187c513cc8d7f79187528a0d10b5fa23d2dec815d544975fc9adb8fcfc25100a304e99b2a6569bf4c2da2006786cbf6fdecf8d3cb840b743d06c9787ff2d92d3e0cf7881eddb379446d4aed859b0952c7cf9644ec524ec0740ac7b71d9bd13b5e5217a7eb9a7a9bb4426cbd0dc695b6f6c9599610f8b69649b8d71d0a9ad71cb3cb1a85a16842fe89973deffe8ce0c2cd5aed1f1e080342a499006b7ab075a0b59b1ae86c12cfed0fdc13d7182ab5cb74a79c915d000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022a5ca97c8b74d79bc313ec65188ffc25f730ad8eceb2682b545fc23b526171bd299471167bd86bdd4a336a69528990ce1986f72f097e65af4ebe711630e4cd8a022d2ad499f01178584e9c038c0d5d317f24af26bb0e4ee6ef423f60ad6dd2931d1b5cd55189bc90b01f15eee3567b39af3f15bbdc90edb2f14a60a30ae25fb7dc0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ec7dc28871543abf83638604a87c577a83cf18b5bda2a40247835ec41fe1c924af3db47ba6afacc50fea2195488ef88052f68ed960b3be5bb374e4dff3a2f1d9331f49b76e4a620f9c7fd4e2a7dc1c29c6747b268262790baf333cf84e81f5711fc3d8b7e223416a95353af021684fbf9d58159b6eabab0d6c463078ff8853a0ab012e525ab874639668f042aa602564e103c618644cf96f2feed6ba2b4e099552da207e7e295e040a8e6955ced9c9dd0b1e3d8d0ca4844d007f797e456b5f22604d9a29ae01f49add9cd1f88f3acff7417fabccfb2d7cdd8478acecdda800df15ca8b9d8dfb251c7960de90be4311390cf408ed8f3038a441baa271e5b9c28acd23ec9c608aaeab227bcc6ca6916b3db6489ed4b5d8a658a3445c01d10ba7d890b6279ac81df2dbcca692e8a950fdbeedcb40f7ce26c3d35b5d846c9a6e287e1c67c98b36c3a4dd65911a659c5ac9525558d5ffabacfce43ebe70f11c2a06054f192c80065dddd4d09dcb135a81ca4d7f65e4b369eff15090b7c9d826f661d5040dec32c54821033d1925641b49f0d10ca91be388f1a58d8ad5ff4531f3e1d7dc0c1491ab73037bd45896d97f6d17f390bbc6cd0947c5a8f8eb88e37dd07140b38b0d461cd26abd2b827898c27412889d7916cb07ed35e484ed41d32fe7fbf00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086ca6320d8ce7aa59ffd5c3b9e0a5aa8eb5f737eb9b68b677342a1b241e30a6b54d18a7081220312080a6a17857f4a44bd63c82d2223e95b163d27b0153c0d970cf9c5b369a98d3f67ed1d72d5f43700d967cc7a9ead5e130ecbf311017459b11439ce62964284979c0b009a7b9d7a57af23a01f3c5c50ff8c1f6a66492c59044c0ca872d5bded396e4b36520d3ea1d5a7050b5601df9355402dc97a23f32f5b19483847866a0b7f2ad939d9f36d74d1d0c032b28d40829ba229276e18e07b464aba4ef51653c46acd0d3de08635326f702a291a368658f94e29ae352855d8857f3f85c98716f1c4cc980e1e31d1447ba5b095ab3029f2d41c2331594161639a683b1613d59034f1cb3b23163990b11133443626460b4542ed188b537d9a5b448d7b82ea8c4fda6f1a844b4df3cb22155b24c4150086c26d5f74fdb2ff246850b22cf28f2ac9294ea1bb935d2430af3e2acfddc09000b50ded4b3e9ea247e2fba90432d3e8a3e6c5ba4485b5efc8910955ebab48ac1f5a5571e59ed2d7e96f638e08b8e0d8522f5a97649a11adb90bbe6cc74846582b52a6208c5cf0ca4f71047bab966f580d8ec88ac4645dc46013eb070d0a4188881adb93ae86d82b4f69aba7f41213408f5d5df46dae9f56f072265e511ed6ab19f20f6f29f522104b50ca0000022800000224000002200348bf4a7c3a911e67d173c6a5a1d86354f00698d18fdb832995824b9537145800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000982fd3e927f8879a88ef79500c43b425216dad627a71649e20dd6ecd2cafabb77d1c4a0442a0e5e6470c25e9094e1f2d8f5b75e7af5d178cddc143e5155c294840ee7a8a5adf01e0d3b4201884ad60b503195cfcdd6cb2d09396c2033f61eb147cf0e2791a633817359146e06ef296cc21316a1efe9255c55ae873b26899f41b2d25c421ff9c6181c3e9340196955e76988d9029ef2a39105064ce07fdaab0ed6c1c12c05951ebb04249854c1813ec1e047b600806996112148db2d87aa010493eaa9ce0308a0733b8cf055727f61aa54977597d5fb28ac38e4ef83205f2a73709a4f233a2f3df0f5663465aa38fb8662385f935c87d62399aa6e0d22bd078e584fb9c231ebb380eae8c2e47e09b76a4d599656b03a086dbd0b8c8193e375671c094173113ee98a80b695ddab7b615d2e4cf0be1abe60f877d463a217472c31f2bf58010e834b08e02002f5b577a42ad3a8e42ede3dae26139383be0796e96593d37b3ea2401b4287138ef3140c6158aa9ae37e58cfb8690a0e105a6a3504c97439a54b0f1cde401c436af78389c78f5507ee25e54f6d59600b1254db377bfc3cae95385ff36e7d3b6488b16566ca1fb07d94225eaf78d5b5d02b516a711ca95000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80215e5c8903aca81ee31f76c0a8ec729b00eec6ba0eacf4048da3627fbb190a6cb0be1dd921e2006240517418728ff5ca8e4decf35ff0c55db122c57a1345b87e4022de52bb89500ddd62da76d47056b9b33f364bceabc4484c62291abab063f553d1f1a213aac901d2a0f94c55c3cad68f6bddbe4d17f7dd6dd5ede43d70773f0bd0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ae08894de33c3747142eaae22c75aa5d8cdd1c6da5cbe69404e3c0e82f18a1d4dccafef9fe8fb3eb14f1a436a6cc41607644ae3b41d3c7712f68e980010a953a6528ef3f4f544cc7c97e7431d8f7f62d08b0b60870fed146d2ff5cbd46364f05369a9b2b41de45a3300740068573ed86ade075bace5a20762a8138243f91ecbc93b3989d3ff4ea2e2ed914a48882c771d0c39dc821ebeb5d25c8698972fa0f94d1e0c7323976c7865989ff6334a4b33e664f939fc87e3c3d5639b3847dfd95f1c9f2f720c80e31c11005115f5b5106a133f9bf856939f5c9451ab803e53eeb497526bba44e84c94a34107acb8294efa578d3d8ea188617fd29755076124abd68780f73897d8e5943f1c0e91e5dc33f9d0af51dfd971eb9a3821615e12f46e69a9b3605ffcb085816154f4eba83f42c30269e1a72319a9b294681bf4d22fc15c43778708bffc605845200c4e342adaf76f1f128bb5d135048355709087a44a57bb6cfea0067028624c48bf8e3c8d96e92f94d653738f13b5a3fa73ba48d306ac6058276ccfaaa445963a1ef73868590f9481d5857015803e8301657d6e8f13d87e9f0a80b495a9563934f1bfc5f360e6dfad9b4797023400cdac9740d5f5156584ef219a3450b0a558ca611e863369e88d2045cdc6972660802e176986efc7a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002af567da166c8671b05d85c45156562cceafd74f2abd77a77f15407dc2fcd63f057ae5cfc6e1c3dcb0e93d4b094732e3ee8c35525a00e7bd1d3ed5722da823ab3023bb5ba7d7baf01c2670316e21cde523b03878a384d467dfd58e4af2fc2dd6c61e84e039ced98efa654e1a7eebb971e6e8aec7bc7f144a5968dd83230629cc69204f82ba01e46be62754507ca257e537250e316b00f426b1902a942cff0c6939067389374a64462851b8a059c988f7ed7a3ace46395db60317fc0b55cf3bbb264e29237e1bdeaac3cc6dcb00f947d34580d63eb60ab3d506136417821c1d2d744dbd2666497d8c91472daf5b2d0a29232e8e2caee798b99435997b5d4ba0deaecd7be36723e36155a6743372d8c3b5934ecc94cd68d0bf37b2b49fe0ecaed76ab49a0249d53bd5b9ade2d882d900789d7a9f6303ccf851a5b099569db6bb4f702f6dab733ea55111932a16428b203f96a64deec8e2acb1efd171623169c5347e87bdb78a15eb92f7c8c58fc51b2bef3e11706f232f272d93363c95261a15114582f0ac5bf04960b417181f215e6694591e02be9a62cf3cd1234fc53bd22071af1b4c634783fb19e276e51132b3941af54f7910d27e9164618d450ea45d8b366b35933dd82613d705a9a13606e948d72150f1074baf3b90b99de68b84f4b3bf000002280000022400000220258dec160c4df34b1ef27214b48d8d2f5946360871e0f1a20ef9e494da6443210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092366a1d548666a70cf1a9d5922aeb1fa60655ce97ecb545a5713c1dc0ab52b44c8260fdb8d9e53c030d63a0a0b343ade9b8830376c6130c2a9ee9db0f8e2672474f2d63d4fab12f37a56bf6c417c7210ad5bfdb5db43d83cca1b724276179ae97d57108c8f34314dffd599fdfec9c74beb98ff9f736818b695b867c61ad8ca27fdb72b24c17ca41bfc5ada96c5e93a7c9c3626db9339e5b81151650a8f1ec7762bb4b8cc4ec55b833b56d48e0e999c44015531732d1a19cd910cbe8bb2367f5108eb7c74640f9a8c37091bda3c6e5ea06d84b0eb0f2dadc2fbe573b4e15c8af240055c06cc678eb04252b4a25a43da0db283f6ff8a71bb63a0b7faf5d5673e7465e5261e151f7745281eab05bdff7902ffdee3f79f1071fb88c06858fd9531f45ba8aac70b4e3056569d8362fd51d2cfeec2fa469193d8961a9e7b27d3196fa5a8d78d7598f7792fbe536b3e01839a11eb8815f95bd4e84d6ac4a42d853f811d08f9da642d499b42fb9d93af5c963f6a83e4905116123b242a528b20b7aa52c00ed03d39714260bc2c5e80340aea099fb178eb32ef33995a4a35ebaa9bb1a1d86eb9bf70a01bc2825f887ea46c344f39c954b9f3c1d541cf1f5a5a1b34276e6000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40110cf7d529e0b2d8957416589ef038a549ae81732fa3b334754eda67ba8d05995022ec452ba951421120437d1d8da22e180f9e1835cd0f53004e9a11bceb6a5409f0e18117181ba14f64be7d70a15ec50b9b9c5ac9b37ff5379a555cefc4a5782aa000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c36b3699eef17135925591abce237c35e210b358da33cb1473466a2bcfeb9c48d1de092f1a90fa84fcaedefcb6133b54733cfd27082799af6c924dd0534c318fbba2cf79674b13d87c4d278097c892d89e384560bf8a4102bd240a34f5e7a9a5dd0eacc86f69197308990db5bb35534bc1ee7f39dcb2c71e5014d4278bf0db5f41167cebfcae7df62561889f6aa0d47267489acb8c9b29386acbe02a7dfc7b5ff899b24ebe1e7aa0e4f3db9db27cbf6ced5f7a3a3d8de1188c4d05ab0b4657bfa9db74a150eae3c108389cced432ce2a47cb567fb0501f3639595089b689c1f127d70dcddaf7c784ba64ba78b73312f6be71ba7fbab6cb1a0b73a6e34558de16a3cacdba5cf13551193f85745daa4b8848ad558b3a11ba2d3d5c2bc8abb30b4839eacc15320726f577081d35c0d411b5597f08b2a59308a51cb87863a1264e36cdf3cc607e0dfb204a53d23890a4d19802119946dbe746af1f884320c4ff70fbb824572f09c16e38d6c0f5c3441f399bd6defe6f83739997b0c48f3ab3ca6f42926ca92c9192651fbc48ced99a1008ced9b30e10b95ddd1e3f23dd950f426ed33f45fdc448f37afb6fb414cba099b9b8ff4201f19871cdb1f3436b06760ec729e011bbf3733263625c061a2acdb1d0277c18d0583ae2b80de8520dfa68f379f0000022800000224000002201dd983daa06a8ed111c7e509490abd0bcdabfddf937e5d1e9e947180dc42c87e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adc47e9ce3ce9652c2761139cd98ae1911d6ec23429a07ef6ff53bc4c4df6e38d805a7f5ce7041f6a0c6fbc7b0b0cd5e6ff92e438a9972cec0d60a9e55d9e8de29c574e16b53fdccb3924d76824fd76656f6ae638f7f70e1780b5fd7df54b314a0a861651b77a7eb846e3145cf60d5210cc9344183954c9e5d743cd66bec8aadd6d00c8fc958bd80dae45cbf1c1af7a967ff821e9168e8c28de97bea75e6743487f66a79aba1651a4a18612678d816eec1414a6fb499cd7dd2e4b6da81664b0f0ea83750309646ffad5a9b2fff1f690fc1a7d6d5c117873630750c767d1b31b6f66f10a347db8e1e9269b88c837c8802bf3fa4301ff311bdb82d527fb31420aa583e50ab1590037830bf6b4f3f3f8cabcc7dfa8002915fe8355e4403e757f0ec9c6b8d6aed6506dd504c18d18992683bd64143fb9c11eda0d8c5fda2a27829c2ee26f970bbcb6f804fab67ca3c08f6b52340a177ae7f5794fc3896a3c9299cc994c257ff78ef94c676b6250dde23c6865e2d5f0dd99f75422b300c074640783fdf1c007b3fcf7c743e6b44ab9612315a2c237c5bf4e9783cc5de2ac00a184cd6c3467bde9a149d7475404f6b30bf38414328cf39b7b693d9d4cd4f47332761bb0000000400000000", + "140b77eec818ff534ad1fe35d0f0006702fc9f3d5b41bb4fd059e40c3bd7872900000011000000000000000000000000000000000000000000000000000000000000002400327565d5d3cbe3534f7c15eb52b1ac859f41bca7d5fdb9afbc517805753d9a00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000001100a139e6ba9b0ce75cb96e9f59139eb1d0bbb7a0d8c1b9953abdcd002d431f5f800006e801c97564cbc6697a355620f03222999034e27a75e464e26bb080b0fa434d3211d00006f00190b2bd9a61e15de13fdc0dd5db50292162dd32e7193b1d73f6a966182f7db8900006f000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000070dbdb14000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad36c30428925e070e5635b262013545b1f2e10460df793e684bc654cface43be07f695f000000120000002400000000000000000000000000000000000000000000000000000000000bec4cd80212d7cbbb46427b90e58ae0b60dbf283702eadce4a189c797e23a4875b058870a081f940c916c05f449e9e1397ec6b5d89dbbbaacb3b3abd6cd4dbadc338a631a0202e73ec8a430761fb1d9b75f6c6e274f7b54614a925eaac35f9b27c358cd7a342e2886f5bab99b5c25388576b71dc1529081780b30612b6964034f351ef249bf0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a648eb1650bd082765dd0c7867262c505d9203101e835343496cd84b696b85d04d2c9b84579b2883ec0765bc83a0d49144920acee8b01b4d676e655ca3786577f12b913cda7ac070eb888857d5e5ffb3e49155999487707239fc62ecf9c00720c5377b3e2cf4c16f4633ea4da28bed8d5a87c6860091bc6770a4f4293179bbf14a0c551acbd4c7906104bd497cdeca4b0ea1b0d628bfe19e169691286bb092e81f28468cd39d6507a3ead03f9f3a5dce1d76b1023f75f7001bf2797315f32aefc867bf594aa707be50ea72cc6539c4c1b567808a182c67e1c29d9893a394b6a3f06d4eb05d1499ec3d01d9f32d919c1798fc30b0d77c12e3b4239fbfe02eb3a2ba9bb091207cbfe3a14340021357c5eb1ba88cec7e90bd10a54780d834d53dadee86b069f09ac7ff4a77ec410cefe5cae3ba99ae66440bb1f16253f1ae4260a7a99da799323444f63b7d240272bdc54569b2d277780c498cde028e5a8f6740092380f02f77d1482a7ef1eaa69e047c93f464b49ed1dd15c90f6ca14e53f4eaae1fd226949d8155c29071787027d903a41210b907b88141b55cacd8a6a145920524a42c2c8da9848d298a0bec8d211fa0c54c696fd244dc116abe3b00f9303eab0a40afe2054d0de2b84260645e083222125690230e61e7abebd37ad3f929a4e000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000122cdf0a7caecec957873a468a8ad516bbc27aa9ea0c7a2fb0d431585566abf2d66c3c2c0f7fbe548d7c58b36580fb7bd55e6965b94764090996c4bcb029a420cd7b9d952204244ecf2a389b071dd7d901a4a49c3097dacd89f9f09141ddb4e930c7954a99a651def82148ad888aa7ccfe9184e79cb712616674eb58edc441bc9800076b94f6a6621fd08308e08040a2ac8ed3810f6b00f9a00e16b179c70024a5b5f26bd47426ea53e84e4ff72b6c474267a489546f3ac335c1f0fa3a29512b503a5f5426d608aef7c2a39a68d2d46c1ef5c74e7d3283ff2bab9b24dd4f1fb03db3cb1d3cc75ea6fdb8ea56b16a3b5d93346c544e6df7f4dba60875f68c9dfedaa4735a3aab4f8a945da4e774df5d1f0f185a4c7bdb09791ef0df941ede8aa012c68772b0f7d5e2d791ab9f99e10f4982cc4b6162b901cf5783a451f0eb15f87caa84f1d2f2dc9b05f30c163e06095efe0e8862d1778ed43f5626ca75b88892a687a63e7b193cf66759f5fc76fe2fd8bd2d8cc4971b2d5f4e12efdc2022b09ecf048fa478d4b0e8dd065ebc1873978cfac3bc99dc1a858a947a78e2574d799eebca8c7055140f941a67af204401c50c83d5c5112f57d559a80af7cbeef9b7ddc3b262de0208eedf2ac8a683b884319359d7ef57c89cea66b647f2b4bad489650000022800000224000002200f54a4f8eab9073e4f6987013d9da9e62f39fe733e964baa86db1e01f36a5a280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025465884b588dad25e26f57922b4b1db1698f0c3d0375769b3134e2f4910eaf3fa738a76b91fd25dbb9d0cdbc0443d301c1ab262219732973624219e675e6388f0f258174753baa61364caa871497f203defbe7f3e3583447512b45375854814165215647fa7dd23b161026f69199fefb34e671c28ecb8538ec7664be47341bf398cb2310b88bb32d504bbfb5107061ab184d0396de129759aabeefafebf88b97f47f3e688c20161f7fc0a279808c22f3c1902be57e2ce6cf712f1d961ea7f81a1def2b0425cfbd4d6b938850022fbe11f8d72051ebf863789f70d1397bc975bc23de2d6a90ac0db9d8cfa4de973c0b40b03bb7413df6b2a37c0623fb1d554aaaf648ebf8741493f4c04634903a2f62854f62143081e9eba4533e86146852a6882b8ecedd3ae605450b2c37e5773504361a70683a07e38c8200ecd19f236523f1d323720d4a5471e4516caf4ab2f74eef3a711942d921257f25c6cf2e5de91e7b78f3d3413d12b98639f65fec280218b3669b5264c786b844b61a00f795300c88ee1ec07c92b1686605a81795a82bcbe1db5353ecb9e353c40fc3352c8268da3bc7eeea7eee411c407af18f2ee677598b52de21b32e0aea53c13417eb9faeb76000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40108a8b13218177e1a3b0e8c4b9ab009a771f2c432d48b1bbd4e79a1f56c7ad28c0202f23b877d7a6ad74284d3b6b9d594032cfa80a2e39d78b935cc09586901dfd00b3f748a07b0f9d08573b02bf6ccf4cf87fc4b431dda1b58efdc3916999dce6300000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a416b2d2ff38500674bd0fb0cc1b2e7384da3bf8cad65e66b05ddd5f26c513c32a90553b02e6266e2956ab5ed9eacb7357db147dfcb04c6716789ee213b1ea280130552e617e8c1a42fd4e8e7c96627e5d240879b7e8fd36da4825bd4ebce4379177bc49da1a7287bf1adb2fb5a68d578306fa644cb69c4fbad1c247c41f752d394c9ebc227de746c850a24375173e6a7bb9bb6c167c489d928483cf95887a150b5f922501fe3f53dda3f9dfe98984729fb36f7f482ba8b9d0aaea83171ec6956cbe35eb259f208df50670a78e8dde931a56075e5a75f8476b07ab535e131de1542084767f3ae0b5071832aa4806817b589d283f3ffd205ddb3275ea101cd11cf3d4efaa3c92e2d114e49a902f518d520c9012036b6194ad3217cad08edde0495af13d7427ca77abff9654625136fedc88dd1f1643a6fa1ed62c1f4a8694e5aa52c0151d8f19fbc8d5cf583844baa27cd15826539efb28351f4df8de9efff76e2aa0f5fcfe2266a56c0d119765ad79ed389b73da92d3c92d333f9dc42a98748af2f164cab7c1a88b080dbf0c651ce4b6406cf885228756aae20ee52acd3df835421372135f1f70e942420ebc5b576571403ea188f4343f3c2785a5316ff9642cbadf56f3b3e9889662d7ca8f7b177ec49eb05c0ac0a24af3ca9abe6b2c82f4b70000022800000224000002200feeb8175b66c563d1c15d59c7ce85a679167f84bfeabba26111ccf5c568cbc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9c6732483346daf5d63e796de6fa17068fc7d971aad120c50eae83f8e3b803252b8910e5db49d4090b1d47214c24e264df0e3279cb79479920c4f9808c0b93029c86ff8e1bd82cae667ebd48db7f8fa30d78a96565d98d91aba62ecc42c724e61fe2d24c9afbc2a0ea24da08a0c2b702021958d296923df5d8451bef8926f9b3355985eae0c3ea3f5e730066ee0836c3f0f55931c3c3d817cf84ef8f9781ca3a963812bc4954cc10e015c5084da67b1b818371aeb93715e20f7784e679d77fcc2ae9da37ad1d1dbbe3d0d916fdd1021e3ca34328d756885ea970dcd447a3896747386635c5b496dd07dff1a2a50d0fa151cd4bdd4bdc6542e187886b6e14e1ee9b4fdcdc037b64b5718c1af67359620ea469b8ea2fd6f323fc199a17c3a7b5d54f1508b9312e4ed53bfef11cdd2d7e5598a6c594b0ad2bd1f144134b73d967e3ed983d284bdf1cde2fcfb82c7f67bd94b746681623bee9be6db5d5fafccd86eef58a840e55d53266cad645189a63bf53f92a90e50b2e9ed122ad6bacb8b7927f358fd15da0c8e77f2a30e9ec221312ab3b8a399f15716f1ff3342cc82fe254e77519bee53480f9905ee60decbce296b3ce547166a8c5d0b358a84c96ffce02000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8023004f373ef10abc4dffe4ee1d06c9ca85d98a96f474867ac12b13df8e125e9b5068fc8431b5974f92d56c1186cda5ae03c8f389c04efb1c56535b180a47cc47202041c54464af94f351641ff2b9ad6562f7a301c8c46d319a897e95150a70c0e481940316bd744fdaa6a0b315ccd7a7fee2ae5b2fa789a94a07fb25b761f290b860000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000910c8d235130c55ef47c404d02af504933d65045b8bd369bad203aec3c2da051ce0645712e307d805ba5074e484f2400ffd560511100ffc1956edcfea5959cc7c1ca4884564fd3868f8e881154916993ad29e3c1af4bec41648c19ebefe2870a3e58af23af656eb0344b63293187bacded208dd03d109aee2fd7f667c237f4f1993dc7ba01c50a1b43e81baaf880bedfb26af58684469c01c98efc29822d9eb6366c607ccac8110d296d2f331795d915c7a9eb8c9b9868c7259bf60db722584da4f6c0888883d11ccdab6de2e448f65defe5d6a0fcc4d52ed5743febf4545e4519bdb70fb22eabd35bb82594855224d492acdf369b1c716bdbb9c15ff4a2b5004a9270186fc3fa320efbc9c818fb9bfe357b3b2834574564f64cafce69ca79f74c8bf1ebf65dc28050ed8a0b34f07f63553a0f1d884d070d157e32f75b8c31b78bf598aba2b65038846e288f49d1fac7fb926048c4eed3ce2699ed9f4e55841123a00a6a6d5bf9e8fd42cb2051abb8fb72860b187efe908511271cc851492856107aedf5cc374cb2db0ec454809781a0ab741e388af8b37bb53930b09bb66441bd6185a936301f0fb786a21c7709b14f92fb5a1c4b1c435f34130be28dffa34c74a911b13f882bd75b63d6d606a260fa4b05e3b4d11c5258316566635510f1dd00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012ba034c46c00491980eb5549888909e41939ea01adf1c126d5160acf3c0e9933bb5d74aeac4674490b281c30ca8869abf4ff0ecde175e964232f60cebd0f6b3d6ed2a52ec31b2828696b93805bd50bb60380b7c1700fad988b585e23326ae69a674ca455399932b5a141d8f5c04ad518b81826b57713ff7b8186209f2e9b660807a35edfe647391d2509dad57fc20d7331c6926ba798fcf469170b882eabdc3352bd5c434175f2074767dedb97b84cf109eb7a60fd8d54bb27696c61ea7ac6cd4730faf21c197d691b0c7342a61eb085dfc29519ab12b8afdfd5f3a7bd7da5c6295d3206e6b53428a54e33b36ff981af72e8529cc836c355e3b32771341c14e5b254d16ff16e2ebc2fa6ab68bd84a039a368ca360cb3f2ed50014df2ce1b2231080d0a7a31ebc2edd50e16575ddfe08b6de6989709d0f833ec141080614345c26af9b52382b6f97ca00bc99ff4fc47b01050475a811045efc7ecb48b51fc255dba413c23b2682eb53a6348fb2b898011c6b7623a885e9096dd685c4a5a6f14bff7f0850c0e96c1058f18f9600b13a0e774c081a066cb264b0ccb5ab1ab3c5a255d5b200bcd7089d21c57feddae10139625c9223a503c21ee47d4f8f99a1aa9655fc69e71025f7dd0ab9ed887f2e393d62607e51fe16ea77d920695bfad3d2d200000228000002240000022021e927f13dfb7875af9bca3f3e23e66b7ff88af73e6de53093d8f8222fbd4827000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009026c5a6fcf0872201b73f8629bb8d9d03d6658bfc5712f995336014085fb95fc1c940dc4a2f6a8948057df1e4d48d25124636791b414a839f2585dde1692fdba3e9a6c2b2de450799cb3411e18a2344e6543f722015e6ab30f48b31af14399fd6be51919b0b85bf96121bfd25e8dc5b6443b0d379a26c81af305b4105f7b13c2097103315962d9d58095b3529193d285afbc5e5c961a25d141c4fea681950b310f85c749876c2782b05513f1f5d4a1de9e058525457167c5301f4a93565df08899b9bec4eb2acef909c17fbb443d36c113e7666d55ce1d5ac6f8c424b32876bb24c38b60a90414c59aa25d05d2a6a918648c93216f84cea1f77a2f0d03984b48c95986a21b9d8ff94b4c23a27c922a354c63386a48b8724ca5ad11e1000f4b18164ab4b8b792b93e19651cb746496ca3e4c38d1452c3073914304b2f5f091d9fec15fa61605039152edab64ba78bd1fb52759f77333d65fa1e6ec627930c14fd9a507da50c1bb304c7de656e08bf142dd699599da864dbfbdc64fb97b6a4c9fd956161e66b86d3472b290fd6bf2f1fae947c76595d7d5a2456bec125a9853d1c116cb7ab9270c06d3b52a23b11e218977581fed61a5334aeb10651e5109212c000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011082ed4ffe4ca4b665c2818c95f230a7b15b4e48546b5678ddb0bb6fc4e02cfc0204ee9b528c290f2920c531f22b9297e6c669a2acb2fa3d5b582e11ac379c1c79149fb4bb03443330360ee87cedce5e0c5b799889319ec7610ced2b8ea1c972c100000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3b80902e3d90430dbd54cf2e6600d248a7a6bd91a876c838a1ab06c19086fe6797a3179148250ef30e7759dcc2b5c9addded2fd1d8cbd6373e6c5f1302b3c9eabab59fde9ecba9dc6ea3428a74b29474374cb3badee81f90183d516fa170c99361a3057989e92ddab6e3b6cbd650960d5c4e1244ba4df1f15ad74244b956c4a540ebeb35e31d7313670da4e528ac6c0c521ecfd7c1e9b60cb6e4f7f43915b1571d7c7feccc738f308afb61c8d92e0c87d49ed0792c052a46bb3ff0a0721cd26ce1f53cf9fe58a4d54bc813dd6842994eb5bc78223fdac5a9d287c1dc98478dcd02a257bc1d7531e65288891690e694b3c53be333001704dccc5492b8f29101b4d899619ce00e1e86da1918e2d317060c06ddf2a9dba0b0f28da3adaa8032a77c0e94f3bccef8ba6a65667eda37fa87671b956d1403dbf839606ec175a0de844bcb8710311321675691689e3f115deab35c96992881fa106589ed8f6b11e62bc0c5791a18f16fa841adf101e749e0cf4cf40362198b84c4dd95fde2ab54c779d168fc044c8e53493623cf52a1690d95642d3d5fa1a8aad8873c530abe06b9313b05810145c271902b9ef4e5974b8c0d4b43791a34f498ed3ecd2986750120c430571df30e98bd6608de0ab223543bffeed8b9b53d60e649056909b610507edb30000022800000224000002201e666ce52177f3407223d2c35ca794d16c5998aab1e827a8a9f91df42568f732000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008baf9c0905f3f9036e26bf18bc7f82242ed22954e3681493faaace916334da76b4ec02930a15b6c951f9cc4be230b13a06c3dd1cd7fd1bfd6f7b6eeab940651af17fd328d8ae70b540cec29975c1b4d675715c668fa2f78a4370425f7f96e1670d42ad578b77770db650dca6219f04f5f9d9f250081821a55144f2e3bee40debc2fee413c397febfd2abeb94eea3d456945943d81751bbb78d480c919311a5e9c57c3ca4d72a5d443cb1927a582fcba3782f21918896bc6f9f7af7413689e99bb601f9b10ed2b35632b4b80a7e00d086040bb358328914e841cdbaa6f11aa17feceaa3ad4bb992feae0ec75d73c43995cf9894aef79a22d583c4474b0e253b4ed3e3ec8de85595700c18bfc2e0f87f5381f7bedc15244f591d08c5ec057362e224158182ab4e177c8a43ddd78bb128f0161659468cf35d7ec7a9e65952b308ccdc36093428ef05d4055bdd036f1459c0e5b15699db8ea490b3547fa4bedc7e94094b45a4bde8284d4e25eb2451f23300f6fbe5c81e8667c21e49ef464d59e8c86819ccdd9f7d85e2710a68c2866c5affc9def7c7d9a0c3a0a27b069c67d79f29cef570f7f05acaa0be851c3bdd32bce45fbe9b8102924d4b5fc208217fc7f7cc000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401064002999a72089a6cfbd33804ea179e2d019aa518d04bf2c8631cc7388d82350206000876239c1c6ec3b9c4b8e1542f6f16a32d471cfdffcddecaf9a63feb32d70ada2c3817a5e48583f2454d83360aa0876f4cd36b65d2c070015ba01602972d00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000154818f39d33e07da415ab3de479772f36d29fe39585af9d2ce3c09ab7cbaa108009966bd2e544ad8cbbe292b90b4cc01dbe7cff62e2ac5a479ecefe773a611c679d9b8060f962e1cc6f997e921173d796500fdcdcf8c4847355ea61628c3eda9131058542008aafc9e23d0f46f788f8bbc2102ba1d0a8159d9047d292025a4cbbe772d4bc0abe827fcf7c14a17dc899feb468857dd857dc1d9dddbcca1b3adfa11276c60c5de2fdee59bd8c347f823a17e76fd2cba34fb1760b825460350f5ba5fc1094745a7ad513857309e1d481bc28ae0686226ffa4a8814209c7a170690a72553e34eafc971b943e0abf7f9559150cc821e639c86d7290fe733c82a29e0dbe93c0bfa9794d89e4443738eff00eb27ca8dec386415b3ef6f9e91ae87b815af3fe9446ab06861d1a6240a6865ecba1995601f96bb7201d2d7738d449fa1feeb6c78cf523e7a3062ae7e9a698a0b805d3f2dba8e4225b58de0e05ca69e4c6fff51eb7355b84c8b16dc7eeb4a030a10831365b6fac6a944983a9e8f7f1dd279f57c1f37e83c738381b8f95a05129e9050a5b073da7487e65f4116f05f91c89781ea98a1cbe35e399a83435bab599aafea16540068fe7fc9e7c3dfdbdb8716b042d5762d1519e12c881a4f0bd4cb861dec4b7be7b6e19516478bb4f0d85d95770000022800000224000002200f6ae4c3f714f499b9eadbc32765d49383f9f4b2a39376484277bb5cbac731bf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a080635fb2aa45ebf931fa74652e86c82448d7cfd4ddf5a95d9d71374e27615f4258e5d6b03716236a3f030a5ce8fa6179f31896b116fdead004170fa167fdef8cd7a3b78717099104e2164fd2dc3f7f8455763346789d5139d26a24d5639127fa13af7b4805bce2030915f77b635f87b5d1cc524bfd903aedbae2431f56ca77d6c46c2538982248440869895aa3c3d986f34e65cf7c2e83b674d9c993ac5e7953c9c87409f50b6c890e39ae4d22daf92b650f0bd3e2358690d1de20b902d023f099f8bcf5d67e75ae7818c007afc9a777fbf521677ba20acbabebd14415e61befef9231bd6cc937ceac3ac296045914d82a3613ebeecc043fc22b4a696ae39a5037cb091a12bdf1818f0548f0cd1294291ba86756857737ec10f0940361c66e8214a52159a235177bd4853a452508330746f3c955b14da97be97664f1f5225926bbab2906cc7ee71c5d9a0751b8b8f166ec60bd1675c6e4b043dbe94f51da9a8cdc1e058322b5e272b50477196ea1ec1dc4e2dfd67cd933dc2b51fc3b0daf50b4c9a5866cace8d92b4f2bde9fc8a85242a26581feecd7c96d24ca62b0365aff7df8e2bf5d1c686dccb44eec98c75bd2bbfeda3487b17039e7b707b225d6c814000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022d7910bdd132ef0e62e86fc915612baa9395cd8cb7a04fa31e94ae00c5713b26016b46223a2a295d041ca749ffec7ef842668321558c6564e13e4b36bc0e022b0206afd76aa85c97b4f660da2765617b00835a672d6043b18bc1d44594932a26ba1767fab4025dc69edf422ad8d7369c84126eeaefc1e64101e570bd06c88a50030000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098620d23eca275d20a890943a20a4ed660c46cd8f0d76d0f408253504bc45dae7f7f8de86171ec6c682cec3b808b3c0b2262b13b4b30a5b3afb695261a7161e8e4cbcfaf40a3d4bc2e64029579d396e853c8c0041cda8ed47b0df1a595c9317b9a9470e933b6b52252986d7984bcc051c656f21221a8e4631fa4d0c3aae0b97d985e6da9b2dc999b9a4380b39114ca29dc5c76766fff325322feaf8ff4cd38ef9e839175889bc73deb076e04e5956dd34425212a3bcc2ecb1e899b64b73738d01dd38c21a509102147559230c58371ab931a9d35f7b37430730247d47fc2e8ee65559c1090befc3550fec5d8bbf6e27520c717afce078cc903ba02a3612f76cc0a7d5838bfaba27c6ddb76695183c32977552244cd2d835c3b36b005b6adb90235ad9d3da3218b29840ff429e4b1b4787ccf5dddfb9943f4aa111ecc4cb00bc2ef30e454de90286b0fba9968a42245c0f66e172b48ca770578819dd2990be97a2445326f7419f820fd1dc79519f5c9add8ba9a2576688b7c804583b56136cc96f7eea532f67122ee97dd225e95b8daf6f5df73c74071f2e2fe65efd81927e24af8543355388ec98bf1beeacfbe8502e03bd2d09ae70449e74fb6bc12d81ceab6d799a9159dfface513345020a3631f525eb235158087f97c0dd9514f877160cd00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009127819b183ef47b0ac97a18e0d38f5ea2b22fcd7f3266779887c59e37b9b275930c6d5edcb8314a82acd2fcd90be797264e22b397e0c983517aa60ffde3aeb8469b26528c2eca94aa486463396f4e48f8e163295cfd44b0a9b86e0a5c4532455037d157f1422a7e3cc5f9e7a488db45adb51d896a299455331c27d59fed3421491669e10153d3b7337bfee08c474c72b1c54fd664cfeab060a65222c030692d87fd9207832f329029f49c3569a29e648be9e79f731b007347a33b65176fc694ae35bd448dbdd644e473de2abd19d2cd228d4f3041f7b48683aa9e0dfab8c3d2eed89967dfdc29bb6149472d80d90a0e810a9783930f17e4f5ccde8dd843db0dd7f7d584b96974edc6e2e54ca278bee284758e2a89a4b3ca78f928c52d46c39fb28f37b722a085e5c39050ebd09de2fe6d3efeab12d810e1939512d05973b9834ca0284b42da26785621d0c46723121a9db8430c8326c4cc1cb4606f476968ebf9d838b3250b90caa7856c6b52c69662607b5f0bd299d973ac5d286fed5520f6d7a4476718267533e8c360e87e08c91812c0880f59f46a8777856af70b5e4bfc9f00601b73d878c7ad00300de8f9139eb8615ef992a3bba9e2d06cd4d61a546f2c834bab3bb8aac3530ab8c2e601641cf4a7ce471114ba7765f9716488d860f0000022800000224000002201c4de1e01b82f7278d4a9117a8a7c42829f4092319c9e79ebacd5e7afdb9cec30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093b00c91903189e61c925a03bf4a71865b1649c86fcaf79044cdb2d271b5e7a46b716cb193a6970ca1f969025f6dd463283f4d899d59a550ae9afc639235314749dff43d4ba01348c19ede73e0f1bfafffc8847b294940d10e108bd1a1f19dbd9e12dfe24c205c1dd15a3a2f1340933ef2ee333449d468d5333f81fa7326038ea6f703f62d8004d8711820b1f2fbb274dba3fb41a7a115f834580dd9d0ad7c7ebec6291230fef600c23bcfae70528e3cec2842d66673877dd139edcfdece9d5f57b5a39133fd682dd480901b66c23994d960a9eb870c79643c46ea3bb94f712a1fe364e3b618d990356e342c4bf377b3dff58bef1b7c0a7d0c0e9019d1b56e6074d32755076813c1e51f5cbfbcbe30193d49976688f889c75b65c4a48901926de9149651ca34e464b46461f9108b5230dc7e7a77038f90610c47e446009442043e7bbb4210be2e828972fa9e27bfe34b5c033f54c5fc26c92cb82aba0d2139c4d38fd5cf4a928d3a9b6a64b4bdca3e31454e1a5cf5e4bb7a714d884ddac3a3659d2c81429af569aab69939b749199b7e70ac61ac4b190efb80d3d1d9627c480a374070b7e929a66c390d5bfdd8b91848eb1c34989e409157e99052d2a99fad74000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010c8af3661753374d6c512474efa6992ae6aee33945f0018d99a5c1eb17b9845202084faf645c9967b340b9b218980fd1722ff11173fa0b3a08e631531235e588372f9861393c4e1833cd7f2b152a8da26c1d19521d2b8727a0ec88a0437ec14ead0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021502b4c519e82b8242922ba3d9aede86e771ffb580d66c1f67fb5bc74e5c89fa2e9fd2810634bfa4e67c3becbe428643243645699dcd0cae0cc85661f21b6f8a1735c360798ae4748cbec25737812a1648339435cf9caf991b5c80e7632e55a10af97c96fb523785838cb4bf5880be29e5df26f6e52e68478329fdfe4306b19545754e487f5be713ea34d01a337b927fd1ca66767e55b848858c0cd9e757fece554bc7da43abf96a8a9fce1185f77a4312b69e86f906e140fc9bfb449225efbeb6f238a59fd3f4f8f01810889d0ca85d4577a9e9c1e7b3b4735058c3d9c702293f054c88005da814a30aeffa043806bd7a9ac7c49de9482816929d735148c25f20b03219a02d68dc4170b1a64d851f8fcc1b5fc6a2f508f2d924cb0cf2315bacfa4935f69963f6393848e0a18d5ed5e43b069222a8f3433b1dcbc62435b453f938ffc44960fbe1e20e37bfb078bb03f2ebb8e77bc98f64aab0a7c47846bda7296d87af4ad498448f7bf978ff3c707d3539457c1bc163cdf5bd54d7070d5ec6ad5380ec76a2245529bc439ee2cff6a1efce80e6f0c8252adefe8bd0df7a4b64443b0c316cac0a3c96d4dbaee1089ac235a36ee70daf0e6ad43e4acb640634a0aceb13dfed8a06ada701d00585b328b87ba6c28d7682c2bf06b20186c22544c6d0000022800000224000002201edc22ff6f1966b9511a9392f2a08178b94151feecb8970b40ff0e182c704c99000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002602aae74f2aa20d837776e56effaafa8a2b61e379345ceacecd5dc8d967e0972e96a26f496b6926d0e459f3f972d4d064dafaee83b7bcf8508a40ee6e45502f6cec598013ddbd295bb6cfa5d66caf2e79fe4fed6991e5ebc01475aad4bb1b2bf3fe0c400a5eb8d16c3dfc3feb2b8665b421d11603072f3811f36e192adcb681d099dcb17a0880a7e0d960fd24a87653eb03128da1a56407544a237233bf334e21116074b348a24fca1b35422a419a549d07fc7b3a9e1f0c6409ff1d0230dae5d2dcc67fdd8891c0fd4149a7b6b06f7384d3a22c6ea8dac68113959b43338f26c8c14c70dbad5112cb49b0cec4535024153b0d0a75bf1f8a012190960f0705c1d4ec99936aca35c1d2fbd6b488f1e08f9fc342ba51050ac4878e99e15d31ef0e9ac2a6a051f5a8ddfbf21277d98ba1b86b21550f4550df7fc6ca877f29ab2c2703ef4d65cc6523c746e5c4ec02bdaced3e053ced49ef869f8a2a4b0f45d04b416ab78232d06a57a6b95fc0c30ee63859ed7c9ae5bfa8a9f6feae1e61186fb711dfa96fcfa76830a8a4b81188503b5ef5855577e1bdf8a2a075484e8b43b3d014e80ea4d264518e677f6081f0826e85861cbddedf45241f344fe1f21c9cdb01c7000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011ead11b15e889f8125200a8892ecb01c0a3dcba53a5e871af8f700659ff2f819020aee443981b022d576ef740ce19df426a42c9c6dd4bf7e331bb6d4841e67c06120a0e171252260e63e6467e74aa87cbd2bbe786384ffcde86aeb9cd8f6d1fe36000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a0ad99f1edd4173eed5a178b63d68f7f02936fde5394a4a29d34da125e5f4d668aad270265139cad7f28af390f9a75d7f980d837c069dd1c4ecc02cd7c7154e8fc980e46b62163e48a53806972e50ed408945f4b09b7cefbb750da6c61b5224bb40bbf8c4510ad898dfeee5f33a494540af08f7d11b8a973df349cdadbe8e3ba62955ecedd0364de7bdd728d58a8c5f24422c688cc139642795551fefae40dde0e0186c54888c470c36427cbbccbbba9bcbae092c28a8d685cccd40da75aee2e6277d300b3b752f7bbdc4f39f7e6dde71b0e80be12e3c6da8ed10c1ec2b9368b12451f75785e968f5dfe57977865a381b3293dce20c6b51cf24b22c4909e5da688c4bcb7290c67fccb1e4deb54d8cf6aa8ee3d4e063299f341e6d762f9554ced7fc9cae66fc12c1f3e23a16003e06eb7ab6f0cdea0c93459eba4bb139419817b6dc9a0e6e6d4727ab123cf8c6581cddf18722214fac3018c6ce6706977906f872cb661e8b040241878fc26202a13266f18a8cdc1d5b154bbbe6f1dbe5e8efd57da46c419efd742cc3ee4786298447a183d7a3c09c34c8f33569f105f8dab1ddc5c3bbb27133ec3267b88f70b2b8b5cb1aef30a65e4783607a99026dcd119ed243425e3d5e229cc43bb55129ffbd44d35939f439f95cb502833173a7392d996200000228000002240000022007b947f49b35e3c21c2b0fd89f79bb9303a31f557e9bbc5dcf0f22052884b38a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020348b7f07fdc8911781f9734f925e04309e3c7890ee65b5392a45ee644ddaa9d242b3fecb6e81c178774c7155909ebec50f7b764691dabdb947494e8e28df7205f541d5baea19ac91052f2b65d6e262c92831305b9cd6f2dc61f940697bb4d0bbc19822061b264c18fbd3ada0c147168df873466cc9e8907fc49c1605a3e4d43daa096ef3bb65982aada32dae3abfe8cf5906f051de4739ad9785f1be23bc250af251f85d9ed38eb99ad021e9f11cc86e8024f7e95bc6e91cab3f4d3582e47446b9ffa25a55332856afc7493f6bfba1800b596bc9b8cfa4955043ebe913279ab9881704ccd1eb6a44b53b13788933080ddab5cf8d4e7a96cf7d50c3ceffb5b60d0aeb54622b288f4ea935c0614dedf37f676ab742e2cb734a4d6b472d2a3b6e3313c433914f10048884f1aece25470b707a9a5d920644daf8ab42493b69ff8fedf00b2465d8a21d2f3998c3e27fe44f227f82b98bec2ffbb13b7564adbee17728ecd6932adde7bae9fd6af2d5dddeeed19996efa41a1062fba055dd42685a71a3a280928a0b6737592864698a6d3769f13f14400f06925c03591c0357ad42a86ad14224844dd2f9a87bb48690e4cbbb6c66db10b392359a9e4c51d209dffc48000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012de47ab9b2665c8b23b2e7fa4a32cf8c8aa8ccf1a7b6655df0e1f8c24b252a49020c592cd246f3b0a72164c8b5992bc7ee6a854dbb7e18b5486e74315b22feb22427de876a2ade53d7afccd04f74269095e8d2fa8d4c06cdfd05db46781f8f2fd500000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000289459e23266b566ab931a0023008b5964638353a07d1e341990f6560f5e141190299946f3e9bebbbd73d2512175000126a8099fad98a42b4be6a282d1b5461f8206ef33863d975a14df981bd936ccc4a603a6d43f674f21dffc60af1df8fd73e4174a8fb2b99a0a8591bfeea36c660f524df0b5a6a43e5eb2b9a702f72bfcf07c810a9a65333280d5f3f5b255534d6ee10f284a68dd508c51fb9af091c9b04c17c80434fda14a0a4ed2b4f158082307ca28343e18b5442150008bf5d612e21e81f13c57d701db3ae8a56ea6201102b2e99ef8422687394a3e8720a2c8476e4f6427e2e1ed5a879cfaa1edc93d7443e20bfcfb68a0fb88e11739f3d665898527c62eece3a9cc2bf076a9a5f571bb9263d47caf9d914a6a559da9a57200454d4c25dbcaf4601e8a0c9cf54eb18eb1d34c5b0ea5a362271b21b26ffd37041935f290e886315fb3a466cf57ecb3f1aa05d893be74a9d0055168c975c81f5d4c5470b69511875980816d73a5e1c72b326dd6d1940ffbcbb8ec8c3cecec22fbb340cb449047868c881c3efefba3c104e22511a4ed1eac065aa053aa5708b654d54cb60317a31a92ee67257e297b95480bec5543d17719031aa6099449d8909d1d56d1d0eb5d30671e1d0400333d713aea45f6781877c95001d59ca9894bf494a5a68500000228000002240000022003b28d66cccf08b1db4bf448fda459daa0fddd3671a2fcc8e0c88fce39eb686100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab4d558eedbbf472eb7a18d30d71a826e5d737c89b90b6752e4570e7955ab3ae3942fe7a3e61975f215342def2ff1692af0b69764a0cd9cae2284061889f71a8a51448665e1adf15b3b6e54834d3e0a90253b00993e9beaa729b07d154e56631455e27e2000619bc8e09f6cfae3e14acc009c0b35c600fc75a9463fca8d641cc90d9e20042cba7857237a09f4650bb13584e0ad0c711b8bef74400f8fd36ffbac833cfb0f8cd5501247680a07629f15cdea195a5665b04ef462cff45a78c721fdc81c0862e3f6efc684ea2e6bd31f46ba5a5477f095c1e398ec5f38ea26fb44e41187e8398ed56294b91a2dd0587d0e439804bcd91ca29bc569ba72f6abfffecb1da4993cbc7672645f342f8adaf907d8956c6b25d74be2a7e1ae7acc08455b462f4c3c25e62f565ffd580b9fb1e92148a1fc1681e9e800232d987ad07ddf38a5d01bbb7c0964c61089b9be2294463de4fbf90d42a7d4201b08ca9fdac945ee4c223d680d572d6522b53037744e35d7d10e7cae0309b65e0c98d11f1f3a47066fa76a6670d86a9d4a331a1b5853812f03a9e0dcaa4983ce65df866a169bea0f33414729f99ae6effeb23d0babd2f8110ee4b5bddf686e050b0cfa16edfdd7d48000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40115786d65063c0e6eab2730d6a8d76375b273d89c653bb6e479fb7869ae296e10020c6e7b4166cfc64602e908e939544e3c3bb782ca321aa4842dfdf961b8a66b1e02a0f1cf2d6686dbeb5ce7d856e0481a018ea287ff5f2b81d4422a4f6963ac5600000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000926b03f63e420fda66337cdfd879cebab2150f43a952691babba1cf8355a62afce683117ed221a113b0c3d7efcb2c39936fddb84b6ac7d3caca7d2c3936472deb8f86f467ada6b04f4601efee4d6ee5a4cc7cd8b27f94191927d76db0d85d02c6c7f361d167d5fef76339bc021abc3e2a8eecd596e5359981bb4c86d9b97d9af5e27fbc7298debb559c7a1906d01e0b900af64fe0fb5d615752013ebde8a04f6dbf549b00b4d1a3c44c83488b615a00483aa8a8eddcfcf1df5e484854aa0e8c908bd86003ddbb97432505c54df2e4f4f1b599e483dfa884452939e23fdbd2e8c1fcb499d6c71127aeec9f16d49a789629ebbdd53daa12a80ae3ef30ab1e3dce58b37c51345fb52163a367646df2b44bbec77398868d1c6e6fa5895fc64b1c6cf5800a80f5656c833ffdb1d973d3f0c22050571556e2b8ac7e81564e10dbb1c020e9059d475845a6f9c522bac3b1c7b0abdef742e4003b0e225c7c26209eb6736eb0d0df6e9a9e0441a96c1f5159ac496f095e88391843b96b632d5ee17da99908bbb58cff13b0ef671e3c5e6e64e5e8ae99e7645488a8af13b80f942bf88f2cc8ff16f53d4355b0d44d6ed22e882547c355207c54964083a9a6773dadb3c2b6fc0041d90f6c200c760c5799713610f4cbe5b5adf920d70bff46d0ee938c2b4eb00000228000002240000022010c354e7d82ded4c00f8316caf8a7df49e7b0cc99dabf504debbb5c20ec725c10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083ccd50c650319472f7eb79ccac0e2eed71169add6d824e41abad0e3ac511738047235e204aec319caec7d9220e1afe504ff7c6828d9c85fdcb4fee1223474b64b7d17af0a8bbb2b4b5e289f8239ca636d84dbb36f6721f00f33b86ddc7592a67a58c0ecaa2b2d9392136ad02934482d00fc91157175cdae14e051f137663c7f0787be4b7347f89069e6209f80226b2625cc919ba12d622981430b47537764e4ef1276774e05e1296e1b89d7f22ac46fe18794502e870c02723f022c0cd2557d5b593a0162cf906e202954af0cb074bfddb3dc87e0e112d962e93f757db9f142a67b8847879ac03e57d59343e69d54cb204edd0984245e1cea9b102d3b7ab3384a6da8f584bb14da90da3d97bbef679efcfb1091faf01439ac374a075d62f87fe5ed0c57eab78f23795aeb15c56be9a1bbc61b0028a541b927ef6b382f31953cb63f7c194253de7ba0f647e008ff60342c8b2e10a10504c139569d8684c5b1b47e6ebd2661b1917bc2b19b4bf840f9ad1f66095c071c066f5f167660ee3b6110765a72f2cc160e91436a4d8622d8d5e037b40d8b51c4e67b75633a55f15773257fe2d93228493b79d2b66d3dafdb651e4a0194215907ff2d274cb051ca6bf7cd000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021aa08959fba5b0ec290124f2fea1c3a22a4a6275004c0ba01d47235bf713f223289e7ada9d7c5ffdeb509bf07e77b64f0f807735c537ae7d101a49d4014e923d020cf57dc38dcdf86c9d01ee570591ee021b6b55cb24781ded6890d622f2275580140d0e84c1276ef2e7a7978c9a39c81ba2fa4e532940d587097d04c09a7837d50000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bf2776cd829ab38e5426004b999068269fc404832e84bdf10267d0aaa129faccb76680417a86930ad6ce9fe72c68f1ea6b00c36c8d9dd1376e60bd743bac8f8e28da7fc4c67a914adb6757e32d6c0ae2f278d2d62a2217bbae854079a1ca99b6c011e920de745231fb6eece28093eea8cd3a0e7177886024d0e8ef74dffe8ffb2dae7106389151c93e73f30536913947ca6736a1f6faf0649cef67217da095b96913aa74238008d59a1b628e8dafb8af66f25c1afd9aee463d56f5b1eb6f85c6f5c15fc746bf3aea1c3cfaf63960ee336ee689c1d53b2bb86932bd301d59922f1002511e7c225ac23c9392f09204d27d69e4dc9325b2eb8f31021d434cb68a9ae60e68edc78b8c2a59a81200d1460582656384e2e98f84c9c0bec138e8d568522c751572936b318307ae2ff5f7711cf5921ffded3e4aa8a1e3340104856046281d14fa8d8c7293bdd1291cf92b82fc76a8b8d87b68e29d8fbcbfe2b97e2ec846e51b4d036cd1d1d70e2ccc5e6773c2927fbbbec70b200e2de081b5db0cd613e1f42ed31f9fe8a37175d57996e2fc167a344c15218acdea560dea63f8e22d147065d03e177abb1d2dce69c7d2089035b3723e1ef30081d03acb3f7ae155a2802f8362c57b46d8a8dc204537db9c18e9d2bcaa171837f9276f6508b0d73ef19780000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f9da01d65b40a509b27929dccf0dc3bf71a99908ef63829f3460a6519f0300ded713feb42037c9e2e50e0a13f7cd9274ea0a413dbcbadb285991b2cc6a643e9caca9e6892b8b3ec3b4c7d1b5f03e541afc4a5555b6007d494cf4b04182d3e2a6b83175b80eab44761626a5b0be9e852edaee2104012e4b1e5308ff877ca6d7616a932978b57b49f66eac4d4ad11e1c27a5c1f5ce8903db2afcd00f90e7a1786b2d40234ea90f7e01e722251dfe5868d245da4354b4a64738bb13a96bde58668a4231a36c40754e3685cbc9d3a26e04e6588d3b3b39d9f1d8c5f736c2bb44b598e281fdc5248e2b1c9c0750fe192ac0fbe7500ff11d37aae333d1df048dd7f946af002388901c87e7f257e7d4d0c43cff020f03599d530018415fea6cb366b14635b843dfbad1a3c1ced46b33b48ea8b5e7cb5cf4279cc1e9cd2afc939e4fd8de36299f59a12cbd13a67fd133e5c95209a6a39c08e4597e2f695f269a45514002212f0333ea8c0171dfa54395b046d0e039aaf9a5f4aa8d4c6077a2f19d508c44d1ea4eae16c680c13eedd93580bda71dd02a6f5358a7561a0313697d874febf59639d87c40003ac6957d1f634036a849fa93e9f2fe95469390001a960e3f25a2e39e1ab2fa56cf26ef377b9afa33b5f08daa3d1c0643c9200464807bb2ea99c00000228000002240000022003e14b3941f8d9e1805cb726ca8edf9f55678fcc24c3837d523248d9de0b41e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014f9e5cb415ac65eb2c0ae1eccf0a515865cb26a1b702cbb3b681dcd259d52afc4514a7be7943a1e008d7f55d55855d95fcdc445cf57256d4d61dd9c2ed2dc5e6852c3a414b952ff10c34e303485d48dfad838445adeb11215d6b0aacb347847ed6966ff29b02ae7bd94b5b5634e004ac31c8fea5ffa1e067958acdfafbf14e209ef1ce87fa9726da4180b53f28e2a1fe709da358ef847a30db12e2bdcc743ce4b62b3c4f760602a484513de20668af55140423b24f2ab7cbb77606ee9a63f58727c0cb8e32cb4280ec3efab8089b40c7336a64fd2adf13579b81e89048871293dd79555dcfb8a8c54c744cd4ff1535414262502006ddec487807cada923ab45e7b493c829e66f71032043791c6e92849b431f386c61da99ff0a96273a987a84390404c3ddd38c583ca142d92ff96b3e98648e3eda58a43f05d64387db61454375c93e9de5ff77715b5ebd87c507440872f460807f8a4dcd1e8d8198fc5a6b09f07d85afb4f34202e32a01c51fe84a3b688a18c5de6c64241e12338903b4ecf3c15e7197695f11ae11a779030c6513b3458b9fc193be17d7d90b126de92fb3f8b53dc60cc8620a2e44efaf1c28055915010bf547f7d73383db560cd0b827eae3000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80213fff213f66417fe48cf7a271d6d1593d0bd241b88568eac4344ee9811be0d1b23af563df357ea431aff035f03f7e5c095c29e535b6ed673dc7caebf283c197c02122d60ed4e4e4e97d5bd3bd5ab5ec1b05bf7603e50eb0ab386a11efbb38c1d281bf71d5d1616cc954bbb0eae1d0d83886ba5e95726f5f0d0eab830e3ab3896980000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ff8c2aefd7b2325da6ef2c3d47f673faee6bb2c748e95b13b4a5d2a0cac9bb51233766e7d40367d48636e64072ba01d345d276ea7a3f97801534cca3ae268c4b21b84c3b379e638a34bc92400bda2a351a931bccce73997adf956171f43752b9f0ec7b7dc978a31fd3055de433f717ddf486b7c3174e0441b242ccff2767a847848bf5238a5e07db8c9932c1375aefde4313a9b7af03dbd0704f91a8f3bc7d883e5837feb9c3eba894f00ed4c2b3db772bcb9cea5125c4cf2ef9e9151db463dbd82ed087b1755e0f5a6b8dff58c11a0c30a5e0d028c1e2febd0d1781be977d04f0a97100d3dac2ec02ad8f0ff68b92daa4f223b5c02392bf44c43dd4982e2d5cad4c4417903a68598609e2d0f77f18cf8eef3d9b1d7a6c11bcbb2fe27539cedb9e774306ea4596c42f41e41b07d027e1fb1ede040af3c8629d36065a108dead5da75cdb8cd0bb09af863753c9e3da7b6c167d9a1375cfee5b91e96a44cd1c2be0f900eef2b2a35f2611022448bad382ffce6ee9837bcfd4c79d3a9727707211e60adbff2b0ffa76e0593a28e8b72906cdbad8ab9bc71f11874e5b72860cc2e836029aaa1c2c13cc2bf6379bc4d8304160bc6f1a35a323fbf728218695bbcd82dd533c1dfff8304a0afc3149509351295a93f8f4d743271b08f0826c607fd8ba000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a92e0e0c53a2d53d99bfe6de5266c42368002238a0d47b806b2fc5091c3e7f3375b0585f70acebdf2453f0ab4f2da5f4531def48608c196cdbf92b2c627c2cf15d62cc699b142661c3262cc17bced76f433767351c0df31910ef66ef66e635bc020c54694348a02c65ef1366e695bf84f5bf383199da223b5ee82278d867b737aa73104d4de519a7704327ba6c164e995fc750c805881e403e72b327171691d90c86cb8204853c79ac7524cd38e76062657beef525cc8a5326cd1e38b2bec817167933e768966d0324ec66b791f2133bca2a82d287ca72561b8f315a24a74164eef53e51902a7b7ae5d9aecde3134fecac39d2a0ae0e46e28c75fbdcbe9617edfa0ed278690a44cafb030224fa2ee1fbad20c1082c24c1d83b35a90da4039da4d5168ac348f179334164c68c49cf66aef11f1451c2bf6f6fd29331615815e04321804b1af85de682c151004256a28252a1ed86a2fe6b307fce364a07dae461354032d975b78fa8ae6496a2f34c1b358d34dc45f521deee3589c852805c319fb866bb60d942e701e0f2120d66e1c98e26888c8f111e3f4e296260fafc9d9035e7ac0119b03950575f37d6f34c1bdf30684b7bcd9b8b67f170375b5a7163d9d1bd6335c6376d35a844449abb5435e857c2745919fcd0c88fdc7cba9fd0527f1f75000002280000022400000220283b6fb152d405b5a3a99f67751454cbf41be15a77751074dd20efb8178d353f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9dd599efe241b43fee70da08db6e9c6194f449cf4bf46b47c1dc9eb91632c254c620043c78622915e99ad8e88bb2630e1b105936b4d8ce61fe0b3d9d6ec03f5684520adfae3dae52bb6384974afc2b593f221fb395b659d775bb097529dec43b4213c4a6bb1879f6176841d1a8874cd7cc4bc882f7d4736460d30931ab28e60f276b0f7eec2a89a4ecf6096ea86243beea319e29553805019241f547ea843c07d15f6bbf363770619230b9401e0f7f477b082d956a6a1d755f4d1dd0896c2652e2ab61cbf9a380c8c8e248263ad56d473b1787d8b6f00f86a33f0ab7c84ffdb266fd512cfb01da5a6d3ab3431f79fbca390964b6c4f7489ee525da07df0b4e72e352f12646634de25b0d44258b25fcbc2f2a8aa7f5968d3a6723075a93e315f214245ee92fc76068e471c77bf0fbd28e12b727a8bc82cf88fc8e09f9bdfe827f72b45ad43ce6760f534e18cd598ee3d528c7ce038e71e8f342d63ba49807c9524d86e01f81a976b47f2d7d9640f47920ffaedecd099f2a58b7df0e8258219e2b9a8f2ec3e57f6d367743fcab6a3a8e2400c1d1fc61acf0a294de35f227048b473b6c8535f0ca61b6c904a327abc4c50378f8d28244e17a3a23016cfcc4c7658000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012c2675373e45a4a108a144081672ae74a8efb9d2b6b75d97af5a3d3a2d30e2770215e394493257e105ab2b4fccc37629fdc1942b840e095a03478de66d9442685c255e60274f5a4ebfff80e6e921085e9dcecab48764f8ea913780da099ffbc49d0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025a0ed2f5eaaf46cc6ce7f1c12c008e3cb5eabc80e07a9ed07bb5018eba842ba14be793ed2e51da51b27717414e0ac8f7fd38faccce0920ccb16ad81bf05d8609787fd955cb8b3398dfa4fc01f86e654c91bed14094aa1d53a85da12b7bbcd46179046376b31e55339eb733d491f96452380a8e60d96d8883b8a778668a534176fe78d4ce738c189ad1d9b9181570a4f0cd84a37334a1504882624f3861f771b68142ea9dfcb173b9d9d360f5fdb240671d9ef3792f1c16d2792af10d986ec9202126feb43d282b1ed5739c3a9384e35ceb259a2f41538a4d395e196befc04a633c5c13fe967877e7d05cdeeaa99ef11e9bafc735781c5674dccd15c6ce3a44e64f14b7915c93db1d2a3299a775ee34558cbee680c91a57dbd6e35ece92f3acc6e5644a2bc6a8a4afbcfb25ba81268b99b58a1c4bca11ce6f1260077ae4979938e7f46c3a87ffa92862049b61efce6e298fea02f603a6836aecdf22d4496a86bb4a13d994060ec2bf9f3485c5b6d6b79afa19d1e13c22097903bfdf714830575255dcca4f46e7f8b1f973bc7e3be5b7e9f1e70e56951612815974394b238cee5f6acb160c56751e713fdabd96a1337433d75cbbae72e8eba98d87e5b533853ca3c61e5f4c0173a0d787193442779308dfa77e2751294f597e6bd01fe00c4d03d0000022800000224000002200bc60cc4c054c59e92eeba5afa2e3741a3f24ac776ea56a859f5635efdaa1b33000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a4d1b266650189269828842a0f99d1c06d400dc772eb97911032376676df92ae0a35ad7d2116f7bb61526f154551497292945d727f4572640a0c42d8f4079c49793406bc01e956ca2228e56a644216b55ddf0c5167e6f6f827742af78c8cf780d64b45b26850d79671f95539e43c7d2ad5633feea560df7f9707830e8950c3129cae02bca9bf79bda7e19b63a57731570f98444051515d20013bcd6bdb86be6984fad28e466a89e9a19b241cb9b97f107d9504f50f00cf844650ad72226b4f6bcd1e8c4ef658faa292d7cde0c8aeb55736ddb1e41d07dcd764854d76439279621b584fb6fc415a5a148e50f07c0742afa4a7e882fff6aaed390e4a7b2d3ab08c29f041433bf0c66255e021192fb43d13a61ca51b568d5ac3b611db9622919bc6af37e4123a8eaef4549822846f678d9e667e62dc464987161e8ea88218cdaee27d7a84b101feb4958bda5fce866554559aa8d6f25fdd7679816a2d4b671eb4ba2a0e1775189cc5147a7eb55f11df20597bbf50115de85ef1017d0c4403183e6ac51463cfeca6d2e4ed020e666a785ff5a29719ef3890d6060c5eb8263670fdefebc9791cc725f6d1bb2f6dd41efd7325cabedb418a0a60276b7033fee6b7788000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012798a79182c6f81007d688dd5a8f22df62d76a8a45e77c992b58a3ff09e8f46302175b5c49e838a19b89a6333bf64b5bafd654a02ad7a5b788c7c00d2e30b0cbf90bd35d599ff376c188297db50db7a9752c428438fe72810c8be962e90a6b41ff0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025672a70e4fce459b8aac8eab1cc99b4f4c2864223681392d5f3c30b2bd1f063986427276f6188de5eafef79b4221b59e3cdfb59de26427cc7ab34f6cafd9dbd4180beb9b728d655936b2ca60ff24e94f1869983d75631d9eb3896dc6eb65ad84dbe95d3a05d0a2f66c2002b8f54bc8b70cf8ec871751e2348b0e24c8f4b3533f784c517f2e85f772f9e22d2020693c7181811beccd85f246c19cf8188300b8bdf0d896c0432f7053dc046f3be92ae541eb718cd75a4f04c207337548de75d253a75318934921d844d7bdaa6399c023349db593dcae85cd3992b16d96e25c33381f4313f1a00f26b29c8d70ac386f4c5eb02defca329ad4e07cbb6ec0b1cc1c531fe04150083b265b7b23cb9d68fb7119409ea574010a8b858e1556f9fde64b8b83da9ebe1508e63457c027fb49ab469bc9e847d50854d80d77136192645e7cbd9c05567d54bfe9451b0c2219799aad74bbb39247c491820adf6a0edb72bef3fe9f16dfb70bc610bcbddb06b8fac0fc7ad758b0402e49038e58123073bbaa450bef6aabe1d0411bb7985aac6ff606703f2c8a71b37a60343561e126f6663d8f02734b8ab4dfc9495e2b55c96792835c9aa454c2df2e18dd07c801b113d25d524fe0b4f63a8bf9ebf4782cdd819d9335002328f3a30f23bb686c5870e5729d283000002280000022400000220135fa52bf640f7fe993913e7d492109e785a674908b534c6bf2bf1791aee6bdf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066b1400c7698582985958e02ae83d4eaeee7a5ea2d3c9f846fc281ddc0e4dfc6b8d1c5bf1c1333b24ae74a2927559f3a505e097f3a85a6e1a9bc20e9e84b1cac863af0f31187e5123ea77b270fde65e8bd345f631c138b27645482582f4c2f2bb8deb8f78868943c89480e68ff6f9fb9f95a7f418b8188175d1c1bd1d49d60bf92e112be02660b6e7f426f138069908291ddc14f5e3142ba10131ab49bc721af1abb60d97db16921f87cfc80e1c357eed2f7e865fe6b3271cd96d28a7f40489102a6eb3656f80257ff0e8b649bf633d1e2895b9ce3b76d5d2fb30bdeb4e8c275cb869874ee8190db22e1aee0c2ae271d0377bde921e534e732395b2b2fef4210bb0dcea074520bb347e8a3266c13f2b403ef55ddcd281f4c8eb8fe4c4ca9d6f8ee5a39812dd28d8924ec5fbdbd9be726e186a622078a569313950721afb4f734c18c9a809475d7391eeb6ef86059cedf1acfc1d0b0c0d5548e1a05d234d0317ab400233783d9ab53c0360f837fe74a4543cbd5cdd6748760f70b3a024f46295adf5caddebd913d3078ff89bfae45fd8d935f309c63c7937fe9ae270eba47769e377b36cb6d9c723143bcb9bf585671ec5781ba8045fe88bd55744b41ed3cda000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401082f98298ae92f6d67862b9db9afe1182248b6136a9ac7e10043855aa797d0b10217fff83c09b5ed23aec52f86a468b064dfd1453dfe355946cb4082e25f418a421e459592da729cd762d2ba8fe37878acadabf5407d7d3f8679635354ed99466a000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f4f7b6b7b85b26c212bdb81a2a0e15808c577633d3dc1356d41c5816f08b53b368cf78115cd2d1610cdef7b46767d03b2e0bb8b6ae36c9dbda4bbd2179b4fe1e55b77b1e0a7500c7444fb43d2be7ae92ab80951b4aeee8bffa8f7810a3a48b72d60bc85a8205a9ac687e2e31099808e67e00e40e1d5cac4ab680cddb17390b01bbc113a3eef9e095631c34ed854d33b23755da55fabcccc36b9fef0ca556c9b6be1aab7422162cf29131886551f6693d46f76260e5da4d9ca0db4fb8d7a6e463283e1bf78d708188abdf08137823836bb0a8711421903c9591c1317c64fa7906f69e5fb328f2c4713a6df5fd95e8adab0c87ae4682fe35c2bb4308553c2525f1db29f9a931d84afdf2309daf829b4f10e575b07ecedfa527b13a8ed482d8aed3da6c8036653fc56d0caa2c764b7597e629617fc77b6a564d862b5831c8b5ed542cd8a15faef530565ae79d9ccfd25f604bfaa2857de13310dec4d27479aca8748bc7182fadf3ed0746320748c7ec03b49fb3761de045e28401861c836795908e6bb46195b35152e8297631caf225ee30a00e34fe731bcc5b578299ec508c5e160312a1d2817315693c2f049bcaef112b456970a400e87f695f771083697e99580d51d6bdf1e272fb9b84242a6e8befed808e89e5848435b98d0ef2279e6dda20000022800000224000002201e4340522ffd3d066d2f72ecdc648d3d31f43ad24a322260c36aaca60a9fb527000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001084f5478ef35052c18b571cc204cb1ab421b193fc89e7c42b67048c67a239302ac9b0739d94fff8032efe9b1a8193d48d04b38eaa96bee1ba40bc1ebb56a62e7383469d549cf31c7376655fd0882ac0c48d6b8c348628830c6da0a21bd5f1ab7edb1d7b1d39b470baabeccbc01fb508a425a6facbd1b53619f7a3dd621e9b5973adea7df60eec79aca0559c22464edd6a027cd623532020ce2c34113f6756cb8627af63089b8f19e0ba48654088a4e9e41cf12ec0caed104c74b4b7605a2517ddb6f07ebd1d89e3d49f05afdd4139b6e7b41c1b37ec94e735fab540ebe5800d317eb4dee04a437ba713a31a6086971c6d0d2e7b7387ed0a5a9713f4fcf7fd8c66138433bca1fca802f77ef928c8677d544b1dab0a87a4afa6a29ad4d56c42b8d32b515fe12906515b5ef735f64ffd03a965e61046428a6bf50df00e002e4633e70da3e7ad7b98c479ecaeb123c5105c335077d39deb5d9add9f75e2524ca3575aba67ca0545038a8216755863eeb6fa6d644962e636b3c14f3b61a86984c91a47957cf7cd9703f55ff344f2b5a14070f096294cfcf17b707dbdf14929ac4af5547cd701f6e7e64aabbfb337c66dbfe73a2c9331578e8f78dbeede78534b61e8000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401275226224a9fe34ff8267afd29ee7aced4da7dcec0aea9c5a568e3b565aa3e4302190e65cc688c4e9ee84cad902c6119895c4e285f5168be5931e74c114f21f8c22db65a22dce2f4f84a64efc59e9149befd42d064ee824cbc06899a62f9473e400000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019320a4af736dcbd416365c1db11ce5ce6b7af888897ee12cd94e92eefd0864d19053cb8078e98cdd98c314cb0b91f93948db00146f89b28ea02949b399b63f10b6b97042c43945aa0161067e99e2644d82ee1ce2bd89dc708bb558799a25ea84fe6084801925e2eb4ce24757b6992ef4e1785ae903488091639f7498b6b5255514406fb17ddb1a1cf0f6f0004b37ea5b9f6fc54820f97ae1bbcd834090447a28931fda4fe7790fc1ea65d99a0880ce9224825c62e145152ac0ff8ad868cd3ef081b966fc11277a83252a6aaeb69e55179b03ab8b0812141e247490b5838712cbebb9c84110f5d361cf56d0172399fb10523cac799261f61e2f7fc16051fc656a497e6ff1f2207ed24dc80ac82f57072da905aec24f4d2254455cdc6589b64c8888e20b5deef4a7971f2f8ceb0bb1e16c6a55d0b6b68d2118fe84a648c7d5d1b80884bddacba756b994d270cb462692e84ca80a4085203d7ad3d36c7f2ee382f73e992eae51a53e0c45df58eea4ac593835ce5137bc40545028d9bea326613f5382461032c96ab26bffdec2433cb5ae08a7f13de220bda311b9c8acd72df37aeb73df36a41d2cbf6bef23e6183b086d9a5cef08df31efb8e02d2f992a45e5a294c25c93e6b189482192c34d1be7e06e92fca5202b69ec0826c3c4d087d8cba8300000228000002240000022015e99b615ab268d723ce05a696fcb5c6b47a94e73e62be0fc237326c0a14ba2300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000953f8d75d87994a1ab2f070947725ae6141ac8c26f0d51f01f9faa78072d3db1d0d61e6b0f103ff9020af23842924b72031b12aac99911d1759edcdfe8e09c089bcc5563741bc3e604177e6e19e6f2fd64ed07858f86c82e2d0fde70c991ba220823c592b71b10ff4513b41d20782754c4e34d016ed155da334ad14c835a87347011779418d22f8489f955e45ad871503fbb27c9983e04f7cd2b2c641b2bb0a41adb6354a8dc4c28e6026dc5239656b7b7e12b199d20f1d5f269dde619d6d45ae652e218332e75e7d9b934b0856370f77bd7a27195debddd9c05c8dc937a2e8a64cb721a655eaff853cad07f7432265183b5f6f5359437173045e1e8c5aa1216509d74a23e9258c504fa9480e4aaf03ead6e02c471320cac11c9ea5a6ba53b6c77c9f2c7aab35cbc92bae602e7cd3a6e5061ac513ec867de284393f7884abe40078b649c991d411c2b33595478f904b7dd32bbcf6dcf251509ba441f883fd97a144716a9e0c967eab4d0e3ea8501717e1bdee0307f9a0c4d174127a966c006151f6748b283ee2b1828dc2bc3ac366738c0aa82bf5bd966f761081802c8d633b40dc96d38c72d9ebd4cf0bd1296b4d8538f8904dbc302dd65165238a65c69b835000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80202021cbdf259de7de8a0a8355bc48f9650edfc4b360a2edf66130d3a9d06953b1d57e07799d63bcdbffb6feadf0534eb800bc2cfdd63c0c5d7c4f559226ffd82021c6a48446b708304fc9187f453ee73557b4f956d39b2492b4d89e5620c4dc4e7111bc2317dfa88b09dff626c48fd5327bb789f1382be26afd8ddb7bc783a89b00000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b043b18e7e5230276bc250fd998a44d051fbf0f40db7b6ce21d415e65513952bdb39585cf51103e93579d0ce5e1ea885e6435474533cffe59592d03033fce5955e3316b7727fcc3ee29c88fcafaf29e5a45aeb74744ceacba51200c16ba44f149a9aa88de12792fef068cec3287648b73e5e327b5541c742804d58b1423bd5354c8e646867c9e289d5f76fcf0ef667a845b880069c47bc1f68706dc86db963fbd240d7ad11178cb3c3234763689a2a699984f194348ee9acd4a0c54d32f2e9143b9fe503828c20602e3f916120be8a0ee9495ebdd6fbcd27c0ee1b793fc6f56b1cb5deb7f0fb6b772d0a23348f404dbe0f406727ef0fbc4932bde5b3aabd3da904bc45aba7cde1cf9cacb5bf9901c9419a8928d96b3489ccfd410bba1d6f45ce54bcc379d80b83fc952d98acb45d55d026c9086cdc3a7cf8d085a2159978c1231012f8879ef6193225093c6734e9110d5179dc51fd78de4b250a75237e36d5be11abe5d83486d7536eb823237fa9d490c42212b88e85a5443778a2e115de08382eda0c4dafa62ea2eae252af4cea5163616895771b6b2b7334eb2bd80df7e211772b271d04e2d52b412ee04bfdb3a1c843c9de701d065ba7f9a45a51f516ffae2e147dad7a2cd9e66ca583655800d95dbe1dbd4852e90442840a0501ed67cae0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e3ef3cbc091342071d0991c9e2d4e10ccf11ff92f3487db22436411a245eb600e5cb4e892d6e0421fb5c4f0c1dd55b68a6d9721364ea7ded551687bd29906ab76937292f5c012eba6585521e243bfe1e06a314c4e835b447a2904759af83334178c939443f380b30e30ee7a2e58a48ebf1377f5a2e380a2bdfb5d42947880cb88fd25cc3cb4a4745c5bca5d4ac853a65da6f03d8939fe28981a1ff6f07287ea2abf906211addad594c7ae81449f3e57bdbf0ef030081819bd4082485dc1503897bd7bb4ec1611cb89123f619a89e7678f5d6ab6ec792041ea6caf4da180fd730a2c11d6ef81a0e30558b693fea38a3642ac4ac2ec068cb8e840be9ae49498f4a050bbf58ae540ff96be5a9fd85368ee808df4be8f39b0575a4a95f22c5a1031c3ec8d3145df263dbd27f4d00122a88b3cfb0fafd9345948777cc87b36f4b48243a5b8927c42b9a648bcec9e40749931d4887b68c9fc475db70ba1473cc3a9b4859f2655d1e19fd36a617a3eb84410be083f7cd4a7c291eda573ff8dda4c7872765561e224dfdf9d5cbeeae074721b695498c24c6445a8442dcaae4984c0e445bc591cbc3eb2c077dbf2d9eb937f39128f4489cd49dce25fdac6651350dee08a168a5c4a9adc522f5fbe3ded3da7fdc5e5077e707315e62d49ecdb309e03727c0000022800000224000002200477fc4a560a8959917ad04704ec806164ef7a113257f121e210c0cea59a7f2300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000191639eac259d1933389dd8d2034964d81dfc334129b16c888d5726311fd011feab9a57c25e823a64caa86c6d0ecca0c4536280be93471bcf24b7d0ef0c93e8e48f13845bf34e83cf176e12badaa8d19343ee0adc99e57e60cdda696fa7c18d3958fdab9c0a38969513cb7c34a9745e84e828cd81c4e6fc9e4a80f0d28e0f701b51562003642cbc17b31fdd45f93a0af6389c0e94bab444e7f842988d3aa4547dec071bf15358f19559c811daa00ca51d6b169122561ff7abb44c2721da1f2b946525923d68fc25e0f96712eb581587fde1ee7bbdb7f6ed92a7cc46fccc46d0ff0858465e30b56896f88842df5e994bc937fd8c1915c96384fb13f5491baf8126deb6ff79dc6d185a4430318af08ce8a58427643aa0f07b4107a2f5476571384ead0cd68b6dea4326917e1bd6eee88e080e3b4dd68d1550c39a94853001c40b1dfd17ca83b278aca945ba44c3154dfc31e2b15c19ade05386826befdcc25314974ee27e88d36c41a6a713c02f2acc9613074bd3be0495f56e5b2a965629ccf87d8ea114c46893c82e67573e26f4982cdc5fcf8f90e1384a91cc0e26e7a392cf7530cc081581685306b9817bf1c37981c1a1817a289b71157a15b9bdf6d2a19d0000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80221f199496f65f23905e9b08c725dcc978c57c8c89558f9b4d6f62b0c2dbd6a541d0d1c668964c4fe75e6b10e9bbb0c4524b07b8b88d8e02e906c585a7efee53f021e7d74c00938b464ef4d8de20da60aa016c37a629eaf5f2fb7afaab168aee8be2403d2f9ee8877f6944baf7f3866f0eefa1fdb0c9f34ba9bd9ffe0d8fc2defd90000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024333f937377047a15a86237cb3bec6f33a11c15185f8866ea9998fad3b334f662b9798c4f21fb9629443c9cea45bd686665553b8af9ddaabb245bc7ad0c85e71439f36d7d64398c964733eeb3a790956d0b2c543458635f14331da8d8a2d978148381e6211e6e5d2da34c38f782b5ac39a1c02fbedc9fafd8d1d44fafe7fde3b636c8d0c4a632068a39e63bc2d34b69acfe17c78893058b09d92e0569339e4c1caeb02de2d868abd0425eca9aa8dff1749443763df4df71ab5e050bad224265238f191713ee8a8594b0c4a91c147837d32d4e032b259213679db067b768a53c19c8bd2069736ecd915d209265edf0b4f8fa7f6edaf77a88e89dd797c15bbb60d713a96310750263448ea55e1f85766d54dc02c83bcf2e1ad9f232a463b3a60caeb321e1bbba976591d58999550bc43e485ae7b079f6f3ed849dbcb6dad49761d63b51287aaeced2977d61e91770b816f0772f8ded62bdcbefeeb3b7a6a24a91e431cc87c549f36ac9e0496074f03c191aa352e00fd5ad9c7fcc590d6eca70e2d73cc96f60eceb428251ce73a5f4d606a92fdb92c1699fa0d0d43c3400ece42031cf599bd50eba5829c8a0336f4c2c40e59bf565b15b4c65eef63c61f04e83195276ed239c2ed91e112d4944fa798410a85e82784873e978d3a9d758859b2dca000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5d2896059f4de2ac6c3ca4638d0001dfc6f51932d38a4ba6f710a4f17883b2efaadb33d837f0f2fe159615aebfeeacfcf8c3780769367bbe0ad453bd765d7ccc49fa2eb1ca5e1465674b083d7f73b6fd1e50a7ef0c2425f0641d36cb3f507fe1f5f9ffdc309a0849c3de7223ab15d6e7ece6a738c88821e70802a8b7f9aecf1dc23f5c9e1bf971e0d301708456e65376e8d1c67c89daced6457228851d7213bee616bea8d16508f4b659060635ec802484cf038070496089cbc31e56cbce3471025fbb2359ccf5c09f39972b1b4e8cc976d9473665f252ba4963a1caf9c036d64ca0d6729b6d671f66cc3da7961cdc02055aebe7b604710ee79e41b6bba8ccf2ffd070006b7012c2c1b19fc1a8325ef56c2412b68727330b5d4416938ec90eb7c5a1b51d017d2e415a122b063ea12d810b1f7d5fe0645ed69471b1f874082e9db8a3b38a61c1c864d24d5aa7b1858e29fdcbe2786c008feac23d1551a7e324ef5861d591a406ce0d5281b867bf236409fac2ed12d82f658a06593d80596f2d11778e496410d79c1ab85e174b3bd9289c15de3d589cc323bf6969b20a27a37804dad07fed0951197e4920170eb6bc006e52f9b231812b34cc7146e76d81dc35b0e1915ec05f8d75a4b6eee719a318767cb950381ebeb09b0908ac1f28acd1d1e0000022800000224000002201e15b528cbb8c34fbd963d712df7092698f7f8c7a47585233ee44b36a1dd15ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a27b08e5f83635b6aa9fec9cdb13fde630c3958b6c4c2cdfaa0000cb544c0b0ac318f5b50d69f5869abad3a5ca31d90ae4e1df20eaa0fea0c8246436e7365d3b2236d5a1288804f038380eba22ba8f73a19540607b0decf21afff3d07a2624db475e47d46d7cc7698d566a77b4c04457b60b66c1f7263c65fbef474f32be1a65fd2df5d196919c964f0372b30703c721528d26a47b08c67f5e51e8548081b0781c37845a8c9a6240ea786081c1c2315cbe3b0634235dd62dcf3455b513a2781ba58ab4d191bc091d632d078b813b7e8367ee9253dbde327d2622d5e705626e1ab5267e9141011ebbf4c336adc2158bdcb7881a3698b41c98fe1c849d6beb2a412787c1ac0b3ffa09a3f347bc9c59c42c1edc62447c7ca3fa649979d7667808868551460b8b9e74983f05f0498fe6d0cef9291b3cb75b863fc83bb22530eb95673c32b1fd7cfb40e66593b67b51b8b1e31f258fceb41ea590bb19e7c6b1f05b0b948322c276763888ef506f13436734f78d0c6ff152d114252e5b64e93d36874b6d6104ddbd63d2e81074b2e80847e3e87c87350ba70473d23f156f01d53509aaa19be523cfcaac2f95587cde76da6200dfe1a33543d1f563a43e4447254d30000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802277dccfa6a1aec59356c67cf07378511e581a1df635a8998e790dd97f095ca4122a45bf0e218c93dd825d277173081309f0d8268eacb376bff4de3a9878ea6160220c72f5bb6d1bbb7ff2652f39e09fe49d070bed0b521532d8021a9aa75ca4e1f0e73f530483e43bf6daf57fda67d3168313134d6ee75976a3c2daf4ce40450160000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a49f393e8f07f4739de7002d35cc9ee51689187a5181cff57f2905831928382b552caca901efcbb3e27d761ae4179499ad361b8e6fa959f32ce86e9eb7069beb747c66f23d8cbaf233ec07e0075e6634433f8cee7bf0b77f8a5534093cb32094376c8754783aba846f5761b77da2a57592fb5232f7915955d5dad180cb912163c4776d309f906592b5f526f79a27e1bd04c908596e69042ff31ebac5a9676e04dfdd855f3df2dbef1997174efc64406119d674e5703cb901c52167459e6479d3b3272bd146c13fad53d375838c86b4e3df36b83c8c78f90384f4fcdc3b1637a267c5fa2db907cb4a1cf9c233b051c6af128a1dc1e18659736fa56ee790a9e656f0e0a43223de43c1978ddf86486b5b755137da65a8d78732af26697620c8cfab5f9d5e52b8adfab770469b7dc11f204e4f8d59eb37ba9914d588a25c56cf9189da0a3f3ba686e29b6e20c58f6e632c7e7bb02d9422df14968bea556ea90aae6eccb86f9b7470473d0cc6aa4de0d8a10546ac5aa0ac20b8d1676fd06a589bcb401a20f052240fa1c1e754ea08494357b5b2990bab1dddf5fe7245e5e4c07ce1ded3b5f4e53e88bc36b4c880a541fbc02b3467334ed14bb3f8f1e2612e16a44c3ab350dc3ed9bde29181f78b70dcf123df8d46aee8927c6ad22f609d7a14dbb4ff0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002768788e9093355d4066afaa951bde76ba8fe111ed5a20e820dc559faf0e7d496cf7aac2cba4622fc75e3836af09e5aa827d0354f197a5525504242b0633ac23525b75f5a897b4a41cca4b0fed1c97b0a2b1a66275ec7e3ecfbacbd07e762c6dd314d05bff4808d1eb1fa231ae52faad087e5c0fe7dc889cee02fb8668030eeb332902f0a5a3c5254c27f28231795c1cc512d0f1e8fc1729ddbb4f0546751be1477bf2fe4b55225707cf2765ad74eba5c5d024139e98f2f36c5bc501595b52bf3a1a4ed39660cfdc2575aa325d189b616b2f16aacc667f6ff266e0a35d33b94a5685141b4a09edf9173ac59c71ccb4c1b0f3e427a40eb510454a134ab1d5b47bfe604f0ba072ce9fdc7151694c3f011d55dd4b5607a12d7fc7bd0905c45e7ec411313f59cd347cfa49b04981ba6baf48925c65c98d112d13fec44a776553f80ff617b22fc8c58d2e3ec733f013584069b64da2892c23b8382b0ac0da06817840627b6a12fd5e107533f180a1f1720897c33f003967bf5c31970e1c3e7c8f43a1b30b7121fc0b0e46f7cef00aba7a0559ae7d4767c23169c4f21b3c37b186cdb17fdf6e53e0b606f19d8a3a2bedae5050f351f96f302727bcf9b142105fe6652dfd507107c6327744feacaef0455e47f986d331cf3c5039238cfef20f0e95cc6e0000022800000224000002200227e72453164c53b4b250cf7f133f9f853c2d0de77548907e9c472edef8f056000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c3714a31bda09b564ec5fff47413a49c2608be0e48325b41c24f12b4d7534b792b5a5ae78400123762867c77c24e405c090f4a08786a828ca4971e036a927c0997b76e33535a6531b62ffffe3a076423875c8c2915d105003bc1092df9eac55cc51cec56cb97deb88a115047708e8357ac3b8da0b785447bfa9474e009642da7706477b811235fd05c5645f5b98e16a0ad410dbec4afca51e87d87ba258468c29cf27f98a5c7ce7930c761c647e575faa1737fc843ed1c57ec525e9134c432e294801608038d4f32d2d8735f9a80ac365ef8ca43cae1257636025367e50bdcb4ee7a073f74552f1a4ab78dccfeab0740d652ffd0ecdee572c9237e4ee15c674c404d218bc0ce3a604e23cba23a518c761b52ee0f16c07b3f4ab9242ebab1bc189274419673eb3f6451ba6656aac153f98a416751d7c660f84eb431da602c7fe1d80903f6578a184743eb697ac00ec47f3300c80c9159b00d50c7a6e2cacef36eb041535e4232d131a6f00f89026c4b3a47f033bdd5f0e232569170057c12e632d90b06a13bf105382dd6570a3fbd5820c171b06e74b657f526dc4c8837bd7165b5248024c0de5a203f8f718244904656ab93e0e75497d52527e12aea5d6114a000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012a7df437b631332d793692e620eabd8d7b483aaf8150dbaa56534778376f1eb60221ceb8fe38995a26b4cf725d2d1ca81f7cca2fceeb32819bf9cfb9c4efc23712153f8c18ca5420282b7d9d939773ce9336fa2a80b96c5ab36c28262ee88abb9c00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054236c3527642fd41200641fc118c298d8db82a38bb8af7b8b08e3c9cf758f044378b0ce9c8f4916252f17e5b3364cfc5f4674c51733afbc4e2dbdef997705f88efb3088d6639ab15451f1364f977f377eba239521218d1ed3fdcd96d5f13288f20560f357e7f7f74d9b9996c8088d09aa5ed21b57c706cb8b849abbba33968653c1318426129623fa40ab74ad00966eb084ed5d96d331fc5c66197c5e9d83314b00433d0d047eee3b9845b308867b2b81cbad4a3bf67cc9f26c88d31cc42675cc3ad4210b21a7d835e5c19414dee32b2af4939a7749a5465993c493a987717782e934461cc7cb194962ab77e33ae711ed6e9da27a747bb07bf3731626bcb3aeaddf8e9feaa7338eb97e84f18be606d52b68634f31996ed2e9b5ab007cf5c8f3e881f7ad95f3583068a94383398655841a26d22f76db94aba2194b97425ff55a00d1383fa0cc5eb0a79079a85d5e7057dc64024198ef18b7ea63a61eafc9c84604b585744c81d728d5eee7f99e237c15119065e5a8b9a8b5d25854c02792111adcab1a018bde4f459f61218c69e222e9e43c81f85bd7764eb2d801e10287eecdc4a32831fb7ebdba9536598cffd60e5bb67c5efb982379a9a92db89def753eed495bea61147f31bbb89f8de1333fa75fba715da2eafe05e12092aef280582f500000228000002240000022027dc5a60d9c3b624dc50fbcc65d577f10751a9b89fa7df09ea8473d06c3bdaa600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a109192d7784f9278a72ae5a272332ea8edde9e1d6d9abdc2ebac309fcd693e6089936f2df19e326d9a68d5e05d766acadbf3cf63e88e56a1c03cba753ab4043185b413d63d5c3bbce58b477e495f2ac871b2f0d2e03456a913d88ff6fc3a83c8b76dcd47ff05696477428084cccee1de3304fc046517ee7efa0cece99bb095197c145ecdf7b008dc1eb6e107ca990ea015ab5265ef05c92f1847463baf447906d90b3d2d5e4922c39778f2df203615825f8226b562fe625c267ac3f17e8277c2ecf1bba85c5eed6f7276f0ada5b75807c1e5f19a9a23d3daa3cee126f7506e2cae2479bbb0af7c05ab562f0e41c484c2a18603a6ab2f8d6a5d4680fa339a9437a473e776c2aace7bd0e7380d602bf55d24b054918f30e10649abfa863cdd5fecbc3bc193acbdd8e6a2dcafaca509d202c3c0fd3d8ea6517fd096a87b8d96ca8878cba6e5c2c0c035de4edc17c620fa95369fc80732661e47f8c3947df78a632a938ced2b4af2bca834640c1a6355c8c7ca0601b81f7650ad95b18a10dc65a2ca86e5103d3b90329acc2214cd7b6c91fb3429f3ad02207b51298f7a20dd14994da71aa86cd4f53c3a3125ed53091e5bab465246aa7a77e22db9b5563a4b0ae4d000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40101a8b38ef41eec5112fd2d917a82ddb1bbe6cbf0b379caf7ad1eb67fa21c23910223a6e0e391c7883680e7d9b1dc7a89915fa60886ecd579c9c27f3580328b386c2e5ae7429fbd6819533ad46d7638e7dee4448be7b2f0b7af14da765ee6eaf7e5000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8fbee975f33902b03f9b60d07eaab7e1725626f0a304ee90f28269bb62643e5bcb18a2b9a9d3716d83226426f8b42df744927e0ca432aa4a4f02826be9c214ff96d0a4abd8b26a628f9a0fbde745709d0a62785a3f64d0bcceda5ec330674919abb8e32ece847881e28048a785688f90179cb96d770d8416e72dde3c0aae03375cc8680013b67b7f9adb8ffc8d2a9a94eaee98aada1551d55204a11266abc308c5dc296dc5a468911e8704e8bcd2fa5cc3173f511012d4595274ef0391d2745a0575e2489c54625aa8fe09a4c4371f11c688f85f33700b4ed6156fc6a994510d874d8883de37cd8a1af544aa72a246732ca944b6e1dce2deb90b549166df1cf6801cf552d016a050a3f7d7dc937d7276bd93b48d3db29003b76c013181c177675a535b36588583e1011320aaf952f67d351f7ac6dca0a50df8c74b855f0631cf3b358a678f87b5a3eb5469c4b92f405cbb9b571b067a49f4d27de5809e57201f4f9be1391bcd83ece6b3ae4d3cb25b5ca0e22156aaa5de46a65b0793720fa687f31ff5c3b7c88a21be3f9b6c807a72960bc05a93bf596875e5b45a63ad6ded3be76ad5fb676363b3a89c8c8dcac69a5f3bc7ced2a155f14e5c59114a528b0ecfca173f84e6dc282c27ead199d5566c7343fdd38b85500cbbcb21eaf410f9ff000002280000022400000220293bb3267c0dd1979605674e7a2685b0cd331309695d65d57fa9e6b0d4279cc300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860d2dd71327135b7846ef21b4d79115c6c16c55481efa4090bb7849e25edaf3235e7019be3a51e1a3b851e79ce10c82fbea8ab7439c376dd432314344a56b4ae57f82b803a3ec28c6712b5c4da1a71133693d516414466a03c437de488b569269936d74f481bca00408eaee45a8a7e4d3cb66c5a07128b5d122e16ff35b9dbc432f31e88e7487fb3180a7b666d203e05940135b6585b06115aef8dcb4a54bbde8af47f7ca81741fc61a6fd09d4ab403ad3ae8e365c4ae40de4359ac65208e6e1894385384b99e216258f1fe7097324a75326e68975cb41ccd443304c4fa0e7a2f4b2ff656db25d8dcd8c58b95cfc15ddc7e04c3d2e063c740d756cfb0e1759a5ff1c6ea5526945d7d2c50f4bda099f8a8391a47b2f8db38ecfcb70986a0ba2f271af9a6d32aca8e28e222614c3918d1ce2d95d622a372310cb16b3845c60f851ad10d39ae8fc9e4c3a9dd7c3cd9bb32ca7e5f794c647f05774e2f3b1978c440173f0d5c22da6be1f6bc33794580519c1145a66ac24265e648da598ab30a93a32f8d506d6f08ca4b2e59c5867ba0ba24911a2c0ed5dec9b83dca8b7ecaf1e21a43f4ad0f2761a13a60ad170692a912f7e3b8e0d374e584699505925f64142a3f000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011e640536f767304d701dd3a4e76a13f05599e789d764e990bb5b1a5ff24dd9f5022424be364721ac5a5bd16153ea0446e0411e11622c622fceb43ccb34b403f95802ddd07fe747c996643351b94a4c457de9dd08b0aa63e0f6d5d0903e08336edb000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ff9d31679bf940401c24d2ce131256090e5126c334ab662650e431c1f5c6384bb67f47eea94c93c4264dfe48b4f2befe845ed5da1a3322b537299196a1337cc2d518c70debf85bf70a95ed3f249d6a904e073eac6869d67ee84f7680b7fa109b3407b76b8371df94cbdcbc2597d1c83bfe36c5b2da9b5790d567e3a37298e4d7422d8a335093a6199752e96ddfd1fa356f46c7aa246bc309cbfda745487fc1f4f7fa709ae212c5d7ede669689970e07cb790088750f687b35b15a3355b9d8cd6cf0ca7db9f8d683081b683341ab035bdfa8406be3129273bcfa498397cb6023d2186f5a88f3cb9276866a89d232619258998d6c27d01725555d1aff1b5cc61d72e2da1780a147d9dcb725abd3aa90d9984d865e4c97e82f3f6cf6655452daca7b4c46c72f9803cf95e5ecbba0a57cc8252a527d23c97b20af2ed0c478c3b2ae4d21a5bccad19ce5a3821c4596770cdd1e69db1aa6ee90483b8203d0ac5f8d4a5ce238f67d8c5735541fef08d59848d455f244a79f65d197e3fac71e5f991341ed1419b93263f2023dcb78b055c5942125b449323a46d666fb7896c3e724debaa393e2f6da5197f28a4de6aa296a5c20299398a5751b318f735dc06a4a4e1e667291a362ea3c9e27b0ae2d76d6c9f9ce92fa76241fd03ac19478cb28f62a087e00000228000002240000022019c9c2dd6ea02bbc807891cc9e87b1dd23c15294832ad549c01a9bf021b9db9a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cc022c0b7ee3916bedaa2f3b99441940fe17b658b1c409ec0f751cbfbc7b505aaade5723c5d9837f0a5bc4ae2d6382f6ba20c1d87b6b6e18b8fcf3b025ab45679b34b37821ce214b4cb273702bedb6a9edf312c560eebf986a460063c2271f8f4a13bfd2c464348da5bec57f92111768561b5e5ea43efe9b31927fb68cdd43693d6d706da4af387f17380a392feeb0d51a57ad944c51f2dc36632915994624cc6aadc8f3a976e8ebda805c644397a2da5c28db89bf4742c154c892e4af9eb8da10e3bab187d8877c584f6e9728970e40854b8a8592f432b3ae0ff875f95184aea044754c3b0079d90a0da0eaa0e6f7bf78bfecdd8d06654f5acefde2aba5426f80b3355a5ec2f609f910412312b0bcc0e96795ca993b5cf28e70f4652da1898a332e8eb944f561435be938e49066b52de9d1d01bc473c7c8611c1d912a7dc40316d2a12c99f104fb081027e9d519efd6fd463ea6b389b92c923bc384efeb15b8ff7725e1e1ec3283c3ebd68b15972b788b4ec532713fad8aff6832fe26d8033186221a7ec0f19e0b999efb8ec6d04d2b4155eec1821f6274c0819b7d88cac35d13b64b70d9451bae436a17f50b179f3b571a1651ea9eb230f78ac32fd209225000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40119f29817f7ac3a6835625c9cd07f52e1f08e7e84f7f9fc853137cd7aad9e63830227024cd0f68444c6a5a6f7ffce91e017435bed6b0ac31d4261eac197a70a2aee2df2217fe28e5b6db371572cde310b654140fb68e5dc0cf217e4ae2a82f5d220000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c45a9520224fe6819b1047bee4643fe8d5a382e98f04c4eac35360875b43878466eedf3918f118070484ddc2429620e2c18de06152358bf3bb05e4ec22244a08d6ec0381352fd16ba65800e45fd578f89b920583d79ca5e3ddbfd98669881e7b137cda8bea2470c6144842a3962f2f4dcc5698f67bf1127eee80d83aa745c74385c46a2a20640d7eedf952c7b7a42ce901030fee98ee96ad1ad087c80f6bb63afcdca366b4587de9f13334443715e74d8fbdf1e44ed2b38463f8139780fb2071b5cc42331e72234a76d82caf53b9143be0d18c0fc983f0453dfd143ba11f1a8fa5cac3a8f60e52d332b89ae9c806d1c0778246d3237afa2a70153092a85925c4465708103ef0adb5782996e2379b09738f6d61aff2f6db6ab100c998985c4ad61651c33a1de77d1c4b0a2ca9c068b6c1e2ae2fc36243cfbe0c0e26fdb3743193978f1a6b15704fcc878fef1b8a783403e90877bfd7c6525dbd536cf40c226bb0fefd2160d9768302d5d1dd02b6e9e589ea4ce4301a3f7035ec7e040347ecfca38fa7ac4a413ebe3e90bb466faf39cdd8eeaaae9a094baf361255e3226fbbfc81023462335be61739311fe78e58c57e6486864f932e4c5b91d9189bdd80fc3ab9d35d44eba9fa1a82cfb3cafd90071a361cc5f5fd768285b30cd6481ac5d15c400000228000002240000022005fd49b525f29692066d4723c34cb6a8c369e91c818a0ffe367e8931b553421800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab4c1153ccc9c8e0570b4ea75828c3ab9e4f8635c9ba72d5deae95b36bb47fe5a3d1d9ab5f11c9de66f7d34262dbf3a4868888ad25418e52fa88c89d647a873308ef0e5df1f2cb4c4edaf0a50aca9d527d937585b09c1a9260c4167b5a49c20d91b4e7cdf67d7aa52983afcc42dbea3da103defe99e8d68023b122616f13ae07aa13f18600dd55d518dbf967fc4b159610eab5e0e6e6950840523a24cadce7872425e11d80b968a192c442cb968ada6fc1964c10fb29a0df6c2eae590ec2213310dc9e26950afeadb6e041882be292a221dbca5acc40cef5bd96ff97cf4b1f78260e9ceea6845e27b49da17e958004a890ed45c1dd1ccfecd2806ad555887e7da4b17318ddb47f86f96b2a5d887829943dbec6afb0fd8ab0dab6a7aa8b7e130ebb1f30e26ceabebf4dc18a723a3c9f69b2528ca1f06d5c8067bd3574b4a71b993db8f8616f054bc2fc97318f85ad5ad1d2d81c2233f044b6781017e2182a5c5689f9fc9a357b2d65ed08c07ab22589f6c4402481b68ac23f33533d6a4a03e0ee90faf1e1ac54c60925c05b67f38a943fa61d10e7d62d720ac866081d40e53f5a6e0ddc3d7a9df2fcdf780be80db989402363f3b203a9d489918fe97d3d7d3ea8000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020099d308d7978bcb1e49a4ffb4b84710ad7b098569cb1af6bf30241563b78ce5212dc4ebe6fc2b8a1b5d054e5dc4da11603b96c70e9b3852c43fa57f7fc0bc42022714ad1ed2e250619eb9e7ae1364b95403d3035455877f4a4ad1654dc12e02732558b2f6009e7b5aefa32947f9b9a1eae990f3b3b8049a28c0d2c1905a1e37e00000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a82e70ad7a8b81e8e97156cc449ac8a12d6ebb1b5214e001defa4d07f3094d0dfa4978368733a5b47e7329dbcb4677d2d4b548f567bbf379fd737850c62adfb0b010769ab0fb519fe42ec6e1381cc08190606947ecbc481ebecb0369089fda475141a9df6ca888b1eeab39d5f7814fa93acc8c1dd8713b011d5ca94d8d2948ba3d219d6a836aa34329c9238cf6145172f9ed6b7cf711dde779ecaa9a53b9b66bba805540d2b3cb565ba4ad3ec0ad44a281f6d61e7fa3d2ade13ebf11f69ea4c9f893068f77155c7a34201313401f197a95798aed4d331fc40460c62c2e8d71403bdbbf092d49d1d6508ee4d6fa2fe455f06481cd7bff38e1123f25e965de8908f4377ccde15fd91bc7b4db0b99f634fef6ce454ba9e0ddda8ce5a0563e35ccff219f22c0e4bad56bba7a1ef1870852c0ca76c8bdb8c3673fdeaa41b4061c6715b1781af49f96fd78998ddbdb280baddb84462cfbe6b87773ca4206a914f2eca22441f5baf9d731fc9d8dfcbf300242a54595c8d1126aea96a8bbf4d7dc2d08997ebb630a63c9913bf8fa0179c9bcbb2060bd3349a13126ef740be4a5af6186582a647b2ef80d2ff599d6ad5c67d33c32763274f50ac093d700f48745b67d97dfd911141fd09f9491ed793133c225c349890f4732555f271e1b16ad37d3de53820000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008875457dbafd6d31d0b398419e54bcaf616f947bb240d1b8a5ebcc5c964dfd6e622bbdcf169af02c6ce85ac840850a3892a25ce34ab9d50b3d3fa5a6cea809f995c661ee7ff820c2e3767c6c85e5fecf086daae6ffbdd79e78b3c95a8772eae97aa78a363def7ffb20396fe3e4a157524e9ace7ffd5237487ac16583b88c9bfbc817ed3fce1e81740ee7a2b43fcc918f6458e869158d987214f19f7b9b741409495a4c410ad384b5eaeed304041c813de491598871d79e73067dba5648c9f2af14e545f32290b28e62d300f6502ded26d5c2420f4e51ebb224b418156a82147690c48e7308b35edba5a4d084ae12312f3c672eadacf3843af80cf8ea31d82a7743e92504790d4c4c1df60ff578925ec9f9840b2033300a3fb29d1156e57531cf84eb092543aeb6fa23c6096403894ea7e120393848e5da4cd64e9f4cbfbd79669e9f39124b8799912e9c7f5e78cae8b059d38248a62b431174efe6226a4fa375c84636972ccba17143dfa6152a140c02d720ddecb75344834044ffb29bf94cf23c9ba42d2c1192487c1609c746cb9041e5d81e1de637139d9901b9e8e0f4adc0310a1bcbf038bc0089c2b704361d77b8cbdc0a02380cfc3b64963ffcc466a605b128d07fedb78644ac108e7ecf2c358ec30e848bcddbe307d155ee0786dff6ce0000022800000224000002202ac1f48a13e6c790afdff43912672e24a4b4c93cb7be053a759204f043dfc8ce00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000afd162fec9b11ecaff5a4baf6a5403e03a09148830ee64eb8f14ab0ff06567e9e6bce8555265e39bd3fdeaa3e77ee43bb1b62189c599e3aed2e7ce1f8c19a14957aed8067a09c590842bc9b712410911c3c3404cb30a4af3c87562e4c09097a9bd29cba24dbce705eb180f3a54767dfe3d03d27a815154c1c5774ccd9e3b5f0433d88096665a869c29b2487aa7c9a7cc9fced3baffb90e7acc3fd3c3687741508294389b21e12c6aeb20502579e40123d39b668868cda78c0773388b4e5417c54b4bb94346a05704d3179a95405866c04e6b38ed40d2408ae4830f2f81394c0b66787dc7cbb8577002d54af45e5f229e74e9fc32a098d5d8b3a74c08a1090df7bf646e21131905513d12e0ff09c417724c3807887cfd74a04109c0d709ab41aaea03f5c4bc20c3fc0042f1c9350be589021745ebcfbe8fb39c70e8b4ff7520b346df5fcfcebf05b3933c900ed8aaf3d48f28c2844813febe7fa61fb5b8fa857cd0206753d0d9cf7a61b58edb05a0c9ae140bf2820e3894cbc13c42d3591c678059f7bea43df60d6955885fbe480c0aefb257bf39124ac3e23a4e0afde30fd2023e6f02d6dc412513d4f45dbf8cf3e238497656c223fc8706d5d7b2a3b1064803000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802227b16f9e66b33d4069af90654f85ccead7ce8dc97ffeea5f1f4d7dd84487c2326b39f7de52d8e172f946a0ac2a49fb5c89e7e096b3bf00d8662865563e938df02281ebdad56b1fec3f43eacbf2e3c28a080bea28fd48abf5799b4667aad9d0e111aa6fb374337dd7ae626c067b546936f0cb314d41746c9419eaada3f9d4a3ef60000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094ca16329350b2437798c0a21f53cc25ea36d859285522d2185f8fe9659c8cf3930912ac67ed32f6a12a168e8619ecc9a55cab69b388094cbea409079b4a964392d3204b858dff18af0a1faaf61c1d6499ac8f9f77a32ea955f6d25d0fff231b2063c9d94c1d85261418fbfb56a48f7bfb645490a2cd9e704ab6852eee54359dd5e7dce532c206decd6378d23d3be235bf08932249966f3980346254e2fc168b408775a6588b5c997e11c4288f32679b2ad90049d51c181a86211eb651ccccd970383eac85a98b97f9a1be1530caab524067df0879e1676f91ceeb2f0f1bd6b90df859e659109ae9a677cb6ded1949e20741958ef2225bf607ab5d8b185abe5dcee2088780dd396b7fe84cc35ff1e074c7e6ec6f6448e0e8accaed6d94ff726d5ce0b3716705039807d853a5c89a4e605adc85a3fe785a302dc5868369ee459b93e7196c7f10e6064402efbad400bab0063677e0ff3c15471656d92f300f095fecb66d7f958811f14bbfcde2e34150a4a30fea7f5be4236349eb62413b1ed422c8371972b9558d257dde818eda90c8d8ec4d0616bda3b68ff28c499d61a8cff49dad8118d2d9c7681e472618a34e0f79db53088610a51b469c473c2893dd34026ef8a02af2be8a5e8422b33fb09d7f782937e58e68ef891de0832a2a5020d0f8000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a02a34168fbc86699af6cbf8bd5e5aad2879afc4997b98d37e0b4fbcbb852f07331b6c1ab0f06f5e307317a1ce0a33c0e93e78148a50941c1741320322ef146a4979eea48153ff3ef57279445b6b6cfc485356b8c04e1c3179f7164ff50b78eaf7a4bdca655f8da6e35cc779463fe0fecafa06906a32ab9e057981eca366471404eccc508640a5ca20deeb5fc662d2ea350eedba2f2811fc9c8c3e1b5f9ed346cb046d0e26222de6e890ba63898ed93586fe855bfa829f9c861e3371d64ed1a03ccd3b938f43a5d453ca381aee4fe3c4f0ccfd092fe4a99dcee3a08f8631de1f392a938479fb0665ac1e876f76d91a980fc55b51d04fc723802098889b94ad69c454917980e59dd02ccaa9dd3688688c3c83560ca8f47de6c4f94d09c9ca944448a1020d03168adf7c065a8281fc817389e2cc6bd53d055f007de06e0c93f051859afdfa576d43c0310e28f5bccdc0d4481d585f83e2d57bd07e2d481534f0743d81ed7e02749d3b4898a85d8a6f5c10a0deb80f6b027373029897ec11ea1f893237910f780e07e778437092a7eaa8ab2ca557d7e4768fec8278f9ee320d9dffc18575115d65290d27f7fe3737db29ea6632f757b16caed36f37e0d9b051814d599345339469b1ae99c249105c0a565b5a09229485b0960280f447620a90538200000228000002240000022010a5e7865d236f05564e2fbe69e480e7d3054c9d4533a20114d0e2edb251850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000291418db3f4d12785bedf47682e015d3001d2201073c4f8cecefd38387c634bcf232dbb27ed678e77f978ba9d561b4e3f7cde85bba1474ef60e37efdc709e5d585b01095ffdd20a43701784a3d9e4f6fb124f356caf7ae2dddf45afd0cbdbe5a0848dd0e960ec7e7c1b50762e41b1cb06b5c592231992b41849b9795e88d7ff832ee15365dd7c396e71e9843346c8b988a66ec61da1cb6aebd822187c09f47325d57e4d8773ae76a0732f4dac6f0dcd3a3722312d041b62c13e1a4d7a4ec7aa000d6aaf8484bd872f1b97ceaa96ab2e6ba3cfeb5eb243ceb2b767f73ebf0028eb7f202ca1596646300ada141f4d59a7fbcdd30da4c3f6bd38bfa1967dad5d63a2cc9591a1dd7dcd02a98b890a37673e4532afccdf1d3b3ab12c6b7026365e4450e9569b3ee288b6808138b481f052de775f5c2019c6ad9c02e3b2916cf355b9bff89e8fffe4dc83ad8c3c09d8ef98c2ca93af95ff9f711aa90812bd474bf82d74386e8eb29e85c13c046d1f3ab8a36f78bdfb97422c27dacecb9c0a5ecdcec66ff8ae1236b8657aa2abd603382b067237f29ca80c0cbd2846aca5eac238443e15a9b4b24dc9c280ca87a782da72ac0e5c4755f6da081ef4bec07d5960fe76c52000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401060d3a944c9cb0a62486f70eeed40bffc7c510197c8eecb60a9198dda8d038e1022830caf60f6fa7a6f0f21b1da66b87bbb206fe0d05d893e517a2479ccabf533a1adf4e42e61f64614ab97b7d4cbe55ea9311f7c6aa9d28cae00a1115370980a7000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a265961bf2ca8d0a3a7fe94a8a1097e74f2b54764e575736c42e0a84c656a7c89cf2dd7632a24bbd87d855dd3f9ddabf73bfa985c08de28268a9d8e7b0af9c7804c98a2706c8dfc7b7d9ef4b3a64df04a4550faffeaefa2662165de81f3b22b17e4e40cef45287693bdcc78280e2cf743785ebe93a617bbfdc0264a3e3b448212f6a5a13655d548c669cbfba81e33197d14b9566900c917f2c12c248ebf77d75b454995d1b7b9909ff8042f28ad5216b31ac5e8556e60333acd2b333e5525ddb2ff4d4192fcf05406ce439c6891a41053c16b0df9d9c4d02f683054c7e78ca105cc38b2644698f9a2e003c1db9fb1c016fa470cd7a92f84882adc394070d1bba6402280fde432bf11d075b1e83402090b28b309eae69a2baa814e8dd3a6f279ffe57baa94aa605a193362038b18bb0a52ec6c8c61b081d0e1b10192404de15f73ce69d9928c739dc06fbf04f77ec0517d99da527cf82e8e7ee29f4b2fc899ade233d694dc296745be1c39090606efcc35fc8ddd9ec920a839dd8deabf76d4730a220cad91134edf0602e9c9e88fe2ba12f41e1c7f0d371743ad96fc2cd0e865066eaa60aa30d90ca705b8ec533e59bb36962f1f44732f115ba24d598cb765ad513076cc8abda169d4f10115925ec841b83af8b5f53f2f34bf31328a2f874c8500000228000002240000022022f7ecb9adef73b2557f8d198e7fae7f042c6ae6aea9a6ed77d073e726bb180f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009dfb2c7693e9f140fa03ff8a45c375c6c2ded34e6ddfb1b024a9cf1840b9abeab2a1e8bbf76f4f494f26f9418780cc33b427cf83e656ff534f9fc51fb00f3cbf142fc499e63830b0d8c0c2f960da7722c4acf2a8dcb03f4f3e15439ffa725d5f3f5e15aa4ea2017341ac5004e5472a5bbf51b3a1edccd8f84be293d5980481fa78639f4b7f91a560e416954b4b9e0b894cf97f5d69d6be93441a6ae847dc56232773a62cb3aa8a1c203382235082298882968af11926b016d8c59e33ded1b7dff37e8274074b812cdc9ee1f567a33bc1349e4efaf7b241580412d1c99aceae30316f01385015e6cc84384507b1b13deb2a9e637285ebe150bfe1e0033e8586dc3f350f07aaf5c4f934d8a1856a27fb0101369485092854ef31ba519c128b92b900acd9054b586a62d6cb2c547ae58f1e6c9eaf52f818939760f1a41efb02bf7a9786780010bc7bb18d0e60f3c0b1820f6d7b1953db38f7fa7d65e5e4bad6e3306ce78ea4e710f8798ce7befb29462109b163597233d35cb75e9534fadf8c1731575314cd22ffd58cd38ba26c3b17ce393ef9b637c70a4c32def7bdf8e2bc6518b1ff6cfdfba76caa2ac804e4fb73a3d29e436742e63d159eabb59972a034da02000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010fc2e3b89793a370791431cd20809b4c741c56dd44e4e0a47eb17cc0f32623fb0228657d0296eb3be6a18d9fbeb98d2b764cac80f352a288c60d388bd3a636c2ac04d735b6dc553a554234120dd745004332270605c8eb0714a0161e739b7c6d500000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081a701ea793e5d03a858cdd805d20ce6c9f59f47d0282c2cd63c3f90e7b6db1299cd83ea30318c452463c749772a41462ffbb91ea5899fe5eff9aee91c3781ecf2c1705754ea117024ed85c07a836a17d8568bc8a43257623afb92e0b124284ff3a24df0bac8f0764ee3f1f76c13ffe5712c2198c5446ce9396c49b929f6299510f2a22714fd778e3a104b2e72d1af4c715ab0cdfff30fc473ba60cd9158a5ae6b44f04c292c1e51af66f6e740e226b98da2bf7721ff3836693a1fe07c8622c6f1848b7740eeab3eccb70bfd3de0055e2bf35091611673d5274d1732c1ea5f3f9abe33463f53e50171a4d48e4555e1fb0395ab688782bae629c6abf322b88b531c64716c22cf7738ff565d84e9822014f4fb2d7a81899663a2ad01fff4a18af104d01e9f562ca035bb176833b9dc7e92057cee2fd2f3956c05c073bf7a7f67cf32577ccd250f5a1145710df59238e57746ac13c0483a5e2090455e39eac26eaea2eb9fe67006673413095e818dbbc9c835bb7a0684e26ecf3b14615ccfcd083b8336761e8dc42683852cba370b3b342f96318d3abfff68a24b3a7ab05f24319c271ef571757d73b4542cdd6a505802d50037b636b9605a14229f0215b4407b41f9bf95dc48c1c53b15798716da5b6c4326f0b54760d11baba7d96a25e7a7819a00000228000002240000022020d787a3911441a249896fd5fb2321e7cde1d1e84d383a2cac463d355217bb4d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e3632852e401e92b3845c37805fc89b1a84255b92928a35872a43c30c1d6437eaa168e79cb30f1df45009aae07dbb32012c21804057e3339fb3c041a2f3033054ec66f66fec6cf6b9066e4ac4f1139e61faa33651e33db54a43ae15b7d3dad16bb2a7e5d7d17c2b18856cb82d2519a275b7275be61b560fb6ae28cc5e6c6f98d0d03788be77999b2a0576efdd729cf3563a9c01baad0a5cbd1acf9de851d6833446a579c9d9c7dccaa85d9e38a6f721f13ec77696ed3372f21f35f38df773f9d1f77901e06ce9b05ed203ccb4a1606fad93b163225979e2482c4d62bd9263b317c7523ae6a6aad024a7b1685e41b2c8a60f64d86dcd503715091bc005acdbf7f5aa0c45b6748681dbb843d1960b245e033d0134e8f107d411ba6b5171cf9c045cdec14c71815fc2035924a2e4fdc5932fb6fa8680a4329e69e08b2afe1fefd4cb1d084224156e4a75365daa33a2556c3cd6ae9ae58e146cd80d148263fdd20b5ca509ec547eb30c5c8b4c5e2cc15178e48e2ec41e6a53924ea9f502b98cbd046d3699fc15cddbac4f9856523dfcc6ed9d97fc36f8f41640ee5dafa16fa4689783111f20954d697524c149cc2b4678b49f01909ddcf519a38a083139936bab50000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401204ca57ed570bfbfdcd0d8c5efbf1fe4f6e3d7831afe0629907a5f357ebaef6002287479f3c1c7806dc93c52173fb1cb81c2fc21445c5a01c3f6cf960a029d4dd027f21591e2f59b6ad8de97a25d9aa5b13916510248bacdadf9e907101ccb405200000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aaa1cbc9756ced2548993ffe325e2e99860e24a83deab5afdcd0d41019acdec0c5216d45fb6dda4b82582282fbb0b69ef05383050ae187302c670bf4780cf98a3bcc0476d88307bb98acd2228926066862ea9aed24aca318e6c8b9bf93bbac314ec3003f24be9538f193b5d400f391cda8a68477d6a688831de5a9504f0d032e8cee5c801506f260f5b5adafa7de9dd84cfa0f029cc8e082c401ffaa375252293a31a70bb1f81c1ea90f91e39785b6418f26d0a440b1da0fa3608dd0d4ebb5e8c2cea51f04d239022d841db1ed1ded1711375155ab23a171ba73707dfbb173676605aa67873b64b255e40f74ff76a743a205bbed0986479681e8894ba311106792d54b237e0b83f3318ffdc2b189127e0c34a6d40276a234addb79d701615367efe7c472a58a97a734bb9b376ba4e5d56f080018cfccd4d32c79939a6eb5846aae15c98a4e86f7dc75fca6e0eb3008bfcb4e48bfdf67f20e0e62b23555332192e3e285f65e44dac029d7b4ae2d1a98442c780bc9c490513fc898744248196259b3cef427045a87c98dae88775651edd074e511451f4d6840f545795aacf86f44f56d461b66fdb8ddab6810478f867e78815df289d59b724f5b9de65fc7314dc5cda40fc575cb5a400291e8e9ff0e58e936d08a69f2397e65a5a54476abfedb8b0000022800000224000002201561161802b347d365a141de9e90c141b3c8374c06a727076f67750bafd07bee00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000168fc57a794ea43e007f6b6a4a2cd76d190ad96076739f148475f31732317af9cf42c6815c5dd678fc4d79d7f4136be1d7047081e3667dfc2cb651378047654f9183f5dd81ddd5008b4b18d63b7b614649e90abdf8d3a257aa25616c822512bdc21ad2a02e8a523a0e168454312af4b39f467eefe6cb03c7421f4360f0086ee8d42de810688003628890eaf848f34dbc94b15d52f7535d2939318e457b1d0a2a32d2af1485ee3976f0399ff59a5b896c18c9a0a4d088f51cb5eec1dc839ddb722d87dd8c858031e71e00d812f1a7b4340b840c1b3b974a0ff7e6eff61aab137d580f99221d71dd738283f56b9b4943a3682e5eab90c81716352fd49d79f896b8f1a103973d069489e30be518223cd9eae5ae4a811270c255cdb76b258a8b5dc29a97d4ae39326afc980c8d229855277e00870d09f88e3ed028238c25ede5be21433be53c81cb74490a26057981ff8382b465bd797cb651715870e619317eccf8e64a56dcdebeb4b47ed00412398f322403ce98f8c7f8485726ad871992e9babf38b8fc307f40af2d3cd5589ea88252beca2cd9d2fcd5403a6f3cb7969bda8ffaa8875569196e7ecf19583a39ace0e7066c070faa44d66c743de0830e90207ac0000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80223ffb974ee0985ecbf96b469edb12d45c99c74e561936c3ad8a8ce53ef95c9151be696ce1c0e718b6f8b7b33d1ebb14dabc25f68fbbc3b9622e39b3f5c8f08df0228bb0ca22998feba959a2b4c7dafcc73cb9851ec9c3a5209243e9837dc7c12a915069994704258fc4f5ebdb6e48cebad0536132affc21b5b6d88595720beacd80000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008ac313b177c729fe33c052bdf2ac24f922623088cebe9cdcf7bfb60c8ef4f9a159ee01c1d0c8bad6ab93c56633df54126da0c732164803989432dbb7acfafc19f04dda1cd80dbcd49267df978a95c9238e23e008040832ad972ee8df44e9495286825fb9f229ea7c41362b867f571c82316fc8da7197543216c2386f478182851af0b1df805012d1947c7e1297bfd0f793fd78be7960f09b63f3e9742ce46bb30f14bd0db9a31d992ef2f58a68b06fca8fdea02cbfcb847473d5095e8334ef0d62e89fc1ba4f9d9e6c0f1e380aafbb9235dd5927d9d5b118a0ad45cf652b95a8ff383ef5fabe8c9aa86c89f54b9ce69ea145aa435d9b9928acba7f96899e310b0604ad2874d5e16e977665803b173433d7217e70a987720d7ead0dbd3e0ca62065eeceef4dc23352703fbdc3ae297feda0367db7105ced1c864e532d0d3ce890c8e64421da919af77f050fff3840b9a1db84beb1648c5073d7f17cebdf3e7a6b0f64eb0dfbd8566f195ef293f10a1d3eb9a94d3f66870ae9f4fcc6d76197d2ccf2892b69f406d25c6a915a7ed0b3086b82409180baf3a9a30ee12fba0d5b3d201a0c68cdcb6c3b2488aa069d9e2fc03120f1344c2534e17ed25d8bfc9a2da22dd79b8c5045fa18e5fefccaa510642c8ce4480afafb49f544c2589c2fbfc3ccca000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a10d38e862355e64e031efe4215034d4ca27201e1eb0d14f85d9972fcd7d38756319f6271d7c0df5ec9744505a4942c1beb6cff1b99a47d1ac700bb58808f250ed3def21ea1a83abc1720c626a3cf4c3f1ba79c7149e8bc2daac313443891a8f4a8f5b2cd0e40ad021a3de96c6c9947f71dcb45245b32adc1cfa0010f38d9e34caba0f2d2fdd153910c75eae7d44d9bfcd13cc612211955702d0603b25d96f1b1184b30ade9bac42785b465a4a988d00a59001391f67c868032dfd32e5567da2f2b20b442ce85ba6fd9857229dbfd726b1c75c6d49ec1b081710f44684c291167f4d5006275ce58928f873af7b19fdf2f1aa9512b5ab43b922c28d0a83b7d413bcf289e2adda901b2c7851f190008565d27bfec07ea1b36432de4a1df01525852f10bf3a4dcff420c2e8e4c7b2e2885d80511b882c9b614f36ffce9cf71c176cb0294a36b850fc8e115481b4383c224931323091654b34d92ab21afb8ab92c296e80d8e230e7e669f20fe2481bb20ac5143b648830b16cd04eaa00026f5ad2a04326f6cb52c171de4ab45e02ee44e4de232f63c309e0587c63d5ca5f206eae883fe7e025b847e758d95c17859a994281f5f9ec2414d79dec410be73b1282acc0ade65b39d67cbe1d70319d3c383809300827fdfd1286f917e612e4c120c41f180000022800000224000002202c43925df77e62fec25b448a39f1a894b2da41aa9855dd0d5bcb6ccc0f0cd7ba00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1682c50a44fbba4eb88626a19cb8203a1294539c1f2eb7560a7d193de16561cfba966c7f627226d309b8b593ccd49a50db6d334446f8fb0253b619e95148f8df5c8507cff56b1a50a3f5d68f4bb6127a1f157251916c06db3ac39d3a94fc4537a5e4260d0e8daa19949414bbe074bef85013baefa1d88116dc50873877274734c136338e6ea40377736db36611ceb34c085a8b3b9c5c6671992eb8e845b4af5a4c0bf039e794c23efcbdafefa93fc67e74fd089a903d5b59d8cf1ed24392803a4cccbbf308b8f1ddefccf89288f799acbea2678c307fa22affcca2da176dcfcb11bfcb4f95109cd4ab9c786929171c0f29ce6ace4078d7bdedaa6874af58146533379e596f9a7b9f343784c44b0d832d88b7e9c6cd836a1a900102e762f4440ff51468c80ff0682298c7266e940b60870d8f01cebd783355fc3dc32316447e5694a8e17eb4f839a879515699b2abd43196341aa43ba8951193202c4715d7ad72932c47e2421a4a3441f224bcc94ac956acf0706fec13db2e3fc6a86b9e9aaf8678b0beb45a3edaca9b37403af0df802cd395fc035a60b7249c2c7bbeaf1662393c6b8d5f572f8a5210a4c5608a0b90c72d544afc0a12737b551fef9f8143d48000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010bb6ac7b1f27e3c5e8e0767d21c3d0f0b47ca09d70f1e30416456ebe7a0962c10228cbf3e7673beab8d5557d01871a62febd18251f665b8cf4133eed3d38033339135251c10241c3ec9f182cfdc4017f39c50b4039f4dd7d26520a0bc8a33febc1000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008935e24e1c757e3bcacbc02972141ee68fdf80c72c7e18ecdcfae4507ad7bf4e494098da03467c32338d6d780d5fd3c826505e87b28896055f8393da02fcc3d554be92eb037248a6000e1010bd827b38a67c9b62cd0019b13c9ba724215810f7ec626268389641c112e56e9850c0d147ffa7f9dc0d7f168e4185a8865ad0ba1d1bf5969111893f267ebaebc4f3997da339b1c5d915014f3069380dec3c6f4164e823fa3e4c1d3a50b0158ce4fea21f6f5344974809e668863bfaceb7c68320311cccb1f225f6c0cbe8c91525fd65d220c8d3de39e15ebbd07c3b2564c3bcf3557cb10837218941e3f5b36dc966f29b1da3a1ab412cd140460db14bd34c82e801109c68b62c379e08494e355878108c8665bcce19141f00d7662d92e565e254b23433ed465e5166355c1b54fb99ab09d4fbdcdc69cb05f8f190733f2f4114fe47df6f2f7bf3f8b0eedb748a7ab9b6a076922ca1d9bba2ed301b76d612809652e9dac76fd57e331699eddcba6795afcb4d21ead4aa116b06c2d26d63abd909c23d74a2ba284926d2b43ea372f877918e906e3403071e59ebcb366ba4dd76805560720ab3ffba02599ce2f253bf6b50222a92f1260a8b8d2de27e9d2742c5ace06031b4ae97f82fa2768eff5b6a78080ccf11d77ad52ae662df086cf23703e4a74e000002280000022400000220111fce9b62beb3e47d36bf1ec75f9a7f7ad9bb5474b3e4d4d673ccae9791543d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009cd65f584db5e950f6345a58d41d650c96eec2a6200247ef6ade571fb1583bfd57f0acf318e78c0c617840c15abe1c1c3302df8c94b247863743768d9917108e8c4a6f5e62b55c179259aaea2c3b53b8fc7e2d8cf1c4d763a912b01640a5ad5723b760e56d00b38e5f5c6851dbcc2c705693a6802e59b280fc992c44048a947b8a61f67acea228f2513cd20bea1e2fb9b0fb1d4556187e0400cbc4c07bee91813ee77b45c8611efd941060a89716e50ef1ac8d93487140c0167f868abb300dac59026deb04bf6a3268ffe24457b0c7c1408a45757f5c21a81cbcffcce4eca302b10d215f5b5f12a7580f2f5852d00568127ee4b6d6cc4bb3bcfcb55ffc2141062974529e8e70514f298dc460fbfa019ae4cf18b4249411d20c966f9541edf563c81dd5af359e3baaadf6e53f65ae160e46f09f833f298e8e6f89d054c09057ced07fa1d5ad7c23f6382b2838d9338cd2556902114bf89049fb8cf0ca9c09f0fdbaa9a0d8d8afd8eb13ed2d5b131cb39c636e5e035415245fa0020bad99b6fd772d1d8a876a339aa7ac7adc86220eb716ef84ad73e552f0330bbe1f5cfa033c92426fb6d4121430dd4d9f5accbe07e46558f13dbaa8254b2fed33611f952b32b000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401248e98b20fe2527a2d7daab97419540e5ba619cde8fa8ac0e0a79020b2a5bc49022a9b996a92c3b14f16303bcf6a88651187e0fe8d3dae3fe292012dd595b5218216c9023b8829f16986ccb7f9afe0cf56a9c4b2138b596f1bca977c87c5513272000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e2649999978cffeb8e4cb7b4d2aa08e2bf049165eafd74fdabce2f353674acaa703973657ff9c45ee190e896e22b292a074752dee13d3990124cd1a23df58a484336211815201d6990997a6388e47cc323c336921515912e2fc0197353b3d1acd14747a64336109f68f1798c0717ac6939aaf9f1f2ad60c4f80e197dabf370ecd615e3221642b80d6e7a42d7bafd507b6e13ebf389d7095439066e666b70f329edb76cd8075a86886b9336966259123d2e951b65bd2b130e23341ade23bae58d2a934bc3c2c5e26ede89aca9c4dd5833cbc4cd3da2aa14ca39b6334b9ac3a6fc7a941a2e93448fc362756a98d8fd74bc67fed411aac0364d48c38aca88ba435cb9edb956a1683784c187e819d72f60a88a9f66ec4cb3e67d28bd1b532e6a7d23c61be09003bcdd19c517d9178e84b91ec426faa8fc30d43b6db5f3e10cf866e94e1a5f362e4b78e264ee664f45fa127443e3c8e747fc55cb9393becae6963d2337122b1314f6ffa9410f48b54ac0c830e9eacf7d1d3f98503689396e78b35fdc802bad8daa7b89342578997ac5ad595af09e7275357b957099a3fa2fd79839d32f4be5a66e54ff9f03b06ad75af772e20cb15a1050d10c07fd8fdf89b6510709b039d7ec478acd6ecac7b71550be1103071d82888d5bf6bd1212f5c1879c9160000022800000224000002200ff1743ece9a597e2ab15c3e9d4c2be56511140295005422d92690d9a126fdba0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087629110633a3082644d68912dc4a5392eacdbd538d57c8f68167256a9c6982603b712dd30ae69b66e0cb28b3bcec03ac394b0f00587cd3b307f8670ecaa5020655ecafa0adcac133274c48a5a6e26870d77965f28f1ee781dd22cb42009b5eac8bc4fcfcf15ac650cbe2744dab183b96d61f0c9425204c2f9bb76300f8a2903fef5acbfcbe60e16090e58e2845c5602d38098fee6d467ac9ce7672aeb870c54c054f38b2a9dfdab2f3a8b8943234b662ee110c3d444618958fc1ba8a98945f5e50be812e11963fc419c77bc200500b7a67df8357301dee123f8a0ba62c31b7abe6fbd48b03850011b68e5344b6db529f7e8f14cff2fb419acfd0971a8fc47c5517baac88373ca542deed123388c236bfafd070af9c204811e30aa86f6c04d0dbfa57fc1c085f2ab3cc6e44df23728ae5b11d862ab618c437991d5e4a5486dfc445cbc81c55d84d7779d6dd3dee7e9b63a57cc07602591f89039c68bc854369409ca3ca19b076cbb6dcc9b21d4aae7b752c7358535901a374c6dc9e72824e58f6286622841dddb3942596a4996a280007596003ed4fac16625e0b0fcb3fc007b05c529e562b1e87f823409d14a7eeb9caded3bfe73bab5f8ce9e853dc367cd6d000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8021f8661ce90b222adf8de0e09ac8794837c5c0c03a1a0c2ec8ad3ceaf30f267a119be60ed301cc100153ac58151b52f5d308282095e3f7dba081a6d485c861b02022afea0b7b441f69d99e53e4268be501eec9722e93b4a36b1c1b1ce63e182e96c20cf6aecb5f22bb5b12d1853ef88c78b424cee459e14f4a86514653abcd5dafa0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087059305aff095d3839dc73ce885f3fe86d35ff83901ba46bb6a60e98b883793339469ef78f3c47a6a4c78fb8663517ebd5e6112a7ef7e58ba29a13a3cb33f010d19765d220a7f45f033b1cf08a41dc2b8887eaa66553e5ea7b7ac3f1b8606a14a2777fe032f3f134144ef556cf63427b9dcf5a318d9408a14615cfdbd3e0a5c182678041fd30d8d73747e41dbb9091869a673ad2cfe3825fc63ba58ffc06a1d8e3e6778a6a2417612d8e498a2448758d6a63a3f756001a8bc489e05853aa9e51b68757e29169a56fc61694e988eb5a2f81ab78bbac3134d7090fa6bc2c1ac1e9f7d9b9cd7c1fd809c460bff569dfd24f74ab7b67b013c6e435efd8feece41f00829ff06ec12fcba1bc91c2a8f8d16494b7a32eb9f3ffa789bbb7205ad2a39ddeeb3e92220f5e0a4838d183414ee0626974a157097e0e0110682338079b1568912227fda947226da1dbff11ad11db73b59bad3fe5bca0814885a84b7edf3315ce7000534dd1dcc7d366283b422423b9636d01141d98a87b3495bdec0fb4356b1ffe53a8aca12ffb07bcce7f75c2b88bebb8701c3fc68e8307ae060f2429b743b0929e4defd163b355bf41e9b6e793b282e4d30a0057e761fd45ce64227036e24e8ecfafb7a60996de146d9e16b2b3c20288195fafcdc465e4fe2b589108860c500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091a08f7929a780acfe735caa95b9f8f63aaa1f34166a2968f412b507e413c98c9f27ac541d88f1ed1e7e92a10b9129769093437700409527e56d01743e960b7ed77e88dce03079a8a50b924fb964fe96bf7283b06fc21ab6b3325daef947c76e54efd9f89c0628b3c96a262a681cf657a973ec86e476b199a05fe52419e17f3fc7e70c8a53dfd68f9124dd1cc6332d39a337b746ab8fe44dcf0d372a0c8a8be3259ef9572b7e32a4dfb99da7cc3ebad06c75b5c34ec5c7e1f5977600222d67f01b95895b93929e38a421e4081cc0ab1ee9a4b4fd6892ed36efa3c023f569f2f14b0f1dd74f7e52ffadf104f90a108f6bc728ec1c65f63a104d89664a4825e032e0b66f8fca59d847db40d923c8933d149d130f58dfc77960ae2456c095dbb751650f70a0fc039478d0647f8271cce49bd33d6c563a21dfd434089ae8ba29a28ef9de88094c3cb7a5603da44e71d7fe5386766a5675e9db3935d62bf2bd05b9fa9bd2c17af5fda500e97fe20a16eff60eaa5bf6786d04f9aa5344e2b00c795f92f0f5095fc49ac6fcdc9ba1e0336bd3f959595b692eb44e0f2be0d66d01c02be8e0604e2d60e55bd6962ffe38609e69e6c6a625205d68da4a76ff9b468d6fbe7dd447065582441cc7a2d206c272a8224317ee7ca892a4884d1eb8108ecfd50b160000022800000224000002200fe002e3ced4cd88d1889f2c8ee445b7ba5bfcbe1939f9ac3546737ee0fab36d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000275243ac63d99d36c061094dd5cf2a61888b3b81cee2e4c31d6e565096fe16ee96d7721f731a12ac5a188782162b233ac9c2367d1f56f92b4c920fe78acab2b21f39afa4078a5b0fd355c962b7d37e37f2f524908d665dc224c9a6f34667a62bf72c2facc153659abf0ae08a90b6430641ad89cc6eb7b92518d3a60c5c742c8bc52e28574b63b4f1624091e930a4ba785ae07f65320eea98cafb1b6155431e712ca43d8eba900c054510ceef6eeb333c9a9d365f341c3078a79c230c228ba706570c437dc79e62c74558b05c5d129463f22edcd12e0326a09b2375691931099f5d6ba65b869a67f0bf7a74fc6e0ba95b840cd084b5c3a62f7c875279b2e7f2c5b2c6dc18d9b43877c0791831d68185478a3bc8170b85effcd5f325bf0fb00be49b0841f724ab27b8d704a6a6261da6378a12c8ab333678d134ed718954ee9764d38608bdfc15061c797af15c1b3b1bd3c3650d8384a380e56649e3b52ef58c5013296631f564e36ea2b4fb4ed1b95c624d6d9c524b5ed077d21f68fc31789542d114fea418bd1263faf559d54b17beeb4f01dce28447ce2761b444286c4a8095af781f7c013b658b0c0a3701058873407f05872594915a81dab0764d9ce67713000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40100c3ba09e3e180d726e0831eb9f1d1844f17886c421ae202da419cd62820310c022b4f032ea676a6c4cdf65a2444b6f09c5e2c19e0f075ef24a8206388717906aa270e1d1d124325d2c0975550c9b1b5a628ad86e55d7610207369651429556644000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001348745794d679837890cb177f0c7c73e82788bc9571d7ea02dc85fe81c07234aa311084b250508cbbf1581cc83c8b6b22313152e63af97765472cf4634376cf1ffe3880e4bca5625dcf6e9603b86d8f9e796b4f04af553505c2502a6e2c1e7e4f7c80449029f6169acc1a84cf52aef523f4bd58c4a7789717aa985e353e02000b8217c5e992bda067f5c9392446ce3671d796147f992dc9d8486e96ede0d4e20b538b7a781b411f4618de7d02de352fe86aedf63db3361965e261c068a68219829919c61d74bc48d2aa2928bfcbeb9a67679f3f6b4cebbe08b5c9ec25af2e2bec4c4e71a998d5d413d29cb9641edaf032977193ad5eed4922b49738880fe0263391359c97a9ae6f51b79afcda06813ef1ed67be549a67c0a8b671cdf93e580db865c33c0fa83c97a1fe5d1bb6830c76acb9e5f0835c6b9302fdf6b96ed9ae99998b3ca7da9f9600db4d43b798d9cbbb0d928f94402a3b523097fbc94ffc5f3cda169ec610f3c5ac6be70c7d808341866707c1299a64d2f0ec8dfe1f48617c6fc40c4faf55ba19a0f4f8baf798ca145dd38396bea2b0dc93711e8ea45feedef0d253468709af4f54bd6db69bcdfd0bc2469402839c2d128ba3f135cf3d03cc2b01493857c21e51f42f03597af4ca1e3219a17fdf2dcd85f307a088860bc1a1d50000022800000224000002202c42eb9be765cf3acf19a10690d3107e874985303cbe1fd2983b6a12da477c82000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000eae2ed02cbebebf2512abcbc2d2cc4b5626cbc5d76d17e91b9bdb38c1bd59f7c9b7d8c17b5a37ee5796275689d8339a9b1661106553c7fe18f73022883409f890bc4a08e778496b94f25be6888668c72c50b2162368124b90ffa8578b91bc2df36dc8d0ed7757d7f476c500a59727aea0e284fee425eb62c9a6199d0e7945f29d1ce39b35aa454fcc270fc2feda184c8daaf192177b03b0dbdf27061a1ea5b53be9f11c75b947dc15c7ee452ee345afef6edb18219348085e4674ba88aa9bb4414f2777686b7dab7667a6e21d0832650983eb2d215069753f6b86c4af4c6409d5f23964e33257f0b1a12708a40d2289c11bc38e3858b8ddfae89742cc84b87788a2d50aec30371ad3753c105857395c731fc6c858ff5d1e1f279c618a1c041db4871c009645010984c1eeedd1d764b010cf790663af5078e60fd60e1660ac9f2e61c50112a6e650aedc0df220616bb2e87dd97f996db9d8468667cf14e99ba83b321e23c8ec4e31335411a31d3c454bcc79159aa05daa7fa53f7b76c88f96638af1a7254fcc74fd4b6115cd04236268af999e6b6d7b8a6480f568a217eaa6c01e6dcd4fe8d7474e0d609f05afdde0f7e3ca58864af4c6854c316483827a0685000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd802124f06def5335f52ab7392ec9a98fc992e8e5a4231fad61278a7d1ac4d654aca1c1e35e0886f5af9163235d7da682704767a68349b5bf533e0b41ac3e8af102b022dd29b3381752ef140db307d09ad953c66e4a419794df7440fe46383f562b2a514f80afbd2ca5a821e5681c5950f611e04de127badfac9c7693aaf4c335f4d8b0000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018ec0160b3e670f18f74ec8ba36f88d5f7b5a1b0c3343f63bb67da4c3cb3c21a82383442135bf5ffedf9124238b7f8d8c25b55f53469a9c861b6bded79b95709653a4c35721c2c8c28c72a6d217f49a0a39b1236106f7db3ed9885cc40d3d35852dc036b52f4343697fa9e4ad685a002b7a3c5fcd6d2b4b37adeb5f07af5393bf5b2a7d82f5f3b032a614fce9c11d29ac0e47c503ca1bab1d953fb50bff3a69bb90876c7d5defe7279a6af61950d9d6132b3e68c36d4431f49713587e997386aac8d12e504cbc298105ec304e660b29df22c55fbd6a643fc666cc5bdd5fc226432f498b5b33be08df8aaf8d9398d83e55daf50f434e7bf862772dcfb527d36400ed7c962f76b237ac99b93116f8976ef00576d97e9bc6d50508442c27d4db405335cb281abfec1d5dbe8c14fa6df6782bfbf4dc07561d0070621c409fc48f29b5989b5a6d7021f283ff09f254fad2753965c52bbea21f802ed85cf7084c379cd4ef8bf20e8f568be3c2a39a52502a54ad9e154c19049207bc79c26c1a74d6f6a3633bcddb654ec69435a0ff486495639f24a2cecee880544e9dce34b76f0f690190228e437bb0e0811f1b0f5d9f890c117686a234edbf55447742b5648fed14113394649ff8d61c5ff1e346dd3a11688aa75de293c345f1030f255d686b4557a000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab8fd748623676e7fa40362ccac61ad6a80f3c8e80a8cf47ed553067a133bdd8c02bfb1fe0f247870ca94c87310deef1509651e93e9b7de2a42732bef08c9397318e9ba87ab6cfcd738faf1284d2bb7dff6f1a4b846016e979aa4841ea84760a64ceb426af5fa8ec237183d96005da96d7dd27fc666e8b08c3fbffb0abb113ad3c8c2815973887402cd07b9a055627ab32911cc8558e231c3f64ac8cc735b4655146adead18569fe5b1fd9c71bb085fb93de994a8dd9ea4840e65a2a65ff717305ec78eb78570ce6d3f4699ab79617f86fd17253efc75edfdc185ab8a235db979af778908ea7ae425e8d1ae97a66a77ee518b4342201ee8c51088ecc3de0d8b3c07949caf749efbf89dc09e6c35374f307da7b41d2113c3e802156477eea0ef895275c6881658927a5fa3fc7e205b2cf7f30ed2a681c4c828b888fd33b6f413dda58d25cfad0269e5ccfb3898b4b011f6075658d43674f3ff92e5a4eed3ee61b840e086d59c86e30e94fdf90e726bda2936b71b93149fe3782f32bc45793322a8807be4553421e2527b5317d93d7a013866fe7258f2bcabd79923555b1f67889b4364e4000f862ffc9b9874307a37b44c185e1a53128e08f36fb93a6e1c5630b402cd97597e488eb9708dba1503e3324ddf99a2e7b1266c71b8395ef6ee8cb86000002280000022400000220266f078692277cfc737366270b0820be9cbad8ab11622e5fd457a3fda96a47710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088a649c356ac96628fcbef44804d9e448f928af7d19a7b1f685c830502ef58ffd76bb1634f581ee57703e302cbbd678bf5edf5a30f267802f807160bc93c6159df2a7fcc37fb6b8f0685a1f6a282516dd505730cd9aad3b527dfabc539f1f802ae30517bd4d8551fe57c210bc8d40e881f4a22383d9e77e05359f8692f99449821a649c40506361b3ad4405f0c10e6c322d464ea90171c61574ea0b7a3aaf7567b8940e757dc0d76e891175685f1c23ed883ccb663b98920a642ca64c561725ddbf077d36b5b8a07d976032ba025dbdb8c5d29adba2a8041963c46f5b55a80786e118faba31722b82434c9933cd62a0dcc3ffee3d979d7c2c7836da80dacb152b6a66e4fcac955752f494aad60a6bcd1fbb26f1d95e26e07a97e5bb33d2b7d2be3323c0daa4ea4ce4750d8feb34c5851f5db828528fc1d3de80246c2231edaf68c87f04cdb84589a64806e9f5101a8d66ed2b6d390778dab890c1682b2151e0e8008aef34957259643b64344a0d681f11ee3b4675d40f0949414c2c719345e2ab602eb2c8344044a359704e7bbb37bddff7d2f86eca7fd150143b249848da3e7551e0d2a3c39e65fd5ace236ff24ed702690a3b78d0a69db6309089d67cbad9e000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401045f11232ebb975c5dcbaec1c760c2df4d23bb8efc5f2ccedefc983f0c62fd32022f083e89a8efe02974c61a8d102a5c16850322aac1c4ed59a8ed3c352008ae5301873a2b95459d37b936460cb301da3629ed88fd5844d5ad3953209cea48552c0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029609567aaa93a46975edab4612a444d421835794cc6c2c050d7f2b7198405e0016bf699a86bf695cb00edf34b6cb8c3ddc00708579ab764f011dd8355ffe76731d500dceb2d6739c00596114df3f5829a0c12e47b60d2993e64ccc82535030f00eacb1ce3daf921dc36d6de4331379bb45cb455cfbb3f0f2b7389541a2ac2f9aed5fcb6507399fa9c8f672713520064410c7ad9711ca201e2a2257eb5dc2f2b0cb2d40db34b8aeb03df87c2b4f4ee47db096660b9432ed407b1f1461d743d28e5c8db799f00ab32c283b70eadc1135f9c7584b3fe860fbf84e8a8e041873241a97cfc496138bb3fcc41692f4d6f0d4a84c6835fd9a06986a135295123bbc9f33fde94b3615889ff1c5ad812ae6d765c1e6dda46f9bcdf505fe56c121fb66b734ed019c0888adf19b8f7d96920b980389e03027e6f8022bd5e06bb5efbd1f02aec3565b2e48b4796db3d9719c8f7cbcc8a6dc8d4ba2e7ac0814846e447746c37108a704f5a151b06f43eefe7e5b7c876002b5e82d029f540543b9da9ee2594ddc166dac9f9d0721ca7c448b88536d9e7178c3391d20e0a77a08ce5e20a0f18622cd3d081e725d1ec7e3d35022488c8d67a873e92add0c220647900faa1691ef0be95fab99b1e41d25467a330c171a2d80ebf7b1aa39fd0d55063147772bc878100000228000002240000022020ed1878b4af5e1a8932e7679454953e9035eb29bc65ca59ba7259dfa5e5796200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000115460bb64ad9e9b9c2f48917f45880e074e14462a7541c34a47356fd14836f8b45060882835d522e3046cad0ce7b77a338a0dad91d95b2fa88999cad514bd4c1c09cd6e2fdb898cc065dda1ab83257e6aed57d779378eb8012000cecaa15d0d4e8f4a696fc06afc8a5f7c491a2b72cfd1a5bb41ca9309c38f6094a76b864dcbf57d027eab9a7f6121284cdf505281e4b3cfca666116f528792f1f3eceeff62c2a5b31e60b148107e651f7797305224379025046375547511933f8498ac518edcdd570fc7753dc8402292bb29c953c0faf9a8bd7c357e9795173414a6e040b344c331cc027aac52f1ec1aebcd942dacf8c081a60b0f1cd15a9152389c5ba77d6fd7be52038e1d21f08da288692a77d56edd27cb9d4650a5f4c0aa41aa93e43a81368562da7b14839178b888a23e96b05ffcf8cc07d6512ec7d2963bd2239e27a1097a0066f4b537b71227214e3bc3b0b2a6ee9210bd2ac514ebaf042a9b7a4cc8e009eed528ff04e9b44e006e5158bb6ab6d6a0f84b0a43c4630a1cfc8998c319f845841b62dc54176bac948255461bb09dd8c3dd6daad8b5903812e69df372b3cc77f5d671352c202fb0d11081caadd9acf6e2f9150563cd937d5dc6507a4d2000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010ed1e7fe5b4a1d64743f5c4e5dcab848280f3b31d0f5fbb529bbf2063f7d56d8022fe2c0d24f04f049f683e7268a10e75d926ed8a001ae0c032d402c5741273d7a035f6e02f86493531c0a3d18d0640f25baf7df8ab08d336bf9130e6de118070e0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019cce63decbcaec0977a702119c95ee325f8057e15446f1401be314630d9d2fdbce4e17f8a33c2957a2651cf1967fcd9e32a5732a5e72b2e46c4b92de70a2e3b61666fa7dd0ba44725ceb0a561b3ce0653f40a107ff8c37a5065845b4a5347cffffdbc3913346b565b3f98f06ed0f32f5da844f7c8e3f54b69cf486d3fe0648081872636c073ae8063a77a50625649dba0052a019d6b1a9933b3bf40c0432c3c3178bd5cde68cc78865a9115ec2b5815742b042d4a85121ca28e0bb08ec062f0e46dae8cf483d2e0f95188781ca8a36886a2c8a9d94e362a58ef0c7aee1c75d244929f1bc032d30108c5bae617f9249d98db01ff45f893802151353a6b393cf5937bfc78d2bd4506e546361f55af7a699e15f8a01b2cb080dba67ec2d30d3d2bdc7e1f60986aceb708a4ceb652c21a31a64a1c46c133760978dd73c19fefa053df3005f6a135ecc0a4e7dd83ecad3f29a78134f1e76366263ca5a70c1e54c9ed7bd13e45e4736166a7b6249b0f79ff3e8a7a789404b09a78d48b0b200f27ccb959f796f280f6eee3753a4c3dbd195fa9bf603cddc11650cb54e65af8c9174ff56df743278d91f6d230b901aa5dce01b3c608d8df73e6ff0193f8c31594f0780270bb5890927d9b353770768886446a064256b642ea663068f840d2c31d2ec7f6000002280000022400000220039cc01061a11e7b10271e1d7da2f58eb0710905bc0ff6d79c1ac6ee2120c672000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f2cbd6a061ddd4a3e05cf225f76fc33b255bcdc27e1ee1c64c9d80d0f9bac759b9e24e0cc5b8b6695e5d98f605addc888ac4443103b83e537cd579445e8f576b3ad896972ad674682fe4315ce3ef4de890faad76544cc333ea1c59ecbd2ac45e195a3ba4bbe29942c7140e854df3c730cd812e6b762f699ae80269714ca8c2903cc47c1080ad9ba6f17fc620f63f5fb5760939630d70e2b5f8224f24a3ab88642682577dde142233ed07cf19062d0bce0eda1f84ebf384467522a2ce855b08917984e5e1d61f4ea95e155bf752a5b1d62d334fea138c6ff6d8fdacdc3c73a31381c077607214d711c73b5f89b81ed1dbfb9ffb4c76503e4df8754704ec6e69b74b7687a57e35eb1c95b5fc36b2c0326a819407ce5e8c0a844c9f373579e588d766c48a61191459ed59667bcd5c66f8bac86e8a24ab3a84b8cafdd725227de4fb20175b1402337e37df4ffd4422660d51b85ea618eda1122c518b32a6f176fab0b0ef8183ae40bd857d4749b053bd0452b4a759f40a8477ad458dea9427cb2247a06e257d0c3b42d4c2b2e02cd16cf574907c5ee70991d2570fc34a2fda5e2a605e4fe70fffbb42c3db9d8228bb6c7de06d99fc09e841e38ed09c0d36a12a85e0000000400000000", + "28925e070e5635b262013545b1f2e10460df793e684bc654cface43be07f695f0000001200000000000000000000000000000000000000000000000000000000000000240052c683974423a15dced8eb23a343fc09527d26a57ee7f607a3cdef2f1dd2c300089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c009070567b4e43c603cebbfbb2e26dd9fab0403d22491dbb5dc713081742050c14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3000001200d3292d44f821a76e8fe82d065d8e19cba030685031a2da29697b480feb50902000077801bbc47af939261afe9890f2c85db2381d33a6cc56eb7b351db556b7ffce1454600007800190b2bd9a61e15de13fdc0dd5db50292162dd32e7193b1d73f6a966182f7db89000078000000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000070dbdb38000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001ad3587e8065d7d1d48ff193b6a77df09a2584073a42f8a35128dc7b6ad2acaee8e76c82c000000130000002400000000000000000000000000000000000000000000000000000000000bec4cd80201b1c395b840389bfdaea9e02f65a2b3e7387793db5df0002deece692e7ff4641b9fddaabf42360348c2bec8e99a35d2d81de05e2aad28d01a0060daec33d1680201626f93d834b89273003082907ae879f0ae3ae4b79766e977ce2e6d911081b60876adb98a2be102d31401e3e1ae6769d353d1324f34ed51e8e99a8bdd0ee7b70000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008007394cbad37361b4c0c59df9ae7b65e79125a559e2c809d8c4ba6dc8b4ae2c18158364201a053ea4e9f64cfead8b05c4203ddef56fd0746b1c1007e55b547d9ef458412ef000149b6ae7906ec130e1438b757224d4b4f82f72f3d502619f230d29d7b3e3561c2315fbe75d5e6900fda34dbff96edd03a2c751ca757432c7b4f4a6cc17c4c36459a025df11f8db5aadfe1e9b5d5fc30ae9d2757e09c862a17f8005a9c23e2819aae9a6204f69b0bd1bfe861be49955ac85314f6ab4a01ba53fcd3b6418a98523ccea8d62aafee24043a2996860b29a5993af33edf2d9c99b450ec432be36fd5d166f13cd441fe50cdd85dce1153a32f07733838cc8240963162138795823b3fd55c431190d820fc88725c2e1bfdf174517e80e0979ebede3882d441f3e6996a6e28b103d897945fff1586fab4230a813921999091f033343c6f0f44cfe259850cab7223c1fa1fe53645ffc66526436bd37f89f3adb98366db69a1c9633363111d7e8753b26858c0676d2f96b130f8baf5b17a4f9fca5c8261ed1a5f56fb0026edab06224ac292b0d1d7eef4c6a084edb4da849bebecebfa1f6a44d61de0522b81607136d29e1979ac13a8f67bcd6b75a5fbd945572b636c6d0e255e19890dfb61d02f3f7c1141076d38f1f9ca6a9ebf18b165c579a91c923f600000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ad3468a984bfeb49cbc06e16430b1ffe31e7faeb3c2be71e7c3c63f2b8afaab6272d194d4465b652c88aaa78fc90e4298429e2884c2c3470190041ba11a037a9f128096d3d26e5ca5599107c6a3bace0e12640b1b5603b6343f4a5e9b6d795f5fc9a9181774fa40cdfa39cbf4ec63643c8126f342f54deaddfd86689a86f4a172efdd6e0670f4727281b28219fcfbd4d25e84ba88a3f22543963f01aa5133480e15af029d12cb5b43f93ed0f135ca3550a31670cd7e5e6f7c6034f4c0b2bf8a8423ee2597289eb47586e03ce4b8451ca8279d590091cbc36bec4a3b607b9823584d0110490fad2d2ebcdb54e684a30c7fd3534bb4b6bc4f7db3c9fd77470288f7bca93186ec15fd012fc037b4a97f11c52d99ef30465fa1f28b38855674f0a82a15237be7debd076adf2612ee36fc5d0689264bad57dcdd57b35341449a334801957641050be9ab0119aab01fbe73e3ca9e1cc2ca774f2fce38c68033d2ec6750752b3f3a6ff5bc633684c0cae77ca92d5d5f324552b8945bac305de494d24b401e4583fed2416c1b9708066dba0ab31bea31e5d1632680046c3ad317de55deb6514b20bb8131e51c948dceb0f6c143ec8c9418b56742ccd7672d2888a336eb0709671bd4002b0fac199b81e988b0baca216a087a8a47c5fb4bb269c1f0d8600000228000002240000022014b2f88d256d46ad7d02273c4cc7533e2510fed2799c162961df68124698924e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e7e26e34cc013b13008bf7b5468ed3893067a8993fb2232694f3160fe44a5710c8b14973b20c26f98db6399e663ff7c07ec4750af93150c322f12fd835bebf731f7d3e1dec28711e798c062ec49dc6f9a68099720ad2fcb24a554ddcad6b3bbf34d44d0c2a65844cb696ab6bbb86607eaa33348087207f1eccc5160fa4256568fb20ddf901e54d61d43ed6c092da1f1efc8fb391ece7a5f31c77ca19fe389fd72a809f616456fda19c8d06136a5bbc081745635a4290e8d1edd6313121905cbc99edb96ff928e06343ad8e4cd97b327c971b45931c4ce533247b574b1b2c519f30f82fbe8b8b077fb96089533452e4807ae48610c0629c022c2850e605db4a5833a82b879d69b0df15f39933aceabb8fbf6169fa35515317ebf27be9344a5523d6dcb9e80d7eb2a37a8df515afc00d28de2426a9e094431ad030d195f1abe2bc47fd05bed15993288efe502c2a1a9f561c208ea07d3cfff66f67a1a88ef330847c2272b8a6c03aaf82051eb849819f6d68159a0c8982928825fc6ce9a8370b31d2cde009556b4d1114224f7c0fed082d1c51b3bbd1a82b2823b858322f627fef97bbfb747d436bec889d166d01ae469ef6fec066cb45d2336c56bfed6160b22000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011bef78f9ceeb2b040ef8228eb49224141e06c23ab5ad7e38604e717cdee0cc8502027a11ed3b5a5cf13de5d4b739b0bfbc29765934e19669f2b51f3d9962a41e520905193adb609a094ba6689546d4262a83f7952d01bf6ddb841e17c33da7d955000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b52ed5bca7e6dc7b81988b074f02d2ebb178b13b382bf41901d4fd1e2b42202441c5b32331a59d80ae12f60d48999925e538ed581c36d6e2f85188f19c51bee9f43561cde2b779a3df05d7a948833e0ef6043fb19cf0a17451fbe9fda68a8cc759d0f56a8f083b52d3770c5c5d7203cfbaaf30dbdefac4c579b13b76ae2efc1504167e5cc202563879843c8709e2db96de9772bc4d2cb0e8a47640ccbc09aa468e5ad03e5d90a08167b86e8fd74e6f1690ff06503113ee36549086dd5b0ae777ff2b359811e709807d9f06b1cc44dfca88611fd74d45692e3f2e38a5b4c29044fc22a12535a115594934fc72cb51bf4ba29b047643d16de3292ccb064f75b36e09aa899ec5fd10779abe8b0573f84e83b88b4568ef1e6560ba8826bf92cca464e4d29c7032b2a5d763136d60e5dbebd3799806edd012dd7bd36344d5dd06f71d4f690d66600787d64297245455796c7c5e80c7966455539387b6b51b70eca4c855400da7c6dcea800e110740ce55cdafd89b4ca46305c9170c97d5ca197dc8c91ef2b86521d3ae0cf9b791ee0fa4854870df860986cd4b93eaabccf19e9dc50955453f2ec6b4af27cd10e3b58ec16c17760b90eeeabd6e2f0fca27497d93e4a21d7bf0779396c6946352ab3d09d49b66e4495e01d5df1ef8079a7f3457548f30000022800000224000002202ef0069072892ee811d6e712d57e28c208d82c72b6e268b237446118d6d3ba1800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000827c598b742047c0372aa6c0966d602bf2bd285e0d6e287196068918ea83b2bd5f28d770e76adcb0201545d26cb4feba63fab827d1abe83c6405b802361e9c0014b01c24db52581ced0a49df32982eaac1d42fd5640c0495886ec0baeac6a604805cd4ed7b7ca023832075dd87e50a739635dc90b156a43da6f15c0938f67e6468c133a063e8e508e6199f16a5dc81d27b2ced7662758b1948ed34ce5d87340d1945fc6c667404878a993d383a1fe862fec10f38abf485c2c65483a86de5bc8a25d6a7ac2ed960f13cc1a7d385f98899b603e0e82c2acc8f1f2200583714424cc91dd7b53a949d7fbd2afbb00f8ac749a7d7ea71c74d5dbce8f08d447b546988d6cbb3eee6aaa5b76566d268e8a23029f0a0aa49244d9cfb23e5b3439984799e9ebb3e9d35494401192b7276eeb9d97c6d71feb126ad1d108328227365eb7c56d876d3b21315808cc4e084aa858315fd18546fa61d7f4df6c5637c87f0ad64c31a387cef20c319a72fe7f274a785f26d22e0c06dc9cc9a3f26da3e005fa58febd72f4259c5ef93d41a394750584c1fbe5590ff2ef4024940a13e3c1ce01643adf4312d22fb2bb729e65fbb3c18bebe2cc5fa947f199b51677a8687d8ef34aff7000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012b567db39cbf9bb58a76b2b3c2d4c0f1111e86e3ef4dc98a1edbaee53c6d5daa0203aee86a76ea64bb3428f1c974c64176fa62f7826306c8e4f3f96ef98940ce0a1ad6b52a28001610f3966787e595c03f9b5a0ee314cbd2f1e9b03fd5c5138df5000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ef91c520cc66938869ec4f2a2fd4b220fdd7ad9323174881809a653fc347774b6a37e64d318fc06fdd660105fd21a0f490138f7ec648a7e18dfb5abae2be56eb7c6a837849cd51b77da123f4677da80167731a3cf2d7fc4ad1355f3584ec6aa7f0f5538b056656033b11f9467e78a6a948bb70ace6ea363e24a2054a60d54fefb6b76f8809c41196006fdd9996bcaa81ef052f0f5ebd3ae09f030fdd8c66c277f0af3e13403b1f039844f78ebf148eff50414635c571aac64482755bb358c3dac54ed76ab5dbf3ac637f00470b3a87920430e31701afb909795711cb88901b408c15e3b0c4c123dfa28741b50fc942b26e9705373782580eb387cac3bdd49393fe4db7079a7bab8d4a70d110765dc9a068d70f3d2c165b728b82dde9a11536514b1a280d314c773805b1e22c8a5649a41b6c80db3dcc4ff2ed37798bf871d4f0e0c5cf6bd3e06b17d2950a80d467bafc07a68349426072104c5a675fee5cd16d7d582ddfc47a7cab3bcf27071ec9ff50678b2f74a105a2f08e116a11750e59d89eef28869b44da1dea57705fd18b53413de107f9689807f248da7c47037aac382a274299fa3641a26dca71244d5506aae0de24e8b18d28af0085443aeebf4330586e5f359007ca6bc04598c72c029fed8d61c3130bbd640c18366509d8a79430000022800000224000002202f1316925ff38754f915c6b42a3adbd1a6eff0cc2070f55c09cc9c838b291ce300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000835fb2307b12c896296bd2b2408dabaf31e24c42e202385cfe35b33ddb3be433591cc8e6a0929a2ccf2508678b3d05deae4bd428f62bf9b79d2b39296e4429f9abd45dc7aebedbfc19699f7cc54d9fee479d68630231f8b1b0bc36a898b2e0e98a376c56aab715195fb2d218abaad7acdbaf7bfe2089955403b3d3a61677dcdb60a722e852dc1084ae4cacf46bdf20d4afb35a8fdcc704e048a1dde7f830995af9d991ab6d46c4eb2848b29c100f751720ef01eacdd04508b22a2022d78df11a6c225271cb96cb21403d4e283f4066c909df36975f24f855d2fdc2bbad35bc689051bbc37d9839bf945d39fae292aa913a4ecefd70dfdfef98556ef9a8adc9336e1a7038add2bb02adba1068c58f1bfe0ef520f8f6c62e15aabb5fbd62dfb2a124bb9c55a1667be9fddf94dff5d7405b9c6a19e55c587a1f9462d152e2913e88a178cc56213c75cb9fc9c93efdc58cfba02d2cbd84e8401f2fceb719e08077021a32da647d82186314fe257c4e961e0146f0f8204e73dcd8c47deea05c5af2833b6a048c94de08eb553b5241c5c37a282db31a9561fa1df2710e4616838b4f09013fb7a99f6cb43ede90c062b18f9c98e32aa8caf1c584ca6a5e5643e1f51ca9000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022e618f8f4d4110f9294be8f8e20d5ca5de90125e9f651f1a9df2b29b8d26d83d1651e183fd379ede5ed872226f99847082461722b150df45ee794865fc56370a0203de2b6e9f8f469580c790f8484f64c90b88a9e669a552d4a243384e9bf6093b0c0fe60d1bab26edd54a9410d641cedfa797d09754c9c278e11a04e25abc7db60000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2d20d845fd02a5aae2e06295e8a9c5525de3923ba42872a43a2097add71cde1273724d6d809a74cdd7070cea74e89901fa7ec27ab4dbf7630811bae9e20cc2ed65e7089b1392b56d394c29ced2de276bf01dc5c8a9ccbe3b1e1fd9b452800eed5a43a9427c7264f9643f20dadc6d3d847f72a0666d4690e9e8e0db97542aa8e141b8dbaf51fa52f78ecf68f98606997f29eb8a5385eae20f7421811638e3c86997554ce25447487ad3684f14bc529c264da50811bc6bfa412d85f9612773eecde3453bf57d42a848e3d3feeedbf703364d4ec5f19aff1424d2a9b3a156e202dffbfbbd3add50bd668abfb578a0f1d8a0b9787c6af043629ccfa4d541fc516bbbdf8c49e592ff6a8d0fd6f4507982f90653fbcd3e17bb75463adcf2c11b2eab13b35c3c18c0cb88e425a659e243bfb9eee4f03652de88f8cccf1691ba13c0d13cb4e6c7b716cc90a61452eccc5128d4dd902c4425a303fc09c49d67da65c700462d6b0245856c2b23dcef94ab327cd86c1188de617c697e156247623d2b7916548ce86bdf1bb3dcac83f885e8ce65460ce9617d0714142a18d7ab58df97468b653ede4d028e6de95227926c3415a3fd78f3c397c3cbd7f2ab8580a6e88f77a9b1d347cf03b1cfb66b3645cda1935018eb41ba05cd0f1c8c5255969432de760700000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081f2956e364bc0e11dadebfbe4e32396f2bdafb95df8c30f6d3d95cfd7a9a8b4fbbca1ac09d7a0cf589a9cfbe8bb3d972663185c681c291664fd87aa6dfc43f59fb796973beef876c52e1203754f60517e829781a19b1e9679465ee80a16b9d1c9b9bebf331cf7bc29fbde4a82cef838b2f67780792a5cd97167e60e23f9aa4ff550d0f07f1d9af8b61da131dd6b697a736e58240545d25add862541c30aa7cf27d115f1c93b972f42f31ef56ad2c09f01edd88072a52761adc479de145cea6d69f87e863d5deb511e404bb620f16ebd219cfc1c117fe124b157b65964c9d82d5a24927d8724a23089f6dd43966b68a2e9e87ceb3109ab8286c50b79d17fc4863828623c1429cdfefe77446b15bd4be236bbb5f9bc080a7288eaf38983b4269aada9eb1b108855d21e8f9faf2cbfd3579238462b19e0034333ced3a2fc78aa90aeef7c46a6b3e584dc72758d2b61947377e1afceb86016fae0a8b011704529b39d5f405c46ab01427191a48e15762af6e6e0969d2512f97b364b962067773888948100c035f7951a56cf2de8ec43fb807986d76dce3f79d31699dc558c78852c7bad8a04e19f54f0f5cdc90c8c1b2eacb117d81df30b37fc416f75a848c68fd3b460e663dcdd27fd9591f51e555be42d97b5cfa3456f80b8435ec664724aa4c400000228000002240000022030296444bbbc31cc792f360488fa4aae3e364c34ef6c59a95c4616d89d7011bf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097f1093f8a8be877e2d8b5ca6bab914f2a87d2861081f4cb599e6544947151aa4181faf182a8ca277d61aa88b3733ecab7e5c1afd712957a99d2ce198e14067f02bc706676b82ad4688668962087232fc0f667989eac45caa56232389c0d4ce4528d5033d43c563e2835af035aba55150e4bbf2c577db63ac57d3f95edf03ec42842b69d049d4d28b11476dd8311b1834123ed8b63f4b149f312f4b6801ef06757f387edeb44dd5b04a541e5229f90210dd31d2e1ec85fea05501da1b5cea6ee9afb7a4fcdf0f717d5112ff8e12ebf2a6aadc1caac7a414e21a1976ddf78ec22d6d2e17680dea0a2fafab0514d239a9b88f31322cbf2e723ea8008a1eea5574e54636406e985c89f51aea836b5cb7d92c96673063daad7167d08b388d01d5c84ce4e00ea19be80e6f00db3f8df2640c61358a1d9293f37245461c980eb3671b189980f89ecf3646f1d05efd967593165971136bbe0551093b92e61045a1b06f5b4bcf7ace1d44f896b52c091f1f917a7e3e8fdb7c9604724ab3853478e4ee2f8f423db25078d11e6bdc56ee7d729f9ef2394aaa72d2784491cdcc5897ea2b54f115e2beb08c3c0c6e7b244a803822d73133a276e5aae58c06441ab44454e549e000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010c2b54daf5760e52a2140c3a6a2f63226bbb6996253f95f2c9278971dbc1f27502057afc55b78d55370b9449c5f220a9981cfc549c6ac984ecaa29d6ee054d5785305efcb22e09691a63107a4e9df7b34eb411cb44ca660b64a510b9d2ead10bb6000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ee2f7879a6663d3641f4ff227714271568baa757ef94dc5e09f9164e94692ca8892edfd7768ad229f9812f8170b7c6d3b7270be822d0d798be2db180da6fa3f75df361d938fc381b10465273d0044d8eca97d5f96be34d48fb5ff84429bca25785b17789bac9f4bfd3796e0909e6ecac0a99b438a423964b3afabb92cff490c71af94dfab23d59d7da0cc8842084d902fc8fddc47c598285283ec1c6f7e614eda4bb98500b7d188c8f62053db8ded5327b64dd5a6a2b8438f88b062c1781d936603ef323c38aa678f870ec92e72e2cb490525108ad4b838b532601a49c727a6c337214c4e5498f6da7adb5d713aa641eaed4615eb97962e27082f088687d723d903c3faeda73a04483439d84486b563440ba68a611452a7b9d7a68bd75c24005a12dff5b17742f31b66cf20f897f875ddcb751d3df30d060070bde3b10b7dfd9706a2b1a40a29f54455ddc584e2ab947e2cde83a245ef573b4bc7015b1ec99d515ee9aa34a15acb665495a84e353fa3c093a05e1179702c21f9e82d3317502abd8810eeb21ce91ef6c2bdcefdfa2a0916bfdacb802eef5d30a46c9a32ced7781ac1c1f1f534ff9e6294af7f153fc556be776453dc5129e65a32c415bf5fb5110d7573c021939943fee66a64d79d267d646ba19caa24c4887d3068cc01016bf40000022800000224000002202b0e732631b0c4641dfe6909f9031ce74bf512b965953c62c82bd9ba597a01e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000975fac4f01182ffd14b703923ce2aab93fc909b92e1ce4ff561d18770f9737eb0e42ab99c82483d12151d278cf713165d89b5d6bd962d27bd8281ec68a8bdbc54a23ed8d7396a21c2f0accdb503382dd59b11b3d08c6fa037dc5cb34ddc92c3f885248a553b023f07475683a0911b04b589bd3fb67da91e50a4409df731a30ed10dea760460d617490b9f63be2bacf710632e5a52ec46439296ed2a5447a2e03826b6e8057b55fd924617d025f116d2dfbac0fd56c9ffcce949676481cd4df77261b9879c45a3e91b666c381e6247321b87bdfa842d7786ffcbbeecd0da34d45031884862488c291d19914f98f950c0f72707be98844f2f27c4709c6cbd9da60a0bab982e3fff800457f0b08c09bbe0c7f4900a855a03654a18c2d683de65bc1e160953299a1b5f30ad5505d51988608f3c24682f050ea1b23c8fa090a4eab03c580588421e254d547506dca1b0ac0ff204edab95998655c9a08fc9758b849c889877d96004491e264b074d24f14fd00e7104c8f7112a68a75aebc8d4b7347eeaf107a7ef33e1def5c6dac29029146ca5a8935a5a78d895f830c2af9c93fec6cbf57abd950daf8f4506a65900916e54824fd7365de35378693982b553736a392000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40117dfc4c527dbb4d0b3239ddd53b1509b8c66b1b344cbd07a89d74e41e4c290650206b00b0faa404a30f37c2641bf7049cc7bf89a2ff36bd933df40ae6ffc90ec371aed10feceba066c4b3d363dea2409b6acd745d647255b04a2861f9d1f1e0e480000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022c2c84295c4efe6d63d31238459064b62423f6fd60e8a13a3abde4872fd67e3a2af4c834a8d73018c076675ee3b6e048469e4a315b805f3ee5076636450a69199f9700182a123bceeca7f0d4bc57f09b9096e00db0c1a8e7e948aca95968217374b8782da31edb4df37eb290978d7d33e742bcb525ca29999a3723f8b60bf28c70c24c3afcb7a526f5aad15619fe0bb061c5b7b3aa000d106d65fb19a1851a1e4714ff66370f3b60b443c24f1e397f43049f4a77c55b5c0d4361c4da20f791193afd8176e0324e3fee6ea54cea4e1664feec7bf2d2de5a9faa85cec48d32cdaf7716e8771b1ff64696bb05ff5c26b79ca6ccd398219ac54cabf1806140c2e00d7d37be398bb53b56ca61cadb5fbfb7baaba4cdf51b01ce70440b7605123f42eb94698b749d22afdea35112843469e38ec04596e97def86b5c924d9b960229f2436f05840cf79877a31a6fb46e85a10a2dbc71025a77274b6f4c56a8bca790e81a9f0cf6a79575e85020dc574e6360c296676f3542cf736fdb66933601d53e987bc726a9461d5de79d2907abc644afebeb69cc0dad5259699c600065b4a0a31366cd56a054f98e4e5d1b8fa36b0a1a68ceb17075fc0ec30e5770aa988567e8d40a9ed3b0b7cf8528caba52f7e6775f52fca38b95939c91a29931c5c11f5f7cac0000022800000224000002200d4f7357d34ccc919bb38b51cd3dbc0253b61db595675a463ae16eadedb9c20100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000abc6ee8a45f88b06409e666002ba1786f6c82e70bd5583ea524d9f91a953c851e73d367f12077a3a534d256f35be53f891e7a5f1c70b33e482fd05f93c6c6dd5dd0f15ce07e15fa7fdd5cddde35942d633a371b689e1688d5d7bfea5a6de610a36b436a3b489d144d11b440abf3df6ebd0983d21dfa2a1ccfac3c8f8660f16c8c1c1a60c88689bf654204e149a521ede884c8ce4e4e92ce78b7b32d6be377dd1552a64f729b49e4bfc13174e6416e0a463d3fcd344e29c01190fc06480596bb4dc5a301fe606127cf9581e4d599308a5331c980854eb0c5734eb1bdf271df58d3e1892bf3efc2682178b39098c9a6f2f9d9cc6c1cefd0a00af1c525c43c33c30c9a820a6d8d3d6eea361c30f2ae21b9cadbde66af9742700b87aa63584f4b0c5a78f6e99c518c957c09d0a25124b4f3d03a269d51594d94d47ee10298469586923d1f9822df64a36bacb44b0b670efe8ec1fae4a2660576bcbb2e4d77bf927217efa31962f6d859dea1b318901ff4e282e27c312c471f938b055bddeb1e11a71e2dee43c82c2c7cce85d6f245a43c255f549ac5a476a32040e90e050c734f187bd3166d269638d9afa143d028de8a7b983adea7788226fb54329e887a12d7034000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80217553342c677b650aa0d3ade6f5bf48b9cb3583fb3d6943b44aa312445d8c65501d8214aada9353aa280e9e8ce56124b565a8127d542a3b7f4d2b92749377613020be50a30401e37f703055b4c0cee778fe46fa8101ebcb8b3a2cdaf22f9014bf022cf809005c515be559905496113f560ae259c3c9d1ee8a095b412f93da32c100000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081d52741759bfa73f1ec8589df227e1ea9e02ccd26a676088063f2ba7675b35d9b9a2dd175b4639c0656ece1441627ff603f70cc71ff178df80a1be64f5a1e03d66da690cceb50d87b4f117a86d9801250f58368da2b1282bea43d713525e8fd0a90a56bf008944107764b64fb130840ed09b6bd43464b39ff94ab301f82eef97d1003634e9c017f448cec0dc86ad59e2587c0b1f7e0f8ce4e64c027540b998ca632a55db8f82118b90bf203379490895b74011debc1931bc811de9f609a86db2e0931dd81e32572af1ec6486003f81ba286849db2f9a9b4258ae1ae461295aae1d518e9aa30b85ef1e5d4a1e85b56e11be483396efe30156f5569ecd8958881b1179f02eaf144ff61244b2c8b1e36ba97f31a383dee395448617a833b297c0bff7d8a51a009e03c78db8c15ba8c36f99173b4d0dec11fc56b34cde6c9546a3ee86bf7bf0e19cebd84a0e0f3a331bf195af97da8e6b82862e5faeecc1df36e7944d0f3dae5e6ec572b2c34d002f7e992023947eea9badbf2608f6bee03eb536be11fdaac13dd1b3208a0dbc8f61b3992408c472773fcd8f3cbeec2541b7465c7fa8f17dd8a8a46d31274d047f647314e125b5c4b73441ba7c5cb0ff903a31de0b4a8f514e9def6724d262c05fbbbe4cb748f7477d7676c34937ab0a49d7e96d600000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025a091084125191881a0d0941f34a6ce44a97d82785dbd0240865546d91c0840e901c9bd1b2ece536bb5565d4dad1108c8ae75443be1448bbcaf3e3d3ab3aee111f98cac860c75060bc1961c1fd2c06972e157e80a7cde99a82faf4933a5ebd16be679e577a815f78bcf1158feb8e4ebaaca980696fa0f093615d83bb2176ca4f16650982947dcf23422665e63c4798b5370b51042a63b0311de44cb0da5379dd25150c0a3b456b0f03fa23e5f6d5953f7d8b8ca4b5e27ee0fa97e8b9a01ddadd6740470c478cbe475fb5ba95d416311fba58aa2e17776c0757124f3120c41e2b9d916efff2cb63a63e7eef9238e9e95501e1b010480eaad2b12a9091e9587e139e4c0cab1f1d32f812f1822ffa8621902edc95f57def43d49629d61cab39f618f3f84d7eb75992b108a7f6ca1a3b82b3a6d84a0f281e6ea90013fc69e380570d3223f6ff69a1818dcf235fe3925075a99e92fcaa02228e74f234914a28ed92993e25b3d19259c8aa87198f192784f64e73e3651b651ec5e4e4ce4f128a03494ae5c22680041fe52cd2f42a0fa8c382c2942a2a201a9ac74885d6fdc68b39c76d08b3ed8da00e41a3aa9bd22599afae41e16f38d02341007060302cefd64071ed99a70e79f8360312b642d6d57e07d967ca086d7c011c9e56d6b2e2e5e011a0c000002280000022400000220144b3e8d12334301449932914892a8759926d2290f043e643de05316d39f7db000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000243585bf0c51c1b0ca0ec14427e5df32947d0d83302997564669d0a8d83aed7b2b14ba615af5a34230a8c34847f8ec7c44fb69906a0fcef37b0c84559ab54059dfbd4afd3f150717f67384691d8996bbd8c99da4f5970094c8fe1007a70b96928e401ba88171cd33647d2631d9f1a62a30fe7c80fe5d40af800ce30ad79febe7bbb67ffa6eb03c42f32d4adb4e9700a4883e878399c2b3ea7467487cd0bcef27316d4734ecb95077170344a7ced5ae68c1f9de0a3b742dbacf5878a05891b150de060ae7f1ec1adf9b09f5f6f57e5c9577cb1b149ead6a85e000f371bb22ca1f33e3bb7eb082327cc1ac0155845eb97e6ff6ca9d1dc83e39902a3246990831008d3708e3e426b27873979e7e7bf1932d6807287cec4d0a90d2f46865464cc4e4c8261ba8676f0e30e4fc489e950e95b49bfcfd8ccdb5f061977ff1268c6e2d8a2ab5b0e7f7b2489d0ba5972969d4a4adc119c19b9fc19f15a0725a9854234aff69e62f9b86190707d356dc282e4701d1cb845f58a70447f0e932827bea892fc74b4ced0329c490e0bba00a66bbb865d9f37f99683a1692343cd826a62bb01ab007680810d40eab130bb605e9a4328ee239e0a34c1b468bffb616136ef6518469000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40105c12415d78cabcc8537f11acfbc7c99904931c9b6ad901d5f725e72def880050210490aa334efa34d49dbf0d78ce4c35348bc83b63202d855e0f398e0355fc20705b46806bb59ae9f8de89fcc0a65e8b0abdb77f492ac1b1a35df6aa357dde1b7000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e6c36ba660d6f89fa19747bc187221a2a3959aba2d70af1f24a53e41c3377271ab6076e0339637c7bbac0802658e2f857c9d6a687fa03068d1a1e21326b667317f7975085bcf4e40ff094afa7c2facedfdba14f66ca8ccefd8a3cedd50ae6ad2b0378bc0c1a77cdea566b0e5a27704bcf940273c732514b7c0fdbd77cf1e6a59a4ee0fcfe0614bd18920734631f3373f17d2311fdba5b86483ecad675146bbf382c0dbd58302b9e4ade5845262872b39a6651492d0c51072281a8acd4aeb9cb4ff760f316793890eb5a8481a9803dbf2ab06c971f1c7a4ff251d73e2b3db0cf1283e5b735da67f3700f0bade008a6764ec9dd3d7739a174b63f126c4480a9bc9358248c404a202bb67112183e493b7ecb0391a867b81c295e5254d567fc4b4287c9ec4b7ba61a23b6d8f00abe0c5201c80eafd35b6157f29ddf9fef094d5f7f378f54dc6bb72e12d5df0790594b912c0aaa52b371d8b315c84cbc3bd8fbaddef61edb1cfff87d23729185cf89bd8266985a0baea91ec152dc18992cda2251ab898e8aab1f29234477240852aaadde1451c391d697a0b21fa975fc4b0f921b3c8862ead0f8a53dd0c5ea06d9c836b1e0915eb00c89bfb787e2fbf9ca4ef46b0855a2e59d6c114d95bc266c21a212de6307898211dd58e34262bb00b7a5dbe9530000022800000224000002202110e4975966ea858c7cc8e3eaad6c628d7dfada782d31711823ed2e76b4dfbf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a165315378e9e2fab26a2476ca279f7f2ab766ca1016e9fb8d8f85c63464172cd50cce4f77d550443ee304bfb8653f5c977fa46e3c0e8f6dd5b83696f307604fa205197d388c5a2f95a89e48c7c05244778464de4fac44a444f12cc69bb9896493add891ed629510a89c9f44effdbcef70dc138e83f85f0aeb3ac6618d3cc87c54c0ac7382a272823a930f5ac67643ec030c8c3ed6780794dcad7420e06a472784ee3abc45cd5cbc55b882a39e1831f5a09901bcf4302169e849748c7a754f971fc44d6743185576ba22e37dcd1d9cc5d823c144e4570f91fd6eb27449be3d6ea3d22fecfd327ccd86c1821048aa3940594db615f32735eb97c37e302651503e491061d07353601fb689915400435ad3da9a873ffbcd1ae0f13daceb043f8f79d3ac1c2cc8236bf49a16f8de31d4ba1a8dfec4001da9053bc431ded7e317e4d8529bdc3c84134797c38613f92fde6d5e174dd91b4eeedff34b0d23ba6582b1cc27e8eeb58e0facb165cc0862acec0084f8be80ab41e949fab9f164a57018679092c91392677f8fa4f35dfcc240bdf9ef386c551d5407639ab96cdca93b4d3c4ba37eb4ded9ff0e417ceb45078ee4decae47ab8446235028cbfb6aa96b710900000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40108407bf6bf1d725829a065bf10ec14ddd208c72c82fc5664a25716f3a68b2ff30210c867f2cec33bd3971e23cc334a523b2e8cd231a86e6f308bb529435dcd85300092027729a0e528956c38459b2d321e8a75ca6d4cec6673ee7af225f1b89ce700000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a9a2f9985e043c0a4d6798624074dc89800ab22f1552138f81dc74def23ea2a621b9c8b58207095ac0ff69045b7dcb776b500113e943d309282bf5219bfe6c0759d884a0cafd375346b00372e657fb56b8fbae03e17bdba785f78085e36d915f8085898e7798fc0d4d4acb4247d518ca5f069c16f23fb5eaca6efeb39f148351d5c46c0567a65377966f66beb701d933230cd9e756fe6ddd469d249cf34950a7625f7ac85e87c4fdefa34fca7f7c680e50ee2deb4b7c13eafc50e837cf5d1a1312c3f490c5514cc031a6f3fa135150d3d4779c9941f33a356a2d58366f0765144e5fb3fcf24163d3017e8b3c80710e98b011da85a4a4e730677d325d8475e2203b164b2a4aa565785f23f7abbf305abc7b74359561518d93df810776d6d1706b473e4e1622971680a9a86f7a752431ee0066d2e94fca2b86ba25260688b910c652872a588ef6b979470beecb1c6c602ea1f5ba8e5a6a2266e0bc3f9881102bf4b303019ebec1c3c090b944106cb4240b85415029f24aa3db985930c886542ac7dfb375c9a0fcf89f1960dc293a4ac9c8dec95159167826119958ffeb4c13ea6d7c0c6e4b6365d39864a66ecd60fae7124e45e96f2b8a66ef8197fa181999f80b40720b6d6d147331fedda118430f4f56f27021cd401281b02c733d718ff023850000022800000224000002200a294b60a8a713147124120e71c785c4fac7f787acb5e49bee2a64acb695b457000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d94f63783277c9b37bbe440bcffa0949161fa328d5098fe8cde424a88ac751416fb7066aaedec398662864ecc4240c1fe34df0700724dae0c3b0e771b190c2c45155f9a62230f78405991eddb7358bbcaf3c21414b8fe6d5cbdb65b7a5cbf2fbe29966b3ea80268e4aadf4523729bb3004a200249967539907da0268577dbb7b3b1139ab3ebc46812e158e1361aa68f1b3ee427a101def4843cfae2597d90d1c596d0a1661809a3106928b45192668afefb8a7a0a4c6c1999b1e7c2ad30425035aea51aed79534e44d84047b74b6e992e1926bd18e0bc5be505871e5ae6f9bde6d928afbb6b3dbbc3f94fca21df24725f4db81b4d8db111ee24a21c79a8e13230c7c1e961fa313349bece2753b474fb3c9c5352a7d55300031008642149d713a42af1a32bca0e284f01cd6e3cb0c0f5d1517bf43f8851c225a559314a0c788646d60fc12076040221d9020c18cf95a4417ea27b1a70a301c8e0260840b7b565fefa8b5fa3f9c35947d22f2121375ce434ea41da5ff91c649e5e31f7ae6ca415102f9e4860411c41aa47b819227e80aeecf4a56f13f7ec1f8c53473f851b8d069f693761b63319c053fc976ceeecc791b98ac91792b3c2a05d126e56f50622af000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40113cc00b4e361a933d12e36ec0a94320e43a66a0a5e9ba564e4eb22602783bcf40212af2339a0c5cdd7cd8d55551290752ba92c2fd98d37c21af1ad4af7db193585189c2f5dc017ea3e60b4efbd4c4067660abee7ea991d224719de33d6902a131800000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000295409f2026b46fb12702823db01b69ba001d1ee7c06fa859158addb0de9f3201b660e2e45d051be03caa247c06ad0ba0070b0ce835f5e0c81679e170d48390138c5ca4244ce74d1288bb9b762f7b51b5d7f2de8f810664540b43c72831ae6567b744a0a80f1731e0176df9bd4c695e08c0cb5e4dec001208a88a6a8817185e297b51701e82224e5f122d083d077c52aa8a3b7f7d57c05cab557fef35e92c4f6c0165bae23c541b76fd40e6a98703d021fce3071861ce56df1677df7e9c57dd3fe5f38e08c1ae13f2c2819b950c4c53d5759ff2243a20748ae758f64690f78656347a987aba0c8e40a545a4fe76114945e79d7736bfca0effd33138665fc39f221c057122475a8daf8feaf61c8e5893599b2612083ef0105d48d4fdc96908631fc3aff8ce4a2770a29e43bfbf0e01e4cd924df34c346fc4d6e1ab834e5097f6f99d656aee8853e6c516200765aa0525fbc1a9365636808b8f939fffdec5b927e657175ba6478ec7e710fac571da9d55aa0540401f92fed608a73b280923552cfb959da66b9992e111d04da247a8a63972b4275ff0da0436c97a4aea4a2df4a3837dcf2cdd8b84d48e08c25793f93b34a46974cd7b1541444d2c74f91a7ead2578daaada5f14a769be7cf5f3d6cc288df2dbc65300565295f615c53e6da383c55000002280000022400000220218a8d131c22a684d511c36f222f601f4dccc89b3a1f1fe422ba5f92d7e65afa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad3cba5d8841c3215b5d8e007dc0a487a0c5fe2386101534d6fbfd988ab8b7efd5d2d48a548c385aeb6abe84d36806304a58e6046dc6736cbe8a03a585f204c407e1acd0680c3f85d4b0e3ffb20ca247555c120238ab6b2b5c566f5e0b7c667445c9a367e10b1fd0ec0af5cfa6b3d3885840276b0ad50f3428c0476b3eb5569ace0a5b32e233bc3e73fbb7bc1d52b8cf9935323ff26d3acc0f3625b987b01b8df623232b15f2517206f13721a3d5f6f28ddbb2fc15851cb6f08a6e5d2e0c653e9681d0cba2e5adf3214632bfc86c533b6ce1cdbc9b596480ec71169fdb01838d40ee0c6d5954f231de8e290abf627486c76bd813b7d6009490af222d1a4b6ebb03d939727b46a6593518675ddd208447996ea00948d7b515ca0ec42cc90d53f6b40319ef60aee58fa6ce6af466e9466c8fb77c45088a7a235de4f068b49f07a13da74bc5af0a41a33704063c5b3e1e2c896327e6b3b602b50bd572db96cee4b8870c9138e5b9670bed3f6d65dc6cfcda1d460d3effbd9ae6037dc405f371d5fe4e0090e69d320fe51e1e781d528dec02688f6762fa6b1068663637db6ad6a79c036f1b7ffad520be4e882d041748a702e3d4eadfe4c31d79f7380e375ede75cb000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401085d307208364e68b3028db3bc371beccce162c4256d35b9ea45827b4bbf78020214c123c0a8793b26b7a2a746f7f06f81d0554829b131d0027834b682bd62f79a0504c7e35910ea0e69433f96e3be2e7eaf36e868f685530aad6ac5524aca09af00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6f88989f7ef89c7bbd27f6994fbf17e6ab67874dca9b07ee55b59f1f6602fa7adfa86053d82e8d5aff7863439b273fb2807ee8bdd54ce7bef9598b7acc2bf426b10bc91cff4daf3163e633f7974a514a50d43d7af0e342dd553091ab8c57a939615ce8cde0aa4f3b8f57b1cb62ce22c4f5d4167f29aa77c0ad0f47406dcad12dfd7a5cdf2d2326e46c3c2fbe2859d16ce30590a1213d2013150bd235eee94770661adc614aeee2e127090c2d7b7a6355b00134622f373379de3155aa6c2c6d05b382112e154c796dc088d57317ea2d377ba8997b5a36e6e02366011a25599c8323ef0c63b7d1331bcdefa6ff0bafc4db09ee2b2f7016ca741f5af4511f9f339b4afc3d0b691a962f39f1ce6b1ac4e8065f2e1832fd5dec08fa091264af07efae7e610e05b6c05e014938aa1193662acc3af8469142c7939b9afc72df4e6c685069c021e2db16159695db8ce2fc8fe9bdb11cf9bce7b69c15cc0a64f8efabe8474b065f5766200c5630754f08595899a38511bfd624d6305f4358fe620e3bd6123992041d5a7e73bbcc75b417aa7330506a58da0ae6b1c3d07e57390973366d1966ce71df42eb0e80b8b395766e0a9388ec1643f8b04f6fd033ef6aae97d2305e5584fc75dfd54300296b46c9b3bb194b25b6973aadf1c7fe90ec760801eddc9000002280000022400000220072d9978669f9995b73190535688d47599cc22a0bc8c389aa03d3ef436a34219000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e66ff0023c2420be659ef99d8d39414d92cab728529fd696f5b4cf49e05b83341a2046dc10899997d8828f2f2b03e9de0f2fe8e95a3de3e3c5477c79b9e83c500d29e95188c08c5bdb8e9436ce1052c5824a3ae3a2ed1d0279410af116293fe1568f1cab2e8753dfe7145ea1af9e4a245d2024dadec0cd24be840eb3ccf696cbe3277c98fb51a7863f849e75ff115b5176beffb1e47b660c7f4d07b3e35b509fdafa497a65a2ef5ca90e87f4b8b39342b0cfebe94d035fc09fe996af06bceb3c3e1fb3f7e9799df04bb8206412acdaad0d4d71af3fa2a9d8d1d86faca63dd7f6ed4e1da1a9359cbfc853695a925817f2e856840ee2580f80eb0a25a519626a71ede593966dc8c1e506a4c2030e246c006cbd82329712894c25fee8c4db24f618ca003134735794dfb8b89d9a18543190544909b887398d2388907cfbe04475b779cb54a3747328cb73d22da2386c2abc089782235310eb773cac070cb1e2358f5d5b0758c2b0683f11b44c4108937b7f3a8831146cd5f88954a987c0d3279d201056726f4f6ab6ccd8b1479151104748fe4e088d28d6cb90205e480678a36963c18f241e2ba4e319c28e051291037e9d8126436cc48b6a6db45b90121dc8f57000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011fd6ade6bde26a66d31bb8aef249802a1bd910e6365e5440ce53265f2e6adbbb021503639b67eb4b735aca8fe05030fd1eef3db4a60ec35e8098d5bdaf32280f691e63bccc7dcb97cc190c353e46c82433ece64a044cd9977d1a8a679e9d3231e6000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008919ce1f4b40c9747e2926cb936be58403d8aca9bb41c6ffd544f0c375312b399ec2da22c6945988bf1e3fd6f312465b359482c97b6827dd9baa7e34e2ab8472e9602e9ca7b70ddc63cf0aa80c38320e101c7dca24aea6bf1e5a64915cad781954d50effd981bff19d3125d47767bf420d26a665a5435f550076d556f317588fce9511a227bebc994bf3885fd0b30c1056698d4fe4401ea0216f7acb32c515a8dd0b4f4d8fdfe252dbcecc1c663f0c4752399f76667f0e09df9b532760ca257c6e036986de1b5f36fe13fab6c0e571fc76f84b66cb30c64247dbfc071a17c0f1652f31299f6f4f1c27ba22e5470deeee589008bfc35859af100bbc67742c9b69ac54b5117ec423a1c7a9edbdd6d1672ad9afe9532042148ac3a2e7645cd2703a90147fb364153e44429af34c4f959000e7d5f7ae11a9709b278ec5ecdb8184f0982216bd38483dd315ca26e076335ce5e579c23c32ba716e549c2ebb31397a90362a1c78af8b55a02a9f4664ed821f4771df8eee8114d687803387419259ad7574a95c1bf9f936afa322a4fc3e88fecbd2945769393a208b92c72f8bd5c0195dda22be821d00265a0cf1847775a30942aa3f7d79799d59c97596c975c9cccccade6a570343589c2cd7b010a9edda72a71158af659c8ba1f358d1b46ce8276a930000022800000224000002200dc2d2ed1a773a6f3d01880d5a06a5a7e17ae0f41ece9e586295a0a8e81b261100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000926deef03597350c0f78f7334580e3f124c7958ee63818ae4caf2b3a3f580831939b2892dc0971eebd49f8cba1200538db565e1630922cd3252ac29234600aed3e0ecdb6de9c1bcc270ad0c0a1c084ef51418527bcba721cf25cefcec2bb8fdd72cadd72a58b0e3349ae20d77d93313df8263241518ada9180b10a13b20150d10bb61ef16ad583667c7aeceaa3e4f6dce4d58ad5c5e78108151b142f72733a96ea294060dd113c6ce34f02a9f3bfef743e9a75988b82b7212bb73e925043b746830af0cce81a205e860528465e8ce8056e9150cf3812139a38c2c64be1527b1853163272f10834c9e3f1d4efb6666ecb4e2f133a7c04183485be927b70542e717200abcc4d6ff6e0fa19bf477b3e19ed445772ebf646ad56fe292e77a99cc578bafb90bb6771e2ffcf062a17094b76bbe51e03d6dee89b69002827689d553b1d74e42c80f41417c19fb10c7e191d63686b7ba9aaf7a45086f97e4d0c98d4a248f750b26d10c0deaad7c259109e68d238539faed5cf3f7c3ed3010880b8e4791bb9f623a816ff16a5c9cdc495233d4f5426be2c231531f2f553b6ec6331bf295b6d67f59a32c39f732d5058f18708f574b181bfcf1f8004f7bc98d79c77d3cb0e000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011a8bacc035595647c916872440001fca9e97d7b794a107cae0e2a1c96b906af40215f51c4f9c492781cafe985be2c0fef8ad75c5cbcfd19a7fa6380c215613d072073a9e28bfffd747594a7da896cc1e948698b68ac1bc805b33c4f5c3a0b4b5250000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083329e5bca05463d71d9f0f824abae13eb7eef412dadee619861a83e1ddab953b00990d4939c4b1cb80144133456623042fd965223a16f57b01fbea10c710cdff196a89f55b8aed9600f49994dc0bbc59b67ac723e3ab4044818c451cc875605697ab4c936f59a1603708fb6b16614f0ad5b9ce42b3b47a6ada36513820c5abdb331ebdd35cbd708a691afa77125d9142581d237311f0756cc73b650c292c1a102a7e071c3b50ceba96517bc0c22caf3a9247a36b6693f42aa56c9d6f295cb1dfa81a2b43c898876bbcff731186f38005e2aed6192391b854a750b018a10680aea2c2a49d242ecbeea3aa361f7d6b969617c6e8707a72788e72a10f04be26561a2d249af9bb2d2f67a999bddefb0cbf6c9ab5dfbe61402bfd9b970fcc3a4f89d88948438f7fa9c65116a24337f485cfc707e90518340b578145402a309a2f07bc1d8f16e96407ad240bf3a55a89039159d398272573ecb419bc88fd702bae908f24de027523499e1bb1e78224550c58251e0a1f85f0edc37156011ed4a9951186eff70ee2bb15dcde73c23768008123ce4dab7fed1182c072e51eb29ea02688306678ca6340bf5500eb33a68e413e2bf688b1c20a146398b30715f363654dead279c959c61cadd86476d3596eb4c65e9f4a2d2bb5acc0dc44055363dbe544ec60000022800000224000002201440472235b548fb5e1863288e8843a7bc9ab539cc4153f5c8955d47ec0ff8460000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028b4156f628768363204354c1ff651adc0c8cb3cffc0d8a0573ae73117ebbc907bc466b3f35d8b63d5861e7e6ddefbc6e1a633588c6baf3ee7bbd2de480e44f980c2b864ef22d29d260cca176a98444c13ea5db113b1513440e532f9bf5121df9d3c8dc208ba9ba573464780820ec2007388e32b13ea522dd5529eecb7a8292512b2f06e25f0a47f89f992bec6e2c9711c06c0c418fc75e54edfe463c3d7e2a6edd779bb682bc741d372fc72b8eb959639f38321444cf3fe140015aa4b9694739e1b9b56661237eed9a47ee8b5257373fc6a0c6c709802bd927db6c9c3f6342bd088e8ae3b24f6c769cdbf875ff9e6bbe9af81d7d6262f90c3bb8cb6b491644114acb9f1c2051ad284d87e4681b8b5bea40b3dcd201affeb987c24756ea4026fe8420fdd7530dac6b73d0414fe4a1b100f1762b34ab2da49b67f075b195f16f887cdd869e1dbb438489dc7b23d9a654c6cc0c69868ff4f226e19fc8295b9fabc5cee8cd12a947aad384bdcd3faa2df7c50d7467720cdd049f5d8d41f4a2ef1711a2edf01e78841df5fd0dd668a05d633af76d75e8b0c5ad9a0d543ba490ef5e9e127e202be7a29c22126b1c6a0af88f7a04d021d91346b66adb1a45d4fbc8215000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012a4da439b58a622eed1655d59f9126bee4d4a71d674082b4d4e64f97b0407e2f0219407e7d689bf552cd02c4620de14c1a24fd90c94ef63b57427c6f660da7c06019b7b397b68804b8ea999da11619e0a2564ca520054785910ded1c7c32bb1d20000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a9385cb7292995dc4bf224928f4389813bfce96f108f2bda2026f70b1d0a7189f840138467f134df241a4148853b5362ee862706adbe00313c24bd1bb69d6f56fbe8b113313a0035e42274c371eefe0a6d107f8628275a2ed6be565cb755aa6dea1d28db1fff6a7082693d3c435cbd1e045f9fffb4426a71a15ae2ca28b427af54c28de484aeeadbb6e0693d329f47ffb9fc02f8a69cd86831c1ad6dbb22733da46b57a2ae380d6af5891a300459eb6d23fde06d7522547aa6c51f5903d69dc788d268b954a2753d6c7269ad7fbcbe8cbfd8db35864a504a18510731f415a41cc2d39ef4a90563ca9e7561d09136ec169051a9d6dcd89ebc6cbc9d3f575899effc7fe6193059a108282d49bcbfe541f165838fa26e69488594ef056a83f556956cce6a8928ec3dc83b1239b72ab1ba1d1f819a6727d42897c4207e5aa442d70e7006ef59a615899536523f2ae4557257a56042d2edff9c06fe10dacbbb4a8d536a66b01eebd6dbd056ba93d110ec012b946842432b75ae40613bfec0f9f36b60ac8398524d3ed02029e154f0224237ae9d878f21fc97334e8516deef8092919400d9ccbfd28e58b967ddd4f0ccc9c897d7be01f4d498f9338685c36ae25b00c4ee44f68f8a4e58b041e4d99ada8a54000ef2a5c50d31eaad23728bdd40f03230000022800000224000002200449d77c1c1d7ad28cebe0775b75f7d23df7f194cfc54660bc89a267ca72bc6d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000272cba73743ab9f865d3cf7aeb64ef8ce4fc91a6d0e1008bca53603f628367b85c653bfdddf82aa7a3a75f4fd3a5c3036fe2631ee811fa88db6168e2f2608659003127d2caf9e59c91d0668535bd30a08d9efc31c94d586aecccb6aba1f63ab11fc33f19bc79f705715c84136ea1f338f6cca9f34ffc707f7a0b1abdc3d3e1331810a673c2a5469ffa74ac885a73355cf90dbb641f80fe2befe723e1edc625f217f5f81c8d7f4f2002f77401801e31bcd5e709c5f37015977db5f070d6f12906e39ec4f76a825e281f96ade60c79c5eb2548d57ecef02b1dc6317185a3dfe8aa91765abeef7bb8c9d3a13b0abe4c930f7110ab17a7bfa9c85818658362230774afb3e8e71dc82b1679a958142e395b4c36c886679619140cbe886c2a61d246599393e6c7706af961322d045147c25725a72d6efe3a7585169b140c16dbcd09437f9173a7a0a4fed4556b25d430170d46585a937b4b6b7059ff88786b20d3b4750e8ee283a07d9351184f2713417f5182868499753a9712732b2bf5f1db3dd2f9b5c7335e2831b77f8035df60880044f3c0b0d54954059eb61f36ddaaab53762a53ea4fa58c0b0a4caf09228974592bf79d45bc8ac35974ef3b9a3a6825486eba000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40105c1617a805d9dec493cb10e7edadf38bc2f35f47ba977c9981b87ae61d74764021a6848e977381d0b65c51f9fc2b10bc3b71f900379a5aa876c0aa1231a94ad06190b4422e129dada193549c30b382571a8051bfafaa6491d34295b41c9e9528a0000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f65020cd98679c26c6a6fa9eb7c25aaf4f031bced28b87ef7fe81c5c552cf37bbd75067fdd33812e312662e4b593f6923163cf7fb836f8a6ca75f6d88967534e3f97e5f60afc59a2e97ca7a6cd8ffb406a90a32724c2a626e6363271870512996bd5f4c53ccac5d03dbf97dbe2e1d336cd23857cece93cc871142ec3fa08d5fbdd2e0507760e320ed9c04d5d8e47eaab80a0f277ef60fa87093bde72fa83b684829420e505627e137b2e1cfacf8f48d5c3ebfad35275a3a196e0390920f1729a5f28311295f8745ae7b67b30a14526c28f0af45d5646cc7c00ba68f634b2b128d5d771f0b191145879af86fc382e29635e37455a70f7916d0567d229a232686fc5ba1dcc4574497c6a225426e6cb5e11f41adb58f85cc9c5590dd46e5d73d6a3a5741278b16e8e9a9dd3abd9bcee5fbecd294a41e7449b7dd2c1ae5d1385c2da2eb44f4e068507da3b2da2e6667e92b72ed366403346979f987fee7df661e83e259d185422f6779b50e93f2c25c304286dba0ba19b0df8c0c9bcf47b1e6ad8a40dc329fafd1ca98217c8ba16fda41cc6efd67d65b55fca36afbd8ed39e82f648e24fe0ad241a5aec422e0555b2acbdc30c8673c140f1199657c416129921434885341707d79b5ab2f8c44c00778328b3e1a3ddc202eb2a9a21c34a6f63173900000228000002240000022022a3f245d864902da6e6f8121679f19dedf556e7cbdc38c35617bc0b5477bac4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d483ca403cfc0ecfef239ab41556dcb6752a2ffef0925799d5eec4b6fc5d561e4c72f260351862a216d891c42867b73293a17b7321ac06e1dc46735f7aeac10099c9fb8280df001a990325efc6d038bb7562f267baa7b1e3aee36764e2b093fc21c869bdcba7556b97ecec6f036e4a2b24579e65dda52f909a0661c9dfb95ec56058983951bf2a41b914b023b8cb6de6e1f7d269e5970227dabd8b1a1b1f85e13ab7c4dce6ea5311547dce8e3fcd2a4bc4aae0d5905eafb0c68be0a84dbb3266a30c790a26be09578840e3864093800b1cfb1a6355b082c256a8b5fc53b17a5d3d79158619f3f384763e55da43ba6220836288bb0d4bb6284cd892e96f4204061442e853f107c3abe0a0259fcde5be71e9fa724997568d878e342ba22a6f1ca19e0af08e33835f0f5d76f6a7a338b46a914bd276a49dc2a18df38d6d6a97fbfc5d161566e4686c5ac1690080097e4957f417fdc2809242e03a9bde00a39d5258329042779c2ce175f3d7a24fc7630d297b70aa86577c35ae4a20e7bb5728dae1567e9b65392c3d77c6b78265348d99256f44f128b7743fdee4b5dbdd29e795127b8db31f5fcd0cd651c845d6a6a50b0380df32fe0a00f6a7d13f4a49eff5f47000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40110bd1a11710967ed90b4c7013d65eae05a4e8ed69774a2fd8db1449b33d65712021a6a82629868355ffcc360e0b573f5b91047610a9ed7a0e4081f1cfc38bafa971360a6bda03d1f11e3494864a53f249936bdd2c7f9ef951e4fdb014b6dfa787400000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000919ec52d79208135702dcb581b797aaf86c35d31b9ee3c8155473176f31a7ac1535a41ce38e95053ded28a7b140b8a00026c18e91e6794e3a6fea97c8aaa28e66989ab9e7ff9a6f22252408a6ac52941e39bee2e7adad9e312f15aceaac5d75d9a17cc96b5a91f53d2f9b40f1e08a549f927f3972c887bec0e525a7469cb642d3f260cb7a2367b9c4a4e16c4631a39d2fc46d853a9507d6a6bc100368a2825e7bb97dfda0d857887363174b30a06330adc39088fd92630c6eb820c97906ffa1c3059b05b4ffb9a1b517300ab51c3ff9d0827c6d4fcc5326657c9ed29c0c0646ae7cffc086407382090a96fa2578a76ed3efd441b13c765c6cdf75b839e6af6f51dba08e02cf663286f3a66c1fb4249ad7efb63baeb0f77f99598d57cd28b3bebc372940796b1621ba13ebd1b3a86453f3c49e36eff75bc02b7b556990044626950f3036407b2f5ce7a01354d0c7ebb7608e076ab89e87f2862de74ec9f97b4e31bdf046038955939069f29b8bdc4febc52f51c4e2195f5f3dcb1a9b80ab89957eeb22644daf4fb91d4c6b92f82ac3ccdf17af872baf5635b622a92eb32deaa1b18c892948999124ec8a9d06b5e30405adad8a29c1293375de13e31662ca37d638336ffd951dbd8a295745f8c849cafe0e98f6160ccf1a533c7c91eddfe1fbd600000022800000224000002200d49e6ddfa90bb21c26d7d2af343b73112ebab0d0ee3435a099e65a7761be3c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063caed6b220e89fd42444055dfcc716d1ec45168efe5b173acb3916b06a1807f3fc4fbee68d9594cc6ba5963c111c76eab485ffd6a713f20a00bbc689634c31902126d0d037e3106c003084c30ff62cc47c404f177ade51ccd631838ad61de567b66c0f887da62dc00a998f5db6db30b56058bfafbf3fe22f63abdb672c7278deb6050c0d3dbcaad88f1ea443ec7b0750aacd294f67601dc2a6918d02c98b4f9f747d8d4b663dfddd4e05b5d63cfce77efe092d460160592e6c1e1312fb912c011e65673a92464f65aa9e2f0cecca74370398811f112a4e6cae8ff826f684b6ed107a3bfc48487e70e8ce1e5dfb3522e60586e1b7a5caebef23ee23d68004dd1a66b470bfcca2e8691e8de730895352714dedb597cf08c8f6adda8ae59fd2edf46ff6fd5041435c8f642988e1d0a1c69c5134c343fb4e4568b1958416e3bf790e8edb8db37b9230dc8576122a457ca72c12962f52f5861efb4acf2e21c09361059a555abbce5c8f6e82458c8457750f5083e40c33f97004adabd86a078651bdf5f6b0c78e6de021659cab4c1d57f13cac7e48eec2f59a9f22f285f925698504da3478b9a7d847413c0c42aa5e8eb3c3351bd8c17f717acda97482d421fbe96000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010f7667a6217674aba88132f7d66fef4d7a8c704e8efac99f31a8899712ee204e021c0d309683dc12b7c8389e10e4c4f3cf78439e9636ca14943e33d58ecd814a81114d8bb80c512eae5abeab24efb346cb50f948ebc12b57e97dfc7bfdd72897030000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088a07fc139c873ae46e9a2d508aefe20d5c54fd9a6b3eb3932deed54cef2d1066229913a6e99688ded7d6d5c9448d398f59aa3bf3263edec3f4266cf64850582868cde9af99167ea0678f58c14a24d1ee098709a7a4eae26aead7a3c932fba9290577c84a8c0254e2e3e45feebdd0b2e45a6dd69b51ef4953d992576963c053c3ffce9b9e5aaddc1ae5e8546312a4d431a69ab075db45815142dedb83a6089b30f23f5ec40837e8c43c4f61698d9dc5dca76b2f4653f75fef0ae0d5010eb4b3403b6edc52203e5352f7981ffb3b367b0516093d532c8ec91f9f9aa8e4c9b2398de95027f26ec2a7c7f59254ab32402f1edd32d090dd8ef8d771d249b47294d7177392ab474f5579e30cda8b7cea598e7e59bdb97f33a0590149ce6bb00aafa237e0cd7de9c18c8ef541f4907f8d0bf2b03d1b64387d56c30563039a1d52c7ca14c367b0c3127fca7d0e4ff2fee5f2a888ff64c3891b86787d63dd70c69adf1b7ac33fee0fc1f439a8a94c3ad51e6073213cfcd64c3f56397da637b2fa5aad7f4f4352be4dd1a45723a1aeb1f1d895ba6faff66fe1540fd5bd5f171d7600b8096873461b89b6c328965cc9e09dfc73e6dcb09614e57007e21bc90bad8416aeffb061b5cdfa0b714c006fcbde95c62cdbf5ff898097eee651c34590201b5ad2c04000002280000022400000220256d4f3fbc433876ff8fce666a7040f5fe9ea35ecb728c9b30f695913a08ebc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095731bea779f8f6e15538feaae3bc9dd67619876eb3ab197d92c419209adbc86473a4699f9cfabd1c684cd87090bfbe2d8fa4c6e1c30571d42aeb95b46c2f564ef4d6f2fcebe4dc628ec8b958a5197abec5e55d1d6f01d5046afcdb89fbdca806b6501df762ae42c50c3a995d2f413ddbf4c702f6c78a5ca39550ae3c4535a0bf9b9fbc238c87b34c8debf000cae6c2be4014f962deae319b2b5f08d597daba62e1210dfa81d9b474919baea84fbc61df25c148f5a74d4500db9d9e78f1090e892ce8a3b028c1b0571407b70f3dba02fcd38923b443f01c46a4640cf6125dfe5f5402baa5d6d6860fba2d6045e5aa2d098af190946d5f5471c9cc96d7fba15e38b102d2d9e5a248951e58b591c7bb5ddd916c2f8672e879867fd53b5c383ce3cdb09790f34f32610b136dc5c1b00090b930e970ddccf7202c516bb2f1f511b2d3033e53266070787ac7eb93792822b9ce32e870af829d41055eaa782e186ed0c94eb98d03e8d9746fb03a51b820ec299bd5b21b988e5f7e9e800832a425582bb3ed5d2665aeb93d69816e5ff40b1c99337b25fff24847a98916309a8ac64cade1e6cfe9db9abaa8eee088bd6285abafe034e75dddbdc728071fb401415249669000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40100334001ad930b42f56a3d54f4e4489bc989137d6bf28bec0bbc71c1546f943c021c871254653c7c6390603b7d70c1a7ed1d5532370a50419facbd8726d6dac6790f05cabad3b5b1af2570f85a8693728dea142862857ee2b39cfd71bc68b660a000000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4df467ace8c505ade1fe562717e1fc70cb56ff511ca373a9d08478d7cbe57e4b43d7b1696337840b2a187c50716d9b82da8d963e221a6f3d70a9327ef65c7e2112730973d476a540be392fd141e0a753b41a03e376165033ee02860af8a54150cb22d8d63a22996d792dd66e4add63b08959ad6c78e7f07acd40f739472a2a889aef35416298527ec649af16b53fe3e8474b1f3b58f62773305414413e8dcff6f425023b49c11f492814043aed68565a010447b12d83d80da906f4037f3717dec05cc8e45a3fa7c22bc87490e3f282be0a742dfbf1944414f0e7ccb413a4e2ef633924b10bb27a9192831faf76cc3b983dcb4a867392e7a0de39b2f0e1ada002d14d31de2eaff8966a24e0b7c300108e9080b90c883fe755e8c3b0a90c708befc99ae75117b85d9a8196cd0cdcb6f49d92daa0109e778c16358b52ada927089b8ed10849b806276c246021880e6d5248554e506de5515c6e3fa1d66733c4bec087e402c85e7938e1570290f6a43520396a31dd7856fdc40ebf3024a58c9dc029db079d52edb13988e8f3f221446c1b4d7fa64416d759724b546b0ca07e294ff188a91dbdf1de705c0037a97c8d3ba2b2ad0fba1dc041a8aca0ef9be88b9f0115c3de31378dacc6f5e1d45fb84f724d77c3f3a3ed99cff9882407b0a1b41c10400000228000002240000022023b2ec63b911664c8048e68757dda292923ea17cde74d4512263f3e2451695780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098c42ceb6c7a18c00115bdaef63b14b81844fb19fb977079148b3adbac342bace7d1504ebb9c44fcfe00d9c078192556095ec379ba3ced200525c2276a31f71d1116fb77da982ed30267a5702b6b6430e0baaf3fa4d6bc4bf295aa654faf904e2edd722c0cb775433d26a272ac64618a306986ea01c26d0adb98dcec493c169396c45fd93e52d67036bdcc85de140762fafdd6439538834cffc3fbc5c57ea6c2bc37330467c3c56d7178d532f56c54d955914839f120ce800dd2f47d75ff3b4bfa3f8cfd6baf9bcb31832ca8b25a7e8bcd33dda4169252d786e84b2ef9508486f9a99607e2eb51745f53b2997ee0e9df89fa52fa3c8886ecf2042f47410a61a70cee448493565cb1e1996bdd720b61087f754530d876d33e87bf5209eb7a4952d18e64edad9d8987bf5f94bcd96bd7841a5424d409dbdc6add2ec1c90268864f3da68a44203cce66f4732e39690946cc3e803d32b9c7147ba9d82cd1780375afb91e73972f84a900d38d619badb21a8c3a077f23e3b7720d004fa7c528c5fe12add22438c984227859a097078a3e4c3ab07750b93f4eb5715e7007e6bf83e8f7201f7499f4c7caaef99d60d3348e2be3775b48114688486a3a574d17c58413cd000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40105294740e4fff146f3deebb4d7e93058bd3691cd58544683005c0aa22ce05014021fe050810a71977e637788dbd09edadcd551630f08199f335d090821c71926270f6eb4cf4d5278a3035a881dd2840d2db520ca84d58d7d6ea499e1e49426ce6000000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000998332713bfa7fcae5ccc0de5ca7926447ee560116400960880f5a1b749d5869b89c5bdadda6a1b03a7dae10a90d6b0c82e6ed436c678087d51ff4a1f627a22848835a3145b6ed1b339b5f20c975878a27f137f644736843bbcf22312e8ee668e2462ce88189b4f2c274590a6540bffbea070c05bd8acacee7e457155b25f1b60a4d6ea12824e926fb92842ce697777a5e0c73ddb77ce711cd73972158bbfe31520a8add65da23b618bb79c868b74a1a9fd9c572570d3718b3eb8be1899d7197769003dc23d0aa6dc163c9955cc933c271fd9faea816d4628f8b5f1314e4e4753f4fc64b7df89b8523fdbc7a64bd008454efc2c95c772b57a2fc5cab9fb7f8c3c14631be155f435710cf3575b30f71c06c9d9fa768783c5ff274df80d277e8b9952d96f5e2070f00f27aa704b5914d47f2b5c6922dba4b23ffce42d1b858d3a01123490f273fabb48c17ed95bd6cc20813be6100504b1274b9761aaaa59c25318530b60d41e404ba9cd2ce82da7ac9fc87c4ad8daec47bc04b451911c9c4a93f3e6f31b62ad0732de759680a3db20f7640aa216a7c22fd524eae2233e1fa62775b7ed4ce2db626a1bbf5ceab0e0275ec3deae1613678f2b29563e92bfe798085b83362c6f1c7c4ba8be3f471bf86a87dbe423db5806fb7b683f725e47316f1c00000022800000224000002202f8694d6c7af65cfac111136cde4945b5d54fc9ec39bf81c94a76b6d01b68a0a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4ab8d356f0fc6936eba93db9ddcc48c6bdbc2428b7f7218285e268e9f52f375170e421b3d820cadc9ce4d6c619e4408acabe1fc2be4e3c7aee5318cee7d265980f64f80c10cb4a9032244df029d4dd1d52626804c115d13e056756c311af43aa44f4bef802feecf23ed9c50c85266d1c4ea27a1bbd77533253145354e047c47567aaeef7deacf9738a4d3010a8879ccdbf25fc36548e1cc210b96fbf37782eb110ea0ba1df8131d5267aa44ed9b2e981b7c601e8b07301e7d757da46a090cbd6461b0c7f5578fd7b9d08c07b3b17fcc88a8a6cfb949801a00d91e1e520ce1ea07efe441bbce0bb4cd4a483d4a1389520693a38fc89f135126455f9d5a0d3ab7eacb52f7911aa3ae377ccaa4cc85ea28b54eb57070674af189cb82fcb2f044a5348e67b6224e9af893ec8a4bd0fdac5ba1c49ec650cba7a3850591575b0702fb8df350ae9fc69eb539b24143f8daa93fb6d00af8887f5cd24995b3bafcb30366cd8f460ca1c69aff17f4ee2618e8bd66a8297359b651b86a29ba0b392405d5e4c854da0ace33d5dcbb22e52f85ae37bc436c4830ccb396248121f72de42a16fa795a307134dfe8fc7cff6b03b64f56446a49028c364803b6cefd2d8224b7b705000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40109f16b5a523cb9b3c3bc549ae48ac478bb532820fb23d98d9fc1edb22a5c8f0502200e032c1c66f401739b7d764b6a27537fe74ad3a1052820129b771d255a20631664a1a81ebbd18ffd95475feb3149c797975621136e2fe3d6c8386158207be300000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a760614c80ca900a0a578f9d5af999f92a3a3f70a5a42f6577ec76f26cf07ebbead5974bcef7c82edcbdd972fb8b7ea3b454db7aa85f2238f8512eb85f3c918f50693ec1b5065b96505fc07f5b341b5e04ef0426278d602780673e0a11109b244019857124ead2835f82ec9150d67d677c77d13da48f821f76f35985ec1596d22118572175e48d8f28d7eb26ddf9f510727aa8a94d8c7e5a6b9892db4762f0c2f522f8db04a4b42eb844875e24350b474470ad1c9a0e65b904a92757925949da8bfa3a34e5d9fd29656b3e9e33f76cad8cd75f885bc83ebd6875e223ee9ec82b718c9ad3fd40e98cf5d49feab57e55a11bf4ad2a1403b42e11a131ab9c4893c1a8e0928665c6d31d675e9c170b490afe5d728262516537f4dbcb8c897d12b858fb920365a67c83cdc256433beda7e50cb7feb72dcf59bbe408b48e98036b4cc5d662a71220e7c8e69a732f652d3c3ef7581750ab01a954e65954286aaecd8d36a112b3f9fb9a0ec4ffc2512f6fecd526870c56a506f0941497642d035563c1df9302793e2ec3cc8c4c539ea2bb99c92206a06ec27890cca6a6c82d213f9cc65e9c766d87e87fee2e64cf9d82429fb8014d59030bd86b49136693d1143b24a07a475ce12fe0d67bca6d601aedc5be5c561bb15dd6206bda1dbeba6dc513510b0c0000022800000224000002202eaa3b3efcf5db6266233e7e966ef060f6714ec9dae24e9fe4bc6dfe926856cb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001786307b058441ebde906a0ad2569c4009a41fa673526f3d79456ecfa120f4bc6db56c2061d4f69a9d417095a38c6494bd82326e819c9a786ea7b3a2d8db733c1e41e430d61741d98b01342933abc4237962cd2a95d5d15c2e2431e540956eab77007fe513bd57373c1a189d073bff63c054419baeed183d54438b6d3f7d0579f344b7bc334c9fc3dbcc4d64c07391c84cbdef9e0aca6e0ccf1cea4545d8f0934d1ea798391a924508a1ccdc7064e0996644d766dd5bf4a58b06383a3feb560689727f8ada9c0f2c0aa0c259904d4e69431a2a78003cb045d57bd88db616331997527980b8ca0840dbbaa48e6e55f54c851e0517dd720a3a1fa1ca3a1ef25c61aa84c89503f3ddb72868aebeee8b43733068d007443fc4cdcb4eee3b2e5101cc1b5df460a4dd714117a6901b84a63e1baf1f33223a05964fe0f5963e697dd55b709afa16ec6f4212045ae8a95856651ede1ae18a7d25d3fedf463bae13411df4cb8f3560f084c3a40b36380e5beec66f5349534ce0e2b9e108565324b5f298e46c97ada69ae0c7a7934ab7e6e6af855b5f02be73ccfa19db0a9c69975df04e05df5471a15a24da531c78ad30dbc0925a058f906d57cd0e2ce72dccbe7621190e000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40106f0fbb99d08cc7cc6ebf164c8a21c0214fed5fbb2adde8a0d04677fde8a36ef02206187111ead1298836540a59ee72a6bb1b95c743df52a4a8c8b0f8f620e9f29290969ff2a80acc5e79253edd9d27cd1e73f87afd2c5a4bf478fd2d0bb06a7c900000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4013179df61c0d5644a10c2e0a86b57349f61f59b2bfd9b20c369a45df668f3179bebba5b2068f7d0aec396c780905be299cd0d589f5b8872a6747b21761eade53b3d390f6c8f1caa16eb8d387b739782c0e77b256e369dfe3fcd4df534425f4f53e84a99fe2c69ea2fb4c777bb09b9551f484af5bc74c6f1ace9f6f0c55b1ef257e114b4ec32d5731f5260ee86489fcf3111d94e7d03f54894ce8fa231605eb62bb597fd0e734485e4ff1d0747a0fa441649228667d7019b4342b7aaef71058b0bccbb23f80212bf794f2b529f1d8a6e9fb8024d8449631f221943f120cca332b892ff4083c0097ccca80250c9e48fac1ada3a22bf1d42c1622e41fe334690acacf3b08a4c9c72c6712b0ce8b4f64714ffd3f2540501411c6e35f3577cea8a75efbcaa51c5eadca322008c8137811c72ad386ba6eadfaaec7300eb681a3929854f7d134f7dc6f4496f4bcf56d359b7f0774e26e6fa300a69b310889ff83f6d425a1df674c8d5813947a2173ef5229debf85b291a876a4d96d5c4ef6edf5a2456969d4e095fbc7c3960a5fc607a187ab9e374aea533054113f0645cd645e8ca348055d8c1ec78a815067c67a686cae6e3346caadad1efbaac7d56d8e2f806a570ad8599d69c30b23783ab440785fb5a60ff586efbbd96319a3df8f7190dfbfb0000022800000224000002202f7e1c6abb55dc0aace9526ff93d1c237393f96d723d7ba57610f62f8b9a98a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023ab2f3752dba08712be766e4e0fba1a29ee652964660566d9585f58ce4eee90233a8fd16c0703439dff5b3d5181804209035f85e59c74f1e962b303ff23b5be1e19daed20dad955069623dabd1fdfaafc60f51a6bc868b68bfe717d19526bcdbde5c9e2c147bd2d2b5a54c4452c445513406ebc78a92749c7288d0f53e65b8ad5e81fe043d5561961bd89d987d9dfb4b34fde2e3ceaab3d733cca9426888d9e9b093b4e3d54f7e83c6eb3aa086737cf4ac531222781ddeeae6f82a8bcb5dd6d99130cc6ebc845b737f0ccea8dd34237012d7ae4444b55bdd90dbf2debde4b39ccef6ae7c3ac7cfdf88fc8fd3b3ed9427d41a421d4fae7b09dc1a53d05ac1c9a21a3fe139e28983607b7f5e8038e9a0efb4d616c5818b5239493f1d6cbdd196672cb6927cf0bc13dddc84591539fab39b857834b16323b3d9aae7efb6b23c48a13c424839f565ec92176848554bc6b6a0d93b4e4c27fcd1b64017ebe988d3bd4dc2ca5336958927c3162cf2277aa362cba56b60edc14ed6ebeb187b251802149bc01b8d670b11cd9f16061b014f4dcc8cc60290419940e37596dd25319eaf384bb3ab4e950abaa959a2a73df0881d7de879f3204284b4549676cf770a2e9a2a2000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8020d6cb79d3df7db4418edad6179c9b5de1c1e8ced9bef682a72f7b51f47bf66430e88c9aa716b84474549b5ad4e04ef2717331ed177e4d7256ab9f3a7b1e4de8b0220d6e80f17ec4dcf802b2e7fdb41d3b721e1fabc5d56ee84038b581a53e5d69d14e45f2c1ae77a9e6d33120d86662850adf91d54855ea0905404eb68c21f4cd30000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a4e0290c16c9f1ace65a1cb63d0e6d6ce904cd0a602ee92acb2714943d88d3650c0352c36f7ba7605c7aa8ad553a1c7d4b1bfffd8c9c7101e9fd842ce9a2f59f9dfb07fed1c8afc1bdea0ff7628d4831469b9c53e2c2bb37dbc562c6b6c38d4e09b70708897f0a506d2eabca5d11c8a1da6c447d5f1dca847aeeb73f67d917bd3ce9f2c4c8b33b734107f31e61944b170cf1b781698fca0198802db39b16efe65b3d75a5e03acccdd3a7a034b3dfe9083f8fcbbe9076ab66c5c9dd73df8b7cada3fc199f0d1259e4b099c49a9972456ce05186d3bc0e5dd395c20e95461ab5c370fb382ee96b07f38624776f70dc0c4b2bce1cde8bbb133151a93a588caa64582a113665ca189e4b56d3b8cb47ffaaff9616bc01f1526df9280cc2b10cfeb55b72307dbec666698125f182dc0212333c8602aba0828b511bac072aa2f10cea1dfb7ed00cbfb1c4cd2db7f546fd55209b1edfc70f723e8d6bfc364fb13caa616d6360ec95ca15f03ee1fbafb1f88f1ad94ff63a22a2bfbe22f074926008c866dc6c05248b8384dca039635ebe0820b163328432c0de7a1342233134408cc1dbae0982eaf4e51d6953681b1a8253806e26ea17612b82501971000ef7211d7fca70d7b1ed9b91e355dc69ec78fb9e3d287073d7e9d573bb2f4f1a658b0b78c125f0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d6422425868dc393683c7dd6c8436b40a43cfcfebae5575be6c09aaa3a420b64333b3cf4c42eecaa1e4ccc4858c79e5de85a173493728a6b3ac1e95a2951925112d50432646d8d5b7992bed31172558174b5f254ba9bddad0f701c5197ed0260d604d2bc074f760ca041bb4bd1559ca7d9281d9495c8516bc0fe20806950fd3ed5daada911ffe381237062edbb44938928f1bcf6ea420f81ec161b87edfaf849d60a3869daf66a0e4c8a5814c001a737715e81e75cb62223dcdb9b6f1957fb594faedcc21a624b8017e6e106ad0975b2481c915f46c254d5e3ad22d7bcc5020b077fc4f7451f5339c5627ff904b4769f2bfb051f6e9518122155e98821e00e1899506a7094001db27539086983bd3f57457881b792bc97f025d194690be069590bd1fbde6493a6eb7adbd5c40dd44f5de087b2e494fb07eaf157779b692f4b822dc9afa20473ee969fb4bfaefff13c99c666715e876c23d09a806da52a052f90bac67dee9486e7b9bd0a876ded052b477d3380ad1b11dc3d400392d6dec0af3e40d6d0ec4f9b6acf5fa345d56720996a3f2be3c3be8a755fbf025022a392192d7c0ddcfe5b27675d48adace42ae447c31cf3511704e5e50caad528e42ad49f36edc00afbc313d9b6d585db5fef7eb0ddab0250263a7f7a1b69f2d151e783c9b0000022800000224000002201cf0e368f51baf1ca4dd85c8e668da0bdc8f6510c1f60c746f950732fbd01034000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c87d19ab11ca9612c857b16926f63f7a5d81defb6171aa60447e9ef850e573663fdfc2ae47285e494c81f98b26e8e0af712b00d5035d4fe49236d4e7373e78e59c5e6d3dfc226f6e6cdd5fbf3286f756fe4d42a5d07265aa709f11a0e33b242084c8dfd7f360c622a9ef21a03abc70d533f4746e902c5f662bd4676238b3795edeb54f0d580fd610961a9fb127c885fad05ad8f7f17fb87eb27630a469f867a01f21b60d1c104afa8b35052b951d1feaca8399d30b3d860e8d1762d16fd6fcae76e4e55188bac46a55e66fa36d85a501a93a13395a56a5b8a7b7b178d77ca596a20b783985644dba094bfd755fc80aeb758e57651d4df181caa59a6e70396f56cbe09b5341e62f11e8b7fcef547b4104e6badf41328384624b9f1180313d58104e5bc79d00cf187781606e2aaff38ee3d2fabc5a0a6880bcc0e65a24f87414e4a75311528eb5e247aa673578ac2c98763321414f29ff96dd98343abb5aa2a42773ef1f5e77ad690980e1116f113af2cf7217154d26f02082edbd595582a99a6f6a08671af7cb419367b5d2d890e593c53c039522fd04aaa459a7f75eb20a14462291907d66a8d5d1d7368555f4fe02297409e5c0e4217988d3ed04d08f6e2bb000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40100bba16bae0062e904c36d39407cc063ef9cf04aefc2531f117727c78fffa47b0221e0ee2d65633b2dfb69cbfdeac0b48f52876047ea66fcff236ad55d15fe3c5b06aafaf2a6b1bcaffaffe1a25312c2b8a442f76343f27a194a01d6a6c3b755ac00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300a257115ce084b6c15751e2ac8ec3a0216be1bbff0ab8de9c48108f06c4e501a538e01df418dfece6deb1400eb30436d41cfd00ed9498fb15502ca44f5d5ece8bc57d8ba7abe6abcecdfcbaa3c6206fb83acbe9462879520627084208da7e15ce6f3d5ad581bce8b198c778a30b5aef8fbab7dba586ee0528678cfaec6730938c209c67158f32915fc4818e4254312bd24e3ef41165c6f8d064e10f3e50dc3817fdbae5b474d3ffd126bf6b2b6dde83c02f7e264602b5339c6d14b4a896df02d4fb2df0ef4b2ae27678473f8787ad3bdd34f736010db2af2b2344e596ed190a2c8893bcc4f2b02aad67701a6742e3bcf558e8d1e470e22e3a1ffc9fe643c4bf7d7bff0cec8a68825b7e34d10dffb0d0679fbd1c9c8bcfe7a980cb77b4d97e9e1f6c2b93d8dccdc978809047f6de3b7a41ed3e3795141cdd294c552f1017c30c6d7b1d2e3df5f220fbc2e9c42c2ca895121221a0eb56b378db52c2562dd4a54ba76cd641d7307818eecfc7087550f2eba56ee0c7b531ffd291db9422db408059d828a9b28983917eb4b26f15e370a632f955b2d5e18c221cc666e6f9fcf3b6ab644dc59e94ab64da4b1197a572c8e6cc7ae6dac85f791cc16172a5332c5dd87507d7ab8cb9fe3bff79a5d8c298e13f852d4a86b7ce08f6dfba3d7e9d183209700000228000002240000022024a929b89cdcd1a1657293fa2c69f6ae2fb878901eb0c0cd361509fcd56cb1fc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013de004d4a7ef63ecd014670e5b91c0bed5218c03f0aeee3d86d20ec101e510fc15bffbf9560f10662395a4562d28c643fb1276cf1ca6c0019717da39f5b84ea33f59806c9d876dcd1149cf67e6c93e280622df581177df80bff174a6936650bc33a9d8efe5f5e2c15e2df8ae480c8ba95d1b5b399ef21303ec42de3f56838bc0050a8103f16197bb56afdb4bc801735fb3d5d17e45a6b7d8a52be310113766bb9ce42c917a0e219a0edcc06e754fefd571cb631e5f402a565bea75a25475b51568ede651feaf00f9293fb3dc2b0ccc81d24f9ab5a08c7730ddd9d1eb4fc1c2a0063f778ce9417f8735f1e6ff14d5a416baa9153771ffc7f4ab773b31b7fb635ac5ca1f848a89e6d522f0d826037d38da026bdd825e8de164dd62ffa622166bd701417d5e73ddfac09aa5753d99997ff85ac812f126ccba5c927ac896b343187123e39bc02a0758ab910b38b5caf16926ed63c860616af2375f08418918e96601fe58845bc94eae40ef1e05affac625a5a659cdae3ac20359dbe3a14abec6a10dd89b6ea43e87e5b26be048411928fafb4ed5d6c93270616cb2d460d51ea96944c7f0a0fa4670b2474368a0f931ccddf6d4ed7fa0edf754b9baae860990960c2000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012e37b211d5e3dd336d328d4b7d76bbec945e4c996c818e6476f9a1edba017256022262ebb26f913fde52001223dfda2ef76a31d2520711e6fb839c7e942eeda0ab1a9beac065a0c5aad69c57e6dbe5394744c846ea36c11939913628c9b558d2b8000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa97a1c8277373db8dc4ffb4986bec22356e682fd4ca85d7d410d1c53ef2888fd8c839b260906f7103063f5d931852ac90661da4ec8e90b8eed36346ecbc4cf50a3df3411f472e023ee027b7948934857336ef0cee31ca0efbfdb72e59c69d6555b1e302dbc5f0f60a98c1f9d3edb716b579b7a0ebb104a2078d48bbc98927b5c617143f0f160cbdbf8eb579aa41cf2bb73549bfd140d27fea087b9213155343154603c4baf2f3d76c9bb6de195b9ab2afc9aa9c5a5a0bfb3aa8435996b61e27f0b4f5e64a765b2dbd1a35d5f63aca6c25647ed40df75193508bb62eed1fcb8b948c942dce676c268639ade68d89ee78cd141e1cccab5a13d148d7fa5f4cff3b414833ab7bf94ace11deb9751456aa3e2b11d3862bbe6a2a205342c0df424aa04d2494079c06f43d9b80e93baeac818d33df5473ec8497205c9bc7cb965c9d89d1dac60deaca3669b3a976358f224f4d8027fda931ea1ead33edb4a6d41429eecfc295cb7534221fe4f50e46c68f66913125a87bea4d8b52d28d9068bb636cf586f1c1f7e5bb0c4282df4cc771adc712e747336e5e82f93e66f2b3f35bd102a24e1b044c2c542803e5c0c5f18b4aabbf80247bbf2f3bd5a28d1dcd1b3fa15895664f58fe7bbc50afd269e93caef19660360a039a8e643d1ca802d642315fcad00000228000002240000022008c66efbb6c230c1d3bab6afe87f42b7a4b5b4c41afaa57aec5a6f0c1b8ce21900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b025e205254f3259c7de7123d294a4ddf4becbd2275b80eb4f453c87f22e9ac65a13d78a757a232ab534eb57babbba50994c23142a28ec2b7e545f098937dc0728151b51c53acefd6f86aca4669f142fd5101568abab7a0091bcf9b11ad17c3379860fa6c3cfaece669374dd3531b6241080007f72120bfe28664d791a1f4d26e66fb5d4f28f774e769570dc0a584ed790b375f30c21feb0afd2faa18d01a943ba45d066971eeed6ee10d0484439f34f42e9a2f6d895158952a8b4ac60f6218e77866f3e109844f5cf080ef097693447d44911ff21417d74efd907014671061113d73eaee64e2a9110e65d0f597f0a6f9cba5b7656f8022e7bd0e4dfe3db7b538f317977ff83c7d2c8e1c18b52f224ef37140505f1fce591e6110864ceac12b9c811b331ea15228b9840bec105135c92eb8ca847465ed854c260cee09c4d31fa1bd971cd44d8363e269944f8ed7e22898661ee4c4d2a1ec08f9348b221c0fb60e7184aa33aaa16aae6e36dda5b593b5e1f3e9b813d71e80c90b080c75bdabe12906e909308c685841fe2c302281946b045cbeeca5c956d990af5ea38dbe40f86355d7a9cb6f77038390a5e50c29818b56ced73db863f450dc556412c99774c43000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011da96baff322254d871b7f9e6b9cbe0af22b80566476fab8423c143785a0d5550223167147f85f1249b4a9479a7766574cd9506e8d6593fbd35f3c88e542fcf49a21172d13f3195cc4f0f5117ff9c4c2aaa8c9b65c2857a5ab047cdcb1f5747cc0000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000361ae9d3491bef40d098b80eca160a0320f59ac760dcb1b33ec26d3f61e67b181b69222a729c026d3606e4bee7f1663d312a06d55b595456b7706aa09f1b05e170d768b5a574825ade42d515676b184b238a6ebb4beec11850cd69a9336e6388df52060e0bbc6155932432617d496803b378ee1f54dcb1a75876d982510326c927991b65692b7ed314cd5aae392108b02d555afc98856422222c24150366d173cf53d48bb8449715090c850fa72dfc14b762065c6defef790d33d8e272c7493556f63d29b2166f4e49abacb1b660491574a00b4bd7209bae20f3853499c95552259182976a10fcef18479f1c62c1121fd554563042fd24684f2602d548f869b219f5344307c191c5cf4130b525c754b86d9f0593e468bb4d96947919aa978a7bb3356d30995ac68513c2a64735848d8ef4dfbc3b2c1ed797c005b21197eb8c986fa9f83745a8894766d1453bc6e4bc2bbbb9f0d4afe42e25014fa3718b2421bc048d70859d1408ea1ada4150aed138111f9fe55db1720503e33c17f9a143aa9bae08969b0e2278d765866d228be7b4d8a661efc2e5b8d36e367209fa7fbbd49a48295f5c8d05d37427fecac81ef4d190d954fddbca0c63d40d79d18b77e0887d92004f54f3dc3cdc5e2bcc851403836cbee3c31829a2a53ef8ec4c81c2584910000022800000224000002202745aeb1f6c77137daadc5f092f26c13892f693c132f0fdbdd0434167f902981000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224f8d106a62a61be9e244bcb5831b18e5cc17feb72fdd8f5b05b6464eea7703ed97219f063ffa11a2a75646d676c5af48a35cc88bd93e59dbeb04a72dc6a9577faaf64da08519147528600ca219abb3ecd7e51dfed9b2784d47ce4f8bc03259db02105834815c684eab12688aaf2b3bcd7a8bda0da190580f657b372de4e8dfdab18c66dcb5669914866e6ba9d9e5094261246f011747a8d5f2d7cfbd8c63dcf3e09ec7efd74ce49651a08f3f14decc27109f197e8f6726e3c32e65dde6cdaf5fe4fd478f3dbf8cd7d6318e82107af8ce62b6f3f0995f748e2121d223d7b80cd9de2d024babb411a9052e1af407d58f70544aaa9fe340bf663cae77702d2acbaf68792be26791b4854e2ded53ac0ceede354b8982416ff1c8016b806e55e1292fd989ed33c6416f1d69ea30a7fa472dd3561c61fdf86a93184641e4a4cd13c12e4d8d2ddf3b28c41aa29dad4241b8dcb361a8969204ea88250344156602460837c0c80eb2926e4a1ec39c982ee60c97f1495a359cf3a8c00fa1f329d2911820af13dcb076cb27b28c8802c4090169de31c83cf8bf3d6f56d389e3fb3df13bf3019c2560950504ca56f586a3e02c31922e6a6aebc65ec9b97fefea1b212fb98000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40102aed36a8e7807b539dbba93d0b02b2d8f6eeb4aa37f2b190c67e583bdfc4d7602243b3e5a9abc8f2c31f320d2f10156799654fcb77b56f61b78dce67db7b0d5c2121ab1208ec4813147e26c98177f77d9104ea9ce8830949cac47deaabbaec2d00000000000000000000000000000000000000000000000000000000000000000022500000000000000000000000000000000000000000000000000000000000002040000000000000000000000000000000000000000000000000000000000000000000002290000022500000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029515bc628f42cdc2dbe423ae6470906298d71ac0a72fb5364646ad3be81e4d39532768047249d022209c1aa5be108beb6fc4afbbb58cb536c356a3fbe8afefe81844eea1a6f39bacb50301a5d6ddbc80047df006f4448e77577d736cfba137da849b3522a6ee9b5f2bfae2a00170497f8fe0ce40e5ec527d640bb5dc4787ecadbdc0953b72316c2c78641e65ce253d8ea92241e2fdb12db316ca155bb7f2ed901b42cb82c40adb64b7b0605202f5eb71f9d3296deb52e43b7887a015e25739c908eeb27ca16b3ec1837925302a56d61048636b7164a4f8d2d0460cbba639777f1a50fbf4b6153ff5eafcb5aa19ab899c3a970325c0d7884b07dad8a76a62941254585fd4626ed33ee5f5bca556724906868273a4ae0eff21f75d003898ebdba01026e03b0a49f3fe93554f73cd2dc90269faef0057658c59bb6acc4b7b8444e4c63d7c8194627c7808c732a2ba2575e2bf5a8a70b919ade39279664ea70da7ec2b70105a595d8e69a8fadc5da7a09386125ba182d0f9b16d629cbcaf161b800594bd62e1b5cba0715c98bd8d3ebdc6fd881b2678eb3ff64baa26ffa9a721651819abb28ffe8ac2b3561efcd7f3bf452f26cff61822db7c437c618885a846ffd4f8a84f0a2c6521581e13ebc711eca6efb45d6f7599570a15b9c6ef2cf978bf900000228000002240000022003db573dd70f17566fb59481b199de755b2ed7fb895ebe24421be171b1df85ac000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009396a005ac70e36b8872a345de3836bd9bdaa4f0f41e484df1d415e682c96193ea433c2d20f26ebaf4912adacd511392becd36d71cc512cc26139705efec4ddb0806c0af2e24c60400c715791a28bc027af0f5eff435d96db3f9b286de4be88db7131e954fd17a858ebdc58e0e066b4e7b801b9ec1173a5fb3a7a48d730c741d0a0afc3dcf625e8a1ebd3c2e211eaa8f92dac7fe75f785482291f5d9c8f7c383a319d68f7b4374e84b33e6e2ba980adaf81cf21d75b1b651144ebb8597a84ed66aac4ea264b5d77fdc907f4bcc5d512f69219b8760d387153bb9c884fd510b02cdf6439b330398e467d93a2cfcbf2c75521aae7ae79550ed2f6d4b7e1c9cdcfd953a62fd82c2010b8879e7326a1c02c4b9285b63beb5a22af2bbeff77f33a054e6db88b6ae74adfcacc4a3a6aca080b2bf6516acedbcf31eee04223236ba019acbe41104f9790a4acb4d2ba06e22af99e81bd7ad3af055db9a0a886272596215a30e1b234740a7a8d4167668a6a156e8ef0ac20b965f6806a17d2ece423db7e5ff3f7d210d91d6706ddd2f2ef5dd9b58d551f1372b03d93af3f28bf2682774958f4dcdd82e83d0615cde08ea149c446b3cef88670620ce4a3f59fd6701d84ba5000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd80223e53aa41c4a8cda531219e0fff0c79f6d21bfe1162647574155d06b22f5dace1f0f27b321a46b67a7c0766ff0f1187959424f33a1c766b4f8ad5170a385d2390224b0c365f62717e81a5a739a38a9d4e743d2113eb3bc938f9a6fff10d9cfdff728b5d7def1b4a3d8cf24ed291a0114bf60aeaa996a05d310c0da225c3cedf9530000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ae9a7a4cbe79331c5bd472b98ea8fc78aee5a8e0978df3cf5d18a061c27c85dc23d51df32b28fdace78b5098fc0b66a87d545ac155c2a0ae4fdbc8963c26a7801f25ead20a3c8e9125c30fe397d277297d0f28b47739129c27a516ae15bafde0e3486b9bb2eaba65efbefe21a9d741261a777b08c87c8ca29ced8e8414c1156a600c5120fd7aabd10d8d47f4ef1d78c1fd3eed29550759023f7e0fd673fc334d83f930971443a418caa32f8b3442df665d1302a228769cde1f6c050754301340a962d91463c1d3a0a443626d1abe7092158d78b3b10ea486537e5767de99d2dc3d6edc9ccc616e34f9678a24ea53bba05e838d871b4430ba61c3a8fa8aa5345409832b28392d3b25f808520c1defcddcdfa1464e6dcbcd9c72acd3b8af64a1bd9dfa2f7b265c7b2b164d1ed1b6243019fd3b68d34ea91dca636eba701d46fc7648adbadd368eb2deafe065f4770021163f3399ca95c93ebdce05e422909301b1f244d3d5ae0493ba9bb15d9d8e63e15577c879d442064622583bed77729be200d4313c9ddad6d67efe23e629608e1f68466e4f3de755e44570108e7bb5061b0a3dddeba8b3436849a4f2380aaddacbad640a7934de734e51114dfe37b09ee7363982e03947168224c5a0a73bcdec38d71f1bbbcfabe108de6e70e503a1e11ea0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008fbded96700a8a72b1bbcb408552465131d20759f97b7e1024625b20a7d7c737f22dd7216e3980cd51c5aa251975c7af71ae22213e0a9a95d19fdbfba4750da28a2c77a3fde59bfddd2172b0e2422cd0133ebc8ca89d70084a6b115ff4d9674a726dd591ffe2c7daf6b5d907cbd3830a0632cd99ded9e4a39c6aea00a93e007fd1d9ece3cd93e3a06b10a10cb3e5c16e87d15f0ac2c09e189c7b001a7ba64d48f35787470300069b4e442578511bd1c8b72d0a23b3c3e76b887cf8a9a6c7c82d2c262154d2f93fd41727b6f38dfd454ae12b97f6bad1db4987a86fae1b570f42115d092e4483947b25ee9693db750e95b8683e0171443669cf604b7089a623cb8be0a9976763899c55fe944960567531eb98155ba5873dabf5efdcde4166e6e85ea4110a2bd3676b9cb008025536c0ff813ef860772faccc7bb54b8230f54de9613636ed8e082f87fd75a844fbe9a8050d745a79ae795389cf35db56a9557663b3bf28d7144a280563354cde8cec04dd024e54a2887920c664cd2c8a8fffc79889437cdc6cba9158fb72fc31bf36c3a341438baad2d0b7fdd17bf448776654e6ba34554b9f2a9052e740d5fc51b33915995cccfae8ac67d882bab6b02f45ae41e7b46a6156bfaa7219a0e23b3e9664c141a66c7b3efdeac39d4d7a915b6e82880000022800000224000002202bc8d2ee0ac3daaf1bea06304988317c69c970b1f6e8e976c94a28287be8a73f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019bb56745a413cc9bbed8736c2a80541f5493b72d0031e9c1a8ea4fea555adf4657aa11219f83649fff159565fdde44f5fd3c1bc8c25f5564d87f72b5f2e78a270b3303704fbe51797e431f24bfe707048867f13091791e6a8cf52b5dd6abd265953c1cd780434de742d8d41496d2a3480860c61700317544b5dd2ecdff744a61cc25025016cb2acb75f79ca6dcbfc2d848a55397252cf99408ec8a3e27911dbfa45c0f852e9162266b7f0e4c2300406d206d843651156193c0931b0290870c61f509008097b92533c0ce81e8fac305416bb4a97e5f53aecb3178234f7f6734d969d7a67a0e03377edd61b701583b3e2dad58df2a70bd65206e3b3f16f476bd3053d60eca2de82b2c113b61b3d54551a3958639be14fbbb4567f211430f3107d578e3671d84a863065ec3b62a417dab3baea091aeb00c7898e727357bcc3471113ba67e5ff0336b220c1cbdd08fae3bdbb6189a78d8f392a236caa148788f8977face37f0d604ea89250622c9337f5ee8225300aa181dd307e19b6f32931cee7bac95801da50fa00bbb409c6551fd6e79af0e7b038475a950a32e5c98c7015762b213d8582a25cf2e98279d9b277f5ff88258488e198f5d9866b4cf02f975007000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401238929d50a23802734d846516adfcaf471706a18fe2eb2227584bbb279acc6c9022566468692c8667280d91b1cd9776828719b715dfcc6f150e09109150b2a5ac610455762d55a71b4f654b003bc8ea9dba15416843abbf9b26ed9166eee46064d00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ae4f36e9e8265e5d6f4ac7ef7fc905831cf22b87ebd290f0d157f1f017c6dbd85d95ecca2def247b280e12369bf740178d52c0ec9c4c4f9ebc4609e60de63729ba988b6d9e978340624ef52b5a39b72928e58d008be4c545a84cd9f490a5ffa2991fca69a6e88b6a2c1b1169b618c10dbdd262d0fe74463dbc7c248521cece98ae144244655103d8c371a9fcf15c99f5f3400f863c9acd4740c4cfccd05b89cca7abf44ee8e2c144aa87f351e6d43698fa39690f0ff552dca377e167813f9defa993f6581621d815bfb4dc7deccc0426952b388892434e6bd73ffd731557a6515e90d8c254f7ab7a948e538dc263c8583cfb971ef9a3710d5ba2e0593941ae29065c83602f103d2ef9b1d8f2b540a42046ae152af542c41e9856e17fc79f14edb0614a632ed4489952d03e9c937549ed606876fdaab91579bc061545240fba5a9001dcb6cc262ad48221b8f2224185abc56b29c99e5e4ec7aabc2f71dd0f1408d53aab926b9b15d4c2d0c48294ead6b9dcb01bd11baefcd2d59ad62769a85dd4edd381206921b58b668532a4ae8e683f6668a6e6e5423408b89b82c90d18c4667ddd84c0fd07c264bcfa79b479a12a9a6a60c1285c503496f27083381c6b1711b9b4ef63aa00e581f0adb522cee002309c9b2777c663ea86165ae7e5961e073900000228000002240000022005441e4ef4df3cfe2f22bafe2df017a361d37811bd6ad960a2be0b3da81e150c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b0ecab0e3423d4d80a1beacd3dac8cf1b1dfff6d32d8113ddbca3553497915ec07113978c6ca6b881767a31df57d2710e69dda5003c581b620c76b8d9b04c40228986a0cc9148b97a834125dac76a46a70daafe638854a9469871033bdcbe8f7e107c08116b2b3e9cfb89949a9f905e14ab5c04bc91bbf0ac826d7eeb57943563cd37bbd805a645737d7507c11412145997dd41dd3727039e478aef1ecef8e4d90109e0a252c67c4b879492a41d9f34d570903d5af6e5e2ffd73da2babd8ee6ec51cf586b918cbb12fb05735f278fc7c7a1ffff7d340ed9a1fe41dd3e19a624f6f8003b28a017f7621d4759b55ba1abb5becadd05d841095fe6d759139bbc6a04f3a0a1a333f04e015ce0149a0522583d81f136c6ac9717c634c92421178efcccf14764fc03656f8b6ffc9ab726f93aafd0b64587ef0feda1b45d889626a49ee2dc34f56224dbf57397f8d83412193fcd3692ded2790cd59f07bd6848612640a7d38291fe38455fb6e301aaf1a7d2ca6fdf7918ed7a4816d73c79618e61d8613735ced4dea367843f53ba4887ee6daf15adf4cc900fc85cd6190daf40d3b646e117320f18824c7728b282189a951398f14ab9a8a68469e2429bdfdc39a3010d000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4010b25897909f741cfeed75d250c909f718e8f2f03e432b45ed5e66a3dab44e400022ab4474dd8676f662854c33c9b6dbaeea703e1ef62bd1ce117c625ffbe640b2215266f1ed668636c7c15d438da2dc132f49fece34569c8473061395546e870fc00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a099ba54883bcbdbceb86b20c8ee1f7ff322d6a141a2d991e89e4d58c0dc4b3225a61866886691c76a8fff2cc3bdfa61276fcb3660cba4bbf0f4f6568a4ce8b603aad92f1be4316888abcd161c4e7a9d9afb663274a683a93bea0bffe7f2ffe8aeb8e57d3525cff38e777cb8d7f4cffe1ad01cb9387074805277dd151c02f5581be70d89a94d25fda57529bd1ab968101d855356f2c1f67c9d401fd674f0ac038c085eb17c63f97a3b4fdc04340bfe2bc960ec1c83fdca9bf7a4a5277ded2b37118d3ffd046ba1a61a15c80a72528b79f8611db6ac8d621b79ec23917109de0040106ebd6ddc01d72efbaf2557a54494b475df14b39cc0323b9a293bdda8e29d409d8a646e2fa749ac85753a1791e2897165f6eaa32859e70659cc51aa1e5eb766e77806a25997371f7727f972a3e130b0e6a064d3a9443807494c0c143096b1b66959cdde64ecca2fc6d3848c18462726b860a079127002a3bc6acdd8ae7ba91536d4ea7acdce406c2f815eec7a87c0c71eb48b231b05518431edb6a7801cf754a941e4e2e5f20eb85470b4d1b6812370ef9fcfe2e13bb838ee8c1f761cdb0a1765bb042f5b3269f59d97b62f07b7d68bc54e74c6ec64db639b495ee164805641b7ff4959c348b955252569a19f29017112d686be0f8bafa921cc5349d284c70000022800000224000002201139827be88917579152190cd4a58fb8eb7224342ca9695d5d4fa983a7da5b16000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e6d591419682647334767ff01b0b92fc6944d72834eaf98b5d765e9f464be2607d887f53ccad99255b6bd1f434524e4fd83a100ec3764107c0d9ac69cfbbbf1c766315ebd1b86ce50883ccc10ffbe115f06fcfdeffc43b392837561c8defb00e9d607e2d96e3b5f297f4814d0e0104508122ce2f7b5e8431655907bb6aea687cff14b3cbdef6b41b89952c4e0f071f9795d801592e3f41141caab3e4a2ca0d9ff0b51288d630caa87a7e6562d4db33bce2298e67fcec97bc7db2f05fe548e260dfa41f8e38565364362ffd26e5643b5a1e2fdfca98539d7bab79057ca12f77c5a178d3709db5ef59bd4bbc5a5df9ef8bb12236ba98e878d1824cc5e3617ceaced1d4cba3754f7fc5188d10198c7e704a17659d8af3686dab35978cd58299ba482102cb4ac152b29df3237186e190ff287f5d905e04b9c141c07f9ffa0f3e08e1a44fac831e3e40d93fe4729849fcf588b47e21b003e20451923f18e1ad852c8e5003df2db738b6a971361f3678e25324a9bc9c95082b73c8cababf6eb689aed8418515ab72db2554528d0e1e2497b94a59013e01d0cad5b2c407422835dc4a4748716dddfa08edde5a730c77ec04b98882f14ec983bb12263bb8585d74ab94a000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4012028454a2bc324a5a607f3a9fe485f8667381502113841add1ee17bf8f71a81e022af5993da13a9b70fcd899103f6ea274a02b2f96c7809d21a311c27388636db9237056daece4a45b7ee01630a9c6f9cef69a892e5eb21bdcd7561cd8f29c313000000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095dfd04a839b1eaf5e5f2b84bfdbd901d7d60736b819c13bfa6d2ec882d21ce7bbe8dc170675f4586e090ae0f9727baa105551a0dfc1223bcc9156fed7c0134e499ff4f1fc2541576ee10f972921ab855e7f20e6c57918f8050dbe8321c76ea6d46e76ca43c473fa6d1d69c7394ad9bf1bd2852c67be58ee1f5a0c9b739db072687acc24ef1da833a57122fdbf2ab9e793b6ff20b122eaa54af03dd83ea2a085fff0329a0a09b06aefe09fa3fc08332e848d3689077e715355273b23d9cd2b4505dfd15368c02fcfe34daed4b27467b53d7381d27a1bd5153d6fc59949115d653cce1729d17e5007cef2195ac0e975e8ea3c21f18b678064818524161d39e9eefdd4a746bfd50a91ae3ea5b5028cf9f6dd38c98248d10dd41ca0fdc79d49d27b81648e96c5ed9922037001d180efdc989ee5ef7b7f926ecce75183a80b4594e0ee25dbd76a14224a915008f2fceed7b08b62dd797f86a2c4d5b972e7371a3341b90dcfd955903b85febda8ee906f17aa61a42ad0e0a1be79f2b483dd6c61064f81f3744bd456b7497c41a48a71e0ad501fd6ce0c20654d4632a3b40bce3b3543337fccd1dac264b9277cd5672d23965ddcbb5d07bc2be2369394b294179241222ff1a8aa0f9c55882cf20d1c901c4aee3a244c8f46d0af7014d50cabdc9592b0000022800000224000002200436416e6d98c77ca77efd705f84df71d8de84039ddfb8762e8be23ccd9b2bd1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000617f2d6efc644a28933f1e6472c53fa1ea473b7795c1ecb98b1e8dc96545d6aaf51ecd1cb4cb4eb6a23d39e5ee391db1019f190968d4792a2595f3ea6ed9fd3998227d64c9b51b3c8f1ea29f02bceeb0aeba2ce12cace93060917cc18ccec07dbbf87d393081286430c87926aff214ca8d876cd3882f1ff95b536f758962d1c5f60d14b80554a272f7d623de200bf7de643853e2eba0d738cb906bcc010ff51ce067802a1ec50dc5d8bcaf121e34c5becdbd57742ef957a69f634b126fca7ce3fe01fbe942c4eddde83a1f51cfa329cab377eb2e08440a3f910be13499d997074753750e6c86b1352c4c561a711d6aad4f95ddf4aae1e97dd987fd04cbdddd2f855c2af0c62c219ee250dff96ebe56b4a3cf3a92acfd5753b946a8a907492525eedfac3f3bcb3cda4fff172ffcd47ddd661b8222da0eeba12bf140b7810f26348d26af22d29540e4b05627ba7527bb97d7245ea7704a8b48790c42ea42e39e64ff816dd4bdb25fe8f538d73a7a6af439b1d0cb602f5566585367c1d16ed544cebfad57127d6ae3db648612043bcd408036e5b7f2fac765f632aa99fdedaa2aa14bc2ae5ea3a993f4b131c3383926374aeb031dd53839c3d5bfeb817e8323fe7000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011b0e6c1f60988efec1b665b32ddb6d86fd5966f87bd2383bf49d9a880f4c8f40022b9952e20218293a785c483887f0ad3393f28e26c2e128a88a63d157b6795fd5057c94e11bee07c533005e4f530404503dde2c7f45f1b27c77bcfe8f81c964cc00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000198b9032602838c96b9f23b5930f930dc30d1ee8da98dfc2f86edb4ac82b586f246c5226b11e6569f2c0e1e3f28d48936ac47739f031b1bb6b6b6e187ab5749a0690732125b00e34e963c7ccea6420fc9e322206f6f718673b2810b38dd6b4f8186d8ad4fe2c8180fb11cf2521b56d3d3519edd2eca3acac0f11bba212d7d4729ded5610a8be037694cc6fd47a551f876a503d461aa6b4a92117f49178661ffbef56ce1686a66a5fdb6af5d7650154859bdab1a81187bc758da8f780df237fdaa61d3162aaf56716c1ad1a552b2c51174d474f4585a81fc8005ccb38f727fff5a0f2ebbb9badbc70d2add2204985eae0be5fee66bc0b74937b086c8133020070d52ddc249dbffad8f78b2833b659f79e93531c1085e64d0505d24d8dace93684bef1ba4454cc7b7cf94c7231796e897b7c8eb4ab86be49ff9f13e64f43217d13ca4600b48637c7dfb6c417436c0900995ebadf4115fc374bc43e2641f965975e213335caa4512123e2824599d162b2f048c7041549a905d9a8654cfcec5ef5dc4d76aaeb8782230ff45a9f611e1a9d3e6df690f22ed0926baff7806a75f75f343693070a42427284da2d24536c20a1f3e674b8e6cf6aa8dc8a1260e08bd49710d592039446bf5ea54e8ece8250c7a91a5164354a7828298ac4c34ba055d766c600000228000002240000022006614d5e229cdc757fdf482ad27ae4717df08d7032c471a0e715c6f634fbc2600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024d9e4721063e97ab3baa164dd2d41c402f89cae4363b02a7b8b69a3d2946d13d146a2aef6573da945a73d121eeacb3ecfc915b878719cb368368bd47f991eed0b9a391f7b050c7450a007151dcd3f95b15a89822972f849e2099a20bda7b1b3bfc093a74f98b231b8da72ec8335e5ad80db5103b39fb860779c663f0e09d28b84e6ca9cad4258b1df4b505bcc6af7c98d66a671b0c42aabb6299c9ff3ee96cb0d83662f8b2f553fba5754667d34bc4ce32243f56b2208334b9a1061353fa17af32657d0dd630478d840d987a1cf503442680586d30db235719317ef72d9000a9a1a1fbd4559162ee1e664e641856f9ae4ff6135d3bb4e16079411e2a84d02684d668b68111f94abcbe65835c9f96cc06f0d9edbceb93aadcd7b559cce69442a14aa58a91c935b31369d787de553dcde333264cbd47fb2d79076e443b9fe1e7987dcd28af85a0295b487a57a2086c371a050b74f27b6e1a8198a3ec3840efbf000a21299aeea615a6164a315d106beabacc76977a7a6aeda221b3e22ada27458b3dd1e1e8ea31a6655cf1c1e6d37e0840785e1286a059372bb2287886d1ae4be34c711744d58258cef520213047ca14aaef393152d4a9a96a3251f1481d204af000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd40102f3c8330e6ed2b170a15eda39a3af928c573195e9a846769d9e2467836006ee022bc4967be8af77a1efe9601d3ccd4890aa2b7497e81f53d8a359dd584a532eb401b15e3c14fcd49e86ea58eff96af600f8c76ad9329673ab128217527a2b87bb00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a823c12d26de1883bcbd7189487a9e8f007a89b0ae483afea563fd9f638d754c1d89b2dfb33380ccb6ca2032a9f4b015952c8d4cf474377986b1c239489c0e89f9e3845429f3218d395e85ab145f455ab0bc69ee533cbb0833e281e36087d695c135b8e68cfd7da7b3921369dca639da5c0d0a40213ed70c69b6862e98bc4828c0cbc11316e849e92d603dbe24bf63708e6699a474fbaf5cfe9069bc08211101b73c58e24ce42388f27d1173d83355df6568491b572c8d0747a3cc3b84fca7a10572f495d59fa2adbcb0baf99af77158bd2bdcea8dac1db9d61a65578b160c638b8986172b67d2f83afaf51ca8ac4602f9eb8bf6b659a976655878a5408478cf7ca5b9ef5d59ca20f73e688da3a53e4ed6a11f79744d1a3a34a484a571172472119bc63b1028c8e54215538e58bd202a5d4d61527e4bf34a28acff84354d6dc26420066ab8a0e72389d93c036ba0fbec1d643b35e6325844df1b21e606ca61abae9985119b27c64e5655d365dfcd115b196132a86ee1bd199ec10a595719cb6e4fe1681d0d0ad8cacad41a1a6cc2640e49cbc08c9aa0a3d0f1fe00e3c2bc869dcac0c92df8722037c3b57375a4d9f81945f4c128974b389ad4f3c32e0202fe737afaf3f757e0fa811033c81292ddadcc7421e4da20ee37692acccabbe38448cc0000022800000224000002201d70070f04dd34184c40dfe67d9302d4b577409028cc9ff5ebec21bc69ccbe6400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110e00576260e29b15662640f9e47658fe0dde591581b709cd97e11e97d90757673fbc6cc61a46d30c1033a23adc59bcde68eae8ddd3e3b4a4a13cf136371dd62248c03df6f7f27ad6d0ac1851e6107e380ce94985a44e79502893d548bc1e45847ffef5254635048ee29b438b83056a6eded6d32765719aba0712e240416b15c60983a6a8da92583c70d8ff3b91636a2dff1cde5d2beb9a91c37e712e14054e22d6bc9bcbf319ee4bc124fe293db9f5acc8c25b0c3d5378c075adeb8d107730ac75ea11aa21f42927d9c3e677ab3041cff02ad18edce3c87a1caefb3066e4916f29812121f2e0222feecc4a88bb37688c6d40395aca7a61b2344b7cde383c7a57ca939fc39ffe50d059edf67c11baf46370ba869bb57f623e218995fa688e80f7ede2359005cbe2be11e1b714926dd2f13aafb1e895460426ca37691d0ae5805d629a77b346d82381e36565ec61faee8df52d5e9f620dfd578b03d67e4c2835769d3b9dc052d00fc9ac17ca40f5421396a1ce3f0ad395e10c9a7e981dc27c65934ae03ace5d18f8b55125d0a56219724e01a68cf89aa0842e5f14bce098db4658c14354f8702972a8b7a988ef25c116ae84afb235155f29e304f6524b70568f000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401177cde59e3604e80a8266c15d401797e74db1a0e5acb2e11e3c88a052235b95c022cdd2675b5b688059159ea49c312e0d17e6c56af524f4942c1584f03be97399b104af08cde06bfe12e46e15e4652d2e3efa8cec78c6ef408dcda1a643989cc97000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000183b7f53dc05077dc10d0a854dd2aa4dc33020fb3b53059ca097f4452920f847b7c701030b8b901d5317d202865cc44d85efbc054b3bf63268a7b3d9226d6ba1f1f1c5e9c2cb894d38fa3e66ffc3f5bbd3f8749c31803a3d4c3c89b93bd288bd535bbe39fcc23a5f9fd61f7360f33d9fdda849cf9e928b30ea7b60d30461b4747ffd3cb122badfabd71e7d7426e894b812b502beb3c5bfe846f3307bc2a56f29d66e0126fe320ff82e12c958a3397af446dc1f54851a9eaa29e3a3bd24b9bedb1c189bb90eabec6224d60e3f3a9b7c0fb5501a16203417000e38c30ee69822915e9d79066d3803b3a6a2368c10d9106a275bf156c437aabd530ea2efc09fbb74bf0ce088a09587ef05e3894c7a801c3d88c54de41cc23e5823522c4616053fa032c9948c79b4f82e9f2cd10b34f5ea827eaf1211a1cd60b3b58b0cde43ecb416ef7b02f85071cf1ca109aab70c2de536feb4c44a30dc634c948b1ebda280df2b20fd8c6f8481373d45fde454f6e53ee6a57edf94a40383b892a474b2ea6cb5e031c90cd96bcc8d7b443b4746684d93d3e43cca833a7fe2e9bd283c963cf6aa0f860575ca741e9d3cbd1500fa6b49892f1168672d1f93204a8c0df97efcf293a419844c206019372df92b2fe35de713f01bd1e6d5bfb884bf36f05c151dc81ca000002280000022400000220054ddbfee9568c8c26d2a8838f870b95fc56f718cdb1c186e0d4f482df0aee430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080c3d1b0ce8485f15228cb0e8fb55d11cf05e0a4a2a5f91c6b4b3530d2f972e92a58c09a7399852c9da9bbc311ece95c8d119930edfc076a5217eec3f34203ace4a6341c9a7d0b1dfa1146adbd408fe46a2d8fd7c5008a6248c3ae4337e7362635ac60779330db6686bb247d80a69806692214abe2e227b6ed5dd10e1a42206183d9e2705161c995ac4b3b5d3983793879ff2a2018158a9f2d2090aba83e8e88ef168d126544c2fe30443245640fb67bbf5ce25e16729a0df6fc0dcb45c685a7d87e8630d53d359e1fe0a89b4b3b2e8d5ea1f037eb79fe0427d3d1d66413a4f4346eba5d0cf08f014e2224ab7acc0f3136d50f5aa361fb605306d4d4c27b214f7ac3e58e7e79300793c8b46ab8808b0ffe9af3fcf1a148fa91e7e065e68c5c468ae367f187c003bdc08db5dc03fd88142227474388e7a727319c80dbb11a1598af31db0ec81182f5ffdaeb6239ef9c1d6d9b9db8073334c9377e748b19fa5485145e8290f70bc36d7f28715814171d899db407974ca0dc98831612c3d1f4ad07fc48b8be194ffc21d827e1641f404eb86b8781312c0b3d025fcd12a7c4c3b62c5a59b89e46f2ccd2f3e0be270b2970eb361a19d657d9630e25f447831916d061000000040000000000000000000000000000000000000000000000000000000000000000000bec4cd8022075fbfc94aaf106edfef48bf6796e5de79330a73f0a9d8127b2bc60ec20ef680ff0dbc049049d2a478be838f413c386b1f07871042427d417d1dcac70044355022d2882556aa146429f95b5ac05fd65c0bfb95c2c9539d8a4eb2339bd91647c6d252d19fe334498fd968cccb689c70d3698b8fbe476d69098cba90208ca6d15e80000000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000044e0000044a00000221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091fb339f929b2390df49c6253468f391cfc92cd718616d9ac2ec49a0c1ae1e1663446e7992a41b9d679909944183f38a8ea38b295ab30064f44c350560bc032092fd766cc92695f20a6267dd14d5553c0d0eb875ebcb83ee1e18279ddcdfdadf97635a054f215f81303dffc3d8faaeb68d8996e65fd85a15e5891cf22ca644b379d6820d10afdc23052a91baadfc3c582120efad5d4dba0a9e6a3d0ce1446d38a4c6484cc064ac40c16cab82b6bda8f8a2a502343b63189ac2181e6821dfa1f30aa6fa1533f2858783b85f7555a45ecda84e9e33ae1d2b8c42d74a6b8dfb68bfca51933f6a4367db10a6a59705fed8c7bb32fb2332fbb634c6952fdbd7469cf2e5f74236baa4efe7a1a4415abcafe1510de2a0d299d46345c771fd461c25231571818ee0fc01311bb779f60f98a9c963767d4df3a8f66125442addb2c1b0e81eb8e0e2bb7bffab1ff3fbebc84ed4eeb3ebd987243709b84b8e6fd820dcabb1144a04a531ccd906947e513bb961da64077a0e62ddac15779cf9f242413916027bb5f9c9239fd45f2d6fc4141a7f485fc87a60b61300e9eaa85076e8553e490b8221c2c18817aae2a26ac9d8187713800822a39134d5f2108d51f79cbd6bafbc1bcad5bdfab049996333e37121a4a661a09e8a1c018019e9334598cd651173ae9e0000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000521c833922e0ef1b976d42b24986b716e6e5592e479b3ece27be4ed8990c3c10e07306e6f3e1a212768fa949bcc0356060873d250c66ab8a3f4bddec02cd0e24d84ef8ee6f54b541219d0212ac98c7e97d2396508db0657fc9fef25bd06470584d607ed108384a48041bc7ba10539c39361f3f09dfccfe7edb81f51cb253507424d865bb65e42cf0bc4900845a7e671b532b6cf2ab38414a81055b4a6fc5535054f5f426a7de83d1afd1ff67d37cd243511907c6e4b0f66428bcb2da37b36aa4ad44fad074d0f05b36d4ecff04ead79b5c3832cce854c784b3c4b808997974e0105b936c457a68c4df4e5be89c5b617e5622961434e4e6932a0f9abf0e69997183bf8dfe612f487b595060fb8b7bbd8ca7f9fd9262ed4f447e34f20515696697a975a1b9a6117d993d310026975b810f69f264177cbd18b196027b3c57f4ac515d6e0fdae92ac50a4767995f9b339eee059552934ffad11ffdaed5d2396c38da334c98212e869da4cc2cafda3bede5c11f5d0e62b5ef6fceee35a57abb9b00463400fa5a1be019d42c1eecd9efc953ef6ff443cb33d5700b225b1754db57963dff7783959b1ba4b5b7eae63d7d162b650a198e362cb8a991d5671db2cf68d5f74e458249df4ac1acb14c5b4bfc9b3636a411391cdffa49d30847174c34a8b5d00000228000002240000022026071587021f8791e4729ea1f9595ffa9cefb1e9c100bebb032cbd611e933663000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b4dac352de3e0cfea2467ab12c28548942a5f883911ad06dd846544ecbff44d6511cf1babbd437b8a0b759f42d8a2ffcf36b0f9b9a372a6f585ef57c7cead23ea4b421fee8e0a0193510e46562778f6f9f70593e051b93b94ff370fa9ae2f48bea107350fa736682a444f81a901de5d46cd5932f32160a747aaed137b9832fade385dd69d191064036d4677c4ab25effa286f7b5212f9d77390591b2bd53e3fddc21d6a2bd437e8b3e327e7b067975b227f1a0d8fa15d1b7c0cd6c89ac19ba62eafbf7729fae156acc32eb4f748d5c55390b8b283d2b05e7bd59344a7d07ff473f06dc730933b9c78c4a439a1032964579e5a5b98af373c20ec73f63f3858c384168c262a1a86dd49e23de1a90adddd20470d9337babfe510658fe5b97b921dfe5202d7540cda05a850ad87c9de8ad6985cdf4c44cf4c314885cc2efc04ef0a011c9643691a5cd68a25ebffe264585e505dc0ae93c38065620d9e6567e3347c97c904c843c78677c14c40e654eff1946b2562f2af5f33e89698fdb465f4976c021eade91ed552bb66f18e3208d779e16fb0d862ba7a62eff3fd76ad8e4738bf3edf0d7c5f6a124e0762d0a1c3d433d8ddada042074670926411375040208c95000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd401099b68274b6d68e151545bcdadfa1da826d17f3a01631a286383af990ceb1cb2022f30a2bce9bf08a1f3d814c56d00738abd751373ee0443ddc6f90965830bb61c07f938b7515035dda56f533ac6d6d13c313772dc51882a201bf3141007a466de00000000000000000000000000000000000000000000000000000000000000000225000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000000000000022900000225000002210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000268f2e97a65ed75f3c0d8d1ff51f93c0fa452a78f4040682a9b84144755b7fed7afceacd701a1c472057078f281147074d170a231898ed096b71fddd738676175fb4254c3ebd3322dcb3f0167c78b2bbc8c0fccf664b8c18bfde6c86a2a80775ed2475ddd5f4b0bd772d85e217df1fa489997c346f16e381f9364e3a1d825c37b12e1e483d4184f439ad6f0131b6c1dbbacce3ac8503478ef37c60a5f4ea7e722837b86e68411a82a084ba4250cfe68aaae2154b27cdc33ecefcf96e662d8e441c9767ab7d8faa4221a5e939480df3a60ec40a694d0721be4ad3ddf32e6abfdebaa9365f84eac1027c89b89f42c744cc48f4b601e7daf29bbd0d040f9249ff75fbb0a83c535f9ccfe3f59478378466957a37a6884c04078dc17f12d077ad82dbd924e4fb9164efdcae76066a7354751c96f2026f9c45cf4a67a26ce85f7dee41ed1b98aad1eede7aec761ac57f150df4c9a9d8ddc2d9418f89c2af0aa5626dc7c3bdd4af9d574ee686d5d300a27852910e992508c4831d42f48e5a7955e3b983a5a00bf215dee5af1b75b5eb685b5334a6c179df5d492cf8a3e919976b5375ce710726796b60338c85185e2d0e0ba4815457432fdb5d440d00e9bfea477d8fbd3c1a4fd1bda3e5e0fa30a4fa1a55fb8ec00bb461e79258782abad2a6eecf6aad000002280000022400000220256d79bd6fba85095489d7c0e3f24b75be23cfaf05ee6ab9c528f406109dbbd60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023ee60d8c7d441ceeca1ffbdc4f56244ce8f10f3e8b487645edd14016881c889c036a730970ac1f42c2a847129b8074f6d74b10590d5e60490fb828afa2b8c2099d82e5c861b0885183dcb788ff1c83408cc58a99cfc4d249aeeb748d3c7f44cff7ae5921df92254fc1c99bbda6b16853f7da2436b4a0baaf7b7e689ab759b2194b73bd0427a8bd95ce27d38690e54ce39aa844a8dda6a97218b442a0878a9bc3d2c060d2d3c8cf9e36783e5497650303d37d5453c9c6d0926cf76a370ad83717f961bd1b1cdab34bac0da5831c13aa1226b14c10814886e9bef5592a2a6e9f5e4372b6b9e9a9e21ab6cdd090d089eb4609da8786d616f90ff95e59070a8b1006246a319240edc20b250f70e1e6e55d8222ad418241ff9f9a0293f3bc882300a4ea5e5b6aaeb88cffd48c13b2c88cca75a3cddbd5270fe75414f1883aa2ec4d3aeb639b9da4fe6c78326e59d150903bc91bbc11cab503a454d1bc2a2e2cd3de07c85fc4e8e452aa8537971c0628782a6d70d44d3bafd128eeef9a37aa9251e520431df436e9378abc608778865c2c846181be91c8849472de32932c05ab81e1a6ae5075262debe1b85012d97cefa31938ad64dd77ea19c40f13c5ee6024cbd03000000040000000000000000000000000000000000000000000000000000000000000000000bec1fd4011aa83c59acd86d58ab99eaa35b70f1690b4ad9afb9f8cfd4a257b182ae981240023013a96777ce4d970980a65a1048bc8a6eeae3e4a6fcf449e791d8ee3fbe1f610dcb1aaebecad5866836c09fdde8d93d1ea671fa9e324b1c3b1e9ea3ef3a5000000000000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000229000002250000022100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f948c8bf51a7de2c2da6bf1283523798b287a9096978034feb5b82980e4ed1e169db6aba80147848d525f49d5f0e8d44e471ce2b8a535ac069b52be98d59e543cbc5b532b3031ebb4071443b21a786005a2712bd387e0f51a13b350fb5691ace3f3fd3bfa7c8e9d12c10171169c65f409a500ebd6b04bd8c96c67ddfd08fce9aae74d044dd44c044d4319fbbb106f2f1401cb1b46f9ababd6754c56221c5f75c30e48088c7c0de5323208f33304f0128cca188cd5d58064ea879673b5ee577b5893348f32ab5b14b3721efd8992d4bc39093c8be9fb7883ee09771c148ef26ee8e7eb9958e589e812b9f20349402b1f95886dc59b9eb2a9d5a95a5b9f9642aece9a39a2fdd6cf91be31f855471db43c19371459f116088035264d90bcd574116bf7825a0cea84018c72bbd2d5bc0ea013f1865fd53eb7d5a81893303059be22af5c2b59153674e16161c1d3a85dd3ca481d1e4ddfcd74a3a49037d9d222ab8a61f719cef86ddbb3cd6f873b20f8625add0ad41d6748e8ceead66c395f9df4cba24c2231cd88ba42c8dd4ec9897ab9bc8ceffd01eb21ae25ebb1bcffc034c0866178d3472d9be5128f4d0c063a56b07a53a1a316439a514fa604cef70c62bd502c1b7b3b41e3c6c6f974d4ea14958da975738f4a644953bf6afbbd94b64a247f000002280000022400000220209f5e7a99fb58f453e6cda0de73393b2ee17b5bf05ba7509a81bb4f78a7c609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b9a208ec155240851dd9e49c7bc736163deea776c683d88933175ccb24a01f7c772e6f83b15cd1c6feb8010fb805c5357c340c7ad8840a45571552263df2ec9ed08c994da5d198eeab6471a7bd516341a556a06f775eeac67e7e42bb5b59225c67da0922e3e04ad3e66a947a9a31242fed5e1ea54c12c82d83b502ca24f5d161a865e99f6b2d1aedd7acd42254c2e29ff3ba9de99ffd87bee4de43a1c6fb07d1a67b551b298728031d25486dbbd01df03e30899120f32024cbd36acbb25bc55f9064511761761b6909e68d0d2b780f868e0188dd97d304c0c42fe697e453cfaaf8f6dc94b3fc865e65c2fe5d64357190ef2938b7c55998a7c597f2cac5ee18c98ef83af77f7425d00cef916a0710d34df94f072de87172bba1e6b878c3c9e5488e0b3e0ba880391a7e917819e2ed79b1fc5aacaeadbc8ebfecaabe695b9de06581907cc889c3d7636044caac029a647f496451e72fa393aabeb9a6166c5a126c8adf81a23a7d69ddf97991aa7bb582c66857b471dca10323ce80e995b7d8c1edb6c7e05f89d83e13f56bf839890b4693f1d1f0d16e58b73a2c38bb1e261884ad007f8fe480e19b93cfc376a4d02adf8a023eda2cbf032b587a159f8452d4a520000000400000000" ] } diff --git a/yarn-project/end-to-end/src/fixtures/utils.ts b/yarn-project/end-to-end/src/fixtures/utils.ts index c7308bf8826..d13ba870ca2 100644 --- a/yarn-project/end-to-end/src/fixtures/utils.ts +++ b/yarn-project/end-to-end/src/fixtures/utils.ts @@ -49,12 +49,12 @@ import { InboxBytecode, OutboxAbi, OutboxBytecode, - PortalERC20Abi, - PortalERC20Bytecode, RegistryAbi, RegistryBytecode, RollupAbi, RollupBytecode, + TestERC20Abi, + TestERC20Bytecode, } from '@aztec/l1-artifacts'; import { AuthRegistryContract, RouterContract } from '@aztec/noir-contracts.js'; import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice'; @@ -113,7 +113,9 @@ export const setupL1Contracts = async ( l1RpcUrl: string, account: HDAccount | PrivateKeyAccount, logger: DebugLogger, - args: { salt?: number; initialValidators?: EthAddress[] } = {}, + args: { salt?: number; initialValidators?: EthAddress[]; assumeProvenThrough?: number } = { + assumeProvenThrough: Number.MAX_SAFE_INTEGER, + }, chain: Chain = foundry, ) => { const l1Artifacts: L1ContractArtifactsForDeployment = { @@ -134,8 +136,8 @@ export const setupL1Contracts = async ( contractBytecode: RollupBytecode, }, feeJuice: { - contractAbi: PortalERC20Abi, - contractBytecode: PortalERC20Bytecode, + contractAbi: TestERC20Abi, + contractBytecode: TestERC20Bytecode, }, feeJuicePortal: { contractAbi: FeeJuicePortalAbi, @@ -148,6 +150,7 @@ export const setupL1Contracts = async ( vkTreeRoot: getVKTreeRoot(), salt: args.salt, initialValidators: args.initialValidators, + assumeProvenThrough: args.assumeProvenThrough, }); return l1Data; @@ -238,7 +241,7 @@ async function setupWithRemoteEnvironment( walletClient, publicClient, }; - const cheatCodes = CheatCodes.create(config.l1RpcUrl, pxeClient!); + const cheatCodes = await CheatCodes.create(config.l1RpcUrl, pxeClient!); const teardown = () => Promise.resolve(); const { l1ChainId: chainId, protocolVersion } = await pxeClient.getNodeInfo(); @@ -459,7 +462,7 @@ export async function setup( } const wallets = numberOfAccounts > 0 ? await createAccounts(pxe, numberOfAccounts) : []; - const cheatCodes = CheatCodes.create(config.l1RpcUrl, pxe!); + const cheatCodes = await CheatCodes.create(config.l1RpcUrl, pxe!); const teardown = async () => { if (aztecNode instanceof AztecNodeService) { diff --git a/yarn-project/end-to-end/src/guides/dapp_testing.test.ts b/yarn-project/end-to-end/src/guides/dapp_testing.test.ts index bc5a5da0390..c6454eb24a4 100644 --- a/yarn-project/end-to-end/src/guides/dapp_testing.test.ts +++ b/yarn-project/end-to-end/src/guides/dapp_testing.test.ts @@ -149,7 +149,7 @@ describe('guides/dapp/testing', () => { await token.methods.redeem_shield(ownerAddress, 100n, secret).send().wait(); // docs:start:calc-slot - cheats = CheatCodes.create(ETHEREUM_HOST, pxe); + cheats = await CheatCodes.create(ETHEREUM_HOST, pxe); // The balances mapping is indexed by user address ownerSlot = cheats.aztec.computeSlotInMap(TokenContract.storage.balances.slot, ownerAddress); // docs:end:calc-slot diff --git a/yarn-project/end-to-end/src/guides/up_quick_start.sh b/yarn-project/end-to-end/src/guides/up_quick_start.sh index c1776e355d9..536dd917f53 100755 --- a/yarn-project/end-to-end/src/guides/up_quick_start.sh +++ b/yarn-project/end-to-end/src/guides/up_quick_start.sh @@ -1,74 +1,60 @@ +#!/bin/bash # Run locally from end-to-end folder while running anvil and sandbox with: # PATH=$PATH:../node_modules/.bin ./src/guides/up_quick_start.sh - set -eux +LOCATION=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +export WALLET_DATA_DIRECTORY="${LOCATION}/up_quick_start" + +aztec-wallet() { + node --no-warnings ../cli-wallet/dest/bin/index.js "$@" +} + # docs:start:declare-accounts -ACCOUNTS=$(aztec-cli get-accounts --json | jq -r '.[].address') -ALICE=$(echo "$ACCOUNTS" | sed -n 1p) -BOB=$(echo "$ACCOUNTS" | sed -n 2p) -ALICE_PRIVATE_KEY="0x2153536ff6628eee01cf4024889ff977a18d9fa61d0e414422f7681cf085c281" +aztec-wallet create-account -a alice +aztec-wallet create-account -a bob # docs:end:declare-accounts # docs:start:deploy -CONTRACT=$(aztec-cli deploy TokenContractArtifact --private-key $ALICE_PRIVATE_KEY --salt 0 --args $ALICE "TokenName" "TKN" 18 --json | jq -r '.address') -echo "Deployed contract at $CONTRACT" -aztec-cli check-deploy --contract-address $CONTRACT +DEPLOY_OUTPUT=$(aztec-wallet deploy ../noir-contracts.js/artifacts/token_contract-Token.json --args accounts:alice Test TST 18 -f alice) +TOKEN_ADDRESS=$(echo "$DEPLOY_OUTPUT" | grep -oE 'Contract deployed at 0x[0-9a-fA-F]+' | cut -d ' ' -f4) +echo "Deployed contract at $TOKEN_ADDRESS" # docs:end:deploy # docs:start:mint-private -SECRET="0x29bf6afaf29f61cbcf2a4fa7da97be481fb418dc08bdab5338839974beb7b49f" -SECRET_HASH="0x0921759afa747c9073f75df9688a17d271cef0d6ec51eacf70e112402c4db6cd" +MINT_AMOUNT=69 +aztec-wallet create-secret -a shield -MINT_PRIVATE_OUTPUT=$(aztec-cli send mint_private \ - --args 1000 $SECRET_HASH \ - --contract-artifact TokenContractArtifact \ - --contract-address $CONTRACT \ - --private-key $ALICE_PRIVATE_KEY) +aztec-wallet send mint_private -ca last --args $MINT_AMOUNT secrets:shield:hash -f alice -MINT_PRIVATE_TX_HASH=$(echo "$MINT_PRIVATE_OUTPUT" | grep "Transaction hash:" | awk '{print $NF}') +aztec-wallet add-note TransparentNote pending_shields -ca last -t last -a alice -b $MINT_AMOUNT secrets:shield:hash -aztec-cli add-note \ - $ALICE $CONTRACT 5 84114971101151129711410111011678111116101 $MINT_PRIVATE_TX_HASH \ - --note 1000 $SECRET_HASH - -aztec-cli send redeem_shield \ - --args $ALICE 1000 $SECRET \ - --contract-artifact TokenContractArtifact \ - --contract-address $CONTRACT \ - --private-key $ALICE_PRIVATE_KEY +aztec-wallet send redeem_shield -ca last --args accounts:alice $MINT_AMOUNT secrets:shield -f alice # docs:end:mint-private # docs:start:get-balance -aztec-cli call balance_of_private \ - --args $ALICE \ - --contract-artifact TokenContractArtifact \ - --contract-address $CONTRACT +ALICE_BALANCE=$(aztec-wallet simulate balance_of_private -ca last --args accounts:alice -f alice) +if ! echo $ALICE_BALANCE | grep -q $MINT_AMOUNT; then + echo "Incorrect Alice balance after transaction (expected $MINT_AMOUNT but got $ALICE_BALANCE)" + exit 1 +fi # docs:end:get-balance # docs:start:transfer -aztec-cli send transfer \ - --args $ALICE $BOB 500 0 \ - --contract-artifact TokenContractArtifact \ - --contract-address $CONTRACT \ - --private-key $ALICE_PRIVATE_KEY +TRANSFER_AMOUNT=42 -aztec-cli call balance_of_private \ - --args $ALICE \ - --contract-artifact TokenContractArtifact \ - --contract-address $CONTRACT - -aztec-cli call balance_of_private \ - --args $BOB \ - --contract-artifact TokenContractArtifact \ - --contract-address $CONTRACT +aztec-wallet send transfer -ca last --args accounts:bob $TRANSFER_AMOUNT -f alice # docs:end:transfer -aztec-cli get-logs - # Test end result -BOB_BALANCE=$(aztec-cli call balance_of_private --args $BOB --contract-artifact TokenContractArtifact --contract-address $CONTRACT) -if ! echo $BOB_BALANCE | grep -q 500; then - echo "Incorrect Bob balance after transaction (expected 500 but got $BOB_BALANCE)" +ALICE_BALANCE=$(aztec-wallet simulate balance_of_private -ca last --args accounts:alice -f alice) +if ! echo $ALICE_BALANCE | grep -q "$(($MINT_AMOUNT - $TRANSFER_AMOUNT))"; then + echo "Incorrect Alice balance after transaction (expected 27 but got $ALICE_BALANCE)" + exit 1 +fi + +BOB_BALANCE=$(aztec-wallet simulate balance_of_private -ca last --args accounts:bob -f bob) +if ! echo $BOB_BALANCE | grep -q $TRANSFER_AMOUNT; then + echo "Incorrect Bob balance after transaction (expected $TRANSFER_AMOUNT but got $BOB_BALANCE)" exit 1 fi diff --git a/yarn-project/end-to-end/src/guides/up_quick_start.test.ts b/yarn-project/end-to-end/src/guides/up_quick_start.test.ts index 03c46a0ff43..15f31c364e2 100644 --- a/yarn-project/end-to-end/src/guides/up_quick_start.test.ts +++ b/yarn-project/end-to-end/src/guides/up_quick_start.test.ts @@ -7,14 +7,11 @@ const { PXE_URL = '' } = process.env; // Entrypoint for running the up-quick-start script on the CI describe('guides/up_quick_start', () => { // TODO: update to not use CLI - it.skip('works', async () => { + it('works', async () => { await waitForPXE(createPXEClient(PXE_URL)); - execSync( - `DEBUG="aztec:*" PXE_URL=\${PXE_URL:-http://localhost:8080} PATH=$PATH:../node_modules/.bin ./src/guides/up_quick_start.sh`, - { - shell: '/bin/bash', - stdio: 'inherit', - }, - ); + execSync(`DEBUG="aztec:*" PXE_URL=\${PXE_URL:-http://localhost:8080} ./src/guides/up_quick_start.sh`, { + shell: '/bin/bash', + stdio: 'inherit', + }); }); }); diff --git a/yarn-project/end-to-end/src/prover-coordination/e2e_prover_coordination.test.ts b/yarn-project/end-to-end/src/prover-coordination/e2e_prover_coordination.test.ts new file mode 100644 index 00000000000..18390ba385a --- /dev/null +++ b/yarn-project/end-to-end/src/prover-coordination/e2e_prover_coordination.test.ts @@ -0,0 +1,301 @@ +import { getSchnorrAccount } from '@aztec/accounts/schnorr'; +import { + type AccountWalletWithSecretKey, + type DebugLogger, + EpochProofQuote, + EpochProofQuotePayload, + EthCheatCodes, + createDebugLogger, +} from '@aztec/aztec.js'; +import { AZTEC_EPOCH_DURATION, AZTEC_SLOT_DURATION, type AztecAddress, EthAddress } from '@aztec/circuits.js'; +import { Buffer32 } from '@aztec/foundation/buffer'; +import { times } from '@aztec/foundation/collection'; +import { Secp256k1Signer, keccak256, randomBigInt, randomInt } from '@aztec/foundation/crypto'; +import { RollupAbi } from '@aztec/l1-artifacts'; +import { StatefulTestContract } from '@aztec/noir-contracts.js'; + +import { beforeAll } from '@jest/globals'; +import { + type Account, + type Chain, + type GetContractReturnType, + type HttpTransport, + type PublicClient, + type WalletClient, + getAddress, + getContract, +} from 'viem'; + +import { + type ISnapshotManager, + type SubsystemsContext, + addAccounts, + createSnapshotManager, +} from '../fixtures/snapshot_manager.js'; + +describe('e2e_prover_coordination', () => { + let ctx: SubsystemsContext; + let wallet: AccountWalletWithSecretKey; + let recipient: AztecAddress; + let contract: StatefulTestContract; + let rollupContract: GetContractReturnType>; + let publicClient: PublicClient; + let cc: EthCheatCodes; + let publisherAddress: EthAddress; + + let logger: DebugLogger; + let snapshotManager: ISnapshotManager; + + beforeAll(async () => { + logger = createDebugLogger('aztec:prover_coordination:e2e_json_coordination'); + snapshotManager = createSnapshotManager( + `prover_coordination/e2e_json_coordination`, + process.env.E2E_DATA_PATH, + {}, + { + assumeProvenThrough: undefined, + }, + ); + + await snapshotManager.snapshot('setup', addAccounts(2, logger), async ({ accountKeys }, ctx) => { + const accountManagers = accountKeys.map(ak => getSchnorrAccount(ctx.pxe, ak[0], ak[1], 1)); + await Promise.all(accountManagers.map(a => a.register())); + const wallets = await Promise.all(accountManagers.map(a => a.getWallet())); + wallets.forEach((w, i) => logger.verbose(`Wallet ${i} address: ${w.getAddress()}`)); + wallet = wallets[0]; + recipient = wallets[1].getAddress(); + }); + + await snapshotManager.snapshot( + 'deploy-test-contract', + async () => { + const owner = wallet.getAddress(); + const contract = await StatefulTestContract.deploy(wallet, owner, owner, 42).send().deployed(); + return { contractAddress: contract.address }; + }, + async ({ contractAddress }) => { + contract = await StatefulTestContract.at(contractAddress, wallet); + }, + ); + + ctx = await snapshotManager.setup(); + + await ctx.proverNode.stop(); + + cc = new EthCheatCodes(ctx.aztecNodeConfig.l1RpcUrl); + + publicClient = ctx.deployL1ContractsValues.publicClient; + publisherAddress = EthAddress.fromString(ctx.deployL1ContractsValues.walletClient.account.address); + rollupContract = getContract({ + address: getAddress(ctx.deployL1ContractsValues.l1ContractAddresses.rollupAddress.toString()), + abi: RollupAbi, + client: ctx.deployL1ContractsValues.walletClient, + }); + }); + + const expectProofClaimOnL1 = async (expected: { + epochToProve: bigint; + basisPointFee: number; + bondAmount: bigint; + proposer: EthAddress; + prover: EthAddress; + }) => { + const [epochToProve, basisPointFee, bondAmount, prover, proposer] = await rollupContract.read.proofClaim(); + expect(epochToProve).toEqual(expected.epochToProve); + expect(basisPointFee).toEqual(BigInt(expected.basisPointFee)); + expect(bondAmount).toEqual(expected.bondAmount); + expect(prover).toEqual(expected.prover.toChecksumString()); + expect(proposer).toEqual(expected.proposer.toChecksumString()); + }; + + const getL1Timestamp = async () => { + return BigInt((await publicClient.getBlock()).timestamp); + }; + + const getSlot = async () => { + const ts = await getL1Timestamp(); + return await rollupContract.read.getSlotAt([ts]); + }; + + const getEpoch = async () => { + const slotNumber = await getSlot(); + return await rollupContract.read.getEpochAtSlot([slotNumber]); + }; + + const getPendingBlockNumber = async () => { + return await rollupContract.read.getPendingBlockNumber(); + }; + + const getProvenBlockNumber = async () => { + return await rollupContract.read.getProvenBlockNumber(); + }; + + const getEpochToProve = async () => { + return await rollupContract.read.getEpochToProve().catch(e => { + if (e instanceof Error && e.message.includes('NoEpochToProve')) { + return undefined; + } + }); + }; + + const logState = async () => { + logger.info(`Pending block: ${await getPendingBlockNumber()}`); + logger.info(`Proven block: ${await getProvenBlockNumber()}`); + logger.info(`Slot number: ${await getSlot()}`); + logger.info(`Epoch number: ${await getEpoch()}`); + logger.info(`Epoch to prove ${await getEpochToProve()}`); + }; + + const advanceToNextEpoch = async () => { + const slot = await getSlot(); + const slotsUntilNextEpoch = BigInt(AZTEC_EPOCH_DURATION) - (slot % BigInt(AZTEC_EPOCH_DURATION)) + 1n; + const timeToNextEpoch = slotsUntilNextEpoch * BigInt(AZTEC_SLOT_DURATION); + const l1Timestamp = await getL1Timestamp(); + await cc.warp(Number(l1Timestamp + timeToNextEpoch)); + await logState(); + }; + + const makeEpochProofQuote = async ({ + epochToProve, + validUntilSlot, + bondAmount, + prover, + basisPointFee, + signer, + }: { + epochToProve: bigint; + validUntilSlot?: bigint; + bondAmount?: bigint; + prover?: EthAddress; + basisPointFee?: number; + signer?: Secp256k1Signer; + }) => { + signer ??= new Secp256k1Signer(Buffer32.fromBuffer(keccak256(Buffer.from('cow')))); + const quotePayload: EpochProofQuotePayload = new EpochProofQuotePayload( + epochToProve, + validUntilSlot ?? randomBigInt(10000n), + bondAmount ?? randomBigInt(10000n) + 1000n, + prover ?? EthAddress.fromString('0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826'), + basisPointFee ?? randomInt(100), + ); + const digest = await rollupContract.read.quoteToDigest([quotePayload.toViemArgs()]); + return EpochProofQuote.new(Buffer32.fromString(digest), quotePayload, signer); + }; + + it('Sequencer selects best valid proving quote for each block', async () => { + // We want to create a set of proving quotes, some valid and some invalid + // The sequencer should select the cheapest valid quote when it proposes the block + + // Here we are creating a proof quote for epoch 0, this will NOT get used yet + const quoteForEpoch0 = await makeEpochProofQuote({ + epochToProve: 0n, + validUntilSlot: BigInt(AZTEC_EPOCH_DURATION + 10), + bondAmount: 10000n, + basisPointFee: 1, + }); + + // Send in the quote + await ctx.proverNode.sendEpochProofQuote(quoteForEpoch0); + + // Build a block, this should NOT use the above quote as it is for the current epoch (0) + await contract.methods.create_note(recipient, recipient, 10).send().wait(); + + await logState(); + + const epoch0BlockNumber = await getPendingBlockNumber(); + + // Verify that the claim state on L1 is unitialised + // The rollup contract should have an uninitialised proof claim struct + await expectProofClaimOnL1({ + epochToProve: 0n, + basisPointFee: 0, + bondAmount: 0n, + prover: EthAddress.ZERO, + proposer: EthAddress.ZERO, + }); + + // Now go to epoch 1 + await advanceToNextEpoch(); + + await logState(); + + // Build a block in epoch 1, we should see the quote for epoch 0 submitted earlier published to L1 + await contract.methods.create_note(recipient, recipient, 10).send().wait(); + + const epoch1BlockNumber = await getPendingBlockNumber(); + + // Check it was published + await expectProofClaimOnL1({ ...quoteForEpoch0.payload, proposer: publisherAddress }); + + // now 'prove' epoch 0 + await rollupContract.write.setAssumeProvenThroughBlockNumber([BigInt(epoch0BlockNumber)]); + + await logState(); + + // Now go to epoch 2 + await advanceToNextEpoch(); + + const currentSlot = await getSlot(); + + // Now create a number of quotes, some valid some invalid for epoch 1, the lowest priced valid quote should be chosen + const validQuotes = await Promise.all( + times(3, (i: number) => + makeEpochProofQuote({ + epochToProve: 1n, + validUntilSlot: currentSlot + 2n, + bondAmount: 10000n, + basisPointFee: 10 + i, + }), + ), + ); + + const proofQuoteInvalidSlot = await makeEpochProofQuote({ + epochToProve: 1n, + validUntilSlot: 3n, + bondAmount: 10000n, + basisPointFee: 1, + }); + + const proofQuoteInvalidEpoch = await makeEpochProofQuote({ + epochToProve: 2n, + validUntilSlot: currentSlot + 4n, + bondAmount: 10000n, + basisPointFee: 2, + }); + + const proofQuoteInsufficientBond = await makeEpochProofQuote({ + epochToProve: 1n, + validUntilSlot: currentSlot + 4n, + bondAmount: 0n, + basisPointFee: 3, + }); + + const allQuotes = [proofQuoteInvalidSlot, proofQuoteInvalidEpoch, ...validQuotes, proofQuoteInsufficientBond]; + + await Promise.all(allQuotes.map(x => ctx.proverNode.sendEpochProofQuote(x))); + + // now build another block and we should see the best valid quote being published + await contract.methods.create_note(recipient, recipient, 10).send().wait(); + + const expectedQuote = validQuotes[0]; + + await expectProofClaimOnL1({ ...expectedQuote.payload, proposer: publisherAddress }); + + // building another block should succeed, we should not try and submit another quote + await contract.methods.create_note(recipient, recipient, 10).send().wait(); + + await expectProofClaimOnL1({ ...expectedQuote.payload, proposer: publisherAddress }); + + // now 'prove' epoch 1 + await rollupContract.write.setAssumeProvenThroughBlockNumber([BigInt(epoch1BlockNumber)]); + + // Now go to epoch 3 + await advanceToNextEpoch(); + + // now build another block and we should see that no claim is published as nothing is valid + await contract.methods.create_note(recipient, recipient, 10).send().wait(); + + // The quote state on L1 is the same as before + await expectProofClaimOnL1({ ...expectedQuote.payload, proposer: publisherAddress }); + }); +}); diff --git a/yarn-project/end-to-end/src/public-testnet/e2e_public_testnet_transfer.test.ts b/yarn-project/end-to-end/src/public-testnet/e2e_public_testnet_transfer.test.ts index 27a86df2787..08636379f64 100644 --- a/yarn-project/end-to-end/src/public-testnet/e2e_public_testnet_transfer.test.ts +++ b/yarn-project/end-to-end/src/public-testnet/e2e_public_testnet_transfer.test.ts @@ -60,12 +60,7 @@ describe(`deploys and transfers a private only token`, () => { logger.info(`Deploying accounts.`); - const accounts = await createAccounts(pxe, 2, [secretKey1, secretKey2], { - interval: 0.1, - proven: true, - provenTimeout: 600, - timeout: 300, - }); + const accounts = await createAccounts(pxe, 2, [secretKey1, secretKey2], { interval: 0.1, timeout: 300 }); logger.info(`Accounts deployed, deploying token.`); @@ -84,18 +79,14 @@ describe(`deploys and transfers a private only token`, () => { skipInitialization: false, skipPublicSimulation: true, }) - .deployed({ - proven: true, - provenTimeout: 600, - timeout: 300, - }); + .deployed({ timeout: 300 }); logger.info(`Performing transfer.`); await token.methods .transfer(transferValue, deployerWallet.getAddress(), recipientWallet.getAddress(), deployerWallet.getAddress()) .send() - .wait({ proven: true, provenTimeout: 600, timeout: 300 }); + .wait({ timeout: 300 }); logger.info(`Transfer completed`); diff --git a/yarn-project/end-to-end/src/sample-dapp/ci/index.test.mjs b/yarn-project/end-to-end/src/sample-dapp/ci/index.test.mjs index 5544f249352..c936adc2b32 100644 --- a/yarn-project/end-to-end/src/sample-dapp/ci/index.test.mjs +++ b/yarn-project/end-to-end/src/sample-dapp/ci/index.test.mjs @@ -3,7 +3,7 @@ import { createPXEClient, waitForPXE } from '@aztec/aztec.js'; import { deploy } from '../deploy.mjs'; import { main } from '../index.mjs'; -const { PXE_URL = '' } = process.env; +const { PXE_URL = 'http://localhost:8080' } = process.env; // Tests on our CI that all scripts included in the guide work fine describe('sample-dapp', () => { diff --git a/yarn-project/end-to-end/src/sample-dapp/contracts.mjs b/yarn-project/end-to-end/src/sample-dapp/contracts.mjs index 06d62766d49..68e424b2ad1 100644 --- a/yarn-project/end-to-end/src/sample-dapp/contracts.mjs +++ b/yarn-project/end-to-end/src/sample-dapp/contracts.mjs @@ -1,11 +1,11 @@ -import { AztecAddress, Contract, loadContractArtifact } from '@aztec/aztec.js'; -import TokenContractJson from '@aztec/noir-contracts.js/artifacts/token_contract-Token' assert { type: 'json' }; +import { AztecAddress } from '@aztec/aztec.js'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { readFileSync } from 'fs'; // docs:start:get-tokens export async function getToken(client) { const addresses = JSON.parse(readFileSync('addresses.json')); - return Contract.at(AztecAddress.fromString(addresses.token), loadContractArtifact(TokenContractJson), client); + return TokenContract.at(AztecAddress.fromString(addresses.token), client); } // docs:end:get-tokens diff --git a/yarn-project/end-to-end/src/sample-dapp/deploy.mjs b/yarn-project/end-to-end/src/sample-dapp/deploy.mjs index d415f1bc2e3..1ee4352071f 100644 --- a/yarn-project/end-to-end/src/sample-dapp/deploy.mjs +++ b/yarn-project/end-to-end/src/sample-dapp/deploy.mjs @@ -1,6 +1,6 @@ import { getInitialTestAccountsWallets } from '@aztec/accounts/testing'; -import { Contract, createPXEClient, loadContractArtifact } from '@aztec/aztec.js'; -import TokenContractJson from '@aztec/noir-contracts.js/artifacts/token_contract-Token' assert { type: 'json' }; +import { Contract, createPXEClient, loadContractArtifact, waitForPXE } from '@aztec/aztec.js'; +import { TokenContract, TokenContractArtifact } from '@aztec/noir-contracts.js'; import { writeFileSync } from 'fs'; import { fileURLToPath } from 'url'; @@ -10,13 +10,12 @@ const { PXE_URL = 'http://localhost:8080' } = process.env; async function main() { const pxe = createPXEClient(PXE_URL); + await waitForPXE(pxe); + const [ownerWallet] = await getInitialTestAccountsWallets(pxe); - const ownerAddress = ownerWallet.getCompleteAddress(); + const ownerAddress = ownerWallet.getAddress(); - const TokenContractArtifact = loadContractArtifact(TokenContractJson); - const token = await Contract.deploy(ownerWallet, TokenContractArtifact, [ownerAddress, 'TokenName', 'TKN', 18]) - .send() - .deployed(); + const token = await TokenContract.deploy(ownerWallet, ownerAddress, 'TokenName', 'TKN', 18).send().deployed(); console.log(`Token deployed at ${token.address.toString()}`); diff --git a/yarn-project/end-to-end/src/sample-dapp/index.mjs b/yarn-project/end-to-end/src/sample-dapp/index.mjs index f575fe89569..bb5dd6d84e2 100644 --- a/yarn-project/end-to-end/src/sample-dapp/index.mjs +++ b/yarn-project/end-to-end/src/sample-dapp/index.mjs @@ -1,6 +1,7 @@ import { getInitialTestAccountsWallets } from '@aztec/accounts/testing'; -import { ExtendedNote, Fr, Note, computeSecretHash, createPXEClient } from '@aztec/aztec.js'; +import { ExtendedNote, Fr, Note, computeSecretHash, createPXEClient, waitForPXE } from '@aztec/aztec.js'; import { fileURLToPath } from '@aztec/foundation/url'; +import { TokenContract, TokenContractArtifact } from '@aztec/noir-contracts.js/Token'; import { getToken } from './contracts.mjs'; @@ -14,9 +15,11 @@ async function showAccounts(pxe) { } async function showPrivateBalances(pxe) { + const [owner] = await getInitialTestAccountsWallets(pxe); + const token = await getToken(owner); + // docs:start:showPrivateBalances const accounts = await pxe.getRegisteredAccounts(); - const token = await getToken(pxe); for (const account of accounts) { // highlight-next-line:showPrivateBalances @@ -37,19 +40,16 @@ async function mintPrivateFunds(pxe) { const secretHash = await computeSecretHash(secret); const receipt = await token.methods.mint_private(mintAmount, secretHash).send().wait(); - const storageSlot = token.artifact.storageLayout['pending_shields'].slot; - const noteTypeId = token.artifact.notes['TransparentNote'].id; - const note = new Note([new Fr(mintAmount), secretHash]); const extendedNote = new ExtendedNote( note, owner.getAddress(), token.address, - storageSlot, - noteTypeId, + TokenContract.storage.pending_shields.slot, + TokenContract.notes.TransparentNote.id, receipt.txHash, ); - await pxe.addNote(extendedNote); + await pxe.addNote(extendedNote, owner.getAddress()); await token.methods.redeem_shield(owner.getAddress(), mintAmount, secret).send().wait(); @@ -61,21 +61,21 @@ async function transferPrivateFunds(pxe) { const [owner, recipient] = await getInitialTestAccountsWallets(pxe); const token = await getToken(owner); - const tx = token.methods.transfer(owner.getAddress(), recipient.getAddress(), 1n, 0).send(); - console.log(`Sent transfer transaction ${await tx.getTxHash()}`); await showPrivateBalances(pxe); + console.log(`Sending transaction, awaiting transaction to be mined`); + const receipt = await token.methods.transfer(recipient.getAddress(), 1).send().wait(); - console.log(`Awaiting transaction to be mined`); - const receipt = await tx.wait(); - console.log(`Transaction has been mined on block ${receipt.blockNumber}`); + console.log(`Transaction ${receipt.txHash} has been mined on block ${receipt.blockNumber}`); await showPrivateBalances(pxe); // docs:end:transferPrivateFunds } async function showPublicBalances(pxe) { + const [owner] = await getInitialTestAccountsWallets(pxe); + const token = await getToken(owner); + // docs:start:showPublicBalances const accounts = await pxe.getRegisteredAccounts(); - const token = await getToken(pxe); for (const account of accounts) { // highlight-next-line:showPublicBalances @@ -90,13 +90,12 @@ async function mintPublicFunds(pxe) { const [owner] = await getInitialTestAccountsWallets(pxe); const token = await getToken(owner); - const tx = token.methods.mint_public(owner.getAddress(), 100n).send(); - console.log(`Sent mint transaction ${await tx.getTxHash()}`); await showPublicBalances(pxe); - console.log(`Awaiting transaction to be mined`); - const receipt = await tx.wait(); - console.log(`Transaction has been mined on block ${receipt.blockNumber}`); + console.log(`Sending transaction, awaiting transaction to be mined`); + const receipt = await token.methods.mint_public(owner.getAddress(), 100).send().wait(); + console.log(`Transaction ${receipt.txHash} has been mined on block ${receipt.blockNumber}`); + await showPublicBalances(pxe); // docs:end:mintPublicFunds @@ -110,8 +109,10 @@ async function mintPublicFunds(pxe) { async function main() { const pxe = createPXEClient(PXE_URL); - const { chainId } = await pxe.getNodeInfo(); - console.log(`Connected to chain ${chainId}`); + await waitForPXE(pxe); + + const { l1ChainId } = await pxe.getNodeInfo(); + console.log(`Connected to chain ${l1ChainId}`); await showAccounts(pxe); diff --git a/yarn-project/end-to-end/src/sample-dapp/index.test.mjs b/yarn-project/end-to-end/src/sample-dapp/index.test.mjs index 49a6156046d..46afdbb31f5 100644 --- a/yarn-project/end-to-end/src/sample-dapp/index.test.mjs +++ b/yarn-project/end-to-end/src/sample-dapp/index.test.mjs @@ -1,49 +1,48 @@ import { createAccount } from '@aztec/accounts/testing'; import { Contract, ExtendedNote, Fr, Note, computeSecretHash, createPXEClient, waitForPXE } from '@aztec/aztec.js'; -import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token'; +import { TokenContract, TokenContractArtifact } from '@aztec/noir-contracts.js/Token'; const { PXE_URL = 'http://localhost:8080', ETHEREUM_HOST = 'http://localhost:8545' } = process.env; describe('token', () => { // docs:start:setup let owner, recipient, token; + beforeAll(async () => { const pxe = createPXEClient(PXE_URL); await waitForPXE(pxe); owner = await createAccount(pxe); recipient = await createAccount(pxe); - token = await Contract.deploy(owner, TokenContractArtifact, [owner.getCompleteAddress(), 'TokenName', 'TKN', 18]) - .send() - .deployed(); + token = await TokenContract.deploy(owner, owner.getAddress(), 'TokenName', 'TKN', 18).send().deployed(); - const initialBalance = 20n; + const initialBalance = 69; const secret = Fr.random(); const secretHash = await computeSecretHash(secret); const receipt = await token.methods.mint_private(initialBalance, secretHash).send().wait(); - const storageSlot = token.artifact.storageLayout['pending_shields'].slot; - const noteTypeId = token.artifact.notes['TransparentNote'].id; const note = new Note([new Fr(initialBalance), secretHash]); const extendedNote = new ExtendedNote( note, owner.getAddress(), token.address, - storageSlot, - noteTypeId, + TokenContract.storage.pending_shields.slot, + TokenContract.notes.TransparentNote.id, receipt.txHash, ); - await pxe.addNote(extendedNote); + await pxe.addNote(extendedNote, owner.getAddress()); - await token.methods.redeem_shield({ address: owner.getAddress() }, initialBalance, secret).send().wait(); + await token.methods.redeem_shield(owner.getAddress(), initialBalance, secret).send().wait(); }, 120_000); // docs:end:setup // docs:start:test it('increases recipient funds on transfer', async () => { - expect(await token.methods.balance_of_private(recipient.getAddress()).simulate()).toEqual(0n); - await token.methods.transfer(owner.getAddress(), recipient.getAddress(), 20n, 0).send().wait(); - expect(await token.methods.balance_of_private(recipient.getAddress()).simulate()).toEqual(20n); + expect(await token.withWallet(recipient).methods.balance_of_private(recipient.getAddress()).simulate()).toEqual(0n); + await token.methods.transfer(recipient.getAddress(), 20).send().wait(); + expect(await token.withWallet(recipient).methods.balance_of_private(recipient.getAddress()).simulate()).toEqual( + 20n, + ); }, 30_000); // docs:end:test }); diff --git a/yarn-project/end-to-end/src/shared/cross_chain_test_harness.ts b/yarn-project/end-to-end/src/shared/cross_chain_test_harness.ts index 3f14d4b34c5..bbb2b206b2d 100644 --- a/yarn-project/end-to-end/src/shared/cross_chain_test_harness.ts +++ b/yarn-project/end-to-end/src/shared/cross_chain_test_harness.ts @@ -22,8 +22,8 @@ import { sha256ToField } from '@aztec/foundation/crypto'; import { InboxAbi, OutboxAbi, - PortalERC20Abi, - PortalERC20Bytecode, + TestERC20Abi, + TestERC20Bytecode, TokenPortalAbi, TokenPortalBytecode, } from '@aztec/l1-artifacts'; @@ -82,16 +82,13 @@ export async function deployAndInitializeTokenAndBridgeContracts( underlyingERC20: any; }> { if (!underlyingERC20Address) { - underlyingERC20Address = await deployL1Contract( - walletClient, - publicClient, - PortalERC20Abi, - PortalERC20Bytecode, - ).then(({ address }) => address); + underlyingERC20Address = await deployL1Contract(walletClient, publicClient, TestERC20Abi, TestERC20Bytecode).then( + ({ address }) => address, + ); } const underlyingERC20 = getContract({ address: underlyingERC20Address!.toString(), - abi: PortalERC20Abi, + abi: TestERC20Abi, client: walletClient, }); diff --git a/yarn-project/end-to-end/src/shared/gas_portal_test_harness.ts b/yarn-project/end-to-end/src/shared/gas_portal_test_harness.ts index df75a856c5e..0d61fefecfe 100644 --- a/yarn-project/end-to-end/src/shared/gas_portal_test_harness.ts +++ b/yarn-project/end-to-end/src/shared/gas_portal_test_harness.ts @@ -8,7 +8,7 @@ import { type Wallet, computeSecretHash, } from '@aztec/aztec.js'; -import { FeeJuicePortalAbi, OutboxAbi, PortalERC20Abi } from '@aztec/l1-artifacts'; +import { FeeJuicePortalAbi, OutboxAbi, TestERC20Abi } from '@aztec/l1-artifacts'; import { FeeJuiceContract } from '@aztec/noir-contracts.js'; import { FeeJuiceAddress } from '@aztec/protocol-contracts/fee-juice'; @@ -68,7 +68,7 @@ export class FeeJuicePortalTestingHarnessFactory { const gasL1 = getContract({ address: feeJuiceAddress.toString(), - abi: PortalERC20Abi, + abi: TestERC20Abi, client: walletClient, }); @@ -125,7 +125,7 @@ export class GasBridgingTestHarness implements IGasBridgingTestHarness { /** Token portal instance. */ public tokenPortal: GetContractReturnType>, /** Underlying token for portal tests. */ - public underlyingERC20: GetContractReturnType>, + public underlyingERC20: GetContractReturnType>, /** Message Bridge Outbox. */ public outbox: GetContractReturnType>, /** Viem Public client instance. */ diff --git a/yarn-project/end-to-end/src/spartan/transfer.test.ts b/yarn-project/end-to-end/src/spartan/transfer.test.ts index 704b333d5eb..d32c6d157fa 100644 --- a/yarn-project/end-to-end/src/spartan/transfer.test.ts +++ b/yarn-project/end-to-end/src/spartan/transfer.test.ts @@ -2,11 +2,8 @@ import { getSchnorrAccount } from '@aztec/accounts/schnorr'; import { type AccountWalletWithSecretKey, type AztecAddress, - ExtendedNote, Fr, - Note, type PXE, - computeSecretHash, createCompatibleClient, } from '@aztec/aztec.js'; import { createDebugLogger } from '@aztec/foundation/log'; @@ -66,7 +63,7 @@ describe('token transfer test', () => { logger.verbose(`Recipient Wallet address: ${recipientWallet.getAddress()} registered`); } - const { accountKeys } = await addAccounts(WALLET_COUNT, logger, true)({ pxe }); + const { accountKeys } = await addAccounts(WALLET_COUNT, logger, false)({ pxe }); const accountManagers = accountKeys.map(ak => getSchnorrAccount(pxe, ak[0], ak[1], 1)); wallets = await Promise.all( @@ -99,43 +96,6 @@ describe('token transfer test', () => { wallets.map(w => tokenAdminWallet.methods.mint_public(w.getAddress(), MINT_AMOUNT).send().wait({ timeout: 600 })), ); - logger.verbose(`Minting ${MINT_AMOUNT} private assets to the ${wallets.length} wallets...`); - - const mintSecrets = Array.from({ length: WALLET_COUNT }) - .map(() => Fr.random()) - .map(secret => ({ - secret, - hash: computeSecretHash(secret), - })); - - const txs = await Promise.all( - mintSecrets.map(({ hash }) => - tokenAdminWallet.methods.mint_private(MINT_AMOUNT, hash).send().wait({ timeout: 600 }), - ), - ); - - logger.verbose(`Redeeming private assets...`); - - await Promise.all( - mintSecrets.map(async ({ secret, hash }, i) => { - const wallet = wallets[i]; - const walletAddress = wallet.getAddress(); - const note = new Note([new Fr(MINT_AMOUNT), hash]); - const extendedNote = new ExtendedNote( - note, - walletAddress, - tokenAddress, - TokenContract.storage.pending_shields.slot, - TokenContract.notes.TransparentNote.id, - txs[i].txHash, - ); - - await pxe.addNote(extendedNote, walletAddress); - const token = await TokenContract.at(tokenAddress, wallet); - await token.methods.redeem_shield(walletAddress, MINT_AMOUNT, secret).send().wait({ timeout: 600 }); - }), - ); - logger.verbose(`Minting complete.`); }); @@ -149,23 +109,14 @@ describe('token transfer test', () => { const transferAmount = 1n; wallets.forEach(async w => { - expect(MINT_AMOUNT).toBe( - await (await TokenContract.at(tokenAddress, w)).methods.balance_of_private(w.getAddress()).simulate(), - ); expect(MINT_AMOUNT).toBe(await tokenAdminWallet.methods.balance_of_public(w.getAddress()).simulate()); }); - expect(0n).toBe( - await (await TokenContract.at(tokenAddress, recipientWallet)).methods.balance_of_private(recipient).simulate(), - ); expect(0n).toBe(await tokenAdminWallet.methods.balance_of_public(recipient).simulate()); // For each round, make both private and public transfers for (let i = 1n; i <= ROUNDS; i++) { const txs = await Promise.all([ - ...wallets.map(async w => - (await TokenContract.at(tokenAddress, w)).methods.transfer(recipient, transferAmount), - ), ...wallets.map(async w => ( await TokenContract.at(tokenAddress, w) @@ -179,17 +130,11 @@ describe('token transfer test', () => { } wallets.forEach(async w => { - expect(MINT_AMOUNT - ROUNDS * transferAmount).toBe( - await (await TokenContract.at(tokenAddress, w)).methods.balance_of_private(w.getAddress()).simulate(), - ); expect(MINT_AMOUNT - ROUNDS * transferAmount).toBe( await tokenAdminWallet.methods.balance_of_public(w.getAddress()).simulate(), ); }); - expect(ROUNDS * transferAmount * BigInt(wallets.length)).toBe( - await (await TokenContract.at(tokenAddress, recipientWallet)).methods.balance_of_private(recipient).simulate(), - ); expect(ROUNDS * transferAmount * BigInt(wallets.length)).toBe( await tokenAdminWallet.methods.balance_of_public(recipient).simulate(), ); diff --git a/yarn-project/ethereum/src/deploy_l1_contracts.ts b/yarn-project/ethereum/src/deploy_l1_contracts.ts index 966bb00224f..6fe962560bc 100644 --- a/yarn-project/ethereum/src/deploy_l1_contracts.ts +++ b/yarn-project/ethereum/src/deploy_l1_contracts.ts @@ -91,6 +91,29 @@ export interface L1ContractArtifactsForDeployment { feeJuicePortal: ContractArtifacts; } +export interface DeployL1ContractsArgs { + /** + * The address of the L2 Fee Juice contract. + */ + l2FeeJuiceAddress: AztecAddress; + /** + * The vk tree root. + */ + vkTreeRoot: Fr; + /** + * The block number to assume proven through. + */ + assumeProvenThrough?: number; + /** + * The salt for CREATE2 deployment. + */ + salt: number | undefined; + /** + * The initial validators for the rollup contract. + */ + initialValidators?: EthAddress[]; +} + export type L1Clients = { publicClient: PublicClient; walletClient: WalletClient; @@ -144,13 +167,7 @@ export const deployL1Contracts = async ( chain: Chain, logger: DebugLogger, contractsToDeploy: L1ContractArtifactsForDeployment, - args: { - l2FeeJuiceAddress: AztecAddress; - vkTreeRoot: Fr; - assumeProvenThrough?: number; - salt: number | undefined; - initialValidators?: EthAddress[]; - }, + args: DeployL1ContractsArgs, ): Promise => { // We are assuming that you are running this on a local anvil node which have 1s block times // To align better with actual deployment, we update the block interval to 12s @@ -191,7 +208,6 @@ export const deployL1Contracts = async ( logger.info(`Deployed Gas Portal at ${feeJuicePortalAddress}`); const rollupAddress = await deployer.deploy(contractsToDeploy.rollup, [ - getAddress(registryAddress.toString()), getAddress(feeJuicePortalAddress.toString()), args.vkTreeRoot.toString(), account.address.toString(), @@ -361,6 +377,50 @@ class L1Deployer { } } +/** + * Compiles a contract source code using the provided solc compiler. + * @param fileName - Contract file name (eg UltraHonkVerifier.sol) + * @param contractName - Contract name within the file (eg HonkVerifier) + * @param source - Source code to compile + * @param solc - Solc instance + * @returns ABI and bytecode of the compiled contract + */ +export function compileContract( + fileName: string, + contractName: string, + source: string, + solc: { compile: (source: string) => string }, +): { abi: Narrow; bytecode: Hex } { + const input = { + language: 'Solidity', + sources: { + [fileName]: { + content: source, + }, + }, + settings: { + // we require the optimizer + optimizer: { + enabled: true, + runs: 200, + }, + evmVersion: 'paris', + outputSelection: { + '*': { + '*': ['evm.bytecode.object', 'abi'], + }, + }, + }, + }; + + const output = JSON.parse(solc.compile(JSON.stringify(input))); + + const abi = output.contracts[fileName][contractName].abi; + const bytecode: `0x${string}` = `0x${output.contracts[fileName][contractName].evm.bytecode.object}`; + + return { abi, bytecode }; +} + // docs:start:deployL1Contract /** * Helper function to deploy ETH contracts. diff --git a/yarn-project/foundation/src/collection/array.ts b/yarn-project/foundation/src/collection/array.ts index 6f2262a1af3..b703e66a119 100644 --- a/yarn-project/foundation/src/collection/array.ts +++ b/yarn-project/foundation/src/collection/array.ts @@ -100,3 +100,18 @@ export function unique(arr: T[]): T[] { export function compactArray(arr: (T | undefined)[]): T[] { return arr.filter((x: T | undefined): x is T => x !== undefined); } + +/** + * Returns whether two arrays are equal. The arrays are equal if they have the same length and all elements are equal. + */ +export function areArraysEqual(a: T[], b: T[], eq: (a: T, b: T) => boolean = (a: T, b: T) => a === b): boolean { + if (a.length !== b.length) { + return false; + } + for (let i = 0; i < a.length; i++) { + if (!eq(a[i], b[i])) { + return false; + } + } + return true; +} diff --git a/yarn-project/foundation/src/config/env_var.ts b/yarn-project/foundation/src/config/env_var.ts index 5183e2847ed..146a4724b00 100644 --- a/yarn-project/foundation/src/config/env_var.ts +++ b/yarn-project/foundation/src/config/env_var.ts @@ -1,132 +1,134 @@ export type EnvVar = - | 'AZTEC_PORT' + | 'ACVM_BINARY_PATH' + | 'ACVM_WORKING_DIRECTORY' + | 'API_KEY' + | 'API_PREFIX' + | 'ARCHIVER_MAX_LOGS' + | 'ARCHIVER_POLLING_INTERVAL_MS' + | 'ARCHIVER_URL' + | 'ARCHIVER_VIEM_POLLING_INTERVAL_MS' | 'ASSUME_PROVEN_THROUGH_BLOCK_NUMBER' - | 'TEST_ACCOUNTS' + | 'AZTEC_NODE_URL' + | 'AZTEC_PORT' + | 'BB_BINARY_PATH' + | 'BB_SKIP_CLEANUP' + | 'BB_WORKING_DIRECTORY' + | 'BOOTSTRAP_NODES' + | 'BOT_DA_GAS_LIMIT' + | 'BOT_FEE_PAYMENT_METHOD' + | 'BOT_FLUSH_SETUP_TRANSACTIONS' + | 'BOT_FOLLOW_CHAIN' + | 'BOT_L2_GAS_LIMIT' + | 'BOT_MAX_PENDING_TXS' + | 'BOT_NO_START' + | 'BOT_NO_WAIT_FOR_TRANSFERS' + | 'BOT_PRIVATE_KEY' + | 'BOT_PRIVATE_TRANSFERS_PER_TX' + | 'BOT_PUBLIC_TRANSFERS_PER_TX' + | 'BOT_PXE_URL' + | 'BOT_RECIPIENT_ENCRYPTION_SECRET' + | 'BOT_SKIP_PUBLIC_SIMULATION' + | 'BOT_TOKEN_CONTRACT' + | 'BOT_TOKEN_SALT' + | 'BOT_TX_INTERVAL_SECONDS' + | 'BOT_TX_MINED_WAIT_SECONDS' + | 'COINBASE' + | 'DATA_DIRECTORY' + | 'DEBUG' + | 'DEPLOY_AZTEC_CONTRACTS_SALT' + | 'DEPLOY_AZTEC_CONTRACTS' | 'ENABLE_GAS' - | 'API_PREFIX' + | 'ENFORCE_FEES' | 'ETHEREUM_HOST' - | 'L1_CHAIN_ID' - | 'MNEMONIC' - | 'ROLLUP_CONTRACT_ADDRESS' - | 'REGISTRY_CONTRACT_ADDRESS' - | 'INBOX_CONTRACT_ADDRESS' - | 'OUTBOX_CONTRACT_ADDRESS' | 'FEE_JUICE_CONTRACT_ADDRESS' | 'FEE_JUICE_PORTAL_CONTRACT_ADDRESS' - | 'ARCHIVER_URL' - | 'DEPLOY_AZTEC_CONTRACTS' - | 'DEPLOY_AZTEC_CONTRACTS_SALT' + | 'FEE_RECIPIENT' + | 'INBOX_CONTRACT_ADDRESS' + | 'L1_CHAIN_ID' | 'L1_PRIVATE_KEY' | 'L2_QUEUE_SIZE' - | 'WS_BLOCK_CHECK_INTERVAL_MS' - | 'P2P_ENABLED' + | 'LOG_JSON' + | 'LOG_LEVEL' + | 'MNEMONIC' + | 'NETWORK_NAME' + | 'NETWORK' + | 'OTEL_EXPORTER_OTLP_METRICS_ENDPOINT' + | 'OTEL_EXPORTER_OTLP_TRACES_ENDPOINT' + | 'OTEL_SERVICE_NAME' + | 'OUTBOX_CONTRACT_ADDRESS' | 'P2P_BLOCK_CHECK_INTERVAL_MS' - | 'P2P_PEER_CHECK_INTERVAL_MS' - | 'P2P_L2_QUEUE_SIZE' - | 'TCP_LISTEN_ADDR' - | 'UDP_LISTEN_ADDR' - | 'P2P_TCP_ANNOUNCE_ADDR' - | 'P2P_UDP_ANNOUNCE_ADDR' - | 'PEER_ID_PRIVATE_KEY' - | 'BOOTSTRAP_NODES' - | 'P2P_TX_PROTOCOL' - | 'P2P_MIN_PEERS' - | 'P2P_MAX_PEERS' - | 'DATA_DIRECTORY' - | 'TX_GOSSIP_VERSION' - | 'P2P_QUERY_FOR_IP' - | 'P2P_TX_POOL_KEEP_PROVEN_FOR' - | 'P2P_GOSSIPSUB_INTERVAL_MS' + | 'P2P_ENABLED' | 'P2P_GOSSIPSUB_D' - | 'P2P_GOSSIPSUB_DLO' | 'P2P_GOSSIPSUB_DHI' - | 'P2P_GOSSIPSUB_MCACHE_LENGTH' + | 'P2P_GOSSIPSUB_DLO' + | 'P2P_GOSSIPSUB_INTERVAL_MS' | 'P2P_GOSSIPSUB_MCACHE_GOSSIP' - | 'P2P_SEVERE_PEER_PENALTY_BLOCK_LENGTH' - | 'P2P_REQRESP_OVERALL_REQUEST_TIMEOUT_MS' - | 'P2P_REQRESP_INDIVIDUAL_REQUEST_TIMEOUT_MS' - | 'P2P_GOSSIPSUB_TX_TOPIC_WEIGHT' - | 'P2P_GOSSIPSUB_TX_INVALID_MESSAGE_DELIVERIES_WEIGHT' + | 'P2P_GOSSIPSUB_MCACHE_LENGTH' | 'P2P_GOSSIPSUB_TX_INVALID_MESSAGE_DELIVERIES_DECAY' + | 'P2P_GOSSIPSUB_TX_INVALID_MESSAGE_DELIVERIES_WEIGHT' + | 'P2P_GOSSIPSUB_TX_TOPIC_WEIGHT' + | 'P2P_L2_QUEUE_SIZE' + | 'P2P_MAX_PEERS' + | 'P2P_MIN_PEERS' + | 'P2P_PEER_CHECK_INTERVAL_MS' | 'P2P_PEER_PENALTY_VALUES' - | 'TELEMETRY' - | 'OTEL_SERVICE_NAME' - | 'OTEL_EXPORTER_OTLP_METRICS_ENDPOINT' - | 'OTEL_EXPORTER_OTLP_TRACES_ENDPOINT' - | 'NETWORK_NAME' - | 'NETWORK' - | 'API_KEY' - | 'AZTEC_NODE_URL' - | 'ARCHIVER_POLLING_INTERVAL_MS' - | 'ARCHIVER_VIEM_POLLING_INTERVAL_MS' - | 'ARCHIVER_MAX_LOGS' - | 'SEQ_TX_POLLING_INTERVAL_MS' - | 'SEQ_MAX_TX_PER_BLOCK' - | 'SEQ_MIN_TX_PER_BLOCK' - | 'SEQ_MIN_SECONDS_BETWEEN_BLOCKS' - | 'SEQ_MAX_SECONDS_BETWEEN_BLOCKS' - | 'COINBASE' - | 'FEE_RECIPIENT' - | 'ACVM_WORKING_DIRECTORY' - | 'ACVM_BINARY_PATH' - | 'SEQ_ALLOWED_SETUP_FN' - | 'SEQ_ALLOWED_TEARDOWN_FN' - | 'SEQ_MAX_BLOCK_SIZE_IN_BYTES' - | 'ENFORCE_FEES' - | 'SEQ_PUBLISHER_PRIVATE_KEY' - | 'SEQ_REQUIRED_CONFIRMATIONS' - | 'SEQ_PUBLISH_RETRY_INTERVAL_MS' - | 'VERSION' - | 'SEQ_DISABLED' - | 'PROVER_DISABLED' - | 'PROVER_REAL_PROOFS' + | 'P2P_QUERY_FOR_IP' + | 'P2P_REQRESP_INDIVIDUAL_REQUEST_TIMEOUT_MS' + | 'P2P_REQRESP_OVERALL_REQUEST_TIMEOUT_MS' + | 'P2P_SEVERE_PEER_PENALTY_BLOCK_LENGTH' + | 'P2P_TCP_ANNOUNCE_ADDR' + | 'P2P_TX_POOL_KEEP_PROVEN_FOR' + | 'P2P_TX_PROTOCOL' + | 'P2P_UDP_ANNOUNCE_ADDR' + | 'PEER_ID_PRIVATE_KEY' + | 'PROOF_VERIFIER_L1_START_BLOCK' + | 'PROOF_VERIFIER_POLL_INTERVAL_MS' + | 'PROVER_AGENT_CONCURRENCY' | 'PROVER_AGENT_ENABLED' | 'PROVER_AGENT_POLL_INTERVAL_MS' - | 'PROVER_AGENT_CONCURRENCY' - | 'PROVER_JOB_TIMEOUT_MS' - | 'PROVER_JOB_POLL_INTERVAL_MS' + | 'PROVER_COORDINATION_NODE_URL' + | 'PROVER_DISABLED' | 'PROVER_ID' - | 'WS_L2_BLOCK_QUEUE_SIZE' - | 'WS_PROVEN_BLOCKS_ONLY' + | 'PROVER_JOB_POLL_INTERVAL_MS' + | 'PROVER_JOB_TIMEOUT_MS' + | 'PROVER_NODE_POLLING_INTERVAL_MS' + | 'PROVER_NODE_MAX_PENDING_JOBS' | 'PROVER_PUBLISH_RETRY_INTERVAL_MS' | 'PROVER_PUBLISHER_PRIVATE_KEY' + | 'PROVER_REAL_PROOFS' | 'PROVER_REQUIRED_CONFIRMATIONS' | 'PROVER_TEST_DELAY_MS' - | 'TX_PROVIDER_NODE_URL' - | 'TXE_PORT' - | 'LOG_JSON' - | 'BOT_PXE_URL' - | 'BOT_PRIVATE_KEY' - | 'BOT_RECIPIENT_ENCRYPTION_SECRET' - | 'BOT_TOKEN_SALT' - | 'BOT_TX_INTERVAL_SECONDS' - | 'BOT_PRIVATE_TRANSFERS_PER_TX' - | 'BOT_PUBLIC_TRANSFERS_PER_TX' - | 'BOT_FEE_PAYMENT_METHOD' - | 'BOT_NO_START' - | 'BOT_TX_MINED_WAIT_SECONDS' - | 'BOT_NO_WAIT_FOR_TRANSFERS' - | 'BOT_MAX_PENDING_TXS' - | 'BOT_SKIP_PUBLIC_SIMULATION' - | 'BOT_L2_GAS_LIMIT' - | 'BOT_DA_GAS_LIMIT' | 'PXE_BLOCK_POLLING_INTERVAL_MS' - | 'PXE_L2_STARTING_BLOCK' | 'PXE_DATA_DIRECTORY' - | 'BB_BINARY_PATH' - | 'BB_WORKING_DIRECTORY' - | 'BB_SKIP_CLEANUP' + | 'PXE_L2_STARTING_BLOCK' | 'PXE_PROVER_ENABLED' - | 'BOT_FOLLOW_CHAIN' - | 'BOT_FLUSH_SETUP_TRANSACTIONS' - | 'BOT_TOKEN_CONTRACT' - | 'VALIDATOR_PRIVATE_KEY' - | 'VALIDATOR_DISABLED' - | 'VALIDATOR_ATTESTATIONS_WAIT_TIMEOUT_MS' + | 'QUOTE_PROVIDER_BASIS_POINT_FEE' + | 'QUOTE_PROVIDER_BOND_AMOUNT' + | 'REGISTRY_CONTRACT_ADDRESS' + | 'ROLLUP_CONTRACT_ADDRESS' + | 'SEQ_ALLOWED_SETUP_FN' + | 'SEQ_ALLOWED_TEARDOWN_FN' + | 'SEQ_DISABLED' + | 'SEQ_MAX_BLOCK_SIZE_IN_BYTES' + | 'SEQ_MAX_SECONDS_BETWEEN_BLOCKS' + | 'SEQ_MAX_TX_PER_BLOCK' + | 'SEQ_MIN_SECONDS_BETWEEN_BLOCKS' + | 'SEQ_MIN_TX_PER_BLOCK' + | 'SEQ_PUBLISH_RETRY_INTERVAL_MS' + | 'SEQ_PUBLISHER_PRIVATE_KEY' + | 'SEQ_REQUIRED_CONFIRMATIONS' + | 'SEQ_TX_POLLING_INTERVAL_MS' + | 'TCP_LISTEN_ADDR' + | 'TELEMETRY' + | 'TEST_ACCOUNTS' + | 'TX_GOSSIP_VERSION' + | 'TXE_PORT' + | 'UDP_LISTEN_ADDR' | 'VALIDATOR_ATTESTATIONS_POOLING_INTERVAL_MS' - | 'PROVER_NODE_DISABLE_AUTOMATIC_PROVING' - | 'PROVER_NODE_MAX_PENDING_JOBS' - | 'PROOF_VERIFIER_POLL_INTERVAL_MS' - | 'PROOF_VERIFIER_L1_START_BLOCK' - | 'LOG_LEVEL' - | 'DEBUG'; + | 'VALIDATOR_ATTESTATIONS_WAIT_TIMEOUT_MS' + | 'VALIDATOR_DISABLED' + | 'VALIDATOR_PRIVATE_KEY' + | 'VERSION' + | 'WS_BLOCK_CHECK_INTERVAL_MS' + | 'WS_L2_BLOCK_QUEUE_SIZE' + | 'WS_PROVEN_BLOCKS_ONLY'; diff --git a/yarn-project/foundation/src/config/index.ts b/yarn-project/foundation/src/config/index.ts index 68b14921785..a075be3fccf 100644 --- a/yarn-project/foundation/src/config/index.ts +++ b/yarn-project/foundation/src/config/index.ts @@ -67,6 +67,18 @@ export function numberConfigHelper(defaultVal: number): Pick { + return { + parseEnv: (val: string) => BigInt(val), + defaultValue: defaultVal, + }; +} + /** * Generates parseEnv for an optional numerical config value. */ diff --git a/yarn-project/foundation/src/crypto/keccak/index.ts b/yarn-project/foundation/src/crypto/keccak/index.ts index 940e9d26ff2..4e8ed8d3473 100644 --- a/yarn-project/foundation/src/crypto/keccak/index.ts +++ b/yarn-project/foundation/src/crypto/keccak/index.ts @@ -1,12 +1,17 @@ import { Keccak } from 'sha3'; +import { Buffer32 } from '../../buffer/buffer32.js'; + /** * Computes the Keccak-256 hash of the given input buffer. * * @param input - The input buffer to be hashed. * @returns The computed Keccak-256 hash as a Buffer. */ -export function keccak256(input: Buffer) { +export function keccak256(input: Buffer | Buffer32) { + if (input instanceof Buffer32) { + input = input.buffer; + } const hash = new Keccak(256); return hash.update(input).digest(); } diff --git a/yarn-project/foundation/src/testing/test_data.ts b/yarn-project/foundation/src/testing/test_data.ts index 18018c7de2b..79961ae988e 100644 --- a/yarn-project/foundation/src/testing/test_data.ts +++ b/yarn-project/foundation/src/testing/test_data.ts @@ -8,7 +8,7 @@ const testData: { [key: string]: unknown[] } = {}; /** Returns whether test data generation is enabled */ export function isGenerateTestDataEnabled() { - return process.env.AZTEC_GENERATE_TEST_DATA === '1' && typeof expect !== 'undefined'; + return ['1', 'true'].includes(process.env.AZTEC_GENERATE_TEST_DATA ?? '') && typeof expect !== 'undefined'; } /** Pushes test data with the given name, only if test data generation is enabled. */ diff --git a/yarn-project/foundation/src/types/index.ts b/yarn-project/foundation/src/types/index.ts index 71872c1d99f..05b4a76a785 100644 --- a/yarn-project/foundation/src/types/index.ts +++ b/yarn-project/foundation/src/types/index.ts @@ -15,3 +15,8 @@ export type PartialBy = Omit & Partial>; /** Removes readonly modifiers for a type. */ export type Writeable = { -readonly [P in keyof T]: T[P] }; + +/** Removes readonly modifiers for an object. */ +export function unfreeze(obj: T): Writeable { + return obj as Writeable; +} diff --git a/yarn-project/ivc-integration/src/avm_integration.test.ts b/yarn-project/ivc-integration/src/avm_integration.test.ts index c2bb09e3675..0811ca4c6bf 100644 --- a/yarn-project/ivc-integration/src/avm_integration.test.ts +++ b/yarn-project/ivc-integration/src/avm_integration.test.ts @@ -9,6 +9,8 @@ import { import { AvmCircuitInputs, FunctionSelector, Gas, GlobalVariables } from '@aztec/circuits.js'; import { AVM_PROOF_LENGTH_IN_FIELDS, + AVM_PUBLIC_COLUMN_MAX_SIZE, + AVM_PUBLIC_INPUTS_FLATTENED_SIZE, AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS, PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH, } from '@aztec/circuits.js/constants'; @@ -16,7 +18,7 @@ import { Fr } from '@aztec/foundation/fields'; import { createDebugLogger } from '@aztec/foundation/log'; import { BufferReader } from '@aztec/foundation/serialize'; import { type FixedLengthArray } from '@aztec/noir-protocol-circuits-types/types'; -import { AvmSimulator, type PublicContractsDB, PublicSideEffectTrace, type WorldStateDB } from '@aztec/simulator'; +import { AvmSimulator, PublicSideEffectTrace, type WorldStateDB } from '@aztec/simulator'; import { getAvmTestContractBytecode, initContext, @@ -72,7 +74,10 @@ describe('AVM Integration', () => { } it('Should generate and verify an ultra honk proof from an AVM verification', async () => { - const bbSuccess = await proveAvmTestContract('new_note_hash', [new Fr(1)]); + const bbSuccess = await proveAvmTestContract( + 'bulk_testing', + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(x => new Fr(x)), + ); const avmProofPath = bbSuccess.proofPath; const avmVkPath = bbSuccess.vkPath; @@ -82,11 +87,19 @@ describe('AVM Integration', () => { // Read the binary proof const avmProofBuffer = await fs.readFile(avmProofPath!); const reader = BufferReader.asReader(avmProofBuffer); - reader.readArray(PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH, Fr); + const kernel_public_inputs = reader.readArray(PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH, Fr); const calldataSize = Fr.fromBuffer(reader).toNumber(); - reader.readArray(calldataSize, Fr); + const calldata = reader.readArray(calldataSize, Fr); const returnDataSize = Fr.fromBuffer(reader).toNumber(); - reader.readArray(returnDataSize, Fr); + const returnData = reader.readArray(returnDataSize, Fr); + + const public_cols_flattened = kernel_public_inputs + .concat(calldata) + .concat(Array(AVM_PUBLIC_COLUMN_MAX_SIZE - calldata.length).fill(new Fr(0))) + .concat(returnData) + .concat(Array(AVM_PUBLIC_COLUMN_MAX_SIZE - returnData.length).fill(new Fr(0))); + + expect(public_cols_flattened.length).toBe(AVM_PUBLIC_INPUTS_FLATTENED_SIZE); const proof: Fr[] = []; while (!reader.isEmpty()) { @@ -106,6 +119,10 @@ describe('AVM Integration', () => { typeof AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS >, proof: proof.map(x => x.toString()) as FixedLengthArray, + pub_cols_flattened: public_cols_flattened.map(x => x.toString()) as FixedLengthArray< + string, + typeof AVM_PUBLIC_INPUTS_FLATTENED_SIZE + >, }); await createHonkProof(witGenResult.witness, MockPublicKernelCircuit.bytecode); @@ -134,7 +151,7 @@ const proveAvmTestContract = async ( const globals = GlobalVariables.empty(); const environment = initExecutionEnvironment({ functionSelector, calldata, globals }); - const contractsDb = mock(); + const worldStateDB = mock(); const contractInstance = new SerializableContractInstance({ version: 1, salt: new Fr(0x123), @@ -143,9 +160,8 @@ const proveAvmTestContract = async ( initializationHash: new Fr(0x101112), publicKeysHash: new Fr(0x161718), }).withAddress(environment.address); - contractsDb.getContractInstance.mockResolvedValue(await Promise.resolve(contractInstance)); + worldStateDB.getContractInstance.mockResolvedValue(await Promise.resolve(contractInstance)); - const worldStateDB = mock(); const storageValue = new Fr(5); worldStateDB.storageRead.mockResolvedValue(await Promise.resolve(storageValue)); diff --git a/yarn-project/kv-store/src/lmdb/store.ts b/yarn-project/kv-store/src/lmdb/store.ts index d789778c7e0..1c5e53f71ff 100644 --- a/yarn-project/kv-store/src/lmdb/store.ts +++ b/yarn-project/kv-store/src/lmdb/store.ts @@ -144,23 +144,35 @@ export class AztecLmdbStore implements AztecKVStore { } /** - * Clears all entries in the store + * Clears all entries in the store & sub DBs. */ async clear() { + await this.#data.clearAsync(); + await this.#multiMapData.clearAsync(); await this.#rootDb.clearAsync(); } + /** + * Drops the database & sub DBs. + */ + async drop() { + await this.#data.drop(); + await this.#multiMapData.drop(); + await this.#rootDb.drop(); + } + /** * Close the database. Note, once this is closed we can no longer interact with the DB. - * Closing the root DB also closes child DBs. */ async close() { + await this.#data.close(); + await this.#multiMapData.close(); await this.#rootDb.close(); } /** Deletes this store and removes the database files from disk */ async delete() { - await this.#rootDb.drop(); + await this.drop(); await this.close(); if (this.path) { await rm(this.path, { recursive: true, force: true }); diff --git a/yarn-project/l1-artifacts/scripts/generate-artifacts.sh b/yarn-project/l1-artifacts/scripts/generate-artifacts.sh index 1d82db63c06..2903b4ca429 100755 --- a/yarn-project/l1-artifacts/scripts/generate-artifacts.sh +++ b/yarn-project/l1-artifacts/scripts/generate-artifacts.sh @@ -15,11 +15,12 @@ CONTRACTS=( "l1-contracts:Outbox" "l1-contracts:Rollup" "l1-contracts:TokenPortal" - "l1-contracts:PortalERC20" + "l1-contracts:TestERC20" "l1-contracts:UniswapPortal" "l1-contracts:IERC20" "l1-contracts:FeeJuicePortal" "l1-contracts:MockVerifier" + "l1-contracts:IVerifier" ) diff --git a/yarn-project/noir-protocol-circuits-types/package.json b/yarn-project/noir-protocol-circuits-types/package.json index c33e8ba46eb..7e1e56e654f 100644 --- a/yarn-project/noir-protocol-circuits-types/package.json +++ b/yarn-project/noir-protocol-circuits-types/package.json @@ -16,8 +16,9 @@ "formatting": "run -T prettier --check ./src && run -T eslint ./src", "formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src", "formatting:fix:types": "NODE_OPTIONS='--max-old-space-size=8096' run -T eslint --fix ./src/types && run -T prettier -w ./src/types", - "generate": "yarn generate:noir-circuits", + "generate": "yarn generate:noir-circuits && yarn generate:reset-data", "generate:noir-circuits": "mkdir -p ./artifacts && cp -r ../../noir-projects/noir-protocol-circuits/target/* ./artifacts && node --no-warnings --loader ts-node/esm src/scripts/generate_declaration_files.ts && node --no-warnings --loader ts-node/esm src/scripts/generate_ts_from_abi.ts && run -T prettier -w ./src/types", + "generate:reset-data": "node --no-warnings --loader ts-node/esm src/scripts/generate_private_kernel_reset_data.ts && run -T prettier -w src/private_kernel_reset_data.ts", "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests", "codegen": "yarn noir-codegen", "build:dev": "tsc -b --watch" diff --git a/yarn-project/noir-protocol-circuits-types/src/artifacts.ts b/yarn-project/noir-protocol-circuits-types/src/artifacts.ts index bd47118cf1c..1e525e541a8 100644 --- a/yarn-project/noir-protocol-circuits-types/src/artifacts.ts +++ b/yarn-project/noir-protocol-circuits-types/src/artifacts.ts @@ -1,4 +1,3 @@ -import { type PrivateKernelResetTags } from '@aztec/circuits.js'; import { type NoirCompiledCircuit } from '@aztec/types/noir'; import EmptyNestedJson from '../artifacts/empty_nested.json' assert { type: 'json' }; @@ -11,17 +10,6 @@ import PrivateKernelInitJson from '../artifacts/private_kernel_init.json' assert import PrivateKernelInitSimulatedJson from '../artifacts/private_kernel_init_simulated.json' assert { type: 'json' }; import PrivateKernelInnerJson from '../artifacts/private_kernel_inner.json' assert { type: 'json' }; import PrivateKernelInnerSimulatedJson from '../artifacts/private_kernel_inner_simulated.json' assert { type: 'json' }; -import PrivateKernelResetJson from '../artifacts/private_kernel_reset.json' assert { type: 'json' }; -import PrivateKernelResetBigJson from '../artifacts/private_kernel_reset_big.json' assert { type: 'json' }; -import PrivateKernelResetMediumJson from '../artifacts/private_kernel_reset_medium.json' assert { type: 'json' }; -import PrivateKernelResetSimulatedJson from '../artifacts/private_kernel_reset_simulated.json' assert { type: 'json' }; -import PrivateKernelResetBigSimulatedJson from '../artifacts/private_kernel_reset_simulated_big.json' assert { type: 'json' }; -import PrivateKernelResetFullInnerSimulatedJson from '../artifacts/private_kernel_reset_simulated_full_inner.json' assert { type: 'json' }; -import PrivateKernelResetMediumSimulatedJson from '../artifacts/private_kernel_reset_simulated_medium.json' assert { type: 'json' }; -import PrivateKernelResetSmallSimulatedJson from '../artifacts/private_kernel_reset_simulated_small.json' assert { type: 'json' }; -import PrivateKernelResetTinySimulatedJson from '../artifacts/private_kernel_reset_simulated_tiny.json' assert { type: 'json' }; -import PrivateKernelResetSmallJson from '../artifacts/private_kernel_reset_small.json' assert { type: 'json' }; -import PrivateKernelResetTinyJson from '../artifacts/private_kernel_reset_tiny.json' assert { type: 'json' }; import PrivateKernelTailJson from '../artifacts/private_kernel_tail.json' assert { type: 'json' }; import PrivateKernelTailSimulatedJson from '../artifacts/private_kernel_tail_simulated.json' assert { type: 'json' }; import PrivateKernelTailToPublicJson from '../artifacts/private_kernel_tail_to_public.json' assert { type: 'json' }; @@ -36,26 +24,14 @@ import BaseRollupJson from '../artifacts/rollup_base.json' assert { type: 'json' import BaseRollupSimulatedJson from '../artifacts/rollup_base_simulated.json' assert { type: 'json' }; import BlockMergeRollupJson from '../artifacts/rollup_block_merge.json' assert { type: 'json' }; import BlockRootRollupJson from '../artifacts/rollup_block_root.json' assert { type: 'json' }; -import BlockRootRollupFinalJson from '../artifacts/rollup_block_root_final.json' assert { type: 'json' }; +import EmptyBlockRootRollupJson from '../artifacts/rollup_block_root_empty.json' assert { type: 'json' }; import MergeRollupJson from '../artifacts/rollup_merge.json' assert { type: 'json' }; import RootRollupJson from '../artifacts/rollup_root.json' assert { type: 'json' }; - -export type PrivateResetArtifacts = - | 'PrivateKernelResetFullArtifact' - | 'PrivateKernelResetFullInnerArtifact' - | 'PrivateKernelResetBigArtifact' - | 'PrivateKernelResetMediumArtifact' - | 'PrivateKernelResetSmallArtifact' - | 'PrivateKernelResetTinyArtifact'; - -export const PrivateResetTagToArtifactName: Record = { - full: 'PrivateKernelResetFullArtifact', - 'full-inner': 'PrivateKernelResetFullInnerArtifact', - big: 'PrivateKernelResetBigArtifact', - medium: 'PrivateKernelResetMediumArtifact', - small: 'PrivateKernelResetSmallArtifact', - tiny: 'PrivateKernelResetTinyArtifact', -}; +import { + PrivateKernelResetArtifacts, + PrivateKernelResetSimulatedArtifacts, + type PrivateResetArtifact, +} from './private_kernel_reset_data.js'; export type ServerProtocolArtifact = | 'EmptyNestedArtifact' @@ -68,7 +44,7 @@ export type ServerProtocolArtifact = | 'BaseRollupArtifact' | 'MergeRollupArtifact' | 'BlockRootRollupArtifact' - | 'BlockRootRollupFinalArtifact' // TODO(palla/prover): Delete this artifact + | 'EmptyBlockRootRollupArtifact' | 'BlockMergeRollupArtifact' | 'RootRollupArtifact'; @@ -77,7 +53,7 @@ export type ClientProtocolArtifact = | 'PrivateKernelInnerArtifact' | 'PrivateKernelTailArtifact' | 'PrivateKernelTailToPublicArtifact' - | PrivateResetArtifacts; + | PrivateResetArtifact; export type ProtocolArtifact = ServerProtocolArtifact | ClientProtocolArtifact; @@ -92,9 +68,9 @@ export const ServerCircuitArtifacts: Record = { @@ -108,31 +84,17 @@ export const SimulatedServerCircuitArtifacts: Record = { - PrivateKernelResetFullArtifact: PrivateKernelResetSimulatedJson as NoirCompiledCircuit, - PrivateKernelResetFullInnerArtifact: PrivateKernelResetFullInnerSimulatedJson as NoirCompiledCircuit, - PrivateKernelResetBigArtifact: PrivateKernelResetBigSimulatedJson as NoirCompiledCircuit, - PrivateKernelResetMediumArtifact: PrivateKernelResetMediumSimulatedJson as NoirCompiledCircuit, - PrivateKernelResetSmallArtifact: PrivateKernelResetSmallSimulatedJson as NoirCompiledCircuit, - PrivateKernelResetTinyArtifact: PrivateKernelResetTinySimulatedJson as NoirCompiledCircuit, }; export const ClientCircuitArtifacts: Record = { PrivateKernelInitArtifact: PrivateKernelInitJson as NoirCompiledCircuit, PrivateKernelInnerArtifact: PrivateKernelInnerJson as NoirCompiledCircuit, - PrivateKernelResetFullArtifact: PrivateKernelResetJson as NoirCompiledCircuit, - PrivateKernelResetFullInnerArtifact: PrivateKernelResetJson as NoirCompiledCircuit, - PrivateKernelResetBigArtifact: PrivateKernelResetBigJson as NoirCompiledCircuit, - PrivateKernelResetMediumArtifact: PrivateKernelResetMediumJson as NoirCompiledCircuit, - PrivateKernelResetSmallArtifact: PrivateKernelResetSmallJson as NoirCompiledCircuit, - PrivateKernelResetTinyArtifact: PrivateKernelResetTinyJson as NoirCompiledCircuit, PrivateKernelTailArtifact: PrivateKernelTailJson as NoirCompiledCircuit, PrivateKernelTailToPublicArtifact: PrivateKernelTailToPublicJson as NoirCompiledCircuit, + ...PrivateKernelResetArtifacts, }; export const SimulatedClientCircuitArtifacts: Record = { @@ -140,7 +102,7 @@ export const SimulatedClientCircuitArtifacts: Record = { diff --git a/yarn-project/noir-protocol-circuits-types/src/index.ts b/yarn-project/noir-protocol-circuits-types/src/index.ts index 438c9ad1d0a..535be5af1ad 100644 --- a/yarn-project/noir-protocol-circuits-types/src/index.ts +++ b/yarn-project/noir-protocol-circuits-types/src/index.ts @@ -5,6 +5,7 @@ import { type BlockMergeRollupInputs, type BlockRootOrBlockMergePublicInputs, type BlockRootRollupInputs, + type EmptyBlockRootRollupInputs, Fr, type KernelCircuitPublicInputs, type MergeRollupInputs, @@ -14,7 +15,7 @@ import { type PrivateKernelInitCircuitPrivateInputs, type PrivateKernelInnerCircuitPrivateInputs, type PrivateKernelResetCircuitPrivateInputsVariants, - type PrivateKernelResetTags, + type PrivateKernelResetDimensions, type PrivateKernelTailCircuitPrivateInputs, type PrivateKernelTailCircuitPublicInputs, type PublicKernelCircuitPrivateInputs, @@ -36,12 +37,11 @@ import { strict as assert } from 'assert'; import { ClientCircuitArtifacts, - PrivateResetTagToArtifactName, - ResetSimulatedArtifacts, ServerCircuitArtifacts, SimulatedClientCircuitArtifacts, SimulatedServerCircuitArtifacts, } from './artifacts.js'; +import { type PrivateResetArtifact } from './private_kernel_reset_data.js'; import { mapBaseOrMergeRollupPublicInputsFromNoir, mapBaseParityInputsToNoir, @@ -49,6 +49,7 @@ import { mapBlockMergeRollupInputsToNoir, mapBlockRootOrBlockMergePublicInputsFromNoir, mapBlockRootRollupInputsToNoir, + mapEmptyBlockRootRollupInputsToNoir, mapEmptyKernelInputsToNoir, mapKernelCircuitPublicInputsFromNoir, mapMergeRollupInputsToNoir, @@ -82,6 +83,7 @@ import { type PublicKernelInnerReturnType, type PublicKernelMergeReturnType, type PrivateKernelResetReturnType as ResetReturnType, + type RollupBlockRootEmptyReturnType, type ParityRootReturnType as RootParityReturnType, type RollupRootReturnType as RootRollupReturnType, type PrivateKernelTailReturnType as TailReturnType, @@ -90,8 +92,11 @@ import { PrivateKernelTailToPublic as executePrivateKernelTailToPublicWithACVM, PrivateKernelTail as executePrivateKernelTailWithACVM, } from './types/index.js'; +import { getPrivateKernelResetArtifactName } from './utils/private_kernel_reset.js'; export * from './artifacts.js'; +export { maxPrivateKernelResetDimensions, privateKernelResetDimensionsConfig } from './private_kernel_reset_data.js'; +export * from './utils/private_kernel_reset.js'; export * from './vks.js'; // TODO(Tom): This should be exported from noirc_abi @@ -148,14 +153,28 @@ export async function executeInner( * @param privateKernelResetCircuitPrivateInputs - The private inputs to the reset private kernel. * @returns The public inputs. */ -export async function executeReset( - privateKernelResetCircuitPrivateInputs: PrivateKernelResetCircuitPrivateInputsVariants, +export async function executeReset< + NH_RR_PENDING extends number, + NH_RR_SETTLED extends number, + NLL_RR_PENDING extends number, + NLL_RR_SETTLED extends number, + KEY_VALIDATION_REQUESTS extends number, + NUM_TRANSIENT_DATA_HINTS extends number, +>( + privateKernelResetCircuitPrivateInputs: PrivateKernelResetCircuitPrivateInputsVariants< + NH_RR_PENDING, + NH_RR_SETTLED, + NLL_RR_PENDING, + NLL_RR_SETTLED, + KEY_VALIDATION_REQUESTS, + NUM_TRANSIENT_DATA_HINTS + >, + dimensions: PrivateKernelResetDimensions, ): Promise { - const artifact = - ResetSimulatedArtifacts[PrivateResetTagToArtifactName[privateKernelResetCircuitPrivateInputs.sizeTag]]; + const artifact = SimulatedClientCircuitArtifacts[getPrivateKernelResetArtifactName(dimensions)]; const program = new Noir(artifact as CompiledCircuit); const args: InputMap = { - input: mapPrivateKernelResetCircuitPrivateInputsToNoir(privateKernelResetCircuitPrivateInputs as any), + input: mapPrivateKernelResetCircuitPrivateInputsToNoir(privateKernelResetCircuitPrivateInputs), }; const { returnValue } = await program.execute(args, foreignCallHandler); return mapPrivateKernelCircuitPublicInputsFromNoir(returnValue as any); @@ -228,12 +247,26 @@ export function convertPrivateKernelInnerInputsToWitnessMap( * @param inputs - The private kernel inputs. * @returns The witness map */ -export function convertPrivateKernelResetInputsToWitnessMap( - privateKernelResetCircuitPrivateInputs: PrivateKernelResetCircuitPrivateInputsVariants, +export function convertPrivateKernelResetInputsToWitnessMap< + NH_RR_PENDING extends number, + NH_RR_SETTLED extends number, + NLL_RR_PENDING extends number, + NLL_RR_SETTLED extends number, + KEY_VALIDATION_REQUESTS extends number, + NUM_TRANSIENT_DATA_HINTS extends number, +>( + privateKernelResetCircuitPrivateInputs: PrivateKernelResetCircuitPrivateInputsVariants< + NH_RR_PENDING, + NH_RR_SETTLED, + NLL_RR_PENDING, + NLL_RR_SETTLED, + KEY_VALIDATION_REQUESTS, + NUM_TRANSIENT_DATA_HINTS + >, + artifactName: PrivateResetArtifact, ): WitnessMap { - const mapped = mapPrivateKernelResetCircuitPrivateInputsToNoir(privateKernelResetCircuitPrivateInputs as any); - const artifact = - ClientCircuitArtifacts[PrivateResetTagToArtifactName[privateKernelResetCircuitPrivateInputs.sizeTag]]; + const mapped = mapPrivateKernelResetCircuitPrivateInputsToNoir(privateKernelResetCircuitPrivateInputs); + const artifact = ClientCircuitArtifacts[artifactName]; const initialWitnessMap = abiEncode(artifact.abi as Abi, { input: mapped as any }); return initialWitnessMap; } @@ -303,10 +336,10 @@ export function convertPrivateKernelInnerOutputsFromWitnessMap(outputs: WitnessM */ export function convertPrivateKernelResetOutputsFromWitnessMap( outputs: WitnessMap, - sizeTag: PrivateKernelResetTags, + artifactName: PrivateResetArtifact, ): PrivateKernelCircuitPublicInputs { // Decode the witness map into two fields, the return values and the inputs - const artifact = ClientCircuitArtifacts[PrivateResetTagToArtifactName[sizeTag]]; + const artifact = ClientCircuitArtifacts[artifactName]; const decodedInputs: DecodedInputs = abiDecode(artifact.abi as Abi, outputs); // Cast the inputs as the return type @@ -423,6 +456,19 @@ export function convertBlockRootRollupInputsToWitnessMap(inputs: BlockRootRollup return initialWitnessMap; } +/** + * Converts the inputs of the empty block root rollup circuit into a witness map. + * @param inputs - The empty block root rollup inputs. + * @returns The witness map + */ +export function convertEmptyBlockRootRollupInputsToWitnessMap(inputs: EmptyBlockRootRollupInputs): WitnessMap { + const mapped = mapEmptyBlockRootRollupInputsToNoir(inputs); + const initialWitnessMap = abiEncode(ServerCircuitArtifacts.EmptyBlockRootRollupArtifact.abi, { + inputs: mapped as any, + }); + return initialWitnessMap; +} + /** * Converts the inputs of the block merge rollup circuit into a witness map. * @param inputs - The block merge rollup inputs. @@ -587,6 +633,23 @@ export function convertMergeRollupOutputsFromWitnessMap(outputs: WitnessMap): Ba return mapBaseOrMergeRollupPublicInputsFromNoir(returnType); } +/** + * Converts the outputs of the empty block root rollup circuit from a witness map. + * @param outputs - The block root rollup outputs as a witness map. + * @returns The public inputs. + */ +export function convertEmptyBlockRootRollupOutputsFromWitnessMap( + outputs: WitnessMap, +): BlockRootOrBlockMergePublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.EmptyBlockRootRollupArtifact.abi, outputs); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as RollupBlockRootEmptyReturnType; + + return mapBlockRootOrBlockMergePublicInputsFromNoir(returnType); +} + /** * Converts the outputs of the block root rollup circuit from a witness map. * @param outputs - The block root rollup outputs as a witness map. diff --git a/yarn-project/noir-protocol-circuits-types/src/scripts/generate_private_kernel_reset_data.ts b/yarn-project/noir-protocol-circuits-types/src/scripts/generate_private_kernel_reset_data.ts new file mode 100644 index 00000000000..d6d5b118b9c --- /dev/null +++ b/yarn-project/noir-protocol-circuits-types/src/scripts/generate_private_kernel_reset_data.ts @@ -0,0 +1,203 @@ +import { + MAX_ENCRYPTED_LOGS_PER_TX, + MAX_KEY_VALIDATION_REQUESTS_PER_TX, + MAX_NOTE_HASHES_PER_TX, + MAX_NOTE_HASH_READ_REQUESTS_PER_TX, + MAX_NULLIFIERS_PER_TX, + MAX_NULLIFIER_READ_REQUESTS_PER_TX, + PRIVATE_KERNEL_RESET_INDEX, + type PrivateKernelResetDimensionsConfig, + VK_TREE_HEIGHT, + privateKernelResetDimensionNames, +} from '@aztec/circuits.js'; +import { createConsoleLogger } from '@aztec/foundation/log'; + +import fs from 'fs/promises'; + +const log = createConsoleLogger('aztec:autogenerate'); + +const outputFilename = './src/private_kernel_reset_data.ts'; + +// Must match the values in noir-projects/noir-protocol-circuits/crates/private-kernel-reset/src/main.nr +const maxDimensions = [ + MAX_NOTE_HASH_READ_REQUESTS_PER_TX, + MAX_NOTE_HASH_READ_REQUESTS_PER_TX, + MAX_NULLIFIER_READ_REQUESTS_PER_TX, + MAX_NULLIFIER_READ_REQUESTS_PER_TX, + MAX_KEY_VALIDATION_REQUESTS_PER_TX, + MAX_NULLIFIERS_PER_TX, + MAX_NOTE_HASHES_PER_TX, + MAX_NULLIFIERS_PER_TX, + MAX_ENCRYPTED_LOGS_PER_TX, +]; + +function generateImports() { + return ` + import { PrivateKernelResetDimensions, type PrivateKernelResetDimensionsConfig, type VerificationKeyData } from '@aztec/circuits.js'; + import { type NoirCompiledCircuit } from '@aztec/types/noir'; + import { keyJsonToVKData } from './utils/vk_json.js'; + `; +} + +function generateArtifactImports(importTags: string[]) { + return importTags + .map( + tag => + `import PrivateKernelResetJson${tag} from '../artifacts/private_kernel_reset${tag}.json' assert { type: 'json' };`, + ) + .join('\n'); +} + +function generateSimulatedArtifactImports(importTags: string[]) { + return importTags + .map( + tag => + `import PrivateKernelResetSimulatedJson${tag} from '../artifacts/private_kernel_reset_simulated${tag}.json' assert { type: 'json' };`, + ) + .join('\n'); +} + +function generateVksImports(importTags: string[]) { + return importTags + .map( + tag => + `import PrivateKernelResetVkJson${tag} from '../artifacts/keys/private_kernel_reset${tag}.vk.data.json' assert { type: 'json' };`, + ) + .join('\n'); +} + +function getArtifactName(tag: string) { + return `PrivateKernelResetArtifact${tag}`; +} + +function generateArtifactNames(resetVariantTags: string[]) { + const artifacts = resetVariantTags.map(tag => `'${getArtifactName(tag)}'`); + return `export type PrivateResetArtifact = ${artifacts.join('|')};`; +} + +function generateArtifacts(resetVariantTags: string[], importTags: string[]) { + const artifacts = resetVariantTags.map( + (tag, i) => `${getArtifactName(tag)}: PrivateKernelResetJson${importTags[i]} as NoirCompiledCircuit,`, + ); + return ` + export const PrivateKernelResetArtifacts: Record = { + ${artifacts.join('\n')} + }; + `; +} + +function generateSimulatedArtifacts(resetVariantTags: string[], importTags: string[]) { + const artifacts = resetVariantTags.map( + (tag, i) => `${getArtifactName(tag)}: PrivateKernelResetSimulatedJson${importTags[i]} as NoirCompiledCircuit,`, + ); + return ` + export const PrivateKernelResetSimulatedArtifacts: Record = { + ${artifacts.join('\n')} + }; + `; +} + +function generateVks(resetVariantTags: string[], importTags: string[]) { + const artifacts = resetVariantTags.map( + (tag, i) => `${getArtifactName(tag)}: keyJsonToVKData(PrivateKernelResetVkJson${importTags[i]}),`, + ); + return ` + export const PrivateKernelResetVks: Record = { + ${artifacts.join('\n')} + }; + `; +} + +function generateVkIndexes(resetVariantTags: string[]) { + const artifacts = resetVariantTags.map((tag, i) => `${getArtifactName(tag)}: ${PRIVATE_KERNEL_RESET_INDEX + i},`); + return ` + export const PrivateKernelResetVkIndexes: Record = { + ${artifacts.join('\n')} + }; + `; +} + +function checkDimensionNames(config: PrivateKernelResetDimensionsConfig) { + const expected = Object.keys(config.dimensions); + if ( + expected.length !== privateKernelResetDimensionNames.length || + !privateKernelResetDimensionNames.every((name, i) => name === expected[i]) + ) { + throw new Error('privateKernelResetDimensionNames must be listed in the same order as in the config.'); + } +} + +function checkMaxDimensions(dimensionsList: number[][]) { + if (!dimensionsList.some(dimensions => dimensions.every((v, i) => v === maxDimensions[i]))) { + throw new Error(`Max dimensions is not defined in the config. Expected: [${maxDimensions.join(',')}]`); + } +} + +function checkVkTreeSize(numResetCircuits: number) { + const treeSize = 2 ** VK_TREE_HEIGHT; + const maxIndex = numResetCircuits + PRIVATE_KERNEL_RESET_INDEX; + if (maxIndex >= treeSize) { + throw new Error( + `Insufficient VK tree height. Maximum private kernel reset index: ${maxIndex}. Required tree height at lease: ${Math.ceil( + Math.log2(maxIndex + 1), + )}. Current height: ${VK_TREE_HEIGHT}.`, + ); + } +} + +const main = async () => { + const config = JSON.parse( + await fs.readFile('../../noir-projects/noir-protocol-circuits/private_kernel_reset_config.json', 'utf8'), + ) as PrivateKernelResetDimensionsConfig; + + checkDimensionNames(config); + + const dimensionsList = JSON.parse( + await fs.readFile('../../noir-projects/noir-protocol-circuits/private_kernel_reset_dimensions.json', 'utf8'), + ) as number[][]; + + checkMaxDimensions(dimensionsList); + + checkVkTreeSize(dimensionsList.length); + + const resetVariantTags = dimensionsList.map(dimensions => `_${dimensions.join('_')}`); + const maxDimensionsTag = maxDimensions.join('_'); + const importTags = dimensionsList + .map(dimensions => dimensions.join('_')) + .map(tag => (tag === maxDimensionsTag ? '' : `_${tag}`)); + + const content = ` + /* eslint-disable camelcase */ + // GENERATED FILE - DO NOT EDIT. RUN \`yarn generate\` or \`yarn generate:reset-data\` + + ${generateImports()} + ${generateArtifactImports(importTags)} + ${generateSimulatedArtifactImports(importTags)} + ${generateVksImports(importTags)} + + ${generateArtifactNames(resetVariantTags)} + + ${generateArtifacts(resetVariantTags, importTags)} + + ${generateSimulatedArtifacts(resetVariantTags, importTags)} + + ${generateVks(resetVariantTags, importTags)} + + ${generateVkIndexes(resetVariantTags)} + + export const privateKernelResetDimensionsConfig: PrivateKernelResetDimensionsConfig = ${JSON.stringify(config)}; + + export const maxPrivateKernelResetDimensions = PrivateKernelResetDimensions.fromValues([${maxDimensions.join( + ',', + )}]); + `; + + await fs.writeFile(outputFilename, content); +}; + +try { + await main(); +} catch (err: unknown) { + log(`Error generating private kernel reset data: ${err}`); + process.exit(1); +} diff --git a/yarn-project/noir-protocol-circuits-types/src/scripts/generate_ts_from_abi.ts b/yarn-project/noir-protocol-circuits-types/src/scripts/generate_ts_from_abi.ts index 842a020e055..7cf03712bd1 100644 --- a/yarn-project/noir-protocol-circuits-types/src/scripts/generate_ts_from_abi.ts +++ b/yarn-project/noir-protocol-circuits-types/src/scripts/generate_ts_from_abi.ts @@ -2,19 +2,17 @@ import { createConsoleLogger } from '@aztec/foundation/log'; import { codegen } from '@noir-lang/noir_codegen'; import { type CompiledCircuit } from '@noir-lang/types'; -import { pascalCase, snakeCase } from 'change-case'; +import { pascalCase } from 'change-case'; import fs from 'fs/promises'; const log = createConsoleLogger('aztec:noir-contracts'); -const resetCircuit = 'private_kernel_reset'; - const circuits = [ 'parity_base', 'parity_root', 'private_kernel_init', 'private_kernel_inner', - resetCircuit, + 'private_kernel_reset', 'private_kernel_tail', 'private_kernel_tail_to_public', 'public_kernel_inner', @@ -24,19 +22,18 @@ const circuits = [ 'rollup_merge', 'rollup_block_root', 'rollup_block_merge', + 'rollup_block_root_empty', 'rollup_root', 'private_kernel_empty', 'empty_nested', ]; const main = async () => { - const resetVariants = JSON.parse( - await fs.readFile('../../noir-projects/noir-protocol-circuits/reset_variants.json', 'utf8'), - ); - - for (const variant of resetVariants) { - circuits.push(`${resetCircuit}_${snakeCase(variant.tag)}`); - } + const dimensionsLists = JSON.parse( + await fs.readFile('../../noir-projects/noir-protocol-circuits/private_kernel_reset_dimensions.json', 'utf8'), + ) as number[][]; + // Need any variant in the set so that the type will be rendered with generics. + circuits.push(`private_kernel_reset_${dimensionsLists[0].join('_')}`); try { await fs.access('./src/types/'); diff --git a/yarn-project/noir-protocol-circuits-types/src/type_conversion.ts b/yarn-project/noir-protocol-circuits-types/src/type_conversion.ts index 859d97de3b3..bf45467ac82 100644 --- a/yarn-project/noir-protocol-circuits-types/src/type_conversion.ts +++ b/yarn-project/noir-protocol-circuits-types/src/type_conversion.ts @@ -14,6 +14,7 @@ import { ContentCommitment, type ContractStorageRead, type ContractStorageUpdateRequest, + type EmptyBlockRootRollupInputs, type EmptyNestedData, EncryptedLogHash, type EnqueuedCallData, @@ -86,7 +87,7 @@ import { type PrivateKernelEmptyInputs, type PrivateKernelInitCircuitPrivateInputs, type PrivateKernelInnerCircuitPrivateInputs, - type PrivateKernelResetCircuitPrivateInputs, + type PrivateKernelResetCircuitPrivateInputsVariants, type PrivateKernelResetHints, type PrivateKernelTailCircuitPrivateInputs, PrivateKernelTailCircuitPublicInputs, @@ -158,6 +159,7 @@ import type { CombinedConstantData as CombinedConstantDataNoir, ConstantRollupData as ConstantRollupDataNoir, ContentCommitment as ContentCommitmentNoir, + EmptyBlockRootRollupInputs as EmptyBlockRootRollupInputsNoir, EmptyNestedCircuitPublicInputs as EmptyNestedDataNoir, EncryptedLogHash as EncryptedLogHashNoir, EnqueuedCallData as EnqueuedCallDataNoir, @@ -1823,16 +1825,14 @@ export function mapPrivateKernelResetCircuitPrivateInputsToNoir< NLL_RR_SETTLED extends number, KEY_VALIDATION_REQUESTS extends number, NUM_TRANSIENT_DATA_HINTS extends number, - TAG extends string, >( - inputs: PrivateKernelResetCircuitPrivateInputs< + inputs: PrivateKernelResetCircuitPrivateInputsVariants< NH_RR_PENDING, NH_RR_SETTLED, NLL_RR_PENDING, NLL_RR_SETTLED, KEY_VALIDATION_REQUESTS, - NUM_TRANSIENT_DATA_HINTS, - TAG + NUM_TRANSIENT_DATA_HINTS >, ): PrivateKernelResetCircuitPrivateInputsNoir< NH_RR_PENDING, @@ -2320,6 +2320,23 @@ export function mapBlockRootRollupInputsToNoir(rootRollupInputs: BlockRootRollup }; } +/** + * Maps the empty block root rollup inputs to noir. + * @param rootRollupInputs - The circuits.js block root rollup inputs. + * @returns The noir block root rollup inputs. + */ +export function mapEmptyBlockRootRollupInputsToNoir( + rootRollupInputs: EmptyBlockRootRollupInputs, +): EmptyBlockRootRollupInputsNoir { + return { + archive: mapAppendOnlyTreeSnapshotToNoir(rootRollupInputs.archive), + block_hash: mapFieldToNoir(rootRollupInputs.blockHash), + global_variables: mapGlobalVariablesToNoir(rootRollupInputs.globalVariables), + vk_tree_root: mapFieldToNoir(rootRollupInputs.vkTreeRoot), + prover_id: mapFieldToNoir(rootRollupInputs.proverId), + }; +} + /** * Maps the root rollup inputs to noir. * @param rootRollupInputs - The circuits.js root rollup inputs. diff --git a/yarn-project/noir-protocol-circuits-types/src/utils/private_kernel_reset.ts b/yarn-project/noir-protocol-circuits-types/src/utils/private_kernel_reset.ts new file mode 100644 index 00000000000..b050469c4d9 --- /dev/null +++ b/yarn-project/noir-protocol-circuits-types/src/utils/private_kernel_reset.ts @@ -0,0 +1,16 @@ +import { type PrivateKernelResetDimensions, privateKernelResetDimensionNames } from '@aztec/circuits.js'; + +import { PrivateKernelResetArtifacts, type PrivateResetArtifact } from '../private_kernel_reset_data.js'; + +export function createPrivateKernelResetTag(dimensions: PrivateKernelResetDimensions) { + return privateKernelResetDimensionNames.map(name => dimensions[name]).join('_'); +} + +export function getPrivateKernelResetArtifactName(dimensions: PrivateKernelResetDimensions) { + const tag = createPrivateKernelResetTag(dimensions); + const name = `PrivateKernelResetArtifact_${tag}` as PrivateResetArtifact; + if (!PrivateKernelResetArtifacts[name]) { + throw new Error(`Unknown private reset artifact: ${name}`); + } + return name; +} diff --git a/yarn-project/noir-protocol-circuits-types/src/utils/vk_json.ts b/yarn-project/noir-protocol-circuits-types/src/utils/vk_json.ts new file mode 100644 index 00000000000..52f0facc72e --- /dev/null +++ b/yarn-project/noir-protocol-circuits-types/src/utils/vk_json.ts @@ -0,0 +1,27 @@ +import { + Fr, + VERIFICATION_KEY_LENGTH_IN_FIELDS, + VerificationKeyAsFields, + VerificationKeyData, +} from '@aztec/circuits.js'; +import { assertLength } from '@aztec/foundation/serialize'; + +interface VkJson { + keyAsBytes: string; + keyAsFields: string[]; +} + +export function keyJsonToVKData(json: VkJson): VerificationKeyData { + const { keyAsBytes, keyAsFields } = json; + return new VerificationKeyData( + new VerificationKeyAsFields( + assertLength( + keyAsFields.map((str: string) => new Fr(Buffer.from(str.slice(2), 'hex'))), + VERIFICATION_KEY_LENGTH_IN_FIELDS, + ), + // TODO(#7410) what should be the vk hash here? + new Fr(Buffer.from(keyAsFields[0].slice(2), 'hex')), + ), + Buffer.from(keyAsBytes, 'hex'), + ); +} diff --git a/yarn-project/noir-protocol-circuits-types/src/vks.ts b/yarn-project/noir-protocol-circuits-types/src/vks.ts index 46f00bf4f2d..e7e070f2659 100644 --- a/yarn-project/noir-protocol-circuits-types/src/vks.ts +++ b/yarn-project/noir-protocol-circuits-types/src/vks.ts @@ -2,7 +2,7 @@ import { BASE_PARITY_INDEX, BASE_ROLLUP_INDEX, BLOCK_MERGE_ROLLUP_INDEX, - BLOCK_ROOT_ROLLUP_FINAL_INDEX, + BLOCK_ROOT_ROLLUP_EMPTY_INDEX, BLOCK_ROOT_ROLLUP_INDEX, EMPTY_NESTED_INDEX, Fr, @@ -12,12 +12,6 @@ import { PRIVATE_KERNEL_EMPTY_INDEX, PRIVATE_KERNEL_INIT_INDEX, PRIVATE_KERNEL_INNER_INDEX, - PRIVATE_KERNEL_RESET_BIG_INDEX, - PRIVATE_KERNEL_RESET_FULL_INDEX, - PRIVATE_KERNEL_RESET_FULL_INNER_INDEX, - PRIVATE_KERNEL_RESET_MEDIUM_INDEX, - PRIVATE_KERNEL_RESET_SMALL_INDEX, - PRIVATE_KERNEL_RESET_TINY_INDEX, PRIVATE_KERNEL_TAIL_INDEX, PRIVATE_KERNEL_TAIL_TO_PUBLIC_INDEX, PUBLIC_KERNEL_INNER_INDEX, @@ -25,7 +19,6 @@ import { PUBLIC_KERNEL_TAIL_INDEX, ROOT_PARITY_INDEX, ROOT_ROLLUP_INDEX, - VERIFICATION_KEY_LENGTH_IN_FIELDS, VK_TREE_HEIGHT, VerificationKeyAsFields, VerificationKeyData, @@ -39,12 +32,6 @@ import RootParityVkJson from '../artifacts/keys/parity_root.vk.data.json' assert import PrivateKernelEmptyVkJson from '../artifacts/keys/private_kernel_empty.vk.data.json' assert { type: 'json' }; import PrivateKernelInitVkJson from '../artifacts/keys/private_kernel_init.vk.data.json' assert { type: 'json' }; import PrivateKernelInnerVkJson from '../artifacts/keys/private_kernel_inner.vk.data.json' assert { type: 'json' }; -import PrivateKernelResetFullVkJson from '../artifacts/keys/private_kernel_reset.vk.data.json' assert { type: 'json' }; -import PrivateKernelResetBigVkJson from '../artifacts/keys/private_kernel_reset_big.vk.data.json' assert { type: 'json' }; -import PrivateKernelResetFullInnerVkJson from '../artifacts/keys/private_kernel_reset_full_inner.vk.data.json' assert { type: 'json' }; -import PrivateKernelResetMediumVkJson from '../artifacts/keys/private_kernel_reset_medium.vk.data.json' assert { type: 'json' }; -import PrivateKernelResetSmallVkJson from '../artifacts/keys/private_kernel_reset_small.vk.data.json' assert { type: 'json' }; -import PrivateKernelResetTinyVkJson from '../artifacts/keys/private_kernel_reset_tiny.vk.data.json' assert { type: 'json' }; import PrivateKernelTailVkJson from '../artifacts/keys/private_kernel_tail.vk.data.json' assert { type: 'json' }; import PrivateKernelTailToPublicVkJson from '../artifacts/keys/private_kernel_tail_to_public.vk.data.json' assert { type: 'json' }; import PublicKernelInnerVkJson from '../artifacts/keys/public_kernel_inner.vk.data.json' assert { type: 'json' }; @@ -53,32 +40,14 @@ import PublicKernelTailVkJson from '../artifacts/keys/public_kernel_tail.vk.data import BaseRollupVkJson from '../artifacts/keys/rollup_base.vk.data.json' assert { type: 'json' }; import BlockMergeRollupVkJson from '../artifacts/keys/rollup_block_merge.vk.data.json' assert { type: 'json' }; import BlockRootRollupVkJson from '../artifacts/keys/rollup_block_root.vk.data.json' assert { type: 'json' }; -import BlockRootRollupFinalVkJson from '../artifacts/keys/rollup_block_root_final.vk.data.json' assert { type: 'json' }; +import EmptyBlockRootRollupVkJson from '../artifacts/keys/rollup_block_root_empty.vk.data.json' assert { type: 'json' }; import MergeRollupVkJson from '../artifacts/keys/rollup_merge.vk.data.json' assert { type: 'json' }; import RootRollupVkJson from '../artifacts/keys/rollup_root.vk.data.json' assert { type: 'json' }; import { type ClientProtocolArtifact, type ProtocolArtifact, type ServerProtocolArtifact } from './artifacts.js'; +import { PrivateKernelResetVkIndexes, PrivateKernelResetVks } from './private_kernel_reset_data.js'; +import { keyJsonToVKData } from './utils/vk_json.js'; -interface VkJson { - keyAsBytes: string; - keyAsFields: string[]; -} - -function keyJsonToVKData(json: VkJson): VerificationKeyData { - const { keyAsBytes, keyAsFields } = json; - return new VerificationKeyData( - new VerificationKeyAsFields( - assertLength( - keyAsFields.map((str: string) => new Fr(Buffer.from(str.slice(2), 'hex'))), - VERIFICATION_KEY_LENGTH_IN_FIELDS, - ), - // TODO(#7410) what should be the vk hash here? - new Fr(Buffer.from(keyAsFields[0].slice(2), 'hex')), - ), - Buffer.from(keyAsBytes, 'hex'), - ); -} - -const ServerCircuitVks: Record = { +export const ServerCircuitVks: Record = { EmptyNestedArtifact: keyJsonToVKData(EmptyNestedVkJson), PrivateKernelEmptyArtifact: keyJsonToVKData(PrivateKernelEmptyVkJson), PublicKernelInnerArtifact: keyJsonToVKData(PublicKernelInnerVkJson), @@ -89,22 +58,17 @@ const ServerCircuitVks: Record = { BaseRollupArtifact: keyJsonToVKData(BaseRollupVkJson), MergeRollupArtifact: keyJsonToVKData(MergeRollupVkJson), BlockRootRollupArtifact: keyJsonToVKData(BlockRootRollupVkJson), - BlockRootRollupFinalArtifact: keyJsonToVKData(BlockRootRollupFinalVkJson), + EmptyBlockRootRollupArtifact: keyJsonToVKData(EmptyBlockRootRollupVkJson), BlockMergeRollupArtifact: keyJsonToVKData(BlockMergeRollupVkJson), RootRollupArtifact: keyJsonToVKData(RootRollupVkJson), }; -const ClientCircuitVks: Record = { +export const ClientCircuitVks: Record = { PrivateKernelInitArtifact: keyJsonToVKData(PrivateKernelInitVkJson), PrivateKernelInnerArtifact: keyJsonToVKData(PrivateKernelInnerVkJson), - PrivateKernelResetFullArtifact: keyJsonToVKData(PrivateKernelResetFullVkJson), - PrivateKernelResetFullInnerArtifact: keyJsonToVKData(PrivateKernelResetFullInnerVkJson), - PrivateKernelResetBigArtifact: keyJsonToVKData(PrivateKernelResetBigVkJson), - PrivateKernelResetMediumArtifact: keyJsonToVKData(PrivateKernelResetMediumVkJson), - PrivateKernelResetSmallArtifact: keyJsonToVKData(PrivateKernelResetSmallVkJson), - PrivateKernelResetTinyArtifact: keyJsonToVKData(PrivateKernelResetTinyVkJson), PrivateKernelTailArtifact: keyJsonToVKData(PrivateKernelTailVkJson), PrivateKernelTailToPublicArtifact: keyJsonToVKData(PrivateKernelTailToPublicVkJson), + ...PrivateKernelResetVks, }; export const ProtocolCircuitVks: Record = { @@ -117,12 +81,6 @@ export const ProtocolCircuitVkIndexes: Record = { PrivateKernelEmptyArtifact: PRIVATE_KERNEL_EMPTY_INDEX, PrivateKernelInitArtifact: PRIVATE_KERNEL_INIT_INDEX, PrivateKernelInnerArtifact: PRIVATE_KERNEL_INNER_INDEX, - PrivateKernelResetFullArtifact: PRIVATE_KERNEL_RESET_FULL_INDEX, - PrivateKernelResetFullInnerArtifact: PRIVATE_KERNEL_RESET_FULL_INNER_INDEX, - PrivateKernelResetBigArtifact: PRIVATE_KERNEL_RESET_BIG_INDEX, - PrivateKernelResetMediumArtifact: PRIVATE_KERNEL_RESET_MEDIUM_INDEX, - PrivateKernelResetSmallArtifact: PRIVATE_KERNEL_RESET_SMALL_INDEX, - PrivateKernelResetTinyArtifact: PRIVATE_KERNEL_RESET_TINY_INDEX, PrivateKernelTailArtifact: PRIVATE_KERNEL_TAIL_INDEX, PrivateKernelTailToPublicArtifact: PRIVATE_KERNEL_TAIL_TO_PUBLIC_INDEX, PublicKernelInnerArtifact: PUBLIC_KERNEL_INNER_INDEX, @@ -135,7 +93,8 @@ export const ProtocolCircuitVkIndexes: Record = { BlockRootRollupArtifact: BLOCK_ROOT_ROLLUP_INDEX, BlockMergeRollupArtifact: BLOCK_MERGE_ROLLUP_INDEX, RootRollupArtifact: ROOT_ROLLUP_INDEX, - BlockRootRollupFinalArtifact: BLOCK_ROOT_ROLLUP_FINAL_INDEX, + EmptyBlockRootRollupArtifact: BLOCK_ROOT_ROLLUP_EMPTY_INDEX, + ...PrivateKernelResetVkIndexes, }; function buildVKTree() { diff --git a/yarn-project/p2p/package.json b/yarn-project/p2p/package.json index 5d754eea552..5a4260dc257 100644 --- a/yarn-project/p2p/package.json +++ b/yarn-project/p2p/package.json @@ -86,6 +86,7 @@ "tslib": "^2.4.0" }, "devDependencies": { + "@aztec/archiver": "workspace:^", "@jest/globals": "^29.5.0", "@types/jest": "^29.5.0", "@types/node": "^18.14.6", diff --git a/yarn-project/p2p/src/attestation_pool/attestation_pool.ts b/yarn-project/p2p/src/attestation_pool/attestation_pool.ts index a4fcb993c6e..cdfe8729911 100644 --- a/yarn-project/p2p/src/attestation_pool/attestation_pool.ts +++ b/yarn-project/p2p/src/attestation_pool/attestation_pool.ts @@ -36,7 +36,8 @@ export interface AttestationPool { * Retrieve all of the attestations observed pertaining to a given slot * * @param slot - The slot to query + * @param proposalId - The proposal to query * @return BlockAttestations */ - getAttestationsForSlot(slot: bigint): Promise; + getAttestationsForSlot(slot: bigint, proposalId: string): Promise; } diff --git a/yarn-project/p2p/src/attestation_pool/memory_attestation_pool.test.ts b/yarn-project/p2p/src/attestation_pool/memory_attestation_pool.test.ts index 98c51e2dd0f..a798dedff59 100644 --- a/yarn-project/p2p/src/attestation_pool/memory_attestation_pool.test.ts +++ b/yarn-project/p2p/src/attestation_pool/memory_attestation_pool.test.ts @@ -1,3 +1,5 @@ +import { Fr } from '@aztec/foundation/fields'; + import { type PrivateKeyAccount } from 'viem'; import { InMemoryAttestationPool } from './memory_attestation_pool.js'; @@ -14,13 +16,16 @@ describe('MemoryAttestationPool', () => { signers = Array.from({ length: NUMBER_OF_SIGNERS_PER_TEST }, generateAccount); }); - it('should add attestation to pool', async () => { + it('should add attestations to pool', async () => { const slotNumber = 420; - const attestations = await Promise.all(signers.map(signer => mockAttestation(signer, slotNumber))); + const archive = Fr.random(); + const attestations = await Promise.all(signers.map(signer => mockAttestation(signer, slotNumber, archive))); + + const proposalId = attestations[0].p2pMessageIdentifier().toString(); await ap.addAttestations(attestations); - const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber)); + const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST); expect(retreivedAttestations).toEqual(attestations); @@ -28,7 +33,7 @@ describe('MemoryAttestationPool', () => { // Delete by slot await ap.deleteAttestationsForSlot(BigInt(slotNumber)); - const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber)); + const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); expect(retreivedAttestationsAfterDelete.length).toBe(0); }); @@ -40,8 +45,29 @@ describe('MemoryAttestationPool', () => { for (const attestation of attestations) { const slot = attestation.payload.header.globalVariables.slotNumber; + const proposalId = attestation.p2pMessageIdentifier().toString(); - const retreivedAttestations = await ap.getAttestationsForSlot(slot.toBigInt()); + const retreivedAttestations = await ap.getAttestationsForSlot(slot.toBigInt(), proposalId); + expect(retreivedAttestations.length).toBe(1); + expect(retreivedAttestations[0]).toEqual(attestation); + expect(retreivedAttestations[0].payload.header.globalVariables.slotNumber).toEqual(slot); + } + }); + + it('Should store attestations by differing slot and archive', async () => { + const slotNumbers = [1, 2, 3, 4]; + const archives = [Fr.random(), Fr.random(), Fr.random(), Fr.random()]; + const attestations = await Promise.all( + signers.map((signer, i) => mockAttestation(signer, slotNumbers[i], archives[i])), + ); + + await ap.addAttestations(attestations); + + for (const attestation of attestations) { + const slot = attestation.payload.header.globalVariables.slotNumber; + const proposalId = attestation.p2pMessageIdentifier().toString(); + + const retreivedAttestations = await ap.getAttestationsForSlot(slot.toBigInt(), proposalId); expect(retreivedAttestations.length).toBe(1); expect(retreivedAttestations[0]).toEqual(attestation); expect(retreivedAttestations[0].payload.header.globalVariables.slotNumber).toEqual(slot); @@ -50,17 +76,55 @@ describe('MemoryAttestationPool', () => { it('Should delete attestations', async () => { const slotNumber = 420; - const attestations = await Promise.all(signers.map(signer => mockAttestation(signer, slotNumber))); + const archive = Fr.random(); + const attestations = await Promise.all(signers.map(signer => mockAttestation(signer, slotNumber, archive))); + const proposalId = attestations[0].p2pMessageIdentifier().toString(); await ap.addAttestations(attestations); - const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber)); + const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST); expect(retreivedAttestations).toEqual(attestations); await ap.deleteAttestations(attestations); - const gottenAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber)); + const gottenAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); expect(gottenAfterDelete.length).toBe(0); }); + + it('Should blanket delete attestations per slot', async () => { + const slotNumber = 420; + const archive = Fr.random(); + const attestations = await Promise.all(signers.map(signer => mockAttestation(signer, slotNumber, archive))); + const proposalId = attestations[0].p2pMessageIdentifier().toString(); + + await ap.addAttestations(attestations); + + const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); + expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST); + expect(retreivedAttestations).toEqual(attestations); + + await ap.deleteAttestationsForSlot(BigInt(slotNumber)); + + const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); + expect(retreivedAttestationsAfterDelete.length).toBe(0); + }); + + it('Should blanket delete attestations per slot and proposal', async () => { + const slotNumber = 420; + const archive = Fr.random(); + const attestations = await Promise.all(signers.map(signer => mockAttestation(signer, slotNumber, archive))); + const proposalId = attestations[0].p2pMessageIdentifier().toString(); + + await ap.addAttestations(attestations); + + const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); + expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST); + expect(retreivedAttestations).toEqual(attestations); + + await ap.deleteAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId); + + const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); + expect(retreivedAttestationsAfterDelete.length).toBe(0); + }); }); diff --git a/yarn-project/p2p/src/attestation_pool/memory_attestation_pool.ts b/yarn-project/p2p/src/attestation_pool/memory_attestation_pool.ts index c71a638d99c..34337109afc 100644 --- a/yarn-project/p2p/src/attestation_pool/memory_attestation_pool.ts +++ b/yarn-project/p2p/src/attestation_pool/memory_attestation_pool.ts @@ -4,19 +4,21 @@ import { createDebugLogger } from '@aztec/foundation/log'; import { type AttestationPool } from './attestation_pool.js'; export class InMemoryAttestationPool implements AttestationPool { - private attestations: Map>; + private attestations: Map>>; constructor(private log = createDebugLogger('aztec:attestation_pool')) { this.attestations = new Map(); } - public getAttestationsForSlot(slot: bigint): Promise { + public getAttestationsForSlot(slot: bigint, proposalId: string): Promise { const slotAttestationMap = this.attestations.get(slot); if (slotAttestationMap) { - return Promise.resolve(Array.from(slotAttestationMap.values())); - } else { - return Promise.resolve([]); + const proposalAttestationMap = slotAttestationMap.get(proposalId); + if (proposalAttestationMap) { + return Promise.resolve(Array.from(proposalAttestationMap.values())); + } } + return Promise.resolve([]); } public addAttestations(attestations: BlockAttestation[]): Promise { @@ -24,10 +26,12 @@ export class InMemoryAttestationPool implements AttestationPool { // Perf: order and group by slot before insertion const slotNumber = attestation.payload.header.globalVariables.slotNumber; + const proposalId = attestation.p2pMessageIdentifier().toString(); const address = attestation.getSender(); const slotAttestationMap = getSlotOrDefault(this.attestations, slotNumber.toBigInt()); - slotAttestationMap.set(address.toString(), attestation); + const proposalAttestationMap = getProposalOrDefault(slotAttestationMap, proposalId); + proposalAttestationMap.set(address.toString(), attestation); this.log.verbose(`Added attestation for slot ${slotNumber} from ${address}`); } @@ -41,14 +45,27 @@ export class InMemoryAttestationPool implements AttestationPool { return Promise.resolve(); } + public deleteAttestationsForSlotAndProposal(slot: bigint, proposalId: string): Promise { + const slotAttestationMap = this.attestations.get(slot); + if (slotAttestationMap) { + slotAttestationMap.delete(proposalId); + this.log.verbose(`Removed attestation for slot ${slot}`); + } + return Promise.resolve(); + } + public deleteAttestations(attestations: BlockAttestation[]): Promise { for (const attestation of attestations) { const slotNumber = attestation.payload.header.globalVariables.slotNumber; const slotAttestationMap = this.attestations.get(slotNumber.toBigInt()); if (slotAttestationMap) { - const address = attestation.getSender(); - slotAttestationMap.delete(address.toString()); - this.log.verbose(`Deleted attestation for slot ${slotNumber} from ${address}`); + const proposalId = attestation.p2pMessageIdentifier().toString(); + const proposalAttestationMap = getProposalOrDefault(slotAttestationMap, proposalId); + if (proposalAttestationMap) { + const address = attestation.getSender(); + proposalAttestationMap.delete(address.toString()); + this.log.debug(`Deleted attestation for slot ${slotNumber} from ${address}`); + } } } return Promise.resolve(); @@ -59,13 +76,34 @@ export class InMemoryAttestationPool implements AttestationPool { * Get Slot or Default * * Fetch the slot mapping, if it does not exist, then create a mapping and return it + * @param map - The map to fetch from + * @param slot - The slot to fetch + * @returns The slot mapping */ function getSlotOrDefault( - map: Map>, + map: Map>>, slot: bigint, -): Map { +): Map> { if (!map.has(slot)) { - map.set(slot, new Map()); + map.set(slot, new Map>()); } return map.get(slot)!; } + +/** + * Get Proposal or Default + * + * Fetch the proposal mapping, if it does not exist, then create a mapping and return it + * @param map - The map to fetch from + * @param proposalId - The proposal id to fetch + * @returns The proposal mapping + */ +function getProposalOrDefault( + map: Map>, + proposalId: string, +): Map { + if (!map.has(proposalId)) { + map.set(proposalId, new Map()); + } + return map.get(proposalId)!; +} diff --git a/yarn-project/p2p/src/attestation_pool/mocks.ts b/yarn-project/p2p/src/attestation_pool/mocks.ts index a0c3e1d05f3..bf75e7c3905 100644 --- a/yarn-project/p2p/src/attestation_pool/mocks.ts +++ b/yarn-project/p2p/src/attestation_pool/mocks.ts @@ -22,10 +22,13 @@ export const generateAccount = () => { * @param slot The slot number the attestation is for * @returns A Block Attestation */ -export const mockAttestation = async (signer: PrivateKeyAccount, slot: number = 0): Promise => { +export const mockAttestation = async ( + signer: PrivateKeyAccount, + slot: number = 0, + archive: Fr = Fr.random(), +): Promise => { // Use arbitrary numbers for all other than slot const header = makeHeader(1, 2, slot); - const archive = Fr.random(); const txs = [0, 1, 2, 3, 4, 5].map(() => TxHash.random()); const payload = new ConsensusPayload(header, archive, txs); diff --git a/yarn-project/p2p/src/client/index.ts b/yarn-project/p2p/src/client/index.ts index e36054fd7fd..aaafccba9f1 100644 --- a/yarn-project/p2p/src/client/index.ts +++ b/yarn-project/p2p/src/client/index.ts @@ -6,8 +6,11 @@ import { type TelemetryClient } from '@aztec/telemetry-client'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { type AttestationPool } from '../attestation_pool/attestation_pool.js'; +import { InMemoryAttestationPool } from '../attestation_pool/memory_attestation_pool.js'; import { P2PClient } from '../client/p2p_client.js'; import { type P2PConfig } from '../config.js'; +import { type EpochProofQuotePool } from '../epoch_proof_quote_pool/epoch_proof_quote_pool.js'; +import { MemoryEpochProofQuotePool } from '../epoch_proof_quote_pool/memory_epoch_proof_quote_pool.js'; import { DiscV5Service } from '../service/discV5_service.js'; import { DummyP2PService } from '../service/dummy_service.js'; import { LibP2PService, createLibP2PPeerId } from '../service/index.js'; @@ -18,16 +21,22 @@ export * from './p2p_client.js'; export const createP2PClient = async ( _config: P2PConfig & DataStoreConfig, - attestationsPool: AttestationPool, l2BlockSource: L2BlockSource, proofVerifier: ClientProtocolCircuitVerifier, worldStateSynchronizer: WorldStateSynchronizer, telemetry: TelemetryClient = new NoopTelemetryClient(), - deps: { txPool?: TxPool; store?: AztecKVStore } = {}, + deps: { + txPool?: TxPool; + store?: AztecKVStore; + attestationsPool?: AttestationPool; + epochProofQuotePool?: EpochProofQuotePool; + } = {}, ) => { let config = { ..._config }; const store = deps.store ?? (await createStore('p2p', config, createDebugLogger('aztec:p2p:lmdb'))); const txPool = deps.txPool ?? new AztecKVTxPool(store, telemetry); + const attestationsPool = deps.attestationsPool ?? new InMemoryAttestationPool(); + const epochProofQuotePool = deps.epochProofQuotePool ?? new MemoryEpochProofQuotePool(); let p2pService; @@ -52,7 +61,15 @@ export const createP2PClient = async ( } else { p2pService = new DummyP2PService(); } - return new P2PClient(store, l2BlockSource, txPool, attestationsPool, p2pService, config.keepProvenTxsInPoolFor); + return new P2PClient( + store, + l2BlockSource, + txPool, + attestationsPool, + epochProofQuotePool, + p2pService, + config.keepProvenTxsInPoolFor, + ); }; async function configureP2PClientAddresses(_config: P2PConfig & DataStoreConfig): Promise { diff --git a/yarn-project/p2p/src/client/p2p_client.test.ts b/yarn-project/p2p/src/client/p2p_client.test.ts index 196a0ee45b7..3d16237dfb1 100644 --- a/yarn-project/p2p/src/client/p2p_client.test.ts +++ b/yarn-project/p2p/src/client/p2p_client.test.ts @@ -1,4 +1,5 @@ -import { mockTx } from '@aztec/circuit-types'; +import { MockBlockSource } from '@aztec/archiver/test'; +import { mockEpochProofQuote, mockTx } from '@aztec/circuit-types'; import { retryUntil } from '@aztec/foundation/retry'; import { type AztecKVStore } from '@aztec/kv-store'; import { openTmpStore } from '@aztec/kv-store/utils'; @@ -6,9 +7,8 @@ import { openTmpStore } from '@aztec/kv-store/utils'; import { expect, jest } from '@jest/globals'; import { type AttestationPool } from '../attestation_pool/attestation_pool.js'; -import { type P2PService } from '../index.js'; +import { type EpochProofQuotePool, type P2PService } from '../index.js'; import { type TxPool } from '../tx_pool/index.js'; -import { MockBlockSource } from './mocks.js'; import { P2PClient } from './p2p_client.js'; /** @@ -21,6 +21,7 @@ type Mockify = { describe('In-Memory P2P Client', () => { let txPool: Mockify; let attestationPool: Mockify; + let epochProofQuotePool: Mockify; let blockSource: MockBlockSource; let p2pService: Mockify; let kvStore: AztecKVStore; @@ -55,14 +56,21 @@ describe('In-Memory P2P Client', () => { getAttestationsForSlot: jest.fn().mockReturnValue(undefined), }; + epochProofQuotePool = { + addQuote: jest.fn(), + getQuotes: jest.fn().mockReturnValue([]), + deleteQuotesToEpoch: jest.fn(), + }; + blockSource = new MockBlockSource(); kvStore = openTmpStore(); - client = new P2PClient(kvStore, blockSource, txPool, attestationPool, p2pService, 0); + client = new P2PClient(kvStore, blockSource, txPool, attestationPool, epochProofQuotePool, p2pService, 0); }); - const advanceToProvenBlock = async (getProvenBlockNumber: number) => { + const advanceToProvenBlock = async (getProvenBlockNumber: number, provenEpochNumber = getProvenBlockNumber) => { blockSource.setProvenBlockNumber(getProvenBlockNumber); + blockSource.setProvenEpochNumber(provenEpochNumber); await retryUntil( () => Promise.resolve(client.getSyncedProvenBlockNum() >= getProvenBlockNumber), 'synced', @@ -71,14 +79,20 @@ describe('In-Memory P2P Client', () => { ); }; + afterEach(async () => { + if (client.isReady()) { + await client.stop(); + } + }); + it('can start & stop', async () => { - expect(await client.isReady()).toEqual(false); + expect(client.isReady()).toEqual(false); await client.start(); - expect(await client.isReady()).toEqual(true); + expect(client.isReady()).toEqual(true); await client.stop(); - expect(await client.isReady()).toEqual(false); + expect(client.isReady()).toEqual(false); }); it('adds txs to pool', async () => { @@ -121,7 +135,7 @@ describe('In-Memory P2P Client', () => { await client.start(); await client.stop(); - const client2 = new P2PClient(kvStore, blockSource, txPool, attestationPool, p2pService, 0); + const client2 = new P2PClient(kvStore, blockSource, txPool, attestationPool, epochProofQuotePool, p2pService, 0); expect(client2.getSyncedLatestBlockNum()).toEqual(client.getSyncedLatestBlockNum()); }); @@ -136,7 +150,7 @@ describe('In-Memory P2P Client', () => { }); it('deletes txs after waiting the set number of blocks', async () => { - client = new P2PClient(kvStore, blockSource, txPool, attestationPool, p2pService, 10); + client = new P2PClient(kvStore, blockSource, txPool, attestationPool, epochProofQuotePool, p2pService, 10); blockSource.setProvenBlockNumber(0); await client.start(); expect(txPool.deleteTxs).not.toHaveBeenCalled(); @@ -152,5 +166,63 @@ describe('In-Memory P2P Client', () => { await client.stop(); }); + it('stores and returns epoch proof quotes', async () => { + client = new P2PClient(kvStore, blockSource, txPool, attestationPool, epochProofQuotePool, p2pService, 0); + + blockSource.setProvenEpochNumber(2); + await client.start(); + + const proofQuotes = [ + mockEpochProofQuote(3n), + mockEpochProofQuote(2n), + mockEpochProofQuote(3n), + mockEpochProofQuote(4n), + mockEpochProofQuote(2n), + mockEpochProofQuote(3n), + ]; + + for (const quote of proofQuotes) { + client.broadcastEpochProofQuote(quote); + } + expect(epochProofQuotePool.addQuote).toBeCalledTimes(proofQuotes.length); + + for (let i = 0; i < proofQuotes.length; i++) { + expect(epochProofQuotePool.addQuote).toHaveBeenNthCalledWith(i + 1, proofQuotes[i]); + } + expect(epochProofQuotePool.addQuote).toBeCalledTimes(proofQuotes.length); + + await client.getEpochProofQuotes(2n); + + expect(epochProofQuotePool.getQuotes).toBeCalledTimes(1); + expect(epochProofQuotePool.getQuotes).toBeCalledWith(2n); + }); + + it('deletes expired proof quotes', async () => { + client = new P2PClient(kvStore, blockSource, txPool, attestationPool, epochProofQuotePool, p2pService, 0); + + blockSource.setProvenEpochNumber(1); + blockSource.setProvenBlockNumber(1); + await client.start(); + + const proofQuotes = [ + mockEpochProofQuote(3n), + mockEpochProofQuote(2n), + mockEpochProofQuote(3n), + mockEpochProofQuote(4n), + mockEpochProofQuote(2n), + mockEpochProofQuote(3n), + ]; + + for (const quote of proofQuotes) { + client.broadcastEpochProofQuote(quote); + } + + epochProofQuotePool.deleteQuotesToEpoch.mockReset(); + + await advanceToProvenBlock(3, 3); + + expect(epochProofQuotePool.deleteQuotesToEpoch).toBeCalledWith(3n); + }); + // TODO(https://github.com/AztecProtocol/aztec-packages/issues/7971): tests for attestation pool pruning }); diff --git a/yarn-project/p2p/src/client/p2p_client.ts b/yarn-project/p2p/src/client/p2p_client.ts index 63c5b453f0a..b22b42700be 100644 --- a/yarn-project/p2p/src/client/p2p_client.ts +++ b/yarn-project/p2p/src/client/p2p_client.ts @@ -1,6 +1,7 @@ import { type BlockAttestation, type BlockProposal, + type EpochProofQuote, type L2Block, L2BlockDownloader, type L2BlockSource, @@ -15,6 +16,7 @@ import { type ENR } from '@chainsafe/enr'; import { type AttestationPool } from '../attestation_pool/attestation_pool.js'; import { getP2PConfigEnvVars } from '../config.js'; +import { type EpochProofQuotePool } from '../epoch_proof_quote_pool/epoch_proof_quote_pool.js'; import { TX_REQ_PROTOCOL } from '../service/reqresp/interface.js'; import type { P2PService } from '../service/service.js'; import { type TxPool } from '../tx_pool/index.js'; @@ -58,9 +60,25 @@ export interface P2P { * Queries the Attestation pool for attestations for the given slot * * @param slot - the slot to query + * @param proposalId - the proposal id to query * @returns BlockAttestations */ - getAttestationsForSlot(slot: bigint): Promise; + getAttestationsForSlot(slot: bigint, proposalId: string): Promise; + + /** + * Queries the EpochProofQuote pool for quotes for the given epoch + * + * @param epoch - the epoch to query + * @returns EpochProofQuotes + */ + getEpochProofQuotes(epoch: bigint): Promise; + + /** + * Broadcasts an EpochProofQuote to other peers. + * + * @param quote - the quote to broadcast + */ + broadcastEpochProofQuote(quote: EpochProofQuote): void; /** * Registers a callback from the validator client that determines how to behave when @@ -134,7 +152,7 @@ export interface P2P { * Indicates if the p2p client is ready for transaction submission. * @returns A boolean flag indicating readiness. */ - isReady(): Promise; + isReady(): boolean; /** * Returns the current status of the p2p client. @@ -186,6 +204,7 @@ export class P2PClient implements P2P { private l2BlockSource: L2BlockSource, private txPool: TxPool, private attestationPool: AttestationPool, + private epochProofQuotePool: EpochProofQuotePool, private p2pService: P2PService, private keepProvenTxsFor: number, private log = createDebugLogger('aztec:p2p'), @@ -202,6 +221,22 @@ export class P2PClient implements P2P { this.synchedProvenBlockNumber = store.openSingleton('p2p_pool_last_proven_l2_block'); } + #assertIsReady() { + if (!this.isReady()) { + throw new Error('P2P client not ready'); + } + } + + getEpochProofQuotes(epoch: bigint): Promise { + return Promise.resolve(this.epochProofQuotePool.getQuotes(epoch)); + } + + broadcastEpochProofQuote(quote: EpochProofQuote): void { + this.#assertIsReady(); + this.epochProofQuotePool.addQuote(quote); + return this.p2pService.propagate(quote); + } + /** * Starts the P2P client. * @returns An empty promise signalling the synching process. @@ -281,8 +316,8 @@ export class P2PClient implements P2P { return this.p2pService.propagate(proposal); } - public getAttestationsForSlot(slot: bigint): Promise { - return Promise.resolve(this.attestationPool.getAttestationsForSlot(slot)); + public getAttestationsForSlot(slot: bigint, proposalId: string): Promise { + return Promise.resolve(this.attestationPool.getAttestationsForSlot(slot, proposalId)); } // REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963 @@ -363,10 +398,7 @@ export class P2PClient implements P2P { * @returns Empty promise. **/ public async sendTx(tx: Tx): Promise { - const ready = await this.isReady(); - if (!ready) { - throw new Error('P2P client not ready'); - } + this.#assertIsReady(); await this.txPool.addTxs([tx]); this.p2pService.propagate(tx); } @@ -391,10 +423,7 @@ export class P2PClient implements P2P { * @returns Empty promise. **/ public async deleteTxs(txHashes: TxHash[]): Promise { - const ready = await this.isReady(); - if (!ready) { - throw new Error('P2P client not ready'); - } + this.#assertIsReady(); await this.txPool.deleteTxs(txHashes); } @@ -403,7 +432,7 @@ export class P2PClient implements P2P { * @returns True if the P2P client is ready to receive txs. */ public isReady() { - return Promise.resolve(this.currentState === P2PClientState.RUNNING); + return this.currentState === P2PClientState.RUNNING; } /** @@ -499,6 +528,10 @@ export class P2PClient implements P2P { await this.synchedProvenBlockNumber.set(lastBlockNum); this.log.debug(`Synched to proven block ${lastBlockNum}`); + const provenEpochNumber = await this.l2BlockSource.getProvenL2EpochNumber(); + if (provenEpochNumber !== undefined) { + this.epochProofQuotePool.deleteQuotesToEpoch(BigInt(provenEpochNumber)); + } await this.startServiceIfSynched(); } diff --git a/yarn-project/p2p/src/epoch_proof_quote_pool/epoch_proof_quote_pool.ts b/yarn-project/p2p/src/epoch_proof_quote_pool/epoch_proof_quote_pool.ts new file mode 100644 index 00000000000..94776d04ac3 --- /dev/null +++ b/yarn-project/p2p/src/epoch_proof_quote_pool/epoch_proof_quote_pool.ts @@ -0,0 +1,7 @@ +import { type EpochProofQuote } from '@aztec/circuit-types'; + +export interface EpochProofQuotePool { + addQuote(quote: EpochProofQuote): void; + getQuotes(epoch: bigint): EpochProofQuote[]; + deleteQuotesToEpoch(epoch: bigint): void; +} diff --git a/yarn-project/p2p/src/epoch_proof_quote_pool/index.ts b/yarn-project/p2p/src/epoch_proof_quote_pool/index.ts new file mode 100644 index 00000000000..8073ff1866f --- /dev/null +++ b/yarn-project/p2p/src/epoch_proof_quote_pool/index.ts @@ -0,0 +1,3 @@ +export * from './epoch_proof_quote_pool.js'; +export * from './memory_epoch_proof_quote_pool.js'; +export * from './test_utils.js'; diff --git a/yarn-project/p2p/src/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.test.ts b/yarn-project/p2p/src/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.test.ts new file mode 100644 index 00000000000..16ea4aeec52 --- /dev/null +++ b/yarn-project/p2p/src/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.test.ts @@ -0,0 +1,55 @@ +import { mockEpochProofQuote } from '@aztec/circuit-types'; + +import { MemoryEpochProofQuotePool } from './memory_epoch_proof_quote_pool.js'; + +describe('MemoryEpochProofQuotePool', () => { + let pool: MemoryEpochProofQuotePool; + + beforeEach(() => { + pool = new MemoryEpochProofQuotePool(); + }); + + it('should add/get quotes to/from pool', () => { + const quote = mockEpochProofQuote(5n); + + pool.addQuote(quote); + + const quotes = pool.getQuotes(quote.payload.epochToProve); + + expect(quotes).toHaveLength(1); + expect(quotes[0]).toEqual(quote); + }); + + it('should delete quotes for expired epochs', () => { + const proofQuotes = [ + mockEpochProofQuote(3n), + mockEpochProofQuote(2n), + mockEpochProofQuote(3n), + mockEpochProofQuote(4n), + mockEpochProofQuote(2n), + mockEpochProofQuote(3n), + ]; + + for (const quote of proofQuotes) { + pool.addQuote(quote); + } + + const quotes3 = pool.getQuotes(3n); + const quotesForEpoch3 = proofQuotes.filter(x => x.payload.epochToProve === 3n); + + expect(quotes3).toHaveLength(quotesForEpoch3.length); + expect(quotes3).toEqual(quotesForEpoch3); + + // should delete all quotes for epochs 2 and 3 + pool.deleteQuotesToEpoch(3n); + + expect(pool.getQuotes(2n)).toHaveLength(0); + expect(pool.getQuotes(3n)).toHaveLength(0); + + const quotes4 = pool.getQuotes(4n); + const quotesForEpoch4 = proofQuotes.filter(x => x.payload.epochToProve === 4n); + + expect(quotes4).toHaveLength(quotesForEpoch4.length); + expect(quotes4).toEqual(quotesForEpoch4); + }); +}); diff --git a/yarn-project/p2p/src/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.ts b/yarn-project/p2p/src/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.ts new file mode 100644 index 00000000000..a9166838a1b --- /dev/null +++ b/yarn-project/p2p/src/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.ts @@ -0,0 +1,26 @@ +import { type EpochProofQuote } from '@aztec/circuit-types'; + +import { type EpochProofQuotePool } from './epoch_proof_quote_pool.js'; + +export class MemoryEpochProofQuotePool implements EpochProofQuotePool { + private quotes: Map; + constructor() { + this.quotes = new Map(); + } + addQuote(quote: EpochProofQuote) { + const epoch = quote.payload.epochToProve; + if (!this.quotes.has(epoch)) { + this.quotes.set(epoch, []); + } + this.quotes.get(epoch)!.push(quote); + } + getQuotes(epoch: bigint): EpochProofQuote[] { + return this.quotes.get(epoch) || []; + } + deleteQuotesToEpoch(epoch: bigint): void { + const expiredEpochs = Array.from(this.quotes.keys()).filter(k => k <= epoch); + for (const expiredEpoch of expiredEpochs) { + this.quotes.delete(expiredEpoch); + } + } +} diff --git a/yarn-project/p2p/src/epoch_proof_quote_pool/test_utils.ts b/yarn-project/p2p/src/epoch_proof_quote_pool/test_utils.ts new file mode 100644 index 00000000000..a59de8daa3c --- /dev/null +++ b/yarn-project/p2p/src/epoch_proof_quote_pool/test_utils.ts @@ -0,0 +1,26 @@ +import { EpochProofQuote, EpochProofQuotePayload } from '@aztec/circuit-types'; +import { EthAddress } from '@aztec/circuits.js'; +import { Buffer32 } from '@aztec/foundation/buffer'; +import { Secp256k1Signer, randomBigInt, randomInt } from '@aztec/foundation/crypto'; + +export function makeRandomEpochProofQuotePayload(): EpochProofQuotePayload { + return EpochProofQuotePayload.from({ + basisPointFee: randomInt(10000), + bondAmount: 1000000000000000000n, + epochToProve: randomBigInt(1000000n), + prover: EthAddress.random(), + validUntilSlot: randomBigInt(1000000n), + }); +} + +export function makeRandomEpochProofQuote(payload?: EpochProofQuotePayload): { + quote: EpochProofQuote; + signer: Secp256k1Signer; +} { + const signer = Secp256k1Signer.random(); + + return { + quote: EpochProofQuote.new(Buffer32.random(), payload ?? makeRandomEpochProofQuotePayload(), signer), + signer, + }; +} diff --git a/yarn-project/p2p/src/index.ts b/yarn-project/p2p/src/index.ts index e69651a7904..4a5c64fda7e 100644 --- a/yarn-project/p2p/src/index.ts +++ b/yarn-project/p2p/src/index.ts @@ -1,7 +1,8 @@ +export * from './attestation_pool/index.js'; +export * from './bootstrap/bootstrap.js'; export * from './client/index.js'; export * from './config.js'; -export * from './tx_pool/index.js'; -export * from './attestation_pool/index.js'; +export * from './epoch_proof_quote_pool/index.js'; export * from './service/index.js'; -export * from './bootstrap/bootstrap.js'; +export * from './tx_pool/index.js'; export * from './tx_validator/index.js'; diff --git a/yarn-project/p2p/src/service/reqresp/p2p_client.integration.test.ts b/yarn-project/p2p/src/service/reqresp/p2p_client.integration.test.ts index b52433a9b7b..b813c799a69 100644 --- a/yarn-project/p2p/src/service/reqresp/p2p_client.integration.test.ts +++ b/yarn-project/p2p/src/service/reqresp/p2p_client.integration.test.ts @@ -1,4 +1,5 @@ // An integration test for the p2p client to test req resp protocols +import { MockBlockSource } from '@aztec/archiver/test'; import { type ClientProtocolCircuitVerifier, type WorldStateSynchronizer, mockTx } from '@aztec/circuit-types'; import { EthAddress } from '@aztec/circuits.js'; import { createDebugLogger } from '@aztec/foundation/log'; @@ -14,9 +15,9 @@ import { generatePrivateKey } from 'viem/accounts'; import { type AttestationPool } from '../../attestation_pool/attestation_pool.js'; import { createP2PClient } from '../../client/index.js'; -import { MockBlockSource } from '../../client/mocks.js'; import { type P2PClient } from '../../client/p2p_client.js'; import { type P2PConfig, getP2PDefaultConfig } from '../../config.js'; +import { type EpochProofQuotePool } from '../../epoch_proof_quote_pool/epoch_proof_quote_pool.js'; import { AlwaysFalseCircuitVerifier, AlwaysTrueCircuitVerifier } from '../../mocks/index.js'; import { type TxPool } from '../../tx_pool/index.js'; import { convertToMultiaddr } from '../../util.js'; @@ -47,6 +48,7 @@ const NUMBER_OF_PEERS = 2; describe('Req Resp p2p client integration', () => { let txPool: Mockify; let attestationPool: Mockify; + let epochProofQuotePool: Mockify; let blockSource: MockBlockSource; let kvStore: AztecKVStore; let worldStateSynchronizer: WorldStateSynchronizer; @@ -134,22 +136,22 @@ describe('Req Resp p2p client integration', () => { getAttestationsForSlot: jest.fn().mockReturnValue(undefined), }; + epochProofQuotePool = { + addQuote: jest.fn(), + getQuotes: jest.fn().mockReturnValue([]), + deleteQuotesToEpoch: jest.fn(), + }; + blockSource = new MockBlockSource(); proofVerifier = alwaysTrueVerifier ? new AlwaysTrueCircuitVerifier() : new AlwaysFalseCircuitVerifier(); kvStore = openTmpStore(); const deps = { txPool: txPool as unknown as TxPool, + attestationPool: attestationPool as unknown as AttestationPool, + epochProofQuotePool: epochProofQuotePool as unknown as EpochProofQuotePool, store: kvStore, }; - const client = await createP2PClient( - config, - attestationPool as unknown as AttestationPool, - blockSource, - proofVerifier, - worldStateSynchronizer, - undefined, - deps, - ); + const client = await createP2PClient(config, blockSource, proofVerifier, worldStateSynchronizer, undefined, deps); await client.start(); clients.push(client); diff --git a/yarn-project/p2p/tsconfig.json b/yarn-project/p2p/tsconfig.json index fcbafbb11d0..dbffd3db046 100644 --- a/yarn-project/p2p/tsconfig.json +++ b/yarn-project/p2p/tsconfig.json @@ -20,6 +20,9 @@ }, { "path": "../telemetry-client" + }, + { + "path": "../archiver" } ], "include": ["src"] diff --git a/yarn-project/prover-client/src/index.ts b/yarn-project/prover-client/src/index.ts index 1945a792047..36affdfba2a 100644 --- a/yarn-project/prover-client/src/index.ts +++ b/yarn-project/prover-client/src/index.ts @@ -1,4 +1,4 @@ -export { ProverClient } from '@aztec/circuit-types'; +export { EpochProverManager } from '@aztec/circuit-types'; export * from './tx-prover/tx-prover.js'; export * from './config.js'; diff --git a/yarn-project/prover-client/src/mocks/test_context.ts b/yarn-project/prover-client/src/mocks/test_context.ts index c3e709fb6d3..84732a4c12b 100644 --- a/yarn-project/prover-client/src/mocks/test_context.ts +++ b/yarn-project/prover-client/src/mocks/test_context.ts @@ -1,14 +1,14 @@ import { type BBProverConfig } from '@aztec/bb-prover'; import { - type BlockProver, type MerkleTreeAdminOperations, type ProcessedTx, + type ProcessedTxHandler, type PublicExecutionRequest, type ServerCircuitProver, type Tx, type TxValidator, } from '@aztec/circuit-types'; -import { type Gas, GlobalVariables, Header, type Nullifier, type TxContext } from '@aztec/circuits.js'; +import { type Gas, type GlobalVariables, Header, type Nullifier, type TxContext } from '@aztec/circuits.js'; import { type Fr } from '@aztec/foundation/fields'; import { type DebugLogger } from '@aztec/foundation/log'; import { openTmpStore } from '@aztec/kv-store/utils'; @@ -53,7 +53,7 @@ export class TestContext { public logger: DebugLogger, ) {} - public get blockProver() { + public get epochProver() { return this.orchestrator; } @@ -89,7 +89,7 @@ export class TestContext { actualDb, publicExecutor, publicKernel, - GlobalVariables.empty(), + globalVariables, Header.empty(), worldStateDB, telemetry, @@ -150,7 +150,7 @@ export class TestContext { public async processPublicFunctions( txs: Tx[], maxTransactions: number, - blockProver?: BlockProver, + txHandler?: ProcessedTxHandler, txValidator?: TxValidator, ) { const defaultExecutorImplementation = ( @@ -182,7 +182,7 @@ export class TestContext { return await this.processPublicFunctionsWithMockExecutorImplementation( txs, maxTransactions, - blockProver, + txHandler, txValidator, defaultExecutorImplementation, ); @@ -191,7 +191,7 @@ export class TestContext { public async processPublicFunctionsWithMockExecutorImplementation( txs: Tx[], maxTransactions: number, - blockProver?: BlockProver, + txHandler?: ProcessedTxHandler, txValidator?: TxValidator, executorMock?: ( execution: PublicExecutionRequest, @@ -206,6 +206,6 @@ export class TestContext { if (executorMock) { this.publicExecutor.simulate.mockImplementation(executorMock); } - return await this.publicProcessor.process(txs, maxTransactions, blockProver, txValidator); + return await this.publicProcessor.process(txs, maxTransactions, txHandler, txValidator); } } diff --git a/yarn-project/prover-client/src/orchestrator/block-proving-state.ts b/yarn-project/prover-client/src/orchestrator/block-proving-state.ts index f3c2519c831..6c9d335ddf6 100644 --- a/yarn-project/prover-client/src/orchestrator/block-proving-state.ts +++ b/yarn-project/prover-client/src/orchestrator/block-proving-state.ts @@ -1,4 +1,4 @@ -import { type L2Block, type MerkleTreeId, type ProvingResult } from '@aztec/circuit-types'; +import { type L2Block, type MerkleTreeId } from '@aztec/circuit-types'; import { type ARCHIVE_HEIGHT, type AppendOnlyTreeSnapshot, @@ -18,14 +18,9 @@ import { } from '@aztec/circuits.js'; import { type Tuple } from '@aztec/foundation/serialize'; +import { type EpochProvingState } from './epoch-proving-state.js'; import { type TxProvingState } from './tx-proving-state.js'; -enum PROVING_STATE_LIFECYCLE { - PROVING_STATE_CREATED, - PROVING_STATE_RESOLVED, - PROVING_STATE_REJECTED, -} - export type MergeRollupInputData = { inputs: [BaseOrMergeRollupPublicInputs | undefined, BaseOrMergeRollupPublicInputs | undefined]; proofs: [ @@ -46,12 +41,11 @@ export class BlockProvingState { private rootParityInputs: Array | undefined> = []; private finalRootParityInputs: RootParityInput | undefined; public blockRootRollupPublicInputs: BlockRootOrBlockMergePublicInputs | undefined; + public blockRootRollupStarted: boolean = false; public finalProof: Proof | undefined; public block: L2Block | undefined; private txs: TxProvingState[] = []; - private provingStateLifecycle = PROVING_STATE_LIFECYCLE.PROVING_STATE_CREATED; - constructor( public readonly index: number, public readonly totalNumTxs: number, @@ -63,8 +57,7 @@ export class BlockProvingState { public readonly archiveTreeSnapshot: AppendOnlyTreeSnapshot, public readonly archiveTreeRootSiblingPath: Tuple, public readonly previousBlockHash: Fr, - private completionCallback?: (result: ProvingResult) => void, - private rejectionCallback?: (reason: string) => void, + private readonly parentEpoch: EpochProvingState, ) { this.rootParityInputs = Array.from({ length: NUM_BASE_PARITY_PER_ROOT_PARITY }).map(_ => undefined); } @@ -188,6 +181,7 @@ export class BlockProvingState { // Returns true if we have sufficient inputs to execute the block root rollup public isReadyForBlockRootRollup() { return !( + this.block === undefined || this.mergeRollupInputs[0] === undefined || this.finalRootParityInput === undefined || this.mergeRollupInputs[0].inputs.findIndex(p => !p) !== -1 @@ -206,35 +200,15 @@ export class BlockProvingState { // Returns true if we are still able to accept transactions, false otherwise public isAcceptingTransactions() { - return ( - this.provingStateLifecycle === PROVING_STATE_LIFECYCLE.PROVING_STATE_CREATED && this.totalNumTxs > this.txs.length - ); + return this.totalNumTxs > this.txs.length; } - // Returns true if this proving state is still valid, false otherwise + // Returns whether the proving state is still valid public verifyState() { - return this.provingStateLifecycle === PROVING_STATE_LIFECYCLE.PROVING_STATE_CREATED; + return this.parentEpoch.verifyState(); } - // Attempts to reject the proving state promise with the given reason public reject(reason: string) { - if (!this.verifyState()) { - return; - } - this.provingStateLifecycle = PROVING_STATE_LIFECYCLE.PROVING_STATE_REJECTED; - if (this.rejectionCallback) { - this.rejectionCallback(reason); - } - } - - // Attempts to resolve the proving state promise with the given result - public resolve(result: ProvingResult) { - if (!this.verifyState()) { - return; - } - this.provingStateLifecycle = PROVING_STATE_LIFECYCLE.PROVING_STATE_RESOLVED; - if (this.completionCallback) { - this.completionCallback(result); - } + this.parentEpoch.reject(reason); } } diff --git a/yarn-project/prover-client/src/orchestrator/epoch-proving-state.ts b/yarn-project/prover-client/src/orchestrator/epoch-proving-state.ts index 350240242b8..a13a8d600dc 100644 --- a/yarn-project/prover-client/src/orchestrator/epoch-proving-state.ts +++ b/yarn-project/prover-client/src/orchestrator/epoch-proving-state.ts @@ -1,4 +1,4 @@ -import { type MerkleTreeId, type ProvingResult } from '@aztec/circuit-types'; +import { type MerkleTreeId } from '@aztec/circuit-types'; import { type ARCHIVE_HEIGHT, type AppendOnlyTreeSnapshot, @@ -36,6 +36,8 @@ export type BlockMergeRollupInputData = { verificationKeys: [VerificationKeyAsFields | undefined, VerificationKeyAsFields | undefined]; }; +export type ProvingResult = { status: 'success' } | { status: 'failure'; reason: string }; + /** * The current state of the proving schedule for an epoch. * Contains the raw inputs and intermediate state to generate every constituent proof in the tree. @@ -59,18 +61,20 @@ export class EpochProvingState { /** Returns the current block proving state */ public get currentBlock(): BlockProvingState | undefined { - return this.blocks[this.blocks.length - 1]; + return this.blocks.at(-1); } // Returns the number of levels of merge rollups public get numMergeLevels() { - return BigInt(Math.ceil(Math.log2(this.totalNumBlocks)) - 1); + const totalLeaves = Math.max(2, this.totalNumBlocks); + return BigInt(Math.ceil(Math.log2(totalLeaves)) - 1); } // Calculates the index and level of the parent rollup circuit // Based on tree implementation in unbalanced_tree.ts -> batchInsert() // REFACTOR: This is repeated from the block orchestrator public findMergeLevel(currentLevel: bigint, currentIndex: bigint) { + const totalLeaves = Math.max(2, this.totalNumBlocks); const moveUpMergeLevel = (levelSize: number, index: bigint, nodeToShift: boolean) => { levelSize /= 2; if (levelSize & 1) { @@ -79,8 +83,7 @@ export class EpochProvingState { index >>= 1n; return { thisLevelSize: levelSize, thisIndex: index, shiftUp: nodeToShift }; }; - let [thisLevelSize, shiftUp] = - this.totalNumBlocks & 1 ? [this.totalNumBlocks - 1, true] : [this.totalNumBlocks, false]; + let [thisLevelSize, shiftUp] = totalLeaves & 1 ? [totalLeaves - 1, true] : [totalLeaves, false]; const maxLevel = this.numMergeLevels + 1n; let placeholder = currentIndex; for (let i = 0; i < maxLevel - currentLevel; i++) { @@ -107,8 +110,6 @@ export class EpochProvingState { archiveTreeSnapshot: AppendOnlyTreeSnapshot, archiveTreeRootSiblingPath: Tuple, previousBlockHash: Fr, - completionCallback?: (result: ProvingResult) => void, - rejectionCallback?: (reason: string) => void, ) { const block = new BlockProvingState( this.blocks.length, @@ -121,15 +122,7 @@ export class EpochProvingState { archiveTreeSnapshot, archiveTreeRootSiblingPath, previousBlockHash, - completionCallback, - reason => { - // Reject the block - if (rejectionCallback) { - rejectionCallback(reason); - } - // An error on any block rejects this whole epoch - this.reject(reason); - }, + this, ); this.blocks.push(block); if (this.blocks.length === this.totalNumBlocks) { @@ -214,10 +207,6 @@ export class EpochProvingState { } this.provingStateLifecycle = PROVING_STATE_LIFECYCLE.PROVING_STATE_REJECTED; this.rejectionCallback(reason); - - for (const block of this.blocks) { - block.reject('Proving cancelled'); - } } // Attempts to resolve the proving state promise with the given result diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator.ts b/yarn-project/prover-client/src/orchestrator/orchestrator.ts index 63cf099f51a..79d792154d1 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator.ts @@ -1,20 +1,14 @@ import { - BlockProofError, Body, EncryptedNoteTxL2Logs, EncryptedTxL2Logs, L2Block, MerkleTreeId, - PROVING_STATUS, type PaddingProcessedTx, type ProcessedTx, - type ProvingBlockResult, ProvingRequestType, - type ProvingResult, - type ProvingTicket, type PublicInputsAndRecursiveProof, type ServerCircuitProver, - Tx, type TxEffect, UnencryptedTxL2Logs, makeEmptyProcessedTx, @@ -31,6 +25,7 @@ import { type BaseRollupInputs, type BlockRootOrBlockMergePublicInputs, BlockRootRollupInputs, + EmptyBlockRootRollupInputs, Fr, type GlobalVariables, type KernelCircuitPublicInputs, @@ -83,7 +78,12 @@ import { validateTx, } from './block-building-helpers.js'; import { type BlockProvingState, type MergeRollupInputData } from './block-proving-state.js'; -import { type BlockMergeRollupInputData, EpochProvingState, type TreeSnapshots } from './epoch-proving-state.js'; +import { + type BlockMergeRollupInputData, + EpochProvingState, + type ProvingResult, + type TreeSnapshots, +} from './epoch-proving-state.js'; import { ProvingOrchestratorMetrics } from './orchestrator_metrics.js'; import { TX_PROVING_CODE, type TxProvingInstruction, TxProvingState } from './tx-proving-state.js'; @@ -108,6 +108,7 @@ export class ProvingOrchestrator implements EpochProver { private pendingProvingJobs: AbortController[] = []; private paddingTx: PaddingProcessedTx | undefined = undefined; + private provingPromise: Promise | undefined = undefined; private metrics: ProvingOrchestratorMetrics; constructor( @@ -134,26 +135,20 @@ export class ProvingOrchestrator implements EpochProver { this.paddingTx = undefined; } - @trackSpan('ProvingOrchestrator.startNewEpoch', (epochNumber, totalNumBlocks) => ({ - [Attributes.EPOCH_SIZE]: totalNumBlocks, - [Attributes.EPOCH_NUMBER]: epochNumber, - })) - public startNewEpoch(epochNumber: number, totalNumBlocks: number): ProvingTicket { + public startNewEpoch(epochNumber: number, totalNumBlocks: number) { const { promise: _promise, resolve, reject } = promiseWithResolvers(); - const promise = _promise.catch( - (reason): ProvingResult => ({ - status: PROVING_STATUS.FAILURE, - reason, - }), - ); - + const promise = _promise.catch((reason): ProvingResult => ({ status: 'failure', reason })); + if (totalNumBlocks <= 0 || !Number.isInteger(totalNumBlocks)) { + throw new Error(`Invalid number of blocks for epoch (got ${totalNumBlocks})`); + } + logger.info(`Starting epoch ${epochNumber} with ${totalNumBlocks} blocks`); this.provingState = new EpochProvingState(epochNumber, totalNumBlocks, resolve, reject); - return { provingPromise: promise }; + this.provingPromise = promise; } /** * Starts off a new block - * @param numTxs - The total number of transactions in the block. Must be a power of 2 + * @param numTxs - The total number of transactions in the block. * @param globalVariables - The global variables for the block * @param l1ToL2Messages - The l1 to l2 messages for the block * @param verificationKeys - The private kernel verification keys @@ -163,14 +158,9 @@ export class ProvingOrchestrator implements EpochProver { [Attributes.BLOCK_SIZE]: numTxs, [Attributes.BLOCK_NUMBER]: globalVariables.blockNumber.toNumber(), })) - public async startNewBlock( - numTxs: number, - globalVariables: GlobalVariables, - l1ToL2Messages: Fr[], - ): Promise { - // If no proving state, assume we only care about proving this block and initialize a 1-block epoch + public async startNewBlock(numTxs: number, globalVariables: GlobalVariables, l1ToL2Messages: Fr[]) { if (!this.provingState) { - this.startNewEpoch(globalVariables.blockNumber.toNumber(), 1); + throw new Error(`Invalid proving state, call startNewEpoch before starting a block`); } if (!this.provingState?.isAcceptingBlocks()) { @@ -178,10 +168,14 @@ export class ProvingOrchestrator implements EpochProver { } if (!Number.isInteger(numTxs) || numTxs < 2) { - throw new Error(`Length of txs for the block should be at least two (got ${numTxs})`); + throw new Error(`Invalid number of txs for block (got ${numTxs})`); + } + + if (this.provingState.currentBlock && !this.provingState.currentBlock.block) { + throw new Error(`Must end previous block before starting a new one`); } - // TODO(palla/prover-node): Store block number in the db itself to make this check more reliable, + // TODO(palla/prover): Store block number in the db itself to make this check more reliable, // and turn this warning into an exception that we throw. const { blockNumber } = globalVariables; const dbBlockNumber = (await this.db.getTreeInfo(MerkleTreeId.ARCHIVE)).size - 1n; @@ -234,9 +228,6 @@ export class ProvingOrchestrator implements EpochProver { BigInt(startArchiveSnapshot.nextAvailableLeafIndex - 1), ); - const { promise: _promise, resolve, reject } = promiseWithResolvers(); - const promise = _promise.catch((reason): ProvingResult => ({ status: PROVING_STATUS.FAILURE, reason })); - this.provingState!.startNewBlock( numTxs, globalVariables, @@ -247,16 +238,12 @@ export class ProvingOrchestrator implements EpochProver { startArchiveSnapshot, newArchiveSiblingPath, previousBlockHash!, - resolve, - reject, ); // Enqueue base parity circuits for the block for (let i = 0; i < baseParityInputs.length; i++) { this.enqueueBaseParityCircuit(this.provingState!.currentBlock!, baseParityInputs[i], i); } - - return { provingPromise: promise }; } /** @@ -276,6 +263,10 @@ export class ProvingOrchestrator implements EpochProver { throw new Error(`Rollup not accepting further transactions`); } + if (!provingState.verifyState()) { + throw new Error(`Invalid proving state when adding a tx`); + } + validateTx(tx); logger.info(`Received transaction: ${tx.hash}`); @@ -289,10 +280,7 @@ export class ProvingOrchestrator implements EpochProver { this.enqueueFirstProofs(inputs, treeSnapshots, tx, provingState); if (provingState.transactionsReceived === provingState.totalNumTxs) { - logger.verbose( - `All transactions received for block ${provingState.globalVariables.blockNumber}. Assembling header.`, - ); - await this.buildBlockHeader(provingState); + logger.verbose(`All transactions received for block ${provingState.globalVariables.blockNumber}.`); } } @@ -311,53 +299,125 @@ export class ProvingOrchestrator implements EpochProver { [Attributes.BLOCK_TXS_COUNT]: block.transactionsReceived, }; }) - public async setBlockCompleted() { + public async setBlockCompleted(): Promise { const provingState = this.provingState?.currentBlock; if (!provingState) { throw new Error(`Invalid proving state, call startNewBlock before adding transactions or completing the block`); } - // we may need to pad the rollup with empty transactions + // We may need to pad the rollup with empty transactions const paddingTxCount = provingState.totalNumTxs - provingState.transactionsReceived; - if (paddingTxCount === 0) { - return; - } else if (provingState.totalNumTxs > 2) { + if (paddingTxCount > 0 && provingState.totalNumTxs > 2) { throw new Error(`Block not ready for completion: expecting ${paddingTxCount} more transactions.`); } - logger.debug(`Padding rollup with ${paddingTxCount} empty transactions`); - // Make an empty padding transaction - // Required for: - // 0 (when we want an empty block, largely for testing), or - // 1 (we need to pad with one tx as all rollup circuits require a pair of inputs) txs - // Insert it into the tree the required number of times to get all of the - // base rollup inputs - // Then enqueue the proving of all the transactions - const unprovenPaddingTx = makeEmptyProcessedTx( - this.db.getInitialHeader(), - provingState.globalVariables.chainId, - provingState.globalVariables.version, - getVKTreeRoot(), - ); - const txInputs: Array<{ inputs: BaseRollupInputs; snapshot: TreeSnapshots }> = []; - for (let i = 0; i < paddingTxCount; i++) { - const [inputs, snapshot] = await this.prepareTransaction(unprovenPaddingTx, provingState); - const txInput = { - inputs, - snapshot, - }; - txInputs.push(txInput); - } + if (paddingTxCount > 0) { + logger.debug(`Padding rollup with ${paddingTxCount} empty transactions`); + // Make an empty padding transaction + // Required for: + // 0 (when we want an empty block, largely for testing), or + // 1 (we need to pad with one tx as all rollup circuits require a pair of inputs) txs + // Insert it into the tree the required number of times to get all of the + // base rollup inputs + // Then enqueue the proving of all the transactions + const unprovenPaddingTx = makeEmptyProcessedTx( + this.db.getInitialHeader(), + provingState.globalVariables.chainId, + provingState.globalVariables.version, + getVKTreeRoot(), + ); + const txInputs: Array<{ inputs: BaseRollupInputs; snapshot: TreeSnapshots }> = []; + for (let i = 0; i < paddingTxCount; i++) { + const [inputs, snapshot] = await this.prepareTransaction(unprovenPaddingTx, provingState); + const txInput = { + inputs, + snapshot, + }; + txInputs.push(txInput); + } - // Now enqueue the proving - this.enqueuePaddingTxs(provingState, txInputs, unprovenPaddingTx); + // Now enqueue the proving + this.enqueuePaddingTxs(provingState, txInputs, unprovenPaddingTx); + } // And build the block header - logger.verbose(`Block ${provingState.globalVariables.blockNumber} padded with empty tx(s). Assembling header.`); - await this.buildBlockHeader(provingState); + logger.verbose(`Block ${provingState.globalVariables.blockNumber} completed. Assembling header.`); + await this.buildBlock(provingState); + + // If the proofs were faster than the block building, then we need to try the block root rollup again here + this.checkAndEnqueueBlockRootRollup(provingState); + return provingState.block!; + } + + /** Returns the block as built for a given index. */ + public getBlock(index: number): L2Block { + const block = this.provingState?.blocks[index].block; + if (!block) { + throw new Error(`Block at index ${index} not available`); + } + return block; } - private async buildBlockHeader(provingState: BlockProvingState) { + @trackSpan('ProvingOrchestrator.padEpoch', function () { + if (!this.provingState) { + return {}; + } + return { + [Attributes.EPOCH_NUMBER]: this.provingState.epochNumber, + [Attributes.EPOCH_SIZE]: this.provingState.totalNumBlocks, + }; + }) + private padEpoch() { + const provingState = this.provingState!; + const lastBlock = provingState.currentBlock?.block; + if (!lastBlock) { + throw new Error(`Epoch needs at least one completed block in order to be padded`); + } + + const paddingBlockCount = Math.max(2, provingState.totalNumBlocks) - provingState.blocks.length; + if (paddingBlockCount === 0) { + return; + } + + logger.debug(`Padding epoch proof with ${paddingBlockCount} empty block proofs`); + + const inputs = EmptyBlockRootRollupInputs.from({ + archive: lastBlock.archive, + blockHash: lastBlock.header.hash(), + globalVariables: lastBlock.header.globalVariables, + vkTreeRoot: getVKTreeRoot(), + proverId: this.proverId, + }); + + logger.debug(`Enqueuing deferred proving for padding block to enqueue ${paddingBlockCount} paddings`); + this.deferredProving( + provingState, + wrapCallbackInSpan( + this.tracer, + 'ProvingOrchestrator.prover.getEmptyBlockRootRollupProof', + { + [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server', + [Attributes.PROTOCOL_CIRCUIT_NAME]: 'empty-block-root-rollup' satisfies CircuitName, + }, + signal => this.prover.getEmptyBlockRootRollupProof(inputs, signal, provingState.epochNumber), + ), + result => { + logger.debug(`Completed proof for padding block`); + const currentLevel = provingState.numMergeLevels + 1n; + for (let i = 0; i < paddingBlockCount; i++) { + logger.debug(`Enqueuing padding block with index ${provingState.blocks.length + i}`); + const index = BigInt(provingState.blocks.length + i); + this.storeAndExecuteNextBlockMergeLevel(provingState, currentLevel, index, [ + result.inputs, + result.proof, + result.verificationKey.keyAsFields, + ]); + } + }, + ); + } + + private async buildBlock(provingState: BlockProvingState) { // Collect all new nullifiers, commitments, and contracts from all txs in this block to build body const gasFees = provingState.globalVariables.gasFees; const nonEmptyTxEffects: TxEffect[] = provingState!.allTxs @@ -379,7 +439,7 @@ export class ProvingOrchestrator implements EpochProver { // Assemble the L2 block const newArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, this.db); - const l2Block = L2Block.fromFields({ archive: newArchive, header, body }); + const l2Block = new L2Block(newArchive, header, body); if (!l2Block.body.getTxsEffectsHash().equals(header.contentCommitment.txsEffectsHash)) { throw new Error( @@ -499,52 +559,29 @@ export class ProvingOrchestrator implements EpochProver { } /** - * Returns the fully proven block. Requires proving to have been completed. - * @param index - The index of the block to finalise. Defaults to the last block. - * @returns The fully proven block and proof. + * Returns the proof for the current epoch. */ - public finaliseBlock(index?: number) { - try { - const block = this.provingState?.blocks[index ?? this.provingState?.blocks.length - 1]; - - if (!block || !block.blockRootRollupPublicInputs || !block.finalProof || !block.block) { - throw new Error(`Invalid proving state, a block must be proven before it can be finalised`); - } + public async finaliseEpoch() { + if (!this.provingState || !this.provingPromise) { + throw new Error(`Invalid proving state, an epoch must be proven before it can be finalised`); + } - const blockResult: ProvingBlockResult = { - proof: block.finalProof, - aggregationObject: block.finalProof.extractAggregationObject(), - block: block.block!, - }; - - pushTestData('blockResults', { - proverId: this.proverId.toString(), - vkTreeRoot: getVKTreeRoot().toString(), - block: blockResult.block.toString(), - proof: blockResult.proof.toString(), - aggregationObject: blockResult.aggregationObject.map(x => x.toString()), - }); + this.padEpoch(); - return Promise.resolve(blockResult); - } catch (err) { - throw new BlockProofError( - err && typeof err === 'object' && 'message' in err ? String(err.message) : String(err), - this.provingState?.blocks[index ?? this.provingState?.blocks.length - 1]?.allTxs.map(x => - Tx.getHash(x.processedTx), - ) ?? [], - ); + const result = await this.provingPromise!; + if (result.status === 'failure') { + throw new Error(`Epoch proving failed: ${result.reason}`); } - } - /** - * Returns the proof for the current epoch. - * Requires proving to have been completed. - */ - public finaliseEpoch() { - if (!this.provingState || !this.provingState.rootRollupPublicInputs || !this.provingState.finalProof) { - throw new Error(`Invalid proving state, an epoch must be proven before it can be finalised`); + if (!this.provingState.rootRollupPublicInputs || !this.provingState.finalProof) { + throw new Error(`Invalid proving state, missing root rollup public inputs or final proof`); } + pushTestData('epochProofResult', { + proof: this.provingState.finalProof.toString(), + publicInputs: this.provingState.rootRollupPublicInputs.toString(), + }); + return { proof: this.provingState.finalProof, publicInputs: this.provingState.rootRollupPublicInputs }; } @@ -836,11 +873,17 @@ export class ProvingOrchestrator implements EpochProver { } // Executes the block root rollup circuit - private enqueueBlockRootRollup(provingState: BlockProvingState | undefined) { - if (!provingState?.verifyState()) { + private enqueueBlockRootRollup(provingState: BlockProvingState) { + if (!provingState.block) { + throw new Error(`Invalid proving state for block root rollup, block not available`); + } + + if (!provingState.verifyState()) { logger.debug('Not running block root rollup, state no longer valid'); return; } + + provingState.blockRootRollupStarted = true; const mergeInputData = provingState.getMergeInputs(0); const rootParityInput = provingState.finalRootParityInput!; @@ -868,8 +911,6 @@ export class ProvingOrchestrator implements EpochProver { proverId: this.proverId, }); - const shouldProveEpoch = this.provingState!.totalNumBlocks > 1; - this.deferredProving( provingState, wrapCallbackInSpan( @@ -879,10 +920,7 @@ export class ProvingOrchestrator implements EpochProver { [Attributes.PROTOCOL_CIRCUIT_TYPE]: 'server', [Attributes.PROTOCOL_CIRCUIT_NAME]: 'block-root-rollup' satisfies CircuitName, }, - signal => - shouldProveEpoch - ? this.prover.getBlockRootRollupProof(inputs, signal, provingState.epochNumber) - : this.prover.getBlockRootRollupFinalProof(inputs, signal, provingState.epochNumber), + signal => this.prover.getBlockRootRollupProof(inputs, signal, provingState.epochNumber), ), result => { const header = this.extractBlockHeaderFromPublicInputs(provingState, result.inputs); @@ -895,17 +933,10 @@ export class ProvingOrchestrator implements EpochProver { provingState.blockRootRollupPublicInputs = result.inputs; provingState.finalProof = result.proof.binaryProof; - provingState.resolve({ status: PROVING_STATUS.SUCCESS }); logger.debug(`Completed proof for block root rollup for ${provingState.block?.number}`); // validatePartialState(result.inputs.end, tx.treeSnapshots); // TODO(palla/prover) - // TODO(palla/prover): Remove this once we've dropped the flow for proving single blocks - if (!shouldProveEpoch) { - logger.verbose(`Skipping epoch rollup, only one block in epoch`); - return; - } - const currentLevel = this.provingState!.numMergeLevels + 1n; this.storeAndExecuteNextBlockMergeLevel(this.provingState!, currentLevel, BigInt(provingState.index), [ result.inputs, @@ -1032,18 +1063,23 @@ export class ProvingOrchestrator implements EpochProver { signal => this.prover.getRootRollupProof(inputs, signal, provingState.epochNumber), ), result => { + logger.verbose(`Orchestrator completed root rollup for epoch ${provingState.epochNumber}`); provingState.rootRollupPublicInputs = result.inputs; provingState.finalProof = result.proof.binaryProof; - provingState.resolve({ status: PROVING_STATUS.SUCCESS }); + provingState.resolve({ status: 'success' }); }, ); } - private checkAndEnqueueBlockRootRollup(provingState: BlockProvingState | undefined) { + private checkAndEnqueueBlockRootRollup(provingState: BlockProvingState) { if (!provingState?.isReadyForBlockRootRollup()) { logger.debug('Not ready for root rollup'); return; } + if (provingState.blockRootRollupStarted) { + logger.debug('Block root rollup already started'); + return; + } this.enqueueBlockRootRollup(provingState); } diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_errors.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_errors.test.ts index 01bdd400643..dd21cbd2dd2 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_errors.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_errors.test.ts @@ -1,4 +1,3 @@ -import { PROVING_STATUS } from '@aztec/circuit-types'; import { Fr } from '@aztec/circuits.js'; import { createDebugLogger } from '@aztec/foundation/log'; @@ -29,7 +28,8 @@ describe('prover/orchestrator/errors', () => { makeBloatedProcessedTx(context.actualDb, 4), ]; - const blockTicket = await context.orchestrator.startNewBlock(txs.length, context.globalVariables, []); + context.orchestrator.startNewEpoch(1, 1); + await context.orchestrator.startNewBlock(txs.length, context.globalVariables, []); for (const tx of txs) { await context.orchestrator.addNewTx(tx); @@ -39,11 +39,9 @@ describe('prover/orchestrator/errors', () => { async () => await context.orchestrator.addNewTx(makeEmptyProcessedTestTx(context.actualDb)), ).rejects.toThrow('Rollup not accepting further transactions'); - const result = await blockTicket.provingPromise; - expect(result.status).toBe(PROVING_STATUS.SUCCESS); - const finalisedBlock = await context.orchestrator.finaliseBlock(); - - expect(finalisedBlock.block.number).toEqual(context.blockNumber); + const block = await context.orchestrator.setBlockCompleted(); + expect(block.number).toEqual(context.blockNumber); + await context.orchestrator.finaliseEpoch(); }); it('throws if adding too many blocks', async () => { @@ -56,25 +54,28 @@ describe('prover/orchestrator/errors', () => { ).rejects.toThrow('Epoch not accepting further blocks'); }); - it('throws if adding a transaction before start', async () => { + it('throws if adding a transaction before starting epoch', async () => { + await expect( + async () => await context.orchestrator.addNewTx(makeEmptyProcessedTestTx(context.actualDb)), + ).rejects.toThrow(`Invalid proving state, call startNewBlock before adding transactions`); + }); + + it('throws if adding a transaction before starting block', async () => { + context.orchestrator.startNewEpoch(1, 1); await expect( async () => await context.orchestrator.addNewTx(makeEmptyProcessedTestTx(context.actualDb)), ).rejects.toThrow(`Invalid proving state, call startNewBlock before adding transactions`); }); it('throws if completing a block before start', async () => { + context.orchestrator.startNewEpoch(1, 1); await expect(async () => await context.orchestrator.setBlockCompleted()).rejects.toThrow( 'Invalid proving state, call startNewBlock before adding transactions or completing the block', ); }); - it('throws if finalising an incomplete block', async () => { - await expect(async () => await context.orchestrator.finaliseBlock()).rejects.toThrow( - 'Invalid proving state, a block must be proven before it can be finalised', - ); - }); - - it('throws if setting an incomplete block completed', async () => { + it('throws if setting an incomplete block as completed', async () => { + context.orchestrator.startNewEpoch(1, 1); await context.orchestrator.startNewBlock(3, context.globalVariables, []); await expect(async () => await context.orchestrator.setBlockCompleted()).rejects.toThrow( `Block not ready for completion: expecting ${3} more transactions.`, @@ -82,27 +83,35 @@ describe('prover/orchestrator/errors', () => { }); it('throws if adding to a cancelled block', async () => { + context.orchestrator.startNewEpoch(1, 1); await context.orchestrator.startNewBlock(2, context.globalVariables, []); - context.orchestrator.cancel(); await expect( async () => await context.orchestrator.addNewTx(makeEmptyProcessedTestTx(context.actualDb)), - ).rejects.toThrow('Rollup not accepting further transactions'); + ).rejects.toThrow('Invalid proving state when adding a tx'); }); it.each([[-4], [0], [1], [8.1]] as const)( 'fails to start a block with %i transactions', async (blockSize: number) => { + context.orchestrator.startNewEpoch(1, 1); await expect( async () => await context.orchestrator.startNewBlock(blockSize, context.globalVariables, []), - ).rejects.toThrow(`Length of txs for the block should be at least two (got ${blockSize})`); + ).rejects.toThrow(`Invalid number of txs for block (got ${blockSize})`); }, ); + it.each([[-4], [0], [8.1]] as const)('fails to start an epoch with %i blocks', (epochSize: number) => { + context.orchestrator.startNewEpoch(1, 1); + expect(() => context.orchestrator.startNewEpoch(1, epochSize)).toThrow( + `Invalid number of blocks for epoch (got ${epochSize})`, + ); + }); + it('rejects if too many l1 to l2 messages are provided', async () => { - // Assemble a fake transaction const l1ToL2Messages = new Array(100).fill(new Fr(0n)); + context.orchestrator.startNewEpoch(1, 1); await expect( async () => await context.orchestrator.startNewBlock(2, context.globalVariables, l1ToL2Messages), ).rejects.toThrow('Too many L1 to L2 messages'); diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_failures.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_failures.test.ts index a3bd36fe359..ac4d2a5710a 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_failures.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_failures.test.ts @@ -1,4 +1,4 @@ -import { PROVING_STATUS, type ServerCircuitProver } from '@aztec/circuit-types'; +import { type ServerCircuitProver } from '@aztec/circuit-types'; import { Fr } from '@aztec/circuits.js'; import { times } from '@aztec/foundation/collection'; import { createDebugLogger } from '@aztec/foundation/log'; @@ -35,52 +35,23 @@ describe('prover/orchestrator/failures', () => { }); it.each([ - [ - 'Base Rollup Failed', - () => { - jest.spyOn(mockProver, 'getBaseRollupProof').mockRejectedValue('Base Rollup Failed'); - }, - ], - [ - 'Merge Rollup Failed', - () => { - jest.spyOn(mockProver, 'getMergeRollupProof').mockRejectedValue('Merge Rollup Failed'); - }, - ], + ['Base Rollup Failed', (msg: string) => jest.spyOn(mockProver, 'getBaseRollupProof').mockRejectedValue(msg)], + ['Merge Rollup Failed', (msg: string) => jest.spyOn(mockProver, 'getMergeRollupProof').mockRejectedValue(msg)], [ 'Block Root Rollup Failed', - () => { - jest.spyOn(mockProver, 'getBlockRootRollupProof').mockRejectedValue('Block Root Rollup Failed'); - }, + (msg: string) => jest.spyOn(mockProver, 'getBlockRootRollupProof').mockRejectedValue(msg), ], [ 'Block Merge Rollup Failed', - () => { - jest.spyOn(mockProver, 'getBlockMergeRollupProof').mockRejectedValue('Block Merge Rollup Failed'); - }, - ], - [ - 'Root Rollup Failed', - () => { - jest.spyOn(mockProver, 'getRootRollupProof').mockRejectedValue('Root Rollup Failed'); - }, - ], - [ - 'Base Parity Failed', - () => { - jest.spyOn(mockProver, 'getBaseParityProof').mockRejectedValue('Base Parity Failed'); - }, - ], - [ - 'Root Parity Failed', - () => { - jest.spyOn(mockProver, 'getRootParityProof').mockRejectedValue('Root Parity Failed'); - }, + (msg: string) => jest.spyOn(mockProver, 'getBlockMergeRollupProof').mockRejectedValue(msg), ], - ] as const)('handles a %s error', async (message: string, fn: () => void) => { - fn(); + ['Root Rollup Failed', (msg: string) => jest.spyOn(mockProver, 'getRootRollupProof').mockRejectedValue(msg)], + ['Base Parity Failed', (msg: string) => jest.spyOn(mockProver, 'getBaseParityProof').mockRejectedValue(msg)], + ['Root Parity Failed', (msg: string) => jest.spyOn(mockProver, 'getRootParityProof').mockRejectedValue(msg)], + ] as const)('handles a %s error', async (message: string, fn: (msg: string) => void) => { + fn(message); - const epochTicket = orchestrator.startNewEpoch(1, 3); + orchestrator.startNewEpoch(1, 3); // We need at least 3 blocks and 3 txs to ensure all circuits are used for (let i = 0; i < 3; i++) { @@ -90,9 +61,10 @@ describe('prover/orchestrator/failures', () => { for (const tx of txs) { await orchestrator.addNewTx(tx); } + await orchestrator.setBlockCompleted(); } - await expect(epochTicket.provingPromise).resolves.toEqual({ status: PROVING_STATUS.FAILURE, reason: message }); + await expect(() => orchestrator.finaliseEpoch()).rejects.toThrow(`Epoch proving failed: ${message}`); }); }); }); diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_lifecycle.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_lifecycle.test.ts index 3570e0af591..ba76c3d0c23 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_lifecycle.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_lifecycle.test.ts @@ -37,6 +37,8 @@ describe('prover/orchestrator/lifecycle', () => { deferredPromises.push(deferred); return deferred.promise; }); + + orchestrator.startNewEpoch(1, 1); await orchestrator.startNewBlock(2, makeGlobalVariables(1), []); await sleep(1); diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_mixed_blocks.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_mixed_blocks.test.ts index 6c959bd9b43..d3ece0b6ba5 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_mixed_blocks.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_mixed_blocks.test.ts @@ -1,19 +1,23 @@ -import { PROVING_STATUS } from '@aztec/circuit-types'; +import { MerkleTreeId, type MerkleTreeOperations } from '@aztec/circuit-types'; import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/circuits.js'; import { fr } from '@aztec/circuits.js/testing'; import { range } from '@aztec/foundation/array'; +import { times } from '@aztec/foundation/collection'; import { createDebugLogger } from '@aztec/foundation/log'; +import { MerkleTrees } from '@aztec/world-state'; -import { makeBloatedProcessedTx } from '../mocks/fixtures.js'; +import { makeBloatedProcessedTx, updateExpectedTreesFromTxs } from '../mocks/fixtures.js'; import { TestContext } from '../mocks/test_context.js'; const logger = createDebugLogger('aztec:orchestrator-mixed-blocks'); describe('prover/orchestrator/mixed-blocks', () => { let context: TestContext; + let expectsDb: MerkleTreeOperations; beforeEach(async () => { context = await TestContext.new(logger); + expectsDb = await MerkleTrees.tmp().then(t => t.asLatest()); }); afterEach(async () => { @@ -30,19 +34,38 @@ describe('prover/orchestrator/mixed-blocks', () => { const l1ToL2Messages = range(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, 1 + 0x400).map(fr); - const blockTicket = await context.orchestrator.startNewBlock(3, context.globalVariables, l1ToL2Messages); + context.orchestrator.startNewEpoch(1, 1); + await context.orchestrator.startNewBlock(3, context.globalVariables, l1ToL2Messages); + for (const tx of txs) { + await context.orchestrator.addNewTx(tx); + } + + const block = await context.orchestrator.setBlockCompleted(); + await context.orchestrator.finaliseEpoch(); + expect(block.number).toEqual(context.blockNumber); + }); + + it.each([2, 4, 5, 8] as const)('builds an L2 block with %i bloated txs', async (totalCount: number) => { + const txs = times(totalCount, (i: number) => makeBloatedProcessedTx(context.actualDb, i)); + + const l1ToL2Messages = range(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, 1 + 0x400).map(fr); + + context.orchestrator.startNewEpoch(1, 1); + await context.orchestrator.startNewBlock(txs.length, context.globalVariables, l1ToL2Messages); for (const tx of txs) { await context.orchestrator.addNewTx(tx); } - await context.orchestrator.setBlockCompleted(); + const block = await context.orchestrator.setBlockCompleted(); + await context.orchestrator.finaliseEpoch(); + expect(block.number).toEqual(context.blockNumber); - const result = await blockTicket.provingPromise; - expect(result.status).toBe(PROVING_STATUS.SUCCESS); - const finalisedBlock = await context.orchestrator.finaliseBlock(); + await updateExpectedTreesFromTxs(expectsDb, txs); + const noteHashTreeAfter = await context.actualDb.getTreeInfo(MerkleTreeId.NOTE_HASH_TREE); - expect(finalisedBlock.block.number).toEqual(context.blockNumber); + const expectedNoteHashTreeAfter = await expectsDb.getTreeInfo(MerkleTreeId.NOTE_HASH_TREE).then(t => t.root); + expect(noteHashTreeAfter.root).toEqual(expectedNoteHashTreeAfter); }); }); }); diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_mixed_blocks_2.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_mixed_blocks_2.test.ts deleted file mode 100644 index 98c72da2d0c..00000000000 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_mixed_blocks_2.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { MerkleTreeId, PROVING_STATUS } from '@aztec/circuit-types'; -import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/circuits.js'; -import { fr } from '@aztec/circuits.js/testing'; -import { range } from '@aztec/foundation/array'; -import { times } from '@aztec/foundation/collection'; -import { createDebugLogger } from '@aztec/foundation/log'; -import { openTmpStore } from '@aztec/kv-store/utils'; -import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; -import { type MerkleTreeOperations, MerkleTrees } from '@aztec/world-state'; - -import { makeBloatedProcessedTx, updateExpectedTreesFromTxs } from '../mocks/fixtures.js'; -import { TestContext } from '../mocks/test_context.js'; - -const logger = createDebugLogger('aztec:orchestrator-mixed-blocks-2'); - -describe('prover/orchestrator/mixed-blocks', () => { - let context: TestContext; - let expectsDb: MerkleTreeOperations; - - beforeEach(async () => { - context = await TestContext.new(logger); - expectsDb = await MerkleTrees.new(openTmpStore(), new NoopTelemetryClient()).then(t => t.asLatest()); - }); - - afterEach(async () => { - await context.cleanup(); - }); - - describe('blocks', () => { - it.each([2, 4, 5, 8] as const)('builds an L2 block with %i bloated txs', async (totalCount: number) => { - const txs = times(totalCount, (i: number) => makeBloatedProcessedTx(context.actualDb, i)); - - const l1ToL2Messages = range(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, 1 + 0x400).map(fr); - - const blockTicket = await context.orchestrator.startNewBlock(txs.length, context.globalVariables, l1ToL2Messages); - - for (const tx of txs) { - await context.orchestrator.addNewTx(tx); - } - - const result = await blockTicket.provingPromise; - expect(result.status).toBe(PROVING_STATUS.SUCCESS); - - const finalisedBlock = await context.orchestrator.finaliseBlock(); - - expect(finalisedBlock.block.number).toEqual(context.blockNumber); - - await updateExpectedTreesFromTxs(expectsDb, txs); - const noteHashTreeAfter = await context.actualDb.getTreeInfo(MerkleTreeId.NOTE_HASH_TREE); - - const expectedNoteHashTreeAfter = await expectsDb.getTreeInfo(MerkleTreeId.NOTE_HASH_TREE).then(t => t.root); - expect(noteHashTreeAfter.root).toEqual(expectedNoteHashTreeAfter); - }); - }); -}); diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_multi_public_functions.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_multi_public_functions.test.ts index 206f562f2a9..4c2d48e4384 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_multi_public_functions.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_multi_public_functions.test.ts @@ -1,4 +1,4 @@ -import { PROVING_STATUS, mockTx } from '@aztec/circuit-types'; +import { mockTx } from '@aztec/circuit-types'; import { times } from '@aztec/foundation/collection'; import { createDebugLogger } from '@aztec/foundation/log'; import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types'; @@ -38,19 +38,17 @@ describe('prover/orchestrator/public-functions', () => { tx.data.constants.vkTreeRoot = getVKTreeRoot(); } - const blockTicket = await context.orchestrator.startNewBlock(numTransactions, context.globalVariables, []); + context.orchestrator.startNewEpoch(1, 1); + await context.orchestrator.startNewBlock(numTransactions, context.globalVariables, []); - const [processed, failed] = await context.processPublicFunctions(txs, numTransactions, context.blockProver); + const [processed, failed] = await context.processPublicFunctions(txs, numTransactions, context.epochProver); expect(processed.length).toBe(numTransactions); expect(failed.length).toBe(0); - await context.orchestrator.setBlockCompleted(); + const block = await context.orchestrator.setBlockCompleted(); + await context.orchestrator.finaliseEpoch(); - const result = await blockTicket.provingPromise; - expect(result.status).toBe(PROVING_STATUS.SUCCESS); - const finalisedBlock = await context.orchestrator.finaliseBlock(); - - expect(finalisedBlock.block.number).toEqual(context.blockNumber); + expect(block.number).toEqual(context.blockNumber); }, ); }); diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_multiple_blocks.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_multiple_blocks.test.ts index 7795c423e77..e4205dab158 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_multiple_blocks.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_multiple_blocks.test.ts @@ -1,4 +1,3 @@ -import { PROVING_STATUS } from '@aztec/circuit-types'; import { createDebugLogger } from '@aztec/foundation/log'; import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types'; @@ -19,8 +18,8 @@ describe('prover/orchestrator/multi-block', () => { }); describe('multiple blocks', () => { - it.each([4, 5])('builds an epoch with %s blocks in sequence', async (numBlocks: number) => { - const provingTicket = context.orchestrator.startNewEpoch(1, numBlocks); + it.each([1, 4, 5])('builds an epoch with %s blocks in sequence', async (numBlocks: number) => { + context.orchestrator.startNewEpoch(1, numBlocks); let header = context.actualDb.getInitialHeader(); for (let i = 0; i < numBlocks; i++) { @@ -33,26 +32,17 @@ describe('prover/orchestrator/multi-block', () => { const globals = makeGlobals(blockNum); // This will need to be a 2 tx block - const blockTicket = await context.orchestrator.startNewBlock(2, globals, []); + await context.orchestrator.startNewBlock(2, globals, []); await context.orchestrator.addNewTx(tx); // we need to complete the block as we have not added a full set of txs - await context.orchestrator.setBlockCompleted(); - - const result = await blockTicket.provingPromise; - expect(result.status).toBe(PROVING_STATUS.SUCCESS); - const finalisedBlock = await context.orchestrator.finaliseBlock(); - - expect(finalisedBlock.block.number).toEqual(blockNum); - header = finalisedBlock.block.header; + const block = await context.orchestrator.setBlockCompleted(); + header = block!.header; } - logger.info('Awaiting epoch ticket'); - const result = await provingTicket.provingPromise; - expect(result).toEqual({ status: PROVING_STATUS.SUCCESS }); - - const epoch = context.orchestrator.finaliseEpoch(); + logger.info('Finalising epoch'); + const epoch = await context.orchestrator.finaliseEpoch(); expect(epoch.publicInputs.endBlockNumber.toNumber()).toEqual(1000 + numBlocks - 1); expect(epoch.proof).toBeDefined(); }); diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_public_functions.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_public_functions.test.ts index 505b2b94b57..68db5ce4cce 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_public_functions.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_public_functions.test.ts @@ -1,4 +1,4 @@ -import { PROVING_STATUS, PublicExecutionRequest, mockTx } from '@aztec/circuit-types'; +import { PublicExecutionRequest, mockTx } from '@aztec/circuit-types'; import { AztecAddress } from '@aztec/circuits.js'; import { makeCallContext } from '@aztec/circuits.js/testing'; import { createDebugLogger } from '@aztec/foundation/log'; @@ -43,20 +43,16 @@ describe('prover/orchestrator/public-functions', () => { const [processed, _] = await context.processPublicFunctions([tx], 1, undefined); // This will need to be a 2 tx block - const blockTicket = await context.orchestrator.startNewBlock(2, context.globalVariables, []); + context.orchestrator.startNewEpoch(1, 1); + await context.orchestrator.startNewBlock(2, context.globalVariables, []); for (const processedTx of processed) { await context.orchestrator.addNewTx(processedTx); } - // we need to complete the block as we have not added a full set of txs - await context.orchestrator.setBlockCompleted(); - - const result = await blockTicket.provingPromise; - expect(result.status).toBe(PROVING_STATUS.SUCCESS); - const finalisedBlock = await context.orchestrator.finaliseBlock(); - - expect(finalisedBlock.block.number).toEqual(context.blockNumber); + const block = await context.orchestrator.setBlockCompleted(); + await context.orchestrator.finaliseEpoch(); + expect(block.number).toEqual(context.blockNumber); }, ); @@ -135,20 +131,16 @@ describe('prover/orchestrator/public-functions', () => { ); // This will need to be a 2 tx block - const blockTicket = await context.orchestrator.startNewBlock(2, context.globalVariables, []); + context.orchestrator.startNewEpoch(1, 1); + await context.orchestrator.startNewBlock(2, context.globalVariables, []); for (const processedTx of processed) { await context.orchestrator.addNewTx(processedTx); } - // we need to complete the block as we have not added a full set of txs - await context.orchestrator.setBlockCompleted(); - - const result = await blockTicket.provingPromise; - expect(result.status).toBe(PROVING_STATUS.SUCCESS); - const finalisedBlock = await context.orchestrator.finaliseBlock(); - - expect(finalisedBlock.block.number).toEqual(context.blockNumber); + const block = await context.orchestrator.setBlockCompleted(); + await context.orchestrator.finaliseEpoch(); + expect(block.number).toEqual(context.blockNumber); }); }); }); diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_single_blocks.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_single_blocks.test.ts index ed0c077c5c4..3722f3bf97a 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_single_blocks.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_single_blocks.test.ts @@ -1,4 +1,3 @@ -import { PROVING_STATUS } from '@aztec/circuit-types'; import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/circuits.js'; import { fr } from '@aztec/circuits.js/testing'; import { range } from '@aztec/foundation/array'; @@ -28,15 +27,12 @@ describe('prover/orchestrator/blocks', () => { describe('blocks', () => { it('builds an empty L2 block', async () => { - const blockTicket = await context.orchestrator.startNewBlock(2, context.globalVariables, []); + context.orchestrator.startNewEpoch(1, 1); + await context.orchestrator.startNewBlock(2, context.globalVariables, []); - await context.orchestrator.setBlockCompleted(); - - const result = await blockTicket.provingPromise; - expect(result.status).toBe(PROVING_STATUS.SUCCESS); - const finalisedBlock = await context.orchestrator.finaliseBlock(); - - expect(finalisedBlock.block.number).toEqual(context.blockNumber); + const block = await context.orchestrator.setBlockCompleted(); + await context.orchestrator.finaliseEpoch(); + expect(block.number).toEqual(context.blockNumber); }); it('builds a block with 1 transaction', async () => { @@ -45,20 +41,16 @@ describe('prover/orchestrator/blocks', () => { await updateExpectedTreesFromTxs(expectsDb, txs); // This will need to be a 2 tx block - const blockTicket = await context.orchestrator.startNewBlock(2, context.globalVariables, []); + context.orchestrator.startNewEpoch(1, 1); + await context.orchestrator.startNewBlock(2, context.globalVariables, []); for (const tx of txs) { await context.orchestrator.addNewTx(tx); } - // we need to complete the block as we have not added a full set of txs - await context.orchestrator.setBlockCompleted(); - - const result = await blockTicket.provingPromise; - expect(result.status).toBe(PROVING_STATUS.SUCCESS); - const finalisedBlock = await context.orchestrator.finaliseBlock(); - - expect(finalisedBlock.block.number).toEqual(context.blockNumber); + const block = await context.orchestrator.setBlockCompleted(); + await context.orchestrator.finaliseEpoch(); + expect(block.number).toEqual(context.blockNumber); }); it('builds a block concurrently with transaction simulation', async () => { @@ -71,18 +63,17 @@ describe('prover/orchestrator/blocks', () => { const l1ToL2Messages = range(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, 1 + 0x400).map(fr); - const blockTicket = await context.orchestrator.startNewBlock(txs.length, context.globalVariables, l1ToL2Messages); + context.orchestrator.startNewEpoch(1, 1); + await context.orchestrator.startNewBlock(txs.length, context.globalVariables, l1ToL2Messages); for (const tx of txs) { await context.orchestrator.addNewTx(tx); await sleep(1000); } - const result = await blockTicket.provingPromise; - expect(result.status).toBe(PROVING_STATUS.SUCCESS); - const finalisedBlock = await context.orchestrator.finaliseBlock(); - - expect(finalisedBlock.block.number).toEqual(context.blockNumber); + const block = await context.orchestrator.setBlockCompleted(); + await context.orchestrator.finaliseEpoch(); + expect(block.number).toEqual(context.blockNumber); }); }); }); diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_workflow.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_workflow.test.ts index 9d03a31a25e..b8547a0207b 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_workflow.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_workflow.test.ts @@ -1,70 +1,103 @@ import { type ServerCircuitProver } from '@aztec/circuit-types'; import { Fr, + type GlobalVariables, NESTED_RECURSIVE_PROOF_LENGTH, NUM_BASE_PARITY_PER_ROOT_PARITY, RECURSIVE_PROOF_LENGTH, type RootParityInput, } from '@aztec/circuits.js'; -import { makeGlobalVariables, makeRootParityInput } from '@aztec/circuits.js/testing'; +import { makeRootParityInput } from '@aztec/circuits.js/testing'; +import { createDebugLogger } from '@aztec/foundation/log'; import { promiseWithResolvers } from '@aztec/foundation/promise'; import { sleep } from '@aztec/foundation/sleep'; -import { openTmpStore } from '@aztec/kv-store/utils'; -import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; -import { type MerkleTreeOperations, MerkleTrees } from '@aztec/world-state'; +import { type MerkleTreeOperations } from '@aztec/world-state'; import { type MockProxy, mock } from 'jest-mock-extended'; -import { ProvingOrchestrator } from './orchestrator.js'; +import { makeBloatedProcessedTx } from '../mocks/fixtures.js'; +import { TestContext } from '../mocks/test_context.js'; +import { type ProvingOrchestrator } from './orchestrator.js'; + +const logger = createDebugLogger('aztec:orchestrator-workflow'); describe('prover/orchestrator', () => { describe('workflow', () => { let orchestrator: ProvingOrchestrator; - let mockProver: MockProxy; let actualDb: MerkleTreeOperations; - beforeEach(async () => { - const telemetryClient = new NoopTelemetryClient(); - actualDb = await MerkleTrees.new(openTmpStore(), telemetryClient).then(t => t.asLatest()); - mockProver = mock(); - orchestrator = new ProvingOrchestrator(actualDb, mockProver, telemetryClient); - }); + let globalVariables: GlobalVariables; + let context: TestContext; - it('calls root parity circuit only when ready', async () => { - // create a custom L2 to L1 message - const message = Fr.random(); + describe('with mock prover', () => { + let mockProver: MockProxy; - // and delay its proof - const pendingBaseParityResult = promiseWithResolvers>(); - const expectedBaseParityResult = makeRootParityInput(RECURSIVE_PROOF_LENGTH, 0xff); + beforeEach(async () => { + mockProver = mock(); + context = await TestContext.new(logger, 'legacy', 4, () => Promise.resolve(mockProver)); + ({ actualDb, orchestrator, globalVariables } = context); + }); - mockProver.getRootParityProof.mockResolvedValue(makeRootParityInput(NESTED_RECURSIVE_PROOF_LENGTH)); + it('calls root parity circuit only when ready', async () => { + // create a custom L2 to L1 message + const message = Fr.random(); - mockProver.getBaseParityProof.mockImplementation(inputs => { - if (inputs.msgs[0].equals(message)) { - return pendingBaseParityResult.promise; - } else { - return Promise.resolve(makeRootParityInput(RECURSIVE_PROOF_LENGTH)); - } - }); + // and delay its proof + const pendingBaseParityResult = promiseWithResolvers>(); + const expectedBaseParityResult = makeRootParityInput(RECURSIVE_PROOF_LENGTH, 0xff); - await orchestrator.startNewBlock(2, makeGlobalVariables(1), [message]); + mockProver.getRootParityProof.mockResolvedValue(makeRootParityInput(NESTED_RECURSIVE_PROOF_LENGTH)); - await sleep(10); - expect(mockProver.getBaseParityProof).toHaveBeenCalledTimes(NUM_BASE_PARITY_PER_ROOT_PARITY); - expect(mockProver.getRootParityProof).not.toHaveBeenCalled(); + mockProver.getBaseParityProof.mockImplementation(inputs => { + if (inputs.msgs[0].equals(message)) { + return pendingBaseParityResult.promise; + } else { + return Promise.resolve(makeRootParityInput(RECURSIVE_PROOF_LENGTH)); + } + }); - await sleep(10); - // even now the root parity should not have been called - expect(mockProver.getRootParityProof).not.toHaveBeenCalled(); + orchestrator.startNewEpoch(1, 1); + await orchestrator.startNewBlock(2, globalVariables, [message]); - // only after the base parity proof is resolved, the root parity should be called - pendingBaseParityResult.resolve(expectedBaseParityResult); + await sleep(10); + expect(mockProver.getBaseParityProof).toHaveBeenCalledTimes(NUM_BASE_PARITY_PER_ROOT_PARITY); + expect(mockProver.getRootParityProof).not.toHaveBeenCalled(); - // give the orchestrator a chance to calls its callbacks - await sleep(10); - expect(mockProver.getRootParityProof).toHaveBeenCalledTimes(1); + await sleep(10); + // even now the root parity should not have been called + expect(mockProver.getRootParityProof).not.toHaveBeenCalled(); - orchestrator.cancel(); + // only after the base parity proof is resolved, the root parity should be called + pendingBaseParityResult.resolve(expectedBaseParityResult); + + // give the orchestrator a chance to calls its callbacks + await sleep(10); + expect(mockProver.getRootParityProof).toHaveBeenCalledTimes(1); + + orchestrator.cancel(); + }); + }); + + describe('with simulated prover', () => { + beforeEach(async () => { + context = await TestContext.new(logger); + ({ actualDb, orchestrator, globalVariables } = context); + }); + + it('waits for block to be completed before enqueueing block root proof', async () => { + orchestrator.startNewEpoch(1, 1); + await orchestrator.startNewBlock(2, globalVariables, []); + await orchestrator.addNewTx(makeBloatedProcessedTx(actualDb, 1)); + await orchestrator.addNewTx(makeBloatedProcessedTx(actualDb, 2)); + + // wait for the block root proof to try to be enqueued + await sleep(1000); + + // now finish the block + await orchestrator.setBlockCompleted(); + + const result = await orchestrator.finaliseEpoch(); + expect(result.proof).toBeDefined(); + }); }); }); }); diff --git a/yarn-project/prover-client/src/prover-agent/agent-queue-rpc-integration.test.ts b/yarn-project/prover-client/src/prover-agent/agent-queue-rpc-integration.test.ts index cd30492f015..83a2b3daf10 100644 --- a/yarn-project/prover-client/src/prover-agent/agent-queue-rpc-integration.test.ts +++ b/yarn-project/prover-client/src/prover-agent/agent-queue-rpc-integration.test.ts @@ -6,6 +6,7 @@ import { makeBaseRollupInputs, makeBlockMergeRollupInputs, makeBlockRootRollupInputs, + makeEmptyBlockRootRollupInputs, makeHeader, makeMergeRollupInputs, makePublicKernelCircuitPrivateInputs, @@ -40,8 +41,8 @@ describe('Prover agent <-> queue integration', () => { getBaseRollupProof: makeBaseRollupInputs, getRootParityProof: makeRootParityInputs, getBlockMergeRollupProof: makeBlockMergeRollupInputs, + getEmptyBlockRootRollupProof: makeEmptyBlockRootRollupInputs, getBlockRootRollupProof: makeBlockRootRollupInputs, - getBlockRootRollupFinalProof: makeBlockRootRollupInputs, getEmptyPrivateKernelProof: () => new PrivateKernelEmptyInputData(makeHeader(), Fr.random(), Fr.random(), Fr.random()), getEmptyTubeProof: () => new PrivateKernelEmptyInputData(makeHeader(), Fr.random(), Fr.random(), Fr.random()), @@ -73,6 +74,7 @@ describe('Prover agent <-> queue integration', () => { await queue.stop(); }); + // TODO: This test hangs instead of failing when the Inputs are not registered on the RPC wrapper it.each(Object.entries(makeInputs))('can call %s over JSON-RPC', async (fnName, makeInputs) => { const resp = await queue[fnName as keyof ServerCircuitProver](makeInputs() as any); expect(resp).toBeDefined(); diff --git a/yarn-project/prover-client/src/prover-agent/memory-proving-queue.ts b/yarn-project/prover-client/src/prover-agent/memory-proving-queue.ts index 6f54ae5fe87..c380a629213 100644 --- a/yarn-project/prover-client/src/prover-agent/memory-proving-queue.ts +++ b/yarn-project/prover-client/src/prover-agent/memory-proving-queue.ts @@ -16,6 +16,7 @@ import type { BlockMergeRollupInputs, BlockRootOrBlockMergePublicInputs, BlockRootRollupInputs, + EmptyBlockRootRollupInputs, KernelCircuitPublicInputs, MergeRollupInputs, NESTED_RECURSIVE_PROOF_LENGTH, @@ -351,12 +352,12 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource return this.enqueue({ type: ProvingRequestType.BLOCK_ROOT_ROLLUP, inputs: input }, signal, epochNumber); } - getBlockRootRollupFinalProof( - input: BlockRootRollupInputs, + getEmptyBlockRootRollupProof( + input: EmptyBlockRootRollupInputs, signal?: AbortSignal, epochNumber?: number, ): Promise> { - return this.enqueue({ type: ProvingRequestType.BLOCK_ROOT_ROLLUP_FINAL, inputs: input }, signal, epochNumber); + return this.enqueue({ type: ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP, inputs: input }, signal, epochNumber); } /** diff --git a/yarn-project/prover-client/src/prover-agent/prover-agent.ts b/yarn-project/prover-client/src/prover-agent/prover-agent.ts index a4af27153d7..61b3172d548 100644 --- a/yarn-project/prover-client/src/prover-agent/prover-agent.ts +++ b/yarn-project/prover-client/src/prover-agent/prover-agent.ts @@ -181,12 +181,12 @@ export class ProverAgent { return this.circuitProver.getMergeRollupProof(inputs); } - case ProvingRequestType.BLOCK_ROOT_ROLLUP: { - return this.circuitProver.getBlockRootRollupProof(inputs); + case ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP: { + return this.circuitProver.getEmptyBlockRootRollupProof(inputs); } - case ProvingRequestType.BLOCK_ROOT_ROLLUP_FINAL: { - return this.circuitProver.getBlockRootRollupFinalProof(inputs); + case ProvingRequestType.BLOCK_ROOT_ROLLUP: { + return this.circuitProver.getBlockRootRollupProof(inputs); } case ProvingRequestType.BLOCK_MERGE_ROLLUP: { diff --git a/yarn-project/prover-client/src/prover-agent/rpc.ts b/yarn-project/prover-client/src/prover-agent/rpc.ts index 39d9677ce77..ff97e8bb4fb 100644 --- a/yarn-project/prover-client/src/prover-agent/rpc.ts +++ b/yarn-project/prover-client/src/prover-agent/rpc.ts @@ -9,6 +9,7 @@ import { BlockMergeRollupInputs, BlockRootOrBlockMergePublicInputs, BlockRootRollupInputs, + EmptyBlockRootRollupInputs, EthAddress, Fr, Header, @@ -68,6 +69,7 @@ export function createProvingJobSourceServer(queue: ProvingJobSource): JsonRpcSe BlockRootOrBlockMergePublicInputs, BlockMergeRollupInputs, BlockRootRollupInputs, + EmptyBlockRootRollupInputs, }, {}, ); @@ -109,6 +111,7 @@ export function createProvingJobSourceClient( BlockRootOrBlockMergePublicInputs, BlockMergeRollupInputs, BlockRootRollupInputs, + EmptyBlockRootRollupInputs, }, {}, false, diff --git a/yarn-project/prover-client/src/test/bb_prover_full_rollup.test.ts b/yarn-project/prover-client/src/test/bb_prover_full_rollup.test.ts index fdecf4270ca..ee3dc99956d 100644 --- a/yarn-project/prover-client/src/test/bb_prover_full_rollup.test.ts +++ b/yarn-project/prover-client/src/test/bb_prover_full_rollup.test.ts @@ -1,73 +1,83 @@ import { BBNativeRollupProver, type BBProverConfig } from '@aztec/bb-prover'; -import { PROVING_STATUS, mockTx } from '@aztec/circuit-types'; +import { mockTx } from '@aztec/circuit-types'; import { Fr, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/circuits.js'; import { makeTuple } from '@aztec/foundation/array'; import { times } from '@aztec/foundation/collection'; import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log'; +import { getTestData, isGenerateTestDataEnabled, writeTestData } from '@aztec/foundation/testing'; import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; +import { makeGlobals } from '../mocks/fixtures.js'; import { TestContext } from '../mocks/test_context.js'; describe('prover/bb_prover/full-rollup', () => { let context: TestContext; let prover: BBNativeRollupProver; - let logger: DebugLogger; + let log: DebugLogger; beforeAll(async () => { const buildProver = async (bbConfig: BBProverConfig) => { prover = await BBNativeRollupProver.new(bbConfig, new NoopTelemetryClient()); return prover; }; - logger = createDebugLogger('aztec:bb-prover-full-rollup'); - context = await TestContext.new(logger, 'legacy', 1, buildProver); + log = createDebugLogger('aztec:bb-prover-full-rollup'); + context = await TestContext.new(log, 'legacy', 1, buildProver); }); afterAll(async () => { await context.cleanup(); }); - it('proves a private-only rollup full of empty txs', async () => { - const totalTxs = 2; - const nonEmptyTxs = 0; - - logger.info(`Proving a private-only full rollup with ${nonEmptyTxs}/${totalTxs} non-empty transactions`); - const initialHeader = context.actualDb.getInitialHeader(); - const txs = times(nonEmptyTxs, (i: number) => { - const tx = mockTx(1000 * (i + 1), { - numberOfNonRevertiblePublicCallRequests: 0, - numberOfRevertiblePublicCallRequests: 0, - }); - tx.data.constants.historicalHeader = initialHeader; - tx.data.constants.vkTreeRoot = getVKTreeRoot(); - return tx; - }); - - const l1ToL2Messages = makeTuple( - NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, - Fr.random, - ); - - logger.info(`Starting new block`); - const provingTicket = await context.orchestrator.startNewBlock(totalTxs, context.globalVariables, l1ToL2Messages); - - logger.info(`Processing public functions`); - const [processed, failed] = await context.processPublicFunctions(txs, nonEmptyTxs, context.blockProver); - expect(processed.length).toBe(nonEmptyTxs); - expect(failed.length).toBe(0); - - logger.info(`Setting block as completed`); - await context.orchestrator.setBlockCompleted(); - - const provingResult = await provingTicket.provingPromise; - - expect(provingResult.status).toBe(PROVING_STATUS.SUCCESS); - - logger.info(`Finalising block`); - const blockResult = await context.orchestrator.finaliseBlock(); - - await expect(prover.verifyProof('BlockRootRollupFinalArtifact', blockResult.proof)).resolves.not.toThrow(); - }); + it.each([ + [1, 1, 0, 2], // Epoch with a single block, requires one padding block proof + [2, 2, 0, 2], // Full epoch with two blocks + // [2, 3, 0, 2], // Epoch with two blocks but the block merge tree was assembled as with 3 leaves, requires one padding block proof; commented out to reduce running time + ])( + 'proves a private-only epoch with %i/%i blocks with %i/%i non-empty txs each', + async (blockCount, totalBlocks, nonEmptyTxs, totalTxs) => { + log.info(`Proving epoch with ${blockCount}/${totalBlocks} blocks with ${nonEmptyTxs}/${totalTxs} non-empty txs`); + + const initialHeader = context.actualDb.getInitialHeader(); + context.orchestrator.startNewEpoch(1, totalBlocks); + + for (let blockNum = 1; blockNum <= blockCount; blockNum++) { + const globals = makeGlobals(blockNum); + const l1ToL2Messages = makeTuple(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, Fr.random); + const txs = times(nonEmptyTxs, (i: number) => { + const txOpts = { numberOfNonRevertiblePublicCallRequests: 0, numberOfRevertiblePublicCallRequests: 0 }; + const tx = mockTx(blockNum * 100_000 + 1000 * (i + 1), txOpts); + tx.data.constants.historicalHeader = initialHeader; + tx.data.constants.vkTreeRoot = getVKTreeRoot(); + return tx; + }); + + log.info(`Starting new block #${blockNum}`); + await context.orchestrator.startNewBlock(totalTxs, globals, l1ToL2Messages); + log.info(`Processing public functions`); + const [processed, failed] = await context.processPublicFunctions(txs, nonEmptyTxs, context.epochProver); + expect(processed.length).toBe(nonEmptyTxs); + expect(failed.length).toBe(0); + + log.info(`Setting block as completed`); + await context.orchestrator.setBlockCompleted(); + } + + log.info(`Awaiting proofs`); + const epochResult = await context.orchestrator.finaliseEpoch(); + + await expect(prover.verifyProof('RootRollupArtifact', epochResult.proof)).resolves.not.toThrow(); + + // Generate test data for the 2/2 blocks epoch scenario + if (blockCount === 2 && totalBlocks === 2 && isGenerateTestDataEnabled()) { + const epochProof = getTestData('epochProofResult').at(-1); + writeTestData( + 'yarn-project/end-to-end/src/fixtures/dumps/epoch_proof_result.json', + JSON.stringify(epochProof!), + ); + } + }, + ); // TODO(@PhilWindle): Remove public functions and re-enable once we can handle empty tx slots it.skip('proves all circuits', async () => { @@ -87,25 +97,18 @@ describe('prover/bb_prover/full-rollup', () => { Fr.random, ); - const provingTicket = await context.orchestrator.startNewBlock( - numTransactions, - context.globalVariables, - l1ToL2Messages, - ); + context.orchestrator.startNewEpoch(1, 1); + + await context.orchestrator.startNewBlock(numTransactions, context.globalVariables, l1ToL2Messages); - const [processed, failed] = await context.processPublicFunctions(txs, numTransactions, context.blockProver); + const [processed, failed] = await context.processPublicFunctions(txs, numTransactions, context.epochProver); expect(processed.length).toBe(numTransactions); expect(failed.length).toBe(0); await context.orchestrator.setBlockCompleted(); - const provingResult = await provingTicket.provingPromise; - - expect(provingResult.status).toBe(PROVING_STATUS.SUCCESS); - - const blockResult = await context.orchestrator.finaliseBlock(); - - await expect(prover.verifyProof('RootRollupArtifact', blockResult.proof)).resolves.not.toThrow(); + const result = await context.orchestrator.finaliseEpoch(); + await expect(prover.verifyProof('RootRollupArtifact', result.proof)).resolves.not.toThrow(); }); }); diff --git a/yarn-project/prover-client/src/test/mock_prover.ts b/yarn-project/prover-client/src/test/mock_prover.ts index 021832713a7..0564d0bfd44 100644 --- a/yarn-project/prover-client/src/test/mock_prover.ts +++ b/yarn-project/prover-client/src/test/mock_prover.ts @@ -78,7 +78,7 @@ export class MockProver implements ServerCircuitProver { ); } - getBlockRootRollupProof(): Promise> { + getEmptyBlockRootRollupProof(): Promise> { return Promise.resolve( makePublicInputsAndRecursiveProof( makeBlockRootOrBlockMergeRollupPublicInputs(), @@ -88,7 +88,7 @@ export class MockProver implements ServerCircuitProver { ); } - getBlockRootRollupFinalProof(): Promise> { + getBlockRootRollupProof(): Promise> { return Promise.resolve( makePublicInputsAndRecursiveProof( makeBlockRootOrBlockMergeRollupPublicInputs(), diff --git a/yarn-project/prover-client/src/tx-prover/tx-prover.ts b/yarn-project/prover-client/src/tx-prover/tx-prover.ts index a6dc55feb8b..23a10f54f83 100644 --- a/yarn-project/prover-client/src/tx-prover/tx-prover.ts +++ b/yarn-project/prover-client/src/tx-prover/tx-prover.ts @@ -1,7 +1,7 @@ import { BBNativeRollupProver, TestCircuitProver } from '@aztec/bb-prover'; import { - type BlockProver, - type ProverClient, + type EpochProver, + type EpochProverManager, type ProvingJobSource, type ServerCircuitProver, } from '@aztec/circuit-types/interfaces'; @@ -19,7 +19,7 @@ import { ProverAgent } from '../prover-agent/prover-agent.js'; * A prover factory. * TODO(palla/prover-node): Rename this class */ -export class TxProver implements ProverClient { +export class TxProver implements EpochProverManager { private queue: MemoryProvingQueue; private running = false; @@ -33,7 +33,7 @@ export class TxProver implements ProverClient { this.queue = new MemoryProvingQueue(telemetry, config.proverJobTimeoutMs, config.proverJobPollIntervalMs); } - public createBlockProver(db: MerkleTreeOperations): BlockProver { + public createEpochProver(db: MerkleTreeOperations): EpochProver { return new ProvingOrchestrator(db, this.queue, this.telemetry, this.config.proverId); } diff --git a/yarn-project/prover-node/package.json b/yarn-project/prover-node/package.json index 1ab15127b80..21c4d635e3e 100644 --- a/yarn-project/prover-node/package.json +++ b/yarn-project/prover-node/package.json @@ -52,8 +52,10 @@ "@aztec/archiver": "workspace:^", "@aztec/circuit-types": "workspace:^", "@aztec/circuits.js": "workspace:^", + "@aztec/ethereum": "workspace:^", "@aztec/foundation": "workspace:^", "@aztec/kv-store": "workspace:^", + "@aztec/l1-artifacts": "workspace:^", "@aztec/prover-client": "workspace:^", "@aztec/sequencer-client": "workspace:^", "@aztec/simulator": "workspace:^", @@ -61,7 +63,8 @@ "@aztec/types": "workspace:^", "@aztec/world-state": "workspace:^", "source-map-support": "^0.5.21", - "tslib": "^2.4.0" + "tslib": "^2.4.0", + "viem": "^2.7.15" }, "devDependencies": { "@jest/globals": "^29.5.0", diff --git a/yarn-project/prover-node/src/config.ts b/yarn-project/prover-node/src/config.ts index d7229c80afe..bfca132153d 100644 --- a/yarn-project/prover-node/src/config.ts +++ b/yarn-project/prover-node/src/config.ts @@ -1,7 +1,7 @@ import { type ArchiverConfig, archiverConfigMappings, getArchiverConfigFromEnv } from '@aztec/archiver'; import { type ConfigMappingsType, - booleanConfigHelper, + bigintConfigHelper, getConfigFromMappings, numberConfigHelper, } from '@aztec/foundation/config'; @@ -16,31 +16,54 @@ import { } from '@aztec/sequencer-client'; import { type WorldStateConfig, getWorldStateConfigFromEnv, worldStateConfigMappings } from '@aztec/world-state'; -import { type TxProviderConfig, getTxProviderConfigFromEnv, txProviderConfigMappings } from './tx-provider/config.js'; +import { + type ProverCoordinationConfig, + getTxProviderConfigFromEnv, + proverCoordinationConfigMappings, +} from './prover-coordination/config.js'; export type ProverNodeConfig = ArchiverConfig & ProverClientConfig & WorldStateConfig & PublisherConfig & TxSenderConfig & - TxProviderConfig & { - proverNodeDisableAutomaticProving?: boolean; - proverNodeMaxPendingJobs?: number; + ProverCoordinationConfig & + QuoteProviderConfig & { + proverNodeMaxPendingJobs: number; + proverNodePollingIntervalMs: number; }; +export type QuoteProviderConfig = { + quoteProviderBasisPointFee: number; + quoteProviderBondAmount: bigint; +}; + const specificProverNodeConfigMappings: ConfigMappingsType< - Pick + Pick > = { - proverNodeDisableAutomaticProving: { - env: 'PROVER_NODE_DISABLE_AUTOMATIC_PROVING', - description: 'Whether to disable automatic proving of pending blocks seen on L1', - ...booleanConfigHelper(false), - }, proverNodeMaxPendingJobs: { env: 'PROVER_NODE_MAX_PENDING_JOBS', description: 'The maximum number of pending jobs for the prover node', + ...numberConfigHelper(10), + }, + proverNodePollingIntervalMs: { + env: 'PROVER_NODE_POLLING_INTERVAL_MS', + description: 'The interval in milliseconds to poll for new jobs', + ...numberConfigHelper(1000), + }, +}; + +const quoteProviderConfigMappings: ConfigMappingsType = { + quoteProviderBasisPointFee: { + env: 'QUOTE_PROVIDER_BASIS_POINT_FEE', + description: 'The basis point fee to charge for providing quotes', ...numberConfigHelper(100), }, + quoteProviderBondAmount: { + env: 'QUOTE_PROVIDER_BOND_AMOUNT', + description: 'The bond amount to charge for providing quotes', + ...bigintConfigHelper(1000n), + }, }; export const proverNodeConfigMappings: ConfigMappingsType = { @@ -49,7 +72,8 @@ export const proverNodeConfigMappings: ConfigMappingsType = { ...worldStateConfigMappings, ...getPublisherConfigMappings('PROVER'), ...getTxSenderConfigMappings('PROVER'), - ...txProviderConfigMappings, + ...proverCoordinationConfigMappings, + ...quoteProviderConfigMappings, ...specificProverNodeConfigMappings, }; @@ -61,6 +85,7 @@ export function getProverNodeConfigFromEnv(): ProverNodeConfig { ...getPublisherConfigFromEnv('PROVER'), ...getTxSenderConfigFromEnv('PROVER'), ...getTxProviderConfigFromEnv(), + ...getConfigFromMappings(quoteProviderConfigMappings), ...getConfigFromMappings(specificProverNodeConfigMappings), }; } diff --git a/yarn-project/prover-node/src/factory.ts b/yarn-project/prover-node/src/factory.ts index 7e9c31e8cbf..97364a15f1c 100644 --- a/yarn-project/prover-node/src/factory.ts +++ b/yarn-project/prover-node/src/factory.ts @@ -1,6 +1,9 @@ import { type Archiver, createArchiver } from '@aztec/archiver'; import { type AztecNode } from '@aztec/circuit-types'; +import { createEthereumChain } from '@aztec/ethereum'; +import { Buffer32 } from '@aztec/foundation/buffer'; import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log'; +import { RollupAbi } from '@aztec/l1-artifacts'; import { createProverClient } from '@aztec/prover-client'; import { L1Publisher } from '@aztec/sequencer-client'; import { createSimulationProvider } from '@aztec/simulator'; @@ -8,10 +11,15 @@ import { type TelemetryClient } from '@aztec/telemetry-client'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { createWorldStateSynchronizer } from '@aztec/world-state'; -import { type ProverNodeConfig } from './config.js'; +import { createPublicClient, getAddress, getContract, http } from 'viem'; + +import { type ProverNodeConfig, type QuoteProviderConfig } from './config.js'; +import { ClaimsMonitor } from './monitors/claims-monitor.js'; +import { EpochMonitor } from './monitors/epoch-monitor.js'; +import { createProverCoordination } from './prover-coordination/factory.js'; import { ProverNode } from './prover-node.js'; -import { AztecNodeTxProvider } from './tx-provider/aztec-node-tx-provider.js'; -import { createTxProvider } from './tx-provider/factory.js'; +import { SimpleQuoteProvider } from './quote-provider/simple.js'; +import { QuoteSigner } from './quote-signer.js'; /** Creates a new prover node given a config. */ export async function createProverNode( @@ -39,9 +47,17 @@ export async function createProverNode( // REFACTOR: Move publisher out of sequencer package and into an L1-related package const publisher = new L1Publisher(config, telemetry); - const txProvider = deps.aztecNodeTxProvider - ? new AztecNodeTxProvider(deps.aztecNodeTxProvider) - : createTxProvider(config); + const txProvider = deps.aztecNodeTxProvider ? deps.aztecNodeTxProvider : createProverCoordination(config); + const quoteProvider = createQuoteProvider(config); + const quoteSigner = createQuoteSigner(config); + + const proverNodeConfig = { + maxPendingJobs: config.proverNodeMaxPendingJobs, + pollingIntervalMs: config.proverNodePollingIntervalMs, + }; + + const claimsMonitor = new ClaimsMonitor(publisher, proverNodeConfig); + const epochMonitor = new EpochMonitor(archiver, proverNodeConfig); return new ProverNode( prover!, @@ -52,10 +68,26 @@ export async function createProverNode( worldStateSynchronizer, txProvider, simulationProvider, + quoteProvider, + quoteSigner, + claimsMonitor, + epochMonitor, telemetry, - { - disableAutomaticProving: config.proverNodeDisableAutomaticProving, - maxPendingJobs: config.proverNodeMaxPendingJobs, - }, + proverNodeConfig, ); } + +function createQuoteProvider(config: QuoteProviderConfig) { + return new SimpleQuoteProvider(config.quoteProviderBasisPointFee, config.quoteProviderBondAmount); +} + +function createQuoteSigner(config: ProverNodeConfig) { + // REFACTOR: We need a package that just returns an instance of a rollup contract ready to use + const { l1RpcUrl: rpcUrl, l1ChainId: chainId, l1Contracts } = config; + const chain = createEthereumChain(rpcUrl, chainId); + const client = createPublicClient({ chain: chain.chainInfo, transport: http(chain.rpcUrl) }); + const address = getAddress(l1Contracts.rollupAddress.toString()); + const rollupContract = getContract({ address, abi: RollupAbi, client }); + const privateKey = config.publisherPrivateKey; + return QuoteSigner.new(Buffer32.fromString(privateKey), rollupContract); +} diff --git a/yarn-project/prover-node/src/job/block-proving-job.ts b/yarn-project/prover-node/src/job/epoch-proving-job.ts similarity index 60% rename from yarn-project/prover-node/src/job/block-proving-job.ts rename to yarn-project/prover-node/src/job/epoch-proving-job.ts index 1f8e70f09b1..22c2f640d54 100644 --- a/yarn-project/prover-node/src/job/block-proving-job.ts +++ b/yarn-project/prover-node/src/job/epoch-proving-job.ts @@ -1,14 +1,13 @@ import { - type BlockProver, EmptyTxValidator, + type EpochProver, type L1ToL2MessageSource, type L2Block, type L2BlockSource, - PROVING_STATUS, type ProcessedTx, + type ProverCoordination, type Tx, type TxHash, - type TxProvider, } from '@aztec/circuit-types'; import { createDebugLogger } from '@aztec/foundation/log'; import { Timer } from '@aztec/foundation/timer'; @@ -24,20 +23,22 @@ import { type ProverNodeMetrics } from '../metrics.js'; * re-executes their public calls, generates a rollup proof, and submits it to L1. This job will update the * world state as part of public call execution via the public processor. */ -export class BlockProvingJob { - private state: BlockProvingJobState = 'initialized'; - private log = createDebugLogger('aztec:block-proving-job'); +export class EpochProvingJob { + private state: EpochProvingJobState = 'initialized'; + private log = createDebugLogger('aztec:epoch-proving-job'); private uuid: string; constructor( - private prover: BlockProver, + private epochNumber: bigint, + private blocks: L2Block[], + private prover: EpochProver, private publicProcessorFactory: PublicProcessorFactory, private publisher: L1Publisher, private l2BlockSource: L2BlockSource, private l1ToL2MessageSource: L1ToL2MessageSource, - private txProvider: TxProvider, + private coordination: ProverCoordination, private metrics: ProverNodeMetrics, - private cleanUp: (job: BlockProvingJob) => Promise = () => Promise.resolve(), + private cleanUp: (job: EpochProvingJob) => Promise = () => Promise.resolve(), ) { this.uuid = crypto.randomUUID(); } @@ -46,26 +47,31 @@ export class BlockProvingJob { return this.uuid; } - public getState(): BlockProvingJobState { + public getState(): EpochProvingJobState { return this.state; } - public async run(fromBlock: number, toBlock: number) { - if (fromBlock !== toBlock) { - throw new Error(`Block ranges are not yet supported`); - } - - this.log.info(`Starting block proving job`, { fromBlock, toBlock, uuid: this.uuid }); + /** + * Proves the given epoch and submits the proof to L1. + */ + public async run() { + const epochNumber = Number(this.epochNumber); + const epochSize = this.blocks.length; + this.log.info(`Starting epoch proving job`, { epochSize, epochNumber, uuid: this.uuid }); this.state = 'processing'; const timer = new Timer(); + try { - let historicalHeader = (await this.l2BlockSource.getBlock(fromBlock - 1))?.header; - for (let blockNumber = fromBlock; blockNumber <= toBlock; blockNumber++) { - const block = await this.getBlock(blockNumber); + this.prover.startNewEpoch(epochNumber, epochSize); + let previousHeader = await this.l2BlockSource.getBlockHeader(this.blocks[0].number - 1); + + for (const block of this.blocks) { + // Gather all data to prove this block const globalVariables = block.header.globalVariables; const txHashes = block.body.txEffects.map(tx => tx.txHash); const txCount = block.body.numberOfTxsIncludingPadded; const l1ToL2Messages = await this.getL1ToL2Messages(block); + const txs = await this.getTxs(txHashes); this.log.verbose(`Starting block processing`, { number: block.number, @@ -74,54 +80,41 @@ export class BlockProvingJob { noteHashTreeRoot: block.header.state.partial.noteHashTree.root, nullifierTreeRoot: block.header.state.partial.nullifierTree.root, publicDataTreeRoot: block.header.state.partial.publicDataTree.root, - historicalHeader: historicalHeader?.hash(), + previousHeader: previousHeader?.hash(), uuid: this.uuid, ...globalVariables, }); - // When we move to proving epochs, this should change into a startNewEpoch and be lifted outside the loop. - const provingTicket = await this.prover.startNewBlock(txCount, globalVariables, l1ToL2Messages); - - const publicProcessor = this.publicProcessorFactory.create(historicalHeader, globalVariables); + // Start block proving + await this.prover.startNewBlock(txCount, globalVariables, l1ToL2Messages); - const txs = await this.getTxs(txHashes); + // Process public fns + const publicProcessor = this.publicProcessorFactory.create(previousHeader, globalVariables); await this.processTxs(publicProcessor, txs, txCount); - this.log.verbose(`Processed all txs for block`, { blockNumber: block.number, blockHash: block.hash().toString(), uuid: this.uuid, }); + // Mark block as completed and update archive tree await this.prover.setBlockCompleted(); - - // This should be moved outside the loop to match the creation of the proving ticket when we move to epochs. - this.state = 'awaiting-prover'; - const result = await provingTicket.provingPromise; - if (result.status === PROVING_STATUS.FAILURE) { - throw new Error(`Block proving failed: ${result.reason}`); - } - - historicalHeader = block.header; + previousHeader = block.header; } - const { block, aggregationObject, proof } = await this.prover.finaliseBlock(); - this.log.info(`Finalised proof for block range`, { fromBlock, toBlock, uuid: this.uuid }); + this.state = 'awaiting-prover'; + const { publicInputs, proof } = await this.prover.finaliseEpoch(); + this.log.info(`Finalised proof for epoch`, { epochNumber, uuid: this.uuid }); this.state = 'publishing-proof'; - await this.publisher.submitProof( - block.header, - block.archive.root, - this.prover.getProverId(), - aggregationObject, - proof, - ); - this.log.info(`Submitted proof for block range`, { fromBlock, toBlock, uuid: this.uuid }); + const [fromBlock, toBlock] = [this.blocks[0].number, this.blocks.at(-1)!.number]; + await this.publisher.submitEpochProof({ fromBlock, toBlock, epochNumber, publicInputs, proof }); + this.log.info(`Submitted proof for epoch`, { epochNumber, uuid: this.uuid }); this.state = 'completed'; this.metrics.recordProvingJob(timer); } catch (err) { - this.log.error(`Error running block prover job`, err, { uuid: this.uuid }); + this.log.error(`Error running epoch prover job`, err, { uuid: this.uuid }); this.state = 'failed'; } finally { await this.cleanUp(this); @@ -132,17 +125,9 @@ export class BlockProvingJob { this.prover.cancel(); } - private async getBlock(blockNumber: number): Promise { - const block = await this.l2BlockSource.getBlock(blockNumber); - if (!block) { - throw new Error(`Block ${blockNumber} not found in L2 block source`); - } - return block; - } - private async getTxs(txHashes: TxHash[]): Promise { const txs = await Promise.all( - txHashes.map(txHash => this.txProvider.getTxByHash(txHash).then(tx => [txHash, tx] as const)), + txHashes.map(txHash => this.coordination.getTxByHash(txHash).then(tx => [txHash, tx] as const)), ); const notFound = txs.filter(([_, tx]) => !tx); if (notFound.length) { @@ -177,7 +162,7 @@ export class BlockProvingJob { } } -export type BlockProvingJobState = +export type EpochProvingJobState = | 'initialized' | 'processing' | 'awaiting-prover' diff --git a/yarn-project/prover-node/src/monitors/claims-monitor.test.ts b/yarn-project/prover-node/src/monitors/claims-monitor.test.ts new file mode 100644 index 00000000000..610284e3caa --- /dev/null +++ b/yarn-project/prover-node/src/monitors/claims-monitor.test.ts @@ -0,0 +1,79 @@ +import { type EpochProofClaim } from '@aztec/circuit-types'; +import { EthAddress } from '@aztec/circuits.js'; +import { sleep } from '@aztec/foundation/sleep'; +import { type L1Publisher } from '@aztec/sequencer-client'; + +import { type MockProxy, mock } from 'jest-mock-extended'; + +import { ClaimsMonitor, type ClaimsMonitorHandler } from './claims-monitor.js'; + +describe('ClaimsMonitor', () => { + let l1Publisher: MockProxy; + let handler: MockProxy; + let claimsMonitor: ClaimsMonitor; + + let publisherAddress: EthAddress; + + beforeEach(() => { + l1Publisher = mock(); + handler = mock(); + + publisherAddress = EthAddress.random(); + l1Publisher.getSenderAddress.mockReturnValue(publisherAddress); + + claimsMonitor = new ClaimsMonitor(l1Publisher, { pollingIntervalMs: 10 }); + }); + + afterEach(async () => { + await claimsMonitor.stop(); + }); + + const makeEpochProofClaim = (epoch: number, bondProvider: EthAddress): MockProxy => { + return { + basisPointFee: 100n, + bondAmount: 10n, + bondProvider, + epochToProve: BigInt(epoch), + proposerClaimant: EthAddress.random(), + }; + }; + + it('should handle a new claim if it belongs to the prover', async () => { + const proofClaim = makeEpochProofClaim(1, publisherAddress); + l1Publisher.getProofClaim.mockResolvedValue(proofClaim); + + claimsMonitor.start(handler); + await sleep(100); + + expect(handler.handleClaim).toHaveBeenCalledWith(proofClaim); + expect(handler.handleClaim).toHaveBeenCalledTimes(1); + }); + + it('should not handle a new claim if it does not belong to the prover', async () => { + const proofClaim = makeEpochProofClaim(1, EthAddress.random()); + l1Publisher.getProofClaim.mockResolvedValue(proofClaim); + + claimsMonitor.start(handler); + await sleep(100); + + expect(handler.handleClaim).not.toHaveBeenCalled(); + }); + + it('should only trigger when a new claim is seen', async () => { + const proofClaim = makeEpochProofClaim(1, publisherAddress); + l1Publisher.getProofClaim.mockResolvedValue(proofClaim); + + claimsMonitor.start(handler); + await sleep(100); + + expect(handler.handleClaim).toHaveBeenCalledWith(proofClaim); + expect(handler.handleClaim).toHaveBeenCalledTimes(1); + + const proofClaim2 = makeEpochProofClaim(2, publisherAddress); + l1Publisher.getProofClaim.mockResolvedValue(proofClaim2); + await sleep(100); + + expect(handler.handleClaim).toHaveBeenCalledWith(proofClaim2); + expect(handler.handleClaim).toHaveBeenCalledTimes(2); + }); +}); diff --git a/yarn-project/prover-node/src/monitors/claims-monitor.ts b/yarn-project/prover-node/src/monitors/claims-monitor.ts new file mode 100644 index 00000000000..abce274866b --- /dev/null +++ b/yarn-project/prover-node/src/monitors/claims-monitor.ts @@ -0,0 +1,52 @@ +import { type EpochProofClaim } from '@aztec/circuit-types'; +import { type EthAddress } from '@aztec/circuits.js'; +import { createDebugLogger } from '@aztec/foundation/log'; +import { RunningPromise } from '@aztec/foundation/running-promise'; +import { type L1Publisher } from '@aztec/sequencer-client'; + +export interface ClaimsMonitorHandler { + handleClaim(proofClaim: EpochProofClaim): Promise; +} + +export class ClaimsMonitor { + private runningPromise: RunningPromise; + private log = createDebugLogger('aztec:prover-node:claims-monitor'); + + private handler: ClaimsMonitorHandler | undefined; + private lastClaimEpochNumber: bigint | undefined; + + constructor(private readonly l1Publisher: L1Publisher, private options: { pollingIntervalMs: number }) { + this.runningPromise = new RunningPromise(this.work.bind(this), this.options.pollingIntervalMs); + } + + public start(handler: ClaimsMonitorHandler) { + this.handler = handler; + this.runningPromise.start(); + this.log.info(`Started ClaimsMonitor with prover address ${this.getProverAddress().toString()}`, this.options); + } + + public async stop() { + this.log.verbose('Stopping ClaimsMonitor'); + await this.runningPromise.stop(); + this.log.info('Stopped ClaimsMonitor'); + } + + public async work() { + const proofClaim = await this.l1Publisher.getProofClaim(); + if (!proofClaim) { + return; + } + + if (this.lastClaimEpochNumber === undefined || proofClaim.epochToProve > this.lastClaimEpochNumber) { + this.log.verbose(`Found new claim for epoch ${proofClaim.epochToProve} by ${proofClaim.bondProvider.toString()}`); + if (proofClaim.bondProvider.equals(this.getProverAddress())) { + await this.handler?.handleClaim(proofClaim); + } + this.lastClaimEpochNumber = proofClaim.epochToProve; + } + } + + protected getProverAddress(): EthAddress { + return this.l1Publisher.getSenderAddress(); + } +} diff --git a/yarn-project/prover-node/src/monitors/epoch-monitor.test.ts b/yarn-project/prover-node/src/monitors/epoch-monitor.test.ts new file mode 100644 index 00000000000..f7a0d7dc406 --- /dev/null +++ b/yarn-project/prover-node/src/monitors/epoch-monitor.test.ts @@ -0,0 +1,76 @@ +import { type L2BlockSource } from '@aztec/circuit-types'; +import { sleep } from '@aztec/foundation/sleep'; + +import { type MockProxy, mock } from 'jest-mock-extended'; + +import { EpochMonitor, type EpochMonitorHandler } from './epoch-monitor.js'; + +describe('EpochMonitor', () => { + let l2BlockSource: MockProxy; + let handler: MockProxy; + let epochMonitor: EpochMonitor; + + let lastEpochComplete: bigint = 0n; + + beforeEach(() => { + handler = mock(); + l2BlockSource = mock({ + isEpochComplete(epochNumber) { + return Promise.resolve(epochNumber <= lastEpochComplete); + }, + }); + + epochMonitor = new EpochMonitor(l2BlockSource, { pollingIntervalMs: 10 }); + }); + + afterEach(async () => { + await epochMonitor.stop(); + }); + + it('triggers initial epoch sync', async () => { + l2BlockSource.getL2EpochNumber.mockResolvedValue(10n); + epochMonitor.start(handler); + await sleep(100); + + expect(handler.handleInitialEpochSync).toHaveBeenCalledWith(9n); + }); + + it('does not trigger initial epoch sync on epoch zero', async () => { + l2BlockSource.getL2EpochNumber.mockResolvedValue(0n); + epochMonitor.start(handler); + await sleep(100); + + expect(handler.handleInitialEpochSync).not.toHaveBeenCalled(); + }); + + it('triggers epoch completion', async () => { + lastEpochComplete = 9n; + l2BlockSource.getL2EpochNumber.mockResolvedValue(10n); + epochMonitor.start(handler); + + await sleep(100); + expect(handler.handleEpochCompleted).not.toHaveBeenCalled(); + + lastEpochComplete = 10n; + await sleep(100); + expect(handler.handleEpochCompleted).toHaveBeenCalledWith(10n); + expect(handler.handleEpochCompleted).toHaveBeenCalledTimes(1); + + lastEpochComplete = 11n; + await sleep(100); + expect(handler.handleEpochCompleted).toHaveBeenCalledWith(11n); + expect(handler.handleEpochCompleted).toHaveBeenCalledTimes(2); + }); + + it('triggers epoch completion if initial epoch was already complete', async () => { + // this happens if we start the monitor on the very last slot of an epoch + lastEpochComplete = 10n; + l2BlockSource.getL2EpochNumber.mockResolvedValue(10n); + epochMonitor.start(handler); + + await sleep(100); + expect(handler.handleInitialEpochSync).toHaveBeenCalledWith(9n); + expect(handler.handleEpochCompleted).toHaveBeenCalledWith(10n); + expect(handler.handleEpochCompleted).toHaveBeenCalledTimes(1); + }); +}); diff --git a/yarn-project/prover-node/src/monitors/epoch-monitor.ts b/yarn-project/prover-node/src/monitors/epoch-monitor.ts new file mode 100644 index 00000000000..0f106e38522 --- /dev/null +++ b/yarn-project/prover-node/src/monitors/epoch-monitor.ts @@ -0,0 +1,48 @@ +import { type L2BlockSource } from '@aztec/circuit-types'; +import { createDebugLogger } from '@aztec/foundation/log'; +import { RunningPromise } from '@aztec/foundation/running-promise'; + +export interface EpochMonitorHandler { + handleInitialEpochSync(epochNumber: bigint): Promise; + handleEpochCompleted(epochNumber: bigint): Promise; +} + +export class EpochMonitor { + private runningPromise: RunningPromise; + private log = createDebugLogger('aztec:prover-node:epoch-monitor'); + + private handler: EpochMonitorHandler | undefined; + + private latestEpochNumber: bigint | undefined; + + constructor(private readonly l2BlockSource: L2BlockSource, private options: { pollingIntervalMs: number }) { + this.runningPromise = new RunningPromise(this.work.bind(this), this.options.pollingIntervalMs); + } + + public start(handler: EpochMonitorHandler) { + this.handler = handler; + this.runningPromise.start(); + this.log.info('Started EpochMonitor', this.options); + } + + public async stop() { + await this.runningPromise.stop(); + this.log.info('Stopped EpochMonitor'); + } + + public async work() { + if (!this.latestEpochNumber) { + const epochNumber = await this.l2BlockSource.getL2EpochNumber(); + if (epochNumber > 0n) { + await this.handler?.handleInitialEpochSync(epochNumber - 1n); + } + this.latestEpochNumber = epochNumber; + return; + } + + if (await this.l2BlockSource.isEpochComplete(this.latestEpochNumber)) { + await this.handler?.handleEpochCompleted(this.latestEpochNumber); + this.latestEpochNumber += 1n; + } + } +} diff --git a/yarn-project/prover-node/src/monitors/index.ts b/yarn-project/prover-node/src/monitors/index.ts new file mode 100644 index 00000000000..f3b5be62922 --- /dev/null +++ b/yarn-project/prover-node/src/monitors/index.ts @@ -0,0 +1,2 @@ +export * from './claims-monitor.js'; +export * from './epoch-monitor.js'; diff --git a/yarn-project/prover-node/src/prover-coordination/config.ts b/yarn-project/prover-node/src/prover-coordination/config.ts new file mode 100644 index 00000000000..7940c803e96 --- /dev/null +++ b/yarn-project/prover-node/src/prover-coordination/config.ts @@ -0,0 +1,17 @@ +import { type ConfigMappingsType, getConfigFromMappings } from '@aztec/foundation/config'; + +export type ProverCoordinationConfig = { + proverCoordinationNodeUrl: string | undefined; +}; + +export const proverCoordinationConfigMappings: ConfigMappingsType = { + proverCoordinationNodeUrl: { + env: 'PROVER_COORDINATION_NODE_URL', + description: 'The URL of the tx provider node', + parseEnv: (val: string) => val, + }, +}; + +export function getTxProviderConfigFromEnv(): ProverCoordinationConfig { + return getConfigFromMappings(proverCoordinationConfigMappings); +} diff --git a/yarn-project/prover-node/src/prover-coordination/factory.ts b/yarn-project/prover-node/src/prover-coordination/factory.ts new file mode 100644 index 00000000000..e48720a329c --- /dev/null +++ b/yarn-project/prover-node/src/prover-coordination/factory.ts @@ -0,0 +1,11 @@ +import { type ProverCoordination, createAztecNodeClient } from '@aztec/circuit-types'; + +import { type ProverCoordinationConfig } from './config.js'; + +export function createProverCoordination(config: ProverCoordinationConfig): ProverCoordination { + if (config.proverCoordinationNodeUrl) { + return createAztecNodeClient(config.proverCoordinationNodeUrl); + } else { + throw new Error(`Aztec Node URL for Tx Provider is not set.`); + } +} diff --git a/yarn-project/prover-node/src/tx-provider/index.ts b/yarn-project/prover-node/src/prover-coordination/index.ts similarity index 56% rename from yarn-project/prover-node/src/tx-provider/index.ts rename to yarn-project/prover-node/src/prover-coordination/index.ts index bac271dd877..0ded7f3c0c1 100644 --- a/yarn-project/prover-node/src/tx-provider/index.ts +++ b/yarn-project/prover-node/src/prover-coordination/index.ts @@ -1,3 +1,2 @@ -export * from './aztec-node-tx-provider.js'; -export * from './factory.js'; export * from './config.js'; +export * from './factory.js'; diff --git a/yarn-project/prover-node/src/prover-node.test.ts b/yarn-project/prover-node/src/prover-node.test.ts index e5cd74cfa32..13d115d72cc 100644 --- a/yarn-project/prover-node/src/prover-node.test.ts +++ b/yarn-project/prover-node/src/prover-node.test.ts @@ -1,12 +1,20 @@ import { + type EpochProofClaim, + EpochProofQuote, + EpochProofQuotePayload, + type EpochProverManager, type L1ToL2MessageSource, + type L2Block, type L2BlockSource, type MerkleTreeAdminOperations, - type ProverClient, - type TxProvider, + type ProverCoordination, WorldStateRunningState, type WorldStateSynchronizer, } from '@aztec/circuit-types'; +import { EthAddress } from '@aztec/circuits.js'; +import { times } from '@aztec/foundation/collection'; +import { Signature } from '@aztec/foundation/eth-signature'; +import { sleep } from '@aztec/foundation/sleep'; import { type L1Publisher } from '@aztec/sequencer-client'; import { type PublicProcessorFactory, type SimulationProvider } from '@aztec/simulator'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; @@ -14,166 +22,291 @@ import { type ContractDataSource } from '@aztec/types/contracts'; import { type MockProxy, mock } from 'jest-mock-extended'; -import { type BlockProvingJob } from './job/block-proving-job.js'; -import { ProverNode } from './prover-node.js'; +import { type EpochProvingJob } from './job/epoch-proving-job.js'; +import { ClaimsMonitor } from './monitors/claims-monitor.js'; +import { EpochMonitor } from './monitors/epoch-monitor.js'; +import { ProverNode, type ProverNodeOptions } from './prover-node.js'; +import { type QuoteProvider } from './quote-provider/index.js'; +import { type QuoteSigner } from './quote-signer.js'; describe('prover-node', () => { - let prover: MockProxy; + // Prover node dependencies + let prover: MockProxy; let publisher: MockProxy; let l2BlockSource: MockProxy; let l1ToL2MessageSource: MockProxy; let contractDataSource: MockProxy; let worldState: MockProxy; - let txProvider: MockProxy; + let coordination: MockProxy; let simulator: MockProxy; + let quoteProvider: MockProxy; + let quoteSigner: MockProxy; + let telemetryClient: NoopTelemetryClient; + let config: ProverNodeOptions; + // Subject under test let proverNode: TestProverNode; + // Quote returned by the provider by default and its completed quote + let partialQuote: Pick; + + // Sample claim + let claim: MockProxy; + + // Blocks returned by the archiver + let blocks: MockProxy[]; + + // Address of the publisher + let address: EthAddress; + // List of all jobs ever created by the test prover node and their dependencies let jobs: { - job: MockProxy; - cleanUp: (job: BlockProvingJob) => Promise; + job: MockProxy; + cleanUp: (job: EpochProvingJob) => Promise; db: MerkleTreeAdminOperations; + epochNumber: bigint; }[]; + const toQuotePayload = ( + epoch: bigint, + partialQuote: Pick, + ) => EpochProofQuotePayload.from({ ...partialQuote, prover: address, epochToProve: epoch }); + + const toExpectedQuote = ( + epoch: bigint, + quote: Pick = partialQuote, + ) => expect.objectContaining({ payload: toQuotePayload(epoch, quote) }); + beforeEach(() => { - prover = mock(); + prover = mock(); publisher = mock(); l2BlockSource = mock(); l1ToL2MessageSource = mock(); contractDataSource = mock(); worldState = mock(); - txProvider = mock(); + coordination = mock(); simulator = mock(); - const telemetryClient = new NoopTelemetryClient(); + quoteProvider = mock(); + quoteSigner = mock(); + + telemetryClient = new NoopTelemetryClient(); + config = { maxPendingJobs: 3, pollingIntervalMs: 10 }; // World state returns a new mock db every time it is asked to fork worldState.syncImmediateAndFork.mockImplementation(() => Promise.resolve(mock())); + worldState.status.mockResolvedValue({ syncedToL2Block: 1, state: WorldStateRunningState.RUNNING }); + + // Publisher returns its sender address + address = EthAddress.random(); + publisher.getSenderAddress.mockReturnValue(address); + + // Quote provider returns a mock + partialQuote = { basisPointFee: 100, bondAmount: 0n, validUntilSlot: 30n }; + quoteProvider.getQuote.mockResolvedValue(partialQuote); + + // Signer returns an empty signature + quoteSigner.sign.mockImplementation(payload => Promise.resolve(new EpochProofQuote(payload, Signature.empty()))); + + // Archiver returns a bunch of fake blocks + blocks = times(3, i => mock({ number: i + 20 })); + l2BlockSource.getBlocksForEpoch.mockResolvedValue(blocks); + + // A sample claim + claim = { epochToProve: 10n, bondProvider: address } as EpochProofClaim; jobs = []; - proverNode = new TestProverNode( - prover, - publisher, - l2BlockSource, - l1ToL2MessageSource, - contractDataSource, - worldState, - txProvider, - simulator, - telemetryClient, - { maxPendingJobs: 3, pollingIntervalMs: 10 }, - ); }); afterEach(async () => { await proverNode.stop(); }); - const setBlockNumbers = (blockNumber: number, provenBlockNumber: number) => { - l2BlockSource.getBlockNumber.mockResolvedValue(blockNumber); - l2BlockSource.getProvenBlockNumber.mockResolvedValue(provenBlockNumber); - worldState.status.mockResolvedValue({ syncedToL2Block: provenBlockNumber, state: WorldStateRunningState.RUNNING }); - }; + describe('with mocked monitors', () => { + let claimsMonitor: MockProxy; + let epochMonitor: MockProxy; - it('proves pending blocks', async () => { - setBlockNumbers(5, 3); + beforeEach(() => { + claimsMonitor = mock(); + epochMonitor = mock(); - await proverNode.work(); - await proverNode.work(); - await proverNode.work(); + proverNode = new TestProverNode( + prover, + publisher, + l2BlockSource, + l1ToL2MessageSource, + contractDataSource, + worldState, + coordination, + simulator, + quoteProvider, + quoteSigner, + claimsMonitor, + epochMonitor, + telemetryClient, + config, + ); + }); - expect(jobs.length).toEqual(2); - expect(jobs[0].job.run).toHaveBeenCalledWith(4, 4); - expect(jobs[1].job.run).toHaveBeenCalledWith(5, 5); - }); + it('sends a quote on a finished epoch', async () => { + await proverNode.handleEpochCompleted(10n); - it('stops proving when maximum jobs are reached', async () => { - setBlockNumbers(10, 3); + expect(quoteProvider.getQuote).toHaveBeenCalledWith(blocks); + expect(quoteSigner.sign).toHaveBeenCalledWith(expect.objectContaining(partialQuote)); + expect(coordination.addEpochProofQuote).toHaveBeenCalledTimes(1); - await proverNode.work(); - await proverNode.work(); - await proverNode.work(); - await proverNode.work(); + expect(coordination.addEpochProofQuote).toHaveBeenCalledWith(toExpectedQuote(10n)); + }); - expect(jobs.length).toEqual(3); - expect(jobs[0].job.run).toHaveBeenCalledWith(4, 4); - expect(jobs[1].job.run).toHaveBeenCalledWith(5, 5); - expect(jobs[2].job.run).toHaveBeenCalledWith(6, 6); - }); + it('does not send a quote on a finished epoch if the provider does not return one', async () => { + quoteProvider.getQuote.mockResolvedValue(undefined); + await proverNode.handleEpochCompleted(10n); - it('reports on pending jobs', async () => { - setBlockNumbers(5, 3); + expect(quoteSigner.sign).not.toHaveBeenCalled(); + expect(coordination.addEpochProofQuote).not.toHaveBeenCalled(); + }); - await proverNode.work(); - await proverNode.work(); + it('starts proving on a new claim', async () => { + await proverNode.handleClaim(claim); - expect(jobs.length).toEqual(2); - expect(proverNode.getJobs().length).toEqual(2); - expect(proverNode.getJobs()).toEqual([ - { uuid: '0', status: 'processing' }, - { uuid: '1', status: 'processing' }, - ]); - }); + expect(jobs[0].epochNumber).toEqual(10n); + }); + + it('fails to start proving if world state is synced past the first block in the epoch', async () => { + // This test will probably be no longer necessary once we have the proper world state + worldState.status.mockResolvedValue({ syncedToL2Block: 21, state: WorldStateRunningState.RUNNING }); + await proverNode.handleClaim(claim); + + expect(jobs.length).toEqual(0); + }); - it('cleans up jobs when completed', async () => { - setBlockNumbers(10, 3); + it('does not prove the same epoch twice', async () => { + await proverNode.handleClaim(claim); + await proverNode.handleClaim(claim); - await proverNode.work(); - await proverNode.work(); - await proverNode.work(); - await proverNode.work(); + expect(jobs.length).toEqual(1); + }); - expect(jobs.length).toEqual(3); - expect(jobs[0].job.run).toHaveBeenCalledWith(4, 4); - expect(jobs[1].job.run).toHaveBeenCalledWith(5, 5); - expect(jobs[2].job.run).toHaveBeenCalledWith(6, 6); + it('sends a quote on the initial sync if there is no claim', async () => { + await proverNode.handleInitialEpochSync(10n); - expect(proverNode.getJobs().length).toEqual(3); + expect(coordination.addEpochProofQuote).toHaveBeenCalledTimes(1); + }); - // Clean up the first job - await jobs[0].cleanUp(jobs[0].job); - expect(proverNode.getJobs().length).toEqual(2); - expect(jobs[0].db.delete).toHaveBeenCalled(); + it('sends a quote on the initial sync if there is a claim for an older epoch', async () => { + const claim = { epochToProve: 9n, bondProvider: EthAddress.random() } as EpochProofClaim; + publisher.getProofClaim.mockResolvedValue(claim); + await proverNode.handleInitialEpochSync(10n); - // Request another job to run and ensure it gets pushed - await proverNode.work(); - expect(jobs.length).toEqual(4); - expect(jobs[3].job.run).toHaveBeenCalledWith(7, 7); - expect(proverNode.getJobs().length).toEqual(3); - expect(proverNode.getJobs().map(({ uuid }) => uuid)).toEqual(['1', '2', '3']); + expect(coordination.addEpochProofQuote).toHaveBeenCalledTimes(1); + }); + + it('does not send a quote on the initial sync if there is already a claim', async () => { + const claim = { epochToProve: 10n, bondProvider: EthAddress.random() } as EpochProofClaim; + publisher.getProofClaim.mockResolvedValue(claim); + await proverNode.handleInitialEpochSync(10n); + + expect(coordination.addEpochProofQuote).not.toHaveBeenCalled(); + }); + + it('starts proving if there is a claim sent by us', async () => { + publisher.getProofClaim.mockResolvedValue(claim); + l2BlockSource.getProvenL2EpochNumber.mockResolvedValue(9); + await proverNode.handleInitialEpochSync(10n); + + expect(jobs[0].epochNumber).toEqual(10n); + }); + + it('does not start proving if there is a claim sent by us but proof has already landed', async () => { + publisher.getProofClaim.mockResolvedValue(claim); + l2BlockSource.getProvenL2EpochNumber.mockResolvedValue(10); + await proverNode.handleInitialEpochSync(10n); + + expect(jobs.length).toEqual(0); + }); }); - it('moves forward when proving fails', async () => { - setBlockNumbers(10, 3); + describe('with actual monitors', () => { + let claimsMonitor: ClaimsMonitor; + let epochMonitor: EpochMonitor; + + // Answers l2BlockSource.isEpochComplete, queried from the epoch monitor + let lastEpochComplete: bigint = 0n; + + beforeEach(() => { + claimsMonitor = new ClaimsMonitor(publisher, config); + epochMonitor = new EpochMonitor(l2BlockSource, config); + + l2BlockSource.isEpochComplete.mockImplementation(epochNumber => + Promise.resolve(epochNumber <= lastEpochComplete), + ); + + proverNode = new TestProverNode( + prover, + publisher, + l2BlockSource, + l1ToL2MessageSource, + contractDataSource, + worldState, + coordination, + simulator, + quoteProvider, + quoteSigner, + claimsMonitor, + epochMonitor, + telemetryClient, + config, + ); + }); + + it('sends a quote on initial sync', async () => { + l2BlockSource.getL2EpochNumber.mockResolvedValue(10n); + + await proverNode.start(); + await sleep(100); + expect(coordination.addEpochProofQuote).toHaveBeenCalledTimes(1); + }); + + it('sends another quote when a new epoch is completed', async () => { + lastEpochComplete = 10n; + l2BlockSource.getL2EpochNumber.mockResolvedValue(11n); + + await proverNode.start(); + await sleep(100); + + lastEpochComplete = 11n; + await sleep(100); + + expect(coordination.addEpochProofQuote).toHaveBeenCalledTimes(2); + expect(coordination.addEpochProofQuote).toHaveBeenCalledWith(toExpectedQuote(10n)); + expect(coordination.addEpochProofQuote).toHaveBeenCalledWith(toExpectedQuote(11n)); + }); - // We trigger an error by setting world state past the block that the prover node will try proving - worldState.status.mockResolvedValue({ syncedToL2Block: 5, state: WorldStateRunningState.RUNNING }); + it('starts proving when a claim is seen', async () => { + publisher.getProofClaim.mockResolvedValue(claim); - // These two calls should return in failures - await proverNode.work(); - await proverNode.work(); - expect(jobs.length).toEqual(0); + await proverNode.start(); + await sleep(100); - // But now the prover node should move forward - await proverNode.work(); - expect(jobs.length).toEqual(1); - expect(jobs[0].job.run).toHaveBeenCalledWith(6, 6); + expect(jobs[0].epochNumber).toEqual(10n); + }); }); class TestProverNode extends ProverNode { - protected override doCreateBlockProvingJob( + protected override doCreateEpochProvingJob( + epochNumber: bigint, + _blocks: L2Block[], db: MerkleTreeAdminOperations, _publicProcessorFactory: PublicProcessorFactory, - cleanUp: (job: BlockProvingJob) => Promise, - ): BlockProvingJob { - const job = mock({ getState: () => 'processing' }); + cleanUp: (job: EpochProvingJob) => Promise, + ): EpochProvingJob { + const job = mock({ getState: () => 'processing', run: () => Promise.resolve() }); job.getId.mockReturnValue(jobs.length.toString()); - jobs.push({ job, cleanUp, db }); + jobs.push({ epochNumber, job, cleanUp, db }); return job; } - public override work() { - return super.work(); + public override triggerMonitors() { + return super.triggerMonitors(); } } }); diff --git a/yarn-project/prover-node/src/prover-node.ts b/yarn-project/prover-node/src/prover-node.ts index 02b3a1b4448..31fb8a3829b 100644 --- a/yarn-project/prover-node/src/prover-node.ts +++ b/yarn-project/prover-node/src/prover-node.ts @@ -1,64 +1,149 @@ import { + type EpochProofClaim, + type EpochProofQuote, + EpochProofQuotePayload, + type EpochProverManager, type L1ToL2MessageSource, + type L2Block, type L2BlockSource, type MerkleTreeOperations, - type ProverClient, - type TxProvider, + type ProverCoordination, type WorldStateSynchronizer, } from '@aztec/circuit-types'; +import { compact } from '@aztec/foundation/collection'; import { createDebugLogger } from '@aztec/foundation/log'; -import { RunningPromise } from '@aztec/foundation/running-promise'; import { type L1Publisher } from '@aztec/sequencer-client'; import { PublicProcessorFactory, type SimulationProvider } from '@aztec/simulator'; import { type TelemetryClient } from '@aztec/telemetry-client'; import { type ContractDataSource } from '@aztec/types/contracts'; -import { BlockProvingJob, type BlockProvingJobState } from './job/block-proving-job.js'; +import { EpochProvingJob, type EpochProvingJobState } from './job/epoch-proving-job.js'; import { ProverNodeMetrics } from './metrics.js'; +import { type ClaimsMonitor, type ClaimsMonitorHandler } from './monitors/claims-monitor.js'; +import { type EpochMonitor, type EpochMonitorHandler } from './monitors/epoch-monitor.js'; +import { type QuoteProvider } from './quote-provider/index.js'; +import { type QuoteSigner } from './quote-signer.js'; + +export type ProverNodeOptions = { + pollingIntervalMs: number; + maxPendingJobs: number; +}; /** * An Aztec Prover Node is a standalone process that monitors the unfinalised chain on L1 for unproven blocks, - * fetches their txs from a tx source in the p2p network or an external node, re-executes their public functions, - * creates a rollup proof, and submits it to L1. + * submits bids for proving them, and monitors if they are accepted. If so, the prover node fetches the txs + * from a tx source in the p2p network or an external node, re-executes their public functions, creates a rollup + * proof for the epoch, and submits it to L1. */ -export class ProverNode { +export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler { private log = createDebugLogger('aztec:prover-node'); - private runningPromise: RunningPromise | undefined; - private latestBlockWeAreProving: number | undefined; - private jobs: Map = new Map(); - private options: { pollingIntervalMs: number; disableAutomaticProving: boolean; maxPendingJobs: number }; + + private latestEpochWeAreProving: bigint | undefined; + private jobs: Map = new Map(); + private options: ProverNodeOptions; private metrics: ProverNodeMetrics; constructor( - private prover: ProverClient, - private publisher: L1Publisher, - private l2BlockSource: L2BlockSource, - private l1ToL2MessageSource: L1ToL2MessageSource, - private contractDataSource: ContractDataSource, - private worldState: WorldStateSynchronizer, - private txProvider: TxProvider, - private simulator: SimulationProvider, - private telemetryClient: TelemetryClient, - options: { pollingIntervalMs?: number; disableAutomaticProving?: boolean; maxPendingJobs?: number } = {}, + private readonly prover: EpochProverManager, + private readonly publisher: L1Publisher, + private readonly l2BlockSource: L2BlockSource, + private readonly l1ToL2MessageSource: L1ToL2MessageSource, + private readonly contractDataSource: ContractDataSource, + private readonly worldState: WorldStateSynchronizer, + private readonly coordination: ProverCoordination, + private readonly simulator: SimulationProvider, + private readonly quoteProvider: QuoteProvider, + private readonly quoteSigner: QuoteSigner, + private readonly claimsMonitor: ClaimsMonitor, + private readonly epochsMonitor: EpochMonitor, + private readonly telemetryClient: TelemetryClient, + options: Partial = {}, ) { this.options = { pollingIntervalMs: 1_000, - disableAutomaticProving: false, maxPendingJobs: 100, - ...options, + ...compact(options), }; this.metrics = new ProverNodeMetrics(telemetryClient, 'ProverNode'); } + async ensureBond() { + // Ensure the prover has enough bond to submit proofs + // Can we just run this at the beginning and forget about it? + // Or do we need to check periodically? Or only when we get slashed? How do we know we got slashed? + } + + async handleClaim(proofClaim: EpochProofClaim): Promise { + if (proofClaim.epochToProve === this.latestEpochWeAreProving) { + this.log.verbose(`Already proving claim for epoch ${proofClaim.epochToProve}`); + return; + } + + try { + await this.startProof(proofClaim.epochToProve); + this.latestEpochWeAreProving = proofClaim.epochToProve; + } catch (err) { + this.log.error(`Error handling claim for epoch ${proofClaim.epochToProve}`, err); + } + } + + /** + * Handles the epoch number to prove when the prover node starts by checking if there + * is an existing claim for it. If not, it creates and sends a quote for it. + * @param epochNumber - The epoch immediately before the current one when the prover node starts. + */ + async handleInitialEpochSync(epochNumber: bigint): Promise { + try { + const claim = await this.publisher.getProofClaim(); + if (!claim || claim.epochToProve < epochNumber) { + await this.handleEpochCompleted(epochNumber); + } else if (claim && claim.bondProvider.equals(this.publisher.getSenderAddress())) { + const lastEpochProven = await this.l2BlockSource.getProvenL2EpochNumber(); + if (!lastEpochProven || lastEpochProven < claim.epochToProve) { + await this.handleClaim(claim); + } + } + } catch (err) { + this.log.error(`Error handling initial epoch sync`, err); + } + } + + /** + * Handles an epoch being completed by sending a quote for proving it. + * @param epochNumber - The epoch number that was just completed. + */ + async handleEpochCompleted(epochNumber: bigint): Promise { + try { + const blocks = await this.l2BlockSource.getBlocksForEpoch(epochNumber); + const partialQuote = await this.quoteProvider.getQuote(blocks); + if (!partialQuote) { + this.log.verbose(`No quote produced for epoch ${epochNumber}`); + return; + } + + const quote = EpochProofQuotePayload.from({ + ...partialQuote, + epochToProve: BigInt(epochNumber), + prover: this.publisher.getSenderAddress(), + validUntilSlot: partialQuote.validUntilSlot ?? BigInt(Number.MAX_SAFE_INTEGER), // Should we constrain this? + }); + const signed = await this.quoteSigner.sign(quote); + await this.sendEpochProofQuote(signed); + } catch (err) { + this.log.error(`Error handling epoch completed`, err); + } + } + /** * Starts the prover node so it periodically checks for unproven blocks in the unfinalised chain from L1 and proves them. * This may change once we implement a prover coordination mechanism. */ - start() { - this.runningPromise = new RunningPromise(this.work.bind(this), this.options.pollingIntervalMs); - this.runningPromise.start(); - this.log.info('Started ProverNode'); + async start() { + await this.ensureBond(); + this.epochsMonitor.start(this); + this.claimsMonitor.start(this); + this.log.info('Started ProverNode', this.options); } /** @@ -66,7 +151,8 @@ export class ProverNode { */ async stop() { this.log.info('Stopping ProverNode'); - await this.runningPromise?.stop(); + await this.epochsMonitor.stop(); + await this.claimsMonitor.stop(); await this.prover.stop(); await this.l2BlockSource.stop(); this.publisher.interrupt(); @@ -76,69 +162,27 @@ export class ProverNode { } /** - * Single iteration of recurring work. This method is called periodically by the running promise. - * Checks whether there are new blocks to prove, proves them, and submits them. + * Sends an epoch proof quote to the coordinator. */ - protected async work() { - try { - if (this.options.disableAutomaticProving) { - return; - } - - if (!this.checkMaximumPendingJobs()) { - this.log.debug(`Maximum pending proving jobs reached. Skipping work.`, { - maxPendingJobs: this.options.maxPendingJobs, - pendingJobs: this.jobs.size, - }); - return; - } - - const [latestBlockNumber, latestProvenBlockNumber] = await Promise.all([ - this.l2BlockSource.getBlockNumber(), - this.l2BlockSource.getProvenBlockNumber(), - ]); - - // Consider both the latest block we are proving and the last block proven on the chain - const latestBlockBeingProven = this.latestBlockWeAreProving ?? 0; - const latestProven = Math.max(latestBlockBeingProven, latestProvenBlockNumber); - if (latestProven >= latestBlockNumber) { - this.log.debug(`No new blocks to prove`, { - latestBlockNumber, - latestProvenBlockNumber, - latestBlockBeingProven, - }); - return; - } - - const fromBlock = latestProven + 1; - const toBlock = fromBlock; // We only prove one block at a time for now - - try { - await this.startProof(fromBlock, toBlock); - } finally { - // If we fail to create a proving job for the given block, skip it instead of getting stuck on it. - this.log.verbose(`Setting ${toBlock} as latest block we are proving`); - this.latestBlockWeAreProving = toBlock; - } - } catch (err) { - this.log.error(`Error in prover node work`, err); - } + public sendEpochProofQuote(quote: EpochProofQuote): Promise { + this.log.info(`Sending quote for epoch`, quote.toViemArgs().quote); + return this.coordination.addEpochProofQuote(quote); } /** * Creates a proof for a block range. Returns once the proof has been submitted to L1. */ - public async prove(fromBlock: number, toBlock: number) { - const job = await this.createProvingJob(fromBlock); - return job.run(fromBlock, toBlock); + public async prove(epochNumber: number | bigint) { + const job = await this.createProvingJob(BigInt(epochNumber)); + return job.run(); } /** * Starts a proving process and returns immediately. */ - public async startProof(fromBlock: number, toBlock: number) { - const job = await this.createProvingJob(fromBlock); - void job.run(fromBlock, toBlock); + public async startProof(epochNumber: number | bigint) { + const job = await this.createProvingJob(BigInt(epochNumber)); + void job.run().catch(err => this.log.error(`Error proving epoch ${epochNumber}`, err)); } /** @@ -151,7 +195,7 @@ export class ProverNode { /** * Returns an array of jobs being processed. */ - public getJobs(): { uuid: string; status: BlockProvingJobState }[] { + public getJobs(): { uuid: string; status: EpochProvingJobState }[] { return Array.from(this.jobs.entries()).map(([uuid, job]) => ({ uuid, status: job.getState() })); } @@ -160,17 +204,25 @@ export class ProverNode { return maxPendingJobs === 0 || this.jobs.size < maxPendingJobs; } - private async createProvingJob(fromBlock: number) { + private async createProvingJob(epochNumber: bigint) { if (!this.checkMaximumPendingJobs()) { throw new Error(`Maximum pending proving jobs ${this.options.maxPendingJobs} reached. Cannot create new job.`); } + // Gather blocks for this epoch + const blocks = await this.l2BlockSource.getBlocksForEpoch(epochNumber); + if (blocks.length === 0) { + throw new Error(`No blocks found for epoch ${epochNumber}`); + } + const fromBlock = blocks[0].number; + const toBlock = blocks.at(-1)!.number; + if ((await this.worldState.status()).syncedToL2Block >= fromBlock) { throw new Error(`Cannot create proving job for block ${fromBlock} as it is behind the current world state`); } // Fast forward world state to right before the target block and get a fork - this.log.verbose(`Creating proving job for block ${fromBlock}`); + this.log.verbose(`Creating proving job for epoch ${epochNumber} for block range ${fromBlock} to ${toBlock}`); const db = await this.worldState.syncImmediateAndFork(fromBlock - 1, true); // Create a processor using the forked world state @@ -186,26 +238,36 @@ export class ProverNode { this.jobs.delete(job.getId()); }; - const job = this.doCreateBlockProvingJob(db, publicProcessorFactory, cleanUp); + const job = this.doCreateEpochProvingJob(epochNumber, blocks, db, publicProcessorFactory, cleanUp); this.jobs.set(job.getId(), job); return job; } /** Extracted for testing purposes. */ - protected doCreateBlockProvingJob( + protected doCreateEpochProvingJob( + epochNumber: bigint, + blocks: L2Block[], db: MerkleTreeOperations, publicProcessorFactory: PublicProcessorFactory, cleanUp: () => Promise, ) { - return new BlockProvingJob( - this.prover.createBlockProver(db), + return new EpochProvingJob( + epochNumber, + blocks, + this.prover.createEpochProver(db), publicProcessorFactory, this.publisher, this.l2BlockSource, this.l1ToL2MessageSource, - this.txProvider, + this.coordination, this.metrics, cleanUp, ); } + + /** Extracted for testing purposes. */ + protected async triggerMonitors() { + await this.epochsMonitor.work(); + await this.claimsMonitor.work(); + } } diff --git a/yarn-project/prover-node/src/quote-provider/http.ts b/yarn-project/prover-node/src/quote-provider/http.ts new file mode 100644 index 00000000000..b5ada13cbb9 --- /dev/null +++ b/yarn-project/prover-node/src/quote-provider/http.ts @@ -0,0 +1,2 @@ +// TODO: Implement me! This should send a request to a configurable URL to get the quote. +export class HttpQuoteProvider {} diff --git a/yarn-project/prover-node/src/quote-provider/index.ts b/yarn-project/prover-node/src/quote-provider/index.ts new file mode 100644 index 00000000000..770833cb280 --- /dev/null +++ b/yarn-project/prover-node/src/quote-provider/index.ts @@ -0,0 +1,8 @@ +import { type EpochProofQuotePayload, type L2Block } from '@aztec/circuit-types'; + +type QuoteProviderResult = Pick & + Partial>; + +export interface QuoteProvider { + getQuote(epoch: L2Block[]): Promise; +} diff --git a/yarn-project/prover-node/src/quote-provider/simple.ts b/yarn-project/prover-node/src/quote-provider/simple.ts new file mode 100644 index 00000000000..c2eff3fc5c0 --- /dev/null +++ b/yarn-project/prover-node/src/quote-provider/simple.ts @@ -0,0 +1,12 @@ +import { type EpochProofQuotePayload, type L2Block } from '@aztec/circuit-types'; + +import { type QuoteProvider } from './index.js'; + +export class SimpleQuoteProvider implements QuoteProvider { + constructor(public readonly basisPointFee: number, public readonly bondAmount: bigint) {} + + getQuote(_epoch: L2Block[]): Promise> { + const { basisPointFee, bondAmount } = this; + return Promise.resolve({ basisPointFee, bondAmount }); + } +} diff --git a/yarn-project/prover-node/src/quote-provider/utils.ts b/yarn-project/prover-node/src/quote-provider/utils.ts new file mode 100644 index 00000000000..253480476c1 --- /dev/null +++ b/yarn-project/prover-node/src/quote-provider/utils.ts @@ -0,0 +1,10 @@ +import { type L2Block } from '@aztec/circuit-types'; +import { Fr } from '@aztec/circuits.js'; + +export function getTotalFees(epoch: L2Block[]) { + return epoch.reduce((total, block) => total.add(block.header.totalFees), Fr.ZERO).toBigInt(); +} + +export function getTxCount(epoch: L2Block[]) { + return epoch.reduce((total, block) => total + block.body.txEffects.length, 0); +} diff --git a/yarn-project/prover-node/src/quote-signer.ts b/yarn-project/prover-node/src/quote-signer.ts new file mode 100644 index 00000000000..0c2f4bd9c4e --- /dev/null +++ b/yarn-project/prover-node/src/quote-signer.ts @@ -0,0 +1,24 @@ +import { EpochProofQuote, type EpochProofQuotePayload } from '@aztec/circuit-types'; +import { Buffer32 } from '@aztec/foundation/buffer'; +import { Secp256k1Signer } from '@aztec/foundation/crypto'; +import { type RollupAbi } from '@aztec/l1-artifacts'; + +import { type GetContractReturnType, type PublicClient } from 'viem'; + +export class QuoteSigner { + constructor( + private readonly signer: Secp256k1Signer, + private readonly quoteToDigest: (payload: EpochProofQuotePayload) => Promise, + ) {} + + static new(privateKey: Buffer32, rollupContract: GetContractReturnType): QuoteSigner { + const quoteToDigest = (payload: EpochProofQuotePayload) => + rollupContract.read.quoteToDigest([payload.toViemArgs()]).then(Buffer32.fromString); + return new QuoteSigner(new Secp256k1Signer(privateKey), quoteToDigest); + } + + public async sign(payload: EpochProofQuotePayload) { + const digest = await this.quoteToDigest(payload); + return EpochProofQuote.new(digest, payload, this.signer); + } +} diff --git a/yarn-project/prover-node/src/tx-provider/aztec-node-tx-provider.ts b/yarn-project/prover-node/src/tx-provider/aztec-node-tx-provider.ts deleted file mode 100644 index 90797602453..00000000000 --- a/yarn-project/prover-node/src/tx-provider/aztec-node-tx-provider.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { type AztecNode, type Tx, type TxHash, type TxProvider } from '@aztec/circuit-types'; - -/** Implements TxProvider by querying an Aztec node for the txs. */ -export class AztecNodeTxProvider implements TxProvider { - constructor(private node: AztecNode) {} - - getTxByHash(txHash: TxHash): Promise { - return this.node.getTxByHash(txHash); - } -} diff --git a/yarn-project/prover-node/src/tx-provider/config.ts b/yarn-project/prover-node/src/tx-provider/config.ts deleted file mode 100644 index 5fc9ed9465d..00000000000 --- a/yarn-project/prover-node/src/tx-provider/config.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { type ConfigMappingsType, getConfigFromMappings } from '@aztec/foundation/config'; - -export type TxProviderConfig = { - txProviderNodeUrl: string | undefined; -}; - -export const txProviderConfigMappings: ConfigMappingsType = { - txProviderNodeUrl: { - env: 'TX_PROVIDER_NODE_URL', - description: 'The URL of the tx provider node', - parseEnv: (val: string) => val, - }, -}; - -export function getTxProviderConfigFromEnv(): TxProviderConfig { - return getConfigFromMappings(txProviderConfigMappings); -} diff --git a/yarn-project/prover-node/src/tx-provider/factory.ts b/yarn-project/prover-node/src/tx-provider/factory.ts deleted file mode 100644 index e17d13e00c0..00000000000 --- a/yarn-project/prover-node/src/tx-provider/factory.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { type TxProvider, createAztecNodeClient } from '@aztec/circuit-types'; - -import { AztecNodeTxProvider } from './aztec-node-tx-provider.js'; -import { type TxProviderConfig } from './config.js'; - -export function createTxProvider(config: TxProviderConfig): TxProvider { - if (config.txProviderNodeUrl) { - const node = createAztecNodeClient(config.txProviderNodeUrl); - return new AztecNodeTxProvider(node); - } else { - throw new Error(`Aztec Node URL for Tx Provider is not set.`); - } -} diff --git a/yarn-project/prover-node/tsconfig.json b/yarn-project/prover-node/tsconfig.json index ed7c2e5772e..b5e774e1b8a 100644 --- a/yarn-project/prover-node/tsconfig.json +++ b/yarn-project/prover-node/tsconfig.json @@ -15,12 +15,18 @@ { "path": "../circuits.js" }, + { + "path": "../ethereum" + }, { "path": "../foundation" }, { "path": "../kv-store" }, + { + "path": "../l1-artifacts" + }, { "path": "../prover-client" }, diff --git a/yarn-project/deploy_npm.sh b/yarn-project/publish_npm.sh old mode 100755 new mode 100644 similarity index 93% rename from yarn-project/deploy_npm.sh rename to yarn-project/publish_npm.sh index 4ed483405e0..fed0810063b --- a/yarn-project/deploy_npm.sh +++ b/yarn-project/publish_npm.sh @@ -2,26 +2,28 @@ [ -n "${BUILD_SYSTEM_DEBUG:-}" ] && set -x # conditionally trace set -eu -if [ -z "$COMMIT_TAG" ]; then - echo "No commit tag, not deploying to npm." - exit 0 -fi - -retry ecr_login -extract_repo yarn-project /usr/src project -cd project/src/yarn-project - echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >.npmrc +echo "Current directory: $(pwd)" +echo "Contents of .npmrc:" +cat .npmrc + # This is to be used with the 'canary' tag for testing, and then 'latest' for making it public DIST_TAG=${1:-"latest"} +VERSION=$2 + +DRY_DEPLOY=${DRY_DEPLOY:-0} + +if [ -z "$VERSION" ]; then + echo "No version provided, exiting." + exit 1 +fi function deploy_package() { REPOSITORY=$1 cd $REPOSITORY PACKAGE_NAME=$(jq -r '.name' package.json) - VERSION=$(extract_tag_version $REPOSITORY false) echo "Deploying $REPOSITORY $VERSION $DIST_TAG" # If the commit tag itself has a dist-tag (e.g. v2.1.0-testnet.123), extract the dist-tag. diff --git a/yarn-project/pxe/src/database/kv_pxe_database.ts b/yarn-project/pxe/src/database/kv_pxe_database.ts index 1b56b227168..cac62d05cfa 100644 --- a/yarn-project/pxe/src/database/kv_pxe_database.ts +++ b/yarn-project/pxe/src/database/kv_pxe_database.ts @@ -495,7 +495,9 @@ export class KVPxeDatabase implements PxeDatabase { return true; } - addCompleteAddress(completeAddress: CompleteAddress): Promise { + async addCompleteAddress(completeAddress: CompleteAddress): Promise { + await this.#addScope(completeAddress.address); + return this.#db.transaction(() => { const addressString = completeAddress.address.toString(); const buffer = completeAddress.toBuffer(); diff --git a/yarn-project/pxe/src/kernel_prover/hints/build_private_kernel_reset_hints.ts b/yarn-project/pxe/src/kernel_prover/hints/build_private_kernel_reset_hints.ts deleted file mode 100644 index 03123a74abf..00000000000 --- a/yarn-project/pxe/src/kernel_prover/hints/build_private_kernel_reset_hints.ts +++ /dev/null @@ -1,249 +0,0 @@ -import { - type Fr, - KeyValidationHint, - MAX_KEY_VALIDATION_REQUESTS_PER_TX, - MAX_NOTE_HASHES_PER_TX, - MAX_NOTE_HASH_READ_REQUESTS_PER_TX, - MAX_NULLIFIERS_PER_TX, - MAX_NULLIFIER_READ_REQUESTS_PER_TX, - MembershipWitness, - NULLIFIER_TREE_HEIGHT, - PRIVATE_RESET_VARIANTS, - type PrivateKernelData, - PrivateKernelResetCircuitPrivateInputs, - type PrivateKernelResetCircuitPrivateInputsVariants, - PrivateKernelResetHints, - type ReadRequest, - type ScopedKeyValidationRequestAndGenerator, - ScopedNoteHash, - ScopedNullifier, - ScopedReadRequest, - buildNoteHashReadRequestHints, - buildNullifierReadRequestHints, - buildTransientDataHints, - countAccumulatedItems, - getNonEmptyItems, -} from '@aztec/circuits.js'; -import { makeTuple } from '@aztec/foundation/array'; -import { type Tuple } from '@aztec/foundation/serialize'; -import type { ExecutionResult } from '@aztec/simulator'; - -import { type ProvingDataOracle } from '../proving_data_oracle.js'; - -function getNullifierReadRequestHints( - nullifierReadRequests: Tuple, - nullifiers: Tuple, - oracle: ProvingDataOracle, - sizePending: PENDING, - sizeSettled: SETTLED, - futureNullifiers: ScopedNullifier[], -) { - const getNullifierMembershipWitness = async (nullifier: Fr) => { - const res = await oracle.getNullifierMembershipWitness(nullifier); - if (!res) { - throw new Error(`Cannot find the leaf for nullifier ${nullifier.toBigInt()}.`); - } - - const { index, siblingPath, leafPreimage } = res; - return { - membershipWitness: new MembershipWitness(NULLIFIER_TREE_HEIGHT, index, siblingPath.toTuple()), - leafPreimage, - }; - }; - - return buildNullifierReadRequestHints( - { getNullifierMembershipWitness }, - nullifierReadRequests, - nullifiers, - sizePending, - sizeSettled, - futureNullifiers, - ); -} - -async function getMasterSecretKeysAndAppKeyGenerators( - keyValidationRequests: Tuple, - oracle: ProvingDataOracle, -) { - const keysHints = makeTuple(MAX_KEY_VALIDATION_REQUESTS_PER_TX, () => - KeyValidationHint.nada(MAX_KEY_VALIDATION_REQUESTS_PER_TX), - ); - - let keyIndex = 0; - for (let i = 0; i < keyValidationRequests.length; ++i) { - const request = keyValidationRequests[i].request; - if (request.isEmpty()) { - break; - } - const secretKeys = await oracle.getMasterSecretKey(request.request.pkM); - keysHints[keyIndex] = new KeyValidationHint(secretKeys, i); - keyIndex++; - } - return { - keysCount: keyIndex, - keysHints, - }; -} - -export async function buildPrivateKernelResetInputs( - executionStack: ExecutionResult[], - previousKernelData: PrivateKernelData, - noteHashLeafIndexMap: Map, - noteHashNullifierCounterMap: Map, - validationRequestsSplitCounter: number, - shouldSilo: boolean, - oracle: ProvingDataOracle, -) { - const publicInputs = previousKernelData.publicInputs; - // Use max sizes, they will be trimmed down later. - - const futureNoteHashes = collectNested(executionStack, executionResult => { - const nonEmptyNoteHashes = getNonEmptyItems(executionResult.callStackItem.publicInputs.noteHashes); - return nonEmptyNoteHashes.map( - noteHash => - new ScopedNoteHash(noteHash, executionResult.callStackItem.publicInputs.callContext.storageContractAddress), - ); - }); - - const { - numPendingReadHints: noteHashPendingReadHints, - numSettledReadHints: noteHashSettledReadHints, - hints: noteHashReadRequestHints, - } = await buildNoteHashReadRequestHints( - oracle, - publicInputs.validationRequests.noteHashReadRequests, - publicInputs.end.noteHashes, - noteHashLeafIndexMap, - MAX_NOTE_HASH_READ_REQUESTS_PER_TX, - MAX_NOTE_HASH_READ_REQUESTS_PER_TX, - futureNoteHashes, - ); - - const futureNullifiers = collectNested(executionStack, executionResult => { - const nonEmptyNullifiers = getNonEmptyItems(executionResult.callStackItem.publicInputs.nullifiers); - return nonEmptyNullifiers.map( - nullifier => - new ScopedNullifier(nullifier, executionResult.callStackItem.publicInputs.callContext.storageContractAddress), - ); - }); - - const { - numPendingReadHints: nullifierPendingReadHints, - numSettledReadHints: nullifierSettledReadHints, - hints: nullifierReadRequestHints, - } = await getNullifierReadRequestHints( - publicInputs.validationRequests.nullifierReadRequests, - publicInputs.end.nullifiers, - oracle, - MAX_NULLIFIER_READ_REQUESTS_PER_TX, - MAX_NULLIFIER_READ_REQUESTS_PER_TX, - futureNullifiers, - ); - - const { keysCount, keysHints } = await getMasterSecretKeysAndAppKeyGenerators( - publicInputs.validationRequests.scopedKeyValidationRequestsAndGenerators, - oracle, - ); - - const futureNoteHashReads = collectNestedReadRequests( - executionStack, - executionResult => executionResult.callStackItem.publicInputs.noteHashReadRequests, - ); - const futureNullifierReads = collectNestedReadRequests( - executionStack, - executionResult => executionResult.callStackItem.publicInputs.nullifierReadRequests, - ); - - const noteHashes = publicInputs.end.noteHashes; - const nullifiers = publicInputs.end.nullifiers; - const { numTransientData, hints: transientDataIndexHints } = buildTransientDataHints( - noteHashes, - nullifiers, - futureNoteHashReads, - futureNullifierReads, - noteHashNullifierCounterMap, - MAX_NOTE_HASHES_PER_TX, - MAX_NULLIFIERS_PER_TX, - ); - - const remainingNoteHashes = countAccumulatedItems(noteHashes) - numTransientData; - - const remainingNullifiers = countAccumulatedItems(nullifiers) - numTransientData; - - const numEncryptedLogHashes = countAccumulatedItems(publicInputs.end.encryptedLogsHashes); - - let privateInputs; - - for (const [sizeTag, hintSizes] of Object.entries(PRIVATE_RESET_VARIANTS)) { - const noSiloing = - !hintSizes.NOTE_HASH_SILOING_AMOUNT && - !hintSizes.NULLIFIER_SILOING_AMOUNT && - !hintSizes.ENCRYPTED_LOG_SILOING_AMOUNT; - const enoughSiloing = - hintSizes.NOTE_HASH_SILOING_AMOUNT >= remainingNoteHashes && - hintSizes.NULLIFIER_SILOING_AMOUNT >= remainingNullifiers && - hintSizes.ENCRYPTED_LOG_SILOING_AMOUNT >= numEncryptedLogHashes; - if ( - hintSizes.NOTE_HASH_PENDING_AMOUNT >= noteHashPendingReadHints && - hintSizes.NOTE_HASH_SETTLED_AMOUNT >= noteHashSettledReadHints && - hintSizes.NULLIFIER_PENDING_AMOUNT >= nullifierPendingReadHints && - hintSizes.NULLIFIER_SETTLED_AMOUNT >= nullifierSettledReadHints && - hintSizes.NULLIFIER_KEYS >= keysCount && - hintSizes.TRANSIENT_DATA_AMOUNT >= numTransientData && - ((!shouldSilo && noSiloing) || (shouldSilo && enoughSiloing)) - ) { - privateInputs = new PrivateKernelResetCircuitPrivateInputs( - previousKernelData, - new PrivateKernelResetHints( - noteHashReadRequestHints, - nullifierReadRequestHints, - keysHints, - transientDataIndexHints, - validationRequestsSplitCounter, - ).trimToSizes( - hintSizes.NOTE_HASH_PENDING_AMOUNT, - hintSizes.NOTE_HASH_SETTLED_AMOUNT, - hintSizes.NULLIFIER_PENDING_AMOUNT, - hintSizes.NULLIFIER_SETTLED_AMOUNT, - hintSizes.NULLIFIER_KEYS, - hintSizes.TRANSIENT_DATA_AMOUNT, - ), - sizeTag, - ); - break; - } - } - - if (!privateInputs) { - throw new Error('No private inputs found for the given hint sizes.'); - } - - return privateInputs as PrivateKernelResetCircuitPrivateInputsVariants; -} - -function collectNested( - executionStack: ExecutionResult[], - extractExecutionItems: (execution: ExecutionResult) => T[], -): T[] { - const thisExecutionReads = executionStack.flatMap(extractExecutionItems); - - return thisExecutionReads.concat( - executionStack.flatMap(({ nestedExecutions }) => collectNested(nestedExecutions, extractExecutionItems)), - ); -} - -function collectNestedReadRequests( - executionStack: ExecutionResult[], - extractReadRequests: (execution: ExecutionResult) => ReadRequest[], -): ScopedReadRequest[] { - return collectNested(executionStack, executionResult => { - const nonEmptyReadRequests = getNonEmptyItems(extractReadRequests(executionResult)); - return nonEmptyReadRequests.map( - readRequest => - new ScopedReadRequest( - readRequest, - executionResult.callStackItem.publicInputs.callContext.storageContractAddress, - ), - ); - }); -} diff --git a/yarn-project/pxe/src/kernel_prover/hints/build_private_kernel_reset_private_inputs.ts b/yarn-project/pxe/src/kernel_prover/hints/build_private_kernel_reset_private_inputs.ts new file mode 100644 index 00000000000..d2bb245af55 --- /dev/null +++ b/yarn-project/pxe/src/kernel_prover/hints/build_private_kernel_reset_private_inputs.ts @@ -0,0 +1,468 @@ +import { type PrivateKernelSimulateOutput } from '@aztec/circuit-types'; +import { + type Fr, + KeyValidationHint, + MAX_KEY_VALIDATION_REQUESTS_PER_TX, + MAX_NOTE_HASHES_PER_TX, + MAX_NOTE_HASH_READ_REQUESTS_PER_TX, + MAX_NULLIFIERS_PER_TX, + MAX_NULLIFIER_READ_REQUESTS_PER_TX, + MembershipWitness, + NULLIFIER_TREE_HEIGHT, + type PrivateCircuitPublicInputs, + type PrivateKernelCircuitPublicInputs, + PrivateKernelData, + PrivateKernelResetCircuitPrivateInputs, + PrivateKernelResetDimensions, + PrivateKernelResetHints, + type ReadRequest, + ReadRequestResetStates, + ReadRequestState, + type ScopedKeyValidationRequestAndGenerator, + ScopedNoteHash, + ScopedNullifier, + ScopedReadRequest, + TransientDataIndexHint, + VK_TREE_HEIGHT, + buildNoteHashReadRequestHintsFromResetStates, + buildNullifierReadRequestHintsFromResetStates, + buildTransientDataHints, + countAccumulatedItems, + findPrivateKernelResetDimensions, + getNonEmptyItems, + getNoteHashReadRequestResetStates, + getNullifierReadRequestResetStates, + privateKernelResetDimensionNames, +} from '@aztec/circuits.js'; +import { makeTuple } from '@aztec/foundation/array'; +import { padArrayEnd } from '@aztec/foundation/collection'; +import { type Tuple, assertLength } from '@aztec/foundation/serialize'; +import { privateKernelResetDimensionsConfig } from '@aztec/noir-protocol-circuits-types'; +import { type ExecutionResult, collectNested } from '@aztec/simulator'; + +import { type ProvingDataOracle } from '../proving_data_oracle.js'; + +function collectNestedReadRequests( + executionStack: ExecutionResult[], + extractReadRequests: (execution: ExecutionResult) => ReadRequest[], +): ScopedReadRequest[] { + return collectNested(executionStack, executionResult => { + const nonEmptyReadRequests = getNonEmptyItems(extractReadRequests(executionResult)); + return nonEmptyReadRequests.map( + readRequest => + new ScopedReadRequest( + readRequest, + executionResult.callStackItem.publicInputs.callContext.storageContractAddress, + ), + ); + }); +} + +function getNullifierMembershipWitnessResolver(oracle: ProvingDataOracle) { + return async (nullifier: Fr) => { + const res = await oracle.getNullifierMembershipWitness(nullifier); + if (!res) { + throw new Error(`Cannot find the leaf for nullifier ${nullifier.toBigInt()}.`); + } + + const { index, siblingPath, leafPreimage } = res; + return { + membershipWitness: new MembershipWitness(NULLIFIER_TREE_HEIGHT, index, siblingPath.toTuple()), + leafPreimage, + }; + }; +} + +async function getMasterSecretKeysAndAppKeyGenerators( + keyValidationRequests: Tuple, + oracle: ProvingDataOracle, +) { + const keysHints = []; + for (let i = 0; i < keyValidationRequests.length; ++i) { + const request = keyValidationRequests[i].request; + if (request.isEmpty()) { + break; + } + const secretKeys = await oracle.getMasterSecretKey(request.request.pkM); + keysHints.push(new KeyValidationHint(secretKeys, i)); + } + return padArrayEnd( + keysHints, + KeyValidationHint.nada(MAX_KEY_VALIDATION_REQUESTS_PER_TX), + MAX_KEY_VALIDATION_REQUESTS_PER_TX, + ); +} + +export class PrivateKernelResetPrivateInputsBuilder { + private previousKernel: PrivateKernelCircuitPublicInputs; + // If there's no next iteration, it's the final reset. + private nextIteration?: PrivateCircuitPublicInputs; + + private noteHashResetStates: ReadRequestResetStates; + private nullifierResetStates: ReadRequestResetStates; + private numTransientData?: number; + private transientDataIndexHints: Tuple; + private requestedDimensions: PrivateKernelResetDimensions; + + constructor( + private previousKernelOutput: PrivateKernelSimulateOutput, + private executionStack: ExecutionResult[], + private noteHashNullifierCounterMap: Map, + private validationRequestsSplitCounter: number, + ) { + this.previousKernel = previousKernelOutput.publicInputs; + this.requestedDimensions = PrivateKernelResetDimensions.empty(); + this.noteHashResetStates = ReadRequestResetStates.empty(MAX_NOTE_HASH_READ_REQUESTS_PER_TX); + this.nullifierResetStates = ReadRequestResetStates.empty(MAX_NULLIFIER_READ_REQUESTS_PER_TX); + this.transientDataIndexHints = makeTuple( + MAX_NULLIFIERS_PER_TX, + () => new TransientDataIndexHint(MAX_NULLIFIERS_PER_TX, MAX_NOTE_HASHES_PER_TX), + ); + this.nextIteration = executionStack[this.executionStack.length - 1]?.callStackItem.publicInputs; + } + + needsReset(): boolean { + const fns: (() => boolean)[] = [ + () => this.needsResetNoteHashReadRequests(), + () => this.needsResetNullifierReadRequests(), + () => this.needsResetNullifierKeys(), + () => this.needsResetTransientData(), + ]; + + if (this.nextIteration) { + // If there's a next iteration, reset is needed only when data of a dimension is about to overflow. + // fns are executed until a dimension that needs reset is found. + return fns.some(fn => fn()); + } else { + // Siloing is only needed after processing all iterations. + fns.push( + ...[() => this.needsSiloNoteHashes(), () => this.needsSiloNullifiers(), () => this.needsSiloLogHashes()], + ); + // If there's no next iteration, reset is needed when any of the dimension has non empty data. + // All the fns should to be executed so that data in all dimensions will be reset. + const result = fns.map(fn => fn()); + return result.some(r => r); + } + } + + async build(oracle: ProvingDataOracle, noteHashLeafIndexMap: Map) { + if (privateKernelResetDimensionNames.every(name => !this.requestedDimensions[name])) { + throw new Error('Reset is not required.'); + } + + const isInner = !!this.nextIteration; + + // "final" reset must be done at most once. + // Because the code that silo note hashes can't be run repeatedly. + // The dimensions found must be big enough to reset all values, i.e. empty remainder. + const allowRemainder = isInner; + + const dimensions = findPrivateKernelResetDimensions( + this.requestedDimensions, + privateKernelResetDimensionsConfig, + isInner, + allowRemainder, + ); + + const previousVkMembershipWitness = await oracle.getVkMembershipWitness(this.previousKernelOutput.verificationKey); + const previousKernelData = new PrivateKernelData( + this.previousKernelOutput.publicInputs, + this.previousKernelOutput.verificationKey, + Number(previousVkMembershipWitness.leafIndex), + assertLength(previousVkMembershipWitness.siblingPath, VK_TREE_HEIGHT), + ); + + this.reduceReadRequestStates( + this.noteHashResetStates, + dimensions.NOTE_HASH_PENDING_AMOUNT, + dimensions.NOTE_HASH_SETTLED_AMOUNT, + ); + this.reduceReadRequestStates( + this.nullifierResetStates, + dimensions.NULLIFIER_PENDING_AMOUNT, + dimensions.NULLIFIER_SETTLED_AMOUNT, + ); + + return new PrivateKernelResetCircuitPrivateInputs( + previousKernelData, + new PrivateKernelResetHints( + await buildNoteHashReadRequestHintsFromResetStates( + oracle, + this.previousKernel.validationRequests.noteHashReadRequests, + this.previousKernel.end.noteHashes, + this.noteHashResetStates, + noteHashLeafIndexMap, + ), + await buildNullifierReadRequestHintsFromResetStates( + { getNullifierMembershipWitness: getNullifierMembershipWitnessResolver(oracle) }, + this.previousKernel.validationRequests.nullifierReadRequests, + this.nullifierResetStates, + ), + await getMasterSecretKeysAndAppKeyGenerators( + this.previousKernel.validationRequests.scopedKeyValidationRequestsAndGenerators, + oracle, + ), + this.transientDataIndexHints, + this.validationRequestsSplitCounter, + ), + dimensions, + ); + } + + private reduceReadRequestStates( + resetStates: ReadRequestResetStates, + maxPending: number, + maxSettled: number, + ) { + let numPending = 0; + let numSettled = 0; + for (let i = 0; i < resetStates.states.length; i++) { + const state = resetStates.states[i]; + if (state === ReadRequestState.PENDING) { + if (numPending < maxPending) { + numPending++; + } else { + resetStates.states[i] = ReadRequestState.NADA; + } + } else if (state === ReadRequestState.SETTLED) { + if (numSettled < maxSettled) { + numSettled++; + } else { + resetStates.states[i] = ReadRequestState.NADA; + } + } + } + + resetStates.pendingReadHints = resetStates.pendingReadHints.slice(0, maxPending); + } + + private needsResetNoteHashReadRequests(forceResetAll = false) { + const numCurr = countAccumulatedItems(this.previousKernel.validationRequests.noteHashReadRequests); + const numNext = this.nextIteration ? countAccumulatedItems(this.nextIteration.noteHashReadRequests) : 0; + const maxAmountToKeep = !this.nextIteration || forceResetAll ? 0 : MAX_NOTE_HASH_READ_REQUESTS_PER_TX; + if (numCurr + numNext <= maxAmountToKeep) { + return false; + } + + const futureNoteHashes = collectNested(this.executionStack, executionResult => { + const nonEmptyNoteHashes = getNonEmptyItems(executionResult.callStackItem.publicInputs.noteHashes); + return nonEmptyNoteHashes.map( + noteHash => + new ScopedNoteHash(noteHash, executionResult.callStackItem.publicInputs.callContext.storageContractAddress), + ); + }); + + const resetStates = getNoteHashReadRequestResetStates( + this.previousKernel.validationRequests.noteHashReadRequests, + this.previousKernel.end.noteHashes, + futureNoteHashes, + ); + + const numPendingReads = resetStates.pendingReadHints.length; + const numSettledReads = resetStates.states.reduce( + (accum, state) => accum + (state === ReadRequestState.SETTLED ? 1 : 0), + 0, + ); + + if (!this.nextIteration) { + this.noteHashResetStates = resetStates; + this.requestedDimensions.NOTE_HASH_PENDING_AMOUNT = numPendingReads; + this.requestedDimensions.NOTE_HASH_SETTLED_AMOUNT = numSettledReads; + } else { + // Pick only one dimension to reset if next iteration is not empty. + if (numPendingReads > numSettledReads) { + this.requestedDimensions.NOTE_HASH_PENDING_AMOUNT = numPendingReads; + this.noteHashResetStates.states = assertLength( + resetStates.states.map(state => (state === ReadRequestState.PENDING ? state : ReadRequestState.NADA)), + MAX_NOTE_HASH_READ_REQUESTS_PER_TX, + ); + this.noteHashResetStates.pendingReadHints = resetStates.pendingReadHints; + } else { + this.requestedDimensions.NOTE_HASH_SETTLED_AMOUNT = numSettledReads; + this.noteHashResetStates.states = assertLength( + resetStates.states.map(state => (state === ReadRequestState.SETTLED ? state : ReadRequestState.NADA)), + MAX_NOTE_HASH_READ_REQUESTS_PER_TX, + ); + } + } + + return true; + } + + private needsResetNullifierReadRequests(forceResetAll = false) { + const numCurr = countAccumulatedItems(this.previousKernel.validationRequests.nullifierReadRequests); + const numNext = this.nextIteration ? countAccumulatedItems(this.nextIteration.nullifierReadRequests) : 0; + const maxAmountToKeep = !this.nextIteration || forceResetAll ? 0 : MAX_NULLIFIER_READ_REQUESTS_PER_TX; + if (numCurr + numNext <= maxAmountToKeep) { + return false; + } + + const futureNullifiers = collectNested(this.executionStack, executionResult => { + const nonEmptyNullifiers = getNonEmptyItems(executionResult.callStackItem.publicInputs.nullifiers); + return nonEmptyNullifiers.map( + nullifier => + new ScopedNullifier(nullifier, executionResult.callStackItem.publicInputs.callContext.storageContractAddress), + ); + }); + + const resetStates = getNullifierReadRequestResetStates( + this.previousKernel.validationRequests.nullifierReadRequests, + this.previousKernel.end.nullifiers, + futureNullifiers, + ); + + const numPendingReads = resetStates.pendingReadHints.length; + const numSettledReads = resetStates.states.reduce( + (accum, state) => accum + (state === ReadRequestState.SETTLED ? 1 : 0), + 0, + ); + + if (!this.nextIteration) { + this.nullifierResetStates = resetStates; + this.requestedDimensions.NULLIFIER_PENDING_AMOUNT = numPendingReads; + this.requestedDimensions.NULLIFIER_SETTLED_AMOUNT = numSettledReads; + } else { + // Pick only one dimension to reset if next iteration is not empty. + if (numPendingReads > numSettledReads) { + this.requestedDimensions.NULLIFIER_PENDING_AMOUNT = numPendingReads; + this.nullifierResetStates.states = assertLength( + resetStates.states.map(state => (state === ReadRequestState.PENDING ? state : ReadRequestState.NADA)), + MAX_NULLIFIER_READ_REQUESTS_PER_TX, + ); + this.nullifierResetStates.pendingReadHints = resetStates.pendingReadHints; + } else { + this.requestedDimensions.NULLIFIER_SETTLED_AMOUNT = numSettledReads; + this.nullifierResetStates.states = assertLength( + resetStates.states.map(state => (state === ReadRequestState.SETTLED ? state : ReadRequestState.NADA)), + MAX_NULLIFIER_READ_REQUESTS_PER_TX, + ); + } + } + + return true; + } + + private needsResetNullifierKeys() { + const numCurr = countAccumulatedItems( + this.previousKernel.validationRequests.scopedKeyValidationRequestsAndGenerators, + ); + const numNext = this.nextIteration + ? countAccumulatedItems(this.nextIteration.keyValidationRequestsAndGenerators) + : 0; + const maxAmountToKeep = !this.nextIteration ? 0 : MAX_KEY_VALIDATION_REQUESTS_PER_TX; + if (numCurr + numNext <= maxAmountToKeep) { + return false; + } + + this.requestedDimensions.NULLIFIER_KEYS = numCurr; + + return true; + } + + private needsResetTransientData() { + // Initialize this to 0 so that needsSilo can be run. + this.numTransientData = 0; + + const nextAccumNoteHashes = + countAccumulatedItems(this.previousKernel.end.noteHashes) + + countAccumulatedItems(this.nextIteration?.noteHashes ?? []); + const noteHashWillOverflow = nextAccumNoteHashes > MAX_NOTE_HASHES_PER_TX; + const nextAccumNullifiers = + countAccumulatedItems(this.previousKernel.end.nullifiers) + + countAccumulatedItems(this.nextIteration?.nullifiers ?? []); + const nullifierWillOverflow = nextAccumNullifiers > MAX_NULLIFIERS_PER_TX; + if (this.nextIteration && !noteHashWillOverflow && !nullifierWillOverflow) { + return false; + } + + const futureNoteHashReads = collectNestedReadRequests( + this.executionStack, + executionResult => executionResult.callStackItem.publicInputs.noteHashReadRequests, + ); + const futureNullifierReads = collectNestedReadRequests( + this.executionStack, + executionResult => executionResult.callStackItem.publicInputs.nullifierReadRequests, + ); + if (this.nextIteration) { + // If it's not the final reset, only one dimension will be reset at a time. + // The note hashes and nullifiers for the remaining read requests can't be squashed. + futureNoteHashReads.push( + ...this.previousKernel.validationRequests.noteHashReadRequests.filter(r => !r.isEmpty()), + ); + futureNullifierReads.push( + ...this.previousKernel.validationRequests.nullifierReadRequests.filter(r => !r.isEmpty()), + ); + } + + const { numTransientData, hints: transientDataIndexHints } = buildTransientDataHints( + this.previousKernel.end.noteHashes, + this.previousKernel.end.nullifiers, + futureNoteHashReads, + futureNullifierReads, + this.noteHashNullifierCounterMap, + this.validationRequestsSplitCounter, + MAX_NOTE_HASHES_PER_TX, + MAX_NULLIFIERS_PER_TX, + ); + + if (this.nextIteration && !numTransientData) { + const forceResetAll = true; + const canClearReadRequests = + (noteHashWillOverflow && this.needsResetNoteHashReadRequests(forceResetAll)) || + (nullifierWillOverflow && this.needsResetNullifierReadRequests(forceResetAll)); + if (!canClearReadRequests) { + const overflownData = noteHashWillOverflow ? 'note hashes' : 'nullifiers'; + throw new Error(`Number of ${overflownData} exceeds the limit.`); + } + // Clearing the read requests might not be enough to squash the overflown data. + // In this case, the next iteration will fail at the above check. + return true; + } + + this.numTransientData = numTransientData; + this.transientDataIndexHints = transientDataIndexHints; + this.requestedDimensions.TRANSIENT_DATA_AMOUNT = numTransientData; + + return numTransientData > 0; + } + + private needsSiloNoteHashes() { + if (this.numTransientData === undefined) { + throw new Error('`needsResetTransientData` must be run before `needsSiloNoteHashes`.'); + } + + const numNoteHashes = this.previousKernel.end.noteHashes.filter(n => !n.contractAddress.isEmpty()).length; + const numToSilo = Math.max(0, numNoteHashes - this.numTransientData); + this.requestedDimensions.NOTE_HASH_SILOING_AMOUNT = numToSilo; + + return numToSilo > 0; + } + + private needsSiloNullifiers() { + if (this.numTransientData === undefined) { + throw new Error('`needsResetTransientData` must be run before `needsSiloNullifiers`.'); + } + + const numNullifiers = this.previousKernel.end.nullifiers.filter(n => !n.contractAddress.isEmpty()).length; + const numToSilo = Math.max(0, numNullifiers - this.numTransientData); + // Include the first nullifier if there's something to silo. + // The reset circuit checks that capped_size must be greater than or equal to all non-empty nullifiers. + // Which includes the first nullifier, even though its contract address is always zero and doesn't need siloing. + const cappedSize = numToSilo ? numToSilo + 1 : 0; + this.requestedDimensions.NULLIFIER_SILOING_AMOUNT = cappedSize; + + return numToSilo > 0; + } + + private needsSiloLogHashes() { + if (this.numTransientData === undefined) { + throw new Error('`needsResetTransientData` must be run before `needsSiloLogHashes`.'); + } + + const numLogs = this.previousKernel.end.encryptedLogsHashes.filter(l => !l.logHash.randomness.isZero()).length; + const numToSilo = Math.max(0, numLogs - this.numTransientData); + this.requestedDimensions.ENCRYPTED_LOG_SILOING_AMOUNT = numToSilo; + + return numToSilo > 0; + } +} diff --git a/yarn-project/pxe/src/kernel_prover/hints/index.ts b/yarn-project/pxe/src/kernel_prover/hints/index.ts index 4ec3f8a5ec0..737084aa844 100644 --- a/yarn-project/pxe/src/kernel_prover/hints/index.ts +++ b/yarn-project/pxe/src/kernel_prover/hints/index.ts @@ -1,2 +1 @@ -export * from './build_private_kernel_reset_hints.js'; -export * from './needs_reset.js'; +export * from './build_private_kernel_reset_private_inputs.js'; diff --git a/yarn-project/pxe/src/kernel_prover/hints/needs_reset.ts b/yarn-project/pxe/src/kernel_prover/hints/needs_reset.ts deleted file mode 100644 index af66331152b..00000000000 --- a/yarn-project/pxe/src/kernel_prover/hints/needs_reset.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { - MAX_KEY_VALIDATION_REQUESTS_PER_TX, - MAX_NOTE_ENCRYPTED_LOGS_PER_TX, - MAX_NOTE_HASHES_PER_TX, - MAX_NOTE_HASH_READ_REQUESTS_PER_TX, - MAX_NULLIFIERS_PER_TX, - MAX_NULLIFIER_READ_REQUESTS_PER_TX, - type PrivateKernelCircuitPublicInputs, - countAccumulatedItems, -} from '@aztec/circuits.js'; -import { type ExecutionResult } from '@aztec/simulator'; - -export function needsReset(publicInputs: PrivateKernelCircuitPublicInputs, executionStack: ExecutionResult[]) { - const nextIteration = executionStack[executionStack.length - 1]; - return ( - countAccumulatedItems(nextIteration.callStackItem.publicInputs.noteHashes) + - countAccumulatedItems(publicInputs.end.noteHashes) > - MAX_NOTE_HASHES_PER_TX || - countAccumulatedItems(nextIteration.callStackItem.publicInputs.nullifiers) + - countAccumulatedItems(publicInputs.end.nullifiers) > - MAX_NULLIFIERS_PER_TX || - countAccumulatedItems(nextIteration.callStackItem.publicInputs.noteEncryptedLogsHashes) + - countAccumulatedItems(publicInputs.end.noteEncryptedLogsHashes) > - MAX_NOTE_ENCRYPTED_LOGS_PER_TX || - countAccumulatedItems(nextIteration.callStackItem.publicInputs.noteHashReadRequests) + - countAccumulatedItems(publicInputs.validationRequests.noteHashReadRequests) > - MAX_NOTE_HASH_READ_REQUESTS_PER_TX || - countAccumulatedItems(nextIteration.callStackItem.publicInputs.nullifierReadRequests) + - countAccumulatedItems(publicInputs.validationRequests.nullifierReadRequests) > - MAX_NULLIFIER_READ_REQUESTS_PER_TX || - countAccumulatedItems(nextIteration.callStackItem.publicInputs.keyValidationRequestsAndGenerators) + - countAccumulatedItems(publicInputs.validationRequests.scopedKeyValidationRequestsAndGenerators) > - MAX_KEY_VALIDATION_REQUESTS_PER_TX - ); -} - -function hasTransientNullifier(publicInputs: PrivateKernelCircuitPublicInputs) { - const noteHashSet = new Set(); - publicInputs.end.noteHashes.forEach(n => noteHashSet.add(n.noteHash.value.toBigInt())); - noteHashSet.delete(0n); - return publicInputs.end.nullifiers.some(n => noteHashSet.has(n.nullifiedNoteHash.toBigInt())); -} - -export function needsFinalReset(publicInputs: PrivateKernelCircuitPublicInputs) { - return ( - countAccumulatedItems(publicInputs.end.noteHashes) > 0 || - countAccumulatedItems(publicInputs.end.nullifiers) > 0 || - countAccumulatedItems(publicInputs.end.encryptedLogsHashes) > 0 || - countAccumulatedItems(publicInputs.validationRequests.noteHashReadRequests) > 0 || - countAccumulatedItems(publicInputs.validationRequests.nullifierReadRequests) > 0 || - countAccumulatedItems(publicInputs.validationRequests.scopedKeyValidationRequestsAndGenerators) > 0 || - hasTransientNullifier(publicInputs) - ); -} diff --git a/yarn-project/pxe/src/kernel_prover/kernel_prover.test.ts b/yarn-project/pxe/src/kernel_prover/kernel_prover.test.ts index 70010c0eb9a..ac5da692b73 100644 --- a/yarn-project/pxe/src/kernel_prover/kernel_prover.test.ts +++ b/yarn-project/pxe/src/kernel_prover/kernel_prover.test.ts @@ -94,6 +94,7 @@ describe('Kernel Prover', () => { publicInputs, verificationKey: VerificationKeyAsFields.makeEmpty(), outputWitness: new Map(), + bytecode: Buffer.from([]), }; }; @@ -109,6 +110,7 @@ describe('Kernel Prover', () => { publicInputs, outputWitness: new Map(), verificationKey: VerificationKeyAsFields.makeEmpty(), + bytecode: Buffer.from([]), }; }; @@ -154,9 +156,6 @@ describe('Kernel Prover', () => { }); proofCreator = mock(); - proofCreator.getSiloedCommitments.mockImplementation(publicInputs => - Promise.resolve(publicInputs.noteHashes.map(com => createFakeSiloedCommitment(com.value))), - ); proofCreator.simulateProofInit.mockResolvedValue(simulateProofOutput([])); proofCreator.simulateProofInner.mockResolvedValue(simulateProofOutput([])); proofCreator.simulateProofReset.mockResolvedValue(simulateProofOutput([])); diff --git a/yarn-project/pxe/src/kernel_prover/kernel_prover.ts b/yarn-project/pxe/src/kernel_prover/kernel_prover.ts index 957edfe3882..4ac4b1fc7c6 100644 --- a/yarn-project/pxe/src/kernel_prover/kernel_prover.ts +++ b/yarn-project/pxe/src/kernel_prover/kernel_prover.ts @@ -15,11 +15,7 @@ import { import { createDebugLogger } from '@aztec/foundation/log'; import { assertLength } from '@aztec/foundation/serialize'; import { pushTestData } from '@aztec/foundation/testing'; -import { - ClientCircuitArtifacts, - PrivateResetTagToArtifactName, - getVKTreeRoot, -} from '@aztec/noir-protocol-circuits-types'; +import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types'; import { type ExecutionResult, collectEnqueuedPublicFunctionCalls, @@ -31,13 +27,14 @@ import { import { type WitnessMap } from '@noir-lang/types'; -import { buildPrivateKernelResetInputs, needsFinalReset, needsReset } from './hints/index.js'; +import { PrivateKernelResetPrivateInputsBuilder } from './hints/build_private_kernel_reset_private_inputs.js'; import { type ProvingDataOracle } from './proving_data_oracle.js'; const NULL_PROVE_OUTPUT: PrivateKernelSimulateOutput = { publicInputs: PrivateKernelCircuitPublicInputs.empty(), verificationKey: VerificationKeyAsFields.makeEmpty(), outputWitness: new Map(), + bytecode: Buffer.from([]), }; /** * The KernelProver class is responsible for generating kernel proofs. @@ -81,22 +78,29 @@ export class KernelProver { const witnessStack: WitnessMap[] = []; while (executionStack.length) { - if (!firstIteration && needsReset(output.publicInputs, executionStack)) { - const resetInputs = await this.getPrivateKernelResetInputs( - executionStack, + if (!firstIteration) { + let resetBuilder = new PrivateKernelResetPrivateInputsBuilder( output, - noteHashLeafIndexMap, + executionStack, noteHashNullifierCounterMap, validationRequestsSplitCounter, - false, - ); - output = await this.proofCreator.simulateProofReset(resetInputs); - // TODO(#7368) consider refactoring this redundant bytecode pushing - acirs.push( - Buffer.from(ClientCircuitArtifacts[PrivateResetTagToArtifactName[resetInputs.sizeTag]].bytecode, 'base64'), ); - witnessStack.push(output.outputWitness); + while (resetBuilder.needsReset()) { + const privateInputs = await resetBuilder.build(this.oracle, noteHashLeafIndexMap); + output = await this.proofCreator.simulateProofReset(privateInputs); + // TODO(#7368) consider refactoring this redundant bytecode pushing + acirs.push(output.bytecode); + witnessStack.push(output.outputWitness); + + resetBuilder = new PrivateKernelResetPrivateInputsBuilder( + output, + executionStack, + noteHashNullifierCounterMap, + validationRequestsSplitCounter, + ); + } } + const currentExecution = executionStack.pop()!; executionStack.push(...[...currentExecution.nestedExecutions].reverse()); @@ -117,7 +121,7 @@ export class KernelProver { const proofInput = new PrivateKernelInitCircuitPrivateInputs(txRequest, getVKTreeRoot(), privateCallData); pushTestData('private-kernel-inputs-init', proofInput); output = await this.proofCreator.simulateProofInit(proofInput); - acirs.push(Buffer.from(ClientCircuitArtifacts.PrivateKernelInitArtifact.bytecode, 'base64')); + acirs.push(output.bytecode); witnessStack.push(output.outputWitness); } else { const previousVkMembershipWitness = await this.oracle.getVkMembershipWitness(output.verificationKey); @@ -130,28 +134,34 @@ export class KernelProver { const proofInput = new PrivateKernelInnerCircuitPrivateInputs(previousKernelData, privateCallData); pushTestData('private-kernel-inputs-inner', proofInput); output = await this.proofCreator.simulateProofInner(proofInput); - acirs.push(Buffer.from(ClientCircuitArtifacts.PrivateKernelInnerArtifact.bytecode, 'base64')); + acirs.push(output.bytecode); witnessStack.push(output.outputWitness); } firstIteration = false; } - if (needsFinalReset(output.publicInputs)) { - const resetInputs = await this.getPrivateKernelResetInputs( - executionStack, + // Reset. + let resetBuilder = new PrivateKernelResetPrivateInputsBuilder( + output, + [], + noteHashNullifierCounterMap, + validationRequestsSplitCounter, + ); + while (resetBuilder.needsReset()) { + const privateInputs = await resetBuilder.build(this.oracle, noteHashLeafIndexMap); + output = await this.proofCreator.simulateProofReset(privateInputs); + acirs.push(output.bytecode); + witnessStack.push(output.outputWitness); + + resetBuilder = new PrivateKernelResetPrivateInputsBuilder( output, - noteHashLeafIndexMap, + [], noteHashNullifierCounterMap, validationRequestsSplitCounter, - true, ); - output = await this.proofCreator.simulateProofReset(resetInputs); - // TODO(#7368) consider refactoring this redundant bytecode pushing - acirs.push( - Buffer.from(ClientCircuitArtifacts[PrivateResetTagToArtifactName[resetInputs.sizeTag]].bytecode, 'base64'), - ); - witnessStack.push(output.outputWitness); } + + // Private tail. const previousVkMembershipWitness = await this.oracle.getVkMembershipWitness(output.verificationKey); const previousKernelData = new PrivateKernelData( output.publicInputs, @@ -168,14 +178,7 @@ export class KernelProver { pushTestData('private-kernel-inputs-ordering', privateInputs); const tailOutput = await this.proofCreator.simulateProofTail(privateInputs); - acirs.push( - Buffer.from( - privateInputs.isForPublic() - ? ClientCircuitArtifacts.PrivateKernelTailToPublicArtifact.bytecode - : ClientCircuitArtifacts.PrivateKernelTailArtifact.bytecode, - 'base64', - ), - ); + acirs.push(tailOutput.bytecode); witnessStack.push(tailOutput.outputWitness); // TODO(#7368) how do we 'bincode' encode these inputs? @@ -184,33 +187,6 @@ export class KernelProver { return tailOutput; } - private async getPrivateKernelResetInputs( - executionStack: ExecutionResult[], - output: PrivateKernelSimulateOutput, - noteHashLeafIndexMap: Map, - noteHashNullifierCounterMap: Map, - validationRequestsSplitCounter: number, - shouldSilo: boolean, - ) { - const previousVkMembershipWitness = await this.oracle.getVkMembershipWitness(output.verificationKey); - const previousKernelData = new PrivateKernelData( - output.publicInputs, - output.verificationKey, - Number(previousVkMembershipWitness.leafIndex), - assertLength(previousVkMembershipWitness.siblingPath, VK_TREE_HEIGHT), - ); - - return await buildPrivateKernelResetInputs( - executionStack, - previousKernelData, - noteHashLeafIndexMap, - noteHashNullifierCounterMap, - validationRequestsSplitCounter, - shouldSilo, - this.oracle, - ); - } - private async createPrivateCallData({ callStackItem }: ExecutionResult, vk: VerificationKeyAsFields) { const { contractAddress, functionData } = callStackItem; diff --git a/yarn-project/pxe/src/kernel_prover/test/test_circuit_prover.ts b/yarn-project/pxe/src/kernel_prover/test/test_circuit_prover.ts index 109cc33d821..4798a40c5c8 100644 --- a/yarn-project/pxe/src/kernel_prover/test/test_circuit_prover.ts +++ b/yarn-project/pxe/src/kernel_prover/test/test_circuit_prover.ts @@ -3,19 +3,17 @@ import { type PrivateKernelProver, type PrivateKernelSimulateOutput, } from '@aztec/circuit-types'; -import type { CircuitName, CircuitSimulationStats } from '@aztec/circuit-types/stats'; +import type { CircuitSimulationStats } from '@aztec/circuit-types/stats'; import { ClientIvcProof, - type PrivateCircuitPublicInputs, type PrivateKernelCircuitPublicInputs, type PrivateKernelInitCircuitPrivateInputs, type PrivateKernelInnerCircuitPrivateInputs, - type PrivateKernelResetCircuitPrivateInputsVariants, + type PrivateKernelResetCircuitPrivateInputs, type PrivateKernelTailCircuitPrivateInputs, type PrivateKernelTailCircuitPublicInputs, VerificationKeyAsFields, } from '@aztec/circuits.js'; -import { siloNoteHash } from '@aztec/circuits.js/hash'; import { createDebugLogger } from '@aztec/foundation/log'; import { elapsed } from '@aztec/foundation/timer'; import { @@ -26,6 +24,8 @@ import { executeReset, executeTail, executeTailForPublic, + getPrivateKernelResetArtifactName, + maxPrivateKernelResetDimensions, } from '@aztec/noir-protocol-circuits-types'; import { type WitnessMap } from '@noir-lang/types'; @@ -40,12 +40,6 @@ export class TestPrivateKernelProver implements PrivateKernelProver { return Promise.resolve(ClientIvcProof.empty()); } - public getSiloedCommitments(publicInputs: PrivateCircuitPublicInputs) { - const contractAddress = publicInputs.callContext.storageContractAddress; - - return Promise.resolve(publicInputs.noteHashes.map(commitment => siloNoteHash(contractAddress, commitment.value))); - } - public async simulateProofInit( privateInputs: PrivateKernelInitCircuitPrivateInputs, ): Promise> { @@ -75,19 +69,20 @@ export class TestPrivateKernelProver implements PrivateKernelProver { } public async simulateProofReset( - privateInputs: PrivateKernelResetCircuitPrivateInputsVariants, + privateInputs: PrivateKernelResetCircuitPrivateInputs, ): Promise> { - const [duration, result] = await elapsed(() => executeReset(privateInputs)); + const variantPrivateInputs = privateInputs.trimToSizes(); + const [duration, result] = await elapsed(() => executeReset(variantPrivateInputs, privateInputs.dimensions)); this.log.debug(`Simulated private kernel reset`, { eventName: 'circuit-simulation', - circuitName: ('private-kernel-reset-' + privateInputs.sizeTag) as CircuitName, + circuitName: 'private-kernel-reset', duration, - inputSize: privateInputs.toBuffer().length, + inputSize: variantPrivateInputs.toBuffer().length, outputSize: result.toBuffer().length, } satisfies CircuitSimulationStats); return this.makeEmptyKernelSimulateOutput( result, - 'PrivateKernelResetFullArtifact', + getPrivateKernelResetArtifactName(maxPrivateKernelResetDimensions), ); } @@ -129,6 +124,7 @@ export class TestPrivateKernelProver implements PrivateKernelProver { publicInputs, verificationKey: ProtocolCircuitVks[circuitType].keyAsFields, outputWitness: new Map(), + bytecode: Buffer.from([]), }; return kernelProofOutput; } diff --git a/yarn-project/pxe/src/note_processor/note_processor.test.ts b/yarn-project/pxe/src/note_processor/note_processor.test.ts index 2a694b16708..18abf9faaea 100644 --- a/yarn-project/pxe/src/note_processor/note_processor.test.ts +++ b/yarn-project/pxe/src/note_processor/note_processor.test.ts @@ -1,4 +1,4 @@ -import { type AztecNode, EncryptedL2NoteLog, L1NotePayload, L2Block, TaggedLog } from '@aztec/circuit-types'; +import { type AztecNode, EncryptedL2NoteLog, EncryptedLogPayload, L1NotePayload, L2Block } from '@aztec/circuit-types'; import { AztecAddress, CompleteAddress, @@ -31,8 +31,8 @@ const NUM_NOTE_HASHES_PER_BLOCK = TXS_PER_BLOCK * MAX_NOTE_HASHES_PER_TX; /** A wrapper containing info about a note we want to mock and insert into a block. */ class MockNoteRequest { constructor( - /** Note we want to insert into a block. */ - public readonly note: TaggedLog, + /** Log payload corresponding to a note we want to insert into a block. */ + public readonly logPayload: EncryptedLogPayload, /** Block number this note corresponds to. */ public readonly blockNumber: number, /** Index of a tx within a block this note corresponds to. */ @@ -58,7 +58,7 @@ class MockNoteRequest { encrypt(): EncryptedL2NoteLog { const ephSk = GrumpkinScalar.random(); const recipient = AztecAddress.random(); - const log = this.note.encrypt(ephSk, recipient, this.ivpk, this.ovKeys); + const log = this.logPayload.encrypt(ephSk, recipient, this.ivpk, this.ovKeys); return new EncryptedL2NoteLog(log); } @@ -67,6 +67,13 @@ class MockNoteRequest { (this.blockNumber - 1) * NUM_NOTE_HASHES_PER_BLOCK + this.txIndex * MAX_NOTE_HASHES_PER_TX + this.noteHashIndex, ); } + + get notePayload(): L1NotePayload | undefined { + return L1NotePayload.fromIncomingBodyPlaintextAndContractAddress( + this.logPayload.incomingBodyPlaintext, + this.logPayload.contractAddress, + ); + } } describe('Note Processor', () => { @@ -103,8 +110,8 @@ describe('Note Processor', () => { // Then we update the relevant note hashes to match the note requests for (const request of noteRequestsForBlock) { - const note = request.note; - const noteHash = pedersenHash(note.payload.note.items); + const notePayload = request.notePayload; + const noteHash = pedersenHash(notePayload!.note.items); block.body.txEffects[request.txIndex].noteHashes[request.noteHashIndex] = noteHash; // Now we populate the log - to simplify we say that there is only 1 function invocation in each tx @@ -180,7 +187,7 @@ describe('Note Processor', () => { it('should store an incoming note that belongs to us', async () => { const request = new MockNoteRequest( - TaggedLog.random(L1NotePayload, app), + getRandomNoteLogPayload(app), 4, 0, 2, @@ -195,7 +202,7 @@ describe('Note Processor', () => { expect(addNotesSpy).toHaveBeenCalledWith( [ expect.objectContaining({ - ...request.note.payload, + ...request.notePayload, index: request.indexWithinNoteHashTree, }), ], @@ -205,23 +212,23 @@ describe('Note Processor', () => { }, 25_000); it('should store an outgoing note that belongs to us', async () => { - const request = new MockNoteRequest(TaggedLog.random(L1NotePayload, app), 4, 0, 2, Point.random(), ownerOvKeys); + const request = new MockNoteRequest(getRandomNoteLogPayload(app), 4, 0, 2, Point.random(), ownerOvKeys); const blocks = mockBlocks([request]); await noteProcessor.process(blocks); expect(addNotesSpy).toHaveBeenCalledTimes(1); // For outgoing notes, the resulting DAO does not contain index. - expect(addNotesSpy).toHaveBeenCalledWith([], [expect.objectContaining(request.note.payload)], account.address); + expect(addNotesSpy).toHaveBeenCalledWith([], [expect.objectContaining(request.notePayload)], account.address); }, 25_000); it('should store multiple notes that belong to us', async () => { const requests = [ - new MockNoteRequest(TaggedLog.random(L1NotePayload, app), 1, 1, 1, ownerIvpkM, ownerOvKeys), - new MockNoteRequest(TaggedLog.random(L1NotePayload, app), 2, 3, 0, Point.random(), ownerOvKeys), - new MockNoteRequest(TaggedLog.random(L1NotePayload, app), 6, 3, 2, ownerIvpkM, KeyValidationRequest.random()), - new MockNoteRequest(TaggedLog.random(L1NotePayload, app), 9, 3, 2, Point.random(), KeyValidationRequest.random()), - new MockNoteRequest(TaggedLog.random(L1NotePayload, app), 12, 3, 2, ownerIvpkM, ownerOvKeys), + new MockNoteRequest(getRandomNoteLogPayload(app), 1, 1, 1, ownerIvpkM, ownerOvKeys), + new MockNoteRequest(getRandomNoteLogPayload(app), 2, 3, 0, Point.random(), ownerOvKeys), + new MockNoteRequest(getRandomNoteLogPayload(app), 6, 3, 2, ownerIvpkM, KeyValidationRequest.random()), + new MockNoteRequest(getRandomNoteLogPayload(app), 9, 3, 2, Point.random(), KeyValidationRequest.random()), + new MockNoteRequest(getRandomNoteLogPayload(app), 12, 3, 2, ownerIvpkM, ownerOvKeys), ]; const blocks = mockBlocks(requests); @@ -232,23 +239,23 @@ describe('Note Processor', () => { // Incoming should contain notes from requests 0, 2, 4 because in those requests we set owner ivpk. [ expect.objectContaining({ - ...requests[0].note.payload, + ...requests[0].notePayload, index: requests[0].indexWithinNoteHashTree, }), expect.objectContaining({ - ...requests[2].note.payload, + ...requests[2].notePayload, index: requests[2].indexWithinNoteHashTree, }), expect.objectContaining({ - ...requests[4].note.payload, + ...requests[4].notePayload, index: requests[4].indexWithinNoteHashTree, }), ], // Outgoing should contain notes from requests 0, 1, 4 because in those requests we set owner ovKeys. [ - expect.objectContaining(requests[0].note.payload), - expect.objectContaining(requests[1].note.payload), - expect.objectContaining(requests[4].note.payload), + expect.objectContaining(requests[0].notePayload), + expect.objectContaining(requests[1].notePayload), + expect.objectContaining(requests[4].notePayload), ], account.address, ); @@ -257,8 +264,8 @@ describe('Note Processor', () => { it('should not store notes that do not belong to us', async () => { // Both notes should be ignored because the encryption keys do not belong to owner (they are random). const blocks = mockBlocks([ - new MockNoteRequest(TaggedLog.random(), 2, 1, 1, Point.random(), KeyValidationRequest.random()), - new MockNoteRequest(TaggedLog.random(), 2, 3, 0, Point.random(), KeyValidationRequest.random()), + new MockNoteRequest(getRandomNoteLogPayload(), 2, 1, 1, Point.random(), KeyValidationRequest.random()), + new MockNoteRequest(getRandomNoteLogPayload(), 2, 3, 0, Point.random(), KeyValidationRequest.random()), ]); await noteProcessor.process(blocks); @@ -266,8 +273,8 @@ describe('Note Processor', () => { }); it('should be able to recover two note payloads containing the same note', async () => { - const note = TaggedLog.random(L1NotePayload, app); - const note2 = TaggedLog.random(L1NotePayload, app); + const note = getRandomNoteLogPayload(app); + const note2 = getRandomNoteLogPayload(app); // All note payloads except one have the same contract address, storage slot, and the actual note. const requests = [ new MockNoteRequest(note, 3, 0, 0, ownerIvpkM, ownerOvKeys), @@ -284,11 +291,11 @@ describe('Note Processor', () => { { const addedIncoming: IncomingNoteDao[] = addNotesSpy.mock.calls[0][0]; expect(addedIncoming.map(dao => dao)).toEqual([ - expect.objectContaining({ ...requests[0].note.payload, index: requests[0].indexWithinNoteHashTree }), - expect.objectContaining({ ...requests[1].note.payload, index: requests[1].indexWithinNoteHashTree }), - expect.objectContaining({ ...requests[2].note.payload, index: requests[2].indexWithinNoteHashTree }), - expect.objectContaining({ ...requests[3].note.payload, index: requests[3].indexWithinNoteHashTree }), - expect.objectContaining({ ...requests[4].note.payload, index: requests[4].indexWithinNoteHashTree }), + expect.objectContaining({ ...requests[0].notePayload, index: requests[0].indexWithinNoteHashTree }), + expect.objectContaining({ ...requests[1].notePayload, index: requests[1].indexWithinNoteHashTree }), + expect.objectContaining({ ...requests[2].notePayload, index: requests[2].indexWithinNoteHashTree }), + expect.objectContaining({ ...requests[3].notePayload, index: requests[3].indexWithinNoteHashTree }), + expect.objectContaining({ ...requests[4].notePayload, index: requests[4].indexWithinNoteHashTree }), ]); // Check that every note has a different nonce. @@ -301,11 +308,11 @@ describe('Note Processor', () => { { const addedOutgoing: OutgoingNoteDao[] = addNotesSpy.mock.calls[0][1]; expect(addedOutgoing.map(dao => dao)).toEqual([ - expect.objectContaining(requests[0].note.payload), - expect.objectContaining(requests[1].note.payload), - expect.objectContaining(requests[2].note.payload), - expect.objectContaining(requests[3].note.payload), - expect.objectContaining(requests[4].note.payload), + expect.objectContaining(requests[0].notePayload), + expect.objectContaining(requests[1].notePayload), + expect.objectContaining(requests[2].notePayload), + expect.objectContaining(requests[3].notePayload), + expect.objectContaining(requests[4].notePayload), ]); // Outgoing note daos do not have a nonce so we don't check it. @@ -313,7 +320,7 @@ describe('Note Processor', () => { }); it('advances the block number', async () => { - const request = new MockNoteRequest(TaggedLog.random(), 6, 0, 2, ownerIvpkM, ownerOvKeys); + const request = new MockNoteRequest(getRandomNoteLogPayload(), 6, 0, 2, ownerIvpkM, ownerOvKeys); const blocks = mockBlocks([request]); await noteProcessor.process(blocks); @@ -322,7 +329,14 @@ describe('Note Processor', () => { }); it('should restore the last block number processed and ignore the starting block', async () => { - const request = new MockNoteRequest(TaggedLog.random(), 6, 0, 2, Point.random(), KeyValidationRequest.random()); + const request = new MockNoteRequest( + getRandomNoteLogPayload(), + 6, + 0, + 2, + Point.random(), + KeyValidationRequest.random(), + ); const blocks = mockBlocks([request]); await noteProcessor.process(blocks); @@ -338,4 +352,8 @@ describe('Note Processor', () => { expect(newNoteProcessor.status).toEqual(noteProcessor.status); }); + + function getRandomNoteLogPayload(app = AztecAddress.random()): EncryptedLogPayload { + return new EncryptedLogPayload(Fr.random(), Fr.random(), app, L1NotePayload.random(app).toIncomingBodyPlaintext()); + } }); diff --git a/yarn-project/pxe/src/note_processor/note_processor.ts b/yarn-project/pxe/src/note_processor/note_processor.ts index 13ed58e5227..ac9bf48b691 100644 --- a/yarn-project/pxe/src/note_processor/note_processor.ts +++ b/yarn-project/pxe/src/note_processor/note_processor.ts @@ -1,4 +1,4 @@ -import { type AztecNode, L1NotePayload, type L2Block, TaggedLog } from '@aztec/circuit-types'; +import { type AztecNode, L1NotePayload, type L2Block } from '@aztec/circuit-types'; import { type NoteProcessorStats } from '@aztec/circuit-types/stats'; import { type AztecAddress, INITIAL_L2_BLOCK_NUM, MAX_NOTE_HASHES_PER_TX, type PublicKey } from '@aztec/circuits.js'; import { type Fr } from '@aztec/foundation/fields'; @@ -142,30 +142,26 @@ export class NoteProcessor { for (const functionLogs of txFunctionLogs) { for (const log of functionLogs.logs) { this.stats.seen++; - const incomingTaggedNote = TaggedLog.decryptAsIncoming(log.data, ivskM)!; - const outgoingTaggedNote = TaggedLog.decryptAsOutgoing(log.data, ovskM)!; - - if (incomingTaggedNote || outgoingTaggedNote) { - if ( - incomingTaggedNote && - outgoingTaggedNote && - !incomingTaggedNote.payload.equals(outgoingTaggedNote.payload) - ) { + const incomingNotePayload = L1NotePayload.decryptAsIncoming(log, ivskM); + const outgoingNotePayload = L1NotePayload.decryptAsOutgoing(log, ovskM); + + if (incomingNotePayload || outgoingNotePayload) { + if (incomingNotePayload && outgoingNotePayload && !incomingNotePayload.equals(outgoingNotePayload)) { throw new Error( `Incoming and outgoing note payloads do not match. Incoming: ${JSON.stringify( - incomingTaggedNote.payload, - )}, Outgoing: ${JSON.stringify(outgoingTaggedNote.payload)}`, + incomingNotePayload, + )}, Outgoing: ${JSON.stringify(outgoingNotePayload)}`, ); } - const payload = incomingTaggedNote?.payload || outgoingTaggedNote?.payload; + const payload = incomingNotePayload || outgoingNotePayload; const txHash = block.body.txEffects[indexOfTxInABlock].txHash; const { incomingNote, outgoingNote, incomingDeferredNote, outgoingDeferredNote } = await produceNoteDaos( this.simulator, - incomingTaggedNote ? this.ivpkM : undefined, - outgoingTaggedNote ? this.ovpkM : undefined, - payload, + incomingNotePayload ? this.ivpkM : undefined, + outgoingNotePayload ? this.ovpkM : undefined, + payload!, txHash, noteHashes, dataStartIndexForTx, diff --git a/yarn-project/pxe/src/pxe_service/pxe_service.ts b/yarn-project/pxe/src/pxe_service/pxe_service.ts index c18a036d590..a0b3de442b6 100644 --- a/yarn-project/pxe/src/pxe_service/pxe_service.ts +++ b/yarn-project/pxe/src/pxe_service/pxe_service.ts @@ -20,7 +20,6 @@ import { type SiblingPath, SimulatedTx, SimulationError, - TaggedLog, Tx, type TxEffect, type TxExecutionRequest, @@ -944,11 +943,10 @@ export class PXEService implements PXE { const visibleEvents = encryptedLogs.flatMap(encryptedLog => { for (const sk of vsks) { - const decryptedLog = - TaggedLog.decryptAsIncoming(encryptedLog, sk, L1EventPayload) ?? - TaggedLog.decryptAsOutgoing(encryptedLog, sk, L1EventPayload); - if (decryptedLog !== undefined) { - return [decryptedLog]; + const decryptedEvent = + L1EventPayload.decryptAsIncoming(encryptedLog, sk) ?? L1EventPayload.decryptAsOutgoing(encryptedLog, sk); + if (decryptedEvent !== undefined) { + return [decryptedEvent]; } } @@ -957,19 +955,19 @@ export class PXEService implements PXE { const decodedEvents = visibleEvents .map(visibleEvent => { - if (visibleEvent.payload === undefined) { + if (visibleEvent === undefined) { return undefined; } - if (!visibleEvent.payload.eventTypeId.equals(eventMetadata.eventSelector)) { + if (!visibleEvent.eventTypeId.equals(eventMetadata.eventSelector)) { return undefined; } - if (visibleEvent.payload.event.items.length !== eventMetadata.fieldNames.length) { + if (visibleEvent.event.items.length !== eventMetadata.fieldNames.length) { throw new Error( 'Something is weird here, we have matching EventSelectors, but the actual payload has mismatched length', ); } - return eventMetadata.decode(visibleEvent.payload); + return eventMetadata.decode(visibleEvent); }) .filter(visibleEvent => visibleEvent !== undefined) as T[]; diff --git a/yarn-project/pxe/src/synchronizer/synchronizer.test.ts b/yarn-project/pxe/src/synchronizer/synchronizer.test.ts index ea2d1d86c39..66ae6d0d88d 100644 --- a/yarn-project/pxe/src/synchronizer/synchronizer.test.ts +++ b/yarn-project/pxe/src/synchronizer/synchronizer.test.ts @@ -97,21 +97,9 @@ describe('Synchronizer', () => { .mockResolvedValueOnce([blocks[1].body.encryptedLogs]); aztecNode.getBlocks - // called by synchronizer.work, we are testing fromFields in this first call - .mockResolvedValueOnce([ - L2Block.fromFields({ - archive: blocks[0].archive, - header: blocks[0].header, - body: blocks[0].body, - }), - ]) - .mockResolvedValueOnce([ - L2Block.fromFields({ - archive: blocks[1].archive, - header: blocks[1].header, - body: blocks[1].body, - }), - ]) + // called by synchronizer.work, + .mockResolvedValueOnce([blocks[0]]) + .mockResolvedValueOnce([blocks[1]]) // called by synchronizer.workNoteProcessorCatchUp .mockResolvedValueOnce([blocks[0]]) .mockResolvedValueOnce([blocks[1]]); diff --git a/yarn-project/sequencer-client/src/block_builder/index.ts b/yarn-project/sequencer-client/src/block_builder/index.ts index 077b1049650..60cc8b9cf9d 100644 --- a/yarn-project/sequencer-client/src/block_builder/index.ts +++ b/yarn-project/sequencer-client/src/block_builder/index.ts @@ -1,7 +1,7 @@ -import { type BlockSimulator, type MerkleTreeOperations } from '@aztec/circuit-types'; +import { type BlockBuilder, type MerkleTreeOperations } from '@aztec/circuit-types'; export * from './orchestrator.js'; export * from './light.js'; export interface BlockBuilderFactory { - create(db: MerkleTreeOperations): BlockSimulator; + create(db: MerkleTreeOperations): BlockBuilder; } diff --git a/yarn-project/sequencer-client/src/block_builder/light.test.ts b/yarn-project/sequencer-client/src/block_builder/light.test.ts index 25c041b4fa8..3688fb093c8 100644 --- a/yarn-project/sequencer-client/src/block_builder/light.test.ts +++ b/yarn-project/sequencer-client/src/block_builder/light.test.ts @@ -26,6 +26,7 @@ import { type RecursiveProof, RootParityInput, RootParityInputs, + VK_TREE_HEIGHT, VerificationKeyData, makeEmptyRecursiveProof, } from '@aztec/circuits.js'; @@ -60,7 +61,7 @@ describe('LightBlockBuilder', () => { let emptyProof: RecursiveProof; let emptyVk: VerificationKeyData; - let emptyVkWitness: MembershipWitness<5>; + let emptyVkWitness: MembershipWitness; beforeAll(() => { logger = createDebugLogger('aztec:sequencer-client:test:block-builder'); @@ -68,7 +69,7 @@ describe('LightBlockBuilder', () => { vkRoot = getVKTreeRoot(); emptyProof = makeEmptyRecursiveProof(NESTED_RECURSIVE_PROOF_LENGTH); emptyVk = VerificationKeyData.makeFake(); - emptyVkWitness = makeEmptyMembershipWitness(5); + emptyVkWitness = makeEmptyMembershipWitness(VK_TREE_HEIGHT); }); beforeEach(async () => { @@ -169,9 +170,8 @@ describe('LightBlockBuilder', () => { for (const tx of txs) { await builder.addNewTx(tx); } - await builder.setBlockCompleted(); - const result = await builder.finaliseBlock(); - return result.block.header; + const { header } = await builder.setBlockCompleted(); + return header; }; // Builds the block header using circuit outputs diff --git a/yarn-project/sequencer-client/src/block_builder/light.ts b/yarn-project/sequencer-client/src/block_builder/light.ts index 7443087bd6a..58c741faec0 100644 --- a/yarn-project/sequencer-client/src/block_builder/light.ts +++ b/yarn-project/sequencer-client/src/block_builder/light.ts @@ -1,14 +1,11 @@ import { createDebugLogger } from '@aztec/aztec.js'; import { - type BlockSimulator, + type BlockBuilder, Body, L2Block, MerkleTreeId, type MerkleTreeOperations, - PROVING_STATUS, type ProcessedTx, - type ProvingTicket, - type SimulationBlockResult, type TxEffect, makeEmptyProcessedTx, toTxEffect, @@ -28,12 +25,9 @@ import { type TelemetryClient } from '@aztec/telemetry-client'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; /** - * Implements a block simulator using a test circuit prover under the hood, which just simulates circuits and outputs empty proofs. - * This class is temporary and should die once we switch from tx effects to tx objects submissions, since sequencers won't have - * the need to create L2 block headers to submit to L1. When we do that, we should also remove the references to the - * prover-client and bb-prover packages from this package. + * Builds a block and its header from a set of processed tx without running any circuits. */ -export class LightweightBlockBuilder implements BlockSimulator { +export class LightweightBlockBuilder implements BlockBuilder { private numTxs?: number; private globalVariables?: GlobalVariables; private l1ToL2Messages?: Fr[]; @@ -44,7 +38,7 @@ export class LightweightBlockBuilder implements BlockSimulator { constructor(private db: MerkleTreeOperations, private telemetry: TelemetryClient) {} - async startNewBlock(numTxs: number, globalVariables: GlobalVariables, l1ToL2Messages: Fr[]): Promise { + async startNewBlock(numTxs: number, globalVariables: GlobalVariables, l1ToL2Messages: Fr[]): Promise { this.logger.verbose('Starting new block', { numTxs, globalVariables, l1ToL2Messages }); this.numTxs = numTxs; this.globalVariables = globalVariables; @@ -52,9 +46,6 @@ export class LightweightBlockBuilder implements BlockSimulator { // Update L1 to L2 tree await this.db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, this.l1ToL2Messages!); - - // Nothing to prove, so we return an already resolved promise - return { provingPromise: Promise.resolve({ status: PROVING_STATUS.SUCCESS }) }; } async addNewTx(tx: ProcessedTx): Promise { @@ -69,9 +60,7 @@ export class LightweightBlockBuilder implements BlockSimulator { ); } - cancel(): void {} - - async setBlockCompleted(): Promise { + async setBlockCompleted(): Promise { const paddingTxCount = this.numTxs! - this.txs.length; this.logger.verbose(`Setting block as completed and adding ${paddingTxCount} padding txs`); for (let i = 0; i < paddingTxCount; i++) { @@ -84,9 +73,11 @@ export class LightweightBlockBuilder implements BlockSimulator { ), ); } + + return this.buildBlock(); } - async finaliseBlock(): Promise { + private async buildBlock(): Promise { this.logger.verbose(`Finalising block`); const nonEmptyTxEffects: TxEffect[] = this.txs .map(tx => toTxEffect(tx, this.globalVariables!.gasFees)) @@ -98,14 +89,14 @@ export class LightweightBlockBuilder implements BlockSimulator { const newArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, this.db); const block = new L2Block(newArchive, header, body); - return { block }; + return block; } } export class LightweightBlockBuilderFactory { constructor(private telemetry?: TelemetryClient) {} - create(db: MerkleTreeOperations): BlockSimulator { + create(db: MerkleTreeOperations): BlockBuilder { return new LightweightBlockBuilder(db, this.telemetry ?? new NoopTelemetryClient()); } } diff --git a/yarn-project/sequencer-client/src/block_builder/orchestrator.ts b/yarn-project/sequencer-client/src/block_builder/orchestrator.ts index 31f00f26ea5..b22f8922d85 100644 --- a/yarn-project/sequencer-client/src/block_builder/orchestrator.ts +++ b/yarn-project/sequencer-client/src/block_builder/orchestrator.ts @@ -1,11 +1,5 @@ import { TestCircuitProver } from '@aztec/bb-prover'; -import { - type BlockSimulator, - type MerkleTreeOperations, - type ProcessedTx, - type ProvingTicket, - type SimulationBlockResult, -} from '@aztec/circuit-types'; +import { type BlockBuilder, type L2Block, type MerkleTreeOperations, type ProcessedTx } from '@aztec/circuit-types'; import { type Fr, type GlobalVariables } from '@aztec/circuits.js'; import { ProvingOrchestrator } from '@aztec/prover-client/orchestrator'; import { type SimulationProvider } from '@aztec/simulator'; @@ -14,27 +8,20 @@ import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; /** * Implements a block simulator using a test circuit prover under the hood, which just simulates circuits and outputs empty proofs. - * This class is temporary and should die once we switch from tx effects to tx objects submissions, since sequencers won't have - * the need to create L2 block headers to submit to L1. When we do that, we should also remove the references to the - * prover-client and bb-prover packages from this package. + * This class is unused at the moment, but could be leveraged by a prover-node to ascertain that it can prove a block before + * committing to proving it by sending a quote. */ -export class OrchestratorBlockBuilder implements BlockSimulator { +export class OrchestratorBlockBuilder implements BlockBuilder { private orchestrator: ProvingOrchestrator; constructor(db: MerkleTreeOperations, simulationProvider: SimulationProvider, telemetry: TelemetryClient) { const testProver = new TestCircuitProver(telemetry, simulationProvider); this.orchestrator = new ProvingOrchestrator(db, testProver, telemetry); } - startNewBlock(numTxs: number, globalVariables: GlobalVariables, l1ToL2Messages: Fr[]): Promise { + startNewBlock(numTxs: number, globalVariables: GlobalVariables, l1ToL2Messages: Fr[]): Promise { return this.orchestrator.startNewBlock(numTxs, globalVariables, l1ToL2Messages); } - cancel(): void { - this.orchestrator.cancel(); - } - finaliseBlock(): Promise { - return this.orchestrator.finaliseBlock(); - } - setBlockCompleted(): Promise { + setBlockCompleted(): Promise { return this.orchestrator.setBlockCompleted(); } addNewTx(tx: ProcessedTx): Promise { @@ -45,7 +32,7 @@ export class OrchestratorBlockBuilder implements BlockSimulator { export class OrchestratorBlockBuilderFactory { constructor(private simulationProvider: SimulationProvider, private telemetry?: TelemetryClient) {} - create(db: MerkleTreeOperations): BlockSimulator { + create(db: MerkleTreeOperations): BlockBuilder { return new OrchestratorBlockBuilder(db, this.simulationProvider, this.telemetry ?? new NoopTelemetryClient()); } } diff --git a/yarn-project/sequencer-client/src/publisher/index.ts b/yarn-project/sequencer-client/src/publisher/index.ts index e51b4d3cdea..97e14e96262 100644 --- a/yarn-project/sequencer-client/src/publisher/index.ts +++ b/yarn-project/sequencer-client/src/publisher/index.ts @@ -1,2 +1,2 @@ -export { L1Publisher } from './l1-publisher.js'; +export { L1Publisher, L1SubmitEpochProofArgs } from './l1-publisher.js'; export * from './config.js'; diff --git a/yarn-project/sequencer-client/src/publisher/l1-publisher.ts b/yarn-project/sequencer-client/src/publisher/l1-publisher.ts index 6df5560d3b2..79ea85ffae0 100644 --- a/yarn-project/sequencer-client/src/publisher/l1-publisher.ts +++ b/yarn-project/sequencer-client/src/publisher/l1-publisher.ts @@ -1,18 +1,37 @@ -import { ConsensusPayload, type L2Block, type TxHash, getHashedSignaturePayload } from '@aztec/circuit-types'; +import { + ConsensusPayload, + type EpochProofClaim, + type EpochProofQuote, + type L2Block, + type TxHash, + getHashedSignaturePayload, +} from '@aztec/circuit-types'; import { type L1PublishBlockStats, type L1PublishProofStats } from '@aztec/circuit-types/stats'; -import { ETHEREUM_SLOT_DURATION, EthAddress, type Header, type Proof } from '@aztec/circuits.js'; +import { + AGGREGATION_OBJECT_LENGTH, + ETHEREUM_SLOT_DURATION, + EthAddress, + type FeeRecipient, + type Header, + type Proof, + type RootRollupPublicInputs, +} from '@aztec/circuits.js'; import { createEthereumChain } from '@aztec/ethereum'; +import { makeTuple } from '@aztec/foundation/array'; +import { areArraysEqual, times } from '@aztec/foundation/collection'; import { type Signature } from '@aztec/foundation/eth-signature'; -import { type Fr } from '@aztec/foundation/fields'; +import { Fr } from '@aztec/foundation/fields'; import { createDebugLogger } from '@aztec/foundation/log'; -import { serializeToBuffer } from '@aztec/foundation/serialize'; +import { type Tuple, serializeToBuffer } from '@aztec/foundation/serialize'; import { InterruptibleSleep } from '@aztec/foundation/sleep'; import { Timer } from '@aztec/foundation/timer'; import { RollupAbi } from '@aztec/l1-artifacts'; import { type TelemetryClient } from '@aztec/telemetry-client'; import pick from 'lodash.pick'; +import { inspect } from 'util'; import { + type BaseError, ContractFunctionRevertedError, type GetContractReturnType, type Hex, @@ -23,6 +42,7 @@ import { createPublicClient, createWalletClient, encodeFunctionData, + getAbiItem, getAddress, getContract, hexToBytes, @@ -33,7 +53,7 @@ import type * as chains from 'viem/chains'; import { type PublisherConfig, type TxSenderConfig } from './config.js'; import { L1PublisherMetrics } from './l1-publisher-metrics.js'; -import { prettyLogVeimError } from './utils.js'; +import { prettyLogViemError } from './utils.js'; /** * Stats for a sent transaction. @@ -64,7 +84,7 @@ export type MinimalTransactionReceipt = { }; /** Arguments to the process method of the rollup contract */ -export type L1ProcessArgs = { +type L1ProcessArgs = { /** The L2 block header. */ header: Buffer; /** A root of the archive tree after the L2 block is applied. */ @@ -79,18 +99,18 @@ export type L1ProcessArgs = { attestations?: Signature[]; }; -/** Arguments to the submitProof method of the rollup contract */ -export type L1SubmitProofArgs = { - /** The L2 block header. */ - header: Buffer; - /** A root of the archive tree after the L2 block is applied. */ - archive: Buffer; - /** Identifier of the prover. */ - proverId: Buffer; - /** The proof for the block. */ - proof: Buffer; - /** The aggregation object for the block's proof. */ - aggregationObject: Buffer; +/** Arguments to the submitEpochProof method of the rollup contract */ +export type L1SubmitEpochProofArgs = { + epochSize: number; + previousArchive: Fr; + endArchive: Fr; + previousBlockHash: Fr; + endBlockHash: Fr; + endTimestamp: Fr; + outHash: Fr; + proverId: Fr; + fees: Tuple; + proof: Proof; }; /** @@ -116,6 +136,7 @@ export class L1Publisher { private account: PrivateKeyAccount; public static PROPOSE_GAS_GUESS: bigint = 500_000n; + public static PROPOSE_AND_CLAIM_GAS_GUESS: bigint = 600_000n; constructor(config: TxSenderConfig & PublisherConfig, client: TelemetryClient) { this.sleepTimeMs = config?.l1PublishRetryIntervalMS ?? 60_000; @@ -143,8 +164,8 @@ export class L1Publisher { }); } - public getSenderAddress(): Promise { - return Promise.resolve(EthAddress.fromString(this.account.address)); + public getSenderAddress(): EthAddress { + return EthAddress.fromString(this.account.address); } /** @@ -162,6 +183,60 @@ export class L1Publisher { return [slot, blockNumber]; } + public async nextEpochToClaim(): Promise { + return await this.rollupContract.read.nextEpochToClaim(); + } + + public async getEpochForSlotNumber(slotNumber: bigint): Promise { + return await this.rollupContract.read.getEpochAtSlot([slotNumber]); + } + + public async getEpochToProve(): Promise { + try { + return await this.rollupContract.read.getEpochToProve(); + } catch (err: any) { + // If this is a revert with Rollup__NoEpochToProve, it means there is no epoch to prove, so we return undefined + // See https://viem.sh/docs/contract/simulateContract#handling-custom-errors + const errorName = tryGetCustomErrorName(err); + if (errorName === getAbiItem({ abi: RollupAbi, name: 'Rollup__NoEpochToProve' }).name) { + return undefined; + } + throw err; + } + } + + public async getProofClaim(): Promise { + const [epochToProve, basisPointFee, bondAmount, bondProviderHex, proposerClaimantHex] = + await this.rollupContract.read.proofClaim(); + + const bondProvider = EthAddress.fromString(bondProviderHex); + const proposerClaimant = EthAddress.fromString(proposerClaimantHex); + + if (bondProvider.isZero() && proposerClaimant.isZero() && epochToProve === 0n) { + return undefined; + } + + return { + epochToProve, + basisPointFee, + bondAmount, + bondProvider, + proposerClaimant, + }; + } + + public async validateProofQuote(quote: EpochProofQuote): Promise { + const args = [quote.toViemArgs()] as const; + try { + await this.rollupContract.read.validateEpochProofRightClaim(args, { account: this.account }); + } catch (err) { + const errorName = tryGetCustomErrorName(err); + this.log.verbose(`Proof quote validation failed: ${errorName}`); + return undefined; + } + return quote; + } + /** * @notice Will call `validateHeader` to make sure that it is possible to propose * @@ -229,7 +304,12 @@ export class L1Publisher { * @param block - L2 block to propose. * @returns True once the tx has been confirmed and is successful, false on revert or interrupt, blocks otherwise. */ - public async proposeL2Block(block: L2Block, attestations?: Signature[], txHashes?: TxHash[]): Promise { + public async proposeL2Block( + block: L2Block, + attestations?: Signature[], + txHashes?: TxHash[], + proofQuote?: EpochProofQuote, + ): Promise { const ctx = { blockNumber: block.number, slotNumber: block.header.globalVariables.slotNumber.toBigInt(), @@ -249,77 +329,77 @@ export class L1Publisher { }; // Publish body and propose block (if not already published) - if (!this.interrupted) { - const timer = new Timer(); + if (this.interrupted) { + this.log.verbose('L2 block data syncing interrupted while processing blocks.', ctx); + return false; + } - // @note This will make sure that we are passing the checks for our header ASSUMING that the data is also made available - // This means that we can avoid the simulation issues in later checks. - // By simulation issue, I mean the fact that the block.timestamp is equal to the last block, not the next, which - // make time consistency checks break. - await this.validateBlockForSubmission(block.header, { - digest: digest.toBuffer(), - signatures: attestations ?? [], - }); + const timer = new Timer(); - const txHash = await this.sendProposeTx(proposeTxArgs); + // @note This will make sure that we are passing the checks for our header ASSUMING that the data is also made available + // This means that we can avoid the simulation issues in later checks. + // By simulation issue, I mean the fact that the block.timestamp is equal to the last block, not the next, which + // make time consistency checks break. + await this.validateBlockForSubmission(block.header, { + digest: digest.toBuffer(), + signatures: attestations ?? [], + }); - if (!txHash) { - this.log.info(`Failed to publish block ${block.number} to L1`, ctx); - return false; - } + this.log.verbose(`Submitting propose transaction`); - const receipt = await this.getTransactionReceipt(txHash); - if (!receipt) { - this.log.info(`Failed to get receipt for tx ${txHash}`, ctx); - return false; - } + const txHash = proofQuote + ? await this.sendProposeAndClaimTx(proposeTxArgs, proofQuote) + : await this.sendProposeTx(proposeTxArgs); - // Tx was mined successfully - if (receipt.status) { - const tx = await this.getTransactionStats(txHash); - const stats: L1PublishBlockStats = { - ...pick(receipt, 'gasPrice', 'gasUsed', 'transactionHash'), - ...pick(tx!, 'calldataGas', 'calldataSize'), - ...block.getStats(), - eventName: 'rollup-published-to-l1', - }; - this.log.info(`Published L2 block to L1 rollup contract`, { ...stats, ...ctx }); - this.metrics.recordProcessBlockTx(timer.ms(), stats); - - return true; - } + if (!txHash) { + this.log.info(`Failed to publish block ${block.number} to L1`, ctx); + return false; + } - this.metrics.recordFailedTx('process'); + const receipt = await this.getTransactionReceipt(txHash); + if (!receipt) { + this.log.info(`Failed to get receipt for tx ${txHash}`, ctx); + return false; + } - this.log.error(`Rollup.process tx status failed: ${receipt.transactionHash}`, ctx); - await this.sleepOrInterrupted(); + // Tx was mined successfully + if (receipt.status) { + const tx = await this.getTransactionStats(txHash); + const stats: L1PublishBlockStats = { + ...pick(receipt, 'gasPrice', 'gasUsed', 'transactionHash'), + ...pick(tx!, 'calldataGas', 'calldataSize'), + ...block.getStats(), + eventName: 'rollup-published-to-l1', + }; + this.log.info(`Published L2 block to L1 rollup contract`, { ...stats, ...ctx }); + this.metrics.recordProcessBlockTx(timer.ms(), stats); + + return true; } - this.log.verbose('L2 block data syncing interrupted while processing blocks.', ctx); + this.metrics.recordFailedTx('process'); + + this.log.error(`Rollup.process tx status failed: ${receipt.transactionHash}`, ctx); + await this.sleepOrInterrupted(); return false; } - public async submitProof( - header: Header, - archiveRoot: Fr, - proverId: Fr, - aggregationObject: Fr[], - proof: Proof, - ): Promise { - const ctx = { blockNumber: header.globalVariables.blockNumber, slotNumber: header.globalVariables.slotNumber }; - - const txArgs: L1SubmitProofArgs = { - header: header.toBuffer(), - archive: archiveRoot.toBuffer(), - proverId: proverId.toBuffer(), - aggregationObject: serializeToBuffer(aggregationObject), - proof: proof.withoutPublicInputs(), - }; - - // Process block + public async submitEpochProof(args: { + epochNumber: number; + fromBlock: number; + toBlock: number; + publicInputs: RootRollupPublicInputs; + proof: Proof; + }): Promise { + const { epochNumber, fromBlock, toBlock } = args; + const ctx = { epochNumber, fromBlock, toBlock }; if (!this.interrupted) { const timer = new Timer(); - const txHash = await this.sendSubmitProofTx(txArgs); + + // Validate epoch proof range and hashes are correct before submitting + await this.validateEpochProofSubmission(args); + + const txHash = await this.sendSubmitEpochProofTx(args); if (!txHash) { return false; } @@ -337,13 +417,13 @@ export class L1Publisher { ...pick(tx!, 'calldataGas', 'calldataSize'), eventName: 'proof-published-to-l1', }; - this.log.info(`Published proof to L1 rollup contract`, { ...stats, ...ctx }); + this.log.info(`Published epoch proof to L1 rollup contract`, { ...stats, ...ctx }); this.metrics.recordSubmitProof(timer.ms(), stats); return true; } this.metrics.recordFailedTx('submitProof'); - this.log.error(`Rollup.submitProof tx status failed: ${receipt.transactionHash}`, ctx); + this.log.error(`Rollup.submitEpochProof tx status failed: ${receipt.transactionHash}`, ctx); await this.sleepOrInterrupted(); } @@ -351,6 +431,63 @@ export class L1Publisher { return false; } + private async validateEpochProofSubmission(args: { + fromBlock: number; + toBlock: number; + publicInputs: RootRollupPublicInputs; + proof: Proof; + }) { + const { fromBlock, toBlock, publicInputs, proof } = args; + + // Check that the block numbers match the expected epoch to be proven + const [pending, proven] = await this.rollupContract.read.tips(); + if (proven !== BigInt(fromBlock) - 1n) { + throw new Error(`Cannot submit epoch proof for ${fromBlock}-${toBlock} as proven block is ${proven}`); + } + if (toBlock > pending) { + throw new Error(`Cannot submit epoch proof for ${fromBlock}-${toBlock} as pending block is ${pending}`); + } + + // Check the block hash and archive for the immediate block before the epoch + const [previousArchive, previousBlockHash] = await this.rollupContract.read.blocks([proven]); + if (publicInputs.previousArchive.root.toString() !== previousArchive) { + throw new Error( + `Previous archive root mismatch: ${publicInputs.previousArchive.root.toString()} !== ${previousArchive}`, + ); + } + // TODO: Remove zero check once we inject the proper zero blockhash + if (previousBlockHash !== Fr.ZERO.toString() && publicInputs.previousBlockHash.toString() !== previousBlockHash) { + throw new Error( + `Previous block hash mismatch: ${publicInputs.previousBlockHash.toString()} !== ${previousBlockHash}`, + ); + } + + // Check the block hash and archive for the last block in the epoch + const [endArchive, endBlockHash] = await this.rollupContract.read.blocks([BigInt(toBlock)]); + if (publicInputs.endArchive.root.toString() !== endArchive) { + throw new Error(`End archive root mismatch: ${publicInputs.endArchive.root.toString()} !== ${endArchive}`); + } + if (publicInputs.endBlockHash.toString() !== endBlockHash) { + throw new Error(`End block hash mismatch: ${publicInputs.endBlockHash.toString()} !== ${endBlockHash}`); + } + + // Compare the public inputs computed by the contract with the ones injected + const rollupPublicInputs = await this.rollupContract.read.getEpochProofPublicInputs( + this.getSubmitEpochProofArgs(args), + ); + const aggregationObject = proof.isEmpty() + ? times(AGGREGATION_OBJECT_LENGTH, Fr.zero) + : proof.extractAggregationObject(); + const argsPublicInputs = [...publicInputs.toFields(), ...aggregationObject]; + + if (!areArraysEqual(rollupPublicInputs.map(Fr.fromString), argsPublicInputs, (a, b) => a.equals(b))) { + const fmt = (inputs: Fr[] | readonly string[]) => inputs.map(x => x.toString()).join(', '); + throw new Error( + `Root rollup public inputs mismatch:\nRollup: ${fmt(rollupPublicInputs)}\nComputed:${fmt(argsPublicInputs)}`, + ); + } + } + /** * Calling `interrupt` will cause any in progress call to `publishRollup` to return `false` asap. * Be warned, the call may return false even if the tx subsequently gets successfully mined. @@ -367,75 +504,122 @@ export class L1Publisher { this.interrupted = false; } - private async sendSubmitProofTx(submitProofArgs: L1SubmitProofArgs): Promise { + private async sendSubmitEpochProofTx(args: { + fromBlock: number; + toBlock: number; + publicInputs: RootRollupPublicInputs; + proof: Proof; + }): Promise { try { - const size = Object.values(submitProofArgs).reduce((acc, arg) => acc + arg.length, 0); - this.log.info(`SubmitProof size=${size} bytes`); - - const { header, archive, proverId, aggregationObject, proof } = submitProofArgs; - const args = [ - `0x${header.toString('hex')}`, - `0x${archive.toString('hex')}`, - `0x${proverId.toString('hex')}`, - `0x${aggregationObject.toString('hex')}`, - `0x${proof.toString('hex')}`, - ] as const; - - await this.rollupContract.simulate.submitBlockRootProof(args, { - account: this.account, - }); + const proofHex: Hex = `0x${args.proof.withoutPublicInputs().toString('hex')}`; + const txArgs = [...this.getSubmitEpochProofArgs(args), proofHex] as const; + this.log.info(`SubmitEpochProof proofSize=${args.proof.withoutPublicInputs().length} bytes`); + await this.rollupContract.simulate.submitEpochRootProof(txArgs, { account: this.account }); + return await this.rollupContract.write.submitEpochRootProof(txArgs, { account: this.account }); + } catch (err) { + this.log.error(`Rollup submit epoch proof failed`, err); + return undefined; + } + } + + private async prepareProposeTx(encodedData: L1ProcessArgs, gasGuess: bigint) { + // We have to jump a few hoops because viem is not happy around estimating gas for view functions + const computeTxsEffectsHashGas = await this.publicClient.estimateGas({ + to: this.rollupContract.address, + data: encodeFunctionData({ + abi: this.rollupContract.abi, + functionName: 'computeTxsEffectsHash', + args: [`0x${encodedData.body.toString('hex')}`], + }), + }); + + // @note We perform this guesstimate instead of the usual `gasEstimate` since + // viem will use the current state to simulate against, which means that + // we will fail estimation in the case where we are simulating for the + // first ethereum block within our slot (as current time is not in the + // slot yet). + const gasGuesstimate = computeTxsEffectsHashGas + gasGuess; + + const attestations = encodedData.attestations + ? encodedData.attestations.map(attest => attest.toViemSignature()) + : []; + const txHashes = encodedData.txHashes ? encodedData.txHashes.map(txHash => txHash.to0xString()) : []; + const args = [ + `0x${encodedData.header.toString('hex')}`, + `0x${encodedData.archive.toString('hex')}`, + `0x${encodedData.blockHash.toString('hex')}`, + txHashes, + attestations, + `0x${encodedData.body.toString('hex')}`, + ] as const; - return await this.rollupContract.write.submitBlockRootProof(args, { + return { args, gasGuesstimate }; + } + + private getSubmitEpochProofArgs(args: { + fromBlock: number; + toBlock: number; + publicInputs: RootRollupPublicInputs; + proof: Proof; + }) { + return [ + BigInt(args.toBlock - args.fromBlock + 1), + [ + args.publicInputs.previousArchive.root.toString(), + args.publicInputs.endArchive.root.toString(), + args.publicInputs.previousBlockHash.toString(), + args.publicInputs.endBlockHash.toString(), + args.publicInputs.endTimestamp.toString(), + args.publicInputs.outHash.toString(), + args.publicInputs.proverId.toString(), + ], + makeTuple(64, i => + i % 2 === 0 + ? args.publicInputs.fees[i / 2].recipient.toField().toString() + : args.publicInputs.fees[(i - 1) / 2].value.toString(), + ), + `0x${serializeToBuffer(args.proof.extractAggregationObject()).toString('hex')}`, + ] as const; + } + + private async sendProposeTx(encodedData: L1ProcessArgs): Promise { + if (this.interrupted) { + return; + } + try { + const { args, gasGuesstimate } = await this.prepareProposeTx(encodedData, L1Publisher.PROPOSE_GAS_GUESS); + + return await this.rollupContract.write.propose(args, { account: this.account, + gas: gasGuesstimate, }); } catch (err) { - this.log.error(`Rollup submit proof failed`, err); + prettyLogViemError(err, this.log); + this.log.error(`Rollup publish failed`, err); return undefined; } } - private async sendProposeTx(encodedData: L1ProcessArgs): Promise { - if (!this.interrupted) { - try { - // We have to jump a few hoops because viem is not happy around estimating gas for view functions - const computeTxsEffectsHashGas = await this.publicClient.estimateGas({ - to: this.rollupContract.address, - data: encodeFunctionData({ - abi: this.rollupContract.abi, - functionName: 'computeTxsEffectsHash', - args: [`0x${encodedData.body.toString('hex')}`], - }), - }); - - // @note We perform this guesstimate instead of the usual `gasEstimate` since - // viem will use the current state to simulate against, which means that - // we will fail estimation in the case where we are simulating for the - // first ethereum block within our slot (as current time is not in the - // slot yet). - const gasGuesstimate = computeTxsEffectsHashGas + L1Publisher.PROPOSE_GAS_GUESS; - - const attestations = encodedData.attestations - ? encodedData.attestations.map(attest => attest.toViemSignature()) - : []; - const txHashes = encodedData.txHashes ? encodedData.txHashes.map(txHash => txHash.to0xString()) : []; - const args = [ - `0x${encodedData.header.toString('hex')}`, - `0x${encodedData.archive.toString('hex')}`, - `0x${encodedData.blockHash.toString('hex')}`, - txHashes, - attestations, - `0x${encodedData.body.toString('hex')}`, - ] as const; - - return await this.rollupContract.write.propose(args, { - account: this.account, - gas: gasGuesstimate, - }); - } catch (err) { - prettyLogVeimError(err, this.log); - this.log.error(`Rollup publish failed`, err); - return undefined; - } + private async sendProposeAndClaimTx(encodedData: L1ProcessArgs, quote: EpochProofQuote): Promise { + if (this.interrupted) { + return; + } + try { + const { args, gasGuesstimate } = await this.prepareProposeTx( + encodedData, + L1Publisher.PROPOSE_AND_CLAIM_GAS_GUESS, + ); + this.log.info(`ProposeAndClaim`); + this.log.info(inspect(quote.payload)); + + return await this.rollupContract.write.proposeAndClaim([...args, quote.toViemArgs()], { + account: this.account, + gas: gasGuesstimate, + }); + } catch (err) { + prettyLogViemError(err, this.log); + this.log.error(`Rollup publish failed`, err); + return undefined; } } @@ -487,3 +671,18 @@ export class L1Publisher { function getCalldataGasUsage(data: Uint8Array) { return data.filter(byte => byte === 0).length * 4 + data.filter(byte => byte !== 0).length * 16; } + +function tryGetCustomErrorName(err: any) { + try { + // See https://viem.sh/docs/contract/simulateContract#handling-custom-errors + if (err.name === 'ViemError') { + const baseError = err as BaseError; + const revertError = baseError.walk(err => (err as Error).name === 'ContractFunctionRevertedError'); + if (revertError) { + return (revertError as ContractFunctionRevertedError).data?.errorName; + } + } + } catch (_e) { + return undefined; + } +} diff --git a/yarn-project/sequencer-client/src/publisher/utils.ts b/yarn-project/sequencer-client/src/publisher/utils.ts index 13842102a2c..8889aa0998c 100644 --- a/yarn-project/sequencer-client/src/publisher/utils.ts +++ b/yarn-project/sequencer-client/src/publisher/utils.ts @@ -2,7 +2,7 @@ import { type Logger } from '@aztec/foundation/log'; import { BaseError, ContractFunctionRevertedError } from 'viem'; -export function prettyLogVeimError(err: any, logger: Logger) { +export function prettyLogViemError(err: any, logger: Logger) { if (err instanceof BaseError) { const revertError = err.walk(err => err instanceof ContractFunctionRevertedError); if (revertError instanceof ContractFunctionRevertedError) { diff --git a/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts b/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts index 2b20ac57113..cb648f3db61 100644 --- a/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts +++ b/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts @@ -1,16 +1,14 @@ import { BlockAttestation, + type BlockBuilder, BlockProposal, - type BlockSimulator, ConsensusPayload, + type EpochProofQuote, type L1ToL2MessageSource, L2Block, type L2BlockSource, type MerkleTreeAdminOperations, MerkleTreeId, - PROVING_STATUS, - type ProvingSuccess, - type ProvingTicket, type Tx, TxHash, type UnencryptedL2Log, @@ -18,9 +16,11 @@ import { WorldStateRunningState, type WorldStateSynchronizer, makeProcessedTx, + mockEpochProofQuote, mockTxForRollup, } from '@aztec/circuit-types'; import { + AZTEC_EPOCH_DURATION, AztecAddress, EthAddress, Fr, @@ -53,7 +53,7 @@ describe('sequencer', () => { let globalVariableBuilder: MockProxy; let p2p: MockProxy; let worldState: MockProxy; - let blockSimulator: MockProxy; + let blockBuilder: MockProxy; let merkleTreeOps: MockProxy; let publicProcessor: MockProxy; let l2BlockSource: MockProxy; @@ -116,15 +116,15 @@ describe('sequencer', () => { globalVariableBuilder = mock(); merkleTreeOps = mock(); - blockSimulator = mock(); + blockBuilder = mock(); p2p = mock({ - getStatus: () => Promise.resolve({ state: P2PClientState.IDLE, syncedToL2Block: lastBlockNumber }), + getStatus: mockFn().mockResolvedValue({ state: P2PClientState.IDLE, syncedToL2Block: lastBlockNumber }), }); worldState = mock({ getLatest: () => merkleTreeOps, - status: () => Promise.resolve({ state: WorldStateRunningState.IDLE, syncedToL2Block: lastBlockNumber }), + status: mockFn().mockResolvedValue({ state: WorldStateRunningState.IDLE, syncedToL2Block: lastBlockNumber }), }); publicProcessor = mock({ @@ -145,7 +145,7 @@ describe('sequencer', () => { l1ToL2MessageSource = mock({ getL1ToL2Messages: () => Promise.resolve(Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(Fr.ZERO)), - getBlockNumber: () => Promise.resolve(lastBlockNumber), + getBlockNumber: mockFn().mockResolvedValue(lastBlockNumber), }); // all txs use the same allowed FPC class @@ -155,7 +155,7 @@ describe('sequencer', () => { }); const blockBuilderFactory = mock({ - create: () => blockSimulator, + create: () => blockBuilder, }); validatorClient = mock({ @@ -184,16 +184,8 @@ describe('sequencer', () => { tx.data.constants.txContext.chainId = chainId; const txHash = tx.getTxHash(); - const result: ProvingSuccess = { - status: PROVING_STATUS.SUCCESS, - }; - const ticket: ProvingTicket = { - provingPromise: Promise.resolve(result), - }; - p2p.getTxs.mockReturnValueOnce([tx]); - blockSimulator.startNewBlock.mockResolvedValueOnce(ticket); - blockSimulator.finaliseBlock.mockResolvedValue({ block }); + blockBuilder.setBlockCompleted.mockResolvedValue(block); publisher.proposeL2Block.mockResolvedValueOnce(true); globalVariableBuilder.buildGlobalVariables.mockResolvedValueOnce(mockedGlobalVariables); @@ -201,31 +193,23 @@ describe('sequencer', () => { await sequencer.initialSync(); await sequencer.work(); - expect(blockSimulator.startNewBlock).toHaveBeenCalledWith( + expect(blockBuilder.startNewBlock).toHaveBeenCalledWith( 2, mockedGlobalVariables, Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n)), ); // Ok, we have an issue that we never actually call the process L2 block expect(publisher.proposeL2Block).toHaveBeenCalledTimes(1); - expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), [txHash]); - expect(blockSimulator.cancel).toHaveBeenCalledTimes(0); + expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), [txHash], undefined); }); it('builds a block when it is their turn', async () => { const tx = mockTxForRollup(); tx.data.constants.txContext.chainId = chainId; const txHash = tx.getTxHash(); - const result: ProvingSuccess = { - status: PROVING_STATUS.SUCCESS, - }; - const ticket: ProvingTicket = { - provingPromise: Promise.resolve(result), - }; p2p.getTxs.mockReturnValue([tx]); - blockSimulator.startNewBlock.mockResolvedValueOnce(ticket); - blockSimulator.finaliseBlock.mockResolvedValue({ block }); + blockBuilder.setBlockCompleted.mockResolvedValue(block); publisher.proposeL2Block.mockResolvedValueOnce(true); globalVariableBuilder.buildGlobalVariables.mockResolvedValue(mockedGlobalVariables); @@ -236,7 +220,7 @@ describe('sequencer', () => { await sequencer.initialSync(); await sequencer.work(); - expect(blockSimulator.startNewBlock).not.toHaveBeenCalled(); + expect(blockBuilder.startNewBlock).not.toHaveBeenCalled(); // Now we can propose, but lets assume that the content is still "bad" (missing sigs etc) publisher.canProposeAtNextEthBlock.mockResolvedValue([ @@ -245,20 +229,19 @@ describe('sequencer', () => { ]); await sequencer.work(); - expect(blockSimulator.startNewBlock).not.toHaveBeenCalled(); + expect(blockBuilder.startNewBlock).not.toHaveBeenCalled(); // Now it is! publisher.validateBlockForSubmission.mockClear(); publisher.validateBlockForSubmission.mockResolvedValue(); await sequencer.work(); - expect(blockSimulator.startNewBlock).toHaveBeenCalledWith( + expect(blockBuilder.startNewBlock).toHaveBeenCalledWith( 2, mockedGlobalVariables, Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n)), ); - expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), [txHash]); - expect(blockSimulator.cancel).toHaveBeenCalledTimes(0); + expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), [txHash], undefined); }); it('builds a block out of several txs rejecting double spends', async () => { @@ -270,16 +253,9 @@ describe('sequencer', () => { const validTxHashes = txs.filter((_, i) => i !== doubleSpendTxIndex).map(tx => tx.getTxHash()); const doubleSpendTx = txs[doubleSpendTxIndex]; - const result: ProvingSuccess = { - status: PROVING_STATUS.SUCCESS, - }; - const ticket: ProvingTicket = { - provingPromise: Promise.resolve(result), - }; p2p.getTxs.mockReturnValueOnce(txs); - blockSimulator.startNewBlock.mockResolvedValueOnce(ticket); - blockSimulator.finaliseBlock.mockResolvedValue({ block }); + blockBuilder.setBlockCompleted.mockResolvedValue(block); publisher.proposeL2Block.mockResolvedValueOnce(true); globalVariableBuilder.buildGlobalVariables.mockResolvedValueOnce(mockedGlobalVariables); @@ -295,14 +271,13 @@ describe('sequencer', () => { await sequencer.initialSync(); await sequencer.work(); - expect(blockSimulator.startNewBlock).toHaveBeenCalledWith( + expect(blockBuilder.startNewBlock).toHaveBeenCalledWith( 2, mockedGlobalVariables, Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n)), ); - expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), validTxHashes); + expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), validTxHashes, undefined); expect(p2p.deleteTxs).toHaveBeenCalledWith([doubleSpendTx.getTxHash()]); - expect(blockSimulator.cancel).toHaveBeenCalledTimes(0); }); it('builds a block out of several txs rejecting incorrect chain ids', async () => { @@ -314,16 +289,8 @@ describe('sequencer', () => { const invalidChainTx = txs[invalidChainTxIndex]; const validTxHashes = txs.filter((_, i) => i !== invalidChainTxIndex).map(tx => tx.getTxHash()); - const result: ProvingSuccess = { - status: PROVING_STATUS.SUCCESS, - }; - const ticket: ProvingTicket = { - provingPromise: Promise.resolve(result), - }; - p2p.getTxs.mockReturnValueOnce(txs); - blockSimulator.startNewBlock.mockResolvedValueOnce(ticket); - blockSimulator.finaliseBlock.mockResolvedValue({ block }); + blockBuilder.setBlockCompleted.mockResolvedValue(block); publisher.proposeL2Block.mockResolvedValueOnce(true); globalVariableBuilder.buildGlobalVariables.mockResolvedValueOnce(mockedGlobalVariables); @@ -334,14 +301,13 @@ describe('sequencer', () => { await sequencer.initialSync(); await sequencer.work(); - expect(blockSimulator.startNewBlock).toHaveBeenCalledWith( + expect(blockBuilder.startNewBlock).toHaveBeenCalledWith( 2, mockedGlobalVariables, Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n)), ); - expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), validTxHashes); + expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), validTxHashes, undefined); expect(p2p.deleteTxs).toHaveBeenCalledWith([invalidChainTx.getTxHash()]); - expect(blockSimulator.cancel).toHaveBeenCalledTimes(0); }); it('builds a block out of several txs dropping the ones that go over max size', async () => { @@ -353,16 +319,8 @@ describe('sequencer', () => { }); const validTxHashes = txs.filter((_, i) => i !== invalidTransactionIndex).map(tx => tx.getTxHash()); - const result: ProvingSuccess = { - status: PROVING_STATUS.SUCCESS, - }; - const ticket: ProvingTicket = { - provingPromise: Promise.resolve(result), - }; - p2p.getTxs.mockReturnValueOnce(txs); - blockSimulator.startNewBlock.mockResolvedValueOnce(ticket); - blockSimulator.finaliseBlock.mockResolvedValue({ block }); + blockBuilder.setBlockCompleted.mockResolvedValue(block); publisher.proposeL2Block.mockResolvedValueOnce(true); globalVariableBuilder.buildGlobalVariables.mockResolvedValueOnce(mockedGlobalVariables); @@ -375,13 +333,12 @@ describe('sequencer', () => { await sequencer.initialSync(); await sequencer.work(); - expect(blockSimulator.startNewBlock).toHaveBeenCalledWith( + expect(blockBuilder.startNewBlock).toHaveBeenCalledWith( 2, mockedGlobalVariables, Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n)), ); - expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), validTxHashes); - expect(blockSimulator.cancel).toHaveBeenCalledTimes(0); + expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), validTxHashes, undefined); }); it('builds a block once it reaches the minimum number of transactions', async () => { @@ -391,15 +348,8 @@ describe('sequencer', () => { return tx; }); const block = L2Block.random(lastBlockNumber + 1); - const result: ProvingSuccess = { - status: PROVING_STATUS.SUCCESS, - }; - const ticket: ProvingTicket = { - provingPromise: Promise.resolve(result), - }; - blockSimulator.startNewBlock.mockResolvedValueOnce(ticket); - blockSimulator.finaliseBlock.mockResolvedValue({ block }); + blockBuilder.setBlockCompleted.mockResolvedValue(block); publisher.proposeL2Block.mockResolvedValueOnce(true); globalVariableBuilder.buildGlobalVariables.mockResolvedValueOnce(mockedGlobalVariables); @@ -412,27 +362,26 @@ describe('sequencer', () => { p2p.getTxs.mockReturnValueOnce([]); //p2p.getTxs.mockReturnValueOnce(txs.slice(0, 4)); await sequencer.work(); - expect(blockSimulator.startNewBlock).toHaveBeenCalledTimes(0); + expect(blockBuilder.startNewBlock).toHaveBeenCalledTimes(0); // block is not built with 3 txs p2p.getTxs.mockReturnValueOnce(txs.slice(0, 3)); await sequencer.work(); - expect(blockSimulator.startNewBlock).toHaveBeenCalledTimes(0); + expect(blockBuilder.startNewBlock).toHaveBeenCalledTimes(0); // block is built with 4 txs p2p.getTxs.mockReturnValueOnce(txs.slice(0, 4)); const txHashes = txs.slice(0, 4).map(tx => tx.getTxHash()); await sequencer.work(); - expect(blockSimulator.startNewBlock).toHaveBeenCalledWith( + expect(blockBuilder.startNewBlock).toHaveBeenCalledWith( 4, mockedGlobalVariables, Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n)), ); expect(publisher.proposeL2Block).toHaveBeenCalledTimes(1); - expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), txHashes); - expect(blockSimulator.cancel).toHaveBeenCalledTimes(0); + expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), txHashes, undefined); }); it('builds a block that contains zero real transactions once flushed', async () => { @@ -442,15 +391,8 @@ describe('sequencer', () => { return tx; }); const block = L2Block.random(lastBlockNumber + 1); - const result: ProvingSuccess = { - status: PROVING_STATUS.SUCCESS, - }; - const ticket: ProvingTicket = { - provingPromise: Promise.resolve(result), - }; - blockSimulator.startNewBlock.mockResolvedValueOnce(ticket); - blockSimulator.finaliseBlock.mockResolvedValue({ block }); + blockBuilder.setBlockCompleted.mockResolvedValue(block); publisher.proposeL2Block.mockResolvedValueOnce(true); globalVariableBuilder.buildGlobalVariables.mockResolvedValueOnce(mockedGlobalVariables); @@ -462,12 +404,12 @@ describe('sequencer', () => { // block is not built with 0 txs p2p.getTxs.mockReturnValueOnce([]); await sequencer.work(); - expect(blockSimulator.startNewBlock).toHaveBeenCalledTimes(0); + expect(blockBuilder.startNewBlock).toHaveBeenCalledTimes(0); // block is not built with 3 txs p2p.getTxs.mockReturnValueOnce(txs.slice(0, 3)); await sequencer.work(); - expect(blockSimulator.startNewBlock).toHaveBeenCalledTimes(0); + expect(blockBuilder.startNewBlock).toHaveBeenCalledTimes(0); // flush the sequencer and it should build a block sequencer.flush(); @@ -475,15 +417,14 @@ describe('sequencer', () => { // block is built with 0 txs p2p.getTxs.mockReturnValueOnce([]); await sequencer.work(); - expect(blockSimulator.startNewBlock).toHaveBeenCalledTimes(1); - expect(blockSimulator.startNewBlock).toHaveBeenCalledWith( + expect(blockBuilder.startNewBlock).toHaveBeenCalledTimes(1); + expect(blockBuilder.startNewBlock).toHaveBeenCalledWith( 2, mockedGlobalVariables, Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n)), ); expect(publisher.proposeL2Block).toHaveBeenCalledTimes(1); - expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), []); - expect(blockSimulator.cancel).toHaveBeenCalledTimes(0); + expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), [], undefined); }); it('builds a block that contains less than the minimum number of transactions once flushed', async () => { @@ -493,15 +434,8 @@ describe('sequencer', () => { return tx; }); const block = L2Block.random(lastBlockNumber + 1); - const result: ProvingSuccess = { - status: PROVING_STATUS.SUCCESS, - }; - const ticket: ProvingTicket = { - provingPromise: Promise.resolve(result), - }; - blockSimulator.startNewBlock.mockResolvedValueOnce(ticket); - blockSimulator.finaliseBlock.mockResolvedValue({ block }); + blockBuilder.setBlockCompleted.mockResolvedValue(block); publisher.proposeL2Block.mockResolvedValueOnce(true); globalVariableBuilder.buildGlobalVariables.mockResolvedValueOnce(mockedGlobalVariables); @@ -513,12 +447,12 @@ describe('sequencer', () => { // block is not built with 0 txs p2p.getTxs.mockReturnValueOnce([]); await sequencer.work(); - expect(blockSimulator.startNewBlock).toHaveBeenCalledTimes(0); + expect(blockBuilder.startNewBlock).toHaveBeenCalledTimes(0); // block is not built with 3 txs p2p.getTxs.mockReturnValueOnce(txs.slice(0, 3)); await sequencer.work(); - expect(blockSimulator.startNewBlock).toHaveBeenCalledTimes(0); + expect(blockBuilder.startNewBlock).toHaveBeenCalledTimes(0); // flush the sequencer and it should build a block sequencer.flush(); @@ -528,31 +462,23 @@ describe('sequencer', () => { p2p.getTxs.mockReturnValueOnce(postFlushTxs); const postFlushTxHashes = postFlushTxs.map(tx => tx.getTxHash()); await sequencer.work(); - expect(blockSimulator.startNewBlock).toHaveBeenCalledTimes(1); - expect(blockSimulator.startNewBlock).toHaveBeenCalledWith( + expect(blockBuilder.startNewBlock).toHaveBeenCalledTimes(1); + expect(blockBuilder.startNewBlock).toHaveBeenCalledWith( 3, mockedGlobalVariables, Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n)), ); expect(publisher.proposeL2Block).toHaveBeenCalledTimes(1); - expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), postFlushTxHashes); - expect(blockSimulator.cancel).toHaveBeenCalledTimes(0); + expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), postFlushTxHashes, undefined); }); it('aborts building a block if the chain moves underneath it', async () => { const tx = mockTxForRollup(); tx.data.constants.txContext.chainId = chainId; - const result: ProvingSuccess = { - status: PROVING_STATUS.SUCCESS, - }; - const ticket: ProvingTicket = { - provingPromise: Promise.resolve(result), - }; p2p.getTxs.mockReturnValueOnce([tx]); - blockSimulator.startNewBlock.mockResolvedValueOnce(ticket); - blockSimulator.finaliseBlock.mockResolvedValue({ block }); + blockBuilder.setBlockCompleted.mockResolvedValue(block); publisher.proposeL2Block.mockResolvedValueOnce(true); const mockedGlobalVariables = new GlobalVariables( @@ -580,6 +506,298 @@ describe('sequencer', () => { expect(publisher.proposeL2Block).not.toHaveBeenCalled(); }); + + describe('Handling proof quotes', () => { + let txHash: TxHash; + let currentEpoch = 0n; + const setupForBlockNumber = (blockNumber: number) => { + currentEpoch = BigInt(blockNumber) / BigInt(AZTEC_EPOCH_DURATION); + // Create a new block and header + block = L2Block.random(blockNumber); + + mockedGlobalVariables = new GlobalVariables( + chainId, + version, + block.header.globalVariables.blockNumber, + block.header.globalVariables.slotNumber, + Fr.ZERO, + coinbase, + feeRecipient, + gasFees, + ); + + worldState.status.mockResolvedValue({ + state: WorldStateRunningState.IDLE, + syncedToL2Block: block.header.globalVariables.blockNumber.toNumber() - 1, + }); + + p2p.getStatus.mockResolvedValue({ + syncedToL2Block: block.header.globalVariables.blockNumber.toNumber() - 1, + state: P2PClientState.IDLE, + }); + + l2BlockSource.getBlockNumber.mockResolvedValue(block.header.globalVariables.blockNumber.toNumber() - 1); + + l1ToL2MessageSource.getBlockNumber.mockResolvedValue(block.header.globalVariables.blockNumber.toNumber() - 1); + + globalVariableBuilder.buildGlobalVariables.mockResolvedValue(mockedGlobalVariables); + + publisher.canProposeAtNextEthBlock.mockResolvedValue([ + block.header.globalVariables.slotNumber.toBigInt(), + block.header.globalVariables.blockNumber.toBigInt(), + ]); + + publisher.getEpochForSlotNumber.mockImplementation((slotNumber: bigint) => + Promise.resolve(slotNumber / BigInt(AZTEC_EPOCH_DURATION)), + ); + + const tx = mockTxForRollup(); + tx.data.constants.txContext.chainId = chainId; + txHash = tx.getTxHash(); + + p2p.getTxs.mockReturnValue([tx]); + blockBuilder.setBlockCompleted.mockResolvedValue(block); + }; + + it('submits a valid proof quote with a block', async () => { + const blockNumber = AZTEC_EPOCH_DURATION + 1; + setupForBlockNumber(blockNumber); + + const proofQuote = mockEpochProofQuote( + currentEpoch - 1n, + block.header.globalVariables.slotNumber.toBigInt() + 1n, + 10000n, + EthAddress.random(), + 1, + ); + + p2p.getEpochProofQuotes.mockResolvedValue([proofQuote]); + publisher.proposeL2Block.mockResolvedValueOnce(true); + publisher.validateProofQuote.mockImplementation((x: EpochProofQuote) => Promise.resolve(x)); + + // The previous epoch can be claimed + publisher.nextEpochToClaim.mockImplementation(() => Promise.resolve(currentEpoch - 1n)); + + await sequencer.initialSync(); + await sequencer.work(); + expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), [txHash], proofQuote); + }); + + it('does not claim the epoch previous to the first', async () => { + const blockNumber = 1; + setupForBlockNumber(blockNumber); + + const proofQuote = mockEpochProofQuote( + 0n, + block.header.globalVariables.slotNumber.toBigInt() + 1n, + 10000n, + EthAddress.random(), + 1, + ); + + p2p.getEpochProofQuotes.mockResolvedValue([proofQuote]); + publisher.proposeL2Block.mockResolvedValueOnce(true); + publisher.validateProofQuote.mockImplementation((x: EpochProofQuote) => Promise.resolve(x)); + + // The previous epoch can be claimed + publisher.nextEpochToClaim.mockImplementation(() => Promise.resolve(0n)); + + await sequencer.initialSync(); + await sequencer.work(); + expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), [txHash], undefined); + }); + + it('does not submit a quote with an expired slot number', async () => { + const blockNumber = AZTEC_EPOCH_DURATION + 1; + setupForBlockNumber(blockNumber); + + const proofQuote = mockEpochProofQuote( + currentEpoch - 1n, + // Slot number expired + block.header.globalVariables.slotNumber.toBigInt() - 1n, + 10000n, + EthAddress.random(), + 1, + ); + + p2p.getEpochProofQuotes.mockResolvedValue([proofQuote]); + publisher.proposeL2Block.mockResolvedValueOnce(true); + publisher.validateProofQuote.mockImplementation((x: EpochProofQuote) => Promise.resolve(x)); + + // The previous epoch can be claimed + publisher.nextEpochToClaim.mockImplementation(() => Promise.resolve(currentEpoch - 1n)); + + await sequencer.initialSync(); + await sequencer.work(); + expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), [txHash], undefined); + }); + + it('does not submit a valid quote if unable to claim epoch', async () => { + const blockNumber = AZTEC_EPOCH_DURATION + 1; + setupForBlockNumber(blockNumber); + + const proofQuote = mockEpochProofQuote( + currentEpoch - 1n, + block.header.globalVariables.slotNumber.toBigInt() + 1n, + 10000n, + EthAddress.random(), + 1, + ); + + p2p.getEpochProofQuotes.mockResolvedValue([proofQuote]); + publisher.proposeL2Block.mockResolvedValueOnce(true); + publisher.validateProofQuote.mockImplementation((x: EpochProofQuote) => Promise.resolve(x)); + + // The previous epoch can be claimed + publisher.nextEpochToClaim.mockResolvedValue(currentEpoch); + + await sequencer.initialSync(); + await sequencer.work(); + expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), [txHash], undefined); + }); + + it('does not submit an invalid quote', async () => { + const blockNumber = AZTEC_EPOCH_DURATION + 1; + setupForBlockNumber(blockNumber); + + const proofQuote = mockEpochProofQuote( + currentEpoch - 1n, + block.header.globalVariables.slotNumber.toBigInt() + 1n, + 10000n, + EthAddress.random(), + 1, + ); + + p2p.getEpochProofQuotes.mockResolvedValue([proofQuote]); + publisher.proposeL2Block.mockResolvedValueOnce(true); + + // Quote is reported as invalid + publisher.validateProofQuote.mockImplementation(_ => Promise.resolve(undefined)); + + // The previous epoch can be claimed + publisher.nextEpochToClaim.mockImplementation(() => Promise.resolve(currentEpoch - 1n)); + + await sequencer.initialSync(); + await sequencer.work(); + expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), [txHash], undefined); + }); + + it('only selects valid quotes', async () => { + const blockNumber = AZTEC_EPOCH_DURATION + 1; + setupForBlockNumber(blockNumber); + + // Create 1 valid quote and 3 that have a higher fee but are invalid + const validProofQuote = mockEpochProofQuote( + currentEpoch - 1n, + block.header.globalVariables.slotNumber.toBigInt() + 1n, + 10000n, + EthAddress.random(), + 1, + ); + + const proofQuoteInvalidSlot = mockEpochProofQuote( + currentEpoch - 1n, + block.header.globalVariables.slotNumber.toBigInt() - 1n, + 10000n, + EthAddress.random(), + 2, + ); + + const proofQuoteInvalidEpoch = mockEpochProofQuote( + currentEpoch, + block.header.globalVariables.slotNumber.toBigInt() - 1n, + 10000n, + EthAddress.random(), + 2, + ); + + // This is deemed invalid by the contract, we identify it by a fee of 2 + const proofQuoteInvalid = mockEpochProofQuote( + currentEpoch - 1n, + block.header.globalVariables.slotNumber.toBigInt() + 1n, + 10000n, + EthAddress.random(), + 2, + ); + + const allQuotes = [validProofQuote, proofQuoteInvalidSlot, proofQuoteInvalidEpoch, proofQuoteInvalid]; + + p2p.getEpochProofQuotes.mockResolvedValue(allQuotes); + publisher.proposeL2Block.mockResolvedValueOnce(true); + + // Quote is reported as invalid + publisher.validateProofQuote.mockImplementation(p => + Promise.resolve(p.payload.basisPointFee === 2 ? undefined : p), + ); + + // The previous epoch can be claimed + publisher.nextEpochToClaim.mockImplementation(() => Promise.resolve(currentEpoch - 1n)); + + await sequencer.initialSync(); + await sequencer.work(); + expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), [txHash], validProofQuote); + }); + + it('selects the lowest cost valid quote', async () => { + const blockNumber = AZTEC_EPOCH_DURATION + 1; + setupForBlockNumber(blockNumber); + + // Create 3 valid quotes with different fees. + // And 3 invalid quotes with lower fees + // We should select the lowest cost valid quote + const validQuotes = times(3, (i: number) => + mockEpochProofQuote( + currentEpoch - 1n, + block.header.globalVariables.slotNumber.toBigInt() + 1n, + 10000n, + EthAddress.random(), + 10 + i, + ), + ); + + const proofQuoteInvalidSlot = mockEpochProofQuote( + currentEpoch - 1n, + block.header.globalVariables.slotNumber.toBigInt() - 1n, + 10000n, + EthAddress.random(), + 1, + ); + + const proofQuoteInvalidEpoch = mockEpochProofQuote( + currentEpoch, + block.header.globalVariables.slotNumber.toBigInt() - 1n, + 10000n, + EthAddress.random(), + 2, + ); + + // This is deemed invalid by the contract, we identify it by it's fee + const proofQuoteInvalid = mockEpochProofQuote( + currentEpoch - 1n, + block.header.globalVariables.slotNumber.toBigInt() + 1n, + 10000n, + EthAddress.random(), + 3, + ); + + const allQuotes = [proofQuoteInvalidSlot, proofQuoteInvalidEpoch, ...validQuotes, proofQuoteInvalid]; + + p2p.getEpochProofQuotes.mockResolvedValue(allQuotes); + publisher.proposeL2Block.mockResolvedValueOnce(true); + + // Quote is reported as invalid + publisher.validateProofQuote.mockImplementation(p => + Promise.resolve(p.payload.basisPointFee === 3 ? undefined : p), + ); + + // The previous epoch can be claimed + publisher.nextEpochToClaim.mockImplementation(() => Promise.resolve(currentEpoch - 1n)); + + await sequencer.initialSync(); + await sequencer.work(); + expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), [txHash], validQuotes[0]); + }); + }); }); class TestSubject extends Sequencer { diff --git a/yarn-project/sequencer-client/src/sequencer/sequencer.ts b/yarn-project/sequencer-client/src/sequencer/sequencer.ts index 04426ee93d0..29de9493108 100644 --- a/yarn-project/sequencer-client/src/sequencer/sequencer.ts +++ b/yarn-project/sequencer-client/src/sequencer/sequencer.ts @@ -1,5 +1,6 @@ import { type BlockAttestation, + type EpochProofQuote, type L1ToL2MessageSource, type L2Block, type L2BlockSource, @@ -10,7 +11,7 @@ import { type WorldStateStatus, type WorldStateSynchronizer, } from '@aztec/circuit-types'; -import { type AllowedElement, BlockProofError, PROVING_STATUS } from '@aztec/circuit-types/interfaces'; +import { type AllowedElement, BlockProofError } from '@aztec/circuit-types/interfaces'; import { type L2BlockBuiltStats } from '@aztec/circuit-types/stats'; import { AppendOnlyTreeSnapshot, @@ -31,10 +32,12 @@ import { type PublicProcessorFactory } from '@aztec/simulator'; import { Attributes, type TelemetryClient, type Tracer, trackSpan } from '@aztec/telemetry-client'; import { type ValidatorClient } from '@aztec/validator-client'; +import { inspect } from 'util'; + import { type BlockBuilderFactory } from '../block_builder/index.js'; import { type GlobalVariableBuilder } from '../global_variable_builder/global_builder.js'; import { type L1Publisher } from '../publisher/l1-publisher.js'; -import { prettyLogVeimError } from '../publisher/utils.js'; +import { prettyLogViemError } from '../publisher/utils.js'; import { type TxValidatorFactory } from '../tx_validator/tx_validator_factory.js'; import { type SequencerConfig } from './config.js'; import { SequencerMetrics } from './metrics.js'; @@ -311,7 +314,7 @@ export class Sequencer { this.log.debug(`Can propose block ${proposalBlockNumber} at slot ${slot}`); return slot; } catch (err) { - prettyLogVeimError(err, this.log); + prettyLogViemError(err, this.log); throw err; } } @@ -404,6 +407,14 @@ export class Sequencer { const newGlobalVariables = proposalHeader.globalVariables; + // Kick off the process of collecting and validating proof quotes here so it runs alongside block building + const proofQuotePromise = this.createProofClaimForPreviousEpoch(newGlobalVariables.slotNumber.toBigInt()).catch( + e => { + this.log.warn(`Failed to create proof claim quote ${e}`); + return undefined; + }, + ); + this.metrics.recordNewBlock(newGlobalVariables.blockNumber.toNumber(), validTxs.length); const workTimer = new Timer(); this.state = SequencerState.CREATING_BLOCK; @@ -424,7 +435,7 @@ export class Sequencer { const blockBuildingTimer = new Timer(); const blockBuilder = this.blockBuilderFactory.create(this.worldState.getLatest()); - const blockTicket = await blockBuilder.startNewBlock(blockSize, newGlobalVariables, l1ToL2Messages); + await blockBuilder.startNewBlock(blockSize, newGlobalVariables, l1ToL2Messages); const [publicProcessorDuration, [processedTxs, failedTxs]] = await elapsed(() => processor.process(validTxs, blockSize, blockBuilder, this.txValidatorFactory.validatorForProcessedTxs()), @@ -443,23 +454,15 @@ export class Sequencer { processedTxsCount: processedTxs.length, }) ) { - blockBuilder.cancel(); + // TODO: Roll back changes to world state throw new Error('Should not propose the block'); } // All real transactions have been added, set the block as full and complete the proving. - await blockBuilder.setBlockCompleted(); + const block = await blockBuilder.setBlockCompleted(); - // Here we are now waiting for the block to be proven (using simulated[fake] proofs). // TODO(@PhilWindle) We should probably periodically check for things like another // block being published before ours instead of just waiting on our block - const result = await blockTicket.provingPromise; - if (result.status === PROVING_STATUS.FAILURE) { - throw new Error(`Block proving failed, reason: ${result.reason}`); - } - - // Block is ready, now finalise - const { block } = await blockBuilder.finaliseBlock(); await this.publisher.validateBlockForSubmission(block.header); @@ -488,13 +491,17 @@ export class Sequencer { const attestations = await this.collectAttestations(block, txHashes); this.log.verbose('Attestations collected'); + const proofQuote = await proofQuotePromise; + + this.log.verbose(proofQuote ? `Using proof quote ${inspect(proofQuote.payload)}` : 'No proof quote available'); + try { - await this.publishL2Block(block, attestations, txHashes); + await this.publishL2Block(block, attestations, txHashes, proofQuote); this.metrics.recordPublishedBlock(workDuration); this.log.info( `Submitted rollup block ${block.number} with ${ processedTxs.length - } transactions duration=${workDuration}ms (Submitter: ${await this.publisher.getSenderAddress()})`, + } transactions duration=${workDuration}ms (Submitter: ${this.publisher.getSenderAddress()})`, ); } catch (err) { this.metrics.recordFailedBlock(); @@ -540,6 +547,45 @@ export class Sequencer { return orderAttestations(attestations, committee); } + protected async createProofClaimForPreviousEpoch(slotNumber: bigint): Promise { + // Find out which epoch we are currently in + const epochForBlock = await this.publisher.getEpochForSlotNumber(slotNumber); + if (epochForBlock < 1n) { + // It's the 0th epoch, nothing to be proven yet + this.log.verbose(`First epoch has no claim`); + return undefined; + } + const epochToProve = epochForBlock - 1n; + // Find out the next epoch that can be claimed + const canClaim = await this.publisher.nextEpochToClaim(); + if (canClaim != epochToProve) { + // It's not the one we are looking to claim + this.log.verbose(`Unable to claim previous epoch (${canClaim} != ${epochToProve})`); + return undefined; + } + // Get quotes for the epoch to be proven + const quotes = await this.p2pClient.getEpochProofQuotes(epochToProve); + this.log.verbose(`Retrieved ${quotes.length} quotes, slot: ${slotNumber}, epoch to prove: ${epochToProve}`); + for (const quote of quotes) { + this.log.verbose(inspect(quote.payload)); + } + // ensure these quotes are still valid for the slot and have the contract validate them + const validQuotesPromise = Promise.all( + quotes.filter(x => x.payload.validUntilSlot >= slotNumber).map(x => this.publisher.validateProofQuote(x)), + ); + + const validQuotes = (await validQuotesPromise).filter((q): q is EpochProofQuote => !!q); + if (!validQuotes.length) { + this.log.verbose(`Failed to find any valid proof quotes`); + return undefined; + } + // pick the quote with the lowest fee + const sortedQuotes = validQuotes.sort( + (a: EpochProofQuote, b: EpochProofQuote) => a.payload.basisPointFee - b.payload.basisPointFee, + ); + return sortedQuotes[0]; + } + /** * Publishes the L2Block to the rollup contract. * @param block - The L2Block to be published. @@ -547,11 +593,16 @@ export class Sequencer { @trackSpan('Sequencer.publishL2Block', block => ({ [Attributes.BLOCK_NUMBER]: block.number, })) - protected async publishL2Block(block: L2Block, attestations?: Signature[], txHashes?: TxHash[]) { + protected async publishL2Block( + block: L2Block, + attestations?: Signature[], + txHashes?: TxHash[], + proofQuote?: EpochProofQuote, + ) { // Publishes new block to the network and awaits the tx to be mined this.state = SequencerState.PUBLISHING_BLOCK; - const publishedL2Block = await this.publisher.proposeL2Block(block, attestations, txHashes); + const publishedL2Block = await this.publisher.proposeL2Block(block, attestations, txHashes, proofQuote); if (publishedL2Block) { this.lastPublishedBlock = block.number; } else { diff --git a/yarn-project/sequencer-client/src/tx_validator/gas_validator.test.ts b/yarn-project/sequencer-client/src/tx_validator/gas_validator.test.ts index c14b8792083..23f368a4dd9 100644 --- a/yarn-project/sequencer-client/src/tx_validator/gas_validator.test.ts +++ b/yarn-project/sequencer-client/src/tx_validator/gas_validator.test.ts @@ -1,6 +1,6 @@ import { type Tx, mockTx } from '@aztec/circuit-types'; import { AztecAddress, Fr, FunctionSelector, GasSettings } from '@aztec/circuits.js'; -import { pedersenHash } from '@aztec/foundation/crypto'; +import { poseidon2Hash } from '@aztec/foundation/crypto'; import { FeeJuiceContract } from '@aztec/noir-contracts.js'; import { FeeJuiceAddress } from '@aztec/protocol-contracts/fee-juice'; @@ -37,7 +37,7 @@ describe('GasTxValidator', () => { inclusionFee: new Fr(TX_FEE), }); payer = tx.data.feePayer; - expectedBalanceSlot = pedersenHash([FeeJuiceContract.storage.balances.slot, payer]); + expectedBalanceSlot = poseidon2Hash([FeeJuiceContract.storage.balances.slot, payer]); expect(tx.data.constants.txContext.gasSettings.getFeeLimit()).toEqual(new Fr(TX_FEE)); }); diff --git a/yarn-project/simulator/src/acvm/oracle/oracle.ts b/yarn-project/simulator/src/acvm/oracle/oracle.ts index cab30078dc7..cb3bf8041b2 100644 --- a/yarn-project/simulator/src/acvm/oracle/oracle.ts +++ b/yarn-project/simulator/src/acvm/oracle/oracle.ts @@ -1,8 +1,7 @@ import { MerkleTreeId, UnencryptedL2Log } from '@aztec/circuit-types'; -import { KeyValidationRequest } from '@aztec/circuits.js'; import { FunctionSelector, NoteSelector } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; -import { Fr, Point } from '@aztec/foundation/fields'; +import { Fr } from '@aztec/foundation/fields'; import { type ACVMField } from '../acvm_types.js'; import { frToBoolean, frToNumber, fromACVMField } from '../deserialize.js'; @@ -329,72 +328,6 @@ export class Oracle { this.typedOracle.emitEncryptedNoteLog(+noteHashCounter, processedInput, +counter); } - computeEncryptedEventLog( - [contractAddress]: ACVMField[], - [randomness]: ACVMField[], - [eventTypeId]: ACVMField[], - [ovskApp]: ACVMField[], - [ovpkMX]: ACVMField[], - [ovpkMY]: ACVMField[], - [ovpkMIsInfinite]: ACVMField[], - [ivpkMX]: ACVMField[], - [ivpkMY]: ACVMField[], - [ivpkMIsInfinite]: ACVMField[], - [recipient]: ACVMField[], - preimage: ACVMField[], - ): ACVMField[] { - const ovpkM = new Point(fromACVMField(ovpkMX), fromACVMField(ovpkMY), !fromACVMField(ovpkMIsInfinite).isZero()); - const ovKeys = new KeyValidationRequest(ovpkM, Fr.fromString(ovskApp)); - const ivpkM = new Point(fromACVMField(ivpkMX), fromACVMField(ivpkMY), !fromACVMField(ivpkMIsInfinite).isZero()); - const encLog = this.typedOracle.computeEncryptedEventLog( - AztecAddress.fromString(contractAddress), - Fr.fromString(randomness), - Fr.fromString(eventTypeId), - ovKeys, - ivpkM, - AztecAddress.fromString(recipient), - preimage.map(fromACVMField), - ); - const bytes: ACVMField[] = []; - encLog.forEach(v => { - bytes.push(toACVMField(v)); - }); - return bytes; - } - - computeEncryptedNoteLog( - [contractAddress]: ACVMField[], - [storageSlot]: ACVMField[], - [noteTypeId]: ACVMField[], - [ovskApp]: ACVMField[], - [ovpkMX]: ACVMField[], - [ovpkMY]: ACVMField[], - [ovpkMIsInfinite]: ACVMField[], - [ivpkMX]: ACVMField[], - [ivpkMY]: ACVMField[], - [ivpkMIsInfinite]: ACVMField[], - [recipient]: ACVMField[], - preimage: ACVMField[], - ): ACVMField[] { - const ovpkM = new Point(fromACVMField(ovpkMX), fromACVMField(ovpkMY), !fromACVMField(ovpkMIsInfinite).isZero()); - const ovKeys = new KeyValidationRequest(ovpkM, Fr.fromString(ovskApp)); - const ivpkM = new Point(fromACVMField(ivpkMX), fromACVMField(ivpkMY), !fromACVMField(ivpkMIsInfinite).isZero()); - const encLog = this.typedOracle.computeEncryptedNoteLog( - AztecAddress.fromString(contractAddress), - Fr.fromString(storageSlot), - NoteSelector.fromField(Fr.fromString(noteTypeId)), - ovKeys, - ivpkM, - AztecAddress.fromString(recipient), - preimage.map(fromACVMField), - ); - const bytes: ACVMField[] = []; - encLog.forEach(v => { - bytes.push(toACVMField(v)); - }); - return bytes; - } - emitUnencryptedLog([contractAddress]: ACVMField[], message: ACVMField[], [counter]: ACVMField[]): ACVMField { const logPayload = Buffer.concat(message.map(fromACVMField).map(f => f.toBuffer())); const log = new UnencryptedL2Log(AztecAddress.fromString(contractAddress), logPayload); @@ -479,17 +412,4 @@ export class Oracle { notifySetMinRevertibleSideEffectCounter([minRevertibleSideEffectCounter]: ACVMField[]) { this.typedOracle.notifySetMinRevertibleSideEffectCounter(frToNumber(fromACVMField(minRevertibleSideEffectCounter))); } - - aes128Encrypt(input: ACVMField[], initializationVector: ACVMField[], key: ACVMField[]): ACVMField[] { - // Convert each field to a number and then to a buffer (1 byte is stored in 1 field) - const processedInput = Buffer.from(input.map(fromACVMField).map(f => f.toNumber())); - const processedIV = Buffer.from(initializationVector.map(fromACVMField).map(f => f.toNumber())); - const processedKey = Buffer.from(key.map(fromACVMField).map(f => f.toNumber())); - - // Encrypt the input - const ciphertext = this.typedOracle.aes128Encrypt(processedInput, processedIV, processedKey); - - // Convert each byte of ciphertext to a field and return it - return Array.from(ciphertext).map(byte => toACVMField(byte)); - } } diff --git a/yarn-project/simulator/src/acvm/oracle/typed_oracle.ts b/yarn-project/simulator/src/acvm/oracle/typed_oracle.ts index 1b9dae81e8a..63dcb34a735 100644 --- a/yarn-project/simulator/src/acvm/oracle/typed_oracle.ts +++ b/yarn-project/simulator/src/acvm/oracle/typed_oracle.ts @@ -5,7 +5,6 @@ import { type NoteStatus, type NullifierMembershipWitness, type PublicDataWitness, - type PublicKey, type SiblingPath, type UnencryptedL2Log, } from '@aztec/circuit-types'; @@ -204,30 +203,6 @@ export abstract class TypedOracle { throw new OracleMethodNotAvailableError('emitEncryptedNoteLog'); } - computeEncryptedEventLog( - _contractAddress: AztecAddress, - _randomness: Fr, - _eventTypeId: Fr, - _ovKeys: KeyValidationRequest, - _ivpkM: PublicKey, - _recipient: AztecAddress, - _preimage: Fr[], - ): Buffer { - throw new OracleMethodNotAvailableError('computeEncryptedEventLog'); - } - - computeEncryptedNoteLog( - _contractAddress: AztecAddress, - _storageSlot: Fr, - _noteTypeId: NoteSelector, - _ovKeys: KeyValidationRequest, - _ivpkM: PublicKey, - _recipient: AztecAddress, - _preimage: Fr[], - ): Buffer { - throw new OracleMethodNotAvailableError('computeEncryptedNoteLog'); - } - emitUnencryptedLog(_log: UnencryptedL2Log, _counter: number): void { throw new OracleMethodNotAvailableError('emitUnencryptedLog'); } @@ -273,10 +248,6 @@ export abstract class TypedOracle { throw new OracleMethodNotAvailableError('notifySetMinRevertibleSideEffectCounter'); } - aes128Encrypt(_input: Buffer, _initializationVector: Buffer, _key: Buffer): Buffer { - throw new OracleMethodNotAvailableError('encrypt'); - } - debugLog(_message: string, _fields: Fr[]): void { throw new OracleMethodNotAvailableError('debugLog'); } diff --git a/yarn-project/simulator/src/avm/avm_memory_types.ts b/yarn-project/simulator/src/avm/avm_memory_types.ts index f590c6a40cf..4818e3dcee6 100644 --- a/yarn-project/simulator/src/avm/avm_memory_types.ts +++ b/yarn-project/simulator/src/avm/avm_memory_types.ts @@ -413,7 +413,7 @@ export class TaggedMemory implements TaggedMemoryInterface { } /** No-op. Implemented here for compatibility with the MeteredTaggedMemory. */ - public assert(_operations: Partial) {} + public assert(_operations: Partial) {} } /** Tagged memory wrapper with metering for each memory read and write operation. */ @@ -435,10 +435,15 @@ export class MeteredTaggedMemory implements TaggedMemoryInterface { * Asserts that the exact number of memory operations have been performed. * Indirect represents the flags for indirect accesses: each bit set to one counts as an extra read. */ - public assert(operations: Partial) { - const { reads: expectedReads, writes: expectedWrites, indirect } = { reads: 0, writes: 0, ...operations }; - - const totalExpectedReads = expectedReads + Addressing.fromWire(indirect ?? 0).count(AddressingMode.INDIRECT); + public assert(operations: Partial) { + const { + reads: expectedReads, + writes: expectedWrites, + addressing, + } = { reads: 0, writes: 0, addressing: new Addressing([]), ...operations }; + + const totalExpectedReads = + expectedReads + addressing.count(AddressingMode.INDIRECT) + addressing.count(AddressingMode.RELATIVE); const { reads: actualReads, writes: actualWrites } = this.reset(); if (actualReads !== totalExpectedReads) { throw new InstructionExecutionError( diff --git a/yarn-project/simulator/src/avm/journal/journal.test.ts b/yarn-project/simulator/src/avm/journal/journal.test.ts index 07efb46a647..09e368f0100 100644 --- a/yarn-project/simulator/src/avm/journal/journal.test.ts +++ b/yarn-project/simulator/src/avm/journal/journal.test.ts @@ -139,9 +139,9 @@ describe('journal', () => { it('Should maintain l1 messages', () => { const recipient = new Fr(1); - persistableState.writeL2ToL1Message(recipient, utxo); + persistableState.writeL2ToL1Message(address, recipient, utxo); expect(trace.traceNewL2ToL1Message).toHaveBeenCalledTimes(1); - expect(trace.traceNewL2ToL1Message).toHaveBeenCalledWith(recipient, utxo); + expect(trace.traceNewL2ToL1Message).toHaveBeenCalledWith(address, recipient, utxo); }); }); diff --git a/yarn-project/simulator/src/avm/journal/journal.ts b/yarn-project/simulator/src/avm/journal/journal.ts index 843b6ed90ae..b26c4041838 100644 --- a/yarn-project/simulator/src/avm/journal/journal.ts +++ b/yarn-project/simulator/src/avm/journal/journal.ts @@ -187,12 +187,13 @@ export class AvmPersistableStateManager { /** * Write an L2 to L1 message. + * @param contractAddress - L2 contract address that created this message * @param recipient - L1 contract address to send the message to. * @param content - Message content. */ - public writeL2ToL1Message(recipient: Fr, content: Fr) { - this.log.debug(`L1Messages(${recipient}) += ${content}.`); - this.trace.traceNewL2ToL1Message(recipient, content); + public writeL2ToL1Message(contractAddress: Fr, recipient: Fr, content: Fr) { + this.log.debug(`L2ToL1Messages(${contractAddress}) += (recipient: ${recipient}, content: ${content}).`); + this.trace.traceNewL2ToL1Message(contractAddress, recipient, content); } /** diff --git a/yarn-project/simulator/src/avm/opcodes/accrued_substate.test.ts b/yarn-project/simulator/src/avm/opcodes/accrued_substate.test.ts index 442bb985ba3..14841c01950 100644 --- a/yarn-project/simulator/src/avm/opcodes/accrued_substate.test.ts +++ b/yarn-project/simulator/src/avm/opcodes/accrued_substate.test.ts @@ -362,7 +362,7 @@ describe('Accrued Substate', () => { /*contentOffset=*/ value1Offset, ).execute(context); expect(trace.traceNewL2ToL1Message).toHaveBeenCalledTimes(1); - expect(trace.traceNewL2ToL1Message).toHaveBeenCalledWith(/*recipient=*/ value0, /*content=*/ value1); + expect(trace.traceNewL2ToL1Message).toHaveBeenCalledWith(address, /*recipient=*/ value0, /*content=*/ value1); }); }); diff --git a/yarn-project/simulator/src/avm/opcodes/accrued_substate.ts b/yarn-project/simulator/src/avm/opcodes/accrued_substate.ts index 1a7277d9515..e5c1b7c3b0b 100644 --- a/yarn-project/simulator/src/avm/opcodes/accrued_substate.ts +++ b/yarn-project/simulator/src/avm/opcodes/accrued_substate.ts @@ -28,13 +28,11 @@ export class NoteHashExists extends Instruction { } public async execute(context: AvmContext): Promise { - const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); - const [noteHashOffset, leafIndexOffset, existsOffset] = Addressing.fromWire(this.indirect).resolve( - [this.noteHashOffset, this.leafIndexOffset, this.existsOffset], - memory, - ); + context.machineState.consumeGas(this.gasCost()); + const operands = [this.noteHashOffset, this.leafIndexOffset, this.existsOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [noteHashOffset, leafIndexOffset, existsOffset] = addressing.resolve(operands, memory); memory.checkTags(TypeTag.FIELD, noteHashOffset, leafIndexOffset); // Note that this instruction accepts any type in memory, and converts to Field. @@ -48,7 +46,7 @@ export class NoteHashExists extends Instruction { ); memory.set(existsOffset, exists ? new Uint8(1) : new Uint8(0)); - memory.assert(memoryOperations); + memory.assert({ reads: 2, writes: 1, addressing }); context.machineState.incrementPc(); } } @@ -64,11 +62,12 @@ export class EmitNoteHash extends Instruction { } public async execute(context: AvmContext): Promise { - const memoryOperations = { reads: 1, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); - const [noteHashOffset] = Addressing.fromWire(this.indirect).resolve([this.noteHashOffset], memory); + const operands = [this.noteHashOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [noteHashOffset] = addressing.resolve(operands, memory); memory.checkTag(TypeTag.FIELD, noteHashOffset); if (context.environment.isStaticCall) { @@ -78,7 +77,7 @@ export class EmitNoteHash extends Instruction { const noteHash = memory.get(noteHashOffset).toFr(); context.persistableState.writeNoteHash(context.environment.storageAddress, noteHash); - memory.assert(memoryOperations); + memory.assert({ reads: 1, addressing }); context.machineState.incrementPc(); } } @@ -105,14 +104,12 @@ export class NullifierExists extends Instruction { } public async execute(context: AvmContext): Promise { - const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); - const [nullifierOffset, addressOffset, existsOffset] = Addressing.fromWire(this.indirect).resolve( - [this.nullifierOffset, this.addressOffset, this.existsOffset], - memory, - ); + const operands = [this.nullifierOffset, this.addressOffset, this.existsOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [nullifierOffset, addressOffset, existsOffset] = addressing.resolve(operands, memory); memory.checkTags(TypeTag.FIELD, nullifierOffset, addressOffset); const nullifier = memory.get(nullifierOffset).toFr(); @@ -121,7 +118,7 @@ export class NullifierExists extends Instruction { memory.set(existsOffset, exists ? new Uint8(1) : new Uint8(0)); - memory.assert(memoryOperations); + memory.assert({ reads: 2, writes: 1, addressing }); context.machineState.incrementPc(); } } @@ -141,11 +138,12 @@ export class EmitNullifier extends Instruction { throw new StaticCallAlterationError(); } - const memoryOperations = { reads: 1, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); - const [nullifierOffset] = Addressing.fromWire(this.indirect).resolve([this.nullifierOffset], memory); + const operands = [this.nullifierOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [nullifierOffset] = addressing.resolve(operands, memory); memory.checkTag(TypeTag.FIELD, nullifierOffset); const nullifier = memory.get(nullifierOffset).toFr(); @@ -162,7 +160,7 @@ export class EmitNullifier extends Instruction { } } - memory.assert(memoryOperations); + memory.assert({ reads: 1, addressing }); context.machineState.incrementPc(); } } @@ -189,14 +187,12 @@ export class L1ToL2MessageExists extends Instruction { } public async execute(context: AvmContext): Promise { - const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); - const [msgHashOffset, msgLeafIndexOffset, existsOffset] = Addressing.fromWire(this.indirect).resolve( - [this.msgHashOffset, this.msgLeafIndexOffset, this.existsOffset], - memory, - ); + const operands = [this.msgHashOffset, this.msgLeafIndexOffset, this.existsOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [msgHashOffset, msgLeafIndexOffset, existsOffset] = addressing.resolve(operands, memory); memory.checkTags(TypeTag.FIELD, msgHashOffset, msgLeafIndexOffset); const msgHash = memory.get(msgHashOffset).toFr(); @@ -208,7 +204,7 @@ export class L1ToL2MessageExists extends Instruction { ); memory.set(existsOffset, exists ? new Uint8(1) : new Uint8(0)); - memory.assert(memoryOperations); + memory.assert({ reads: 2, writes: 1, addressing }); context.machineState.incrementPc(); } } @@ -230,22 +226,20 @@ export class EmitUnencryptedLog extends Instruction { const memory = context.machineState.memory.track(this.type); - const [logOffset, logSizeOffset] = Addressing.fromWire(this.indirect).resolve( - [this.logOffset, this.logSizeOffset], - memory, - ); + const operands = [this.logOffset, this.logSizeOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [logOffset, logSizeOffset] = addressing.resolve(operands, memory); memory.checkTag(TypeTag.UINT32, logSizeOffset); const logSize = memory.get(logSizeOffset).toNumber(); memory.checkTagsRange(TypeTag.FIELD, logOffset, logSize); const contractAddress = context.environment.address; - const memoryOperations = { reads: 1 + logSize, indirect: this.indirect }; - context.machineState.consumeGas(this.gasCost({ ...memoryOperations, dynMultiplier: logSize })); + context.machineState.consumeGas(this.gasCost(logSize)); const log = memory.getSlice(logOffset, logSize).map(f => f.toFr()); context.persistableState.writeUnencryptedLog(contractAddress, log); - memory.assert(memoryOperations); + memory.assert({ reads: 1 + logSize, addressing }); context.machineState.incrementPc(); } } @@ -265,20 +259,18 @@ export class SendL2ToL1Message extends Instruction { throw new StaticCallAlterationError(); } - const memoryOperations = { reads: 2, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); - const [recipientOffset, contentOffset] = Addressing.fromWire(this.indirect).resolve( - [this.recipientOffset, this.contentOffset], - memory, - ); + const operands = [this.recipientOffset, this.contentOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [recipientOffset, contentOffset] = addressing.resolve(operands, memory); const recipient = memory.get(recipientOffset).toFr(); const content = memory.get(contentOffset).toFr(); - context.persistableState.writeL2ToL1Message(recipient, content); + context.persistableState.writeL2ToL1Message(context.environment.address, recipient, content); - memory.assert(memoryOperations); + memory.assert({ reads: 2, addressing }); context.machineState.incrementPc(); } } diff --git a/yarn-project/simulator/src/avm/opcodes/addressing_mode.ts b/yarn-project/simulator/src/avm/opcodes/addressing_mode.ts index 911f297f784..2d054f7a299 100644 --- a/yarn-project/simulator/src/avm/opcodes/addressing_mode.ts +++ b/yarn-project/simulator/src/avm/opcodes/addressing_mode.ts @@ -3,9 +3,10 @@ import { strict as assert } from 'assert'; import { type TaggedMemoryInterface } from '../avm_memory_types.js'; export enum AddressingMode { - DIRECT, - INDIRECT, - INDIRECT_PLUS_CONSTANT, // Not implemented yet. + DIRECT = 0, + INDIRECT = 1, + RELATIVE = 2, + INDIRECT_RELATIVE = 3, } /** A class to represent the addressing mode of an instruction. */ @@ -13,16 +14,17 @@ export class Addressing { public constructor( /** The addressing mode for each operand. The length of this array is the number of operands of the instruction. */ private readonly modePerOperand: AddressingMode[], - ) { - assert(modePerOperand.length <= 8, 'At most 8 operands are supported'); - } + ) {} - public static fromWire(wireModes: number): Addressing { + // TODO(facundo): 8 for backwards compatibility. + public static fromWire(wireModes: number, numOperands: number = 8): Addressing { // The modes are stored in the wire format as a byte, with each bit representing the mode for an operand. // The least significant bit represents the zeroth operand, and the most significant bit represents the last operand. - const modes = new Array(8); - for (let i = 0; i < 8; i++) { - modes[i] = (wireModes & (1 << i)) === 0 ? AddressingMode.DIRECT : AddressingMode.INDIRECT; + const modes = new Array(numOperands); + for (let i = 0; i < numOperands; i++) { + modes[i] = + (((wireModes >> i) & 1) * AddressingMode.INDIRECT) | + (((wireModes >> (i + numOperands)) & 1) * AddressingMode.RELATIVE); } return new Addressing(modes); } @@ -31,17 +33,20 @@ export class Addressing { // The modes are stored in the wire format as a byte, with each bit representing the mode for an operand. // The least significant bit represents the zeroth operand, and the least significant bit represents the last operand. let wire: number = 0; - for (let i = 0; i < 8; i++) { - if (this.modePerOperand[i] === AddressingMode.INDIRECT) { + for (let i = 0; i < this.modePerOperand.length; i++) { + if (this.modePerOperand[i] & AddressingMode.INDIRECT) { wire |= 1 << i; } + if (this.modePerOperand[i] & AddressingMode.RELATIVE) { + wire |= 1 << (this.modePerOperand.length + i); + } } return wire; } /** Returns how many operands use the given addressing mode. */ public count(mode: AddressingMode): number { - return this.modePerOperand.filter(m => m === mode).length; + return this.modePerOperand.filter(m => (m & mode) !== 0).length; } /** @@ -54,17 +59,15 @@ export class Addressing { assert(offsets.length <= this.modePerOperand.length); const resolved = new Array(offsets.length); for (const [i, offset] of offsets.entries()) { - switch (this.modePerOperand[i]) { - case AddressingMode.INDIRECT: - // NOTE(reviewer): less than equal is a deviation from the spec - i dont see why this shouldnt be possible! - mem.checkIsValidMemoryOffsetTag(offset); - resolved[i] = Number(mem.get(offset).toBigInt()); - break; - case AddressingMode.DIRECT: - resolved[i] = offset; - break; - default: - throw new Error(`Unimplemented addressing mode: ${AddressingMode[this.modePerOperand[i]]}`); + const mode = this.modePerOperand[i]; + resolved[i] = offset; + if (mode & AddressingMode.RELATIVE) { + mem.checkIsValidMemoryOffsetTag(0); + resolved[i] += Number(mem.get(0).toBigInt()); + } + if (mode & AddressingMode.INDIRECT) { + mem.checkIsValidMemoryOffsetTag(resolved[i]); + resolved[i] = Number(mem.get(resolved[i]).toBigInt()); } } return resolved; diff --git a/yarn-project/simulator/src/avm/opcodes/arithmetic.test.ts b/yarn-project/simulator/src/avm/opcodes/arithmetic.test.ts index 3360317c3d6..79ee194be5d 100644 --- a/yarn-project/simulator/src/avm/opcodes/arithmetic.test.ts +++ b/yarn-project/simulator/src/avm/opcodes/arithmetic.test.ts @@ -2,6 +2,7 @@ import { type AvmContext } from '../avm_context.js'; import { Field, TypeTag, Uint8, Uint16, Uint32, Uint64, Uint128 } from '../avm_memory_types.js'; import { initContext } from '../fixtures/index.js'; import { Opcode } from '../serialization/instruction_serialization.js'; +import { Addressing, AddressingMode } from './addressing_mode.js'; import { Add, Div, FieldDiv, Mul, Sub } from './arithmetic.js'; describe('Arithmetic Instructions', () => { @@ -54,6 +55,32 @@ describe('Arithmetic Instructions', () => { }); }); + it('Should add in relative indirect mode', async () => { + const a = new Field(1n); + const b = new Field(2n); + + context.machineState.memory.set(10, a); + context.machineState.memory.set(11, b); + + context.machineState.memory.set(0, new Uint32(30)); // stack pointer + context.machineState.memory.set(32, new Uint32(5)); // indirect + + await new Add( + /*indirect=*/ new Addressing([ + /*aOffset*/ AddressingMode.DIRECT, + /*bOffset*/ AddressingMode.DIRECT, + /*dstOffset*/ AddressingMode.INDIRECT | AddressingMode.RELATIVE, + ]).toWire(), + /*inTag=*/ TypeTag.FIELD, + /*aOffset=*/ 10, + /*bOffset=*/ 11, + /*dstOffset=*/ 2, // We expect the result to be stored at MEM[30 + 2] = 5 + ).execute(context); + + const actual = context.machineState.memory.get(5); + expect(actual).toEqual(new Field(3n)); + }); + describe.each([ [new Field((Field.MODULUS + 1n) / 2n), new Field(1n), TypeTag.FIELD], [new Uint8((1n << 7n) + 1n), new Uint8(2n), TypeTag.UINT8], diff --git a/yarn-project/simulator/src/avm/opcodes/arithmetic.ts b/yarn-project/simulator/src/avm/opcodes/arithmetic.ts index acffa20c85d..6aed60df9bf 100644 --- a/yarn-project/simulator/src/avm/opcodes/arithmetic.ts +++ b/yarn-project/simulator/src/avm/opcodes/arithmetic.ts @@ -6,14 +6,12 @@ import { ThreeOperandInstruction } from './instruction_impl.js'; export abstract class ThreeOperandArithmeticInstruction extends ThreeOperandInstruction { public async execute(context: AvmContext): Promise { - const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); - const [aOffset, bOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve( - [this.aOffset, this.bOffset, this.dstOffset], - memory, - ); + const operands = [this.aOffset, this.bOffset, this.dstOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory); memory.checkTags(this.inTag, aOffset, bOffset); const a = memory.get(aOffset); @@ -22,7 +20,7 @@ export abstract class ThreeOperandArithmeticInstruction extends ThreeOperandInst const dest = this.compute(a, b); memory.set(dstOffset, dest); - memory.assert(memoryOperations); + memory.assert({ reads: 2, writes: 1, addressing }); context.machineState.incrementPc(); } diff --git a/yarn-project/simulator/src/avm/opcodes/bitwise.ts b/yarn-project/simulator/src/avm/opcodes/bitwise.ts index a7383cc5a8c..72592ed9f2f 100644 --- a/yarn-project/simulator/src/avm/opcodes/bitwise.ts +++ b/yarn-project/simulator/src/avm/opcodes/bitwise.ts @@ -7,14 +7,12 @@ import { ThreeOperandInstruction } from './instruction_impl.js'; abstract class ThreeOperandBitwiseInstruction extends ThreeOperandInstruction { public async execute(context: AvmContext): Promise { - const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); - const [aOffset, bOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve( - [this.aOffset, this.bOffset, this.dstOffset], - memory, - ); + const operands = [this.aOffset, this.bOffset, this.dstOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory); this.checkTags(memory, this.inTag, aOffset, bOffset); const a = memory.getAs(aOffset); @@ -23,7 +21,7 @@ abstract class ThreeOperandBitwiseInstruction extends ThreeOperandInstruction { const res = this.compute(a, b); memory.set(dstOffset, res); - memory.assert(memoryOperations); + memory.assert({ reads: 2, writes: 1, addressing }); context.machineState.incrementPc(); } @@ -98,18 +96,19 @@ export class Not extends Instruction { } public async execute(context: AvmContext): Promise { - const memoryOperations = { reads: 1, writes: 1, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); - const [srcOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve([this.srcOffset, this.dstOffset], memory); + const operands = [this.srcOffset, this.dstOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [srcOffset, dstOffset] = addressing.resolve(operands, memory); TaggedMemory.checkIsIntegralTag(memory.getTag(srcOffset)); const value = memory.getAs(srcOffset); const res = value.not(); memory.set(dstOffset, res); - memory.assert(memoryOperations); + memory.assert({ reads: 1, writes: 1, addressing }); context.machineState.incrementPc(); } } diff --git a/yarn-project/simulator/src/avm/opcodes/commitment.ts b/yarn-project/simulator/src/avm/opcodes/commitment.ts index 57488cf22fc..a98a21abec2 100644 --- a/yarn-project/simulator/src/avm/opcodes/commitment.ts +++ b/yarn-project/simulator/src/avm/opcodes/commitment.ts @@ -32,10 +32,10 @@ export class PedersenCommitment extends Instruction { public async execute(context: AvmContext): Promise { const memory = context.machineState.memory.track(this.type); - const [inputOffset, outputOffset, inputSizeOffset, genIndexOffset] = Addressing.fromWire(this.indirect).resolve( - [this.inputOffset, this.outputOffset, this.inputSizeOffset, this.genIndexOffset], - memory, - ); + + const operands = [this.inputOffset, this.outputOffset, this.inputSizeOffset, this.genIndexOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [inputOffset, outputOffset, inputSizeOffset, genIndexOffset] = addressing.resolve(operands, memory); const inputSize = memory.get(inputSizeOffset).toNumber(); memory.checkTag(TypeTag.UINT32, inputSizeOffset); @@ -46,8 +46,7 @@ export class PedersenCommitment extends Instruction { const generatorIndex = memory.get(genIndexOffset).toNumber(); memory.checkTag(TypeTag.UINT32, genIndexOffset); - const memoryOperations = { reads: inputSize + 2, writes: 3, indirect: this.indirect }; - context.machineState.consumeGas(this.gasCost({ ...memoryOperations, dynMultiplier: inputSize })); + context.machineState.consumeGas(this.gasCost(inputSize)); const inputBuffer: Buffer[] = inputs.map(input => input.toBuffer()); // TODO: Add the generate index to the pedersenCommit function @@ -60,7 +59,7 @@ export class PedersenCommitment extends Instruction { memory.set(outputOffset + 1, commitment[1]); // Field typed memory.set(outputOffset + 2, new Uint8(isInfinity ? 1 : 0)); // U8 typed - memory.assert(memoryOperations); + memory.assert({ reads: inputSize + 2, writes: 3, addressing }); context.machineState.incrementPc(); } } diff --git a/yarn-project/simulator/src/avm/opcodes/comparators.ts b/yarn-project/simulator/src/avm/opcodes/comparators.ts index 9ffca75e9b5..d7d12d099d7 100644 --- a/yarn-project/simulator/src/avm/opcodes/comparators.ts +++ b/yarn-project/simulator/src/avm/opcodes/comparators.ts @@ -6,14 +6,12 @@ import { ThreeOperandInstruction } from './instruction_impl.js'; abstract class ComparatorInstruction extends ThreeOperandInstruction { public async execute(context: AvmContext): Promise { - const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); - const [aOffset, bOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve( - [this.aOffset, this.bOffset, this.dstOffset], - memory, - ); + const operands = [this.aOffset, this.bOffset, this.dstOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory); memory.checkTags(this.inTag, aOffset, bOffset); const a = memory.get(aOffset); @@ -22,7 +20,7 @@ abstract class ComparatorInstruction extends ThreeOperandInstruction { const dest = new Uint1(this.compare(a, b) ? 1 : 0); memory.set(dstOffset, dest); - memory.assert(memoryOperations); + memory.assert({ reads: 2, writes: 1, addressing }); context.machineState.incrementPc(); } diff --git a/yarn-project/simulator/src/avm/opcodes/contract.ts b/yarn-project/simulator/src/avm/opcodes/contract.ts index de8f113d5b6..e8c7c743479 100644 --- a/yarn-project/simulator/src/avm/opcodes/contract.ts +++ b/yarn-project/simulator/src/avm/opcodes/contract.ts @@ -22,14 +22,12 @@ export class GetContractInstance extends Instruction { } async execute(context: AvmContext): Promise { - const memoryOperations = { reads: 1, writes: 6, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); - const [addressOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve( - [this.addressOffset, this.dstOffset], - memory, - ); + const operands = [this.addressOffset, this.dstOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [addressOffset, dstOffset] = addressing.resolve(operands, memory); memory.checkTag(TypeTag.FIELD, addressOffset); const address = memory.get(addressOffset).toFr(); @@ -46,7 +44,7 @@ export class GetContractInstance extends Instruction { memory.setSlice(dstOffset, data); - memory.assert(memoryOperations); + memory.assert({ reads: 1, writes: 6, addressing }); context.machineState.incrementPc(); } } diff --git a/yarn-project/simulator/src/avm/opcodes/control_flow.ts b/yarn-project/simulator/src/avm/opcodes/control_flow.ts index e601bb3ad1a..9109682a6a5 100644 --- a/yarn-project/simulator/src/avm/opcodes/control_flow.ts +++ b/yarn-project/simulator/src/avm/opcodes/control_flow.ts @@ -41,21 +41,21 @@ export class JumpI extends Instruction { } public async execute(context: AvmContext): Promise { - const memoryOperations = { reads: 1, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); - const [condOffset] = Addressing.fromWire(this.indirect).resolve([this.condOffset], memory); + const operands = [this.condOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [condOffset] = addressing.resolve(operands, memory); const condition = memory.getAs(condOffset); - // TODO: reconsider this casting if (condition.toBigInt() == 0n) { context.machineState.incrementPc(); } else { context.machineState.pc = this.loc; } - memory.assert(memoryOperations); + memory.assert({ reads: 1, addressing }); } } diff --git a/yarn-project/simulator/src/avm/opcodes/conversion.ts b/yarn-project/simulator/src/avm/opcodes/conversion.ts index 5a7d80d2ded..893b09a7942 100644 --- a/yarn-project/simulator/src/avm/opcodes/conversion.ts +++ b/yarn-project/simulator/src/avm/opcodes/conversion.ts @@ -33,12 +33,10 @@ export class ToRadixLE extends Instruction { public async execute(context: AvmContext): Promise { const memory = context.machineState.memory.track(this.type); - const [srcOffset, dstOffset, radixOffset] = Addressing.fromWire(this.indirect).resolve( - [this.srcOffset, this.dstOffset, this.radixOffset], - memory, - ); - const memoryOperations = { reads: 2, writes: this.numLimbs, indirect: this.indirect }; - context.machineState.consumeGas(this.gasCost({ ...memoryOperations, dynMultiplier: this.numLimbs })); + const operands = [this.srcOffset, this.dstOffset, this.radixOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [srcOffset, dstOffset, radixOffset] = addressing.resolve(operands, memory); + context.machineState.consumeGas(this.gasCost(this.numLimbs)); // The radix gadget only takes in a Field memory.checkTag(TypeTag.FIELD, srcOffset); @@ -62,7 +60,7 @@ export class ToRadixLE extends Instruction { const res = limbArray.map(byte => new outputType(byte)); memory.setSlice(dstOffset, res); - memory.assert(memoryOperations); + memory.assert({ reads: 2, writes: this.numLimbs, addressing }); context.machineState.incrementPc(); } } diff --git a/yarn-project/simulator/src/avm/opcodes/ec_add.ts b/yarn-project/simulator/src/avm/opcodes/ec_add.ts index b5eca8652e8..7f4219ea395 100644 --- a/yarn-project/simulator/src/avm/opcodes/ec_add.ts +++ b/yarn-project/simulator/src/avm/opcodes/ec_add.ts @@ -38,23 +38,21 @@ export class EcAdd extends Instruction { } public async execute(context: AvmContext): Promise { - const memoryOperations = { reads: 6, writes: 3, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); + const operands = [ + this.p1XOffset, + this.p1YOffset, + this.p1IsInfiniteOffset, + this.p2XOffset, + this.p2YOffset, + this.p2IsInfiniteOffset, + this.dstOffset, + ]; + const addressing = Addressing.fromWire(this.indirect, operands.length); const [p1XOffset, p1YOffset, p1IsInfiniteOffset, p2XOffset, p2YOffset, p2IsInfiniteOffset, dstOffset] = - Addressing.fromWire(this.indirect).resolve( - [ - this.p1XOffset, - this.p1YOffset, - this.p1IsInfiniteOffset, - this.p2XOffset, - this.p2YOffset, - this.p2IsInfiniteOffset, - this.dstOffset, - ], - memory, - ); + addressing.resolve(operands, memory); const p1X = memory.get(p1XOffset); const p1Y = memory.get(p1YOffset); @@ -86,7 +84,7 @@ export class EcAdd extends Instruction { // Check representation of infinity for grumpkin memory.set(dstOffset + 2, new Field(dest.equals(Point.ZERO) ? 1 : 0)); - memory.assert(memoryOperations); + memory.assert({ reads: 6, writes: 3, addressing }); context.machineState.incrementPc(); } } diff --git a/yarn-project/simulator/src/avm/opcodes/environment_getters.ts b/yarn-project/simulator/src/avm/opcodes/environment_getters.ts index e93139fb378..1d47b6986aa 100644 --- a/yarn-project/simulator/src/avm/opcodes/environment_getters.ts +++ b/yarn-project/simulator/src/avm/opcodes/environment_getters.ts @@ -71,15 +71,16 @@ export class GetEnvVar extends Instruction { } public async execute(context: AvmContext): Promise { - const memoryOperations = { writes: 1, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); - const [dstOffset] = Addressing.fromWire(this.indirect).resolve([this.dstOffset], memory); + const operands = [this.dstOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [dstOffset] = addressing.resolve(operands, memory); memory.set(dstOffset, getValue(this.varEnum, context)); - memory.assert(memoryOperations); + memory.assert({ writes: 1, addressing }); context.machineState.incrementPc(); } } diff --git a/yarn-project/simulator/src/avm/opcodes/external_calls.ts b/yarn-project/simulator/src/avm/opcodes/external_calls.ts index afc6d967ff5..67c7d2f565d 100644 --- a/yarn-project/simulator/src/avm/opcodes/external_calls.ts +++ b/yarn-project/simulator/src/avm/opcodes/external_calls.ts @@ -45,10 +45,17 @@ abstract class ExternalCall extends Instruction { public async execute(context: AvmContext) { const memory = context.machineState.memory.track(this.type); - const [gasOffset, addrOffset, argsOffset, argsSizeOffset, retOffset, successOffset] = Addressing.fromWire( - this.indirect, - ).resolve( - [this.gasOffset, this.addrOffset, this.argsOffset, this.argsSizeOffset, this.retOffset, this.successOffset], + const operands = [ + this.gasOffset, + this.addrOffset, + this.argsOffset, + this.argsSizeOffset, + this.retOffset, + this.successOffset, + ]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [gasOffset, addrOffset, argsOffset, argsSizeOffset, retOffset, successOffset] = addressing.resolve( + operands, memory, ); memory.checkTags(TypeTag.FIELD, gasOffset, gasOffset + 1); @@ -66,8 +73,7 @@ abstract class ExternalCall extends Instruction { const callType = context.environment.isStaticCall ? 'STATICCALL' : this.type; // First we consume the gas for this operation. - const memoryOperations = { reads: calldataSize + 5, writes: 1 + this.retSize, indirect: this.indirect }; - context.machineState.consumeGas(this.gasCost({ ...memoryOperations, dynMultiplier: calldataSize + this.retSize })); + context.machineState.consumeGas(this.gasCost(calldataSize + this.retSize)); // Then we consume the gas allocated for the nested call. The excess will be refunded later. // Gas allocation is capped by the amount of gas left in the current context. // We have to do some dancing here because the gas allocation is a field, @@ -127,7 +133,7 @@ abstract class ExternalCall extends Instruction { /*avmCallResults=*/ nestedCallResults, ); - memory.assert(memoryOperations); + memory.assert({ reads: calldataSize + 5, writes: 1 + this.retSize, addressing }); context.machineState.incrementPc(); } @@ -168,16 +174,17 @@ export class Return extends Instruction { } public async execute(context: AvmContext): Promise { - const memoryOperations = { reads: this.copySize, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost({ ...memoryOperations, dynMultiplier: this.copySize })); + context.machineState.consumeGas(this.gasCost(this.copySize)); - const [returnOffset] = Addressing.fromWire(this.indirect).resolve([this.returnOffset], memory); + const operands = [this.returnOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [returnOffset] = addressing.resolve(operands, memory); const output = memory.getSlice(returnOffset, this.copySize).map(word => word.toFr()); context.machineState.return(output); - memory.assert(memoryOperations); + memory.assert({ reads: this.copySize, addressing }); } } @@ -203,16 +210,17 @@ export class Revert extends Instruction { } public async execute(context: AvmContext): Promise { - const memoryOperations = { reads: this.retSize, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost({ ...memoryOperations, dynMultiplier: this.retSize })); + context.machineState.consumeGas(this.gasCost(this.retSize)); - const [returnOffset] = Addressing.fromWire(this.indirect).resolve([this.returnOffset], memory); + const operands = [this.returnOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [returnOffset] = addressing.resolve(operands, memory); const output = memory.getSlice(returnOffset, this.retSize).map(word => word.toFr()); context.machineState.revert(output); - memory.assert(memoryOperations); + memory.assert({ reads: this.retSize, addressing }); } } diff --git a/yarn-project/simulator/src/avm/opcodes/hashing.ts b/yarn-project/simulator/src/avm/opcodes/hashing.ts index 635e6aa1c5c..5b34d868bc8 100644 --- a/yarn-project/simulator/src/avm/opcodes/hashing.ts +++ b/yarn-project/simulator/src/avm/opcodes/hashing.ts @@ -33,14 +33,12 @@ export class Poseidon2 extends Instruction { } public async execute(context: AvmContext): Promise { - const memoryOperations = { reads: Poseidon2.stateSize, writes: Poseidon2.stateSize, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); - const [inputOffset, outputOffset] = Addressing.fromWire(this.indirect).resolve( - [this.inputStateOffset, this.outputStateOffset], - memory, - ); + const operands = [this.inputStateOffset, this.outputStateOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [inputOffset, outputOffset] = addressing.resolve(operands, memory); memory.checkTagsRange(TypeTag.FIELD, inputOffset, Poseidon2.stateSize); const inputState = memory.getSlice(inputOffset, Poseidon2.stateSize); @@ -50,7 +48,7 @@ export class Poseidon2 extends Instruction { outputState.map(word => new Field(word)), ); - memory.assert(memoryOperations); + memory.assert({ reads: Poseidon2.stateSize, writes: Poseidon2.stateSize, addressing }); context.machineState.incrementPc(); } } @@ -80,14 +78,12 @@ export class Keccak extends Instruction { // pub fn keccak256(input: [u8], message_size: u32) -> [u8; 32] public async execute(context: AvmContext): Promise { const memory = context.machineState.memory.track(this.type); - const [dstOffset, messageOffset, messageSizeOffset] = Addressing.fromWire(this.indirect).resolve( - [this.dstOffset, this.messageOffset, this.messageSizeOffset], - memory, - ); + const operands = [this.dstOffset, this.messageOffset, this.messageSizeOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [dstOffset, messageOffset, messageSizeOffset] = addressing.resolve(operands, memory); memory.checkTag(TypeTag.UINT32, messageSizeOffset); const messageSize = memory.get(messageSizeOffset).toNumber(); - const memoryOperations = { reads: messageSize + 1, writes: 32, indirect: this.indirect }; - context.machineState.consumeGas(this.gasCost({ ...memoryOperations, dynMultiplier: messageSize })); + context.machineState.consumeGas(this.gasCost(messageSize)); memory.checkTagsRange(TypeTag.UINT8, messageOffset, messageSize); @@ -98,7 +94,7 @@ export class Keccak extends Instruction { const res = [...hashBuffer].map(byte => new Uint8(byte)); memory.setSlice(dstOffset, res); - memory.assert(memoryOperations); + memory.assert({ reads: messageSize + 1, writes: 32, addressing }); context.machineState.incrementPc(); } } @@ -129,15 +125,13 @@ export class KeccakF1600 extends Instruction { // pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] public async execute(context: AvmContext): Promise { const memory = context.machineState.memory.track(this.type); - const [dstOffset, stateOffset, stateSizeOffset] = Addressing.fromWire(this.indirect).resolve( - [this.dstOffset, this.stateOffset, this.stateSizeOffset], - memory, - ); + const operands = [this.dstOffset, this.stateOffset, this.stateSizeOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [dstOffset, stateOffset, stateSizeOffset] = addressing.resolve(operands, memory); memory.checkTag(TypeTag.UINT32, stateSizeOffset); const stateSize = memory.get(stateSizeOffset).toNumber(); assert(stateSize === 25, 'Invalid state size for keccakf1600'); - const memoryOperations = { reads: stateSize + 1, writes: 25, indirect: this.indirect }; - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); memory.checkTagsRange(TypeTag.UINT64, stateOffset, stateSize); @@ -147,7 +141,7 @@ export class KeccakF1600 extends Instruction { const res = updatedState.map(word => new Uint64(word)); memory.setSlice(dstOffset, res); - memory.assert(memoryOperations); + memory.assert({ reads: stateSize + 1, writes: 25, addressing }); context.machineState.incrementPc(); } } @@ -183,10 +177,16 @@ export class Sha256Compression extends Instruction { const INPUTS_SIZE = 16; const memory = context.machineState.memory.track(this.type); - const [outputOffset, stateOffset, stateSizeOffset, inputsOffset, inputsSizeOffset] = Addressing.fromWire( - this.indirect, - ).resolve( - [this.outputOffset, this.stateOffset, this.stateSizeOffset, this.inputsOffset, this.inputsSizeOffset], + const operands = [ + this.outputOffset, + this.stateOffset, + this.stateSizeOffset, + this.inputsOffset, + this.inputsSizeOffset, + ]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [outputOffset, stateOffset, stateSizeOffset, inputsOffset, inputsSizeOffset] = addressing.resolve( + operands, memory, ); const stateSize = memory.get(stateSizeOffset).toNumber(); @@ -199,8 +199,7 @@ export class Sha256Compression extends Instruction { } // +2 to account for both size offsets (stateSizeOffset and inputsSizeOffset) // Note: size of output is same as size of state - const memoryOperations = { reads: stateSize + inputsSize + 2, writes: stateSize, indirect: this.indirect }; - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); memory.checkTagsRange(TypeTag.UINT32, inputsOffset, inputsSize); memory.checkTagsRange(TypeTag.UINT32, stateOffset, stateSize); @@ -212,7 +211,7 @@ export class Sha256Compression extends Instruction { const res = [...output].map(word => new Uint32(word)); memory.setSlice(outputOffset, res); - memory.assert(memoryOperations); + memory.assert({ reads: stateSize + inputsSize + 2, writes: stateSize, addressing }); context.machineState.incrementPc(); } } @@ -243,10 +242,9 @@ export class Pedersen extends Instruction { public async execute(context: AvmContext): Promise { const memory = context.machineState.memory.track(this.type); - const [genIndexOffset, dstOffset, messageOffset, messageSizeOffset] = Addressing.fromWire(this.indirect).resolve( - [this.genIndexOffset, this.dstOffset, this.messageOffset, this.messageSizeOffset], - memory, - ); + const operands = [this.genIndexOffset, this.dstOffset, this.messageOffset, this.messageSizeOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [genIndexOffset, dstOffset, messageOffset, messageSizeOffset] = addressing.resolve(operands, memory); // We hash a set of field elements const genIndex = Number(memory.get(genIndexOffset).toBigInt()); @@ -255,8 +253,7 @@ export class Pedersen extends Instruction { memory.checkTag(TypeTag.UINT32, messageSizeOffset); const hashData = memory.getSlice(messageOffset, messageSize); - const memoryOperations = { reads: messageSize + 2, writes: 1, indirect: this.indirect }; - context.machineState.consumeGas(this.gasCost({ ...memoryOperations, dynMultiplier: messageSize })); + context.machineState.consumeGas(this.gasCost(messageSize)); memory.checkTagsRange(TypeTag.FIELD, messageOffset, messageSize); @@ -264,7 +261,7 @@ export class Pedersen extends Instruction { const hash = pedersenHash(hashData, genIndex); memory.set(dstOffset, new Field(hash)); - memory.assert(memoryOperations); + memory.assert({ reads: messageSize + 2, writes: 1, addressing }); context.machineState.incrementPc(); } } diff --git a/yarn-project/simulator/src/avm/opcodes/instruction.ts b/yarn-project/simulator/src/avm/opcodes/instruction.ts index ae211a73acf..1e4a250cd9e 100644 --- a/yarn-project/simulator/src/avm/opcodes/instruction.ts +++ b/yarn-project/simulator/src/avm/opcodes/instruction.ts @@ -2,7 +2,6 @@ import { strict as assert } from 'assert'; import type { AvmContext } from '../avm_context.js'; import { getBaseGasCost, getDynamicGasCost, mulGas, sumGas } from '../avm_gas.js'; -import { type MemoryOperations } from '../avm_memory_types.js'; import { type BufferCursor } from '../serialization/buffer_cursor.js'; import { type Serializable } from '../serialization/bytecode_serialization.js'; import { Opcode, type OperandType, deserialize, serializeAs } from '../serialization/instruction_serialization.js'; @@ -86,17 +85,11 @@ export abstract class Instruction { /** * Computes gas cost for the instruction based on its base cost and memory operations. - * @param memoryOps Memory operations performed by the instruction. * @returns Gas cost. */ - protected gasCost(ops: Partial = {}) { + protected gasCost(dynMultiplier: number = 0) { const baseGasCost = getBaseGasCost(this.opcode); - // TODO: We are using a simplified gas model to reduce complexity in the circuit. - // Memory accounting will probably be removed. - // TODO(https://github.com/AztecProtocol/aztec-packages/issues/6861): reconsider. - // const memoryGasCost = getMemoryGasCost(memoryOps); - // const memoryGasCost = { l2Gas: 0, daGas: 0 }; - const dynGasCost = mulGas(getDynamicGasCost(this.opcode), ops.dynMultiplier ?? 0); + const dynGasCost = mulGas(getDynamicGasCost(this.opcode), dynMultiplier); return sumGas(baseGasCost, dynGasCost); } diff --git a/yarn-project/simulator/src/avm/opcodes/memory.ts b/yarn-project/simulator/src/avm/opcodes/memory.ts index 52c50c55786..605f97eccf0 100644 --- a/yarn-project/simulator/src/avm/opcodes/memory.ts +++ b/yarn-project/simulator/src/avm/opcodes/memory.ts @@ -62,15 +62,16 @@ export class Set extends Instruction { } public async execute(context: AvmContext): Promise { - const memoryOperations = { writes: 1, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); - const [dstOffset] = Addressing.fromWire(this.indirect).resolve([this.dstOffset], memory); + const operands = [this.dstOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [dstOffset] = addressing.resolve(operands, memory); const res = TaggedMemory.buildFromTagTruncating(this.value, this.inTag); memory.set(dstOffset, res); - memory.assert(memoryOperations); + memory.assert({ writes: 1, addressing }); context.machineState.incrementPc(); } } @@ -99,14 +100,12 @@ export class CMov extends Instruction { } public async execute(context: AvmContext): Promise { - const memoryOperations = { reads: 3, writes: 1, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); - const [aOffset, bOffset, condOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve( - [this.aOffset, this.bOffset, this.condOffset, this.dstOffset], - memory, - ); + const operands = [this.aOffset, this.bOffset, this.condOffset, this.dstOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [aOffset, bOffset, condOffset, dstOffset] = addressing.resolve(operands, memory); const a = memory.get(aOffset); const b = memory.get(bOffset); @@ -115,7 +114,7 @@ export class CMov extends Instruction { // TODO: reconsider toBigInt() here memory.set(dstOffset, cond.toBigInt() > 0 ? a : b); - memory.assert(memoryOperations); + memory.assert({ reads: 3, writes: 1, addressing }); context.machineState.incrementPc(); } } @@ -144,18 +143,19 @@ export class Cast extends Instruction { } public async execute(context: AvmContext): Promise { - const memoryOperations = { reads: 1, writes: 1, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); - const [srcOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve([this.srcOffset, this.dstOffset], memory); + const operands = [this.srcOffset, this.dstOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [srcOffset, dstOffset] = addressing.resolve(operands, memory); const a = memory.get(srcOffset); const casted = TaggedMemory.buildFromTagTruncating(a.toBigInt(), this.dstTag); memory.set(dstOffset, casted); - memory.assert(memoryOperations); + memory.assert({ reads: 1, writes: 1, addressing }); context.machineState.incrementPc(); } } @@ -183,17 +183,18 @@ export class Mov extends Instruction { } public async execute(context: AvmContext): Promise { - const memoryOperations = { reads: 1, writes: 1, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); - const [srcOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve([this.srcOffset, this.dstOffset], memory); + const operands = [this.srcOffset, this.dstOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [srcOffset, dstOffset] = addressing.resolve(operands, memory); const a = memory.get(srcOffset); memory.set(dstOffset, a); - memory.assert(memoryOperations); + memory.assert({ reads: 1, writes: 1, addressing }); context.machineState.incrementPc(); } } @@ -222,21 +223,19 @@ export class CalldataCopy extends Instruction { public async execute(context: AvmContext): Promise { const memory = context.machineState.memory.track(this.type); // We don't need to check tags here because: (1) the calldata is NOT in memory, and (2) we are the ones writing to destination. - const [cdStartOffset, copySizeOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve( - [this.cdStartOffset, this.copySizeOffset, this.dstOffset], - memory, - ); + const operands = [this.cdStartOffset, this.copySizeOffset, this.dstOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [cdStartOffset, copySizeOffset, dstOffset] = addressing.resolve(operands, memory); const cdStart = memory.get(cdStartOffset).toNumber(); const copySize = memory.get(copySizeOffset).toNumber(); - const memoryOperations = { reads: 2, writes: copySize, indirect: this.indirect }; - context.machineState.consumeGas(this.gasCost({ ...memoryOperations, dynMultiplier: copySize })); + context.machineState.consumeGas(this.gasCost(copySize)); const transformedData = context.environment.calldata.slice(cdStart, cdStart + copySize).map(f => new Field(f)); memory.setSlice(dstOffset, transformedData); - memory.assert(memoryOperations); + memory.assert({ reads: 2, writes: copySize, addressing }); context.machineState.incrementPc(); } } diff --git a/yarn-project/simulator/src/avm/opcodes/misc.ts b/yarn-project/simulator/src/avm/opcodes/misc.ts index 98aeac63f9d..219145778d7 100644 --- a/yarn-project/simulator/src/avm/opcodes/misc.ts +++ b/yarn-project/simulator/src/avm/opcodes/misc.ts @@ -33,17 +33,15 @@ export class DebugLog extends Instruction { public async execute(context: AvmContext): Promise { const memory = context.machineState.memory.track(this.type); - const [messageOffset, fieldsOffset, fieldsSizeOffset] = Addressing.fromWire(this.indirect).resolve( - [this.messageOffset, this.fieldsOffset, this.fieldsSizeOffset], - memory, - ); + const operands = [this.messageOffset, this.fieldsOffset, this.fieldsSizeOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [messageOffset, fieldsOffset, fieldsSizeOffset] = addressing.resolve(operands, memory); const fieldsSize = memory.get(fieldsSizeOffset).toNumber(); memory.checkTagsRange(TypeTag.UINT8, messageOffset, this.messageSize); memory.checkTagsRange(TypeTag.FIELD, fieldsOffset, fieldsSize); - const memoryOperations = { reads: 1 + fieldsSize + this.messageSize, writes: 0, indirect: this.indirect }; - context.machineState.consumeGas(this.gasCost(memoryOperations)); + context.machineState.consumeGas(this.gasCost()); const rawMessage = memory.getSlice(messageOffset, this.messageSize); const fields = memory.getSlice(fieldsOffset, fieldsSize); @@ -57,7 +55,7 @@ export class DebugLog extends Instruction { DebugLog.logger.verbose(formattedStr); - memory.assert(memoryOperations); + memory.assert({ reads: 1 + fieldsSize + this.messageSize, addressing }); context.machineState.incrementPc(); } } diff --git a/yarn-project/simulator/src/avm/opcodes/multi_scalar_mul.ts b/yarn-project/simulator/src/avm/opcodes/multi_scalar_mul.ts index 76477f7601b..7a7b149fbf5 100644 --- a/yarn-project/simulator/src/avm/opcodes/multi_scalar_mul.ts +++ b/yarn-project/simulator/src/avm/opcodes/multi_scalar_mul.ts @@ -35,10 +35,9 @@ export class MultiScalarMul extends Instruction { public async execute(context: AvmContext): Promise { const memory = context.machineState.memory.track(this.type); // Resolve indirects - const [pointsOffset, scalarsOffset, outputOffset] = Addressing.fromWire(this.indirect).resolve( - [this.pointsOffset, this.scalarsOffset, this.outputOffset], - memory, - ); + const operands = [this.pointsOffset, this.scalarsOffset, this.outputOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [pointsOffset, scalarsOffset, outputOffset] = addressing.resolve(operands, memory); // Length of the points vector should be U32 memory.checkTag(TypeTag.UINT32, this.pointsLengthOffset); @@ -62,13 +61,7 @@ export class MultiScalarMul extends Instruction { // The size of the scalars vector is twice the NUMBER of points because of the scalar limb decomposition const scalarReadLength = numPoints * 2; - // Consume gas prior to performing work - const memoryOperations = { - reads: 1 + pointsReadLength + scalarReadLength /* points and scalars */, - writes: 3 /* output triplet */, - indirect: this.indirect, - }; - context.machineState.consumeGas(this.gasCost({ ...memoryOperations, dynMultiplier: pointsReadLength })); + context.machineState.consumeGas(this.gasCost(pointsReadLength)); // Get the unrolled scalar (lo & hi) representing the scalars const scalarsVector = memory.getSlice(scalarsOffset, scalarReadLength); memory.checkTagsRange(TypeTag.FIELD, scalarsOffset, scalarReadLength); @@ -108,7 +101,11 @@ export class MultiScalarMul extends Instruction { memory.setSlice(outputOffset, output); - memory.assert(memoryOperations); + memory.assert({ + reads: 1 + pointsReadLength + scalarReadLength /* points and scalars */, + writes: 3 /* output triplet */, + addressing, + }); context.machineState.incrementPc(); } } diff --git a/yarn-project/simulator/src/avm/opcodes/storage.ts b/yarn-project/simulator/src/avm/opcodes/storage.ts index 731dbaec852..4da3a619ab9 100644 --- a/yarn-project/simulator/src/avm/opcodes/storage.ts +++ b/yarn-project/simulator/src/avm/opcodes/storage.ts @@ -32,11 +32,12 @@ export class SStore extends BaseStorageInstruction { throw new StaticCallAlterationError(); } - const memoryOperations = { reads: 2, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost({ ...memoryOperations })); + context.machineState.consumeGas(this.gasCost()); - const [srcOffset, slotOffset] = Addressing.fromWire(this.indirect).resolve([this.aOffset, this.bOffset], memory); + const operands = [this.aOffset, this.bOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [srcOffset, slotOffset] = addressing.resolve(operands, memory); memory.checkTag(TypeTag.FIELD, slotOffset); memory.checkTag(TypeTag.FIELD, srcOffset); @@ -44,7 +45,7 @@ export class SStore extends BaseStorageInstruction { const value = memory.get(srcOffset).toFr(); context.persistableState.writeStorage(context.environment.storageAddress, slot, value); - memory.assert(memoryOperations); + memory.assert({ reads: 2, addressing }); context.machineState.incrementPc(); } } @@ -58,11 +59,12 @@ export class SLoad extends BaseStorageInstruction { } public async execute(context: AvmContext): Promise { - const memoryOperations = { writes: 1, reads: 1, indirect: this.indirect }; const memory = context.machineState.memory.track(this.type); - context.machineState.consumeGas(this.gasCost({ ...memoryOperations })); + context.machineState.consumeGas(this.gasCost()); - const [slotOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve([this.aOffset, this.bOffset], memory); + const operands = [this.aOffset, this.bOffset]; + const addressing = Addressing.fromWire(this.indirect, operands.length); + const [slotOffset, dstOffset] = addressing.resolve(operands, memory); memory.checkTag(TypeTag.FIELD, slotOffset); const slot = memory.get(slotOffset).toFr(); @@ -70,6 +72,6 @@ export class SLoad extends BaseStorageInstruction { memory.set(dstOffset, new Field(value)); context.machineState.incrementPc(); - memory.assert(memoryOperations); + memory.assert({ writes: 1, reads: 1, addressing }); } } diff --git a/yarn-project/simulator/src/client/client_execution_context.ts b/yarn-project/simulator/src/client/client_execution_context.ts index 79b1f913ef4..3fc8a537916 100644 --- a/yarn-project/simulator/src/client/client_execution_context.ts +++ b/yarn-project/simulator/src/client/client_execution_context.ts @@ -3,35 +3,17 @@ import { type AztecNode, EncryptedL2Log, EncryptedL2NoteLog, - Event, - L1EventPayload, - L1NotePayload, Note, type NoteStatus, PublicExecutionRequest, - TaggedLog, type UnencryptedL2Log, } from '@aztec/circuit-types'; -import { - CallContext, - FunctionSelector, - type Header, - type KeyValidationRequest, - PrivateContextInputs, - type TxContext, -} from '@aztec/circuits.js'; -import { Aes128 } from '@aztec/circuits.js/barretenberg'; +import { CallContext, FunctionSelector, type Header, PrivateContextInputs, type TxContext } from '@aztec/circuits.js'; import { computeUniqueNoteHash, siloNoteHash } from '@aztec/circuits.js/hash'; -import { - EventSelector, - type FunctionAbi, - type FunctionArtifact, - type NoteSelector, - countArgumentsSize, -} from '@aztec/foundation/abi'; +import { type FunctionAbi, type FunctionArtifact, type NoteSelector, countArgumentsSize } from '@aztec/foundation/abi'; import { type AztecAddress } from '@aztec/foundation/aztec-address'; import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto'; -import { Fr, GrumpkinScalar, type Point } from '@aztec/foundation/fields'; +import { Fr } from '@aztec/foundation/fields'; import { applyStringFormatting, createDebugLogger } from '@aztec/foundation/log'; import { type NoteData, toACVMWitness } from '../acvm/index.js'; @@ -373,62 +355,6 @@ export class ClientExecutionContext extends ViewDataOracle { this.noteEncryptedLogs.push(encryptedLog); } - /** - * Encrypt an event - * @param contractAddress - The contract emitting the encrypted event. - * @param randomness - A value used to mask the contract address we are siloing with. - * @param eventTypeId - The type ID of the event (function selector). - * @param ovKeys - The outgoing viewing keys to use to encrypt. - * @param ivpkM - The master incoming viewing public key. - * @param recipient - The recipient of the encrypted event log. - * @param preimage - The event preimage. - */ - public override computeEncryptedEventLog( - contractAddress: AztecAddress, - randomness: Fr, - eventTypeId: Fr, - ovKeys: KeyValidationRequest, - ivpkM: Point, - recipient: AztecAddress, - preimage: Fr[], - ) { - const event = new Event(preimage); - const l1EventPayload = new L1EventPayload(event, contractAddress, randomness, EventSelector.fromField(eventTypeId)); - const taggedEvent = new TaggedLog(l1EventPayload); - - const ephSk = GrumpkinScalar.random(); - - return taggedEvent.encrypt(ephSk, recipient, ivpkM, ovKeys); - } - - /** - * Encrypt a note - * @param contractAddress - The contract address of the note. - * @param storageSlot - The storage slot the note is at. - * @param noteTypeId - The type ID of the note. - * @param ovKeys - The outgoing viewing keys to use to encrypt. - * @param ivpkM - The master incoming viewing public key. - * @param recipient - The recipient of the encrypted note log. - * @param preimage - The note preimage. - */ - public override computeEncryptedNoteLog( - contractAddress: AztecAddress, - storageSlot: Fr, - noteTypeId: NoteSelector, - ovKeys: KeyValidationRequest, - ivpkM: Point, - recipient: AztecAddress, - preimage: Fr[], - ) { - const note = new Note(preimage); - const l1NotePayload = new L1NotePayload(note, contractAddress, storageSlot, noteTypeId); - const taggedNote = new TaggedLog(l1NotePayload); - - const ephSk = GrumpkinScalar.random(); - - return taggedNote.encrypt(ephSk, recipient, ivpkM, ovKeys); - } - /** * Emit an unencrypted log. * @param log - The unencrypted log to be emitted. @@ -698,11 +624,6 @@ export class ClientExecutionContext extends ViewDataOracle { return values; } - public override aes128Encrypt(input: Buffer, initializationVector: Buffer, key: Buffer): Buffer { - const aes128 = new Aes128(); - return aes128.encryptBufferCBC(input, initializationVector, key); - } - public override debugLog(message: string, fields: Fr[]) { this.log.verbose(`debug_log ${applyStringFormatting(message, fields)}`); } diff --git a/yarn-project/simulator/src/client/execution_result.ts b/yarn-project/simulator/src/client/execution_result.ts index c73aa43df53..68620ff20d9 100644 --- a/yarn-project/simulator/src/client/execution_result.ts +++ b/yarn-project/simulator/src/client/execution_result.ts @@ -226,3 +226,14 @@ export function getFinalMinRevertibleSideEffectCounter(execResult: ExecutionResu return nestedCounter ? nestedCounter : counter; }, execResult.callStackItem.publicInputs.minRevertibleSideEffectCounter.toNumber()); } + +export function collectNested( + executionStack: ExecutionResult[], + extractExecutionItems: (execution: ExecutionResult) => T[], +): T[] { + const thisExecutionReads = executionStack.flatMap(extractExecutionItems); + + return thisExecutionReads.concat( + executionStack.flatMap(({ nestedExecutions }) => collectNested(nestedExecutions, extractExecutionItems)), + ); +} diff --git a/yarn-project/simulator/src/public/execution.ts b/yarn-project/simulator/src/public/execution.ts index 2312af9898f..216bd09eeca 100644 --- a/yarn-project/simulator/src/public/execution.ts +++ b/yarn-project/simulator/src/public/execution.ts @@ -86,8 +86,6 @@ export interface PublicExecutionResult { */ allUnencryptedLogs: UnencryptedFunctionL2Logs; - // TODO(dbanks12): add contract instance read requests - /** The requests to call public functions made by this call. */ publicCallRequests: PublicInnerCallRequest[]; /** The results of nested calls. */ diff --git a/yarn-project/simulator/src/public/hints_builder.ts b/yarn-project/simulator/src/public/hints_builder.ts index fd851e1d84a..4c69f7c0642 100644 --- a/yarn-project/simulator/src/public/hints_builder.ts +++ b/yarn-project/simulator/src/public/hints_builder.ts @@ -49,15 +49,13 @@ export class HintsBuilder { nullifierReadRequests: Tuple, pendingNullifiers: Tuple, ) { - return ( - await buildSiloedNullifierReadRequestHints( - this, - nullifierReadRequests, - pendingNullifiers, - MAX_NULLIFIER_READ_REQUESTS_PER_TX, - MAX_NULLIFIER_READ_REQUESTS_PER_TX, - ) - ).hints; + return await buildSiloedNullifierReadRequestHints( + this, + nullifierReadRequests, + pendingNullifiers, + MAX_NULLIFIER_READ_REQUESTS_PER_TX, + MAX_NULLIFIER_READ_REQUESTS_PER_TX, + ); } getNullifierNonExistentReadRequestHints( diff --git a/yarn-project/simulator/src/public/public_processor.test.ts b/yarn-project/simulator/src/public/public_processor.test.ts index f251a142dac..8ebde5516a7 100644 --- a/yarn-project/simulator/src/public/public_processor.test.ts +++ b/yarn-project/simulator/src/public/public_processor.test.ts @@ -1,6 +1,6 @@ import { - type BlockProver, type ProcessedTx, + type ProcessedTxHandler, PublicDataWrite, PublicKernelPhase, SimulationError, @@ -59,7 +59,7 @@ describe('public_processor', () => { let db: MockProxy; let publicExecutor: MockProxy; let worldStateDB: MockProxy; - let prover: MockProxy; + let handler: MockProxy; let proof: ClientIvcProof; let root: Buffer; @@ -70,7 +70,7 @@ describe('public_processor', () => { db = mock(); publicExecutor = mock(); worldStateDB = mock(); - prover = mock(); + handler = mock(); proof = ClientIvcProof.empty(); root = Buffer.alloc(32, 5); @@ -99,7 +99,7 @@ describe('public_processor', () => { const tx = mockTx(1, { numberOfNonRevertiblePublicCallRequests: 0, numberOfRevertiblePublicCallRequests: 0 }); const hash = tx.getTxHash(); - const [processed, failed] = await processor.process([tx], 1, prover); + const [processed, failed] = await processor.process([tx], 1, handler); expect(processed.length).toBe(1); @@ -123,21 +123,21 @@ describe('public_processor', () => { expect(processed[0]).toEqual(expected); expect(failed).toEqual([]); - expect(prover.addNewTx).toHaveBeenCalledWith(processed[0]); + expect(handler.addNewTx).toHaveBeenCalledWith(processed[0]); }); it('returns failed txs without aborting entire operation', async function () { publicExecutor.simulate.mockRejectedValue(new SimulationError(`Failed`, [])); const tx = mockTx(1, { numberOfNonRevertiblePublicCallRequests: 0, numberOfRevertiblePublicCallRequests: 1 }); - const [processed, failed] = await processor.process([tx], 1, prover); + const [processed, failed] = await processor.process([tx], 1, handler); expect(processed).toEqual([]); expect(failed[0].tx).toEqual(tx); expect(failed[0].error).toEqual(new SimulationError(`Failed`, [])); expect(worldStateDB.commit).toHaveBeenCalledTimes(0); expect(worldStateDB.rollbackToCommit).toHaveBeenCalledTimes(1); - expect(prover.addNewTx).toHaveBeenCalledTimes(0); + expect(handler.addNewTx).toHaveBeenCalledTimes(0); }); }); @@ -200,7 +200,7 @@ describe('public_processor', () => { hasLogs: true, }); - const [processed, failed] = await processor.process([tx], 1, prover); + const [processed, failed] = await processor.process([tx], 1, handler); expect(failed.map(f => f.error)).toEqual([]); expect(processed).toHaveLength(1); @@ -214,7 +214,7 @@ describe('public_processor', () => { expect(processed[0].encryptedLogs.getTotalLogCount()).toBe(6); expect(processed[0].unencryptedLogs.getTotalLogCount()).toBe(2); - expect(prover.addNewTx).toHaveBeenCalledWith(processed[0]); + expect(handler.addNewTx).toHaveBeenCalledWith(processed[0]); }); it('runs a tx with an enqueued public call with nested execution', async function () { @@ -233,7 +233,7 @@ describe('public_processor', () => { publicExecutor.simulate.mockResolvedValue(publicExecutionResult); - const [processed, failed] = await processor.process([tx], 1, prover); + const [processed, failed] = await processor.process([tx], 1, handler); expect(processed).toHaveLength(1); expect(processed[0].hash).toEqual(tx.getTxHash()); @@ -246,7 +246,7 @@ describe('public_processor', () => { expect(worldStateDB.commit).toHaveBeenCalledTimes(1); expect(worldStateDB.rollbackToCommit).toHaveBeenCalledTimes(0); - expect(prover.addNewTx).toHaveBeenCalledWith(processed[0]); + expect(handler.addNewTx).toHaveBeenCalledWith(processed[0]); }); it('does not attempt to overfill a block', async function () { @@ -255,7 +255,7 @@ describe('public_processor', () => { ); // We are passing 3 txs but only 2 can fit in the block - const [processed, failed] = await processor.process(txs, 2, prover); + const [processed, failed] = await processor.process(txs, 2, handler); expect(processed).toHaveLength(2); expect(processed[0].hash).toEqual(txs[0].getTxHash()); @@ -267,8 +267,8 @@ describe('public_processor', () => { expect(worldStateDB.commit).toHaveBeenCalledTimes(2); expect(worldStateDB.rollbackToCommit).toHaveBeenCalledTimes(0); - expect(prover.addNewTx).toHaveBeenCalledWith(processed[0]); - expect(prover.addNewTx).toHaveBeenCalledWith(processed[1]); + expect(handler.addNewTx).toHaveBeenCalledWith(processed[0]); + expect(handler.addNewTx).toHaveBeenCalledWith(processed[1]); }); it('does not send a transaction to the prover if validation fails', async function () { @@ -277,13 +277,13 @@ describe('public_processor', () => { const txValidator: MockProxy> = mock(); txValidator.validateTxs.mockRejectedValue([[], [tx]]); - const [processed, failed] = await processor.process([tx], 1, prover, txValidator); + const [processed, failed] = await processor.process([tx], 1, handler, txValidator); expect(processed).toHaveLength(0); expect(failed).toHaveLength(1); expect(publicExecutor.simulate).toHaveBeenCalledTimes(1); - expect(prover.addNewTx).toHaveBeenCalledTimes(0); + expect(handler.addNewTx).toHaveBeenCalledTimes(0); }); it('rolls back app logic db updates on failed public execution, but persists setup', async function () { @@ -367,7 +367,7 @@ describe('public_processor', () => { const innerSpy = jest.spyOn(publicKernel, 'publicKernelCircuitInner'); const mergeSpy = jest.spyOn(publicKernel, 'publicKernelCircuitMerge'); - const [processed, failed] = await processor.process([tx], 1, prover); + const [processed, failed] = await processor.process([tx], 1, handler); expect(processed).toHaveLength(1); expect(processed[0].hash).toEqual(tx.getTxHash()); @@ -401,7 +401,7 @@ describe('public_processor', () => { expect(txEffect.encryptedLogs.getTotalLogCount()).toBe(3); expect(txEffect.unencryptedLogs.getTotalLogCount()).toBe(1); - expect(prover.addNewTx).toHaveBeenCalledWith(processed[0]); + expect(handler.addNewTx).toHaveBeenCalledWith(processed[0]); }); it('fails a transaction that reverts in setup', async function () { @@ -472,7 +472,7 @@ describe('public_processor', () => { const innerSpy = jest.spyOn(publicKernel, 'publicKernelCircuitInner'); const mergeSpy = jest.spyOn(publicKernel, 'publicKernelCircuitMerge'); - const [processed, failed] = await processor.process([tx], 1, prover); + const [processed, failed] = await processor.process([tx], 1, handler); expect(processed).toHaveLength(0); expect(failed).toHaveLength(1); @@ -487,7 +487,7 @@ describe('public_processor', () => { expect(worldStateDB.commit).toHaveBeenCalledTimes(0); expect(worldStateDB.rollbackToCommit).toHaveBeenCalledTimes(1); - expect(prover.addNewTx).toHaveBeenCalledTimes(0); + expect(handler.addNewTx).toHaveBeenCalledTimes(0); }); it('includes a transaction that reverts in teardown', async function () { @@ -567,7 +567,7 @@ describe('public_processor', () => { const innerSpy = jest.spyOn(publicKernel, 'publicKernelCircuitInner'); const mergeSpy = jest.spyOn(publicKernel, 'publicKernelCircuitMerge'); - const [processed, failed] = await processor.process([tx], 1, prover); + const [processed, failed] = await processor.process([tx], 1, handler); expect(processed).toHaveLength(1); expect(processed[0].hash).toEqual(tx.getTxHash()); @@ -600,7 +600,7 @@ describe('public_processor', () => { expect(processed[0].data.revertCode).toEqual(RevertCode.TEARDOWN_REVERTED); - expect(prover.addNewTx).toHaveBeenCalledWith(processed[0]); + expect(handler.addNewTx).toHaveBeenCalledWith(processed[0]); }); it('includes a transaction that reverts in app logic and teardown', async function () { @@ -681,7 +681,7 @@ describe('public_processor', () => { const innerSpy = jest.spyOn(publicKernel, 'publicKernelCircuitInner'); const mergeSpy = jest.spyOn(publicKernel, 'publicKernelCircuitMerge'); - const [processed, failed] = await processor.process([tx], 1, prover); + const [processed, failed] = await processor.process([tx], 1, handler); expect(processed).toHaveLength(1); expect(processed[0].hash).toEqual(tx.getTxHash()); @@ -714,7 +714,7 @@ describe('public_processor', () => { expect(processed[0].data.revertCode).toEqual(RevertCode.BOTH_REVERTED); - expect(prover.addNewTx).toHaveBeenCalledWith(processed[0]); + expect(handler.addNewTx).toHaveBeenCalledWith(processed[0]); }); it('runs a tx with all phases', async function () { @@ -833,7 +833,7 @@ describe('public_processor', () => { const mergeSpy = jest.spyOn(publicKernel, 'publicKernelCircuitMerge'); const tailSpy = jest.spyOn(publicKernel, 'publicKernelCircuitTail'); - const [processed, failed] = await processor.process([tx], 1, prover); + const [processed, failed] = await processor.process([tx], 1, handler); expect(processed).toHaveLength(1); expect(processed[0].hash).toEqual(tx.getTxHash()); @@ -880,7 +880,7 @@ describe('public_processor', () => { expect(txEffect.encryptedLogs.getTotalLogCount()).toBe(0); expect(txEffect.unencryptedLogs.getTotalLogCount()).toBe(0); - expect(prover.addNewTx).toHaveBeenCalledWith(processed[0]); + expect(handler.addNewTx).toHaveBeenCalledWith(processed[0]); }); it('runs a tx with only teardown', async function () { @@ -942,7 +942,7 @@ describe('public_processor', () => { const mergeSpy = jest.spyOn(publicKernel, 'publicKernelCircuitMerge'); const tailSpy = jest.spyOn(publicKernel, 'publicKernelCircuitTail'); - const [processed, failed] = await processor.process([tx], 1, prover); + const [processed, failed] = await processor.process([tx], 1, handler); expect(processed).toHaveLength(1); expect(processed[0].hash).toEqual(tx.getTxHash()); @@ -975,7 +975,7 @@ describe('public_processor', () => { Promise.resolve(computePublicDataTreeLeafSlot(address, slot).toBigInt()), ); - const [processed, failed] = await processor.process([tx], 1, prover); + const [processed, failed] = await processor.process([tx], 1, handler); expect(failed.map(f => f.error)).toEqual([]); expect(processed).toHaveLength(1); @@ -992,7 +992,7 @@ describe('public_processor', () => { }), ); - expect(prover.addNewTx).toHaveBeenCalledWith(processed[0]); + expect(handler.addNewTx).toHaveBeenCalledWith(processed[0]); }); it('injects balance update with public enqueued call', async function () { @@ -1015,7 +1015,7 @@ describe('public_processor', () => { Promise.resolve(computePublicDataTreeLeafSlot(address, slot).toBigInt()), ); - const [processed, failed] = await processor.process([tx], 1, prover); + const [processed, failed] = await processor.process([tx], 1, handler); expect(failed.map(f => f.error)).toEqual([]); expect(processed).toHaveLength(1); @@ -1034,7 +1034,7 @@ describe('public_processor', () => { }), ); - expect(prover.addNewTx).toHaveBeenCalledWith(processed[0]); + expect(handler.addNewTx).toHaveBeenCalledWith(processed[0]); }); it('tweaks existing balance update from claim', async function () { @@ -1063,7 +1063,7 @@ describe('public_processor', () => { sideEffectCounter: 0, }); - const [processed, failed] = await processor.process([tx], 1, prover); + const [processed, failed] = await processor.process([tx], 1, handler); expect(failed.map(f => f.error)).toEqual([]); expect(processed).toHaveLength(1); @@ -1082,7 +1082,7 @@ describe('public_processor', () => { }), ); - expect(prover.addNewTx).toHaveBeenCalledWith(processed[0]); + expect(handler.addNewTx).toHaveBeenCalledWith(processed[0]); }); it('rejects tx if fee payer has not enough balance', async function () { @@ -1105,7 +1105,7 @@ describe('public_processor', () => { Promise.resolve(computePublicDataTreeLeafSlot(address, slot).toBigInt()), ); - const [processed, failed] = await processor.process([tx], 1, prover); + const [processed, failed] = await processor.process([tx], 1, handler); expect(processed).toHaveLength(0); expect(failed).toHaveLength(1); diff --git a/yarn-project/simulator/src/public/side_effect_errors.ts b/yarn-project/simulator/src/public/side_effect_errors.ts new file mode 100644 index 00000000000..4953c72d2bc --- /dev/null +++ b/yarn-project/simulator/src/public/side_effect_errors.ts @@ -0,0 +1,6 @@ +export class SideEffectLimitReachedError extends Error { + constructor(sideEffectType: string, limit: number) { + super(`Reached the limit on number of '${sideEffectType}' side effects: ${limit}`); + this.name = 'SideEffectLimitReachedError'; + } +} diff --git a/yarn-project/simulator/src/public/side_effect_trace.test.ts b/yarn-project/simulator/src/public/side_effect_trace.test.ts index 5ee1469f161..a0b4f16f709 100644 --- a/yarn-project/simulator/src/public/side_effect_trace.test.ts +++ b/yarn-project/simulator/src/public/side_effect_trace.test.ts @@ -1,5 +1,20 @@ import { UnencryptedL2Log } from '@aztec/circuit-types'; -import { AztecAddress, EthAddress, Gas, L2ToL1Message } from '@aztec/circuits.js'; +import { + AztecAddress, + EthAddress, + Gas, + L2ToL1Message, + MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX, + MAX_L2_TO_L1_MSGS_PER_TX, + MAX_NOTE_HASHES_PER_TX, + MAX_NOTE_HASH_READ_REQUESTS_PER_TX, + MAX_NULLIFIERS_PER_TX, + MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_TX, + MAX_NULLIFIER_READ_REQUESTS_PER_TX, + MAX_PUBLIC_DATA_READS_PER_TX, + MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, + MAX_UNENCRYPTED_LOGS_PER_TX, +} from '@aztec/circuits.js'; import { Fr } from '@aztec/foundation/fields'; import { SerializableContractInstance } from '@aztec/types/contracts'; @@ -7,6 +22,7 @@ import { randomBytes, randomInt } from 'crypto'; import { AvmContractCallResult } from '../avm/avm_contract_call_result.js'; import { initExecutionEnvironment } from '../avm/fixtures/index.js'; +import { SideEffectLimitReachedError } from './side_effect_errors.js'; import { PublicSideEffectTrace, type TracedContractInstance } from './side_effect_trace.js'; function randomTracedContractInstance(): TracedContractInstance { @@ -24,6 +40,7 @@ describe('Side Effect Trace', () => { const recipient = Fr.random(); const content = Fr.random(); const log = [Fr.random(), Fr.random(), Fr.random()]; + const contractInstance = SerializableContractInstance.empty().withAddress(new Fr(42)); const startGasLeft = Gas.fromFields([new Fr(randomInt(10000)), new Fr(randomInt(10000))]); const endGasLeft = Gas.fromFields([new Fr(randomInt(10000)), new Fr(randomInt(10000))]); @@ -190,7 +207,7 @@ describe('Side Effect Trace', () => { }); it('Should trace new L2ToL1 messages', () => { - trace.traceNewL2ToL1Message(recipient, content); + trace.traceNewL2ToL1Message(address, recipient, content); expect(trace.getCounter()).toBe(startCounterPlus1); const pxResult = toPxResult(trace); @@ -221,8 +238,7 @@ describe('Side Effect Trace', () => { expect(trace.getCounter()).toBe(startCounterPlus1); const pxResult = toPxResult(trace); - // TODO(dbanks12): process contract instance read requests in public kernel - //expect(pxResult.gotContractInstances).toEqual([instance]); + // TODO(dbanks12): once this emits nullifier read, check here expect(pxResult.avmCircuitHints.contractInstances.items).toEqual([ { // hint omits "version" and has "exists" as an Fr @@ -231,6 +247,127 @@ describe('Side Effect Trace', () => { }, ]); }); + describe('Maximum accesses', () => { + it('Should enforce maximum number of public storage reads', () => { + for (let i = 0; i < MAX_PUBLIC_DATA_READS_PER_TX; i++) { + trace.tracePublicStorageRead(new Fr(i), new Fr(i), new Fr(i), true, true); + } + expect(() => trace.tracePublicStorageRead(new Fr(42), new Fr(42), new Fr(42), true, true)).toThrow( + SideEffectLimitReachedError, + ); + }); + + it('Should enforce maximum number of public storage writes', () => { + for (let i = 0; i < MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX; i++) { + trace.tracePublicStorageWrite(new Fr(i), new Fr(i), new Fr(i)); + } + expect(() => trace.tracePublicStorageWrite(new Fr(42), new Fr(42), new Fr(42))).toThrow( + SideEffectLimitReachedError, + ); + }); + + it('Should enforce maximum number of note hash checks', () => { + for (let i = 0; i < MAX_NOTE_HASH_READ_REQUESTS_PER_TX; i++) { + trace.traceNoteHashCheck(new Fr(i), new Fr(i), new Fr(i), true); + } + expect(() => trace.traceNoteHashCheck(new Fr(42), new Fr(42), new Fr(42), true)).toThrow( + SideEffectLimitReachedError, + ); + }); + + it('Should enforce maximum number of new note hashes', () => { + for (let i = 0; i < MAX_NOTE_HASHES_PER_TX; i++) { + trace.traceNewNoteHash(new Fr(i), new Fr(i)); + } + expect(() => trace.traceNewNoteHash(new Fr(42), new Fr(42))).toThrow(SideEffectLimitReachedError); + }); + + it('Should enforce maximum number of nullifier checks', () => { + for (let i = 0; i < MAX_NULLIFIER_READ_REQUESTS_PER_TX; i++) { + trace.traceNullifierCheck(new Fr(i), new Fr(i), new Fr(i), true, true); + } + expect(() => trace.traceNullifierCheck(new Fr(42), new Fr(42), new Fr(42), true, true)).toThrow( + SideEffectLimitReachedError, + ); + // NOTE: also cannot do a non-existent check once existent checks have filled up + expect(() => trace.traceNullifierCheck(new Fr(42), new Fr(42), new Fr(42), false, true)).toThrow( + SideEffectLimitReachedError, + ); + }); + + it('Should enforce maximum number of nullifier non-existent checks', () => { + for (let i = 0; i < MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_TX; i++) { + trace.traceNullifierCheck(new Fr(i), new Fr(i), new Fr(i), false, true); + } + expect(() => trace.traceNullifierCheck(new Fr(42), new Fr(42), new Fr(42), false, true)).toThrow( + SideEffectLimitReachedError, + ); + // NOTE: also cannot do a existent check once non-existent checks have filled up + expect(() => trace.traceNullifierCheck(new Fr(42), new Fr(42), new Fr(42), true, true)).toThrow( + SideEffectLimitReachedError, + ); + }); + + it('Should enforce maximum number of new nullifiers', () => { + for (let i = 0; i < MAX_NULLIFIERS_PER_TX; i++) { + trace.traceNewNullifier(new Fr(i), new Fr(i)); + } + expect(() => trace.traceNewNullifier(new Fr(42), new Fr(42))).toThrow(SideEffectLimitReachedError); + }); + + it('Should enforce maximum number of L1 to L2 message checks', () => { + for (let i = 0; i < MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX; i++) { + trace.traceL1ToL2MessageCheck(new Fr(i), new Fr(i), new Fr(i), true); + } + expect(() => trace.traceL1ToL2MessageCheck(new Fr(42), new Fr(42), new Fr(42), true)).toThrow( + SideEffectLimitReachedError, + ); + }); + + it('Should enforce maximum number of new l2 to l1 messages', () => { + for (let i = 0; i < MAX_L2_TO_L1_MSGS_PER_TX; i++) { + trace.traceNewL2ToL1Message(new Fr(i), new Fr(i), new Fr(i)); + } + expect(() => trace.traceNewL2ToL1Message(new Fr(42), new Fr(42), new Fr(42))).toThrow( + SideEffectLimitReachedError, + ); + }); + + it('Should enforce maximum number of new logs hashes', () => { + for (let i = 0; i < MAX_UNENCRYPTED_LOGS_PER_TX; i++) { + trace.traceUnencryptedLog(new Fr(i), [new Fr(i), new Fr(i)]); + } + expect(() => trace.traceUnencryptedLog(new Fr(42), [new Fr(42), new Fr(42)])).toThrow( + SideEffectLimitReachedError, + ); + }); + + it('Should enforce maximum number of nullifier checks for GETCONTRACTINSTANCE', () => { + for (let i = 0; i < MAX_NULLIFIER_READ_REQUESTS_PER_TX; i++) { + trace.traceNullifierCheck(new Fr(i), new Fr(i), new Fr(i), true, true); + } + expect(() => trace.traceGetContractInstance({ ...contractInstance, exists: true })).toThrow( + SideEffectLimitReachedError, + ); + // NOTE: also cannot do a existent check once non-existent checks have filled up + expect(() => trace.traceGetContractInstance({ ...contractInstance, exists: false })).toThrow( + SideEffectLimitReachedError, + ); + }); + + it('Should enforce maximum number of nullifier non-existent checks for GETCONTRACTINSTANCE', () => { + for (let i = 0; i < MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_TX; i++) { + trace.traceNullifierCheck(new Fr(i), new Fr(i), new Fr(i), false, true); + } + expect(() => trace.traceGetContractInstance({ ...contractInstance, exists: false })).toThrow( + SideEffectLimitReachedError, + ); + // NOTE: also cannot do a existent check once non-existent checks have filled up + expect(() => trace.traceGetContractInstance({ ...contractInstance, exists: true })).toThrow( + SideEffectLimitReachedError, + ); + }); + }); it('Should trace nested calls', () => { const existsDefault = true; @@ -244,6 +381,7 @@ describe('Side Effect Trace', () => { nestedTrace.tracePublicStorageWrite(address, slot, value); testCounter++; nestedTrace.traceNoteHashCheck(address, utxo, leafIndex, existsDefault); + // counter does not increment for note hash checks nestedTrace.traceNewNoteHash(address, utxo); testCounter++; nestedTrace.traceNullifierCheck(address, utxo, leafIndex, /*exists=*/ true, isPending); @@ -253,10 +391,15 @@ describe('Side Effect Trace', () => { nestedTrace.traceNewNullifier(address, utxo); testCounter++; nestedTrace.traceL1ToL2MessageCheck(address, utxo, leafIndex, existsDefault); - nestedTrace.traceNewL2ToL1Message(recipient, content); + // counter does not increment for l1tol2 message checks + nestedTrace.traceNewL2ToL1Message(address, recipient, content); testCounter++; nestedTrace.traceUnencryptedLog(address, log); testCounter++; + nestedTrace.traceGetContractInstance({ ...contractInstance, exists: true }); + testCounter++; + nestedTrace.traceGetContractInstance({ ...contractInstance, exists: false }); + testCounter++; trace.traceNestedCall(nestedTrace, avmEnvironment, startGasLeft, endGasLeft, bytecode, avmCallResults); // parent trace adopts nested call's counter diff --git a/yarn-project/simulator/src/public/side_effect_trace.ts b/yarn-project/simulator/src/public/side_effect_trace.ts index 783e1c64ff6..5e0f8d51cf7 100644 --- a/yarn-project/simulator/src/public/side_effect_trace.ts +++ b/yarn-project/simulator/src/public/side_effect_trace.ts @@ -12,6 +12,16 @@ import { Gas, L2ToL1Message, LogHash, + MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX, + MAX_L2_TO_L1_MSGS_PER_TX, + MAX_NOTE_HASHES_PER_TX, + MAX_NOTE_HASH_READ_REQUESTS_PER_TX, + MAX_NULLIFIERS_PER_TX, + MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_TX, + MAX_NULLIFIER_READ_REQUESTS_PER_TX, + MAX_PUBLIC_DATA_READS_PER_TX, + MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, + MAX_UNENCRYPTED_LOGS_PER_TX, NoteHash, Nullifier, type PublicInnerCallRequest, @@ -26,6 +36,7 @@ import { type AvmContractCallResult } from '../avm/avm_contract_call_result.js'; import { type AvmExecutionEnvironment } from '../avm/avm_execution_environment.js'; import { createSimulationError } from '../common/errors.js'; import { type PublicExecutionResult, resultToPublicCallRequest } from './execution.js'; +import { SideEffectLimitReachedError } from './side_effect_errors.js'; import { type PublicSideEffectTraceInterface } from './side_effect_trace_interface.js'; export type TracedContractInstance = { exists: boolean } & ContractInstanceWithAddress; @@ -55,8 +66,6 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface { private publicCallRequests: PublicInnerCallRequest[] = []; - private gotContractInstances: ContractInstanceWithAddress[] = []; - private nestedExecutions: PublicExecutionResult[] = []; private avmCircuitHints: AvmExecutionHints; @@ -81,10 +90,13 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface { this.sideEffectCounter++; } + // TODO(dbanks12): checks against tx-wide limit need access to parent trace's length + public tracePublicStorageRead(storageAddress: Fr, slot: Fr, value: Fr, _exists: boolean, _cached: boolean) { - // TODO(4805): check if some threshold is reached for max storage reads - // (need access to parent length, or trace needs to be initialized with parent's contents) // NOTE: exists and cached are unused for now but may be used for optimizations or kernel hints later + if (this.contractStorageReads.length >= MAX_PUBLIC_DATA_READS_PER_TX) { + throw new SideEffectLimitReachedError('contract storage read', MAX_PUBLIC_DATA_READS_PER_TX); + } this.contractStorageReads.push( new ContractStorageRead(slot, value, this.sideEffectCounter, AztecAddress.fromField(storageAddress)), ); @@ -96,8 +108,9 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface { } public tracePublicStorageWrite(storageAddress: Fr, slot: Fr, value: Fr) { - // TODO(4805): check if some threshold is reached for max storage writes - // (need access to parent length, or trace needs to be initialized with parent's contents) + if (this.contractStorageUpdateRequests.length >= MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX) { + throw new SideEffectLimitReachedError('contract storage write', MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX); + } this.contractStorageUpdateRequests.push( new ContractStorageUpdateRequest(slot, value, this.sideEffectCounter, storageAddress), ); @@ -107,32 +120,32 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface { // TODO(8287): _exists can be removed once we have the vm properly handling the equality check public traceNoteHashCheck(_storageAddress: Fr, noteHash: Fr, leafIndex: Fr, exists: boolean) { - // TODO(4805): check if some threshold is reached for max note hash checks // NOTE: storageAddress is unused but will be important when an AVM circuit processes an entire enqueued call - // TODO(dbanks12): leafIndex is unused for now but later must be used by kernel to constrain that the kernel - // is in fact checking the leaf indicated by the user + if (this.noteHashReadRequests.length >= MAX_NOTE_HASH_READ_REQUESTS_PER_TX) { + throw new SideEffectLimitReachedError('note hash read request', MAX_NOTE_HASH_READ_REQUESTS_PER_TX); + } this.noteHashReadRequests.push(new TreeLeafReadRequest(noteHash, leafIndex)); this.avmCircuitHints.noteHashExists.items.push( new AvmKeyValueHint(/*key=*/ new Fr(leafIndex), /*value=*/ exists ? Fr.ONE : Fr.ZERO), ); + // NOTE: counter does not increment for note hash checks (because it doesn't rely on pending note hashes) } public traceNewNoteHash(_storageAddress: Fr, noteHash: Fr) { - // TODO(4805): check if some threshold is reached for max new note hash - // NOTE: storageAddress is unused but will be important when an AVM circuit processes an entire enqueued call - // TODO(dbanks12): non-existent note hashes should emit a read request of the note hash that actually - // IS there, and the AVM circuit should accept THAT noteHash as a hint. The circuit will then compare - // the noteHash against the one provided by the user code to determine what to return to the user (exists or not), - // and will then propagate the actually-present noteHash to its public inputs. + if (this.noteHashes.length >= MAX_NOTE_HASHES_PER_TX) { + throw new SideEffectLimitReachedError('note hash', MAX_NOTE_HASHES_PER_TX); + } this.noteHashes.push(new NoteHash(noteHash, this.sideEffectCounter)); this.logger.debug(`NEW_NOTE_HASH cnt: ${this.sideEffectCounter}`); this.incrementSideEffectCounter(); } public traceNullifierCheck(_storageAddress: Fr, nullifier: Fr, _leafIndex: Fr, exists: boolean, _isPending: boolean) { - // TODO(4805): check if some threshold is reached for max new nullifier // NOTE: storageAddress is unused but will be important when an AVM circuit processes an entire enqueued call // NOTE: isPending and leafIndex are unused for now but may be used for optimizations or kernel hints later + + this.enforceLimitOnNullifierChecks(); + const readRequest = new ReadRequest(nullifier, this.sideEffectCounter); if (exists) { this.nullifierReadRequests.push(readRequest); @@ -147,8 +160,10 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface { } public traceNewNullifier(_storageAddress: Fr, nullifier: Fr) { - // TODO(4805): check if some threshold is reached for max new nullifier // NOTE: storageAddress is unused but will be important when an AVM circuit processes an entire enqueued call + if (this.nullifiers.length >= MAX_NULLIFIERS_PER_TX) { + throw new SideEffectLimitReachedError('nullifier', MAX_NULLIFIERS_PER_TX); + } this.nullifiers.push(new Nullifier(nullifier, this.sideEffectCounter, /*noteHash=*/ Fr.ZERO)); this.logger.debug(`NEW_NULLIFIER cnt: ${this.sideEffectCounter}`); this.incrementSideEffectCounter(); @@ -156,18 +171,21 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface { // TODO(8287): _exists can be removed once we have the vm properly handling the equality check public traceL1ToL2MessageCheck(_contractAddress: Fr, msgHash: Fr, msgLeafIndex: Fr, exists: boolean) { - // TODO(4805): check if some threshold is reached for max message reads // NOTE: contractAddress is unused but will be important when an AVM circuit processes an entire enqueued call - // TODO(dbanks12): leafIndex is unused for now but later must be used by kernel to constrain that the kernel - // is in fact checking the leaf indicated by the user + if (this.l1ToL2MsgReadRequests.length >= MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX) { + throw new SideEffectLimitReachedError('l1 to l2 message read request', MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX); + } this.l1ToL2MsgReadRequests.push(new TreeLeafReadRequest(msgHash, msgLeafIndex)); this.avmCircuitHints.l1ToL2MessageExists.items.push( new AvmKeyValueHint(/*key=*/ new Fr(msgLeafIndex), /*value=*/ exists ? Fr.ONE : Fr.ZERO), ); + // NOTE: counter does not increment for l1tol2 message checks (because it doesn't rely on pending messages) } - public traceNewL2ToL1Message(recipient: Fr, content: Fr) { - // TODO(4805): check if some threshold is reached for max messages + public traceNewL2ToL1Message(_contractAddress: Fr, recipient: Fr, content: Fr) { + if (this.newL2ToL1Messages.length >= MAX_L2_TO_L1_MSGS_PER_TX) { + throw new SideEffectLimitReachedError('l2 to l1 message', MAX_L2_TO_L1_MSGS_PER_TX); + } const recipientAddress = EthAddress.fromField(recipient); this.newL2ToL1Messages.push(new L2ToL1Message(recipientAddress, content, this.sideEffectCounter)); this.logger.debug(`NEW_L2_TO_L1_MSG cnt: ${this.sideEffectCounter}`); @@ -175,7 +193,9 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface { } public traceUnencryptedLog(contractAddress: Fr, log: Fr[]) { - // TODO(4805): check if some threshold is reached for max logs + if (this.unencryptedLogs.length >= MAX_UNENCRYPTED_LOGS_PER_TX) { + throw new SideEffectLimitReachedError('unencrypted log', MAX_UNENCRYPTED_LOGS_PER_TX); + } const ulog = new UnencryptedL2Log( AztecAddress.fromField(contractAddress), Buffer.concat(log.map(f => f.toBuffer())), @@ -191,8 +211,9 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface { } public traceGetContractInstance(instance: TracedContractInstance) { - // TODO(4805): check if some threshold is reached for max contract instance retrievals - this.gotContractInstances.push(instance); + this.enforceLimitOnNullifierChecks('(contract address nullifier from GETCONTRACTINSTANCE)'); + // TODO(dbanks12): should emit a nullifier read request + this.avmCircuitHints.contractInstances.items.push( new AvmContractInstanceHint( instance.address, @@ -228,6 +249,11 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface { /** Function name for logging */ functionName: string = 'unknown', ) { + // TODO(4805): check if some threshold is reached for max nested calls (to unique contracts?) + // TODO(dbanks12): should emit a nullifier read request. There should be two thresholds. + // one for max unique contract calls, and another based on max nullifier reads. + // Since this trace function happens _after_ a nested call, such threshold limits must take + // place in another trace function that occurs _before_ a nested call. const result = nestedCallTrace.toPublicExecutionResult( nestedEnvironment, startGasLeft, @@ -305,8 +331,6 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface { unencryptedLogs: new UnencryptedFunctionL2Logs(this.unencryptedLogs), allUnencryptedLogs: new UnencryptedFunctionL2Logs(this.allUnencryptedLogs), unencryptedLogsHashes: this.unencryptedLogsHashes, - // TODO(dbanks12): process contract instance read requests in public kernel - //gotContractInstances: this.gotContractInstances, publicCallRequests: this.publicCallRequests, nestedExecutions: this.nestedExecutions, @@ -316,6 +340,27 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface { functionName, }; } + + private enforceLimitOnNullifierChecks(errorMsgOrigin: string = '') { + // NOTE: Why error if _either_ limit was reached? If user code emits either an existent or non-existent + // nullifier read request (NULLIFIEREXISTS, GETCONTRACTINSTANCE, *CALL), and one of the limits has been + // reached (MAX_NULLIFIER_NON_EXISTENT_RRS vs MAX_NULLIFIER_RRS), but not the other, we must prevent the + // sequencer from lying and saying "this nullifier exists, but MAX_NULLIFIER_RRS has been reached, so I'm + // going to skip the read request and just revert instead" when the nullifier actually doesn't exist + // (or vice versa). So, if either maximum has been reached, any nullifier-reading operation must error. + if (this.nullifierReadRequests.length >= MAX_NULLIFIER_READ_REQUESTS_PER_TX) { + throw new SideEffectLimitReachedError( + `nullifier read request ${errorMsgOrigin}`, + MAX_NULLIFIER_READ_REQUESTS_PER_TX, + ); + } + if (this.nullifierNonExistentReadRequests.length >= MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_TX) { + throw new SideEffectLimitReachedError( + `nullifier non-existent read request ${errorMsgOrigin}`, + MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_TX, + ); + } + } } /** diff --git a/yarn-project/simulator/src/public/side_effect_trace_interface.ts b/yarn-project/simulator/src/public/side_effect_trace_interface.ts index 91326fb021b..2d229d7f7b4 100644 --- a/yarn-project/simulator/src/public/side_effect_trace_interface.ts +++ b/yarn-project/simulator/src/public/side_effect_trace_interface.ts @@ -8,6 +8,7 @@ import { type TracedContractInstance } from './side_effect_trace.js'; export interface PublicSideEffectTraceInterface { fork(): PublicSideEffectTraceInterface; getCounter(): number; + // all "trace*" functions can throw SideEffectLimitReachedError tracePublicStorageRead(storageAddress: Fr, slot: Fr, value: Fr, exists: boolean, cached: boolean): void; tracePublicStorageWrite(storageAddress: Fr, slot: Fr, value: Fr): void; traceNoteHashCheck(storageAddress: Fr, noteHash: Fr, leafIndex: Fr, exists: boolean): void; @@ -15,8 +16,7 @@ export interface PublicSideEffectTraceInterface { traceNullifierCheck(storageAddress: Fr, nullifier: Fr, leafIndex: Fr, exists: boolean, isPending: boolean): void; traceNewNullifier(storageAddress: Fr, nullifier: Fr): void; traceL1ToL2MessageCheck(contractAddress: Fr, msgHash: Fr, msgLeafIndex: Fr, exists: boolean): void; - // TODO(dbanks12): should new message accept contract address as arg? - traceNewL2ToL1Message(recipient: Fr, content: Fr): void; + traceNewL2ToL1Message(contractAddress: Fr, recipient: Fr, content: Fr): void; traceUnencryptedLog(contractAddress: Fr, log: Fr[]): void; // TODO(dbanks12): odd that getContractInstance is a one-off in that it accepts an entire object instead of components traceGetContractInstance(instance: TracedContractInstance): void; diff --git a/yarn-project/txe/src/oracle/txe_oracle.ts b/yarn-project/txe/src/oracle/txe_oracle.ts index a2fdb9df74d..6bd3aef063e 100644 --- a/yarn-project/txe/src/oracle/txe_oracle.ts +++ b/yarn-project/txe/src/oracle/txe_oracle.ts @@ -1,8 +1,5 @@ import { AuthWitness, - Event, - L1EventPayload, - L1NotePayload, MerkleTreeId, Note, type NoteStatus, @@ -10,7 +7,6 @@ import { PublicDataWitness, PublicDataWrite, PublicExecutionRequest, - TaggedLog, type UnencryptedL2Log, } from '@aztec/circuit-types'; import { type CircuitWitnessGenerationStats } from '@aztec/circuit-types/stats'; @@ -34,18 +30,17 @@ import { deriveKeys, getContractClassFromArtifact, } from '@aztec/circuits.js'; -import { Aes128, Schnorr } from '@aztec/circuits.js/barretenberg'; +import { Schnorr } from '@aztec/circuits.js/barretenberg'; import { computePublicDataTreeLeafSlot, siloNoteHash, siloNullifier } from '@aztec/circuits.js/hash'; import { type ContractArtifact, - EventSelector, type FunctionAbi, FunctionSelector, type NoteSelector, countArgumentsSize, } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; -import { Fr, GrumpkinScalar, type Point } from '@aztec/foundation/fields'; +import { Fr } from '@aztec/foundation/fields'; import { type Logger, applyStringFormatting } from '@aztec/foundation/log'; import { Timer } from '@aztec/foundation/timer'; import { type KeyStore } from '@aztec/key-store'; @@ -543,24 +538,6 @@ export class TXE implements TypedOracle { return; } - computeEncryptedNoteLog( - contractAddress: AztecAddress, - storageSlot: Fr, - noteTypeId: NoteSelector, - ovKeys: KeyValidationRequest, - ivpkM: Point, - recipient: AztecAddress, - preimage: Fr[], - ): Buffer { - const note = new Note(preimage); - const l1NotePayload = new L1NotePayload(note, contractAddress, storageSlot, noteTypeId); - const taggedNote = new TaggedLog(l1NotePayload); - - const ephSk = GrumpkinScalar.random(); - - return taggedNote.encrypt(ephSk, recipient, ivpkM, ovKeys); - } - emitUnencryptedLog(_log: UnencryptedL2Log, counter: number): void { this.sideEffectsCounter = counter + 1; return; @@ -838,11 +815,6 @@ export class TXE implements TypedOracle { this.noteCache.setMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter); } - aes128Encrypt(input: Buffer, initializationVector: Buffer, key: Buffer): Buffer { - const aes128 = new Aes128(); - return aes128.encryptBufferCBC(input, initializationVector, key); - } - debugLog(message: string, fields: Fr[]): void { this.logger.verbose(`debug_log ${applyStringFormatting(message, fields)}`); } @@ -856,22 +828,4 @@ export class TXE implements TypedOracle { this.sideEffectsCounter = counter + 1; return; } - - computeEncryptedEventLog( - contractAddress: AztecAddress, - randomness: Fr, - eventTypeId: Fr, - ovKeys: KeyValidationRequest, - ivpkM: Point, - recipient: AztecAddress, - preimage: Fr[], - ): Buffer { - const event = new Event(preimage); - const l1EventPayload = new L1EventPayload(event, contractAddress, randomness, EventSelector.fromField(eventTypeId)); - const taggedEvent = new TaggedLog(l1EventPayload); - - const ephSk = GrumpkinScalar.random(); - - return taggedEvent.encrypt(ephSk, recipient, ivpkM, ovKeys); - } } diff --git a/yarn-project/txe/src/txe_service/txe_service.ts b/yarn-project/txe/src/txe_service/txe_service.ts index ea4b2c0088f..f9c0db63d40 100644 --- a/yarn-project/txe/src/txe_service/txe_service.ts +++ b/yarn-project/txe/src/txe_service/txe_service.ts @@ -4,9 +4,7 @@ import { Fr, FunctionSelector, Header, - KeyValidationRequest, PUBLIC_DATA_SUBTREE_HEIGHT, - Point, PublicDataTreeLeaf, computePartialAddress, getContractInstanceFromDeployParams, @@ -614,40 +612,6 @@ export class TXEService { return toForeignCallResult([toArray(keyValidationRequest.toFields())]); } - computeEncryptedNoteLog( - contractAddress: ForeignCallSingle, - storageSlot: ForeignCallSingle, - noteTypeId: ForeignCallSingle, - ovskApp: ForeignCallSingle, - ovpkMX: ForeignCallSingle, - ovpkMY: ForeignCallSingle, - ovpkMIsInfinite: ForeignCallSingle, - ivpkMX: ForeignCallSingle, - ivpkMY: ForeignCallSingle, - ivpkMIsInfinite: ForeignCallSingle, - recipient: ForeignCallSingle, - preimage: ForeignCallArray, - ) { - const ovpkM = new Point(fromSingle(ovpkMX), fromSingle(ovpkMY), !fromSingle(ovpkMIsInfinite).isZero()); - const ovKeys = new KeyValidationRequest(ovpkM, Fr.fromString(fromSingle(ovskApp).toString())); - const ivpkM = new Point(fromSingle(ivpkMX), fromSingle(ivpkMY), !fromSingle(ivpkMIsInfinite).isZero()); - const encLog = this.typedOracle.computeEncryptedNoteLog( - AztecAddress.fromString(fromSingle(contractAddress).toString()), - Fr.fromString(fromSingle(storageSlot).toString()), - NoteSelector.fromField(Fr.fromString(fromSingle(noteTypeId).toString())), - ovKeys, - ivpkM, - AztecAddress.fromString(fromSingle(recipient).toString()), - fromArray(preimage), - ); - const bytes: Fr[] = []; - - encLog.forEach(v => { - bytes.push(new Fr(v)); - }); - return toForeignCallResult([toArray(bytes)]); - } - emitEncryptedLog( _contractAddress: ForeignCallSingle, _randomness: ForeignCallSingle, diff --git a/yarn-project/types/src/abi/contract_artifact.ts b/yarn-project/types/src/abi/contract_artifact.ts index c06a4d3a7b3..b7484f0c0b9 100644 --- a/yarn-project/types/src/abi/contract_artifact.ts +++ b/yarn-project/types/src/abi/contract_artifact.ts @@ -2,6 +2,7 @@ import { type ABIParameter, type ABIParameterVisibility, type AbiType, + type BasicValue, type ContractArtifact, type ContractNote, type FieldLayout, @@ -217,10 +218,23 @@ function hasKernelFunctionInputs(params: ABIParameter[]): boolean { * @returns A storage layout for the contract. */ function getStorageLayout(input: NoirCompiledContract) { - const storage = input.outputs.globals.storage ? (input.outputs.globals.storage[0] as StructValue) : { fields: [] }; - const storageFields = storage.fields as TypedStructFieldValue[]; + // If another contract is imported by the main contract, its storage layout its going to also show up here. + // The layout export includes the contract name, so here we can find the one that belongs to the current one and + // ignore the rest. + const storageExports = input.outputs.globals.storage ? (input.outputs.globals.storage as StructValue[]) : []; + const storageForContract = storageExports.find(storageExport => { + const contractNameField = storageExport.fields.find(field => field.name === 'contract_name')?.value as BasicValue< + 'string', + string + >; + return contractNameField.value === input.name; + }); + const storageFields = storageForContract + ? ((storageForContract.fields.find(field => field.name == 'fields') as TypedStructFieldValue).value + .fields as TypedStructFieldValue[]) + : []; - if (!storageFields) { + if (storageFields.length === 0) { return {}; } diff --git a/yarn-project/types/src/contracts/contract_class.ts b/yarn-project/types/src/contracts/contract_class.ts index a7869382f3f..b19865aa4f9 100644 --- a/yarn-project/types/src/contracts/contract_class.ts +++ b/yarn-project/types/src/contracts/contract_class.ts @@ -65,6 +65,9 @@ export type ContractClassPublic = { } & Pick & Omit; +/** The contract class with the block it was initially deployed at */ +export type ContractClassPublicWithBlockNumber = { l2BlockNumber: number } & ContractClassPublic; + /** Private function definition with executable bytecode. */ export interface ExecutablePrivateFunction extends PrivateFunction { /** ACIR and Brillig bytecode */ diff --git a/yarn-project/validator-client/src/validator.ts b/yarn-project/validator-client/src/validator.ts index a32a7d4f9e7..7e96391197f 100644 --- a/yarn-project/validator-client/src/validator.ts +++ b/yarn-project/validator-client/src/validator.ts @@ -141,12 +141,13 @@ export class ValidatorClient implements Validator { const slot = proposal.payload.header.globalVariables.slotNumber.toBigInt(); this.log.info(`Waiting for ${numberOfRequiredAttestations} attestations for slot: ${slot}`); + const proposalId = proposal.p2pMessageIdentifier().toString(); const myAttestation = await this.validationService.attestToProposal(proposal); const startTime = Date.now(); while (true) { - const attestations = [myAttestation, ...(await this.p2pClient.getAttestationsForSlot(slot))]; + const attestations = [myAttestation, ...(await this.p2pClient.getAttestationsForSlot(slot, proposalId))]; if (attestations.length >= numberOfRequiredAttestations) { this.log.info(`Collected all ${numberOfRequiredAttestations} attestations for slot, ${slot}`); diff --git a/yarn-project/world-state/src/synchronizer/server_world_state_synchronizer.ts b/yarn-project/world-state/src/synchronizer/server_world_state_synchronizer.ts index 9cd2d861104..cb4804eb082 100644 --- a/yarn-project/world-state/src/synchronizer/server_world_state_synchronizer.ts +++ b/yarn-project/world-state/src/synchronizer/server_world_state_synchronizer.ts @@ -10,15 +10,15 @@ import { type WorldStateSynchronizer, } from '@aztec/circuit-types'; import { type L2BlockHandledStats } from '@aztec/circuit-types/stats'; +import { MerkleTreeCalculator } from '@aztec/circuits.js'; import { L1_TO_L2_MSG_SUBTREE_HEIGHT } from '@aztec/circuits.js/constants'; -import { Fr } from '@aztec/foundation/fields'; +import { type Fr } from '@aztec/foundation/fields'; import { createDebugLogger } from '@aztec/foundation/log'; import { promiseWithResolvers } from '@aztec/foundation/promise'; import { SerialQueue } from '@aztec/foundation/queue'; import { elapsed } from '@aztec/foundation/timer'; import { type AztecKVStore, type AztecSingleton } from '@aztec/kv-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; -import { SHA256Trunc, StandardTree } from '@aztec/merkle-tree'; +import { SHA256Trunc } from '@aztec/merkle-tree'; import { MerkleTreeAdminOperationsFacade, @@ -272,7 +272,7 @@ export class ServerWorldStateSynchronizer implements WorldStateSynchronizer { // Note that we cannot optimize this check by checking the root of the subtree after inserting the messages // to the real L1_TO_L2_MESSAGE_TREE (like we do in merkleTreeDb.handleL2BlockAndMessages(...)) because that // tree uses pedersen and we don't have access to the converted root. - await this.#verifyMessagesHashToInHash(l1ToL2Messages, l2Block.header.contentCommitment.inHash); + this.#verifyMessagesHashToInHash(l1ToL2Messages, l2Block.header.contentCommitment.inHash); // If the above check succeeds, we can proceed to handle the block. const result = await this.merkleTreeDb.handleL2BlockAndMessages(l2Block, l1ToL2Messages); @@ -302,14 +302,19 @@ export class ServerWorldStateSynchronizer implements WorldStateSynchronizer { * @param inHash - The inHash of the block. * @throws If the L1 to L2 messages do not hash to the block inHash. */ - async #verifyMessagesHashToInHash(l1ToL2Messages: Fr[], inHash: Buffer) { - const store = openTmpStore(true); - const tree = new StandardTree(store, new SHA256Trunc(), 'temp_in_hash_check', L1_TO_L2_MSG_SUBTREE_HEIGHT, 0n, Fr); - await tree.appendLeaves(l1ToL2Messages); + #verifyMessagesHashToInHash(l1ToL2Messages: Fr[], inHash: Buffer) { + const treeCalculator = new MerkleTreeCalculator( + L1_TO_L2_MSG_SUBTREE_HEIGHT, + Buffer.alloc(32), + new SHA256Trunc().hash, + ); - if (!tree.getRoot(true).equals(inHash)) { + const root = treeCalculator.computeTreeRoot(l1ToL2Messages.map(msg => msg.toBuffer())); + this.log.info(`root: ${root.toString('hex')}`); + this.log.info(`inHash: ${inHash.toString('hex')}`); + + if (!root.equals(inHash)) { throw new Error('Obtained L1 to L2 messages failed to be hashed to the block inHash'); } - await store.delete(); } } diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 677a033c70b..0c725d90abe 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -844,6 +844,7 @@ __metadata: version: 0.0.0-use.local resolution: "@aztec/p2p@workspace:p2p" dependencies: + "@aztec/archiver": "workspace:^" "@aztec/circuit-types": "workspace:^" "@aztec/circuits.js": "workspace:^" "@aztec/foundation": "workspace:^" @@ -967,8 +968,10 @@ __metadata: "@aztec/archiver": "workspace:^" "@aztec/circuit-types": "workspace:^" "@aztec/circuits.js": "workspace:^" + "@aztec/ethereum": "workspace:^" "@aztec/foundation": "workspace:^" "@aztec/kv-store": "workspace:^" + "@aztec/l1-artifacts": "workspace:^" "@aztec/prover-client": "workspace:^" "@aztec/sequencer-client": "workspace:^" "@aztec/simulator": "workspace:^" @@ -986,6 +989,7 @@ __metadata: ts-node: ^10.9.1 tslib: ^2.4.0 typescript: ^5.0.4 + viem: ^2.7.15 languageName: unknown linkType: soft @@ -3380,12 +3384,12 @@ __metadata: "@noir-lang/noir_js@file:../noir/packages/noir_js::locator=%40aztec%2Faztec3-packages%40workspace%3A.": version: 0.34.0 - resolution: "@noir-lang/noir_js@file:../noir/packages/noir_js#../noir/packages/noir_js::hash=999f32&locator=%40aztec%2Faztec3-packages%40workspace%3A." + resolution: "@noir-lang/noir_js@file:../noir/packages/noir_js#../noir/packages/noir_js::hash=aa1d0b&locator=%40aztec%2Faztec3-packages%40workspace%3A." dependencies: "@noir-lang/acvm_js": 0.50.0 "@noir-lang/noirc_abi": 0.34.0 "@noir-lang/types": 0.34.0 - checksum: 72009b3553a8c2652270b86b02bf5215456adb3c66ebb08a3b66185d20b708e86cf3300c3f57641d2e9e9f10d340bbf5e2f9fb1f89507900ccdd9b0e42c4349a + checksum: 4d5102053ee8ef7e1258221275796493eeaef14664e5de238ce293151c90d0f9aaa19df1c0beb94b3a3911694e50bbe9f71a93497cdfc69cf0e5eb7ee6af3142 languageName: node linkType: hard